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