@@ -175,7 +175,7 @@ impl<'a> DerParser<'a> for X509Extension<'a> {
175175 let ( rem, ( _, value) ) = <& [ u8 ] >:: parse_der_as_input ( rem)
176176 . map_err ( |_| Err :: Error ( X509Error :: InvalidExtensions ) ) ?;
177177
178- let ( _ , parsed_extension) = parser:: parse_extension ( value. clone ( ) , & oid) ? ;
178+ let parsed_extension = parser:: parse_extension ( value. clone ( ) , & oid, critical ) ;
179179 let ext = X509Extension {
180180 oid,
181181 critical,
@@ -226,10 +226,11 @@ impl<'i> Parser<Input<'i>> for X509ExtensionParser {
226226 let ( rem, ( _, value) ) = <& [ u8 ] >:: parse_der_as_input ( rem)
227227 . map_err ( |_| Err :: Error ( X509Error :: InvalidExtensions ) ) ?;
228228
229- let ( _ , parsed_extension) = if self . deep_parse_extensions {
230- parser:: parse_extension ( value. clone ( ) , & oid) ?
229+ let parsed_extension = if self . deep_parse_extensions {
230+ parser:: parse_extension ( value. clone ( ) , & oid, critical )
231231 } else {
232- ( rem. take ( rem. input_len ( ) ) , ParsedExtension :: Unparsed )
232+ rem. take ( rem. input_len ( ) ) ;
233+ ParsedExtension :: Unparsed
233234 } ;
234235
235236 let ext = X509Extension {
@@ -258,12 +259,21 @@ impl<'i> Parser<Input<'i>> for X509ExtensionParser {
258259 }
259260}
260261
262+ /// A unsupported extension.
263+ #[ derive( Debug , Clone , Eq , PartialEq ) ]
264+ pub struct UnsupportedExtension < ' a > {
265+ /// The Object ID of the extension.
266+ pub oid : Oid < ' a > ,
267+ /// The unparsed value.
268+ pub value : & ' a [ u8 ] ,
269+ /// Whether the extension is critical.
270+ pub critical : bool ,
271+ }
272+
261273#[ derive( Clone , Debug , PartialEq ) ]
262274pub enum ParsedExtension < ' a > {
263275 /// Crate parser does not support this extension (yet)
264- UnsupportedExtension {
265- oid : Oid < ' a > ,
266- } ,
276+ UnsupportedExtension ( UnsupportedExtension < ' a > ) ,
267277 ParseError {
268278 error : Err < X509Error > ,
269279 } ,
@@ -422,30 +432,27 @@ pub(crate) mod parser {
422432
423433 // look into the parser map if the extension is known, and parse it
424434 // otherwise, leave it as UnsupportedExtension
425- fn parse_extension0 < ' i > (
426- input : Input < ' i > ,
427- oid : & Oid ,
428- ) -> IResult < Input < ' i > , ParsedExtension < ' i > , X509Error > {
435+ fn parse_extension0 < ' i > ( input : Input < ' i > , oid : & Oid , critical : bool ) -> ParsedExtension < ' i > {
429436 if let Some ( parser) = EXTENSION_PARSERS . get ( oid) {
430437 match parser ( input. clone ( ) ) {
431- Ok ( ( rem , ext) ) => Ok ( ( rem , ext) ) ,
432- Err ( error) => Ok ( ( input , ParsedExtension :: ParseError { error } ) ) ,
438+ Ok ( ( _ , ext) ) => ext,
439+ Err ( error) => ParsedExtension :: ParseError { error } ,
433440 }
434441 } else {
435- Ok ( (
436- input,
437- ParsedExtension :: UnsupportedExtension {
438- oid : oid. to_owned ( ) ,
439- } ,
440- ) )
442+ ParsedExtension :: UnsupportedExtension ( UnsupportedExtension {
443+ oid : oid. to_owned ( ) ,
444+ value : input. as_bytes2 ( ) ,
445+ critical,
446+ } )
441447 }
442448 }
443449
444450 pub ( crate ) fn parse_extension < ' i > (
445451 input : Input < ' i > ,
446452 oid : & Oid ,
447- ) -> IResult < Input < ' i > , ParsedExtension < ' i > , X509Error > {
448- parse_extension0 ( input, oid)
453+ critical : bool ,
454+ ) -> ParsedExtension < ' i > {
455+ parse_extension0 ( input, oid, critical)
449456 }
450457
451458 fn parse_basicconstraints_ext ( input : Input ) -> IResult < Input , ParsedExtension , X509Error > {
0 commit comments