@@ -175,7 +175,7 @@ impl<'a> DerParser<'a> for X509Extension<'a> {
175
175
let ( rem, ( _, value) ) = <& [ u8 ] >:: parse_der_as_input ( rem)
176
176
. map_err ( |_| Err :: Error ( X509Error :: InvalidExtensions ) ) ?;
177
177
178
- let ( _ , parsed_extension) = parser:: parse_extension ( value. clone ( ) , & oid) ? ;
178
+ let parsed_extension = parser:: parse_extension ( value. clone ( ) , & oid, critical ) ;
179
179
let ext = X509Extension {
180
180
oid,
181
181
critical,
@@ -226,10 +226,11 @@ impl<'i> Parser<Input<'i>> for X509ExtensionParser {
226
226
let ( rem, ( _, value) ) = <& [ u8 ] >:: parse_der_as_input ( rem)
227
227
. map_err ( |_| Err :: Error ( X509Error :: InvalidExtensions ) ) ?;
228
228
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 )
231
231
} else {
232
- ( rem. take ( rem. input_len ( ) ) , ParsedExtension :: Unparsed )
232
+ rem. take ( rem. input_len ( ) ) ;
233
+ ParsedExtension :: Unparsed
233
234
} ;
234
235
235
236
let ext = X509Extension {
@@ -258,15 +259,21 @@ impl<'i> Parser<Input<'i>> for X509ExtensionParser {
258
259
}
259
260
}
260
261
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
+
261
273
#[ derive( Clone , Debug , PartialEq ) ]
262
274
pub enum ParsedExtension < ' a > {
263
275
/// Crate parser does not support this extension (yet)
264
- UnsupportedExtension {
265
- /// The Object ID of the extension.
266
- oid : Oid < ' a > ,
267
- /// The unparsed value.
268
- value : & ' a [ u8 ] ,
269
- } ,
276
+ UnsupportedExtension ( UnsupportedExtension < ' a > ) ,
270
277
ParseError {
271
278
error : Err < X509Error > ,
272
279
} ,
@@ -425,31 +432,27 @@ pub(crate) mod parser {
425
432
426
433
// look into the parser map if the extension is known, and parse it
427
434
// otherwise, leave it as UnsupportedExtension
428
- fn parse_extension0 < ' i > (
429
- input : Input < ' i > ,
430
- oid : & Oid ,
431
- ) -> IResult < Input < ' i > , ParsedExtension < ' i > , X509Error > {
435
+ fn parse_extension0 < ' i > ( input : Input < ' i > , oid : & Oid , critical : bool ) -> ParsedExtension < ' i > {
432
436
if let Some ( parser) = EXTENSION_PARSERS . get ( oid) {
433
437
match parser ( input. clone ( ) ) {
434
- Ok ( ( rem , ext) ) => Ok ( ( rem , ext) ) ,
435
- Err ( error) => Ok ( ( input , ParsedExtension :: ParseError { error } ) ) ,
438
+ Ok ( ( _ , ext) ) => ext,
439
+ Err ( error) => ParsedExtension :: ParseError { error } ,
436
440
}
437
441
} else {
438
- Ok ( (
439
- input,
440
- ParsedExtension :: UnsupportedExtension {
441
- oid : oid. to_owned ( ) ,
442
- value : i,
443
- } ,
444
- ) )
442
+ ParsedExtension :: UnsupportedExtension ( UnsupportedExtension {
443
+ oid : oid. to_owned ( ) ,
444
+ value : input. as_bytes2 ( ) ,
445
+ critical,
446
+ } )
445
447
}
446
448
}
447
449
448
450
pub ( crate ) fn parse_extension < ' i > (
449
451
input : Input < ' i > ,
450
452
oid : & Oid ,
451
- ) -> IResult < Input < ' i > , ParsedExtension < ' i > , X509Error > {
452
- parse_extension0 ( input, oid)
453
+ critical : bool ,
454
+ ) -> ParsedExtension < ' i > {
455
+ parse_extension0 ( input, oid, critical)
453
456
}
454
457
455
458
fn parse_basicconstraints_ext ( input : Input ) -> IResult < Input , ParsedExtension , X509Error > {
0 commit comments