@@ -123,7 +123,13 @@ pub mod data {
123123
124124pub mod digest {
125125 use crate :: tss2_esys:: TPMU_HA ;
126+ use digest:: {
127+ consts:: { U20 , U32 , U48 , U64 } ,
128+ generic_array:: GenericArray ,
129+ typenum:: Unsigned ,
130+ } ;
126131 use std:: mem:: size_of;
132+
127133 const TPM2B_DIGEST_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
128134
129135 buffer_type ! ( Digest , TPM2B_DIGEST_BUFFER_SIZE , TPM2B_DIGEST ) ;
@@ -220,6 +226,34 @@ pub mod digest {
220226 Digest ( value_as_vec. into ( ) )
221227 }
222228 }
229+
230+ macro_rules! impl_from_digest {
231+ ( $( $size: ty) ,+) => {
232+ $( impl From <GenericArray <u8 , $size>> for Digest {
233+ fn from( value: GenericArray <u8 , $size>) -> Self {
234+ Digest ( value. as_slice( ) . to_vec( ) . into( ) )
235+ }
236+ }
237+
238+ impl TryFrom <Digest > for GenericArray <u8 , $size> {
239+ type Error = Error ;
240+
241+ fn try_from( value: Digest ) -> Result <Self > {
242+ if value. len( ) != <$size>:: USIZE {
243+ return Err ( Error :: local_error( WrapperErrorKind :: WrongParamSize ) ) ;
244+ }
245+
246+ let mut result = [ 0 ; <$size>:: USIZE ] ;
247+
248+ result. copy_from_slice( value. as_bytes( ) ) ;
249+
250+ Ok ( result. into( ) )
251+ }
252+ } ) +
253+ }
254+ }
255+
256+ impl_from_digest ! ( U20 , U32 , U48 , U64 ) ;
223257}
224258
225259pub mod ecc_parameter {
0 commit comments