summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2022-11-17 14:20:39 +0000
committerHugo Landau <hlandau@openssl.org>2023-01-13 13:20:13 +0000
commita64d82485d52c6ae1075217e611a92522fbe6560 (patch)
tree2ea28e494a161d7e9cdcf9468fad9bf42c05af92
parent0f7b5cc9f3d487641dd5f4003e0be88fb2111e98 (diff)
QUIC Transport Parameters: Add CID encoder/decoder, make ID optional
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/19703)
-rw-r--r--include/internal/quic_wire.h26
-rw-r--r--ssl/quic/quic_wire.c36
2 files changed, 57 insertions, 5 deletions
diff --git a/include/internal/quic_wire.h b/include/internal/quic_wire.h
index e1d001c4e3..0893d2425b 100644
--- a/include/internal/quic_wire.h
+++ b/include/internal/quic_wire.h
@@ -457,6 +457,14 @@ int ossl_quic_wire_encode_transport_param_int(WPACKET *pkt,
uint64_t value);
/*
+ * Encodes a QUIC transport parameter TLV with a given ID into the WPACKET.
+ * The payload is a QUIC connection ID.
+ */
+int ossl_quic_wire_encode_transport_param_cid(WPACKET *wpkt,
+ uint64_t id,
+ const QUIC_CONN_ID *cid);
+
+/*
* QUIC Wire Format Decoding
* =========================
*
@@ -715,8 +723,8 @@ int ossl_quic_wire_peek_transport_param(PACKET *pkt, uint64_t *id);
* returned on success. This points inside the PACKET's buffer and is therefore
* valid as long as the PACKET's buffer is valid.
*
- * The transport parameter ID is written to *id and the length of the payload
- * in bytes is written to *len.
+ * The transport parameter ID is written to *id (if non-NULL) and the length of
+ * the payload in bytes is written to *len.
*
* Returns NULL on failure.
*/
@@ -727,11 +735,21 @@ const unsigned char *ossl_quic_wire_decode_transport_param_bytes(PACKET *pkt,
/*
* Decodes a QUIC transport parameter TLV containing a variable-length integer.
*
- * The transport parameter ID is written to *id and the value is written to
- * *value.
+ * The transport parameter ID is written to *id (if non-NULL) and the value is
+ * written to *value.
*/
int ossl_quic_wire_decode_transport_param_int(PACKET *pkt,
uint64_t *id,
uint64_t *value);
+/*
+ * Decodes a QUIC transport parameter TLV containing a connection ID.
+ *
+ * The transport parameter ID is written to *id (if non-NULL) and the value is
+ * written to *value.
+ */
+int ossl_quic_wire_decode_transport_param_cid(PACKET *pkt,
+ uint64_t *id,
+ QUIC_CONN_ID *cid);
+
#endif
diff --git a/ssl/quic/quic_wire.c b/ssl/quic/quic_wire.c
index 8bd1057d0d..b4d69f4949 100644
--- a/ssl/quic/quic_wire.c
+++ b/ssl/quic/quic_wire.c
@@ -408,6 +408,21 @@ int ossl_quic_wire_encode_transport_param_int(WPACKET *pkt,
return 1;
}
+int ossl_quic_wire_encode_transport_param_cid(WPACKET *wpkt,
+ uint64_t id,
+ const QUIC_CONN_ID *cid)
+{
+ if (cid->id_len > QUIC_MAX_CONN_ID_LEN)
+ return 0;
+
+ if (ossl_quic_wire_encode_transport_param_bytes(wpkt, id,
+ cid->id,
+ cid->id_len) == NULL)
+ return 0;
+
+ return 1;
+}
+
/*
* QUIC Wire Format Decoding
* =========================
@@ -847,8 +862,9 @@ const unsigned char *ossl_quic_wire_decode_transport_param_bytes(PACKET *pkt,
{
uint64_t len_;
const unsigned char *b = NULL;
+ uint64_t id_;
- if (!PACKET_get_quic_vlint(pkt, id)
+ if (!PACKET_get_quic_vlint(pkt, &id_)
|| !PACKET_get_quic_vlint(pkt, &len_))
return NULL;
@@ -857,6 +873,8 @@ const unsigned char *ossl_quic_wire_decode_transport_param_bytes(PACKET *pkt,
return NULL;
*len = (size_t)len_;
+ if (id != NULL)
+ *id = id_;
return b;
}
@@ -876,3 +894,19 @@ int ossl_quic_wire_decode_transport_param_int(PACKET *pkt,
return 1;
}
+
+int ossl_quic_wire_decode_transport_param_cid(PACKET *pkt,
+ uint64_t *id,
+ QUIC_CONN_ID *cid)
+{
+ const unsigned char *body;
+ size_t len = 0;
+
+ body = ossl_quic_wire_decode_transport_param_bytes(pkt, id, &len);
+ if (body == NULL || len > QUIC_MAX_CONN_ID_LEN)
+ return 0;
+
+ cid->id_len = (unsigned char)len;
+ memcpy(cid->id, body, cid->id_len);
+ return 1;
+}