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 | \
54 OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
55 # define OSSL_QUIC_FRAME_TYPE_STREAM_LEN \
56 (OSSL_QUIC_FRAME_TYPE_STREAM | \
57 OSSL_QUIC_FRAME_FLAG_STREAM_LEN)
58 # define OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN \
59 (OSSL_QUIC_FRAME_TYPE_STREAM | \
60 OSSL_QUIC_FRAME_FLAG_STREAM_LEN | \
61 OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
62 # define OSSL_QUIC_FRAME_TYPE_STREAM_OFF \
63 (OSSL_QUIC_FRAME_TYPE_STREAM | \
64 OSSL_QUIC_FRAME_FLAG_STREAM_OFF)
65 # define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN \
66 (OSSL_QUIC_FRAME_TYPE_STREAM | \
67 OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
68 OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
69 # define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN \
70 (OSSL_QUIC_FRAME_TYPE_STREAM | \
71 OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
72 OSSL_QUIC_FRAME_FLAG_STREAM_LEN)
73 # define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN \
74 (OSSL_QUIC_FRAME_TYPE_STREAM | \
75 OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
76 OSSL_QUIC_FRAME_FLAG_STREAM_LEN | \
77 OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
78
79 # define OSSL_QUIC_FRAME_TYPE_IS_STREAM(x) \
80 (((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
ossl_quic_frame_type_is_ack_eliciting(uint64_t frame_type)93 ossl_quic_frame_type_is_ack_eliciting(uint64_t frame_type)
94 {
95 switch (frame_type) {
96 case OSSL_QUIC_FRAME_TYPE_PADDING:
97 case OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN:
98 case OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN:
99 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT:
100 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP:
101 return 0;
102 default:
103 return 1;
104 }
105 }
106
107 /* QUIC Transport Parameter Types */
108 # define QUIC_TPARAM_ORIG_DCID 0x00
109 # define QUIC_TPARAM_MAX_IDLE_TIMEOUT 0x01
110 # define QUIC_TPARAM_STATELESS_RESET_TOKEN 0x02
111 # define QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE 0x03
112 # define QUIC_TPARAM_INITIAL_MAX_DATA 0x04
113 # define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05
114 # define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06
115 # define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07
116 # define QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI 0x08
117 # define QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI 0x09
118 # define QUIC_TPARAM_ACK_DELAY_EXP 0x0A
119 # define QUIC_TPARAM_MAX_ACK_DELAY 0x0B
120 # define QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION 0x0C
121 # define QUIC_TPARAM_PREFERRED_ADDR 0x0D
122 # define QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT 0x0E
123 # define QUIC_TPARAM_INITIAL_SCID 0x0F
124 # 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
785