@@ -124,6 +124,7 @@ pub mod data {
124124pub mod digest {
125125 use crate :: tss2_esys:: TPMU_HA ;
126126 use std:: mem:: size_of;
127+
127128 const TPM2B_DIGEST_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
128129
129130 buffer_type ! ( Digest , TPM2B_DIGEST_BUFFER_SIZE , TPM2B_DIGEST ) ;
@@ -220,6 +221,47 @@ pub mod digest {
220221 Digest ( value_as_vec. into ( ) )
221222 }
222223 }
224+
225+ #[ cfg( feature = "rustcrypto" ) ]
226+ mod rustcrypto {
227+ use digest:: {
228+ consts:: { U20 , U32 , U48 , U64 } ,
229+ generic_array:: GenericArray ,
230+ typenum:: Unsigned ,
231+ } ;
232+
233+ use super :: * ;
234+
235+ macro_rules! impl_from_digest {
236+ ( $( $size: ty) ,+) => {
237+ $( impl From <GenericArray <u8 , $size>> for Digest {
238+ fn from( mut value: GenericArray <u8 , $size>) -> Self {
239+ let value_as_vec = value. as_slice( ) . to_vec( ) ;
240+ value. zeroize( ) ;
241+ Digest ( value_as_vec. into( ) )
242+ }
243+ }
244+
245+ impl TryFrom <Digest > for GenericArray <u8 , $size> {
246+ type Error = Error ;
247+
248+ fn try_from( value: Digest ) -> Result <Self > {
249+ if value. len( ) != <$size>:: USIZE {
250+ return Err ( Error :: local_error( WrapperErrorKind :: WrongParamSize ) ) ;
251+ }
252+
253+ let mut result = [ 0 ; <$size>:: USIZE ] ;
254+
255+ result. copy_from_slice( value. as_bytes( ) ) ;
256+
257+ Ok ( result. into( ) )
258+ }
259+ } ) +
260+ }
261+ }
262+
263+ impl_from_digest ! ( U20 , U32 , U48 , U64 ) ;
264+ }
223265}
224266
225267pub mod ecc_parameter {
0 commit comments