@@ -3,10 +3,11 @@ use alloc::{boxed::Box, vec};
33use der:: {
44 DecodeValue , EncodeValue , FixedTag , Length , Tag ,
55 asn1:: { OctetString , OctetStringRef } ,
6+ oid:: db:: rfc6268,
67 referenced:: OwnedToRef ,
78} ;
89
9- use x509_cert:: time:: Time ;
10+ use x509_cert:: { attr :: Attribute , time:: Time } ;
1011
1112use crate :: signed_data:: SignerInfo ;
1213
@@ -101,6 +102,30 @@ impl From<MessageDigest> for vec::Vec<u8> {
101102 }
102103}
103104
105+ impl TryFrom < & Attribute > for MessageDigest {
106+ type Error = der:: Error ;
107+
108+ fn try_from ( attr : & Attribute ) -> Result < Self , Self :: Error > {
109+ if attr. oid != rfc6268:: ID_MESSAGE_DIGEST {
110+ return Err ( der:: ErrorKind :: OidUnknown { oid : attr. oid } . into ( ) ) ;
111+ }
112+
113+ // A message-digest attribute MUST have a single attribute value, even
114+ // though the syntax is defined as a SET OF AttributeValue. There MUST
115+ // NOT be zero or multiple instances of AttributeValue present.
116+
117+ if attr. values . len ( ) != 1 {
118+ return Err ( der:: ErrorKind :: Value { tag : Tag :: Set } . into ( ) ) ;
119+ }
120+ let message_digest = attr
121+ . values
122+ . get ( 0 )
123+ . expect ( "Invariant violation, only one value is present in the attribute" ) ;
124+
125+ message_digest. decode_as :: < OctetString > ( ) . map ( Self )
126+ }
127+ }
128+
104129/// The `SigningTime` attribute is defined in [RFC 5652 Section 11.3].
105130///
106131/// ```text
0 commit comments