Coverage Report

Created: 2026-04-29 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/encode.rs
Line
Count
Source
1
//! Trait definition for [`Encode`].
2
3
use crate::{Header, Length, Result, SliceWriter, Tagged, Writer};
4
use core::marker::PhantomData;
5
6
#[cfg(feature = "alloc")]
7
use {alloc::boxed::Box, alloc::vec::Vec};
8
9
#[cfg(feature = "pem")]
10
use {
11
    crate::PemWriter,
12
    alloc::string::String,
13
    pem_rfc7468::{self as pem, LineEnding, PemLabel},
14
};
15
16
#[cfg(any(feature = "alloc", feature = "pem"))]
17
use crate::ErrorKind;
18
19
#[cfg(doc)]
20
use crate::Tag;
21
22
/// Encoding trait.
23
pub trait Encode {
24
    /// Compute the length of this value in bytes when encoded as ASN.1 DER.
25
    fn encoded_len(&self) -> Result<Length>;
26
27
    /// Encode this value as ASN.1 DER using the provided [`Writer`].
28
    fn encode(&self, encoder: &mut impl Writer) -> Result<()>;
29
30
    /// Encode this value to the provided byte slice, returning a sub-slice
31
    /// containing the encoded message.
32
56.5k
    fn encode_to_slice<'a>(&self, buf: &'a mut [u8]) -> Result<&'a [u8]> {
33
56.5k
        let mut writer = SliceWriter::new(buf);
34
56.5k
        self.encode(&mut writer)?;
35
56.5k
        writer.finish()
36
56.5k
    }
<anise::structure::planetocentric::PlanetaryData as der::encode::Encode>::encode_to_slice
Line
Count
Source
32
23.4k
    fn encode_to_slice<'a>(&self, buf: &'a mut [u8]) -> Result<&'a [u8]> {
33
23.4k
        let mut writer = SliceWriter::new(buf);
34
23.4k
        self.encode(&mut writer)?;
35
23.4k
        writer.finish()
36
23.4k
    }
Unexecuted instantiation: <anise::structure::spacecraft::SpacecraftData as der::encode::Encode>::encode_to_slice
Unexecuted instantiation: <anise::structure::location::Location as der::encode::Encode>::encode_to_slice
<anise::math::rotation::quaternion::EulerParameter as der::encode::Encode>::encode_to_slice
Line
Count
Source
32
33.0k
    fn encode_to_slice<'a>(&self, buf: &'a mut [u8]) -> Result<&'a [u8]> {
33
33.0k
        let mut writer = SliceWriter::new(buf);
34
33.0k
        self.encode(&mut writer)?;
35
33.0k
        writer.finish()
36
33.0k
    }
Unexecuted instantiation: <_ as der::encode::Encode>::encode_to_slice
37
38
    /// Encode this message as ASN.1 DER, appending it to the provided
39
    /// byte vector.
40
    #[cfg(feature = "alloc")]
41
56.5k
    fn encode_to_vec(&self, buf: &mut Vec<u8>) -> Result<Length> {
42
56.5k
        let expected_len = usize::try_from(self.encoded_len()?)?;
43
56.5k
        let initial_len = buf.len();
44
56.5k
        buf.resize(initial_len + expected_len, 0u8);
45
46
56.5k
        let buf_slice = &mut buf[initial_len..];
47
56.5k
        let actual_len = self.encode_to_slice(buf_slice)?.len();
48
49
56.5k
        if expected_len != actual_len {
50
            return Err(ErrorKind::Incomplete {
51
0
                expected_len: expected_len.try_into()?,
52
0
                actual_len: actual_len.try_into()?,
53
            }
54
0
            .into());
55
56.5k
        }
56
57
56.5k
        actual_len.try_into()
58
56.5k
    }
<anise::structure::planetocentric::PlanetaryData as der::encode::Encode>::encode_to_vec
Line
Count
Source
41
23.4k
    fn encode_to_vec(&self, buf: &mut Vec<u8>) -> Result<Length> {
42
23.4k
        let expected_len = usize::try_from(self.encoded_len()?)?;
43
23.4k
        let initial_len = buf.len();
44
23.4k
        buf.resize(initial_len + expected_len, 0u8);
45
46
23.4k
        let buf_slice = &mut buf[initial_len..];
47
23.4k
        let actual_len = self.encode_to_slice(buf_slice)?.len();
48
49
23.4k
        if expected_len != actual_len {
50
            return Err(ErrorKind::Incomplete {
51
0
                expected_len: expected_len.try_into()?,
52
0
                actual_len: actual_len.try_into()?,
53
            }
54
0
            .into());
55
23.4k
        }
56
57
23.4k
        actual_len.try_into()
58
23.4k
    }
Unexecuted instantiation: <anise::structure::spacecraft::SpacecraftData as der::encode::Encode>::encode_to_vec
Unexecuted instantiation: <anise::structure::location::Location as der::encode::Encode>::encode_to_vec
<anise::math::rotation::quaternion::EulerParameter as der::encode::Encode>::encode_to_vec
Line
Count
Source
41
33.0k
    fn encode_to_vec(&self, buf: &mut Vec<u8>) -> Result<Length> {
42
33.0k
        let expected_len = usize::try_from(self.encoded_len()?)?;
43
33.0k
        let initial_len = buf.len();
44
33.0k
        buf.resize(initial_len + expected_len, 0u8);
45
46
33.0k
        let buf_slice = &mut buf[initial_len..];
47
33.0k
        let actual_len = self.encode_to_slice(buf_slice)?.len();
48
49
33.0k
        if expected_len != actual_len {
50
            return Err(ErrorKind::Incomplete {
51
0
                expected_len: expected_len.try_into()?,
52
0
                actual_len: actual_len.try_into()?,
53
            }
54
0
            .into());
55
33.0k
        }
56
57
33.0k
        actual_len.try_into()
58
33.0k
    }
Unexecuted instantiation: <_ as der::encode::Encode>::encode_to_vec
59
60
    /// Encode this type as DER, returning a byte vector.
61
    #[cfg(feature = "alloc")]
62
0
    fn to_der(&self) -> Result<Vec<u8>> {
63
0
        let mut buf = Vec::new();
64
0
        self.encode_to_vec(&mut buf)?;
65
0
        Ok(buf)
66
0
    }
67
}
68
69
impl<T> Encode for T
70
where
71
    T: EncodeValue + Tagged,
72
{
73
    /// Compute the length of this value in bytes when encoded as ASN.1 DER.
74
8.62M
    fn encoded_len(&self) -> Result<Length> {
75
8.62M
        self.value_len().and_then(|len| len.for_tlv())
<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32] as der::encode::Encode>::encoded_len::{closure#0}
Line
Count
Source
75
23.4k
        self.value_len().and_then(|len| len.for_tlv())
<[f64; 0] as der::encode::Encode>::encoded_len::{closure#0}
Line
Count
Source
75
1.50M
        self.value_len().and_then(|len| len.for_tlv())
<[f64; 32] as der::encode::Encode>::encoded_len::{closure#0}
Line
Count
Source
75
10.9k
        self.value_len().and_then(|len| len.for_tlv())
Unexecuted instantiation: <alloc::vec::Vec<der::asn1::octet_string::OctetStringRef> as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <alloc::vec::Vec<anise::structure::location::TerrainMask> as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <alloc::vec::Vec<i32> as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <alloc::vec::Vec<u32> as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <alloc::string::String as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <der::asn1::utf8_string::Utf8StringRef as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <der::asn1::octet_string::OctetStringRef as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <bool as der::encode::Encode>::encoded_len::{closure#0}
<f64 as der::encode::Encode>::encoded_len::{closure#0}
Line
Count
Source
75
5.40M
        self.value_len().and_then(|len| len.for_tlv())
<i32 as der::encode::Encode>::encoded_len::{closure#0}
Line
Count
Source
75
113k
        self.value_len().and_then(|len| len.for_tlv())
Unexecuted instantiation: <u32 as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <i16 as der::encode::Encode>::encoded_len::{closure#0}
Unexecuted instantiation: <u64 as der::encode::Encode>::encoded_len::{closure#0}
<u8 as der::encode::Encode>::encoded_len::{closure#0}
Line
Count
Source
75
1.56M
        self.value_len().and_then(|len| len.for_tlv())
76
8.62M
    }
Unexecuted instantiation: <der::asn1::utf8_string::Utf8StringRef as der::encode::Encode>::encoded_len
<[f64; 0] as der::encode::Encode>::encoded_len
Line
Count
Source
74
1.50M
    fn encoded_len(&self) -> Result<Length> {
75
1.50M
        self.value_len().and_then(|len| len.for_tlv())
76
1.50M
    }
<[f64; 32] as der::encode::Encode>::encoded_len
Line
Count
Source
74
10.9k
    fn encoded_len(&self) -> Result<Length> {
75
10.9k
        self.value_len().and_then(|len| len.for_tlv())
76
10.9k
    }
Unexecuted instantiation: <bool as der::encode::Encode>::encoded_len
<f64 as der::encode::Encode>::encoded_len
Line
Count
Source
74
5.40M
    fn encoded_len(&self) -> Result<Length> {
75
5.40M
        self.value_len().and_then(|len| len.for_tlv())
76
5.40M
    }
<i32 as der::encode::Encode>::encoded_len
Line
Count
Source
74
113k
    fn encoded_len(&self) -> Result<Length> {
75
113k
        self.value_len().and_then(|len| len.for_tlv())
76
113k
    }
Unexecuted instantiation: <u32 as der::encode::Encode>::encoded_len
Unexecuted instantiation: <i16 as der::encode::Encode>::encoded_len
Unexecuted instantiation: <u64 as der::encode::Encode>::encoded_len
Unexecuted instantiation: <der::asn1::octet_string::OctetStringRef as der::encode::Encode>::encoded_len
Unexecuted instantiation: <alloc::vec::Vec<der::asn1::octet_string::OctetStringRef> as der::encode::Encode>::encoded_len
Unexecuted instantiation: <alloc::vec::Vec<anise::structure::location::TerrainMask> as der::encode::Encode>::encoded_len
Unexecuted instantiation: <alloc::vec::Vec<i32> as der::encode::Encode>::encoded_len
Unexecuted instantiation: <alloc::vec::Vec<u32> as der::encode::Encode>::encoded_len
<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32] as der::encode::Encode>::encoded_len
Line
Count
Source
74
23.4k
    fn encoded_len(&self) -> Result<Length> {
75
23.4k
        self.value_len().and_then(|len| len.for_tlv())
76
23.4k
    }
Unexecuted instantiation: <alloc::string::String as der::encode::Encode>::encoded_len
<u8 as der::encode::Encode>::encoded_len
Line
Count
Source
74
1.56M
    fn encoded_len(&self) -> Result<Length> {
75
1.56M
        self.value_len().and_then(|len| len.for_tlv())
76
1.56M
    }
77
78
    /// Encode this value as ASN.1 DER using the provided [`Writer`].
79
4.50M
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
80
4.50M
        self.header()?.encode(writer)?;
81
4.50M
        self.encode_value(writer)
82
4.50M
    }
<[f64; 0] as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
79
751k
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
80
751k
        self.header()?.encode(writer)?;
81
751k
        self.encode_value(writer)
82
751k
    }
<[f64; 32] as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
79
10.9k
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
80
10.9k
        self.header()?.encode(writer)?;
81
10.9k
        self.encode_value(writer)
82
10.9k
    }
Unexecuted instantiation: <bool as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
<f64 as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
79
2.79M
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
80
2.79M
        self.header()?.encode(writer)?;
81
2.79M
        self.encode_value(writer)
82
2.79M
    }
<u8 as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
79
809k
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
80
809k
        self.header()?.encode(writer)?;
81
809k
        self.encode_value(writer)
82
809k
    }
<i32 as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
79
113k
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
80
113k
        self.header()?.encode(writer)?;
81
113k
        self.encode_value(writer)
82
113k
    }
Unexecuted instantiation: <alloc::vec::Vec<anise::structure::location::TerrainMask> as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32] as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
79
23.4k
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
80
23.4k
        self.header()?.encode(writer)?;
81
23.4k
        self.encode_value(writer)
82
23.4k
    }
Unexecuted instantiation: <alloc::string::String as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Unexecuted instantiation: <_ as der::encode::Encode>::encode::<_>
83
}
84
85
/// Dummy implementation for [`PhantomData`] which allows deriving
86
/// implementations on structs with phantom fields.
87
impl<T> Encode for PhantomData<T>
88
where
89
    T: ?Sized,
90
{
91
0
    fn encoded_len(&self) -> Result<Length> {
92
0
        Ok(Length::ZERO)
93
0
    }
94
95
0
    fn encode(&self, _writer: &mut impl Writer) -> Result<()> {
96
0
        Ok(())
97
0
    }
98
}
99
100
/// PEM encoding trait.
101
///
102
/// This trait is automatically impl'd for any type which impls both
103
/// [`Encode`] and [`PemLabel`].
104
#[cfg(feature = "pem")]
105
pub trait EncodePem: Encode + PemLabel {
106
    /// Try to encode this type as PEM.
107
    fn to_pem(&self, line_ending: LineEnding) -> Result<String>;
108
}
109
110
#[cfg(feature = "pem")]
111
impl<T: Encode + PemLabel> EncodePem for T {
112
    fn to_pem(&self, line_ending: LineEnding) -> Result<String> {
113
        let der_len = usize::try_from(self.encoded_len()?)?;
114
        let pem_len = pem::encapsulated_len(Self::PEM_LABEL, line_ending, der_len)?;
115
116
        let mut buf = vec![0u8; pem_len];
117
        let mut writer = PemWriter::new(Self::PEM_LABEL, line_ending, &mut buf)?;
118
        self.encode(&mut writer)?;
119
120
        let actual_len = writer.finish()?;
121
        buf.truncate(actual_len);
122
        Ok(String::from_utf8(buf)?)
123
    }
124
}
125
126
/// Encode the value part of a Tag-Length-Value encoded field, sans the [`Tag`]
127
/// and [`Length`].
128
pub trait EncodeValue {
129
    /// Get the [`Header`] used to encode this value.
130
4.50M
    fn header(&self) -> Result<Header>
131
4.50M
    where
132
4.50M
        Self: Tagged,
133
    {
134
4.50M
        Header::new(self.tag(), self.value_len()?)
135
4.50M
    }
<[f64; 0] as der::encode::EncodeValue>::header
Line
Count
Source
130
751k
    fn header(&self) -> Result<Header>
131
751k
    where
132
751k
        Self: Tagged,
133
    {
134
751k
        Header::new(self.tag(), self.value_len()?)
135
751k
    }
<[f64; 32] as der::encode::EncodeValue>::header
Line
Count
Source
130
10.9k
    fn header(&self) -> Result<Header>
131
10.9k
    where
132
10.9k
        Self: Tagged,
133
    {
134
10.9k
        Header::new(self.tag(), self.value_len()?)
135
10.9k
    }
Unexecuted instantiation: <bool as der::encode::EncodeValue>::header
<f64 as der::encode::EncodeValue>::header
Line
Count
Source
130
2.79M
    fn header(&self) -> Result<Header>
131
2.79M
    where
132
2.79M
        Self: Tagged,
133
    {
134
2.79M
        Header::new(self.tag(), self.value_len()?)
135
2.79M
    }
<i32 as der::encode::EncodeValue>::header
Line
Count
Source
130
113k
    fn header(&self) -> Result<Header>
131
113k
    where
132
113k
        Self: Tagged,
133
    {
134
113k
        Header::new(self.tag(), self.value_len()?)
135
113k
    }
Unexecuted instantiation: <alloc::vec::Vec<anise::structure::location::TerrainMask> as der::encode::EncodeValue>::header
<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32] as der::encode::EncodeValue>::header
Line
Count
Source
130
23.4k
    fn header(&self) -> Result<Header>
131
23.4k
    where
132
23.4k
        Self: Tagged,
133
    {
134
23.4k
        Header::new(self.tag(), self.value_len()?)
135
23.4k
    }
Unexecuted instantiation: <alloc::string::String as der::encode::EncodeValue>::header
Unexecuted instantiation: <alloc::vec::Vec<u8> as der::encode::EncodeValue>::header
<u8 as der::encode::EncodeValue>::header
Line
Count
Source
130
809k
    fn header(&self) -> Result<Header>
131
809k
    where
132
809k
        Self: Tagged,
133
    {
134
809k
        Header::new(self.tag(), self.value_len()?)
135
809k
    }
136
137
    /// Compute the length of this value (sans [`Tag`]+[`Length`] header) when
138
    /// encoded as ASN.1 DER.
139
    fn value_len(&self) -> Result<Length>;
140
141
    /// Encode value (sans [`Tag`]+[`Length`] header) as ASN.1 DER using the
142
    /// provided [`Writer`].
143
    fn encode_value(&self, encoder: &mut impl Writer) -> Result<()>;
144
}
145
146
#[cfg(feature = "alloc")]
147
impl<T> EncodeValue for Box<T>
148
where
149
    T: EncodeValue,
150
{
151
0
    fn value_len(&self) -> Result<Length> {
152
0
        T::value_len(self)
153
0
    }
154
0
    fn encode_value(&self, writer: &mut impl Writer) -> Result<()> {
155
0
        T::encode_value(self, writer)
156
0
    }
157
}