1 //! ASN.1 `ANY` type.
2 
3 #![cfg_attr(feature = "arbitrary", allow(clippy::integer_arithmetic))]
4 
5 use crate::{
6     BytesRef, Choice, Decode, DecodeValue, DerOrd, EncodeValue, Error, ErrorKind, Header, Length,
7     Reader, Result, SliceReader, Tag, Tagged, ValueOrd, Writer,
8 };
9 use core::cmp::Ordering;
10 
11 #[cfg(feature = "alloc")]
12 use crate::SliceWriter;
13 
14 /// ASN.1 `ANY`: represents any explicitly tagged ASN.1 value.
15 ///
16 /// This is a zero-copy reference type which borrows from the input data.
17 ///
18 /// Technically `ANY` hasn't been a recommended part of ASN.1 since the X.209
19 /// revision from 1988. It was deprecated and replaced by Information Object
20 /// Classes in X.680 in 1994, and X.690 no longer refers to it whatsoever.
21 ///
22 /// Nevertheless, this crate defines an `ANY` type as it remains a familiar
23 /// and useful concept which is still extensively used in things like
24 /// PKI-related RFCs.
25 #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
26 #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
27 pub struct AnyRef<'a> {
28     /// Tag representing the type of the encoded value.
29     tag: Tag,
30 
31     /// Inner value encoded as bytes.
32     value: BytesRef<'a>,
33 }
34 
35 impl<'a> AnyRef<'a> {
36     /// [`AnyRef`] representation of the ASN.1 `NULL` type.
37     pub const NULL: Self = Self {
38         tag: Tag::Null,
39         value: BytesRef::EMPTY,
40     };
41 
42     /// Create a new [`AnyRef`] from the provided [`Tag`] and DER bytes.
new(tag: Tag, bytes: &'a [u8]) -> Result<Self>43     pub fn new(tag: Tag, bytes: &'a [u8]) -> Result<Self> {
44         let value = BytesRef::new(bytes).map_err(|_| ErrorKind::Length { tag })?;
45         Ok(Self { tag, value })
46     }
47 
48     /// Infallible creation of an [`AnyRef`] from a [`BytesRef`].
from_tag_and_value(tag: Tag, value: BytesRef<'a>) -> Self49     pub(crate) fn from_tag_and_value(tag: Tag, value: BytesRef<'a>) -> Self {
50         Self { tag, value }
51     }
52 
53     /// Get the raw value for this [`AnyRef`] type as a byte slice.
value(self) -> &'a [u8]54     pub fn value(self) -> &'a [u8] {
55         self.value.as_slice()
56     }
57 
58     /// Attempt to decode this [`AnyRef`] type into the inner value.
decode_as<T>(self) -> Result<T> where T: Choice<'a> + DecodeValue<'a>,59     pub fn decode_as<T>(self) -> Result<T>
60     where
61         T: Choice<'a> + DecodeValue<'a>,
62     {
63         if !T::can_decode(self.tag) {
64             return Err(self.tag.unexpected_error(None));
65         }
66 
67         let header = Header {
68             tag: self.tag,
69             length: self.value.len(),
70         };
71 
72         let mut decoder = SliceReader::new(self.value())?;
73         let result = T::decode_value(&mut decoder, header)?;
74         decoder.finish(result)
75     }
76 
77     /// Is this value an ASN.1 `NULL` value?
is_null(self) -> bool78     pub fn is_null(self) -> bool {
79         self == Self::NULL
80     }
81 
82     /// Attempt to decode this value an ASN.1 `SEQUENCE`, creating a new
83     /// nested reader and calling the provided argument with it.
sequence<F, T>(self, f: F) -> Result<T> where F: FnOnce(&mut SliceReader<'a>) -> Result<T>,84     pub fn sequence<F, T>(self, f: F) -> Result<T>
85     where
86         F: FnOnce(&mut SliceReader<'a>) -> Result<T>,
87     {
88         self.tag.assert_eq(Tag::Sequence)?;
89         let mut reader = SliceReader::new(self.value.as_slice())?;
90         let result = f(&mut reader)?;
91         reader.finish(result)
92     }
93 }
94 
95 impl<'a> Choice<'a> for AnyRef<'a> {
can_decode(_: Tag) -> bool96     fn can_decode(_: Tag) -> bool {
97         true
98     }
99 }
100 
101 impl<'a> Decode<'a> for AnyRef<'a> {
decode<R: Reader<'a>>(reader: &mut R) -> Result<AnyRef<'a>>102     fn decode<R: Reader<'a>>(reader: &mut R) -> Result<AnyRef<'a>> {
103         let header = Header::decode(reader)?;
104         Self::decode_value(reader, header)
105     }
106 }
107 
108 impl<'a> DecodeValue<'a> for AnyRef<'a> {
decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self>109     fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
110         Ok(Self {
111             tag: header.tag,
112             value: BytesRef::decode_value(reader, header)?,
113         })
114     }
115 }
116 
117 impl EncodeValue for AnyRef<'_> {
value_len(&self) -> Result<Length>118     fn value_len(&self) -> Result<Length> {
119         Ok(self.value.len())
120     }
121 
encode_value(&self, writer: &mut impl Writer) -> Result<()>122     fn encode_value(&self, writer: &mut impl Writer) -> Result<()> {
123         writer.write(self.value())
124     }
125 }
126 
127 impl Tagged for AnyRef<'_> {
tag(&self) -> Tag128     fn tag(&self) -> Tag {
129         self.tag
130     }
131 }
132 
133 impl ValueOrd for AnyRef<'_> {
value_cmp(&self, other: &Self) -> Result<Ordering>134     fn value_cmp(&self, other: &Self) -> Result<Ordering> {
135         self.value.der_cmp(&other.value)
136     }
137 }
138 
139 impl<'a> From<AnyRef<'a>> for BytesRef<'a> {
from(any: AnyRef<'a>) -> BytesRef<'a>140     fn from(any: AnyRef<'a>) -> BytesRef<'a> {
141         any.value
142     }
143 }
144 
145 impl<'a> TryFrom<&'a [u8]> for AnyRef<'a> {
146     type Error = Error;
147 
try_from(bytes: &'a [u8]) -> Result<AnyRef<'a>>148     fn try_from(bytes: &'a [u8]) -> Result<AnyRef<'a>> {
149         AnyRef::from_der(bytes)
150     }
151 }
152 
153 #[cfg(feature = "alloc")]
154 pub use self::allocating::Any;
155 
156 #[cfg(feature = "alloc")]
157 mod allocating {
158     use super::*;
159     use crate::{referenced::*, BytesOwned};
160     use alloc::boxed::Box;
161 
162     /// ASN.1 `ANY`: represents any explicitly tagged ASN.1 value.
163     ///
164     /// This type provides the same functionality as [`AnyRef`] but owns the
165     /// backing data.
166     #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
167     #[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
168     pub struct Any {
169         /// Tag representing the type of the encoded value.
170         tag: Tag,
171 
172         /// Inner value encoded as bytes.
173         value: BytesOwned,
174     }
175 
176     impl Any {
177         /// Create a new [`Any`] from the provided [`Tag`] and DER bytes.
new(tag: Tag, bytes: impl Into<Box<[u8]>>) -> Result<Self>178         pub fn new(tag: Tag, bytes: impl Into<Box<[u8]>>) -> Result<Self> {
179             let value = BytesOwned::new(bytes)?;
180 
181             // Ensure the tag and value are a valid `AnyRef`.
182             AnyRef::new(tag, value.as_slice())?;
183             Ok(Self { tag, value })
184         }
185 
186         /// Allow access to value
value(&self) -> &[u8]187         pub fn value(&self) -> &[u8] {
188             self.value.as_slice()
189         }
190 
191         /// Attempt to decode this [`Any`] type into the inner value.
decode_as<'a, T>(&'a self) -> Result<T> where T: Choice<'a> + DecodeValue<'a>,192         pub fn decode_as<'a, T>(&'a self) -> Result<T>
193         where
194             T: Choice<'a> + DecodeValue<'a>,
195         {
196             AnyRef::from(self).decode_as()
197         }
198 
199         /// Encode the provided type as an [`Any`] value.
encode_from<T>(msg: &T) -> Result<Self> where T: Tagged + EncodeValue,200         pub fn encode_from<T>(msg: &T) -> Result<Self>
201         where
202             T: Tagged + EncodeValue,
203         {
204             let encoded_len = usize::try_from(msg.value_len()?)?;
205             let mut buf = vec![0u8; encoded_len];
206             let mut writer = SliceWriter::new(&mut buf);
207             msg.encode_value(&mut writer)?;
208             writer.finish()?;
209             Any::new(msg.tag(), buf)
210         }
211 
212         /// Attempt to decode this value an ASN.1 `SEQUENCE`, creating a new
213         /// nested reader and calling the provided argument with it.
sequence<'a, F, T>(&'a self, f: F) -> Result<T> where F: FnOnce(&mut SliceReader<'a>) -> Result<T>,214         pub fn sequence<'a, F, T>(&'a self, f: F) -> Result<T>
215         where
216             F: FnOnce(&mut SliceReader<'a>) -> Result<T>,
217         {
218             AnyRef::from(self).sequence(f)
219         }
220 
221         /// [`Any`] representation of the ASN.1 `NULL` type.
null() -> Self222         pub fn null() -> Self {
223             Self {
224                 tag: Tag::Null,
225                 value: BytesOwned::default(),
226             }
227         }
228     }
229 
230     impl Choice<'_> for Any {
can_decode(_: Tag) -> bool231         fn can_decode(_: Tag) -> bool {
232             true
233         }
234     }
235 
236     impl<'a> Decode<'a> for Any {
decode<R: Reader<'a>>(reader: &mut R) -> Result<Self>237         fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Self> {
238             let header = Header::decode(reader)?;
239             Self::decode_value(reader, header)
240         }
241     }
242 
243     impl<'a> DecodeValue<'a> for Any {
decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self>244         fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
245             let value = reader.read_vec(header.length)?;
246             Self::new(header.tag, value)
247         }
248     }
249 
250     impl EncodeValue for Any {
value_len(&self) -> Result<Length>251         fn value_len(&self) -> Result<Length> {
252             Ok(self.value.len())
253         }
254 
encode_value(&self, writer: &mut impl Writer) -> Result<()>255         fn encode_value(&self, writer: &mut impl Writer) -> Result<()> {
256             writer.write(self.value.as_slice())
257         }
258     }
259 
260     impl<'a> From<&'a Any> for AnyRef<'a> {
from(any: &'a Any) -> AnyRef<'a>261         fn from(any: &'a Any) -> AnyRef<'a> {
262             // Ensured to parse successfully in constructor
263             AnyRef::new(any.tag, any.value.as_slice()).expect("invalid ANY")
264         }
265     }
266 
267     impl Tagged for Any {
tag(&self) -> Tag268         fn tag(&self) -> Tag {
269             self.tag
270         }
271     }
272 
273     impl ValueOrd for Any {
value_cmp(&self, other: &Self) -> Result<Ordering>274         fn value_cmp(&self, other: &Self) -> Result<Ordering> {
275             self.value.der_cmp(&other.value)
276         }
277     }
278 
279     impl<'a, T> From<T> for Any
280     where
281         T: Into<AnyRef<'a>>,
282     {
from(input: T) -> Any283         fn from(input: T) -> Any {
284             let anyref: AnyRef<'a> = input.into();
285             Self {
286                 tag: anyref.tag(),
287                 value: BytesOwned::from(anyref.value),
288             }
289         }
290     }
291 
292     impl<'a> RefToOwned<'a> for AnyRef<'a> {
293         type Owned = Any;
ref_to_owned(&self) -> Self::Owned294         fn ref_to_owned(&self) -> Self::Owned {
295             Any {
296                 tag: self.tag(),
297                 value: BytesOwned::from(self.value),
298             }
299         }
300     }
301 
302     impl OwnedToRef for Any {
303         type Borrowed<'a> = AnyRef<'a>;
owned_to_ref(&self) -> Self::Borrowed<'_>304         fn owned_to_ref(&self) -> Self::Borrowed<'_> {
305             self.into()
306         }
307     }
308 
309     impl Any {
310         /// Is this value an ASN.1 `NULL` value?
is_null(&self) -> bool311         pub fn is_null(&self) -> bool {
312             self.owned_to_ref() == AnyRef::NULL
313         }
314     }
315 }
316