/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/decode.rs
Line | Count | Source |
1 | | //! Trait definition for [`Decode`]. |
2 | | |
3 | | use crate::{FixedTag, Header, Reader, Result, SliceReader}; |
4 | | use core::marker::PhantomData; |
5 | | |
6 | | #[cfg(feature = "pem")] |
7 | | use crate::{pem::PemLabel, PemReader}; |
8 | | |
9 | | #[cfg(doc)] |
10 | | use crate::{Length, Tag}; |
11 | | |
12 | | #[cfg(feature = "alloc")] |
13 | | use alloc::boxed::Box; |
14 | | |
15 | | /// Decoding trait. |
16 | | /// |
17 | | /// This trait provides the core abstraction upon which all decoding operations |
18 | | /// are based. |
19 | | pub trait Decode<'a>: Sized { |
20 | | /// Attempt to decode this message using the provided decoder. |
21 | | fn decode<R: Reader<'a>>(decoder: &mut R) -> Result<Self>; |
22 | | |
23 | | /// Parse `Self` from the provided DER-encoded byte slice. |
24 | 2.52k | fn from_der(bytes: &'a [u8]) -> Result<Self> { |
25 | 2.52k | let mut reader = SliceReader::new(bytes)?; |
26 | 2.52k | let result = Self::decode(&mut reader)?; |
27 | 796 | reader.finish(result) |
28 | 2.52k | } Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::Decode>::from_der <der::asn1::bit_string::allocating::BitString as der::decode::Decode>::from_der Line | Count | Source | 24 | 320 | fn from_der(bytes: &'a [u8]) -> Result<Self> { | 25 | 320 | let mut reader = SliceReader::new(bytes)?; | 26 | 320 | let result = Self::decode(&mut reader)?; | 27 | 116 | reader.finish(result) | 28 | 320 | } |
Unexecuted instantiation: <spki::spki::SubjectPublicKeyInfo<der::asn1::any::allocating::Any, der::asn1::bit_string::allocating::BitString> as der::decode::Decode>::from_der <spdm_x509::x509::extensions::BasicConstraints as der::decode::Decode>::from_der Line | Count | Source | 24 | 2.20k | fn from_der(bytes: &'a [u8]) -> Result<Self> { | 25 | 2.20k | let mut reader = SliceReader::new(bytes)?; | 26 | 2.20k | let result = Self::decode(&mut reader)?; | 27 | 680 | reader.finish(result) | 28 | 2.20k | } |
Unexecuted instantiation: <spdm_x509::x509::extensions::ExtendedKeyUsage as der::decode::Decode>::from_der Unexecuted instantiation: <<spdm_x509::certificate::Certificate>::is_ca::BasicConstraintsView as der::decode::Decode>::from_der Unexecuted instantiation: <der::document::Document as der::decode::Decode>::from_der Unexecuted instantiation: <der::asn1::any::AnyRef as der::decode::Decode>::from_der |
29 | | } |
30 | | |
31 | | impl<'a, T> Decode<'a> for T |
32 | | where |
33 | | T: DecodeValue<'a> + FixedTag, |
34 | | { |
35 | 1.10M | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { |
36 | 1.10M | let header = Header::decode(reader)?; |
37 | 1.10M | header.tag.assert_eq(T::TAG)?; |
38 | 1.09M | T::decode_value(reader, header) |
39 | 1.10M | } Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::slice::SliceReader> <const_oid::ObjectIdentifier 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 | 35 | 187k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 187k | let header = Header::decode(reader)?; | 37 | 187k | header.tag.assert_eq(T::TAG)?; | 38 | 187k | T::decode_value(reader, header) | 39 | 187k | } |
<const_oid::ObjectIdentifier 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 | 35 | 26.6k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 26.6k | let header = Header::decode(reader)?; | 37 | 26.6k | header.tag.assert_eq(T::TAG)?; | 38 | 26.6k | T::decode_value(reader, header) | 39 | 26.6k | } |
<const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Line | Count | Source | 35 | 40.2k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 40.2k | let header = Header::decode(reader)?; | 37 | 40.1k | header.tag.assert_eq(T::TAG)?; | 38 | 40.1k | T::decode_value(reader, header) | 39 | 40.2k | } |
<const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Line | Count | Source | 35 | 19.6k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 19.6k | let header = Header::decode(reader)?; | 37 | 19.6k | header.tag.assert_eq(T::TAG)?; | 38 | 19.6k | T::decode_value(reader, header) | 39 | 19.6k | } |
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> <der::asn1::bit_string::allocating::BitString as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Line | Count | Source | 35 | 25.3k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 25.3k | let header = Header::decode(reader)?; | 37 | 25.3k | header.tag.assert_eq(T::TAG)?; | 38 | 25.2k | T::decode_value(reader, header) | 39 | 25.3k | } |
<der::asn1::bit_string::allocating::BitString as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Line | Count | Source | 35 | 18.9k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 18.9k | let header = Header::decode(reader)?; | 37 | 18.8k | header.tag.assert_eq(T::TAG)?; | 38 | 18.7k | T::decode_value(reader, header) | 39 | 18.9k | } |
<der::asn1::bit_string::allocating::BitString as der::decode::Decode>::decode::<der::reader::slice::SliceReader> Line | Count | Source | 35 | 320 | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 320 | let header = Header::decode(reader)?; | 37 | 252 | header.tag.assert_eq(T::TAG)?; | 38 | 224 | T::decode_value(reader, header) | 39 | 320 | } |
<spdm_x509::certificate::name::RDNSequence as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Line | Count | Source | 35 | 66.0k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 66.0k | let header = Header::decode(reader)?; | 37 | 65.7k | header.tag.assert_eq(T::TAG)?; | 38 | 65.5k | T::decode_value(reader, header) | 39 | 66.0k | } |
<spdm_x509::certificate::name::AttributeTypeAndValue 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 | 35 | 146k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 146k | let header = Header::decode(reader)?; | 37 | 145k | header.tag.assert_eq(T::TAG)?; | 38 | 145k | T::decode_value(reader, header) | 39 | 146k | } |
<spdm_x509::certificate::name::RelativeDistinguishedName as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Line | Count | Source | 35 | 145k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 145k | let header = Header::decode(reader)?; | 37 | 144k | header.tag.assert_eq(T::TAG)?; | 38 | 143k | T::decode_value(reader, header) | 39 | 145k | } |
<der::asn1::integer::uint::UintRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Line | Count | Source | 35 | 30.7k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 30.7k | let header = Header::decode(reader)?; | 37 | 30.5k | header.tag.assert_eq(T::TAG)?; | 38 | 30.4k | T::decode_value(reader, header) | 39 | 30.7k | } |
<der::asn1::integer::uint::UintRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Line | Count | Source | 35 | 42.9k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 42.9k | let header = Header::decode(reader)?; | 37 | 42.0k | header.tag.assert_eq(T::TAG)?; | 38 | 41.5k | T::decode_value(reader, header) | 39 | 42.9k | } |
Unexecuted instantiation: <der::asn1::integer::uint::UintRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> <spki::spki::SubjectPublicKeyInfo<der::asn1::any::allocating::Any, der::asn1::bit_string::allocating::BitString> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Line | Count | Source | 35 | 26.9k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 26.9k | let header = Header::decode(reader)?; | 37 | 26.8k | header.tag.assert_eq(T::TAG)?; | 38 | 26.7k | T::decode_value(reader, header) | 39 | 26.9k | } |
Unexecuted instantiation: <spki::spki::SubjectPublicKeyInfo<der::asn1::any::allocating::Any, der::asn1::bit_string::allocating::BitString> as der::decode::Decode>::decode::<der::reader::slice::SliceReader> <spki::algorithm::AlgorithmIdentifier<der::asn1::any::allocating::Any> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Line | Count | Source | 35 | 26.7k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 26.7k | let header = Header::decode(reader)?; | 37 | 26.7k | header.tag.assert_eq(T::TAG)?; | 38 | 26.6k | T::decode_value(reader, header) | 39 | 26.7k | } |
<spki::algorithm::AlgorithmIdentifier<der::asn1::any::allocating::Any> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Line | Count | Source | 35 | 40.7k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 40.7k | let header = Header::decode(reader)?; | 37 | 40.3k | header.tag.assert_eq(T::TAG)?; | 38 | 40.2k | T::decode_value(reader, header) | 39 | 40.7k | } |
<spki::algorithm::AlgorithmIdentifier<der::asn1::any::allocating::Any> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Line | Count | Source | 35 | 20.1k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 20.1k | let header = Header::decode(reader)?; | 37 | 19.9k | header.tag.assert_eq(T::TAG)?; | 38 | 19.8k | T::decode_value(reader, header) | 39 | 20.1k | } |
<der::asn1::octet_string::allocating::OctetString 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 | 35 | 42.6k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 42.6k | let header = Header::decode(reader)?; | 37 | 42.5k | header.tag.assert_eq(T::TAG)?; | 38 | 42.4k | T::decode_value(reader, header) | 39 | 42.6k | } |
Unexecuted instantiation: <der::asn1::octet_string::allocating::OctetString 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>>>>> <spdm_x509::x509::extensions::BasicConstraints as der::decode::Decode>::decode::<der::reader::slice::SliceReader> Line | Count | Source | 35 | 2.20k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 2.20k | let header = Header::decode(reader)?; | 37 | 1.94k | header.tag.assert_eq(T::TAG)?; | 38 | 1.82k | T::decode_value(reader, header) | 39 | 2.20k | } |
<spdm_x509::time::Validity as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Line | Count | Source | 35 | 34.0k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 34.0k | let header = Header::decode(reader)?; | 37 | 33.5k | header.tag.assert_eq(T::TAG)?; | 38 | 33.3k | T::decode_value(reader, header) | 39 | 34.0k | } |
<spdm_x509::certificate::Extensions as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Line | Count | Source | 35 | 12.0k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 12.0k | let header = Header::decode(reader)?; | 37 | 12.0k | header.tag.assert_eq(T::TAG)?; | 38 | 12.0k | T::decode_value(reader, header) | 39 | 12.0k | } |
<spdm_x509::certificate::Certificate as der::decode::Decode>::decode::<der::reader::slice::SliceReader> Line | Count | Source | 35 | 47.5k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 47.5k | let header = Header::decode(reader)?; | 37 | 47.0k | header.tag.assert_eq(T::TAG)?; | 38 | 46.9k | T::decode_value(reader, header) | 39 | 47.5k | } |
<spdm_x509::certificate::TBSCertificate as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Line | Count | Source | 35 | 46.6k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 46.6k | let header = Header::decode(reader)?; | 37 | 45.6k | header.tag.assert_eq(T::TAG)?; | 38 | 45.1k | T::decode_value(reader, header) | 39 | 46.6k | } |
<spdm_x509::certificate::Extension 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 | 35 | 43.5k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 43.5k | let header = Header::decode(reader)?; | 37 | 43.3k | header.tag.assert_eq(T::TAG)?; | 38 | 43.2k | T::decode_value(reader, header) | 39 | 43.5k | } |
Unexecuted instantiation: <spdm_x509::certificate::Extension as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>> Unexecuted instantiation: <<spdm_x509::certificate::Certificate>::is_ca::BasicConstraintsView as der::decode::Decode>::decode::<der::reader::slice::SliceReader> <bool 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 | 35 | 14.1k | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 14.1k | let header = Header::decode(reader)?; | 37 | 14.1k | header.tag.assert_eq(T::TAG)?; | 38 | 14.1k | T::decode_value(reader, header) | 39 | 14.1k | } |
Unexecuted instantiation: <bool 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>>>>> <bool as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Line | Count | Source | 35 | 784 | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 784 | let header = Header::decode(reader)?; | 37 | 742 | header.tag.assert_eq(T::TAG)?; | 38 | 742 | T::decode_value(reader, header) | 39 | 784 | } |
<u32 as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Line | Count | Source | 35 | 632 | fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> { | 36 | 632 | let header = Header::decode(reader)?; | 37 | 564 | header.tag.assert_eq(T::TAG)?; | 38 | 564 | T::decode_value(reader, header) | 39 | 632 | } |
Unexecuted instantiation: <_ as der::decode::Decode>::decode::<_> |
40 | | } |
41 | | |
42 | | /// Dummy implementation for [`PhantomData`] which allows deriving |
43 | | /// implementations on structs with phantom fields. |
44 | | impl<'a, T> Decode<'a> for PhantomData<T> |
45 | | where |
46 | | T: ?Sized, |
47 | | { |
48 | 0 | fn decode<R: Reader<'a>>(_reader: &mut R) -> Result<PhantomData<T>> { |
49 | 0 | Ok(PhantomData) |
50 | 0 | } |
51 | | } |
52 | | |
53 | | /// Marker trait for data structures that can be decoded from DER without |
54 | | /// borrowing any data from the decoder. |
55 | | /// |
56 | | /// This is primarily useful for trait bounds on functions which require that |
57 | | /// no data is borrowed from the decoder, for example a PEM decoder which needs |
58 | | /// to first decode data from Base64. |
59 | | /// |
60 | | /// This trait is inspired by the [`DeserializeOwned` trait from `serde`](https://docs.rs/serde/latest/serde/de/trait.DeserializeOwned.html). |
61 | | pub trait DecodeOwned: for<'a> Decode<'a> {} |
62 | | |
63 | | impl<T> DecodeOwned for T where T: for<'a> Decode<'a> {} |
64 | | |
65 | | /// PEM decoding trait. |
66 | | /// |
67 | | /// This trait is automatically impl'd for any type which impls both |
68 | | /// [`DecodeOwned`] and [`PemLabel`]. |
69 | | #[cfg(feature = "pem")] |
70 | | pub trait DecodePem: DecodeOwned + PemLabel { |
71 | | /// Try to decode this type from PEM. |
72 | | fn from_pem(pem: impl AsRef<[u8]>) -> Result<Self>; |
73 | | } |
74 | | |
75 | | #[cfg(feature = "pem")] |
76 | | impl<T: DecodeOwned + PemLabel> DecodePem for T { |
77 | | fn from_pem(pem: impl AsRef<[u8]>) -> Result<Self> { |
78 | | let mut reader = PemReader::new(pem.as_ref())?; |
79 | | Self::validate_pem_label(reader.type_label())?; |
80 | | T::decode(&mut reader) |
81 | | } |
82 | | } |
83 | | |
84 | | /// Decode the value part of a Tag-Length-Value encoded field, sans the [`Tag`] |
85 | | /// and [`Length`]. |
86 | | pub trait DecodeValue<'a>: Sized { |
87 | | /// Attempt to decode this message using the provided [`Reader`]. |
88 | | fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self>; |
89 | | } |
90 | | |
91 | | #[cfg(feature = "alloc")] |
92 | | impl<'a, T> DecodeValue<'a> for Box<T> |
93 | | where |
94 | | T: DecodeValue<'a>, |
95 | | { |
96 | 0 | fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> { |
97 | 0 | Ok(Box::new(T::decode_value(reader, header)?)) |
98 | 0 | } |
99 | | } |