diff --git a/der/src/asn1/sequence_of.rs b/der/src/asn1/sequence_of.rs index 5929d6e7d..04aa7587b 100644 --- a/der/src/asn1/sequence_of.rs +++ b/der/src/asn1/sequence_of.rs @@ -245,7 +245,9 @@ where #[cfg(test)] mod tests { use crate::asn1::SequenceOf; - use crate::ord::DerOrd; + use crate::{Decode, DerOrd, ErrorKind, Length}; + + use hex_literal::hex; #[test] fn sequenceof_valueord_value_cmp() { @@ -265,4 +267,22 @@ mod tests { }; assert_eq!(arr1.der_cmp(&arr2), Ok(Ordering::Greater)); } + + #[test] + fn sequenceof_data_too_short() { + let invalid_data = &hex!( + "3002" // SEQUENCE tag and length (shorter than actual data) + "0201" // INTEGER tag and length + "05" + ); + let err = SequenceOf::::from_der(invalid_data) + .expect_err("read_nested should narrow down the data slice"); + assert_eq!( + ErrorKind::Incomplete { + expected_len: Length::new(5), + actual_len: Length::new(4) + }, + err.kind() + ); + } } diff --git a/der/src/asn1/set_of.rs b/der/src/asn1/set_of.rs index b1452c4f8..c850380e8 100644 --- a/der/src/asn1/set_of.rs +++ b/der/src/asn1/set_of.rs @@ -478,7 +478,9 @@ mod tests { use super::SetOf; #[cfg(feature = "alloc")] use super::SetOfVec; - use crate::{DerOrd, ErrorKind}; + use crate::{Decode, DerOrd, ErrorKind, Length}; + + use hex_literal::hex; #[test] fn setof_tryfrom_array() { @@ -505,6 +507,24 @@ mod tests { assert_eq!(set1.der_cmp(&set2), Ok(Ordering::Greater)); } + #[test] + fn setof_data_too_short() { + let invalid_data = &hex!( + "3102" // SET tag and length (shorter than actual data) + "0201" // INTEGER tag and length + "04" + ); + let err = SetOf::::from_der(invalid_data) + .expect_err("read_nested should narrow down the data slice"); + assert_eq!( + ErrorKind::Incomplete { + expected_len: Length::new(5), + actual_len: Length::new(4) + }, + err.kind() + ); + } + #[cfg(feature = "alloc")] #[test] fn setofvec_tryfrom_array() { diff --git a/der/src/reader/slice.rs b/der/src/reader/slice.rs index 115155eac..e70aaa5d4 100644 --- a/der/src/reader/slice.rs +++ b/der/src/reader/slice.rs @@ -222,4 +222,26 @@ mod tests { err.kind() ); } + + #[test] + fn read_nested_trailing_data() { + let len: Length = Length::new_usize(EXAMPLE_MSG.len()).expect("usize to be valid length"); + let mut reader = SliceReader::new(EXAMPLE_MSG).expect("SliceReader to be created"); + + let nested_err: crate::Error = reader + .read_nested(len, |rdr| { + let x = i8::decode(rdr)?; + assert_eq!(42i8, x); + Ok(()) + }) + .unwrap_err(); + + assert_eq!( + ErrorKind::TrailingData { + decoded: 3u8.into(), + remaining: 1u8.into(), + }, + nested_err.kind() + ); + } }