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