rustls/
x509.rs

1// Additional x509/asn1 functions to those provided in webpki/ring.
2
3use 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
22/// Prepend stuff to `bytes` to put it in a DER SEQUENCE.
23pub(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}