Coverage Report

Created: 2026-07-25 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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.96k
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
2.96k
        let mut reader = SliceReader::new(bytes)?;
26
2.96k
        let result = Self::decode(&mut reader)?;
27
41
        reader.finish(result)
28
2.96k
    }
Unexecuted instantiation: <crypto::crl::Crl as der::decode::Decode>::from_der
Unexecuted instantiation: <u32 as der::decode::Decode>::from_der
Unexecuted instantiation: <crypto::x509::Certificate as der::decode::Decode>::from_der
Unexecuted instantiation: <crypto::BasicConstraints 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
<crypto::x509::Certificate as der::decode::Decode>::from_der
Line
Count
Source
24
2.96k
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
2.96k
        let mut reader = SliceReader::new(bytes)?;
26
2.96k
        let result = Self::decode(&mut reader)?;
27
41
        reader.finish(result)
28
2.96k
    }
Unexecuted instantiation: <crypto::crl::Crl as der::decode::Decode>::from_der
Unexecuted instantiation: <u32 as der::decode::Decode>::from_der
Unexecuted instantiation: <crypto::BasicConstraints 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
320k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
320k
        let header = Header::decode(reader)?;
37
320k
        header.tag.assert_eq(T::TAG)?;
38
319k
        T::decode_value(reader, header)
39
320k
    }
Unexecuted instantiation: <der::asn1::generalized_time::GeneralizedTime as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <der::asn1::generalized_time::GeneralizedTime as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <alloc::vec::Vec<der::asn1::set_of::SetOfVec<crypto::x509::DistinguishedName>> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <alloc::vec::Vec<crypto::crl::RevokedCertificate> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <alloc::vec::Vec<crypto::x509::Extension> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <der::asn1::octet_string::OctetStringRef 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>>>>>>
Unexecuted instantiation: <der::asn1::octet_string::OctetStringRef 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>>>>>
Unexecuted instantiation: <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>>>>
Unexecuted instantiation: <der::asn1::integer::uint::UintRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <crypto::crl::TbsCertList as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <crypto::crl::RevokedCertificate as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <crypto::crl::Crl as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
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::nested::NestedReader<der::reader::slice::SliceReader>>>>>>
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>>>>>
Unexecuted instantiation: <bool as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <u32 as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <u32 as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Unexecuted instantiation: <der::asn1::bit_string::BitStringRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <der::asn1::bit_string::BitStringRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <der::asn1::set_of::SetOfVec<crypto::x509::DistinguishedName> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <der::asn1::utc_time::UtcTime as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <der::asn1::utc_time::UtcTime as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <crypto::x509::Certificate as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Unexecuted instantiation: <crypto::x509::TBSCertificate as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <crypto::x509::DistinguishedName 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>>>>>
Unexecuted instantiation: <crypto::x509::AlgorithmIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <crypto::x509::AlgorithmIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <crypto::x509::AlgorithmIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <crypto::x509::SubjectPublicKeyInfo as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <crypto::x509::Validity as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <crypto::x509::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>>>>>
Unexecuted instantiation: <crypto::x509::Extension as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <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>>>>>>
Unexecuted instantiation: <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>>>>>
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <crypto::BasicConstraints as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Unexecuted instantiation: <_ as der::decode::Decode>::decode::<_>
<crypto::x509::Certificate as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Line
Count
Source
35
2.96k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.96k
        let header = Header::decode(reader)?;
37
2.88k
        header.tag.assert_eq(T::TAG)?;
38
2.85k
        T::decode_value(reader, header)
39
2.96k
    }
<crypto::x509::TBSCertificate as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
2.75k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.75k
        let header = Header::decode(reader)?;
37
2.69k
        header.tag.assert_eq(T::TAG)?;
38
2.65k
        T::decode_value(reader, header)
39
2.75k
    }
<crypto::x509::DistinguishedName 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
15.3k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
15.3k
        let header = Header::decode(reader)?;
37
15.2k
        header.tag.assert_eq(T::TAG)?;
38
15.2k
        T::decode_value(reader, header)
39
15.3k
    }
<crypto::x509::AlgorithmIdentifier 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
782
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
782
        let header = Header::decode(reader)?;
37
776
        header.tag.assert_eq(T::TAG)?;
38
774
        T::decode_value(reader, header)
39
782
    }
<crypto::x509::AlgorithmIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
2.24k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.24k
        let header = Header::decode(reader)?;
37
2.20k
        header.tag.assert_eq(T::TAG)?;
38
2.19k
        T::decode_value(reader, header)
39
2.24k
    }
<crypto::x509::AlgorithmIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
288
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
288
        let header = Header::decode(reader)?;
37
266
        header.tag.assert_eq(T::TAG)?;
38
263
        T::decode_value(reader, header)
39
288
    }
<crypto::x509::SubjectPublicKeyInfo as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
820
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
820
        let header = Header::decode(reader)?;
37
808
        header.tag.assert_eq(T::TAG)?;
38
786
        T::decode_value(reader, header)
39
820
    }
<crypto::x509::Validity as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
1.52k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.52k
        let header = Header::decode(reader)?;
37
1.42k
        header.tag.assert_eq(T::TAG)?;
38
1.40k
        T::decode_value(reader, header)
39
1.52k
    }
<crypto::x509::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
64.9k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
64.9k
        let header = Header::decode(reader)?;
37
64.9k
        header.tag.assert_eq(T::TAG)?;
38
64.9k
        T::decode_value(reader, header)
39
64.9k
    }
Unexecuted instantiation: <crypto::x509::Extension as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
<alloc::vec::Vec<der::asn1::set_of::SetOfVec<crypto::x509::DistinguishedName>> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
2.91k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.91k
        let header = Header::decode(reader)?;
37
2.82k
        header.tag.assert_eq(T::TAG)?;
38
2.80k
        T::decode_value(reader, header)
39
2.91k
    }
Unexecuted instantiation: <alloc::vec::Vec<crypto::crl::RevokedCertificate> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
<alloc::vec::Vec<crypto::x509::Extension> 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
199
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
199
        let header = Header::decode(reader)?;
37
194
        header.tag.assert_eq(T::TAG)?;
38
187
        T::decode_value(reader, header)
39
199
    }
<der::asn1::set_of::SetOfVec<crypto::x509::DistinguishedName> 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
81.2k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
81.2k
        let header = Header::decode(reader)?;
37
81.2k
        header.tag.assert_eq(T::TAG)?;
38
81.1k
        T::decode_value(reader, header)
39
81.2k
    }
Unexecuted instantiation: <crypto::crl::TbsCertList as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <crypto::crl::RevokedCertificate as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Unexecuted instantiation: <crypto::crl::Crl as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
<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
2.46k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.46k
        let header = Header::decode(reader)?;
37
2.43k
        header.tag.assert_eq(T::TAG)?;
38
2.42k
        T::decode_value(reader, header)
39
2.46k
    }
<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
2.31k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.31k
        let header = Header::decode(reader)?;
37
2.29k
        header.tag.assert_eq(T::TAG)?;
38
2.29k
        T::decode_value(reader, header)
39
2.31k
    }
<der::asn1::bit_string::BitStringRef 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
748
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
748
        let header = Header::decode(reader)?;
37
736
        header.tag.assert_eq(T::TAG)?;
38
731
        T::decode_value(reader, header)
39
748
    }
<der::asn1::bit_string::BitStringRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
168
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
168
        let header = Header::decode(reader)?;
37
159
        header.tag.assert_eq(T::TAG)?;
38
152
        T::decode_value(reader, header)
39
168
    }
<der::asn1::generalized_time::GeneralizedTime 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
312
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
312
        let header = Header::decode(reader)?;
37
308
        header.tag.assert_eq(T::TAG)?;
38
308
        T::decode_value(reader, header)
39
312
    }
Unexecuted instantiation: <der::asn1::generalized_time::GeneralizedTime as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
<der::asn1::utc_time::UtcTime 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
1.98k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.98k
        let header = Header::decode(reader)?;
37
1.98k
        header.tag.assert_eq(T::TAG)?;
38
1.98k
        T::decode_value(reader, header)
39
1.98k
    }
Unexecuted instantiation: <der::asn1::utc_time::UtcTime as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<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
44.9k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
44.9k
        let header = Header::decode(reader)?;
37
44.9k
        header.tag.assert_eq(T::TAG)?;
38
44.9k
        T::decode_value(reader, header)
39
44.9k
    }
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>>>>>
Unexecuted instantiation: <bool as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <u32 as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Unexecuted instantiation: <u32 as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Unexecuted instantiation: <crypto::BasicConstraints 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
80.0k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
80.0k
        let header = Header::decode(reader)?;
37
80.0k
        header.tag.assert_eq(T::TAG)?;
38
79.9k
        T::decode_value(reader, header)
39
80.0k
    }
<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
749
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
749
        let header = Header::decode(reader)?;
37
745
        header.tag.assert_eq(T::TAG)?;
38
743
        T::decode_value(reader, header)
39
749
    }
<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
2.16k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.16k
        let header = Header::decode(reader)?;
37
2.15k
        header.tag.assert_eq(T::TAG)?;
38
2.15k
        T::decode_value(reader, header)
39
2.16k
    }
<const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
240
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
240
        let header = Header::decode(reader)?;
37
232
        header.tag.assert_eq(T::TAG)?;
38
227
        T::decode_value(reader, header)
39
240
    }
<der::asn1::octet_string::OctetStringRef 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
8.59k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
8.59k
        let header = Header::decode(reader)?;
37
8.59k
        header.tag.assert_eq(T::TAG)?;
38
8.59k
        T::decode_value(reader, header)
39
8.59k
    }
Unexecuted instantiation: <der::asn1::octet_string::OctetStringRef 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>>>>>
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
    }
Unexecuted instantiation: <core::marker::PhantomData<_> as der::decode::Decode>::decode::<_>
Unexecuted instantiation: <core::marker::PhantomData<_> as der::decode::Decode>::decode::<_>
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
    }
Unexecuted instantiation: <alloc::boxed::Box<_> as der::decode::DecodeValue>::decode_value::<_>
Unexecuted instantiation: <alloc::boxed::Box<_> as der::decode::DecodeValue>::decode_value::<_>
99
}