Coverage Report

Created: 2026-01-25 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/reader.rs
Line
Count
Source
1
//! Reader trait.
2
3
pub(crate) mod nested;
4
#[cfg(feature = "pem")]
5
pub(crate) mod pem;
6
pub(crate) mod slice;
7
8
pub(crate) use nested::NestedReader;
9
10
use crate::{
11
    asn1::ContextSpecific, Decode, DecodeValue, Encode, Error, ErrorKind, FixedTag, Header, Length,
12
    Result, Tag, TagMode, TagNumber,
13
};
14
15
#[cfg(feature = "alloc")]
16
use alloc::vec::Vec;
17
18
/// Reader trait which reads DER-encoded input.
19
pub trait Reader<'r>: Sized {
20
    /// Get the length of the input.
21
    fn input_len(&self) -> Length;
22
23
    /// Peek at the next byte of input without modifying the cursor.
24
    fn peek_byte(&self) -> Option<u8>;
25
26
    /// Peek forward in the input data, attempting to decode a [`Header`] from
27
    /// the data at the current position in the decoder.
28
    ///
29
    /// Does not modify the decoder's state.
30
    fn peek_header(&self) -> Result<Header>;
31
32
    /// Get the position within the buffer.
33
    fn position(&self) -> Length;
34
35
    /// Attempt to read data borrowed directly from the input as a slice,
36
    /// updating the internal cursor position.
37
    ///
38
    /// # Returns
39
    /// - `Ok(slice)` on success
40
    /// - `Err(ErrorKind::Incomplete)` if there is not enough data
41
    /// - `Err(ErrorKind::Reader)` if the reader can't borrow from the input
42
    fn read_slice(&mut self, len: Length) -> Result<&'r [u8]>;
43
44
    /// Attempt to decode an ASN.1 `CONTEXT-SPECIFIC` field with the
45
    /// provided [`TagNumber`].
46
0
    fn context_specific<T>(&mut self, tag_number: TagNumber, tag_mode: TagMode) -> Result<Option<T>>
47
0
    where
48
0
        T: DecodeValue<'r> + FixedTag,
49
    {
50
0
        Ok(match tag_mode {
51
0
            TagMode::Explicit => ContextSpecific::<T>::decode_explicit(self, tag_number)?,
52
0
            TagMode::Implicit => ContextSpecific::<T>::decode_implicit(self, tag_number)?,
53
        }
54
0
        .map(|field| field.value))
55
0
    }
56
57
    /// Decode a value which impls the [`Decode`] trait.
58
0
    fn decode<T: Decode<'r>>(&mut self) -> Result<T> {
59
0
        T::decode(self).map_err(|e| e.nested(self.position()))
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::decode::<[f64; 0]>::{closure#0}
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::decode::<f64>::{closure#0}
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::decode::<u8>::{closure#0}
Unexecuted instantiation: <_ as der::reader::Reader>::decode::<_>::{closure#0}
60
0
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::decode::<[f64; 0]>
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::decode::<f64>
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::decode::<u8>
Unexecuted instantiation: <_ as der::reader::Reader>::decode::<_>
61
62
    /// Return an error with the given [`ErrorKind`], annotating it with
63
    /// context about where the error occurred.
64
0
    fn error(&mut self, kind: ErrorKind) -> Error {
65
0
        kind.at(self.position())
66
0
    }
67
68
    /// Finish decoding, returning the given value if there is no
69
    /// remaining data, or an error otherwise
70
285
    fn finish<T>(self, value: T) -> Result<T> {
71
285
        if !self.is_finished() {
72
0
            Err(ErrorKind::TrailingData {
73
0
                decoded: self.position(),
74
0
                remaining: self.remaining_len(),
75
0
            }
76
0
            .at(self.position()))
77
        } else {
78
285
            Ok(value)
79
        }
80
285
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::finish::<der::asn1::sequence_of::SequenceOf<f64, 0>>
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::finish::<alloc::vec::Vec<der::asn1::octet_string::OctetStringRef>>
Line
Count
Source
70
6
    fn finish<T>(self, value: T) -> Result<T> {
71
6
        if !self.is_finished() {
72
0
            Err(ErrorKind::TrailingData {
73
0
                decoded: self.position(),
74
0
                remaining: self.remaining_len(),
75
0
            }
76
0
            .at(self.position()))
77
        } else {
78
6
            Ok(value)
79
        }
80
6
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::finish::<alloc::vec::Vec<anise::structure::location::TerrainMask>>
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::finish::<alloc::vec::Vec<i32>>
Line
Count
Source
70
220
    fn finish<T>(self, value: T) -> Result<T> {
71
220
        if !self.is_finished() {
72
0
            Err(ErrorKind::TrailingData {
73
0
                decoded: self.position(),
74
0
                remaining: self.remaining_len(),
75
0
            }
76
0
            .at(self.position()))
77
        } else {
78
220
            Ok(value)
79
        }
80
220
    }
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::finish::<alloc::vec::Vec<u32>>
Line
Count
Source
70
59
    fn finish<T>(self, value: T) -> Result<T> {
71
59
        if !self.is_finished() {
72
0
            Err(ErrorKind::TrailingData {
73
0
                decoded: self.position(),
74
0
                remaining: self.remaining_len(),
75
0
            }
76
0
            .at(self.position()))
77
        } else {
78
59
            Ok(value)
79
        }
80
59
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::finish::<der::asn1::sequence_of::SequenceOf<anise::structure::planetocentric::phaseangle::PhaseAngle<0>, 32>>
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::finish::<der::asn1::sequence_of::SequenceOf<f64, 32>>
Unexecuted instantiation: <_ as der::reader::Reader>::finish::<_>
81
82
    /// Have we read all of the input data?
83
20.8k
    fn is_finished(&self) -> bool {
84
20.8k
        self.remaining_len().is_zero()
85
20.8k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::is_finished
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::is_finished
Line
Count
Source
83
1.52k
    fn is_finished(&self) -> bool {
84
1.52k
        self.remaining_len().is_zero()
85
1.52k
    }
<der::reader::slice::SliceReader as der::reader::Reader>::is_finished
Line
Count
Source
83
19.2k
    fn is_finished(&self) -> bool {
84
19.2k
        self.remaining_len().is_zero()
85
19.2k
    }
86
87
    /// Offset within the original input stream.
88
    ///
89
    /// This is used for error reporting, and doesn't need to be overridden
90
    /// by any reader implementations (except for the built-in `NestedReader`,
91
    /// which consumes nested input messages)
92
378
    fn offset(&self) -> Length {
93
378
        self.position()
94
378
    }
<der::reader::slice::SliceReader as der::reader::Reader>::offset
Line
Count
Source
92
378
    fn offset(&self) -> Length {
93
378
        self.position()
94
378
    }
Unexecuted instantiation: <_ as der::reader::Reader>::offset
95
96
    /// Peek at the next byte in the decoder and attempt to decode it as a
97
    /// [`Tag`] value.
98
    ///
99
    /// Does not modify the decoder's state.
100
0
    fn peek_tag(&self) -> Result<Tag> {
101
0
        match self.peek_byte() {
102
0
            Some(byte) => byte.try_into(),
103
0
            None => Err(Error::incomplete(self.input_len())),
104
        }
105
0
    }
106
107
    /// Read a single byte.
108
106k
    fn read_byte(&mut self) -> Result<u8> {
109
106k
        let mut buf = [0];
110
106k
        self.read_into(&mut buf)?;
111
105k
        Ok(buf[0])
112
106k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::read_byte
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::read_byte
Line
Count
Source
108
2.15k
    fn read_byte(&mut self) -> Result<u8> {
109
2.15k
        let mut buf = [0];
110
2.15k
        self.read_into(&mut buf)?;
111
2.11k
        Ok(buf[0])
112
2.15k
    }
<der::reader::slice::SliceReader as der::reader::Reader>::read_byte
Line
Count
Source
108
104k
    fn read_byte(&mut self) -> Result<u8> {
109
104k
        let mut buf = [0];
110
104k
        self.read_into(&mut buf)?;
111
103k
        Ok(buf[0])
112
104k
    }
113
114
    /// Attempt to read input data, writing it into the provided buffer, and
115
    /// returning a slice on success.
116
    ///
117
    /// # Returns
118
    /// - `Ok(slice)` if there is sufficient data
119
    /// - `Err(ErrorKind::Incomplete)` if there is not enough data
120
120k
    fn read_into<'o>(&mut self, buf: &'o mut [u8]) -> Result<&'o [u8]> {
121
120k
        let input = self.read_slice(buf.len().try_into()?)?;
122
119k
        buf.copy_from_slice(input);
123
119k
        Ok(buf)
124
120k
    }
125
126
    /// Read nested data of the given length.
127
1.07k
    fn read_nested<'n, T, F>(&'n mut self, len: Length, f: F) -> Result<T>
128
1.07k
    where
129
1.07k
        F: FnOnce(&mut NestedReader<'n, Self>) -> Result<T>,
130
    {
131
1.07k
        let mut reader = NestedReader::new(self, len)?;
132
1.00k
        let ret = f(&mut reader)?;
133
285
        reader.finish(ret)
134
1.07k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::read_nested::<der::asn1::sequence_of::SequenceOf<f64, 0>, <der::asn1::sequence_of::SequenceOf<f64, 0> as der::decode::DecodeValue>::decode_value<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::{closure#0}>
<der::reader::slice::SliceReader as der::reader::Reader>::read_nested::<alloc::vec::Vec<der::asn1::octet_string::OctetStringRef>, <alloc::vec::Vec<der::asn1::octet_string::OctetStringRef> as der::decode::DecodeValue>::decode_value<der::reader::slice::SliceReader>::{closure#0}>
Line
Count
Source
127
46
    fn read_nested<'n, T, F>(&'n mut self, len: Length, f: F) -> Result<T>
128
46
    where
129
46
        F: FnOnce(&mut NestedReader<'n, Self>) -> Result<T>,
130
    {
131
46
        let mut reader = NestedReader::new(self, len)?;
132
44
        let ret = f(&mut reader)?;
133
6
        reader.finish(ret)
134
46
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::read_nested::<alloc::vec::Vec<anise::structure::location::TerrainMask>, <alloc::vec::Vec<anise::structure::location::TerrainMask> as der::decode::DecodeValue>::decode_value<der::reader::slice::SliceReader>::{closure#0}>
<der::reader::slice::SliceReader as der::reader::Reader>::read_nested::<alloc::vec::Vec<i32>, <alloc::vec::Vec<i32> as der::decode::DecodeValue>::decode_value<der::reader::slice::SliceReader>::{closure#0}>
Line
Count
Source
127
876
    fn read_nested<'n, T, F>(&'n mut self, len: Length, f: F) -> Result<T>
128
876
    where
129
876
        F: FnOnce(&mut NestedReader<'n, Self>) -> Result<T>,
130
    {
131
876
        let mut reader = NestedReader::new(self, len)?;
132
823
        let ret = f(&mut reader)?;
133
220
        reader.finish(ret)
134
876
    }
<der::reader::slice::SliceReader as der::reader::Reader>::read_nested::<alloc::vec::Vec<u32>, <alloc::vec::Vec<u32> as der::decode::DecodeValue>::decode_value<der::reader::slice::SliceReader>::{closure#0}>
Line
Count
Source
127
157
    fn read_nested<'n, T, F>(&'n mut self, len: Length, f: F) -> Result<T>
128
157
    where
129
157
        F: FnOnce(&mut NestedReader<'n, Self>) -> Result<T>,
130
    {
131
157
        let mut reader = NestedReader::new(self, len)?;
132
134
        let ret = f(&mut reader)?;
133
59
        reader.finish(ret)
134
157
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::read_nested::<der::asn1::sequence_of::SequenceOf<anise::structure::planetocentric::phaseangle::PhaseAngle<0>, 32>, <der::asn1::sequence_of::SequenceOf<anise::structure::planetocentric::phaseangle::PhaseAngle<0>, 32> as der::decode::DecodeValue>::decode_value<der::reader::slice::SliceReader>::{closure#0}>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::read_nested::<der::asn1::sequence_of::SequenceOf<f64, 32>, <der::asn1::sequence_of::SequenceOf<f64, 32> as der::decode::DecodeValue>::decode_value<der::reader::slice::SliceReader>::{closure#0}>
Unexecuted instantiation: <_ as der::reader::Reader>::read_nested::<_, _>
135
136
    /// Read a byte vector of the given length.
137
    #[cfg(feature = "alloc")]
138
0
    fn read_vec(&mut self, len: Length) -> Result<Vec<u8>> {
139
0
        let mut bytes = vec![0u8; usize::try_from(len)?];
140
0
        self.read_into(&mut bytes)?;
141
0
        Ok(bytes)
142
0
    }
143
144
    /// Get the number of bytes still remaining in the buffer.
145
1.57k
    fn remaining_len(&self) -> Length {
146
1.57k
        debug_assert!(self.position() <= self.input_len());
147
1.57k
        self.input_len().saturating_sub(self.position())
148
1.57k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::remaining_len
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::remaining_len
Line
Count
Source
145
1.57k
    fn remaining_len(&self) -> Length {
146
1.57k
        debug_assert!(self.position() <= self.input_len());
147
1.57k
        self.input_len().saturating_sub(self.position())
148
1.57k
    }
Unexecuted instantiation: <_ as der::reader::Reader>::remaining_len
149
150
    /// Read an ASN.1 `SEQUENCE`, creating a nested [`Reader`] for the body and
151
    /// calling the provided closure with it.
152
0
    fn sequence<'n, F, T>(&'n mut self, f: F) -> Result<T>
153
0
    where
154
0
        F: FnOnce(&mut NestedReader<'n, Self>) -> Result<T>,
155
    {
156
0
        let header = Header::decode(self)?;
157
0
        header.tag.assert_eq(Tag::Sequence)?;
158
0
        self.read_nested(header.length, f)
159
0
    }
160
161
    /// Obtain a slice of bytes contain a complete TLV production suitable for parsing later.
162
0
    fn tlv_bytes(&mut self) -> Result<&'r [u8]> {
163
0
        let header = self.peek_header()?;
164
0
        let header_len = header.encoded_len()?;
165
0
        self.read_slice((header_len + header.length)?)
166
0
    }
167
}