mirror of
https://github.com/openssl/openssl.git
synced 2024-12-21 06:09:35 +08:00
416d0a638c
Reviewed-by: Tim Hudson <tjh@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/18382)
78 lines
2.0 KiB
C
78 lines
2.0 KiB
C
#include "internal/quic_vlint.h"
|
|
#include "internal/e_os.h"
|
|
|
|
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;
|
|
}
|