1 | #include "internal/quic_vlint.h"
|
---|
2 | #include "internal/e_os.h"
|
---|
3 |
|
---|
4 | #ifndef OPENSSL_NO_QUIC
|
---|
5 |
|
---|
6 | void ossl_quic_vlint_encode_n(uint8_t *buf, uint64_t v, int n)
|
---|
7 | {
|
---|
8 | if (n == 1) {
|
---|
9 | buf[0] = (uint8_t)v;
|
---|
10 | } else if (n == 2) {
|
---|
11 | buf[0] = (uint8_t)(0x40 | ((v >> 8) & 0x3F));
|
---|
12 | buf[1] = (uint8_t)v;
|
---|
13 | } else if (n == 4) {
|
---|
14 | buf[0] = (uint8_t)(0x80 | ((v >> 24) & 0x3F));
|
---|
15 | buf[1] = (uint8_t)(v >> 16);
|
---|
16 | buf[2] = (uint8_t)(v >> 8);
|
---|
17 | buf[3] = (uint8_t)v;
|
---|
18 | } else {
|
---|
19 | buf[0] = (uint8_t)(0xC0 | ((v >> 56) & 0x3F));
|
---|
20 | buf[1] = (uint8_t)(v >> 48);
|
---|
21 | buf[2] = (uint8_t)(v >> 40);
|
---|
22 | buf[3] = (uint8_t)(v >> 32);
|
---|
23 | buf[4] = (uint8_t)(v >> 24);
|
---|
24 | buf[5] = (uint8_t)(v >> 16);
|
---|
25 | buf[6] = (uint8_t)(v >> 8);
|
---|
26 | buf[7] = (uint8_t)v;
|
---|
27 | }
|
---|
28 | }
|
---|
29 |
|
---|
30 | void ossl_quic_vlint_encode(uint8_t *buf, uint64_t v)
|
---|
31 | {
|
---|
32 | ossl_quic_vlint_encode_n(buf, v, ossl_quic_vlint_encode_len(v));
|
---|
33 | }
|
---|
34 |
|
---|
35 | uint64_t ossl_quic_vlint_decode_unchecked(const unsigned char *buf)
|
---|
36 | {
|
---|
37 | uint8_t first_byte = buf[0];
|
---|
38 | size_t sz = ossl_quic_vlint_decode_len(first_byte);
|
---|
39 |
|
---|
40 | if (sz == 1)
|
---|
41 | return first_byte & 0x3F;
|
---|
42 |
|
---|
43 | if (sz == 2)
|
---|
44 | return ((uint64_t)(first_byte & 0x3F) << 8)
|
---|
45 | | buf[1];
|
---|
46 |
|
---|
47 | if (sz == 4)
|
---|
48 | return ((uint64_t)(first_byte & 0x3F) << 24)
|
---|
49 | | ((uint64_t)buf[1] << 16)
|
---|
50 | | ((uint64_t)buf[2] << 8)
|
---|
51 | | buf[3];
|
---|
52 |
|
---|
53 | return ((uint64_t)(first_byte & 0x3F) << 56)
|
---|
54 | | ((uint64_t)buf[1] << 48)
|
---|
55 | | ((uint64_t)buf[2] << 40)
|
---|
56 | | ((uint64_t)buf[3] << 32)
|
---|
57 | | ((uint64_t)buf[4] << 24)
|
---|
58 | | ((uint64_t)buf[5] << 16)
|
---|
59 | | ((uint64_t)buf[6] << 8)
|
---|
60 | | buf[7];
|
---|
61 | }
|
---|
62 |
|
---|
63 | int ossl_quic_vlint_decode(const unsigned char *buf, size_t buf_len, uint64_t *v)
|
---|
64 | {
|
---|
65 | size_t dec_len;
|
---|
66 | uint64_t x;
|
---|
67 |
|
---|
68 | if (buf_len < 1)
|
---|
69 | return 0;
|
---|
70 |
|
---|
71 | dec_len = ossl_quic_vlint_decode_len(buf[0]);
|
---|
72 | if (buf_len < dec_len)
|
---|
73 | return 0;
|
---|
74 |
|
---|
75 | x = ossl_quic_vlint_decode_unchecked(buf);
|
---|
76 |
|
---|
77 | *v = x;
|
---|
78 | return dec_len;
|
---|
79 | }
|
---|
80 |
|
---|
81 | #endif
|
---|