123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #include "internal/quic_vlint.h"
- #include "internal/e_os.h"
- #ifndef OPENSSL_NO_QUIC
- void ossl_quic_vlint_encode_n(uint8_t *buf, uint64_t v, int n)
- {
- if (n == 1) {
- buf[0] = (uint8_t)v;
- } else if (n == 2) {
- buf[0] = (uint8_t)(0x40 | ((v >> 8) & 0x3F));
- buf[1] = (uint8_t)v;
- } else if (n == 4) {
- buf[0] = (uint8_t)(0x80 | ((v >> 24) & 0x3F));
- buf[1] = (uint8_t)(v >> 16);
- buf[2] = (uint8_t)(v >> 8);
- buf[3] = (uint8_t)v;
- } else {
- buf[0] = (uint8_t)(0xC0 | ((v >> 56) & 0x3F));
- buf[1] = (uint8_t)(v >> 48);
- buf[2] = (uint8_t)(v >> 40);
- buf[3] = (uint8_t)(v >> 32);
- buf[4] = (uint8_t)(v >> 24);
- buf[5] = (uint8_t)(v >> 16);
- buf[6] = (uint8_t)(v >> 8);
- buf[7] = (uint8_t)v;
- }
- }
- void ossl_quic_vlint_encode(uint8_t *buf, uint64_t v)
- {
- ossl_quic_vlint_encode_n(buf, v, ossl_quic_vlint_encode_len(v));
- }
- uint64_t ossl_quic_vlint_decode_unchecked(const unsigned char *buf)
- {
- uint8_t first_byte = buf[0];
- size_t sz = ossl_quic_vlint_decode_len(first_byte);
- if (sz == 1)
- return first_byte & 0x3F;
- if (sz == 2)
- return ((uint64_t)(first_byte & 0x3F) << 8)
- | buf[1];
- if (sz == 4)
- return ((uint64_t)(first_byte & 0x3F) << 24)
- | ((uint64_t)buf[1] << 16)
- | ((uint64_t)buf[2] << 8)
- | buf[3];
- return ((uint64_t)(first_byte & 0x3F) << 56)
- | ((uint64_t)buf[1] << 48)
- | ((uint64_t)buf[2] << 40)
- | ((uint64_t)buf[3] << 32)
- | ((uint64_t)buf[4] << 24)
- | ((uint64_t)buf[5] << 16)
- | ((uint64_t)buf[6] << 8)
- | buf[7];
- }
- int ossl_quic_vlint_decode(const unsigned char *buf, size_t buf_len, uint64_t *v)
- {
- size_t dec_len;
- uint64_t x;
- if (buf_len < 1)
- return 0;
- dec_len = ossl_quic_vlint_decode_len(buf[0]);
- if (buf_len < dec_len)
- return 0;
- x = ossl_quic_vlint_decode_unchecked(buf);
- *v = x;
- return dec_len;
- }
- #endif
|