asn1_codecs/per/aper/
mod.rs

1#![allow(dead_code)]
2//! ASN.1 Aligned PER Codec
3
4pub mod encode;
5
6pub mod decode;
7
8/// Trait representing an 'APER Codec'.
9///
10///
11/// This 'trait' is to be derived by any `struct` or `enum` representing an ASN.1 Type.
12pub trait AperCodec {
13    type Output;
14
15    fn aper_decode(data: &mut crate::PerCodecData) -> Result<Self::Output, crate::PerCodecError>;
16
17    fn aper_encode(&self, _data: &mut crate::PerCodecData) -> Result<(), crate::PerCodecError> {
18        todo!();
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use super::*;
25    use crate::PerCodecData;
26    use bitvec::prelude::*;
27
28    // A test that would fail if it were not for the `force_align()` in PerCodecData::get_bytes().
29    #[test]
30    fn get_bytes_unaligned() {
31        let mut d = PerCodecData::from_slice_aper(&vec![0x0f, 0xf0]);
32        let _ = d.get_bitvec(4);
33        let bytes = d.get_bytes(1).unwrap();
34        assert_eq!(bytes, vec![0xff]);
35    }
36
37    #[test]
38    fn test_encode_decode_unconstrained_whole_number() {
39        let numbers: Vec<i128> = vec![
40            140737488355328,
41            140737488355327,
42            549755813888,
43            549755813887,
44            2147483648,
45            2147483647,
46            8388608,
47            8388607,
48            32768,
49            32767,
50            128,
51            127,
52            1,
53            0,
54            -1,
55            -128,
56            -129,
57            -32768,
58            -32769,
59            -8388608,
60            -8388609,
61            -2147483648,
62            -2147483649,
63            -549755813888,
64            -549755813889,
65            -140737488355328,
66            -140737488355329,
67        ];
68        //let numbers: Vec<i128> = vec![-256, -1, -65537, 0, 11, 127, 128, 65536, 1234567, 123456789];
69        for num in numbers {
70            let mut d = PerCodecData::new_aper();
71            let result = encode::encode_integer(&mut d, None, None, false, num, false);
72            assert!(
73                result.is_ok(),
74                "number: {}, d: {:#?}, error: {:#?}",
75                num,
76                d,
77                result.err().unwrap()
78            );
79            let value = decode::decode_integer(&mut d, None, None, false);
80            assert!(value.is_ok(), "{:#?}", value.err().unwrap());
81            assert!(value.unwrap().0 == num);
82        }
83    }
84
85    // Proves get_bitvec() can cope if it is asked for all the remaining bits in the buffer.
86    #[test]
87    fn get_all_remaining_bits() {
88        let mut d = PerCodecData::new_aper();
89        d.append_bits(bits![u8, Msb0; 1,0,1,0]);
90        assert_eq!(d.get_bitvec(4).unwrap(), bitvec![u8,Msb0;1,0,1,0]);
91    }
92
93    // Likewise for get_bytes().
94    #[test]
95    fn get_all_remaining_bytes() {
96        let mut d = PerCodecData::new_aper();
97        let b: u8 = 0b10101111;
98        d.append_bits(b.view_bits());
99        assert_eq!(d.get_bytes(1).unwrap()[0], b);
100    }
101
102    #[test]
103    fn printable_string_coding() {
104        let mut d = PerCodecData::new_aper();
105        let s1 = "hello".to_string();
106        encode::encode_printable_string(&mut d, None, None, false, &s1, false).unwrap();
107        let s2 = decode::decode_printable_string(&mut d, None, None, false).unwrap();
108        assert_eq!(s1, s2);
109    }
110
111    #[test]
112    fn empty_string() {
113        let mut d = PerCodecData::new_aper();
114        let s1 = "".to_string();
115        encode::encode_printable_string(&mut d, None, None, false, &s1, false).unwrap();
116        let s2 = decode::decode_printable_string(&mut d, None, None, false).unwrap();
117        assert_eq!(s1, s2);
118    }
119}