Coverage Report

Created: 2026-10-28 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl41/ssl/quic/quic_wire.c
Line
Count
Source
1
/*
2
 * Copyright 2022-2024 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
#include <openssl/macros.h>
11
#include <openssl/objects.h>
12
#include "internal/quic_ssl.h"
13
#include "internal/quic_vlint.h"
14
#include "internal/quic_wire.h"
15
#include "internal/quic_error.h"
16
17
OSSL_SAFE_MATH_UNSIGNED(uint64_t, uint64_t)
18
19
int ossl_quic_frame_ack_contains_pn(const OSSL_QUIC_FRAME_ACK *ack, QUIC_PN pn)
20
91.1k
{
21
91.1k
    size_t i;
22
23
163k
    for (i = 0; i < ack->num_ack_ranges; ++i)
24
162k
        if (pn >= ack->ack_ranges[i].start
25
90.6k
            && pn <= ack->ack_ranges[i].end)
26
89.3k
            return 1;
27
28
1.74k
    return 0;
29
91.1k
}
30
31
/*
32
 * QUIC Wire Format Encoding
33
 * =========================
34
 */
35
36
int ossl_quic_wire_encode_padding(WPACKET *pkt, size_t num_bytes)
37
449k
{
38
    /*
39
     * PADDING is frame type zero, which as a variable-length integer is
40
     * represented as a single zero byte. As an optimisation, just use memset.
41
     */
42
449k
    return WPACKET_memset(pkt, 0, num_bytes);
43
449k
}
44
45
static int encode_frame_hdr(WPACKET *pkt, uint64_t frame_type)
46
3.52M
{
47
3.52M
    return WPACKET_quic_write_vlint(pkt, frame_type);
48
3.52M
}
49
50
int ossl_quic_wire_encode_frame_ping(WPACKET *pkt)
51
912k
{
52
912k
    return encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_PING);
53
912k
}
54
55
int ossl_quic_wire_encode_frame_ack(WPACKET *pkt,
56
    uint32_t ack_delay_exponent,
57
    const OSSL_QUIC_FRAME_ACK *ack)
58
2.57M
{
59
2.57M
    uint64_t frame_type = ack->ecn_present ? OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN
60
2.57M
                                           : OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN;
61
62
2.57M
    uint64_t largest_ackd, first_ack_range, ack_delay_enc;
63
2.57M
    uint64_t i, num_ack_ranges = ack->num_ack_ranges;
64
2.57M
    OSSL_TIME delay;
65
66
2.57M
    if (num_ack_ranges == 0)
67
142k
        return 0;
68
69
2.43M
    delay = ossl_time_divide(ossl_time_divide(ack->delay_time, OSSL_TIME_US),
70
2.43M
        (uint64_t)1 << ack_delay_exponent);
71
2.43M
    ack_delay_enc = ossl_time2ticks(delay);
72
73
2.43M
    largest_ackd = ack->ack_ranges[0].end;
74
2.43M
    first_ack_range = ack->ack_ranges[0].end - ack->ack_ranges[0].start;
75
76
2.43M
    if (!encode_frame_hdr(pkt, frame_type)
77
2.43M
        || !WPACKET_quic_write_vlint(pkt, largest_ackd)
78
2.43M
        || !WPACKET_quic_write_vlint(pkt, ack_delay_enc)
79
2.43M
        || !WPACKET_quic_write_vlint(pkt, num_ack_ranges - 1)
80
2.43M
        || !WPACKET_quic_write_vlint(pkt, first_ack_range))
81
4
        return 0;
82
83
6.66M
    for (i = 1; i < num_ack_ranges; ++i) {
84
4.23M
        uint64_t gap, range_len;
85
86
4.23M
        gap = ack->ack_ranges[i - 1].start - ack->ack_ranges[i].end - 2;
87
4.23M
        range_len = ack->ack_ranges[i].end - ack->ack_ranges[i].start;
88
89
4.23M
        if (!WPACKET_quic_write_vlint(pkt, gap)
90
4.23M
            || !WPACKET_quic_write_vlint(pkt, range_len))
91
0
            return 0;
92
4.23M
    }
93
94
2.43M
    if (ack->ecn_present)
95
0
        if (!WPACKET_quic_write_vlint(pkt, ack->ect0)
96
0
            || !WPACKET_quic_write_vlint(pkt, ack->ect1)
97
0
            || !WPACKET_quic_write_vlint(pkt, ack->ecnce))
98
0
            return 0;
99
100
2.43M
    return 1;
101
2.43M
}
102
103
int ossl_quic_wire_encode_frame_reset_stream(WPACKET *pkt,
104
    const OSSL_QUIC_FRAME_RESET_STREAM *f)
105
5.14k
{
106
5.14k
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_RESET_STREAM)
107
5.10k
        || !WPACKET_quic_write_vlint(pkt, f->stream_id)
108
5.10k
        || !WPACKET_quic_write_vlint(pkt, f->app_error_code)
109
5.10k
        || !WPACKET_quic_write_vlint(pkt, f->final_size))
110
40
        return 0;
111
112
5.10k
    return 1;
113
5.14k
}
114
115
int ossl_quic_wire_encode_frame_stop_sending(WPACKET *pkt,
116
    const OSSL_QUIC_FRAME_STOP_SENDING *f)
117
0
{
118
0
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_STOP_SENDING)
119
0
        || !WPACKET_quic_write_vlint(pkt, f->stream_id)
120
0
        || !WPACKET_quic_write_vlint(pkt, f->app_error_code))
121
0
        return 0;
122
123
0
    return 1;
124
0
}
125
126
int ossl_quic_wire_encode_frame_crypto_hdr(WPACKET *pkt,
127
    const OSSL_QUIC_FRAME_CRYPTO *f)
128
115k
{
129
115k
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_CRYPTO)
130
115k
        || !WPACKET_quic_write_vlint(pkt, f->offset)
131
115k
        || !WPACKET_quic_write_vlint(pkt, f->len))
132
0
        return 0;
133
134
115k
    return 1;
135
115k
}
136
137
size_t ossl_quic_wire_get_encoded_frame_len_crypto_hdr(const OSSL_QUIC_FRAME_CRYPTO *f)
138
115k
{
139
115k
    size_t a, b, c;
140
141
115k
    a = ossl_quic_vlint_encode_len(OSSL_QUIC_FRAME_TYPE_CRYPTO);
142
115k
    b = ossl_quic_vlint_encode_len(f->offset);
143
115k
    c = ossl_quic_vlint_encode_len(f->len);
144
115k
    if (a == 0 || b == 0 || c == 0)
145
0
        return 0;
146
147
115k
    return a + b + c;
148
115k
}
149
150
void *ossl_quic_wire_encode_frame_crypto(WPACKET *pkt,
151
    const OSSL_QUIC_FRAME_CRYPTO *f)
152
0
{
153
0
    unsigned char *p = NULL;
154
155
0
    if (!ossl_quic_wire_encode_frame_crypto_hdr(pkt, f)
156
0
        || f->len > SIZE_MAX /* sizeof(uint64_t) > sizeof(size_t)? */
157
0
        || !WPACKET_allocate_bytes(pkt, (size_t)f->len, &p))
158
0
        return NULL;
159
160
0
    if (f->data != NULL)
161
0
        memcpy(p, f->data, (size_t)f->len);
162
163
0
    return p;
164
0
}
165
166
int ossl_quic_wire_encode_frame_new_token(WPACKET *pkt,
167
    const unsigned char *token,
168
    size_t token_len)
169
0
{
170
0
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
171
0
        || !WPACKET_quic_write_vlint(pkt, token_len)
172
0
        || !WPACKET_memcpy(pkt, token, token_len))
173
0
        return 0;
174
175
0
    return 1;
176
0
}
177
178
int ossl_quic_wire_encode_frame_stream_hdr(WPACKET *pkt,
179
    const OSSL_QUIC_FRAME_STREAM *f)
180
4.04k
{
181
4.04k
    uint64_t frame_type = OSSL_QUIC_FRAME_TYPE_STREAM;
182
183
4.04k
    if (f->offset != 0)
184
1.56k
        frame_type |= OSSL_QUIC_FRAME_FLAG_STREAM_OFF;
185
4.04k
    if (f->has_explicit_len)
186
911
        frame_type |= OSSL_QUIC_FRAME_FLAG_STREAM_LEN;
187
4.04k
    if (f->is_fin)
188
0
        frame_type |= OSSL_QUIC_FRAME_FLAG_STREAM_FIN;
189
190
4.04k
    if (!encode_frame_hdr(pkt, frame_type)
191
4.04k
        || !WPACKET_quic_write_vlint(pkt, f->stream_id))
192
0
        return 0;
193
194
4.04k
    if (f->offset != 0 && !WPACKET_quic_write_vlint(pkt, f->offset))
195
0
        return 0;
196
197
4.04k
    if (f->has_explicit_len && !WPACKET_quic_write_vlint(pkt, f->len))
198
0
        return 0;
199
200
4.04k
    return 1;
201
4.04k
}
202
203
size_t ossl_quic_wire_get_encoded_frame_len_stream_hdr(const OSSL_QUIC_FRAME_STREAM *f)
204
4.95k
{
205
4.95k
    size_t a, b, c, d;
206
207
4.95k
    a = ossl_quic_vlint_encode_len(OSSL_QUIC_FRAME_TYPE_STREAM);
208
4.95k
    b = ossl_quic_vlint_encode_len(f->stream_id);
209
4.95k
    if (a == 0 || b == 0)
210
0
        return 0;
211
212
4.95k
    if (f->offset > 0) {
213
1.90k
        c = ossl_quic_vlint_encode_len(f->offset);
214
1.90k
        if (c == 0)
215
0
            return 0;
216
3.04k
    } else {
217
3.04k
        c = 0;
218
3.04k
    }
219
220
4.95k
    if (f->has_explicit_len) {
221
911
        d = ossl_quic_vlint_encode_len(f->len);
222
911
        if (d == 0)
223
0
            return 0;
224
4.04k
    } else {
225
4.04k
        d = 0;
226
4.04k
    }
227
228
4.95k
    return a + b + c + d;
229
4.95k
}
230
231
void *ossl_quic_wire_encode_frame_stream(WPACKET *pkt,
232
    const OSSL_QUIC_FRAME_STREAM *f)
233
0
{
234
235
0
    unsigned char *p = NULL;
236
237
0
    if (!ossl_quic_wire_encode_frame_stream_hdr(pkt, f)
238
0
        || f->len > SIZE_MAX /* sizeof(uint64_t) > sizeof(size_t)? */)
239
0
        return NULL;
240
241
0
    if (!WPACKET_allocate_bytes(pkt, (size_t)f->len, &p))
242
0
        return NULL;
243
244
0
    if (f->data != NULL)
245
0
        memcpy(p, f->data, (size_t)f->len);
246
247
0
    return p;
248
0
}
249
250
int ossl_quic_wire_encode_frame_max_data(WPACKET *pkt,
251
    uint64_t max_data)
252
0
{
253
0
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_MAX_DATA)
254
0
        || !WPACKET_quic_write_vlint(pkt, max_data))
255
0
        return 0;
256
257
0
    return 1;
258
0
}
259
260
int ossl_quic_wire_encode_frame_max_stream_data(WPACKET *pkt,
261
    uint64_t stream_id,
262
    uint64_t max_data)
263
315
{
264
315
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_MAX_STREAM_DATA)
265
310
        || !WPACKET_quic_write_vlint(pkt, stream_id)
266
310
        || !WPACKET_quic_write_vlint(pkt, max_data))
267
5
        return 0;
268
269
310
    return 1;
270
315
}
271
272
int ossl_quic_wire_encode_frame_max_streams(WPACKET *pkt,
273
    char is_uni,
274
    uint64_t max_streams)
275
0
{
276
0
    if (!encode_frame_hdr(pkt, is_uni ? OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_UNI : OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI)
277
0
        || !WPACKET_quic_write_vlint(pkt, max_streams))
278
0
        return 0;
279
280
0
    return 1;
281
0
}
282
283
int ossl_quic_wire_encode_frame_data_blocked(WPACKET *pkt,
284
    uint64_t max_data)
285
0
{
286
0
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_DATA_BLOCKED)
287
0
        || !WPACKET_quic_write_vlint(pkt, max_data))
288
0
        return 0;
289
290
0
    return 1;
291
0
}
292
293
int ossl_quic_wire_encode_frame_stream_data_blocked(WPACKET *pkt,
294
    uint64_t stream_id,
295
    uint64_t max_stream_data)
296
0
{
297
0
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_STREAM_DATA_BLOCKED)
298
0
        || !WPACKET_quic_write_vlint(pkt, stream_id)
299
0
        || !WPACKET_quic_write_vlint(pkt, max_stream_data))
300
0
        return 0;
301
302
0
    return 1;
303
0
}
304
305
int ossl_quic_wire_encode_frame_streams_blocked(WPACKET *pkt,
306
    char is_uni,
307
    uint64_t max_streams)
308
0
{
309
0
    if (!encode_frame_hdr(pkt, is_uni ? OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_UNI : OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI)
310
0
        || !WPACKET_quic_write_vlint(pkt, max_streams))
311
0
        return 0;
312
313
0
    return 1;
314
0
}
315
316
int ossl_quic_wire_encode_frame_new_conn_id(WPACKET *pkt,
317
    const OSSL_QUIC_FRAME_NEW_CONN_ID *f)
318
0
{
319
0
    if (f->conn_id.id_len < 1
320
0
        || f->conn_id.id_len > QUIC_MAX_CONN_ID_LEN)
321
0
        return 0;
322
323
0
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID)
324
0
        || !WPACKET_quic_write_vlint(pkt, f->seq_num)
325
0
        || !WPACKET_quic_write_vlint(pkt, f->retire_prior_to)
326
0
        || !WPACKET_put_bytes_u8(pkt, f->conn_id.id_len)
327
0
        || !WPACKET_memcpy(pkt, f->conn_id.id, f->conn_id.id_len)
328
0
        || !WPACKET_memcpy(pkt, f->stateless_reset.token,
329
0
            sizeof(f->stateless_reset.token)))
330
0
        return 0;
331
332
0
    return 1;
333
0
}
334
335
int ossl_quic_wire_encode_frame_retire_conn_id(WPACKET *pkt,
336
    uint64_t seq_num)
337
14.1k
{
338
14.1k
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID)
339
14.1k
        || !WPACKET_quic_write_vlint(pkt, seq_num))
340
0
        return 0;
341
342
14.1k
    return 1;
343
14.1k
}
344
345
int ossl_quic_wire_encode_frame_path_challenge(WPACKET *pkt,
346
    uint64_t data)
347
0
{
348
0
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_PATH_CHALLENGE)
349
0
        || !WPACKET_put_bytes_u64(pkt, data))
350
0
        return 0;
351
352
0
    return 1;
353
0
}
354
355
int ossl_quic_wire_encode_frame_path_response(WPACKET *pkt,
356
    uint64_t data)
357
12.4k
{
358
12.4k
    if (!encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_PATH_RESPONSE)
359
12.4k
        || !WPACKET_put_bytes_u64(pkt, data))
360
0
        return 0;
361
362
12.4k
    return 1;
363
12.4k
}
364
365
int ossl_quic_wire_encode_frame_conn_close(WPACKET *pkt,
366
    const OSSL_QUIC_FRAME_CONN_CLOSE *f)
367
25.8k
{
368
25.8k
    if (!encode_frame_hdr(pkt, f->is_app ? OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP : OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT)
369
25.8k
        || !WPACKET_quic_write_vlint(pkt, f->error_code))
370
0
        return 0;
371
372
    /*
373
     * RFC 9000 s. 19.19: The application-specific variant of CONNECTION_CLOSE
374
     * (type 0x1d) does not include this field.
375
     */
376
25.8k
    if (!f->is_app && !WPACKET_quic_write_vlint(pkt, f->frame_type))
377
0
        return 0;
378
379
25.8k
    if (!WPACKET_quic_write_vlint(pkt, f->reason_len)
380
25.8k
        || !WPACKET_memcpy(pkt, f->reason, f->reason_len))
381
0
        return 0;
382
383
25.8k
    return 1;
384
25.8k
}
385
386
int ossl_quic_wire_encode_frame_handshake_done(WPACKET *pkt)
387
0
{
388
0
    return encode_frame_hdr(pkt, OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE);
389
0
}
390
391
unsigned char *ossl_quic_wire_encode_transport_param_bytes(WPACKET *pkt,
392
    uint64_t id,
393
    const unsigned char *value,
394
    size_t value_len)
395
106k
{
396
106k
    unsigned char *b = NULL;
397
398
106k
    if (!WPACKET_quic_write_vlint(pkt, id)
399
106k
        || !WPACKET_quic_write_vlint(pkt, value_len))
400
0
        return NULL;
401
402
106k
    if (value_len == 0)
403
106k
        b = WPACKET_get_curr(pkt);
404
0
    else if (!WPACKET_allocate_bytes(pkt, value_len, (unsigned char **)&b))
405
0
        return NULL;
406
407
106k
    if (value != NULL)
408
42.8k
        memcpy(b, value, value_len);
409
410
106k
    return b;
411
106k
}
412
413
int ossl_quic_wire_encode_transport_param_int(WPACKET *pkt,
414
    uint64_t id,
415
    uint64_t value)
416
477k
{
417
477k
    if (!WPACKET_quic_write_vlint(pkt, id)
418
477k
        || !WPACKET_quic_write_vlint(pkt, ossl_quic_vlint_encode_len(value))
419
477k
        || !WPACKET_quic_write_vlint(pkt, value))
420
0
        return 0;
421
422
477k
    return 1;
423
477k
}
424
425
int ossl_quic_wire_encode_transport_param_cid(WPACKET *wpkt,
426
    uint64_t id,
427
    const QUIC_CONN_ID *cid)
428
42.8k
{
429
42.8k
    if (cid->id_len > QUIC_MAX_CONN_ID_LEN)
430
0
        return 0;
431
432
42.8k
    if (ossl_quic_wire_encode_transport_param_bytes(wpkt, id,
433
42.8k
            cid->id,
434
42.8k
            cid->id_len)
435
42.8k
        == NULL)
436
0
        return 0;
437
438
42.8k
    return 1;
439
42.8k
}
440
441
/*
442
 * QUIC Wire Format Decoding
443
 * =========================
444
 */
445
int ossl_quic_wire_peek_frame_header(PACKET *pkt, uint64_t *type,
446
    int *was_minimal)
447
2.21M
{
448
2.21M
    return PACKET_peek_quic_vlint_ex(pkt, type, was_minimal);
449
2.21M
}
450
451
int ossl_quic_wire_skip_frame_header(PACKET *pkt, uint64_t *type)
452
1.99M
{
453
1.99M
    return PACKET_get_quic_vlint(pkt, type);
454
1.99M
}
455
456
static int expect_frame_header_mask(PACKET *pkt,
457
    uint64_t expected_frame_type,
458
    uint64_t mask_bits,
459
    uint64_t *actual_frame_type)
460
492k
{
461
492k
    uint64_t actual_frame_type_;
462
463
492k
    if (!ossl_quic_wire_skip_frame_header(pkt, &actual_frame_type_)
464
492k
        || (actual_frame_type_ & ~mask_bits) != expected_frame_type)
465
0
        return 0;
466
467
492k
    if (actual_frame_type != NULL)
468
191k
        *actual_frame_type = actual_frame_type_;
469
470
492k
    return 1;
471
492k
}
472
473
static int expect_frame_header(PACKET *pkt, uint64_t expected_frame_type)
474
1.50M
{
475
1.50M
    uint64_t actual_frame_type;
476
477
1.50M
    if (!ossl_quic_wire_skip_frame_header(pkt, &actual_frame_type)
478
1.50M
        || actual_frame_type != expected_frame_type)
479
0
        return 0;
480
481
1.50M
    return 1;
482
1.50M
}
483
484
int ossl_quic_wire_peek_frame_ack_num_ranges(const PACKET *orig_pkt,
485
    uint64_t *total_ranges)
486
146k
{
487
146k
    PACKET pkt = *orig_pkt;
488
146k
    uint64_t ack_range_count, i;
489
490
146k
    if (!expect_frame_header_mask(&pkt, OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN,
491
146k
            1, NULL)
492
146k
        || !PACKET_skip_quic_vlint(&pkt)
493
146k
        || !PACKET_skip_quic_vlint(&pkt)
494
146k
        || !PACKET_get_quic_vlint(&pkt, &ack_range_count))
495
303
        return 0;
496
497
    /*
498
     * Ensure the specified number of ack ranges listed in the ACK frame header
499
     * actually are available in the frame data. This naturally bounds the
500
     * number of ACK ranges which can be requested by the MDPL, and therefore by
501
     * the MTU. This ensures we do not allocate memory for an excessive number
502
     * of ACK ranges.
503
     */
504
164k
    for (i = 0; i < ack_range_count; ++i)
505
19.1k
        if (!PACKET_skip_quic_vlint(&pkt)
506
18.8k
            || !PACKET_skip_quic_vlint(&pkt))
507
590
            return 0;
508
509
    /* (cannot overflow because QUIC vlints can only encode up to 2**62-1) */
510
145k
    *total_ranges = ack_range_count + 1;
511
145k
    return 1;
512
146k
}
513
514
int ossl_quic_wire_decode_frame_ack(PACKET *pkt,
515
    uint32_t ack_delay_exponent,
516
    OSSL_QUIC_FRAME_ACK *ack,
517
    uint64_t *total_ranges)
518
145k
{
519
145k
    uint64_t frame_type, largest_ackd, ack_delay_raw;
520
145k
    uint64_t ack_range_count, first_ack_range, start, end, i;
521
522
    /* This call matches both ACK_WITHOUT_ECN and ACK_WITH_ECN. */
523
145k
    if (!expect_frame_header_mask(pkt, OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN,
524
145k
            1, &frame_type)
525
145k
        || !PACKET_get_quic_vlint(pkt, &largest_ackd)
526
145k
        || !PACKET_get_quic_vlint(pkt, &ack_delay_raw)
527
145k
        || !PACKET_get_quic_vlint(pkt, &ack_range_count)
528
145k
        || !PACKET_get_quic_vlint(pkt, &first_ack_range))
529
67
        return 0;
530
531
145k
    if (first_ack_range > largest_ackd)
532
495
        return 0;
533
534
145k
    if (ack_range_count > SIZE_MAX /* sizeof(uint64_t) > sizeof(size_t)? */)
535
0
        return 0;
536
537
145k
    start = largest_ackd - first_ack_range;
538
539
145k
    if (ack != NULL) {
540
145k
        int err = 0;
541
145k
        ack->delay_time
542
145k
            = ossl_time_multiply(ossl_ticks2time(OSSL_TIME_US),
543
145k
                safe_mul_uint64_t(ack_delay_raw,
544
145k
                    (uint64_t)1 << ack_delay_exponent,
545
145k
                    &err));
546
145k
        if (err)
547
942
            ack->delay_time = ossl_time_infinite();
548
549
145k
        if (ack->num_ack_ranges > 0) {
550
145k
            ack->ack_ranges[0].end = largest_ackd;
551
145k
            ack->ack_ranges[0].start = start;
552
145k
        }
553
145k
    }
554
555
152k
    for (i = 0; i < ack_range_count; ++i) {
556
8.06k
        uint64_t gap, len;
557
558
8.06k
        if (!PACKET_get_quic_vlint(pkt, &gap)
559
8.06k
            || !PACKET_get_quic_vlint(pkt, &len))
560
88
            return 0;
561
562
7.97k
        end = start - gap - 2;
563
7.97k
        if (start < gap + 2 || len > end)
564
548
            return 0;
565
566
7.43k
        if (ack != NULL && i + 1 < ack->num_ack_ranges) {
567
7.43k
            ack->ack_ranges[i + 1].start = start = end - len;
568
7.43k
            ack->ack_ranges[i + 1].end = end;
569
7.43k
        }
570
7.43k
    }
571
572
144k
    if (ack != NULL && ack_range_count + 1 < ack->num_ack_ranges)
573
0
        ack->num_ack_ranges = (size_t)ack_range_count + 1;
574
575
144k
    if (total_ranges != NULL)
576
0
        *total_ranges = ack_range_count + 1;
577
578
144k
    if (frame_type == OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN) {
579
61.6k
        uint64_t ect0, ect1, ecnce;
580
581
61.6k
        if (!PACKET_get_quic_vlint(pkt, &ect0)
582
61.6k
            || !PACKET_get_quic_vlint(pkt, &ect1)
583
61.5k
            || !PACKET_get_quic_vlint(pkt, &ecnce))
584
124
            return 0;
585
586
61.5k
        if (ack != NULL) {
587
61.5k
            ack->ect0 = ect0;
588
61.5k
            ack->ect1 = ect1;
589
61.5k
            ack->ecnce = ecnce;
590
61.5k
            ack->ecn_present = 1;
591
61.5k
        }
592
82.7k
    } else if (ack != NULL) {
593
82.7k
        ack->ecn_present = 0;
594
82.7k
    }
595
596
144k
    return 1;
597
144k
}
598
599
int ossl_quic_wire_decode_frame_reset_stream(PACKET *pkt,
600
    OSSL_QUIC_FRAME_RESET_STREAM *f)
601
5.03k
{
602
5.03k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_RESET_STREAM)
603
5.03k
        || !PACKET_get_quic_vlint(pkt, &f->stream_id)
604
5.00k
        || !PACKET_get_quic_vlint(pkt, &f->app_error_code)
605
4.98k
        || !PACKET_get_quic_vlint(pkt, &f->final_size))
606
65
        return 0;
607
608
4.96k
    return 1;
609
5.03k
}
610
611
int ossl_quic_wire_decode_frame_stop_sending(PACKET *pkt,
612
    OSSL_QUIC_FRAME_STOP_SENDING *f)
613
55.1k
{
614
55.1k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_STOP_SENDING)
615
55.1k
        || !PACKET_get_quic_vlint(pkt, &f->stream_id)
616
55.1k
        || !PACKET_get_quic_vlint(pkt, &f->app_error_code))
617
74
        return 0;
618
619
55.1k
    return 1;
620
55.1k
}
621
622
int ossl_quic_wire_decode_frame_crypto(PACKET *pkt,
623
    int nodata,
624
    OSSL_QUIC_FRAME_CRYPTO *f)
625
258k
{
626
258k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_CRYPTO)
627
258k
        || !PACKET_get_quic_vlint(pkt, &f->offset)
628
257k
        || !PACKET_get_quic_vlint(pkt, &f->len)
629
257k
        || f->len > SIZE_MAX /* sizeof(uint64_t) > sizeof(size_t)? */)
630
210
        return 0;
631
632
257k
    if (f->offset + f->len > (((uint64_t)1) << 62) - 1)
633
        /* RFC 9000 s. 19.6 */
634
19
        return 0;
635
636
257k
    if (nodata) {
637
0
        f->data = NULL;
638
257k
    } else {
639
257k
        if (PACKET_remaining(pkt) < f->len)
640
721
            return 0;
641
642
257k
        f->data = PACKET_data(pkt);
643
644
257k
        if (!PACKET_forward(pkt, (size_t)f->len))
645
0
            return 0;
646
257k
    }
647
648
257k
    return 1;
649
257k
}
650
651
int ossl_quic_wire_decode_frame_new_token(PACKET *pkt,
652
    const unsigned char **token,
653
    size_t *token_len)
654
3.71k
{
655
3.71k
    uint64_t token_len_;
656
657
3.71k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
658
3.71k
        || !PACKET_get_quic_vlint(pkt, &token_len_))
659
20
        return 0;
660
661
3.69k
    if (token_len_ > SIZE_MAX)
662
0
        return 0;
663
664
3.69k
    *token = PACKET_data(pkt);
665
3.69k
    *token_len = (size_t)token_len_;
666
667
3.69k
    if (!PACKET_forward(pkt, (size_t)token_len_))
668
65
        return 0;
669
670
3.63k
    return 1;
671
3.69k
}
672
673
int ossl_quic_wire_decode_frame_stream(PACKET *pkt,
674
    int nodata,
675
    OSSL_QUIC_FRAME_STREAM *f)
676
43.1k
{
677
43.1k
    uint64_t frame_type;
678
679
    /* This call matches all STREAM values (low 3 bits are masked). */
680
43.1k
    if (!expect_frame_header_mask(pkt, OSSL_QUIC_FRAME_TYPE_STREAM,
681
43.1k
            OSSL_QUIC_FRAME_FLAG_STREAM_MASK,
682
43.1k
            &frame_type)
683
43.1k
        || !PACKET_get_quic_vlint(pkt, &f->stream_id))
684
30
        return 0;
685
686
43.1k
    if ((frame_type & OSSL_QUIC_FRAME_FLAG_STREAM_OFF) != 0) {
687
24.8k
        if (!PACKET_get_quic_vlint(pkt, &f->offset))
688
31
            return 0;
689
24.8k
    } else {
690
18.2k
        f->offset = 0;
691
18.2k
    }
692
693
43.1k
    f->has_explicit_len = ((frame_type & OSSL_QUIC_FRAME_FLAG_STREAM_LEN) != 0);
694
43.1k
    f->is_fin = ((frame_type & OSSL_QUIC_FRAME_FLAG_STREAM_FIN) != 0);
695
696
43.1k
    if (f->has_explicit_len) {
697
16.5k
        if (!PACKET_get_quic_vlint(pkt, &f->len))
698
27
            return 0;
699
26.5k
    } else {
700
26.5k
        if (nodata)
701
0
            f->len = 0;
702
26.5k
        else
703
26.5k
            f->len = PACKET_remaining(pkt);
704
26.5k
    }
705
706
    /*
707
     * RFC 9000 s. 19.8: "The largest offset delivered on a stream -- the sum of
708
     * the offset and data length -- cannot exceed 2**62 - 1, as it is not
709
     * possible to provide flow control credit for that data."
710
     */
711
43.1k
    if (f->offset + f->len > (((uint64_t)1) << 62) - 1)
712
13
        return 0;
713
714
43.0k
    if (nodata) {
715
0
        f->data = NULL;
716
43.0k
    } else {
717
43.0k
        f->data = PACKET_data(pkt);
718
719
43.0k
        if (f->len > SIZE_MAX /* sizeof(uint64_t) > sizeof(size_t)? */
720
43.0k
            || !PACKET_forward(pkt, (size_t)f->len))
721
301
            return 0;
722
43.0k
    }
723
724
42.7k
    return 1;
725
43.0k
}
726
727
int ossl_quic_wire_decode_frame_max_data(PACKET *pkt,
728
    uint64_t *max_data)
729
57.5k
{
730
57.5k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_MAX_DATA)
731
57.5k
        || !PACKET_get_quic_vlint(pkt, max_data))
732
32
        return 0;
733
734
57.5k
    return 1;
735
57.5k
}
736
737
int ossl_quic_wire_decode_frame_max_stream_data(PACKET *pkt,
738
    uint64_t *stream_id,
739
    uint64_t *max_stream_data)
740
9.92k
{
741
9.92k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_MAX_STREAM_DATA)
742
9.92k
        || !PACKET_get_quic_vlint(pkt, stream_id)
743
9.89k
        || !PACKET_get_quic_vlint(pkt, max_stream_data))
744
39
        return 0;
745
746
9.88k
    return 1;
747
9.92k
}
748
749
int ossl_quic_wire_decode_frame_max_streams(PACKET *pkt,
750
    uint64_t *max_streams)
751
46.7k
{
752
    /* This call matches both MAX_STREAMS_BIDI and MAX_STREAMS_UNI. */
753
46.7k
    if (!expect_frame_header_mask(pkt, OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI,
754
46.7k
            1, NULL)
755
46.7k
        || !PACKET_get_quic_vlint(pkt, max_streams))
756
32
        return 0;
757
758
46.6k
    return 1;
759
46.7k
}
760
761
int ossl_quic_wire_decode_frame_data_blocked(PACKET *pkt,
762
    uint64_t *max_data)
763
15.5k
{
764
15.5k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_DATA_BLOCKED)
765
15.5k
        || !PACKET_get_quic_vlint(pkt, max_data))
766
19
        return 0;
767
768
15.5k
    return 1;
769
15.5k
}
770
771
int ossl_quic_wire_decode_frame_stream_data_blocked(PACKET *pkt,
772
    uint64_t *stream_id,
773
    uint64_t *max_stream_data)
774
20.0k
{
775
20.0k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_STREAM_DATA_BLOCKED)
776
20.0k
        || !PACKET_get_quic_vlint(pkt, stream_id)
777
20.0k
        || !PACKET_get_quic_vlint(pkt, max_stream_data))
778
53
        return 0;
779
780
20.0k
    return 1;
781
20.0k
}
782
783
int ossl_quic_wire_decode_frame_streams_blocked(PACKET *pkt,
784
    uint64_t *max_streams)
785
107k
{
786
    /* This call matches both STREAMS_BLOCKED_BIDI and STREAMS_BLOCKED_UNI. */
787
107k
    if (!expect_frame_header_mask(pkt, OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI,
788
107k
            1, NULL)
789
107k
        || !PACKET_get_quic_vlint(pkt, max_streams))
790
30
        return 0;
791
792
107k
    return 1;
793
107k
}
794
795
int ossl_quic_wire_decode_frame_new_conn_id(PACKET *pkt,
796
    OSSL_QUIC_FRAME_NEW_CONN_ID *f)
797
14.1k
{
798
14.1k
    unsigned int len;
799
800
14.1k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID)
801
14.1k
        || !PACKET_get_quic_vlint(pkt, &f->seq_num)
802
14.0k
        || !PACKET_get_quic_vlint(pkt, &f->retire_prior_to)
803
14.0k
        || f->seq_num < f->retire_prior_to
804
14.0k
        || !PACKET_get_1(pkt, &len)
805
14.0k
        || len < 1
806
14.0k
        || len > QUIC_MAX_CONN_ID_LEN)
807
153
        return 0;
808
809
13.9k
    f->conn_id.id_len = (unsigned char)len;
810
13.9k
    if (!PACKET_copy_bytes(pkt, f->conn_id.id, len))
811
17
        return 0;
812
813
    /* Clear unused bytes to allow consistent memcmp. */
814
13.9k
    if (len < QUIC_MAX_CONN_ID_LEN)
815
3.21k
        memset(f->conn_id.id + len, 0, QUIC_MAX_CONN_ID_LEN - len);
816
817
13.9k
    if (!PACKET_copy_bytes(pkt, f->stateless_reset.token,
818
13.9k
            sizeof(f->stateless_reset.token)))
819
32
        return 0;
820
821
13.9k
    return 1;
822
13.9k
}
823
824
int ossl_quic_wire_decode_frame_retire_conn_id(PACKET *pkt,
825
    uint64_t *seq_num)
826
92
{
827
92
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID)
828
92
        || !PACKET_get_quic_vlint(pkt, seq_num))
829
14
        return 0;
830
831
78
    return 1;
832
92
}
833
834
int ossl_quic_wire_decode_frame_path_challenge(PACKET *pkt,
835
    uint64_t *data)
836
164k
{
837
164k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_PATH_CHALLENGE)
838
164k
        || !PACKET_get_net_8(pkt, data))
839
48
        return 0;
840
841
164k
    return 1;
842
164k
}
843
844
int ossl_quic_wire_decode_frame_path_response(PACKET *pkt,
845
    uint64_t *data)
846
4.26k
{
847
4.26k
    if (!expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_PATH_RESPONSE)
848
4.26k
        || !PACKET_get_net_8(pkt, data))
849
28
        return 0;
850
851
4.23k
    return 1;
852
4.26k
}
853
854
int ossl_quic_wire_decode_frame_conn_close(PACKET *pkt,
855
    OSSL_QUIC_FRAME_CONN_CLOSE *f)
856
2.55k
{
857
2.55k
    uint64_t frame_type, reason_len;
858
859
    /* This call matches both CONN_CLOSE_TRANSPORT and CONN_CLOSE_APP. */
860
2.55k
    if (!expect_frame_header_mask(pkt, OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT,
861
2.55k
            1, &frame_type)
862
2.55k
        || !PACKET_get_quic_vlint(pkt, &f->error_code))
863
31
        return 0;
864
865
2.52k
    f->is_app = ((frame_type & 1) != 0);
866
867
2.52k
    if (!f->is_app) {
868
1.60k
        if (!PACKET_get_quic_vlint(pkt, &f->frame_type))
869
28
            return 0;
870
1.60k
    } else {
871
919
        f->frame_type = 0;
872
919
    }
873
874
2.49k
    if (!PACKET_get_quic_vlint(pkt, &reason_len)
875
2.46k
        || reason_len > SIZE_MAX)
876
31
        return 0;
877
878
2.46k
    if (!PACKET_get_bytes(pkt, (const unsigned char **)&f->reason,
879
2.46k
            (size_t)reason_len))
880
364
        return 0;
881
882
2.09k
    f->reason_len = (size_t)reason_len;
883
2.09k
    return 1;
884
2.46k
}
885
886
size_t ossl_quic_wire_decode_padding(PACKET *pkt)
887
356k
{
888
356k
    const unsigned char *start = PACKET_data(pkt), *end = PACKET_end(pkt),
889
356k
                        *p = start;
890
891
4.94M
    while (p < end && *p == 0)
892
4.58M
        ++p;
893
894
356k
    if (!PACKET_forward(pkt, p - start))
895
0
        return 0;
896
897
356k
    return p - start;
898
356k
}
899
900
int ossl_quic_wire_decode_frame_ping(PACKET *pkt)
901
699k
{
902
699k
    return expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_PING);
903
699k
}
904
905
int ossl_quic_wire_decode_frame_handshake_done(PACKET *pkt)
906
197k
{
907
197k
    return expect_frame_header(pkt, OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE);
908
197k
}
909
910
int ossl_quic_wire_peek_transport_param(PACKET *pkt, uint64_t *id)
911
239k
{
912
239k
    return PACKET_peek_quic_vlint(pkt, id);
913
239k
}
914
915
const unsigned char *ossl_quic_wire_decode_transport_param_bytes(PACKET *pkt,
916
    uint64_t *id,
917
    size_t *len)
918
238k
{
919
238k
    uint64_t len_;
920
238k
    const unsigned char *b = NULL;
921
238k
    uint64_t id_;
922
923
238k
    if (!PACKET_get_quic_vlint(pkt, &id_)
924
238k
        || !PACKET_get_quic_vlint(pkt, &len_))
925
50
        return NULL;
926
927
238k
    if (len_ > SIZE_MAX
928
238k
        || !PACKET_get_bytes(pkt, (const unsigned char **)&b, (size_t)len_))
929
188
        return NULL;
930
931
238k
    *len = (size_t)len_;
932
238k
    if (id != NULL)
933
197k
        *id = id_;
934
238k
    return b;
935
238k
}
936
937
int ossl_quic_wire_decode_transport_param_int(PACKET *pkt,
938
    uint64_t *id,
939
    uint64_t *value)
940
79.6k
{
941
79.6k
    PACKET sub;
942
79.6k
    const unsigned char *body;
943
79.6k
    size_t len = 0;
944
945
79.6k
    body = ossl_quic_wire_decode_transport_param_bytes(pkt, id, &len);
946
79.6k
    if (body == NULL)
947
43
        return 0;
948
79.5k
    if (!PACKET_buf_init(&sub, body, len))
949
0
        return 0;
950
79.5k
    if (!PACKET_get_quic_vlint(&sub, value))
951
21
        return 0;
952
953
79.5k
    if (PACKET_remaining(&sub) > 0)
954
27
        return 0;
955
956
79.5k
    return 1;
957
79.5k
}
958
959
int ossl_quic_wire_decode_transport_param_cid(PACKET *pkt,
960
    uint64_t *id,
961
    QUIC_CONN_ID *cid)
962
41.0k
{
963
41.0k
    const unsigned char *body;
964
41.0k
    size_t len = 0;
965
966
41.0k
    body = ossl_quic_wire_decode_transport_param_bytes(pkt, id, &len);
967
41.0k
    if (body == NULL || len > QUIC_MAX_CONN_ID_LEN)
968
23
        return 0;
969
970
40.9k
    cid->id_len = (unsigned char)len;
971
40.9k
    memcpy(cid->id, body, cid->id_len);
972
40.9k
    return 1;
973
41.0k
}
974
975
int ossl_quic_wire_decode_transport_param_preferred_addr(PACKET *pkt,
976
    QUIC_PREFERRED_ADDR *p)
977
99
{
978
99
    const unsigned char *body;
979
99
    uint64_t id;
980
99
    size_t len = 0;
981
99
    PACKET pkt2;
982
99
    unsigned int ipv4_port, ipv6_port, cidl;
983
984
99
    body = ossl_quic_wire_decode_transport_param_bytes(pkt, &id, &len);
985
99
    if (body == NULL
986
78
        || len < QUIC_MIN_ENCODED_PREFERRED_ADDR_LEN
987
49
        || len > QUIC_MAX_ENCODED_PREFERRED_ADDR_LEN
988
45
        || id != QUIC_TPARAM_PREFERRED_ADDR)
989
54
        return 0;
990
991
45
    if (!PACKET_buf_init(&pkt2, body, len))
992
0
        return 0;
993
994
45
    if (!PACKET_copy_bytes(&pkt2, p->ipv4, sizeof(p->ipv4))
995
45
        || !PACKET_get_net_2(&pkt2, &ipv4_port)
996
45
        || !PACKET_copy_bytes(&pkt2, p->ipv6, sizeof(p->ipv6))
997
45
        || !PACKET_get_net_2(&pkt2, &ipv6_port)
998
45
        || !PACKET_get_1(&pkt2, &cidl)
999
45
        || cidl > QUIC_MAX_CONN_ID_LEN
1000
39
        || !PACKET_copy_bytes(&pkt2, p->cid.id, cidl)
1001
33
        || !PACKET_copy_bytes(&pkt2, p->stateless_reset.token,
1002
33
            sizeof(p->stateless_reset.token)))
1003
27
        return 0;
1004
1005
18
    p->ipv4_port = (uint16_t)ipv4_port;
1006
18
    p->ipv6_port = (uint16_t)ipv6_port;
1007
18
    p->cid.id_len = (unsigned char)cidl;
1008
18
    return 1;
1009
45
}
1010
1011
const char *
1012
ossl_quic_frame_type_to_string(uint64_t frame_type)
1013
15.1k
{
1014
15.1k
    switch (frame_type) {
1015
0
#define X(name)                       \
1016
10.1k
    case OSSL_QUIC_FRAME_TYPE_##name: \
1017
10.1k
        return #name;
1018
0
        X(PADDING)
1019
13
        X(PING)
1020
2.33k
        X(ACK_WITHOUT_ECN)
1021
1.24k
        X(ACK_WITH_ECN)
1022
461
        X(RESET_STREAM)
1023
347
        X(STOP_SENDING)
1024
1.70k
        X(CRYPTO)
1025
167
        X(NEW_TOKEN)
1026
118
        X(MAX_DATA)
1027
213
        X(MAX_STREAM_DATA)
1028
70
        X(MAX_STREAMS_BIDI)
1029
118
        X(MAX_STREAMS_UNI)
1030
39
        X(DATA_BLOCKED)
1031
177
        X(STREAM_DATA_BLOCKED)
1032
64
        X(STREAMS_BLOCKED_BIDI)
1033
118
        X(STREAMS_BLOCKED_UNI)
1034
917
        X(NEW_CONN_ID)
1035
112
        X(RETIRE_CONN_ID)
1036
62
        X(PATH_CHALLENGE)
1037
43
        X(PATH_RESPONSE)
1038
436
        X(CONN_CLOSE_TRANSPORT)
1039
47
        X(CONN_CLOSE_APP)
1040
34
        X(HANDSHAKE_DONE)
1041
177
        X(STREAM)
1042
99
        X(STREAM_FIN)
1043
137
        X(STREAM_LEN)
1044
165
        X(STREAM_LEN_FIN)
1045
154
        X(STREAM_OFF)
1046
92
        X(STREAM_OFF_FIN)
1047
117
        X(STREAM_OFF_LEN)
1048
322
        X(STREAM_OFF_LEN_FIN)
1049
0
#undef X
1050
5.03k
    default:
1051
5.03k
        return NULL;
1052
15.1k
    }
1053
15.1k
}
1054
1055
const char *ossl_quic_err_to_string(uint64_t error_code)
1056
49.7k
{
1057
49.7k
    switch (error_code) {
1058
0
#define X(name)                \
1059
37.6k
    case OSSL_QUIC_ERR_##name: \
1060
37.6k
        return #name;
1061
0
        X(NO_ERROR)
1062
19.1k
        X(INTERNAL_ERROR)
1063
137
        X(CONNECTION_REFUSED)
1064
218
        X(FLOW_CONTROL_ERROR)
1065
228
        X(STREAM_LIMIT_ERROR)
1066
844
        X(STREAM_STATE_ERROR)
1067
243
        X(FINAL_SIZE_ERROR)
1068
10.1k
        X(FRAME_ENCODING_ERROR)
1069
1.00k
        X(TRANSPORT_PARAMETER_ERROR)
1070
695
        X(CONNECTION_ID_LIMIT_ERROR)
1071
4.03k
        X(PROTOCOL_VIOLATION)
1072
15
        X(INVALID_TOKEN)
1073
0
        X(APPLICATION_ERROR)
1074
615
        X(CRYPTO_BUFFER_EXCEEDED)
1075
273
        X(KEY_UPDATE_ERROR)
1076
0
        X(AEAD_LIMIT_REACHED)
1077
0
        X(NO_VIABLE_PATH)
1078
0
#undef X
1079
12.1k
    default:
1080
        return NULL;
1081
49.7k
    }
1082
49.7k
}