DeterministicESPAsyncWebServer v6.27.1
Zero-allocation, bounded-execution async HTTP server for ESP32
Loading...
Searching...
No Matches
quic_varint.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4/**
5 * @file quic_varint.cpp
6 * @brief QUIC variable-length integer coding - implementation. See quic_varint.h.
7 */
8
10
11#if DETWS_ENABLE_HTTP3
12
13size_t quic_varint_len(uint64_t value)
14{
15 if (value <= 0x3F)
16 return 1;
17 if (value <= 0x3FFF)
18 return 2;
19 if (value <= 0x3FFFFFFF)
20 return 4;
21 if (value <= QUIC_VARINT_MAX)
22 return 8;
23 return 0;
24}
25
26size_t quic_varint_encode(uint8_t *out, size_t cap, uint64_t value)
27{
28 size_t n = quic_varint_len(value);
29 if (n == 0 || cap < n)
30 return 0;
31 // The 2-bit length prefix (log2 n) sits in the top bits of the first byte.
32 static const uint8_t prefix[9] = {0, 0x00, 0x40, 0, 0x80, 0, 0, 0, 0xC0};
33 for (size_t i = 0; i < n; i++)
34 out[n - 1 - i] = (uint8_t)(value >> (8 * i));
35 out[0] |= prefix[n];
36 return n;
37}
38
39bool quic_varint_decode(const uint8_t *in, size_t len, uint64_t *value, size_t *consumed)
40{
41 if (len < 1)
42 return false;
43 size_t n = (size_t)1 << (in[0] >> 6); // 1, 2, 4, or 8
44 if (len < n)
45 return false;
46 uint64_t v = (uint64_t)(in[0] & 0x3F);
47 for (size_t i = 1; i < n; i++)
48 v = (v << 8) | in[i];
49 *value = v;
50 *consumed = n;
51 return true;
52}
53
54#endif // DETWS_ENABLE_HTTP3
QUIC variable-length integer coding (RFC 9000 sec 16).