/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 | 5.40M | pub fn new(tag: Tag, length: impl TryInto<Length>) -> Result<Self> { |
21 | 5.40M | let length = length.try_into().map_err(|_| ErrorKind::Overflow)?; |
22 | 5.40M | Ok(Self { tag, length }) |
23 | 5.40M | } |
24 | | } |
25 | | |
26 | | impl<'a> Decode<'a> for Header { |
27 | 93.5k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { |
28 | 93.5k | let tag = Tag::decode(reader)?; |
29 | | |
30 | 89.9k | let length = Length::decode(reader).map_err(|e| { |
31 | 1.60k | if e.kind() == ErrorKind::Overlength { |
32 | 606 | ErrorKind::Length { tag }.into() |
33 | | } else { |
34 | 1.00k | e |
35 | | } |
36 | 1.60k | })?; Unexecuted instantiation: <der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::{closure#0}<der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::{closure#0}Line | Count | Source | 30 | 364 | let length = Length::decode(reader).map_err(|e| { | 31 | 364 | if e.kind() == ErrorKind::Overlength { | 32 | 214 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 150 | e | 35 | | } | 36 | 364 | })?; |
<der::header::Header as der::decode::Decode>::decode::<der::reader::slice::SliceReader>::{closure#0}Line | Count | Source | 30 | 1.24k | let length = Length::decode(reader).map_err(|e| { | 31 | 1.24k | if e.kind() == ErrorKind::Overlength { | 32 | 392 | ErrorKind::Length { tag }.into() | 33 | | } else { | 34 | 852 | e | 35 | | } | 36 | 1.24k | })?; |
|
37 | | |
38 | 88.3k | Ok(Self { tag, length }) |
39 | 93.5k | } Unexecuted instantiation: <der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> <der::header::Header as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Line | Count | Source | 27 | 5.15k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 5.15k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 4.79k | 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 | 364 | })?; | 37 | | | 38 | 4.43k | Ok(Self { tag, length }) | 39 | 5.15k | } |
<der::header::Header as der::decode::Decode>::decode::<der::reader::slice::SliceReader> Line | Count | Source | 27 | 88.3k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Header> { | 28 | 88.3k | let tag = Tag::decode(reader)?; | 29 | | | 30 | 85.1k | 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 | 1.24k | })?; | 37 | | | 38 | 83.8k | Ok(Self { tag, length }) | 39 | 88.3k | } |
|
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 | 5.40M | fn encode(&self, writer: &mut impl Writer) -> Result<()> { |
48 | 5.40M | self.tag.encode(writer)?; |
49 | 5.40M | self.length.encode(writer) |
50 | 5.40M | } <der::header::Header as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> Line | Count | Source | 47 | 5.40M | fn encode(&self, writer: &mut impl Writer) -> Result<()> { | 48 | 5.40M | self.tag.encode(writer)?; | 49 | 5.40M | self.length.encode(writer) | 50 | 5.40M | } |
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 | | } |