/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/reader/nested.rs
Line | Count | Source |
1 | | //! Reader type for consuming nested TLV records within a DER document. |
2 | | |
3 | | use crate::{reader::Reader, Error, ErrorKind, Header, Length, Result}; |
4 | | |
5 | | /// Reader type used by [`Reader::read_nested`]. |
6 | | pub struct NestedReader<'i, R> { |
7 | | /// Inner reader type. |
8 | | inner: &'i mut R, |
9 | | |
10 | | /// Nested input length. |
11 | | input_len: Length, |
12 | | |
13 | | /// Position within the nested input. |
14 | | position: Length, |
15 | | } |
16 | | |
17 | | impl<'i, 'r, R: Reader<'r>> NestedReader<'i, R> { |
18 | | /// Create a new nested reader which can read the given [`Length`]. |
19 | 3.19k | pub(crate) fn new(inner: &'i mut R, len: Length) -> Result<Self> { |
20 | 3.19k | if len <= inner.remaining_len() { |
21 | 3.19k | Ok(Self { |
22 | 3.19k | inner, |
23 | 3.19k | input_len: len, |
24 | 3.19k | position: Length::ZERO, |
25 | 3.19k | }) |
26 | | } else { |
27 | | Err(ErrorKind::Incomplete { |
28 | 0 | expected_len: (inner.offset() + len)?, |
29 | 0 | actual_len: (inner.offset() + inner.remaining_len())?, |
30 | | } |
31 | 0 | .at(inner.offset())) |
32 | | } |
33 | 3.19k | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::new <der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::new Line | Count | Source | 19 | 3.19k | pub(crate) fn new(inner: &'i mut R, len: Length) -> Result<Self> { | 20 | 3.19k | if len <= inner.remaining_len() { | 21 | 3.19k | Ok(Self { | 22 | 3.19k | inner, | 23 | 3.19k | input_len: len, | 24 | 3.19k | position: Length::ZERO, | 25 | 3.19k | }) | 26 | | } else { | 27 | | Err(ErrorKind::Incomplete { | 28 | 0 | expected_len: (inner.offset() + len)?, | 29 | 0 | actual_len: (inner.offset() + inner.remaining_len())?, | 30 | | } | 31 | 0 | .at(inner.offset())) | 32 | | } | 33 | 3.19k | } |
Unexecuted instantiation: <der::reader::nested::NestedReader<_>>::new |
34 | | |
35 | | /// Move the position cursor the given length, returning an error if there |
36 | | /// isn't enough remaining data in the nested input. |
37 | 19.1k | fn advance_position(&mut self, len: Length) -> Result<()> { |
38 | 19.1k | let new_position = (self.position + len)?; |
39 | | |
40 | 19.1k | if new_position <= self.input_len { |
41 | 19.1k | self.position = new_position; |
42 | 19.1k | Ok(()) |
43 | | } else { |
44 | | Err(ErrorKind::Incomplete { |
45 | 0 | expected_len: (self.inner.offset() + len)?, |
46 | 0 | actual_len: (self.inner.offset() + self.remaining_len())?, |
47 | | } |
48 | 0 | .at(self.inner.offset())) |
49 | | } |
50 | 19.1k | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::advance_position <der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::advance_position Line | Count | Source | 37 | 19.1k | fn advance_position(&mut self, len: Length) -> Result<()> { | 38 | 19.1k | let new_position = (self.position + len)?; | 39 | | | 40 | 19.1k | if new_position <= self.input_len { | 41 | 19.1k | self.position = new_position; | 42 | 19.1k | Ok(()) | 43 | | } else { | 44 | | Err(ErrorKind::Incomplete { | 45 | 0 | expected_len: (self.inner.offset() + len)?, | 46 | 0 | actual_len: (self.inner.offset() + self.remaining_len())?, | 47 | | } | 48 | 0 | .at(self.inner.offset())) | 49 | | } | 50 | 19.1k | } |
Unexecuted instantiation: <der::reader::nested::NestedReader<_>>::advance_position |
51 | | } |
52 | | |
53 | | impl<'i, 'r, R: Reader<'r>> Reader<'r> for NestedReader<'i, R> { |
54 | 3.19k | fn input_len(&self) -> Length { |
55 | 3.19k | self.input_len |
56 | 3.19k | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::input_len <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::input_len Line | Count | Source | 54 | 3.19k | fn input_len(&self) -> Length { | 55 | 3.19k | self.input_len | 56 | 3.19k | } |
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::input_len |
57 | | |
58 | 0 | fn peek_byte(&self) -> Option<u8> { |
59 | 0 | if self.is_finished() { |
60 | 0 | None |
61 | | } else { |
62 | 0 | self.inner.peek_byte() |
63 | | } |
64 | 0 | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::peek_byte Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::peek_byte |
65 | | |
66 | 0 | fn peek_header(&self) -> Result<Header> { |
67 | 0 | if self.is_finished() { |
68 | 0 | Err(Error::incomplete(self.offset())) |
69 | | } else { |
70 | | // TODO(tarcieri): handle peeking past nested length |
71 | 0 | self.inner.peek_header() |
72 | | } |
73 | 0 | } |
74 | | |
75 | 3.19k | fn position(&self) -> Length { |
76 | 3.19k | self.position |
77 | 3.19k | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::position <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::position Line | Count | Source | 75 | 3.19k | fn position(&self) -> Length { | 76 | 3.19k | self.position | 77 | 3.19k | } |
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::position |
78 | | |
79 | 6.39k | fn read_slice(&mut self, len: Length) -> Result<&'r [u8]> { |
80 | 6.39k | self.advance_position(len)?; |
81 | 6.39k | self.inner.read_slice(len) |
82 | 6.39k | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::read_slice <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::read_slice Line | Count | Source | 79 | 6.39k | fn read_slice(&mut self, len: Length) -> Result<&'r [u8]> { | 80 | 6.39k | self.advance_position(len)?; | 81 | 6.39k | self.inner.read_slice(len) | 82 | 6.39k | } |
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::read_slice |
83 | | |
84 | 0 | fn error(&mut self, kind: ErrorKind) -> Error { |
85 | 0 | self.inner.error(kind) |
86 | 0 | } |
87 | | |
88 | 0 | fn offset(&self) -> Length { |
89 | 0 | self.inner.offset() |
90 | 0 | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::offset Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::offset |
91 | | |
92 | 12.7k | fn read_into<'o>(&mut self, out: &'o mut [u8]) -> Result<&'o [u8]> { |
93 | 12.7k | self.advance_position(Length::try_from(out.len())?)?; |
94 | 12.7k | self.inner.read_into(out) |
95 | 12.7k | } Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::read_into <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::read_into Line | Count | Source | 92 | 12.7k | fn read_into<'o>(&mut self, out: &'o mut [u8]) -> Result<&'o [u8]> { | 93 | 12.7k | self.advance_position(Length::try_from(out.len())?)?; | 94 | 12.7k | self.inner.read_into(out) | 95 | 12.7k | } |
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::read_into |
96 | | } |