Coverage Report

Created: 2025-06-13 06:58

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