Coverage Report

Created: 2026-10-17 07:03

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.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
}