Skip to content

Commit 54a936d

Browse files
committed
Use dedicated CustomExtension type
1 parent d714ae5 commit 54a936d

File tree

2 files changed

+43
-37
lines changed

2 files changed

+43
-37
lines changed

src/extensions/mod.rs

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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,15 +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)]
262274
pub enum ParsedExtension<'a> {
263275
/// 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>),
270277
ParseError {
271278
error: Err<X509Error>,
272279
},
@@ -425,31 +432,27 @@ pub(crate) mod parser {
425432

426433
// look into the parser map if the extension is known, and parse it
427434
// 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> {
432436
if let Some(parser) = EXTENSION_PARSERS.get(oid) {
433437
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 },
436440
}
437441
} 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+
})
445447
}
446448
}
447449

448450
pub(crate) fn parse_extension<'i>(
449451
input: Input<'i>,
450452
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)
453456
}
454457

455458
fn parse_basicconstraints_ext(input: Input) -> IResult<Input, ParsedExtension, X509Error> {

tests/readcsr.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,22 +149,25 @@ fn read_csr_with_custom_extension() {
149149
.certification_request_info
150150
.find_attribute(&OID_PKCS9_EXTENSION_REQUEST)
151151
.expect("Custom extension not found in CSR");
152-
match custom_attr.parsed_attribute() {
153-
ParsedCriAttribute::ExtensionRequest(req) => {
154-
assert_eq!(req.extensions.len(), 1);
155-
let extension = req.extensions.first().unwrap();
156-
assert_eq!(extension.oid, OID_CUSTOM_EXTENSION);
157-
assert_eq!(extension.critical, false);
158-
assert_eq!(extension.value, VALUE_CUSTOM_EXTENSION);
152+
for attr in custom_attr.parsed_attributes() {
153+
match attr {
154+
ParsedCriAttribute::ExtensionRequest(req) => {
155+
assert_eq!(req.extensions.len(), 1);
156+
let extension = req.extensions.first().unwrap();
157+
assert_eq!(extension.oid, OID_CUSTOM_EXTENSION);
158+
assert_eq!(extension.critical, false);
159+
assert_eq!(extension.value.as_bytes2(), VALUE_CUSTOM_EXTENSION);
160+
}
161+
_ => unreachable!(),
159162
}
160-
_ => unreachable!(),
161163
}
162164

163-
let extensions = csr.requested_extensions().unwrap();
165+
let extensions = csr.requested_extensions();
164166
for extension in extensions {
165-
if let ParsedExtension::UnsupportedExtension { oid, value } = extension {
166-
assert_eq!(oid, &OID_CUSTOM_EXTENSION);
167-
assert_eq!(value, &VALUE_CUSTOM_EXTENSION);
167+
if let ParsedExtension::UnsupportedExtension(ext) = extension {
168+
assert_eq!(ext.oid, OID_CUSTOM_EXTENSION);
169+
assert_eq!(ext.value, VALUE_CUSTOM_EXTENSION);
170+
assert_eq!(ext.critical, false);
168171
}
169172
}
170173
}

0 commit comments

Comments
 (0)