diff --git a/digest/src/digest.rs b/digest/src/digest.rs index 283245c33..7c277c9a6 100644 --- a/digest/src/digest.rs +++ b/digest/src/digest.rs @@ -4,8 +4,10 @@ use generic_array::{ArrayLength, GenericArray}; /// The `Digest` trait specifies an interface common for digest functions. /// -/// It's a convenience wrapper around [`Update`], [`FixedOutput`], [`Reset`], -/// [`Clone`], and [`Default`] traits. It also provides additional convenience methods. +/// It's a convenience wrapper around [`Update`], [`FixedOutput`], +/// [`Reset`][`crate::Reset`], [`Clone`], and [`Default`] traits. +/// +/// It also provides additional convenience methods. pub trait Digest { /// Output size for `Digest` type OutputSize: ArrayLength; diff --git a/digest/src/dyn_digest.rs b/digest/src/dyn_digest.rs index 09408db59..ecafe7945 100644 --- a/digest/src/dyn_digest.rs +++ b/digest/src/dyn_digest.rs @@ -1,12 +1,12 @@ -use alloc::boxed::Box; -use core::fmt; - use super::{FixedOutput, FixedOutputReset, Reset, Update}; +use core::fmt; use generic_array::{typenum::Unsigned, GenericArray}; +#[cfg(feature = "alloc")] +use alloc::boxed::Box; + /// The `DynDigest` trait is a modification of `Digest` trait suitable /// for trait objects. -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] pub trait DynDigest { /// Digest input data. /// @@ -14,10 +14,23 @@ pub trait DynDigest { fn update(&mut self, data: &[u8]); /// Retrieve result and reset hasher instance - fn finalize_reset(&mut self) -> Box<[u8]>; + #[cfg(feature = "alloc")] + #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] + fn finalize_reset(&mut self) -> Box<[u8]> { + let mut result = vec![0; self.output_size()]; + self.finalize_into_reset(&mut result).unwrap(); + result.into_boxed_slice() + } /// Retrieve result and consume boxed hasher instance - fn finalize(self: Box) -> Box<[u8]>; + #[cfg(feature = "alloc")] + #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] + #[allow(clippy::boxed_local)] + fn finalize(mut self: Box) -> Box<[u8]> { + let mut result = vec![0; self.output_size()]; + self.finalize_into_reset(&mut result).unwrap(); + result.into_boxed_slice() + } /// Write result into provided array and consume the hasher instance. /// @@ -36,6 +49,8 @@ pub trait DynDigest { fn output_size(&self) -> usize; /// Clone hasher state into a boxed trait object + #[cfg(feature = "alloc")] + #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] fn box_clone(&self) -> Box; } @@ -44,10 +59,12 @@ impl DynDigest for D { Update::update(self, data); } + #[cfg(feature = "alloc")] fn finalize_reset(&mut self) -> Box<[u8]> { self.finalize_fixed_reset().to_vec().into_boxed_slice() } + #[cfg(feature = "alloc")] fn finalize(self: Box) -> Box<[u8]> { self.finalize_fixed().to_vec().into_boxed_slice() } @@ -78,11 +95,14 @@ impl DynDigest for D { ::OutputSize::to_usize() } + #[cfg(feature = "alloc")] fn box_clone(&self) -> Box { Box::new(self.clone()) } } +#[cfg(feature = "alloc")] +#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] impl Clone for Box { fn clone(&self) -> Self { self.box_clone() diff --git a/digest/src/lib.rs b/digest/src/lib.rs index 0cb6de937..2991ded68 100644 --- a/digest/src/lib.rs +++ b/digest/src/lib.rs @@ -50,7 +50,6 @@ pub mod dev; #[cfg_attr(docsrs, doc(cfg(feature = "core-api")))] pub mod core_api; mod digest; -#[cfg(feature = "alloc")] mod dyn_digest; pub use crate::digest::{Digest, Output}; @@ -58,7 +57,6 @@ use core::fmt; #[cfg(feature = "core-api")] #[cfg_attr(docsrs, doc(cfg(feature = "core-api")))] pub use crypto_common::block_buffer; -#[cfg(feature = "alloc")] pub use dyn_digest::{DynDigest, InvalidBufferLength}; pub use generic_array::{self, typenum::consts, GenericArray};