/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/header.rs
Line | Count | Source |
1 | | //! ASN.1 DER headers. |
2 | | |
3 | | use crate::{Decode, DerOrd, Encode, ErrorKind, Length, Reader, Result, Tag, Writer}; |
4 | | use core::cmp::Ordering; |
5 | | |
6 | | /// ASN.1 DER headers: tag + length component of TLV-encoded values |
7 | | #[derive(Copy, Clone, Debug, Eq, PartialEq)] |
8 | | pub struct Header { |
9 | | /// Tag representing the type of the encoded value |
10 | | pub tag: Tag, |
11 | | |
12 | | /// Length of the encoded value |
13 | | pub length: Length, |
14 | | } |
15 | | |
16 | | impl Header { |
17 | | /// Create a new [`Header`] from a [`Tag`] and a specified length. |
18 | | /// |
19 | | /// Returns an error if the length exceeds the limits of [`Length`]. |
20 | 0 | pub fn new(tag: Tag, length: impl TryInto<Length>) -> Result<Self> { |
21 | 0 | let length = length.try_into().map_err(|_| ErrorKind::Overflow)?; |
22 | 0 | Ok(Self { tag, length }) |
23 | 0 | } |
24 | | } |
25 | | |
26 | | impl<'a> Decode<'a> for Header { |
27 | 114k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { |
28 | 114k | let tag = Tag::decode(reader)?; |
29 | | |
30 | 114k | let length = Length::decode(reader).map_err(|e| { |
31 | 383 | if e.kind() == ErrorKind::Overlength { |
32 | 251 | ErrorKind::Length { tag }.into() |
33 | | } else { |
34 | 132 | e |
35 | | } |
36 | 383 | })?; <der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>>::{closure#0}Line | Count | Source | 30 | 36 | let length = Length::decode(reader).map_err(|e| { | 31 | 36 | if e.kind() == ErrorKind::Overlength { | 32 | 19 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 17 | e | 35 | | } | 36 | 36 | })?; |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>::{closure#0}Line | Count | Source | 30 | 43 | let length = Length::decode(reader).map_err(|e| { | 31 | 43 | if e.kind() == ErrorKind::Overlength { | 32 | 25 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 18 | e | 35 | | } | 36 | 43 | })?; |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>::{closure#0}Line | Count | Source | 30 | 73 | let length = Length::decode(reader).map_err(|e| { | 31 | 73 | if e.kind() == ErrorKind::Overlength { | 32 | 42 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 31 | e | 35 | | } | 36 | 73 | })?; |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::{closure#0}Line | Count | Source | 30 | 56 | let length = Length::decode(reader).map_err(|e| { | 31 | 56 | if e.kind() == ErrorKind::Overlength { | 32 | 36 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 20 | e | 35 | | } | 36 | 56 | })?; |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::{closure#0}Line | Count | Source | 30 | 79 | let length = Length::decode(reader).map_err(|e| { | 31 | 79 | if e.kind() == ErrorKind::Overlength { | 32 | 48 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 31 | e | 35 | | } | 36 | 79 | })?; |
<der::header::Header as der::decode::Decode>::decode::<der::reader::slice::SliceReader>::{closure#0}Line | Count | Source | 30 | 96 | let length = Length::decode(reader).map_err(|e| { | 31 | 96 | if e.kind() == ErrorKind::Overlength { | 32 | 81 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 15 | e | 35 | | } | 36 | 96 | })?; |
|
37 | | |
38 | 113k | Ok(Self { tag, length }) |
39 | 114k | } <der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>> Line | Count | Source | 27 | 33.6k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 33.6k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 33.6k | let length = Length::decode(reader).map_err(|e| { | 31 | | if e.kind() == ErrorKind::Overlength { | 32 | | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | | e | 35 | | } | 36 | 36 | })?; | 37 | | | 38 | 33.5k | Ok(Self { tag, length }) | 39 | 33.6k | } |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>> Line | Count | Source | 27 | 23.6k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 23.6k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 23.5k | let length = Length::decode(reader).map_err(|e| { | 31 | | if e.kind() == ErrorKind::Overlength { | 32 | | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | | e | 35 | | } | 36 | 43 | })?; | 37 | | | 38 | 23.5k | Ok(Self { tag, length }) | 39 | 23.6k | } |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Line | Count | Source | 27 | 32.4k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 32.4k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 32.3k | let length = Length::decode(reader).map_err(|e| { | 31 | | if e.kind() == ErrorKind::Overlength { | 32 | | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | | e | 35 | | } | 36 | 73 | })?; | 37 | | | 38 | 32.3k | Ok(Self { tag, length }) | 39 | 32.4k | } |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Line | Count | Source | 27 | 15.4k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 15.4k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 15.3k | let length = Length::decode(reader).map_err(|e| { | 31 | | if e.kind() == ErrorKind::Overlength { | 32 | | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | | e | 35 | | } | 36 | 56 | })?; | 37 | | | 38 | 15.3k | Ok(Self { tag, length }) | 39 | 15.4k | } |
<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Line | Count | Source | 27 | 5.88k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 5.88k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 5.86k | let length = Length::decode(reader).map_err(|e| { | 31 | | if e.kind() == ErrorKind::Overlength { | 32 | | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | | e | 35 | | } | 36 | 79 | })?; | 37 | | | 38 | 5.78k | Ok(Self { tag, length }) | 39 | 5.88k | } |
<der::header::Header as der::decode::Decode>::decode::<der::reader::slice::SliceReader> Line | Count | Source | 27 | 3.32k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 3.32k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 3.31k | let length = Length::decode(reader).map_err(|e| { | 31 | | if e.kind() == ErrorKind::Overlength { | 32 | | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | | e | 35 | | } | 36 | 96 | })?; | 37 | | | 38 | 3.22k | Ok(Self { tag, length }) | 39 | 3.32k | } |
|
40 | | } |
41 | | |
42 | | impl Encode for Header { |
43 | 0 | fn encoded_len(&self) -> Result<Length> { |
44 | 0 | self.tag.encoded_len()? + self.length.encoded_len()? |
45 | 0 | } |
46 | | |
47 | 0 | fn encode(&self, writer: &mut impl Writer) -> Result<()> { |
48 | 0 | self.tag.encode(writer)?; |
49 | 0 | self.length.encode(writer) |
50 | 0 | } Unexecuted instantiation: <der::header::Header as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> Unexecuted instantiation: <der::header::Header as der::encode::Encode>::encode::<_> |
51 | | } |
52 | | |
53 | | impl DerOrd for Header { |
54 | 0 | fn der_cmp(&self, other: &Self) -> Result<Ordering> { |
55 | 0 | match self.tag.der_cmp(&other.tag)? { |
56 | 0 | Ordering::Equal => self.length.der_cmp(&other.length), |
57 | 0 | ordering => Ok(ordering), |
58 | | } |
59 | 0 | } |
60 | | } |