]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
QUIC Transport Parameters: Add CID encoder/decoder, make ID optional
authorHugo Landau <hlandau@openssl.org>
Thu, 17 Nov 2022 14:20:39 +0000 (14:20 +0000)
committerHugo Landau <hlandau@openssl.org>
Fri, 13 Jan 2023 13:20:13 +0000 (13:20 +0000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19703)

include/internal/quic_wire.h
ssl/quic/quic_wire.c

index e1d001c4e367c0b5768cef3d1cf0133011225a2f..0893d2425bd1277d76c679ba104dceba2cf8c2b4 100644 (file)
@@ -456,6 +456,14 @@ int ossl_quic_wire_encode_transport_param_int(WPACKET *pkt,
                                               uint64_t id,
                                               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
index 8bd1057d0d1bdce3384eb422dcecb8635b44c49c..b4d69f4949292eef479cae35cd36ca4633f789d8 100644 (file)
@@ -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;
+}