1use ring::io::der;
4
5pub(crate) fn wrap_in_asn1_len(bytes: &mut Vec<u8>) {
6 let len = bytes.len();
7
8 if len <= 0x7f {
9 bytes.insert(0, len as u8);
10 } else {
11 bytes.insert(0, 0x80u8);
12 let mut left = len;
13 while left > 0 {
14 let byte = (left & 0xff) as u8;
15 bytes.insert(1, byte);
16 bytes[0] += 1;
17 left >>= 8;
18 }
19 }
20}
21
22pub(crate) fn wrap_in_sequence(bytes: &mut Vec<u8>) {
24 wrap_in_asn1_len(bytes);
25 bytes.insert(0, der::Tag::Sequence as u8);
26}
27
28#[test]
29fn test_empty() {
30 let mut val = Vec::new();
31 wrap_in_sequence(&mut val);
32 assert_eq!(vec![0x30, 0x00], val);
33}
34
35#[test]
36fn test_small() {
37 let mut val = Vec::new();
38 val.insert(0, 0x00);
39 val.insert(1, 0x11);
40 val.insert(2, 0x22);
41 val.insert(3, 0x33);
42 wrap_in_sequence(&mut val);
43 assert_eq!(vec![0x30, 0x04, 0x00, 0x11, 0x22, 0x33], val);
44}
45
46#[test]
47fn test_medium() {
48 let mut val = Vec::new();
49 val.resize(255, 0x12);
50 wrap_in_sequence(&mut val);
51 assert_eq!(vec![0x30, 0x81, 0xff, 0x12, 0x12, 0x12], val[..6].to_vec());
52}
53
54#[test]
55fn test_large() {
56 let mut val = Vec::new();
57 val.resize(4660, 0x12);
58 wrap_in_sequence(&mut val);
59 assert_eq!(vec![0x30, 0x82, 0x12, 0x34, 0x12, 0x12], val[..6].to_vec());
60}
61
62#[test]
63fn test_huge() {
64 let mut val = Vec::new();
65 val.resize(0xffff, 0x12);
66 wrap_in_sequence(&mut val);
67 assert_eq!(vec![0x30, 0x82, 0xff, 0xff, 0x12, 0x12], val[..6].to_vec());
68 assert_eq!(val.len(), 0xffff + 4);
69}
70
71#[test]
72fn test_gigantic() {
73 let mut val = Vec::new();
74 val.resize(0x100000, 0x12);
75 wrap_in_sequence(&mut val);
76 assert_eq!(
77 vec![0x30, 0x83, 0x10, 0x00, 0x00, 0x12, 0x12],
78 val[..7].to_vec()
79 );
80 assert_eq!(val.len(), 0x100000 + 5);
81}
82
83#[test]
84fn test_ludicrous() {
85 let mut val = Vec::new();
86 val.resize(0x1000000, 0x12);
87 wrap_in_sequence(&mut val);
88 assert_eq!(
89 vec![0x30, 0x84, 0x01, 0x00, 0x00, 0x00, 0x12, 0x12],
90 val[..8].to_vec()
91 );
92 assert_eq!(val.len(), 0x1000000 + 6);
93}