Skip to content

Commit d933c0d

Browse files
authored
der: use read_nested to check length of IMPLICIT types (#1739)
1 parent a682e7b commit d933c0d

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

der/src/asn1/context_specific.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,14 @@ impl<T> ContextSpecific<T> {
6363
T: DecodeValue<'a> + Tagged,
6464
{
6565
Self::decode_with::<_, _, T::Error>(reader, tag_number, |reader| {
66+
// Decode IMPLICIT header
6667
let header = Header::decode(reader)?;
67-
let value = T::decode_value(reader, header)?;
68+
69+
// read_nested checks if header matches decoded length
70+
let value = reader.read_nested(header.length, |reader| {
71+
// Decode inner IMPLICIT value
72+
T::decode_value(reader, header)
73+
})?;
6874

6975
if header.tag.is_constructed() != value.tag().is_constructed() {
7076
return Err(header.tag.non_canonical_error().into());
@@ -119,6 +125,7 @@ where
119125
type Error = T::Error;
120126

121127
fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Self, Self::Error> {
128+
// Decode EXPLICIT header
122129
let header = Header::decode(reader)?;
123130

124131
match header.tag {
@@ -128,7 +135,10 @@ where
128135
} => Ok(Self {
129136
tag_number: number,
130137
tag_mode: TagMode::default(),
131-
value: reader.read_nested(header.length, |reader| T::decode(reader))?,
138+
value: reader.read_nested(header.length, |reader| {
139+
// Decode inner tag-length-value of EXPLICIT
140+
T::decode(reader)
141+
})?,
132142
}),
133143
tag => Err(tag.unexpected_error(None).into()),
134144
}

x509-cert/tests/pkix_extensions.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -843,8 +843,6 @@ fn decode_cert() {
843843

844844
#[test]
845845
fn decode_idp() {
846-
use der::TagNumber;
847-
848846
// IDP from 04A8739769B3C090A11DCDFABA3CF33F4BEF21F3.crl in PKITS 2048 in ficam-scvp-testing repo
849847
let idp = IssuingDistributionPoint::from_der(&hex!("30038201FF")).unwrap();
850848
assert_eq!(idp.only_contains_ca_certs, true);
@@ -1112,7 +1110,11 @@ fn decode_idp() {
11121110
panic!("Expected FullName")
11131111
}
11141112
}
1113+
}
11151114

1115+
#[test]
1116+
fn decode_idp_negative() {
1117+
use der::TagNumber;
11161118
//---------------------------------
11171119
// Negative tests
11181120
//---------------------------------
@@ -1143,7 +1145,7 @@ fn decode_idp() {
11431145
"3067A060A05EA45C305A310B3009060355040613025553311F301D060355040A131654657374204365727469666963617465732032303137311C301A060355040B13136F6E6C79536F6D65526561736F6E7320434133310C300A0603550403130343524C8304079F80"
11441146
));
11451147
let err = idp.err().unwrap();
1146-
assert_eq!(err.position().unwrap(), 103u8.into());
1148+
assert_eq!(err.position().unwrap(), 105u8.into());
11471149
assert_eq!(
11481150
ErrorKind::Incomplete {
11491151
expected_len: 106u8.into(),
@@ -1197,7 +1199,13 @@ fn decode_idp() {
11971199
"30820168A0820161A082015DA4753073310B3009060355040613025553311F301D060355040A13165465737420436572746966696361746573203230313731183016060355040B130F696E64697265637443524C204341353129302706035504031320696E6469726563742043524C20666F7220696E64697265637443524C20434136A4753073310B3009060355040613025553311F301D060355040A13165465737420436572746966696361746573203230313731183016060355040B130F696E64697265637443524C204341353129302706035504031320696E6469726563742043524C20666F7220696E64697265637443524C20434137A46D306B310B3009060355040613025553311F301D060355040A13165465737420436572746966696361746573203230313731183016060355040B130F696E64697265637443524C204341353121301F0603550403131843524C3120666F7220696E64697265637443524C204341358402FFFF"
11981200
));
11991201
let err = idp.err().unwrap();
1200-
assert_eq!(ErrorKind::Length { tag: Tag::Boolean }, err.kind());
1202+
assert_eq!(
1203+
ErrorKind::Incomplete {
1204+
expected_len: Length::new(365),
1205+
actual_len: Length::new(364)
1206+
},
1207+
err.kind()
1208+
);
12011209

12021210
// Boolean value is neither 0x00 nor 0xFF
12031211
let idp = IssuingDistributionPoint::from_der(&hex!(

0 commit comments

Comments
 (0)