Coverage Report

Created: 2025-07-23 06:36

/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
}