/rust/registry/src/index.crates.io-6f17d22bba15001f/der-0.7.10/src/asn1/oid.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! ASN.1 `OBJECT IDENTIFIER` |
2 | | |
3 | | use crate::{ |
4 | | asn1::AnyRef, ord::OrdIsValueOrd, DecodeValue, EncodeValue, Error, FixedTag, Header, Length, |
5 | | Reader, Result, Tag, Tagged, Writer, |
6 | | }; |
7 | | use const_oid::ObjectIdentifier; |
8 | | |
9 | | #[cfg(feature = "alloc")] |
10 | | use super::Any; |
11 | | |
12 | | impl<'a> DecodeValue<'a> for ObjectIdentifier { |
13 | 0 | fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> { |
14 | 0 | let mut buf = [0u8; ObjectIdentifier::MAX_SIZE]; |
15 | 0 | let slice = buf |
16 | 0 | .get_mut(..header.length.try_into()?) |
17 | 0 | .ok_or_else(|| Self::TAG.length_error())?; Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::{closure#0} Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::{closure#0} Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<_>::{closure#0} |
18 | | |
19 | 0 | let actual_len = reader.read_into(slice)?.len(); |
20 | 0 | debug_assert_eq!(actual_len, header.length.try_into()?); |
21 | 0 | Ok(Self::from_bytes(slice)?) |
22 | 0 | } Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>> Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<_> |
23 | | } |
24 | | |
25 | | impl EncodeValue for ObjectIdentifier { |
26 | 0 | fn value_len(&self) -> Result<Length> { |
27 | 0 | Length::try_from(self.as_bytes().len()) |
28 | 0 | } |
29 | | |
30 | 0 | fn encode_value(&self, writer: &mut impl Writer) -> Result<()> { |
31 | 0 | writer.write(self.as_bytes()) |
32 | 0 | } Unexecuted instantiation: <const_oid::ObjectIdentifier as der::encode::EncodeValue>::encode_value::<der::writer::slice::SliceWriter> Unexecuted instantiation: <const_oid::ObjectIdentifier as der::encode::EncodeValue>::encode_value::<_> |
33 | | } |
34 | | |
35 | | impl FixedTag for ObjectIdentifier { |
36 | | const TAG: Tag = Tag::ObjectIdentifier; |
37 | | } |
38 | | |
39 | | impl OrdIsValueOrd for ObjectIdentifier {} |
40 | | |
41 | | impl<'a> From<&'a ObjectIdentifier> for AnyRef<'a> { |
42 | 0 | fn from(oid: &'a ObjectIdentifier) -> AnyRef<'a> { |
43 | 0 | // Note: ensuring an infallible conversion is possible relies on the |
44 | 0 | // invariant that `const_oid::MAX_LEN <= Length::max()`. |
45 | 0 | // |
46 | 0 | // The `length()` test below ensures this is the case. |
47 | 0 | let value = oid |
48 | 0 | .as_bytes() |
49 | 0 | .try_into() |
50 | 0 | .expect("OID length invariant violated"); |
51 | 0 |
|
52 | 0 | AnyRef::from_tag_and_value(Tag::ObjectIdentifier, value) |
53 | 0 | } |
54 | | } |
55 | | |
56 | | #[cfg(feature = "alloc")] |
57 | | impl From<ObjectIdentifier> for Any { |
58 | 0 | fn from(oid: ObjectIdentifier) -> Any { |
59 | 0 | AnyRef::from(&oid).into() |
60 | 0 | } |
61 | | } |
62 | | |
63 | | impl TryFrom<AnyRef<'_>> for ObjectIdentifier { |
64 | | type Error = Error; |
65 | | |
66 | 0 | fn try_from(any: AnyRef<'_>) -> Result<ObjectIdentifier> { |
67 | 0 | any.tag().assert_eq(Tag::ObjectIdentifier)?; |
68 | 0 | Ok(ObjectIdentifier::from_bytes(any.value())?) |
69 | 0 | } |
70 | | } |
71 | | |
72 | | #[cfg(test)] |
73 | | mod tests { |
74 | | use super::ObjectIdentifier; |
75 | | use crate::{Decode, Encode, Length}; |
76 | | |
77 | | const EXAMPLE_OID: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.113549"); |
78 | | const EXAMPLE_OID_BYTES: &[u8; 8] = &[0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d]; |
79 | | |
80 | | #[test] |
81 | | fn decode() { |
82 | | let oid = ObjectIdentifier::from_der(EXAMPLE_OID_BYTES).unwrap(); |
83 | | assert_eq!(EXAMPLE_OID, oid); |
84 | | } |
85 | | |
86 | | #[test] |
87 | | fn encode() { |
88 | | let mut buffer = [0u8; 8]; |
89 | | assert_eq!( |
90 | | EXAMPLE_OID_BYTES, |
91 | | EXAMPLE_OID.encode_to_slice(&mut buffer).unwrap() |
92 | | ); |
93 | | } |
94 | | |
95 | | #[test] |
96 | | fn length() { |
97 | | // Ensure an infallible `From` conversion to `Any` will never panic |
98 | | assert!(ObjectIdentifier::MAX_SIZE <= Length::MAX.try_into().unwrap()); |
99 | | } |
100 | | } |