@@ -5,8 +5,10 @@ use core::borrow::Borrow;
55use  der:: { 
66    DecodeValue ,  EncodeValue ,  FixedTag ,  Length ,  Tag , 
77    asn1:: { OctetString ,  OctetStringRef } , 
8+     oid:: db:: rfc6268, 
89} ; 
9- use  x509_cert:: time:: Time ; 
10+ 
11+ use  x509_cert:: { attr:: Attribute ,  time:: Time } ; 
1012
1113use  crate :: signed_data:: SignerInfo ; 
1214
@@ -101,6 +103,30 @@ impl From<MessageDigest> for vec::Vec<u8> {
101103    } 
102104} 
103105
106+ impl  TryFrom < & Attribute >  for  MessageDigest  { 
107+     type  Error  = der:: Error ; 
108+ 
109+     fn  try_from ( attr :  & Attribute )  -> Result < Self ,  Self :: Error >  { 
110+         if  attr. oid  != rfc6268:: ID_MESSAGE_DIGEST  { 
111+             return  Err ( der:: ErrorKind :: OidUnknown  {  oid :  attr. oid  } . into ( ) ) ; 
112+         } 
113+ 
114+         // A message-digest attribute MUST have a single attribute value, even 
115+         // though the syntax is defined as a SET OF AttributeValue.  There MUST 
116+         // NOT be zero or multiple instances of AttributeValue present. 
117+ 
118+         if  attr. values . len ( )  != 1  { 
119+             return  Err ( der:: ErrorKind :: Value  {  tag :  Tag :: Set  } . into ( ) ) ; 
120+         } 
121+         let  message_digest = attr
122+             . values 
123+             . get ( 0 ) 
124+             . expect ( "Invariant violation, only one value is present in the attribute" ) ; 
125+ 
126+         message_digest. decode_as :: < OctetString > ( ) . map ( Self ) 
127+     } 
128+ } 
129+ 
104130/// The `SigningTime` attribute is defined in [RFC 5652 Section 11.3]. 
105131/// 
106132/// ```text 
0 commit comments