Coverage Report

Created: 2025-12-10 06:10

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
3.32k
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
3.32k
        let mut reader = SliceReader::new(bytes)?;
26
3.32k
        let result = Self::decode(&mut reader)?;
27
881
        reader.finish(result)
28
3.32k
    }
<crypto::x509::Certificate as der::decode::Decode>::from_der
Line
Count
Source
24
2.54k
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
2.54k
        let mut reader = SliceReader::new(bytes)?;
26
2.54k
        let result = Self::decode(&mut reader)?;
27
355
        reader.finish(result)
28
2.54k
    }
<alloc::vec::Vec<const_oid::ObjectIdentifier> as der::decode::Decode>::from_der
Line
Count
Source
24
778
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
778
        let mut reader = SliceReader::new(bytes)?;
26
778
        let result = Self::decode(&mut reader)?;
27
526
        reader.finish(result)
28
778
    }
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
101k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
101k
        let header = Header::decode(reader)?;
37
100k
        header.tag.assert_eq(T::TAG)?;
38
100k
        T::decode_value(reader, header)
39
101k
    }
<crypto::x509::Certificate as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Line
Count
Source
35
2.54k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.54k
        let header = Header::decode(reader)?;
37
2.49k
        header.tag.assert_eq(T::TAG)?;
38
2.49k
        T::decode_value(reader, header)
39
2.54k
    }
<crypto::x509::TBSCertificate as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
2.49k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.49k
        let header = Header::decode(reader)?;
37
2.46k
        header.tag.assert_eq(T::TAG)?;
38
2.46k
        T::decode_value(reader, header)
39
2.49k
    }
<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
7.68k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
7.68k
        let header = Header::decode(reader)?;
37
7.65k
        header.tag.assert_eq(T::TAG)?;
38
7.63k
        T::decode_value(reader, header)
39
7.68k
    }
<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
1.22k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.22k
        let header = Header::decode(reader)?;
37
1.22k
        header.tag.assert_eq(T::TAG)?;
38
1.21k
        T::decode_value(reader, header)
39
1.22k
    }
<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.29k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.29k
        let header = Header::decode(reader)?;
37
2.27k
        header.tag.assert_eq(T::TAG)?;
38
2.26k
        T::decode_value(reader, header)
39
2.29k
    }
<crypto::x509::AlgorithmIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
619
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
619
        let header = Header::decode(reader)?;
37
610
        header.tag.assert_eq(T::TAG)?;
38
606
        T::decode_value(reader, header)
39
619
    }
<crypto::x509::SubjectPublicKeyInfo as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
1.26k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.26k
        let header = Header::decode(reader)?;
37
1.25k
        header.tag.assert_eq(T::TAG)?;
38
1.23k
        T::decode_value(reader, header)
39
1.26k
    }
<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.81k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.81k
        let header = Header::decode(reader)?;
37
1.80k
        header.tag.assert_eq(T::TAG)?;
38
1.78k
        T::decode_value(reader, header)
39
1.81k
    }
<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
13.9k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
13.9k
        let header = Header::decode(reader)?;
37
13.9k
        header.tag.assert_eq(T::TAG)?;
38
13.9k
        T::decode_value(reader, header)
39
13.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>>>>
<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
21.5k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
21.5k
        let header = Header::decode(reader)?;
37
21.5k
        header.tag.assert_eq(T::TAG)?;
38
21.4k
        T::decode_value(reader, header)
39
21.5k
    }
<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
1.20k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.20k
        let header = Header::decode(reader)?;
37
1.18k
        header.tag.assert_eq(T::TAG)?;
38
1.18k
        T::decode_value(reader, header)
39
1.20k
    }
<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.26k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.26k
        let header = Header::decode(reader)?;
37
2.25k
        header.tag.assert_eq(T::TAG)?;
38
2.25k
        T::decode_value(reader, header)
39
2.26k
    }
<const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
582
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
582
        let header = Header::decode(reader)?;
37
573
        header.tag.assert_eq(T::TAG)?;
38
571
        T::decode_value(reader, header)
39
582
    }
<const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
2.28k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.28k
        let header = Header::decode(reader)?;
37
2.23k
        header.tag.assert_eq(T::TAG)?;
38
2.21k
        T::decode_value(reader, header)
39
2.28k
    }
<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
20.3k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
20.3k
        let header = Header::decode(reader)?;
37
20.2k
        header.tag.assert_eq(T::TAG)?;
38
20.1k
        T::decode_value(reader, header)
39
20.3k
    }
<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
1.18k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.18k
        let header = Header::decode(reader)?;
37
1.17k
        header.tag.assert_eq(T::TAG)?;
38
1.17k
        T::decode_value(reader, header)
39
1.18k
    }
<der::asn1::bit_string::BitStringRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
489
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
489
        let header = Header::decode(reader)?;
37
474
        header.tag.assert_eq(T::TAG)?;
38
461
        T::decode_value(reader, header)
39
489
    }
<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.38k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.38k
        let header = Header::decode(reader)?;
37
2.37k
        header.tag.assert_eq(T::TAG)?;
38
2.37k
        T::decode_value(reader, header)
39
2.38k
    }
<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.34k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.34k
        let header = Header::decode(reader)?;
37
2.33k
        header.tag.assert_eq(T::TAG)?;
38
2.32k
        T::decode_value(reader, header)
39
2.34k
    }
<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
3.20k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
3.20k
        let header = Header::decode(reader)?;
37
3.19k
        header.tag.assert_eq(T::TAG)?;
38
3.19k
        T::decode_value(reader, header)
39
3.20k
    }
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>>>>>
<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
3.52k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
3.52k
        let header = Header::decode(reader)?;
37
3.52k
        header.tag.assert_eq(T::TAG)?;
38
3.50k
        T::decode_value(reader, header)
39
3.52k
    }
<alloc::vec::Vec<const_oid::ObjectIdentifier> as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Line
Count
Source
35
778
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
778
        let header = Header::decode(reader)?;
37
727
        header.tag.assert_eq(T::TAG)?;
38
710
        T::decode_value(reader, header)
39
778
    }
<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
583
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
583
        let header = Header::decode(reader)?;
37
579
        header.tag.assert_eq(T::TAG)?;
38
576
        T::decode_value(reader, header)
39
583
    }
<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.81k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.81k
        let header = Header::decode(reader)?;
37
1.81k
        header.tag.assert_eq(T::TAG)?;
38
1.81k
        T::decode_value(reader, header)
39
1.81k
    }
<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
1.48k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.48k
        let header = Header::decode(reader)?;
37
1.47k
        header.tag.assert_eq(T::TAG)?;
38
1.47k
        T::decode_value(reader, header)
39
1.48k
    }
<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
1.32k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.32k
        let header = Header::decode(reader)?;
37
1.31k
        header.tag.assert_eq(T::TAG)?;
38
1.31k
        T::decode_value(reader, header)
39
1.32k
    }
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: <_ 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
}