diff --git a/der/src/asn1/any.rs b/der/src/asn1/any.rs index 69ac854bf..1e698c406 100644 --- a/der/src/asn1/any.rs +++ b/der/src/asn1/any.rs @@ -73,7 +73,8 @@ impl<'a> AnyRef<'a> { let mut decoder = SliceReader::new(self.value())?; let result = T::decode_value(&mut decoder, header)?; - Ok(decoder.finish(result)?) + decoder.finish()?; + Ok(result) } /// Is this value an ASN.1 `NULL` value? @@ -91,7 +92,8 @@ impl<'a> AnyRef<'a> { self.tag.assert_eq(Tag::Sequence)?; let mut reader = SliceReader::new(self.value.as_slice())?; let result = f(&mut reader)?; - Ok(reader.finish(result)?) + reader.finish()?; + Ok(result) } } diff --git a/der/src/decode.rs b/der/src/decode.rs index 59e4a51d1..f3bb878c0 100644 --- a/der/src/decode.rs +++ b/der/src/decode.rs @@ -30,7 +30,8 @@ pub trait Decode<'a>: Sized + 'a { fn from_ber(bytes: &'a [u8]) -> Result { let mut reader = SliceReader::new_with_encoding_rules(bytes, EncodingRules::Ber)?; let result = Self::decode(&mut reader)?; - Ok(reader.finish(result)?) + reader.finish()?; + Ok(result) } /// Parse `Self` from the provided DER-encoded byte slice. @@ -39,7 +40,8 @@ pub trait Decode<'a>: Sized + 'a { fn from_der(bytes: &'a [u8]) -> Result { let mut reader = SliceReader::new(bytes)?; let result = Self::decode(&mut reader)?; - Ok(reader.finish(result)?) + reader.finish()?; + Ok(result) } /// Parse `Self` from the provided DER-encoded byte slice. diff --git a/der/src/document.rs b/der/src/document.rs index 60f9f9846..24fdd0602 100644 --- a/der/src/document.rs +++ b/der/src/document.rs @@ -187,7 +187,7 @@ impl TryFrom> for Document { fn try_from(der_bytes: Vec) -> Result { let mut decoder = SliceReader::new(&der_bytes)?; decode_sequence(&mut decoder)?; - decoder.finish(())?; + decoder.finish()?; let length = der_bytes.len().try_into()?; Ok(Self { der_bytes, length }) diff --git a/der/src/reader.rs b/der/src/reader.rs index 6941cf6a9..f5549851a 100644 --- a/der/src/reader.rs +++ b/der/src/reader.rs @@ -72,9 +72,9 @@ pub trait Reader<'r>: Sized { kind.at(self.position()) } - /// Finish decoding, returning the given value if there is no + /// Finish decoding, returning `Ok(())` if there is no /// remaining data, or an error otherwise - fn finish(self, value: T) -> Result { + fn finish(self) -> Result<(), Error> { if !self.is_finished() { Err(ErrorKind::TrailingData { decoded: self.position(), @@ -82,7 +82,7 @@ pub trait Reader<'r>: Sized { } .at(self.position())) } else { - Ok(value) + Ok(()) } } diff --git a/der/src/reader/slice.rs b/der/src/reader/slice.rs index 6df3f58a3..3beefa6b3 100644 --- a/der/src/reader/slice.rs +++ b/der/src/reader/slice.rs @@ -104,12 +104,16 @@ impl<'a> Reader<'a> for SliceReader<'a> { self.position = nested_reader.position; self.failed = nested_reader.failed; - ret.and_then(|value| { - nested_reader.finish(value).map_err(|e| { - self.failed = true; - e.into() - }) - }) + match ret { + Ok(value) => { + nested_reader.finish().map_err(|e| { + self.failed = true; + e.into() + })?; + Ok(value) + } + Err(err) => Err(err), + } } fn read_slice(&mut self, len: Length) -> Result<&'a [u8], Error> { @@ -144,7 +148,7 @@ impl<'a> Reader<'a> for SliceReader<'a> { kind.at(self.position) } - fn finish(self, value: T) -> Result { + fn finish(self) -> Result<(), Error> { if self.is_failed() { Err(ErrorKind::Failed.at(self.position)) } else if !self.is_finished() { @@ -154,7 +158,7 @@ impl<'a> Reader<'a> for SliceReader<'a> { } .at(self.position)) } else { - Ok(value) + Ok(()) } } @@ -218,7 +222,7 @@ mod tests { let x = i8::decode(&mut reader).unwrap(); assert_eq!(42i8, x); - let err = reader.finish(x).err().unwrap(); + let err = reader.finish().err().unwrap(); assert_eq!(Some(Length::from(3u8)), err.position()); assert_eq!(