Skip to content

Commit 545415d

Browse files
authored
der: fix Header::peek + add tests (#1828)
1 parent 57acffd commit 545415d

File tree

3 files changed

+58
-13
lines changed

3 files changed

+58
-13
lines changed

der/src/header.rs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,13 @@ impl Header {
3333

3434
for i in 2..Self::MAX_SIZE {
3535
let slice = &mut buf[0..i];
36-
if reader.peek_into(slice).is_ok() {
37-
if let Ok(header) = Self::from_der(slice) {
38-
return Ok(header);
39-
}
36+
reader.peek_into(slice)?;
37+
if let Ok(header) = Self::from_der(slice) {
38+
return Ok(header);
4039
}
4140
}
42-
43-
Self::from_der(&buf)
41+
reader.peek_into(&mut buf[..])?;
42+
Self::from_der(&buf[..])
4443
}
4544
}
4645

@@ -85,21 +84,48 @@ impl DerOrd for Header {
8584
#[cfg(test)]
8685
mod tests {
8786
use super::Header;
88-
use crate::{Length, Reader, SliceReader, Tag};
87+
use crate::{Encode, Length, Reader, SliceReader, Tag, TagNumber};
8988
use hex_literal::hex;
9089

9190
#[test]
92-
#[allow(clippy::unwrap_used)]
9391
fn peek() {
9492
// INTEGER: 42
9593
const EXAMPLE_MSG: &[u8] = &hex!("02012A00");
9694

97-
let reader = SliceReader::new(EXAMPLE_MSG).unwrap();
95+
let reader = SliceReader::new(EXAMPLE_MSG).expect("slice to be valid length");
9896
assert_eq!(reader.position(), Length::ZERO);
9997

100-
let header = Header::peek(&reader).unwrap();
98+
let header = Header::peek(&reader).expect("peeked tag");
10199
assert_eq!(header.tag, Tag::Integer);
102100
assert_eq!(header.length, Length::ONE);
103101
assert_eq!(reader.position(), Length::ZERO); // Position unchanged
104102
}
103+
104+
#[test]
105+
fn peek_max_header() {
106+
const MAX_HEADER: [u8; 11] = hex!("BF8FFFFFFF7F 84FFFFFFFF");
107+
let reader = SliceReader::new(&MAX_HEADER).expect("slice to be valid length");
108+
109+
let header = Header::peek(&reader).expect("peeked tag");
110+
assert_eq!(
111+
header.tag,
112+
Tag::ContextSpecific {
113+
constructed: true,
114+
number: TagNumber(0xFFFFFFFF)
115+
}
116+
);
117+
assert_eq!(
118+
header.length,
119+
Length::new_usize(0xFFFFFFFF).expect("u32 to fit")
120+
);
121+
assert_eq!(header.encoded_len(), Ok(Length::new(11)));
122+
assert_eq!(reader.position(), Length::ZERO); // Position unchanged
123+
}
124+
#[test]
125+
fn negative_peek_overlength_header() {
126+
const MAX_HEADER: [u8; 12] = hex!("BF8FFFFFFFFF7F 84FFFFFFFF");
127+
let reader = SliceReader::new(&MAX_HEADER).expect("slice to be valid length");
128+
// Should not decode
129+
Header::peek(&reader).expect_err("overlength error");
130+
}
105131
}

der/src/length.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,11 +340,15 @@ mod tests {
340340
Length::from(0x10000u32),
341341
Length::from_der(&[0x83, 0x01, 0x00, 0x00]).unwrap()
342342
);
343+
assert_eq!(
344+
Length::from(0xFFFFFFFFu32),
345+
Length::from_der(&[0x84, 0xFF, 0xFF, 0xFF, 0xFF]).unwrap()
346+
);
343347
}
344348

345349
#[test]
346350
fn encode() {
347-
let mut buffer = [0u8; 4];
351+
let mut buffer = [0u8; 5];
348352

349353
assert_eq!(&[0x00], Length::ZERO.encode_to_slice(&mut buffer).unwrap());
350354

@@ -374,6 +378,12 @@ mod tests {
374378
.encode_to_slice(&mut buffer)
375379
.unwrap()
376380
);
381+
assert_eq!(
382+
&[0x84, 0xFF, 0xFF, 0xFF, 0xFF],
383+
Length::from(0xFFFFFFFFu32)
384+
.encode_to_slice(&mut buffer)
385+
.unwrap()
386+
);
377387
}
378388

379389
#[test]
@@ -388,5 +398,10 @@ mod tests {
388398
#[test]
389399
fn der_ord() {
390400
assert_eq!(Length::ONE.der_cmp(&Length::MAX).unwrap(), Ordering::Less);
401+
assert_eq!(Length::ONE.der_cmp(&Length::ONE).unwrap(), Ordering::Equal);
402+
assert_eq!(
403+
Length::ONE.der_cmp(&Length::ZERO).unwrap(),
404+
Ordering::Greater
405+
);
391406
}
392407
}

der/src/tag.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ impl Tag {
169169

170170
pub(crate) fn peek_optional<'a>(reader: &impl Reader<'a>) -> Result<Option<Self>> {
171171
let mut buf = [0u8; Self::MAX_SIZE];
172-
173172
if reader.peek_into(&mut buf[0..1]).is_err() {
173+
// Ignore empty buffer
174174
return Ok(None);
175175
}
176176

@@ -750,8 +750,12 @@ mod tests {
750750
#[test]
751751
fn peek_long_tags() {
752752
let reader = SliceReader::new(&hex!("DF8FFFFFFF7F")).expect("valid reader");
753+
let tag = Tag::peek(&reader).expect("peeked tag");
754+
assert!(!tag.is_context_specific());
755+
assert!(!tag.is_application());
756+
assert!(tag.is_private());
753757
assert_eq!(
754-
Tag::peek(&reader).expect("peeked tag"),
758+
tag,
755759
Tag::Private {
756760
constructed: false,
757761
number: TagNumber(u32::MAX)

0 commit comments

Comments
 (0)