MINOR: quic: Initialize stateless reset tokens with HKDF secrets
Add quic_stateless_reset_token_init() wrapper function around
quic_hkdf_extract_and_expand() function to derive the stateless reset tokens
attached to the connection IDs from "cluster-secret" configuration setting
and call it each time we instantiate a QUIC connection ID.
diff --git a/src/xprt_quic.c b/src/xprt_quic.c
index 0d598ce..6605be1 100644
--- a/src/xprt_quic.c
+++ b/src/xprt_quic.c
@@ -3262,6 +3262,46 @@
return 1;
}
+/* Copy into <buf> buffer a stateless reset token depending on the
+ * <salt> salt input. This is the cluster secret which will be derived
+ * as HKDF input secret to generate this token.
+ * Return 1 if succeeded, 0 if not.
+ */
+static int quic_stateless_reset_token_cpy(unsigned char *buf, size_t len,
+ const unsigned char *salt, size_t saltlen)
+{
+ /* Input secret */
+ const unsigned char *key = (const unsigned char *)global.cluster_secret;
+ size_t keylen = strlen(global.cluster_secret);
+ /* Info */
+ const unsigned char label[] = "stateless token";
+ size_t labellen = sizeof label - 1;
+
+ return quic_hkdf_extract_and_expand(EVP_sha256(), buf, len,
+ key, keylen, salt, saltlen, label, labellen);
+}
+
+/* Initialize the stateless reset token attached to <cid> connection ID.
+ * Returns 1 if succeeded, 0 if not.
+ */
+static int quic_stateless_reset_token_init(struct quic_connection_id *quic_cid)
+{
+ if (global.cluster_secret) {
+ /* Output secret */
+ unsigned char *token = quic_cid->stateless_reset_token;
+ size_t tokenlen = sizeof quic_cid->stateless_reset_token;
+ /* Salt */
+ const unsigned char *cid = quic_cid->cid.data;
+ size_t cidlen = quic_cid->cid.len;
+
+ return quic_stateless_reset_token_cpy(token, tokenlen, cid, cidlen);
+ }
+ else {
+ return RAND_bytes(quic_cid->stateless_reset_token,
+ sizeof quic_cid->stateless_reset_token) == 1;
+ }
+}
+
/* Allocate a new CID with <seq_num> as sequence number and attach it to <root>
* ebtree.
*
@@ -3282,14 +3322,12 @@
return NULL;
cid->cid.len = QUIC_HAP_CID_LEN;
- if (RAND_bytes(cid->cid.data, cid->cid.len) != 1 ||
- RAND_bytes(cid->stateless_reset_token,
- sizeof cid->stateless_reset_token) != 1) {
- fprintf(stderr, "Could not generate %d random bytes\n", cid->cid.len);
+ if (RAND_bytes(cid->cid.data, cid->cid.len) != 1)
goto err;
- }
quic_pin_cid_to_tid(cid->cid.data, tid);
+ if (quic_stateless_reset_token_init(cid) != 1)
+ goto err;
cid->qc = qc;