Coverage Report

Created: 2026-02-14 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/asn1/oid.rs
Line
Count
Source
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
82.6k
    fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
14
82.6k
        let mut buf = [0u8; ObjectIdentifier::MAX_SIZE];
15
82.6k
        let slice = buf
16
82.6k
            .get_mut(..header.length.try_into()?)
17
82.6k
            .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::nested::NestedReader<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::nested::NestedReader<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::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::nested::NestedReader<der::reader::slice::SliceReader>>>::{closure#0}
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<_>::{closure#0}
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>>::{closure#0}
Line
Count
Source
17
37
            .ok_or_else(|| Self::TAG.length_error())?;
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>::{closure#0}
Line
Count
Source
17
26
            .ok_or_else(|| Self::TAG.length_error())?;
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>::{closure#0}
Line
Count
Source
17
27
            .ok_or_else(|| Self::TAG.length_error())?;
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::{closure#0}
Line
Count
Source
17
25
            .ok_or_else(|| Self::TAG.length_error())?;
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<_>::{closure#0}
18
19
82.5k
        let actual_len = reader.read_into(slice)?.len();
20
82.5k
        debug_assert_eq!(actual_len, header.length.try_into()?);
21
82.5k
        Ok(Self::from_bytes(slice)?)
22
82.6k
    }
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<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::nested::NestedReader<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::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::nested::NestedReader<der::reader::slice::SliceReader>>>
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<_>
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>>
Line
Count
Source
13
79.3k
    fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
14
79.3k
        let mut buf = [0u8; ObjectIdentifier::MAX_SIZE];
15
79.3k
        let slice = buf
16
79.3k
            .get_mut(..header.length.try_into()?)
17
79.3k
            .ok_or_else(|| Self::TAG.length_error())?;
18
19
79.2k
        let actual_len = reader.read_into(slice)?.len();
20
79.2k
        debug_assert_eq!(actual_len, header.length.try_into()?);
21
79.2k
        Ok(Self::from_bytes(slice)?)
22
79.3k
    }
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>
Line
Count
Source
13
815
    fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
14
815
        let mut buf = [0u8; ObjectIdentifier::MAX_SIZE];
15
815
        let slice = buf
16
815
            .get_mut(..header.length.try_into()?)
17
815
            .ok_or_else(|| Self::TAG.length_error())?;
18
19
789
        let actual_len = reader.read_into(slice)?.len();
20
784
        debug_assert_eq!(actual_len, header.length.try_into()?);
21
784
        Ok(Self::from_bytes(slice)?)
22
815
    }
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Line
Count
Source
13
2.33k
    fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
14
2.33k
        let mut buf = [0u8; ObjectIdentifier::MAX_SIZE];
15
2.33k
        let slice = buf
16
2.33k
            .get_mut(..header.length.try_into()?)
17
2.33k
            .ok_or_else(|| Self::TAG.length_error())?;
18
19
2.30k
        let actual_len = reader.read_into(slice)?.len();
20
2.30k
        debug_assert_eq!(actual_len, header.length.try_into()?);
21
2.30k
        Ok(Self::from_bytes(slice)?)
22
2.33k
    }
<const_oid::ObjectIdentifier as der::decode::DecodeValue>::decode_value::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
13
193
    fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
14
193
        let mut buf = [0u8; ObjectIdentifier::MAX_SIZE];
15
193
        let slice = buf
16
193
            .get_mut(..header.length.try_into()?)
17
193
            .ok_or_else(|| Self::TAG.length_error())?;
18
19
168
        let actual_len = reader.read_into(slice)?.len();
20
164
        debug_assert_eq!(actual_len, header.length.try_into()?);
21
164
        Ok(Self::from_bytes(slice)?)
22
193
    }
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
    }
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::encode::EncodeValue>::value_len
Unexecuted instantiation: <const_oid::ObjectIdentifier as der::encode::EncodeValue>::value_len
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::<_>
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
        // Note: ensuring an infallible conversion is possible relies on the
44
        // invariant that `const_oid::MAX_LEN <= Length::max()`.
45
        //
46
        // 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
52
0
        AnyRef::from_tag_and_value(Tag::ObjectIdentifier, value)
53
0
    }
Unexecuted instantiation: <der::asn1::any::AnyRef as core::convert::From<&const_oid::ObjectIdentifier>>::from
Unexecuted instantiation: <der::asn1::any::AnyRef as core::convert::From<&const_oid::ObjectIdentifier>>::from
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
    }
Unexecuted instantiation: <der::asn1::any::allocating::Any as core::convert::From<const_oid::ObjectIdentifier>>::from
Unexecuted instantiation: <der::asn1::any::allocating::Any as core::convert::From<const_oid::ObjectIdentifier>>::from
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
    }
Unexecuted instantiation: <const_oid::ObjectIdentifier as core::convert::TryFrom<der::asn1::any::AnyRef>>::try_from
Unexecuted instantiation: <const_oid::ObjectIdentifier as core::convert::TryFrom<der::asn1::any::AnyRef>>::try_from
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
}