1 // Additional x509/asn1 functions to those provided in webpki/ring.
2 
3 use ring::io::der;
4 
wrap_in_asn1_len(bytes: &mut Vec<u8>)5 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 
22 /// Prepend stuff to `bytes` to put it in a DER SEQUENCE.
wrap_in_sequence(bytes: &mut Vec<u8>)23 pub 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]
test_empty()29 fn 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]
test_small()36 fn 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]
test_medium()47 fn 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]
test_large()55 fn 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]
test_huge()63 fn 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]
test_gigantic()72 fn 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]
test_ludicrous()84 fn 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 }
94