/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 | 24.0k | fn encode_to_slice<'a>(&self, buf: &'a mut [u8]) -> Result<&'a [u8]> { |
33 | 24.0k | let mut writer = SliceWriter::new(buf); |
34 | 24.0k | self.encode(&mut writer)?; |
35 | 24.0k | writer.finish() |
36 | 24.0k | } 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::structure::planetocentric::PlanetaryData as der::encode::Encode>::encode_to_slice Line | Count | Source | 32 | 8.72k | fn encode_to_slice<'a>(&self, buf: &'a mut [u8]) -> Result<&'a [u8]> { | 33 | 8.72k | let mut writer = SliceWriter::new(buf); | 34 | 8.72k | self.encode(&mut writer)?; | 35 | 8.72k | writer.finish() | 36 | 8.72k | } |
<anise::math::rotation::quaternion::EulerParameter as der::encode::Encode>::encode_to_slice Line | Count | Source | 32 | 15.3k | fn encode_to_slice<'a>(&self, buf: &'a mut [u8]) -> Result<&'a [u8]> { | 33 | 15.3k | let mut writer = SliceWriter::new(buf); | 34 | 15.3k | self.encode(&mut writer)?; | 35 | 15.3k | writer.finish() | 36 | 15.3k | } |
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 | 24.0k | fn encode_to_vec(&self, buf: &mut Vec<u8>) -> Result<Length> { |
42 | 24.0k | let expected_len = usize::try_from(self.encoded_len()?)?; |
43 | 24.0k | let initial_len = buf.len(); |
44 | 24.0k | buf.resize(initial_len + expected_len, 0u8); |
45 | | |
46 | 24.0k | let buf_slice = &mut buf[initial_len..]; |
47 | 24.0k | let actual_len = self.encode_to_slice(buf_slice)?.len(); |
48 | | |
49 | 24.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 | 24.0k | } |
56 | | |
57 | 24.0k | actual_len.try_into() |
58 | 24.0k | } 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::structure::planetocentric::PlanetaryData as der::encode::Encode>::encode_to_vec Line | Count | Source | 41 | 8.72k | fn encode_to_vec(&self, buf: &mut Vec<u8>) -> Result<Length> { | 42 | 8.72k | let expected_len = usize::try_from(self.encoded_len()?)?; | 43 | 8.72k | let initial_len = buf.len(); | 44 | 8.72k | buf.resize(initial_len + expected_len, 0u8); | 45 | | | 46 | 8.72k | let buf_slice = &mut buf[initial_len..]; | 47 | 8.72k | let actual_len = self.encode_to_slice(buf_slice)?.len(); | 48 | | | 49 | 8.72k | 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 | 8.72k | } | 56 | | | 57 | 8.72k | actual_len.try_into() | 58 | 8.72k | } |
<anise::math::rotation::quaternion::EulerParameter as der::encode::Encode>::encode_to_vec Line | Count | Source | 41 | 15.3k | fn encode_to_vec(&self, buf: &mut Vec<u8>) -> Result<Length> { | 42 | 15.3k | let expected_len = usize::try_from(self.encoded_len()?)?; | 43 | 15.3k | let initial_len = buf.len(); | 44 | 15.3k | buf.resize(initial_len + expected_len, 0u8); | 45 | | | 46 | 15.3k | let buf_slice = &mut buf[initial_len..]; | 47 | 15.3k | let actual_len = self.encode_to_slice(buf_slice)?.len(); | 48 | | | 49 | 15.3k | 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 | 15.3k | } | 56 | | | 57 | 15.3k | actual_len.try_into() | 58 | 15.3k | } |
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 | 3.26M | fn encoded_len(&self) -> Result<Length> { |
75 | 3.26M | 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 | 8.72k | self.value_len().and_then(|len| len.for_tlv()) |
<[f64; 0] as der::encode::Encode>::encoded_len::{closure#0}Line | Count | Source | 75 | 558k | self.value_len().and_then(|len| len.for_tlv()) |
<[f64; 32] as der::encode::Encode>::encoded_len::{closure#0}Line | Count | Source | 75 | 4.79k | 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: <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 | 2.06M | self.value_len().and_then(|len| len.for_tlv()) |
<i32 as der::encode::Encode>::encoded_len::{closure#0}Line | Count | Source | 75 | 48.0k | self.value_len().and_then(|len| len.for_tlv()) |
Unexecuted instantiation: <u32 as der::encode::Encode>::encoded_len::{closure#0}<u8 as der::encode::Encode>::encoded_len::{closure#0}Line | Count | Source | 75 | 580k | self.value_len().and_then(|len| len.for_tlv()) |
|
76 | 3.26M | } 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 <[f64; 0] as der::encode::Encode>::encoded_len Line | Count | Source | 74 | 558k | fn encoded_len(&self) -> Result<Length> { | 75 | 558k | self.value_len().and_then(|len| len.for_tlv()) | 76 | 558k | } |
<[f64; 32] as der::encode::Encode>::encoded_len Line | Count | Source | 74 | 4.79k | fn encoded_len(&self) -> Result<Length> { | 75 | 4.79k | self.value_len().and_then(|len| len.for_tlv()) | 76 | 4.79k | } |
Unexecuted instantiation: <bool as der::encode::Encode>::encoded_len <f64 as der::encode::Encode>::encoded_len Line | Count | Source | 74 | 2.06M | fn encoded_len(&self) -> Result<Length> { | 75 | 2.06M | self.value_len().and_then(|len| len.for_tlv()) | 76 | 2.06M | } |
<i32 as der::encode::Encode>::encoded_len Line | Count | Source | 74 | 48.0k | fn encoded_len(&self) -> Result<Length> { | 75 | 48.0k | self.value_len().and_then(|len| len.for_tlv()) | 76 | 48.0k | } |
Unexecuted instantiation: <u32 as der::encode::Encode>::encoded_len Unexecuted instantiation: <der::asn1::utf8_string::Utf8StringRef as der::encode::Encode>::encoded_len <[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32] as der::encode::Encode>::encoded_len Line | Count | Source | 74 | 8.72k | fn encoded_len(&self) -> Result<Length> { | 75 | 8.72k | self.value_len().and_then(|len| len.for_tlv()) | 76 | 8.72k | } |
Unexecuted instantiation: <der::asn1::octet_string::OctetStringRef as der::encode::Encode>::encoded_len <u8 as der::encode::Encode>::encoded_len Line | Count | Source | 74 | 580k | fn encoded_len(&self) -> Result<Length> { | 75 | 580k | self.value_len().and_then(|len| len.for_tlv()) | 76 | 580k | } |
|
77 | | |
78 | | /// Encode this value as ASN.1 DER using the provided [`Writer`]. |
79 | 1.71M | fn encode(&self, writer: &mut impl Writer) -> Result<()> { |
80 | 1.71M | self.header()?.encode(writer)?; |
81 | 1.71M | self.encode_value(writer) |
82 | 1.71M | } Unexecuted instantiation: <alloc::vec::Vec<anise::structure::location::TerrainMask> as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> <[f64; 0] as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> Line | Count | Source | 79 | 279k | fn encode(&self, writer: &mut impl Writer) -> Result<()> { | 80 | 279k | self.header()?.encode(writer)?; | 81 | 279k | self.encode_value(writer) | 82 | 279k | } |
<[f64; 32] as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> Line | Count | Source | 79 | 4.79k | fn encode(&self, writer: &mut impl Writer) -> Result<()> { | 80 | 4.79k | self.header()?.encode(writer)?; | 81 | 4.79k | self.encode_value(writer) | 82 | 4.79k | } |
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 | 1.07M | fn encode(&self, writer: &mut impl Writer) -> Result<()> { | 80 | 1.07M | self.header()?.encode(writer)?; | 81 | 1.07M | self.encode_value(writer) | 82 | 1.07M | } |
<u8 as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> Line | Count | Source | 79 | 301k | fn encode(&self, writer: &mut impl Writer) -> Result<()> { | 80 | 301k | self.header()?.encode(writer)?; | 81 | 301k | self.encode_value(writer) | 82 | 301k | } |
<i32 as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> Line | Count | Source | 79 | 48.0k | fn encode(&self, writer: &mut impl Writer) -> Result<()> { | 80 | 48.0k | self.header()?.encode(writer)?; | 81 | 48.0k | self.encode_value(writer) | 82 | 48.0k | } |
<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32] as der::encode::Encode>::encode::<der::writer::slice::SliceWriter> Line | Count | Source | 79 | 8.72k | fn encode(&self, writer: &mut impl Writer) -> Result<()> { | 80 | 8.72k | self.header()?.encode(writer)?; | 81 | 8.72k | self.encode_value(writer) | 82 | 8.72k | } |
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 | 1.71M | fn header(&self) -> Result<Header> |
131 | 1.71M | where |
132 | 1.71M | Self: Tagged, |
133 | | { |
134 | 1.71M | Header::new(self.tag(), self.value_len()?) |
135 | 1.71M | } Unexecuted instantiation: <alloc::vec::Vec<anise::structure::location::TerrainMask> as der::encode::EncodeValue>::header <[f64; 0] as der::encode::EncodeValue>::header Line | Count | Source | 130 | 279k | fn header(&self) -> Result<Header> | 131 | 279k | where | 132 | 279k | Self: Tagged, | 133 | | { | 134 | 279k | Header::new(self.tag(), self.value_len()?) | 135 | 279k | } |
<[f64; 32] as der::encode::EncodeValue>::header Line | Count | Source | 130 | 4.79k | fn header(&self) -> Result<Header> | 131 | 4.79k | where | 132 | 4.79k | Self: Tagged, | 133 | | { | 134 | 4.79k | Header::new(self.tag(), self.value_len()?) | 135 | 4.79k | } |
Unexecuted instantiation: <bool as der::encode::EncodeValue>::header <f64 as der::encode::EncodeValue>::header Line | Count | Source | 130 | 1.07M | fn header(&self) -> Result<Header> | 131 | 1.07M | where | 132 | 1.07M | Self: Tagged, | 133 | | { | 134 | 1.07M | Header::new(self.tag(), self.value_len()?) | 135 | 1.07M | } |
<i32 as der::encode::EncodeValue>::header Line | Count | Source | 130 | 48.0k | fn header(&self) -> Result<Header> | 131 | 48.0k | where | 132 | 48.0k | Self: Tagged, | 133 | | { | 134 | 48.0k | Header::new(self.tag(), self.value_len()?) | 135 | 48.0k | } |
<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32] as der::encode::EncodeValue>::header Line | Count | Source | 130 | 8.72k | fn header(&self) -> Result<Header> | 131 | 8.72k | where | 132 | 8.72k | Self: Tagged, | 133 | | { | 134 | 8.72k | Header::new(self.tag(), self.value_len()?) | 135 | 8.72k | } |
<u8 as der::encode::EncodeValue>::header Line | Count | Source | 130 | 301k | fn header(&self) -> Result<Header> | 131 | 301k | where | 132 | 301k | Self: Tagged, | 133 | | { | 134 | 301k | Header::new(self.tag(), self.value_len()?) | 135 | 301k | } |
Unexecuted instantiation: <alloc::vec::Vec<u8> as der::encode::EncodeValue>::header |
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 | | } |