Home | History | Annotate | Line # | Download | only in internal
      1 /*
      2  * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 #ifndef OSSL_INTERNAL_QUIC_WIRE_H
     11 #define OSSL_INTERNAL_QUIC_WIRE_H
     12 #pragma once
     13 
     14 #include "internal/e_os.h"
     15 #include "internal/time.h"
     16 #include "internal/quic_types.h"
     17 #include "internal/packet_quic.h"
     18 
     19 #ifndef OPENSSL_NO_QUIC
     20 
     21 #define OSSL_QUIC_FRAME_TYPE_PADDING 0x00
     22 #define OSSL_QUIC_FRAME_TYPE_PING 0x01
     23 #define OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN 0x02
     24 #define OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN 0x03
     25 #define OSSL_QUIC_FRAME_TYPE_RESET_STREAM 0x04
     26 #define OSSL_QUIC_FRAME_TYPE_STOP_SENDING 0x05
     27 #define OSSL_QUIC_FRAME_TYPE_CRYPTO 0x06
     28 #define OSSL_QUIC_FRAME_TYPE_NEW_TOKEN 0x07
     29 #define OSSL_QUIC_FRAME_TYPE_MAX_DATA 0x10
     30 #define OSSL_QUIC_FRAME_TYPE_MAX_STREAM_DATA 0x11
     31 #define OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI 0x12
     32 #define OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_UNI 0x13
     33 #define OSSL_QUIC_FRAME_TYPE_DATA_BLOCKED 0x14
     34 #define OSSL_QUIC_FRAME_TYPE_STREAM_DATA_BLOCKED 0x15
     35 #define OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI 0x16
     36 #define OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_UNI 0x17
     37 #define OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID 0x18
     38 #define OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID 0x19
     39 #define OSSL_QUIC_FRAME_TYPE_PATH_CHALLENGE 0x1A
     40 #define OSSL_QUIC_FRAME_TYPE_PATH_RESPONSE 0x1B
     41 #define OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT 0x1C
     42 #define OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP 0x1D
     43 #define OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE 0x1E
     44 
     45 #define OSSL_QUIC_FRAME_FLAG_STREAM_FIN 0x01
     46 #define OSSL_QUIC_FRAME_FLAG_STREAM_LEN 0x02
     47 #define OSSL_QUIC_FRAME_FLAG_STREAM_OFF 0x04
     48 #define OSSL_QUIC_FRAME_FLAG_STREAM_MASK ((uint64_t)0x07)
     49 
     50 /* Low 3 bits of the type contain flags */
     51 #define OSSL_QUIC_FRAME_TYPE_STREAM 0x08 /* base ID */
     52 #define OSSL_QUIC_FRAME_TYPE_STREAM_FIN \
     53     (OSSL_QUIC_FRAME_TYPE_STREAM | OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
     54 #define OSSL_QUIC_FRAME_TYPE_STREAM_LEN \
     55     (OSSL_QUIC_FRAME_TYPE_STREAM | OSSL_QUIC_FRAME_FLAG_STREAM_LEN)
     56 #define OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN \
     57     (OSSL_QUIC_FRAME_TYPE_STREAM | OSSL_QUIC_FRAME_FLAG_STREAM_LEN | OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
     58 #define OSSL_QUIC_FRAME_TYPE_STREAM_OFF \
     59     (OSSL_QUIC_FRAME_TYPE_STREAM | OSSL_QUIC_FRAME_FLAG_STREAM_OFF)
     60 #define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN \
     61     (OSSL_QUIC_FRAME_TYPE_STREAM | OSSL_QUIC_FRAME_FLAG_STREAM_OFF | OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
     62 #define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN \
     63     (OSSL_QUIC_FRAME_TYPE_STREAM | OSSL_QUIC_FRAME_FLAG_STREAM_OFF | OSSL_QUIC_FRAME_FLAG_STREAM_LEN)
     64 #define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN \
     65     (OSSL_QUIC_FRAME_TYPE_STREAM | OSSL_QUIC_FRAME_FLAG_STREAM_OFF | OSSL_QUIC_FRAME_FLAG_STREAM_LEN | OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
     66 
     67 #define OSSL_QUIC_FRAME_TYPE_IS_STREAM(x) \
     68     (((x) & ~OSSL_QUIC_FRAME_FLAG_STREAM_MASK) == OSSL_QUIC_FRAME_TYPE_STREAM)
     69 #define OSSL_QUIC_FRAME_TYPE_IS_ACK(x) \
     70     (((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
     71 #define OSSL_QUIC_FRAME_TYPE_IS_MAX_STREAMS(x) \
     72     (((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI)
     73 #define OSSL_QUIC_FRAME_TYPE_IS_STREAMS_BLOCKED(x) \
     74     (((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI)
     75 #define OSSL_QUIC_FRAME_TYPE_IS_CONN_CLOSE(x) \
     76     (((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT)
     77 
     78 const char *ossl_quic_frame_type_to_string(uint64_t frame_type);
     79 
     80 static ossl_unused ossl_inline int
     81 ossl_quic_frame_type_is_ack_eliciting(uint64_t frame_type)
     82 {
     83     switch (frame_type) {
     84     case OSSL_QUIC_FRAME_TYPE_PADDING:
     85     case OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN:
     86     case OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN:
     87     case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT:
     88     case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP:
     89         return 0;
     90     default:
     91         return 1;
     92     }
     93 }
     94 
     95 /* QUIC Transport Parameter Types */
     96 #define QUIC_TPARAM_ORIG_DCID 0x00
     97 #define QUIC_TPARAM_MAX_IDLE_TIMEOUT 0x01
     98 #define QUIC_TPARAM_STATELESS_RESET_TOKEN 0x02
     99 #define QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE 0x03
    100 #define QUIC_TPARAM_INITIAL_MAX_DATA 0x04
    101 #define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05
    102 #define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06
    103 #define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07
    104 #define QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI 0x08
    105 #define QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI 0x09
    106 #define QUIC_TPARAM_ACK_DELAY_EXP 0x0A
    107 #define QUIC_TPARAM_MAX_ACK_DELAY 0x0B
    108 #define QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION 0x0C
    109 #define QUIC_TPARAM_PREFERRED_ADDR 0x0D
    110 #define QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT 0x0E
    111 #define QUIC_TPARAM_INITIAL_SCID 0x0F
    112 #define QUIC_TPARAM_RETRY_SCID 0x10
    113 
    114 /*
    115  * QUIC Frame Logical Representations
    116  * ==================================
    117  */
    118 
    119 /* QUIC Frame: ACK */
    120 typedef struct ossl_quic_ack_range_st {
    121     /*
    122      * Represents an inclusive range of packet numbers [start, end].
    123      * start must be <= end.
    124      */
    125     QUIC_PN start, end;
    126 } OSSL_QUIC_ACK_RANGE;
    127 
    128 typedef struct ossl_quic_frame_ack_st {
    129     /*
    130      * A sequence of packet number ranges [[start, end]...].
    131      *
    132      * The ranges must be sorted in descending order, for example:
    133      *      [ 95, 100]
    134      *      [ 90,  92]
    135      *      etc.
    136      *
    137      * As such, ack_ranges[0].end is always the highest packet number
    138      * being acknowledged and ack_ranges[num_ack_ranges-1].start is
    139      * always the lowest packet number being acknowledged.
    140      *
    141      * num_ack_ranges must be greater than zero, as an ACK frame must
    142      * acknowledge at least one packet number.
    143      */
    144     OSSL_QUIC_ACK_RANGE *ack_ranges;
    145     size_t num_ack_ranges;
    146 
    147     OSSL_TIME delay_time;
    148     uint64_t ect0, ect1, ecnce;
    149     unsigned int ecn_present : 1;
    150 } OSSL_QUIC_FRAME_ACK;
    151 
    152 /* Returns 1 if the given frame contains the given PN. */
    153 int ossl_quic_frame_ack_contains_pn(const OSSL_QUIC_FRAME_ACK *ack, QUIC_PN pn);
    154 
    155 /* QUIC Frame: STREAM */
    156 typedef struct ossl_quic_frame_stream_st {
    157     uint64_t stream_id; /* Stream ID */
    158     uint64_t offset; /* Logical offset in stream */
    159     uint64_t len; /* Length of data in bytes */
    160     const unsigned char *data;
    161 
    162     /*
    163      * On encode, this determines whether the len field should be encoded or
    164      * not. If zero, the len field is not encoded and it is assumed the frame
    165      * runs to the end of the packet.
    166      *
    167      * On decode, this determines whether the frame had an explicitly encoded
    168      * length. If not set, the frame runs to the end of the packet and len has
    169      * been set accordingly.
    170      */
    171     unsigned int has_explicit_len : 1;
    172 
    173     /* 1 if this is the end of the stream */
    174     unsigned int is_fin : 1;
    175 } OSSL_QUIC_FRAME_STREAM;
    176 
    177 /* QUIC Frame: CRYPTO */
    178 typedef struct ossl_quic_frame_crypto_st {
    179     uint64_t offset; /* Logical offset in stream */
    180     uint64_t len; /* Length of the data in bytes */
    181     const unsigned char *data;
    182 } OSSL_QUIC_FRAME_CRYPTO;
    183 
    184 /* QUIC Frame: RESET_STREAM */
    185 typedef struct ossl_quic_frame_reset_stream_st {
    186     uint64_t stream_id;
    187     uint64_t app_error_code;
    188     uint64_t final_size;
    189 } OSSL_QUIC_FRAME_RESET_STREAM;
    190 
    191 /* QUIC Frame: STOP_SENDING */
    192 typedef struct ossl_quic_frame_stop_sending_st {
    193     uint64_t stream_id;
    194     uint64_t app_error_code;
    195 } OSSL_QUIC_FRAME_STOP_SENDING;
    196 
    197 /* QUIC Frame: NEW_CONNECTION_ID */
    198 typedef struct ossl_quic_frame_new_conn_id_st {
    199     uint64_t seq_num;
    200     uint64_t retire_prior_to;
    201     QUIC_CONN_ID conn_id;
    202     QUIC_STATELESS_RESET_TOKEN stateless_reset;
    203 } OSSL_QUIC_FRAME_NEW_CONN_ID;
    204 
    205 /* QUIC Frame: CONNECTION_CLOSE */
    206 typedef struct ossl_quic_frame_conn_close_st {
    207     unsigned int is_app : 1; /* 0: transport error, 1: app error */
    208     uint64_t error_code; /* 62-bit transport or app error code */
    209     uint64_t frame_type; /* transport errors only */
    210     char *reason; /* UTF-8 string, not necessarily zero-terminated */
    211     size_t reason_len; /* Length of reason in bytes */
    212 } OSSL_QUIC_FRAME_CONN_CLOSE;
    213 
    214 /*
    215  * QUIC Wire Format Encoding
    216  * =========================
    217  *
    218  * These functions return 1 on success and 0 on failure.
    219  */
    220 
    221 /*
    222  * Encodes zero or more QUIC PADDING frames to the packet writer. Each PADDING
    223  * frame consumes one byte; num_bytes specifies the number of bytes of padding
    224  * to write.
    225  */
    226 int ossl_quic_wire_encode_padding(WPACKET *pkt, size_t num_bytes);
    227 
    228 /*
    229  * Encodes a QUIC PING frame to the packet writer. This frame type takes
    230  * no arguments.
    231  */
    232 int ossl_quic_wire_encode_frame_ping(WPACKET *pkt);
    233 
    234 /*
    235  * Encodes a QUIC ACK frame to the packet writer, given a logical representation
    236  * of the ACK frame.
    237  *
    238  * The ACK ranges passed must be sorted in descending order.
    239  *
    240  * The logical representation stores a list of packet number ranges. The wire
    241  * encoding is slightly different and stores the first range in the list
    242  * in a different manner.
    243  *
    244  * The ack_delay_exponent argument specifies the index of a power of two by
    245  * which the ack->ack_delay field is be divided. This exponent value must match
    246  * the value used when decoding.
    247  */
    248 int ossl_quic_wire_encode_frame_ack(WPACKET *pkt,
    249     uint32_t ack_delay_exponent,
    250     const OSSL_QUIC_FRAME_ACK *ack);
    251 
    252 /*
    253  * Encodes a QUIC RESET_STREAM frame to the packet writer, given a logical
    254  * representation of the RESET_STREAM frame.
    255  */
    256 int ossl_quic_wire_encode_frame_reset_stream(WPACKET *pkt,
    257     const OSSL_QUIC_FRAME_RESET_STREAM *f);
    258 
    259 /*
    260  * Encodes a QUIC STOP_SENDING frame to the packet writer, given a logical
    261  * representation of the STOP_SENDING frame.
    262  */
    263 int ossl_quic_wire_encode_frame_stop_sending(WPACKET *pkt,
    264     const OSSL_QUIC_FRAME_STOP_SENDING *f);
    265 
    266 /*
    267  * Encodes a QUIC CRYPTO frame header to the packet writer.
    268  *
    269  * To create a well-formed frame, the data written using this function must be
    270  * immediately followed by f->len bytes of data.
    271  */
    272 int ossl_quic_wire_encode_frame_crypto_hdr(WPACKET *hdr,
    273     const OSSL_QUIC_FRAME_CRYPTO *f);
    274 
    275 /*
    276  * Returns the number of bytes which will be required to encode the given
    277  * CRYPTO frame header. Does not include the payload bytes in the count.
    278  * Returns 0 if input is invalid.
    279  */
    280 size_t ossl_quic_wire_get_encoded_frame_len_crypto_hdr(const OSSL_QUIC_FRAME_CRYPTO *f);
    281 
    282 /*
    283  * Encodes a QUIC CRYPTO frame to the packet writer.
    284  *
    285  * This function returns a pointer to a buffer of f->len bytes which the caller
    286  * should fill however it wishes. If f->data is non-NULL, it is automatically
    287  * copied to the target buffer, otherwise the caller must fill the returned
    288  * buffer. Returns NULL on failure.
    289  */
    290 void *ossl_quic_wire_encode_frame_crypto(WPACKET *pkt,
    291     const OSSL_QUIC_FRAME_CRYPTO *f);
    292 
    293 /*
    294  * Encodes a QUIC NEW_TOKEN frame to the packet writer.
    295  */
    296 int ossl_quic_wire_encode_frame_new_token(WPACKET *pkt,
    297     const unsigned char *token,
    298     size_t token_len);
    299 
    300 /*
    301  * Encodes a QUIC STREAM frame's header to the packet writer. The f->stream_id,
    302  * f->offset and f->len fields are the values for the respective Stream ID,
    303  * Offset and Length fields.
    304  *
    305  * If f->is_fin is non-zero, the frame is marked as the final frame in the
    306  * stream.
    307  *
    308  * If f->has_explicit_len is zerro, the frame is assumed to be the final frame
    309  * in the packet, which the caller is responsible for ensuring; the Length
    310  * field is then omitted.
    311  *
    312  * To create a well-formed frame, the data written using this function must be
    313  * immediately followed by f->len bytes of stream data.
    314  */
    315 int ossl_quic_wire_encode_frame_stream_hdr(WPACKET *pkt,
    316     const OSSL_QUIC_FRAME_STREAM *f);
    317 
    318 /*
    319  * Returns the number of bytes which will be required to encode the given
    320  * STREAM frame header. Does not include the payload bytes in the count.
    321  * Returns 0 if input is invalid.
    322  */
    323 size_t ossl_quic_wire_get_encoded_frame_len_stream_hdr(const OSSL_QUIC_FRAME_STREAM *f);
    324 
    325 /*
    326  * Functions similarly to ossl_quic_wire_encode_frame_stream_hdr, but it also
    327  * allocates space for f->len bytes of data after the header, creating a
    328  * well-formed QUIC STREAM frame in one call.
    329  *
    330  * A pointer to the bytes allocated for the framme payload is returned,
    331  * which the caller can fill however it wishes. If f->data is non-NULL,
    332  * it is automatically copied to the target buffer, otherwise the caller
    333  * must fill the returned buffer. Returns NULL on failure.
    334  */
    335 void *ossl_quic_wire_encode_frame_stream(WPACKET *pkt,
    336     const OSSL_QUIC_FRAME_STREAM *f);
    337 
    338 /*
    339  * Encodes a QUIC MAX_DATA frame to the packet writer.
    340  */
    341 int ossl_quic_wire_encode_frame_max_data(WPACKET *pkt,
    342     uint64_t max_data);
    343 
    344 /*
    345  * Encodes a QUIC MAX_STREAM_DATA frame to the packet writer.
    346  */
    347 int ossl_quic_wire_encode_frame_max_stream_data(WPACKET *pkt,
    348     uint64_t stream_id,
    349     uint64_t max_data);
    350 
    351 /*
    352  * Encodes a QUIC MAX_STREAMS frame to the packet writer.
    353  *
    354  * If is_uni is 0, the count specifies the maximum number of
    355  * bidirectional streams; else it specifies the maximum number of unidirectional
    356  * streams.
    357  */
    358 int ossl_quic_wire_encode_frame_max_streams(WPACKET *pkt,
    359     char is_uni,
    360     uint64_t max_streams);
    361 
    362 /*
    363  * Encodes a QUIC DATA_BLOCKED frame to the packet writer.
    364  */
    365 int ossl_quic_wire_encode_frame_data_blocked(WPACKET *pkt,
    366     uint64_t max_data);
    367 
    368 /*
    369  * Encodes a QUIC STREAM_DATA_BLOCKED frame to the packet writer.
    370  */
    371 int ossl_quic_wire_encode_frame_stream_data_blocked(WPACKET *pkt,
    372     uint64_t stream_id,
    373     uint64_t max_stream_data);
    374 /*
    375  * Encodes a QUIC STREAMS_BLOCKED frame to the packet writer.
    376  *
    377  * If is_uni is 0, the count specifies the maximum number of
    378  * bidirectional streams; else it specifies the maximum number of unidirectional
    379  * streams.
    380  */
    381 int ossl_quic_wire_encode_frame_streams_blocked(WPACKET *pkt,
    382     char is_uni,
    383     uint64_t max_streams);
    384 
    385 /*
    386  * Encodes a QUIC NEW_CONNECTION_ID frame to the packet writer, given a logical
    387  * representation of the NEW_CONNECTION_ID frame.
    388  *
    389  * The buffer pointed to by the conn_id field must be valid for the duration of
    390  * the call.
    391  */
    392 int ossl_quic_wire_encode_frame_new_conn_id(WPACKET *pkt,
    393     const OSSL_QUIC_FRAME_NEW_CONN_ID *f);
    394 
    395 /*
    396  * Encodes a QUIC RETIRE_CONNECTION_ID frame to the packet writer.
    397  */
    398 int ossl_quic_wire_encode_frame_retire_conn_id(WPACKET *pkt,
    399     uint64_t seq_num);
    400 
    401 /*
    402  * Encodes a QUIC PATH_CHALLENGE frame to the packet writer.
    403  */
    404 int ossl_quic_wire_encode_frame_path_challenge(WPACKET *pkt,
    405     uint64_t data);
    406 
    407 /*
    408  * Encodes a QUIC PATH_RESPONSE frame to the packet writer.
    409  */
    410 int ossl_quic_wire_encode_frame_path_response(WPACKET *pkt,
    411     uint64_t data);
    412 
    413 /*
    414  * Encodes a QUIC CONNECTION_CLOSE frame to the packet writer, given a logical
    415  * representation of the CONNECTION_CLOSE frame.
    416  *
    417  * The reason field may be NULL, in which case no reason is encoded. If the
    418  * reason field is non-NULL, it must point to a valid UTF-8 string and
    419  * reason_len must be set to the length of the reason string in bytes. The
    420  * reason string need not be zero terminated.
    421  */
    422 int ossl_quic_wire_encode_frame_conn_close(WPACKET *pkt,
    423     const OSSL_QUIC_FRAME_CONN_CLOSE *f);
    424 
    425 /*
    426  * Encodes a QUIC HANDSHAKE_DONE frame to the packet writer. This frame type
    427  * takes no arguiments.
    428  */
    429 int ossl_quic_wire_encode_frame_handshake_done(WPACKET *pkt);
    430 
    431 /*
    432  * Encodes a QUIC transport parameter TLV with the given ID into the WPACKET.
    433  * The payload is an arbitrary buffer.
    434  *
    435  * If value is non-NULL, the value is copied into the packet.
    436  * If it is NULL, value_len bytes are allocated for the payload and the caller
    437  * should fill the buffer using the returned pointer.
    438  *
    439  * Returns a pointer to the start of the payload on success, or NULL on failure.
    440  */
    441 unsigned char *ossl_quic_wire_encode_transport_param_bytes(WPACKET *pkt,
    442     uint64_t id,
    443     const unsigned char *value,
    444     size_t value_len);
    445 
    446 /*
    447  * Encodes a QUIC transport parameter TLV with the given ID into the WPACKET.
    448  * The payload is a QUIC variable-length integer with the given value.
    449  */
    450 int ossl_quic_wire_encode_transport_param_int(WPACKET *pkt,
    451     uint64_t id,
    452     uint64_t value);
    453 
    454 /*
    455  * Encodes a QUIC transport parameter TLV with a given ID into the WPACKET.
    456  * The payload is a QUIC connection ID.
    457  */
    458 int ossl_quic_wire_encode_transport_param_cid(WPACKET *wpkt,
    459     uint64_t id,
    460     const QUIC_CONN_ID *cid);
    461 
    462 /*
    463  * QUIC Wire Format Decoding
    464  * =========================
    465  *
    466  * These functions return 1 on success or 0 for failure. Typical reasons
    467  * why these functions may fail include:
    468  *
    469  *   - A frame decode function is called but the frame in the PACKET's buffer
    470  *     is not of the correct type.
    471  *
    472  *   - A variable-length field in the encoded frame appears to exceed the bounds
    473  *     of the PACKET's buffer.
    474  *
    475  * These functions should be called with the PACKET pointing to the start of the
    476  * frame (including the initial type field), and consume an entire frame
    477  * including its type field. The expectation is that the caller will have
    478  * already discerned the frame type using ossl_quic_wire_peek_frame_header().
    479  */
    480 
    481 /*
    482  * Decodes the type field header of a QUIC frame (without advancing the current
    483  * position). This can be used to determine the frame type and determine which
    484  * frame decoding function to call.
    485  */
    486 int ossl_quic_wire_peek_frame_header(PACKET *pkt, uint64_t *type,
    487     int *was_minimal);
    488 
    489 /*
    490  * Like ossl_quic_wire_peek_frame_header, but advances the current position
    491  * so that the type field is consumed. For advanced use only.
    492  */
    493 int ossl_quic_wire_skip_frame_header(PACKET *pkt, uint64_t *type);
    494 
    495 /*
    496  * Determines how many ranges are needed to decode a QUIC ACK frame.
    497  *
    498  * The number of ranges which must be allocated before the call to
    499  * ossl_quic_wire_decode_frame_ack is written to *total_ranges.
    500  *
    501  * The PACKET is not advanced.
    502  */
    503 int ossl_quic_wire_peek_frame_ack_num_ranges(const PACKET *pkt,
    504     uint64_t *total_ranges);
    505 
    506 /*
    507  * Decodes a QUIC ACK frame. The ack_ranges field of the passed structure should
    508  * point to a preallocated array of ACK ranges and the num_ack_ranges field
    509  * should specify the length of allocation.
    510  *
    511  * *total_ranges is written with the number of ranges in the decoded frame,
    512  * which may be greater than the number of ranges which were decoded (i.e. if
    513  * num_ack_ranges was too small to decode all ranges).
    514  *
    515  * On success, this function modifies the num_ack_ranges field to indicate the
    516  * number of ranges in the decoded frame. This is the number of entries in the
    517  * ACK ranges array written by this function; any additional entries are not
    518  * modified.
    519  *
    520  * If the number of ACK ranges in the decoded frame exceeds that in
    521  * num_ack_ranges, as many ACK ranges as possible are decoded into the range
    522  * array. The caller can use the value written to *total_ranges to detect this
    523  * condition, as *total_ranges will exceed num_ack_ranges.
    524  *
    525  * If ack is NULL, the frame is still decoded, but only *total_ranges is
    526  * written. This can be used to determine the number of ranges which must be
    527  * allocated.
    528  *
    529  * The ack_delay_exponent argument specifies the index of a power of two used to
    530  * decode the ack_delay field. This must match the ack_delay_exponent value used
    531  * to encode the frame.
    532  */
    533 int ossl_quic_wire_decode_frame_ack(PACKET *pkt,
    534     uint32_t ack_delay_exponent,
    535     OSSL_QUIC_FRAME_ACK *ack,
    536     uint64_t *total_ranges);
    537 
    538 /*
    539  * Decodes a QUIC RESET_STREAM frame.
    540  */
    541 int ossl_quic_wire_decode_frame_reset_stream(PACKET *pkt,
    542     OSSL_QUIC_FRAME_RESET_STREAM *f);
    543 
    544 /*
    545  * Decodes a QUIC STOP_SENDING frame.
    546  */
    547 int ossl_quic_wire_decode_frame_stop_sending(PACKET *pkt,
    548     OSSL_QUIC_FRAME_STOP_SENDING *f);
    549 
    550 /*
    551  * Decodes a QUIC CRYPTO frame.
    552  *
    553  * f->data is set to point inside the packet buffer inside the PACKET, therefore
    554  * it is safe to access for as long as the packet buffer exists. If nodata is
    555  * set to 1 then reading the PACKET stops after the frame header and f->data is
    556  * set to NULL.
    557  */
    558 int ossl_quic_wire_decode_frame_crypto(PACKET *pkt, int nodata,
    559     OSSL_QUIC_FRAME_CRYPTO *f);
    560 
    561 /*
    562  * Decodes a QUIC NEW_TOKEN frame. *token is written with a pointer to the token
    563  * bytes and *token_len is written with the length of the token in bytes.
    564  */
    565 int ossl_quic_wire_decode_frame_new_token(PACKET *pkt,
    566     const unsigned char **token,
    567     size_t *token_len);
    568 
    569 /*
    570  * Decodes a QUIC STREAM frame.
    571  *
    572  * If nodata is set to 1 then reading the PACKET stops after the frame header
    573  * and f->data is set to NULL. In this case f->len will also be 0 in the event
    574  * that "has_explicit_len" is 0.
    575  *
    576  * If the frame did not contain an offset field, f->offset is set to 0, as the
    577  * absence of an offset field is equivalent to an offset of 0.
    578  *
    579  * If the frame contained a length field, f->has_explicit_len is set to 1 and
    580  * the length of the data is placed in f->len. This function ensures that the
    581  * length does not exceed the packet buffer, thus it is safe to access f->data.
    582  *
    583  * If the frame did not contain a length field, this means that the frame runs
    584  * until the end of the packet. This function sets f->has_explicit_len to zero,
    585  * and f->len to the amount of data remaining in the input buffer. Therefore,
    586  * this function should be used with a PACKET representing a single packet (and
    587  * not e.g. multiple packets).
    588  *
    589  * Note also that this means f->len is always valid after this function returns
    590  * successfully, regardless of the value of f->has_explicit_len.
    591  *
    592  * f->data points inside the packet buffer inside the PACKET, therefore it is
    593  * safe to access for as long as the packet buffer exists.
    594  *
    595  * f->is_fin is set according to whether the frame was marked as ending the
    596  * stream.
    597  */
    598 int ossl_quic_wire_decode_frame_stream(PACKET *pkt, int nodata,
    599     OSSL_QUIC_FRAME_STREAM *f);
    600 
    601 /*
    602  * Decodes a QUIC MAX_DATA frame. The Maximum Data field is written to
    603  * *max_data.
    604  */
    605 int ossl_quic_wire_decode_frame_max_data(PACKET *pkt,
    606     uint64_t *max_data);
    607 
    608 /*
    609  * Decodes a QUIC MAX_STREAM_DATA frame. The Stream ID is written to *stream_id
    610  * and Maximum Stream Data field is written to *max_stream_data.
    611  */
    612 int ossl_quic_wire_decode_frame_max_stream_data(PACKET *pkt,
    613     uint64_t *stream_id,
    614     uint64_t *max_stream_data);
    615 /*
    616  * Decodes a QUIC MAX_STREAMS frame. The Maximum Streams field is written to
    617  * *max_streams.
    618  *
    619  * Whether the limit concerns bidirectional streams or unidirectional streams is
    620  * denoted by the frame type; the caller should examine the frame type to
    621  * determine this.
    622  */
    623 int ossl_quic_wire_decode_frame_max_streams(PACKET *pkt,
    624     uint64_t *max_streams);
    625 
    626 /*
    627  * Decodes a QUIC DATA_BLOCKED frame. The Maximum Data field is written to
    628  * *max_data.
    629  */
    630 int ossl_quic_wire_decode_frame_data_blocked(PACKET *pkt,
    631     uint64_t *max_data);
    632 
    633 /*
    634  * Decodes a QUIC STREAM_DATA_BLOCKED frame. The Stream ID and Maximum Stream
    635  * Data fields are written to *stream_id and *max_stream_data respectively.
    636  */
    637 int ossl_quic_wire_decode_frame_stream_data_blocked(PACKET *pkt,
    638     uint64_t *stream_id,
    639     uint64_t *max_stream_data);
    640 
    641 /*
    642  * Decodes a QUIC STREAMS_BLOCKED frame. The Maximum Streams field is written to
    643  * *max_streams.
    644  *
    645  * Whether the limit concerns bidirectional streams or unidirectional streams is
    646  * denoted by the frame type; the caller should examine the frame type to
    647  * determine this.
    648  */
    649 int ossl_quic_wire_decode_frame_streams_blocked(PACKET *pkt,
    650     uint64_t *max_streams);
    651 
    652 /*
    653  * Decodes a QUIC NEW_CONNECTION_ID frame. The logical representation of the
    654  * frame is written to *f.
    655  *
    656  * The conn_id field is set to point to the connection ID string inside the
    657  * packet buffer; it is therefore valid for as long as the PACKET's buffer is
    658  * valid. The conn_id_len field is set to the length of the connection ID string
    659  * in bytes.
    660  */
    661 int ossl_quic_wire_decode_frame_new_conn_id(PACKET *pkt,
    662     OSSL_QUIC_FRAME_NEW_CONN_ID *f);
    663 
    664 /*
    665  * Decodes a QUIC RETIRE_CONNECTION_ID frame. The Sequence Number field
    666  * is written to *seq_num.
    667  */
    668 int ossl_quic_wire_decode_frame_retire_conn_id(PACKET *pkt,
    669     uint64_t *seq_num);
    670 
    671 /*
    672  * Decodes a QUIC PATH_CHALLENGE frame. The Data field is written to *data.
    673  */
    674 int ossl_quic_wire_decode_frame_path_challenge(PACKET *pkt,
    675     uint64_t *data);
    676 
    677 /*
    678  * Decodes a QUIC PATH_CHALLENGE frame. The Data field is written to *data.
    679  */
    680 int ossl_quic_wire_decode_frame_path_response(PACKET *pkt,
    681     uint64_t *data);
    682 
    683 /*
    684  * Decodes a QUIC CONNECTION_CLOSE frame. The logical representation
    685  * of the frame is written to *f.
    686  *
    687  * The reason field is set to point to the UTF-8 reason string inside
    688  * the packet buffer; it is therefore valid for as long as the PACKET's
    689  * buffer is valid. The reason_len field is set to the length of the
    690  * reason string in bytes.
    691  *
    692  * IMPORTANT: The reason string is not zero-terminated.
    693  *
    694  * Returns 1 on success or 0 on failure.
    695  */
    696 int ossl_quic_wire_decode_frame_conn_close(PACKET *pkt,
    697     OSSL_QUIC_FRAME_CONN_CLOSE *f);
    698 
    699 /*
    700  * Decodes one or more PADDING frames. PADDING frames have no arguments.
    701  *
    702  * Returns the number of PADDING frames decoded or 0 on error.
    703  */
    704 size_t ossl_quic_wire_decode_padding(PACKET *pkt);
    705 
    706 /*
    707  * Decodes a PING frame. The frame has no arguments.
    708  */
    709 int ossl_quic_wire_decode_frame_ping(PACKET *pkt);
    710 
    711 /*
    712  * Decodes a HANDSHAKE_DONE frame. The frame has no arguments.
    713  */
    714 int ossl_quic_wire_decode_frame_handshake_done(PACKET *pkt);
    715 
    716 /*
    717  * Peeks at the ID of the next QUIC transport parameter TLV in the stream.
    718  * The ID is written to *id.
    719  */
    720 int ossl_quic_wire_peek_transport_param(PACKET *pkt, uint64_t *id);
    721 
    722 /*
    723  * Decodes a QUIC transport parameter TLV. A pointer to the value buffer is
    724  * returned on success. This points inside the PACKET's buffer and is therefore
    725  * valid as long as the PACKET's buffer is valid.
    726  *
    727  * The transport parameter ID is written to *id (if non-NULL) and the length of
    728  * the payload in bytes is written to *len.
    729  *
    730  * Returns NULL on failure.
    731  */
    732 const unsigned char *ossl_quic_wire_decode_transport_param_bytes(PACKET *pkt,
    733     uint64_t *id,
    734     size_t *len);
    735 
    736 /*
    737  * Decodes a QUIC transport parameter TLV containing a variable-length integer.
    738  *
    739  * The transport parameter ID is written to *id (if non-NULL) and the value is
    740  * written to *value.
    741  */
    742 int ossl_quic_wire_decode_transport_param_int(PACKET *pkt,
    743     uint64_t *id,
    744     uint64_t *value);
    745 
    746 /*
    747  * Decodes a QUIC transport parameter TLV containing a connection ID.
    748  *
    749  * The transport parameter ID is written to *id (if non-NULL) and the value is
    750  * written to *value.
    751  */
    752 int ossl_quic_wire_decode_transport_param_cid(PACKET *pkt,
    753     uint64_t *id,
    754     QUIC_CONN_ID *cid);
    755 
    756 /*
    757  * Decodes a QUIC transport parameter TLV containing a preferred_address.
    758  */
    759 typedef struct quic_preferred_addr_st {
    760     uint16_t ipv4_port, ipv6_port;
    761     unsigned char ipv4[4], ipv6[16];
    762     QUIC_STATELESS_RESET_TOKEN stateless_reset;
    763     QUIC_CONN_ID cid;
    764 } QUIC_PREFERRED_ADDR;
    765 
    766 int ossl_quic_wire_decode_transport_param_preferred_addr(PACKET *pkt,
    767     QUIC_PREFERRED_ADDR *p);
    768 
    769 #endif
    770 
    771 #endif
    772