11#if (PC_ENABLE_HTTP3 || PC_ENABLE_DTLS)
16void pc_hkdf_extract(
const uint8_t *salt,
size_t salt_len,
const uint8_t *ikm,
size_t ikm_len,
17 uint8_t prk[PC_HKDF_HASH_LEN])
29void hkdf_expand(
const uint8_t prk[PC_HKDF_HASH_LEN],
const uint8_t *info,
size_t info_len, uint8_t *out,
32 uint8_t t[PC_HKDF_HASH_LEN];
36 while (done < out_len)
45 t_len = PC_HKDF_HASH_LEN;
47 size_t take = out_len - done;
48 if (take > PC_HKDF_HASH_LEN)
50 take = PC_HKDF_HASH_LEN;
52 memcpy(out + done, t, take);
58void pc_hkdf_expand_label_ctx(
const uint8_t secret[PC_HKDF_HASH_LEN],
const char *label,
const uint8_t *context,
59 size_t context_len, uint8_t *out,
size_t out_len,
const char *label_prefix)
70 size_t prefix_len = strnlen(label_prefix, 255);
71 size_t label_len = strnlen(label, 255 - prefix_len);
72 uint8_t info[2 + 1 + 255 + 1 + 255];
74 info[p++] = (uint8_t)(out_len >> 8);
75 info[p++] = (uint8_t)(out_len & 0xff);
76 info[p++] = (uint8_t)(prefix_len + label_len);
77 memcpy(info + p, label_prefix, prefix_len);
79 memcpy(info + p, label, label_len);
81 info[p++] = (uint8_t)context_len;
84 memcpy(info + p, context, context_len);
88 hkdf_expand(secret, info, p, out, out_len);
91void pc_hkdf_expand_label(
const uint8_t secret[PC_HKDF_HASH_LEN],
const char *label, uint8_t *out,
size_t out_len,
92 const char *label_prefix)
94 pc_hkdf_expand_label_ctx(secret, label,
nullptr, 0, out, out_len, label_prefix);
HKDF-SHA256 (RFC 5869) and TLS 1.3 HKDF-Expand-Label (RFC 8446 sec 7.1).
void pc_hmac_sha256(const uint8_t *key, size_t key_len, const uint8_t *data, size_t len, uint8_t mac[PC_HMAC_SHA256_LEN])
Compute HMAC-SHA2-256 over a single contiguous buffer.
void pc_hmac_sha256_update(pc_hmac_sha256_ctx *ctx, const uint8_t *data, size_t len)
Feed len bytes into the running HMAC.
void pc_hmac_sha256_init(pc_hmac_sha256_ctx *ctx, const uint8_t *key, size_t key_len)
Initialize a streaming HMAC-SHA2-256 context.
void pc_hmac_sha256_final(pc_hmac_sha256_ctx *ctx, uint8_t mac[PC_HMAC_SHA256_LEN])
Finalize and write the 32-byte MAC.
HMAC-SHA2-256 (RFC 2104 + FIPS 198-1) - streaming context and one-shot API.
Streaming HMAC-SHA2-256 context.