Coverage Report

Created: 2024-11-30 06:06

/rust/registry/src/index.crates.io-6f17d22bba15001f/der-0.7.9/src/asn1/integer.rs
Line
Count
Source (jump to first uncovered line)
1
//! ASN.1 `INTEGER` support.
2
3
pub(super) mod int;
4
pub(super) mod uint;
5
6
use core::{cmp::Ordering, mem};
7
8
use crate::{EncodeValue, Result, SliceWriter};
9
10
/// Is the highest bit of the first byte in the slice set to `1`? (if present)
11
#[inline]
12
0
fn is_highest_bit_set(bytes: &[u8]) -> bool {
13
0
    bytes
14
0
        .first()
15
0
        .map(|byte| byte & 0b10000000 != 0)
16
0
        .unwrap_or(false)
17
0
}
18
19
/// Compare two integer values
20
0
fn value_cmp<T>(a: T, b: T) -> Result<Ordering>
21
0
where
22
0
    T: Copy + EncodeValue + Sized,
23
0
{
24
    const MAX_INT_SIZE: usize = 16;
25
0
    debug_assert!(mem::size_of::<T>() <= MAX_INT_SIZE);
26
27
0
    let mut buf1 = [0u8; MAX_INT_SIZE];
28
0
    let mut encoder1 = SliceWriter::new(&mut buf1);
29
0
    a.encode_value(&mut encoder1)?;
30
31
0
    let mut buf2 = [0u8; MAX_INT_SIZE];
32
0
    let mut encoder2 = SliceWriter::new(&mut buf2);
33
0
    b.encode_value(&mut encoder2)?;
34
35
0
    Ok(encoder1.finish()?.cmp(encoder2.finish()?))
36
0
}
Unexecuted instantiation: der::asn1::integer::value_cmp::<i8>
Unexecuted instantiation: der::asn1::integer::value_cmp::<u8>
Unexecuted instantiation: der::asn1::integer::value_cmp::<i32>
Unexecuted instantiation: der::asn1::integer::value_cmp::<u32>
Unexecuted instantiation: der::asn1::integer::value_cmp::<i128>
Unexecuted instantiation: der::asn1::integer::value_cmp::<u128>
Unexecuted instantiation: der::asn1::integer::value_cmp::<i16>
Unexecuted instantiation: der::asn1::integer::value_cmp::<u16>
Unexecuted instantiation: der::asn1::integer::value_cmp::<i64>
Unexecuted instantiation: der::asn1::integer::value_cmp::<u64>
37
38
#[cfg(test)]
39
pub(crate) mod tests {
40
    use crate::{Decode, Encode};
41
42
    // Vectors from Section 5.7 of:
43
    // https://luca.ntop.org/Teaching/Appunti/asn1.html
44
    pub(crate) const I0_BYTES: &[u8] = &[0x02, 0x01, 0x00];
45
    pub(crate) const I127_BYTES: &[u8] = &[0x02, 0x01, 0x7F];
46
    pub(crate) const I128_BYTES: &[u8] = &[0x02, 0x02, 0x00, 0x80];
47
    pub(crate) const I256_BYTES: &[u8] = &[0x02, 0x02, 0x01, 0x00];
48
    pub(crate) const INEG128_BYTES: &[u8] = &[0x02, 0x01, 0x80];
49
    pub(crate) const INEG129_BYTES: &[u8] = &[0x02, 0x02, 0xFF, 0x7F];
50
51
    // Additional vectors
52
    pub(crate) const I255_BYTES: &[u8] = &[0x02, 0x02, 0x00, 0xFF];
53
    pub(crate) const I32767_BYTES: &[u8] = &[0x02, 0x02, 0x7F, 0xFF];
54
    pub(crate) const I65535_BYTES: &[u8] = &[0x02, 0x03, 0x00, 0xFF, 0xFF];
55
    pub(crate) const INEG32768_BYTES: &[u8] = &[0x02, 0x02, 0x80, 0x00];
56
57
    #[test]
58
    fn decode_i8() {
59
        assert_eq!(0, i8::from_der(I0_BYTES).unwrap());
60
        assert_eq!(127, i8::from_der(I127_BYTES).unwrap());
61
        assert_eq!(-128, i8::from_der(INEG128_BYTES).unwrap());
62
    }
63
64
    #[test]
65
    fn decode_i16() {
66
        assert_eq!(0, i16::from_der(I0_BYTES).unwrap());
67
        assert_eq!(127, i16::from_der(I127_BYTES).unwrap());
68
        assert_eq!(128, i16::from_der(I128_BYTES).unwrap());
69
        assert_eq!(255, i16::from_der(I255_BYTES).unwrap());
70
        assert_eq!(256, i16::from_der(I256_BYTES).unwrap());
71
        assert_eq!(32767, i16::from_der(I32767_BYTES).unwrap());
72
        assert_eq!(-128, i16::from_der(INEG128_BYTES).unwrap());
73
        assert_eq!(-129, i16::from_der(INEG129_BYTES).unwrap());
74
        assert_eq!(-32768, i16::from_der(INEG32768_BYTES).unwrap());
75
    }
76
77
    #[test]
78
    fn decode_u8() {
79
        assert_eq!(0, u8::from_der(I0_BYTES).unwrap());
80
        assert_eq!(127, u8::from_der(I127_BYTES).unwrap());
81
        assert_eq!(255, u8::from_der(I255_BYTES).unwrap());
82
    }
83
84
    #[test]
85
    fn decode_u16() {
86
        assert_eq!(0, u16::from_der(I0_BYTES).unwrap());
87
        assert_eq!(127, u16::from_der(I127_BYTES).unwrap());
88
        assert_eq!(255, u16::from_der(I255_BYTES).unwrap());
89
        assert_eq!(256, u16::from_der(I256_BYTES).unwrap());
90
        assert_eq!(32767, u16::from_der(I32767_BYTES).unwrap());
91
        assert_eq!(65535, u16::from_der(I65535_BYTES).unwrap());
92
    }
93
94
    #[test]
95
    fn encode_i8() {
96
        let mut buffer = [0u8; 3];
97
98
        assert_eq!(I0_BYTES, 0i8.encode_to_slice(&mut buffer).unwrap());
99
        assert_eq!(I127_BYTES, 127i8.encode_to_slice(&mut buffer).unwrap());
100
101
        assert_eq!(
102
            INEG128_BYTES,
103
            (-128i8).encode_to_slice(&mut buffer).unwrap()
104
        );
105
    }
106
107
    #[test]
108
    fn encode_i16() {
109
        let mut buffer = [0u8; 4];
110
        assert_eq!(I0_BYTES, 0i16.encode_to_slice(&mut buffer).unwrap());
111
        assert_eq!(I127_BYTES, 127i16.encode_to_slice(&mut buffer).unwrap());
112
        assert_eq!(I128_BYTES, 128i16.encode_to_slice(&mut buffer).unwrap());
113
        assert_eq!(I255_BYTES, 255i16.encode_to_slice(&mut buffer).unwrap());
114
        assert_eq!(I256_BYTES, 256i16.encode_to_slice(&mut buffer).unwrap());
115
        assert_eq!(I32767_BYTES, 32767i16.encode_to_slice(&mut buffer).unwrap());
116
117
        assert_eq!(
118
            INEG128_BYTES,
119
            (-128i16).encode_to_slice(&mut buffer).unwrap()
120
        );
121
122
        assert_eq!(
123
            INEG129_BYTES,
124
            (-129i16).encode_to_slice(&mut buffer).unwrap()
125
        );
126
127
        assert_eq!(
128
            INEG32768_BYTES,
129
            (-32768i16).encode_to_slice(&mut buffer).unwrap()
130
        );
131
    }
132
133
    #[test]
134
    fn encode_u8() {
135
        let mut buffer = [0u8; 4];
136
        assert_eq!(I0_BYTES, 0u8.encode_to_slice(&mut buffer).unwrap());
137
        assert_eq!(I127_BYTES, 127u8.encode_to_slice(&mut buffer).unwrap());
138
        assert_eq!(I255_BYTES, 255u8.encode_to_slice(&mut buffer).unwrap());
139
    }
140
141
    #[test]
142
    fn encode_u16() {
143
        let mut buffer = [0u8; 5];
144
        assert_eq!(I0_BYTES, 0u16.encode_to_slice(&mut buffer).unwrap());
145
        assert_eq!(I127_BYTES, 127u16.encode_to_slice(&mut buffer).unwrap());
146
        assert_eq!(I128_BYTES, 128u16.encode_to_slice(&mut buffer).unwrap());
147
        assert_eq!(I255_BYTES, 255u16.encode_to_slice(&mut buffer).unwrap());
148
        assert_eq!(I256_BYTES, 256u16.encode_to_slice(&mut buffer).unwrap());
149
        assert_eq!(I32767_BYTES, 32767u16.encode_to_slice(&mut buffer).unwrap());
150
        assert_eq!(I65535_BYTES, 65535u16.encode_to_slice(&mut buffer).unwrap());
151
    }
152
153
    /// Integers must be encoded with a minimum number of octets
154
    #[test]
155
    fn reject_non_canonical() {
156
        assert!(i8::from_der(&[0x02, 0x02, 0x00, 0x00]).is_err());
157
        assert!(i16::from_der(&[0x02, 0x02, 0x00, 0x00]).is_err());
158
        assert!(u8::from_der(&[0x02, 0x02, 0x00, 0x00]).is_err());
159
        assert!(u16::from_der(&[0x02, 0x02, 0x00, 0x00]).is_err());
160
    }
161
}