Coverage Report

Created: 2026-05-01 06:46

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.45k
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
3.45k
        let mut reader = SliceReader::new(bytes)?;
26
3.45k
        let result = Self::decode(&mut reader)?;
27
926
        reader.finish(result)
28
3.45k
    }
<crypto::x509::Certificate as der::decode::Decode>::from_der
Line
Count
Source
24
2.65k
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
2.65k
        let mut reader = SliceReader::new(bytes)?;
26
2.65k
        let result = Self::decode(&mut reader)?;
27
414
        reader.finish(result)
28
2.65k
    }
<alloc::vec::Vec<const_oid::ObjectIdentifier> as der::decode::Decode>::from_der
Line
Count
Source
24
804
    fn from_der(bytes: &'a [u8]) -> Result<Self> {
25
804
        let mut reader = SliceReader::new(bytes)?;
26
804
        let result = Self::decode(&mut reader)?;
27
512
        reader.finish(result)
28
804
    }
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
116k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
116k
        let header = Header::decode(reader)?;
37
116k
        header.tag.assert_eq(T::TAG)?;
38
115k
        T::decode_value(reader, header)
39
116k
    }
<crypto::x509::Certificate as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Line
Count
Source
35
2.65k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.65k
        let header = Header::decode(reader)?;
37
2.59k
        header.tag.assert_eq(T::TAG)?;
38
2.59k
        T::decode_value(reader, header)
39
2.65k
    }
<crypto::x509::TBSCertificate as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
2.59k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.59k
        let header = Header::decode(reader)?;
37
2.56k
        header.tag.assert_eq(T::TAG)?;
38
2.55k
        T::decode_value(reader, header)
39
2.59k
    }
<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
8.30k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
8.30k
        let header = Header::decode(reader)?;
37
8.28k
        header.tag.assert_eq(T::TAG)?;
38
8.27k
        T::decode_value(reader, header)
39
8.30k
    }
<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.32k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.32k
        let header = Header::decode(reader)?;
37
1.32k
        header.tag.assert_eq(T::TAG)?;
38
1.31k
        T::decode_value(reader, header)
39
1.32k
    }
<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.41k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.41k
        let header = Header::decode(reader)?;
37
2.39k
        header.tag.assert_eq(T::TAG)?;
38
2.38k
        T::decode_value(reader, header)
39
2.41k
    }
<crypto::x509::AlgorithmIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
692
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
692
        let header = Header::decode(reader)?;
37
687
        header.tag.assert_eq(T::TAG)?;
38
681
        T::decode_value(reader, header)
39
692
    }
<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.36k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.36k
        let header = Header::decode(reader)?;
37
1.34k
        header.tag.assert_eq(T::TAG)?;
38
1.33k
        T::decode_value(reader, header)
39
1.36k
    }
<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.94k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.94k
        let header = Header::decode(reader)?;
37
1.92k
        header.tag.assert_eq(T::TAG)?;
38
1.89k
        T::decode_value(reader, header)
39
1.94k
    }
<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
18.2k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
18.2k
        let header = Header::decode(reader)?;
37
18.2k
        header.tag.assert_eq(T::TAG)?;
38
18.2k
        T::decode_value(reader, header)
39
18.2k
    }
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>>>>
<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.50k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.50k
        let header = Header::decode(reader)?;
37
1.50k
        header.tag.assert_eq(T::TAG)?;
38
1.50k
        T::decode_value(reader, header)
39
1.50k
    }
<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.46k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.46k
        let header = Header::decode(reader)?;
37
1.46k
        header.tag.assert_eq(T::TAG)?;
38
1.46k
        T::decode_value(reader, header)
39
1.46k
    }
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>>>>>
<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.36k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.36k
        let header = Header::decode(reader)?;
37
1.35k
        header.tag.assert_eq(T::TAG)?;
38
1.35k
        T::decode_value(reader, header)
39
1.36k
    }
<der::asn1::bit_string::BitStringRef as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
563
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
563
        let header = Header::decode(reader)?;
37
551
        header.tag.assert_eq(T::TAG)?;
38
544
        T::decode_value(reader, header)
39
563
    }
<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.47k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.47k
        let header = Header::decode(reader)?;
37
2.47k
        header.tag.assert_eq(T::TAG)?;
38
2.46k
        T::decode_value(reader, header)
39
2.47k
    }
<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.44k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.44k
        let header = Header::decode(reader)?;
37
2.43k
        header.tag.assert_eq(T::TAG)?;
38
2.43k
        T::decode_value(reader, header)
39
2.44k
    }
<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.74k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
3.74k
        let header = Header::decode(reader)?;
37
3.73k
        header.tag.assert_eq(T::TAG)?;
38
3.71k
        T::decode_value(reader, header)
39
3.74k
    }
<alloc::vec::Vec<const_oid::ObjectIdentifier> as der::decode::Decode>::decode::<der::reader::slice::SliceReader>
Line
Count
Source
35
804
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
804
        let header = Header::decode(reader)?;
37
741
        header.tag.assert_eq(T::TAG)?;
38
709
        T::decode_value(reader, header)
39
804
    }
<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
658
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
658
        let header = Header::decode(reader)?;
37
654
        header.tag.assert_eq(T::TAG)?;
38
651
        T::decode_value(reader, header)
39
658
    }
<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
23.0k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
23.0k
        let header = Header::decode(reader)?;
37
22.9k
        header.tag.assert_eq(T::TAG)?;
38
22.9k
        T::decode_value(reader, header)
39
23.0k
    }
<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
2.01k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.01k
        let header = Header::decode(reader)?;
37
2.00k
        header.tag.assert_eq(T::TAG)?;
38
2.00k
        T::decode_value(reader, header)
39
2.01k
    }
<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.88k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
3.88k
        let header = Header::decode(reader)?;
37
3.87k
        header.tag.assert_eq(T::TAG)?;
38
3.87k
        T::decode_value(reader, header)
39
3.88k
    }
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>>>>>
<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
26.4k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
26.4k
        let header = Header::decode(reader)?;
37
26.4k
        header.tag.assert_eq(T::TAG)?;
38
26.4k
        T::decode_value(reader, header)
39
26.4k
    }
<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.29k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
1.29k
        let header = Header::decode(reader)?;
37
1.27k
        header.tag.assert_eq(T::TAG)?;
38
1.27k
        T::decode_value(reader, header)
39
1.29k
    }
<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.37k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.37k
        let header = Header::decode(reader)?;
37
2.37k
        header.tag.assert_eq(T::TAG)?;
38
2.37k
        T::decode_value(reader, header)
39
2.37k
    }
<const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
35
656
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
656
        let header = Header::decode(reader)?;
37
648
        header.tag.assert_eq(T::TAG)?;
38
644
        T::decode_value(reader, header)
39
656
    }
<const_oid::ObjectIdentifier as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
35
2.33k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<T> {
36
2.33k
        let header = Header::decode(reader)?;
37
2.28k
        header.tag.assert_eq(T::TAG)?;
38
2.26k
        T::decode_value(reader, header)
39
2.33k
    }
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
}