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
* =========================
* 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.
*/
/*
* 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
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
* =========================
{
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;
return NULL;
*len = (size_t)len_;
+ if (id != NULL)
+ *id = id_;
return b;
}
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;
+}