Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright 2022-2026 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 "internal/packet.h"
     11 #include "internal/quic_wire.h"
     12 #include "internal/quic_wire_pkt.h"
     13 #include "testutil.h"
     14 
     15 struct encode_test_case {
     16     int (*serializer)(WPACKET *pkt);
     17     const unsigned char *expect_buf;
     18     size_t expect_buf_len;
     19     /*
     20      * fail: -1 if not truncated (function should test for success), else number
     21      * of bytes to which the input has been truncated (function should test that
     22      * decoding fails)
     23      */
     24     int (*deserializer)(PACKET *pkt, ossl_ssize_t fail);
     25 };
     26 
     27 /* 1. PADDING */
     28 static int encode_case_1_enc(WPACKET *pkt)
     29 {
     30     if (!TEST_int_eq(ossl_quic_wire_encode_padding(pkt, 3), 1))
     31         return 0;
     32 
     33     return 1;
     34 }
     35 
     36 static int encode_case_1_dec(PACKET *pkt, ossl_ssize_t fail)
     37 {
     38     if (fail >= 0)
     39         /* No failure modes for padding */
     40         return 1;
     41 
     42     if (!TEST_int_eq(ossl_quic_wire_decode_padding(pkt), 3))
     43         return 0;
     44 
     45     return 1;
     46 }
     47 
     48 static const unsigned char encode_case_1_expect[] = {
     49     0, 0, 0
     50 };
     51 
     52 /* 2. PING */
     53 static int encode_case_2_enc(WPACKET *pkt)
     54 {
     55 
     56     if (!TEST_int_eq(ossl_quic_wire_encode_frame_ping(pkt), 1))
     57         return 0;
     58 
     59     return 1;
     60 }
     61 
     62 static int encode_case_2_dec(PACKET *pkt, ossl_ssize_t fail)
     63 {
     64 
     65     if (!TEST_int_eq(ossl_quic_wire_decode_frame_ping(pkt), fail < 0))
     66         return 0;
     67 
     68     return 1;
     69 }
     70 
     71 static const unsigned char encode_case_2_expect[] = {
     72     0x01
     73 };
     74 
     75 /* 3. ACK */
     76 static const OSSL_QUIC_ACK_RANGE encode_case_3_ranges[] = {
     77     { 20, 30 },
     78     { 0, 10 }
     79 };
     80 
     81 static const OSSL_QUIC_FRAME_ACK encode_case_3_f = {
     82     (OSSL_QUIC_ACK_RANGE *)encode_case_3_ranges,
     83     OSSL_NELEM(encode_case_3_ranges),
     84     { OSSL_TIME_MS },
     85     60, 70, 80, 1
     86 };
     87 
     88 static int encode_case_3_enc(WPACKET *pkt)
     89 {
     90     if (!TEST_int_eq(ossl_quic_wire_encode_frame_ack(pkt, 3, &encode_case_3_f), 1))
     91         return 0;
     92 
     93     return 1;
     94 }
     95 
     96 static int encode_case_3_dec(PACKET *pkt, ossl_ssize_t fail)
     97 {
     98     OSSL_QUIC_ACK_RANGE ranges[4] = { 0 };
     99     OSSL_QUIC_FRAME_ACK f = { 0 };
    100     uint64_t total_ranges = 0, peek_total_ranges = 0;
    101     int ret;
    102 
    103     f.ack_ranges = ranges;
    104     f.num_ack_ranges = OSSL_NELEM(ranges);
    105 
    106     ret = ossl_quic_wire_peek_frame_ack_num_ranges(pkt, &peek_total_ranges);
    107     if (fail < 0 && !TEST_int_eq(ret, 1))
    108         return 0;
    109 
    110     if (!TEST_int_eq(ossl_quic_wire_decode_frame_ack(pkt, 3, &f, &total_ranges), fail < 0))
    111         return 0;
    112 
    113     if (ret == 1 && !TEST_uint64_t_eq(peek_total_ranges, 2))
    114         return 0;
    115 
    116     if (fail >= 0)
    117         return 1;
    118 
    119     if (!TEST_uint64_t_eq(total_ranges, peek_total_ranges))
    120         return 0;
    121 
    122     if (!TEST_uint64_t_le(f.num_ack_ranges * sizeof(OSSL_QUIC_ACK_RANGE),
    123             SIZE_MAX)
    124         || !TEST_uint64_t_le(encode_case_3_f.num_ack_ranges
    125                 * sizeof(OSSL_QUIC_ACK_RANGE),
    126             SIZE_MAX))
    127         return 0;
    128 
    129     if (!TEST_mem_eq(f.ack_ranges,
    130             (size_t)f.num_ack_ranges * sizeof(OSSL_QUIC_ACK_RANGE),
    131             encode_case_3_f.ack_ranges,
    132             (size_t)encode_case_3_f.num_ack_ranges * sizeof(OSSL_QUIC_ACK_RANGE)))
    133         return 0;
    134 
    135     if (!TEST_uint64_t_eq(ossl_time2ticks(f.delay_time),
    136             ossl_time2ticks(encode_case_3_f.delay_time)))
    137         return 0;
    138 
    139     if (!TEST_true(f.ecn_present))
    140         return 0;
    141 
    142     if (!TEST_uint64_t_eq(f.ect0, encode_case_3_f.ect0))
    143         return 0;
    144 
    145     if (!TEST_uint64_t_eq(f.ect1, encode_case_3_f.ect1))
    146         return 0;
    147 
    148     if (!TEST_uint64_t_eq(f.ecnce, encode_case_3_f.ecnce))
    149         return 0;
    150 
    151     return 1;
    152 }
    153 
    154 static const unsigned char encode_case_3_expect[] = {
    155     0x03, /* Type */
    156     0x1E, /* Largest Acknowledged */
    157     0x40,
    158     0x7d, /* ACK Delay */
    159     1, /* ACK Range Count */
    160     10, /* First ACK Range */
    161 
    162     8, /* Gap */
    163     10, /* Length */
    164 
    165     0x3c, /* ECT0 Count */
    166     0x40,
    167     0x46, /* ECT1 Count */
    168     0x40,
    169     0x50, /* ECNCE Count */
    170 };
    171 
    172 /* 4. RESET_STREAM */
    173 static const OSSL_QUIC_FRAME_RESET_STREAM encode_case_4_f = {
    174     0x1234, 0x9781, 0x11717
    175 };
    176 
    177 static int encode_case_4_enc(WPACKET *pkt)
    178 {
    179     if (!TEST_int_eq(ossl_quic_wire_encode_frame_reset_stream(pkt,
    180                          &encode_case_4_f),
    181             1))
    182         return 0;
    183 
    184     return 1;
    185 }
    186 
    187 static int encode_case_4_dec(PACKET *pkt, ossl_ssize_t fail)
    188 {
    189     OSSL_QUIC_FRAME_RESET_STREAM f = { 0 };
    190 
    191     if (!TEST_int_eq(ossl_quic_wire_decode_frame_reset_stream(pkt, &f), fail < 0))
    192         return 0;
    193 
    194     if (fail >= 0)
    195         return 1;
    196 
    197     if (!TEST_mem_eq(&f, sizeof(f), &encode_case_4_f, sizeof(encode_case_4_f)))
    198         return 0;
    199 
    200     return 1;
    201 }
    202 
    203 static const unsigned char encode_case_4_expect[] = {
    204     0x04, /* Type */
    205     0x52,
    206     0x34, /* Stream ID */
    207     0x80,
    208     0x00,
    209     0x97,
    210     0x81, /* App Error Code */
    211     0x80,
    212     0x01,
    213     0x17,
    214     0x17, /* Final Size */
    215 };
    216 
    217 /* 5. STOP_SENDING */
    218 static const OSSL_QUIC_FRAME_STOP_SENDING encode_case_5_f = {
    219     0x1234, 0x9781
    220 };
    221 
    222 static int encode_case_5_enc(WPACKET *pkt)
    223 {
    224     if (!TEST_int_eq(ossl_quic_wire_encode_frame_stop_sending(pkt,
    225                          &encode_case_5_f),
    226             1))
    227         return 0;
    228 
    229     return 1;
    230 }
    231 
    232 static int encode_case_5_dec(PACKET *pkt, ossl_ssize_t fail)
    233 {
    234     OSSL_QUIC_FRAME_STOP_SENDING f = { 0 };
    235 
    236     if (!TEST_int_eq(ossl_quic_wire_decode_frame_stop_sending(pkt, &f), fail < 0))
    237         return 0;
    238 
    239     if (fail >= 0)
    240         return 1;
    241 
    242     if (!TEST_mem_eq(&f, sizeof(f), &encode_case_5_f, sizeof(encode_case_5_f)))
    243         return 0;
    244 
    245     return 1;
    246 }
    247 
    248 static const unsigned char encode_case_5_expect[] = {
    249     0x05, /* Type */
    250     0x52, 0x34, /* Stream ID */
    251     0x80, 0x00, 0x97, 0x81 /* App Error Code */
    252 };
    253 
    254 /* 6. CRYPTO */
    255 static const unsigned char encode_case_6_data[] = {
    256     93, 18, 17, 102, 33
    257 };
    258 
    259 static const OSSL_QUIC_FRAME_CRYPTO encode_case_6_f = {
    260     0x1234, sizeof(encode_case_6_data), encode_case_6_data
    261 };
    262 
    263 static int encode_case_6_enc(WPACKET *pkt)
    264 {
    265     if (!TEST_ptr(ossl_quic_wire_encode_frame_crypto(pkt,
    266             &encode_case_6_f)))
    267         return 0;
    268 
    269     return 1;
    270 }
    271 
    272 static int encode_case_6_dec(PACKET *pkt, ossl_ssize_t fail)
    273 {
    274     OSSL_QUIC_FRAME_CRYPTO f = { 0 };
    275 
    276     if (!TEST_int_eq(ossl_quic_wire_decode_frame_crypto(pkt, 0, &f), fail < 0))
    277         return 0;
    278 
    279     if (fail >= 0)
    280         return 1;
    281 
    282     if (!TEST_uint64_t_eq(f.offset, 0x1234))
    283         return 0;
    284 
    285     if (!TEST_uint64_t_le(f.len, SIZE_MAX))
    286         return 0;
    287 
    288     if (!TEST_mem_eq(f.data, (size_t)f.len,
    289             encode_case_6_data, sizeof(encode_case_6_data)))
    290         return 0;
    291 
    292     return 1;
    293 }
    294 
    295 static const unsigned char encode_case_6_expect[] = {
    296     0x06, /* Type */
    297     0x52, 0x34, /* Offset */
    298     0x05, /* Length */
    299     93, 18, 17, 102, 33 /* Data */
    300 };
    301 
    302 /* 7. NEW_TOKEN */
    303 static const unsigned char encode_case_7_token[] = {
    304     0xde, 0x06, 0xcb, 0x76, 0x5d, 0xb1, 0xa7, 0x71,
    305     0x78, 0x09, 0xbb, 0xe8, 0x50, 0x19, 0x12, 0x9a
    306 };
    307 
    308 static int encode_case_7_enc(WPACKET *pkt)
    309 {
    310     if (!TEST_int_eq(ossl_quic_wire_encode_frame_new_token(pkt,
    311                          encode_case_7_token,
    312                          sizeof(encode_case_7_token)),
    313             1))
    314         return 0;
    315 
    316     return 1;
    317 }
    318 
    319 static int encode_case_7_dec(PACKET *pkt, ossl_ssize_t fail)
    320 {
    321     const unsigned char *token = NULL;
    322     size_t token_len = 0;
    323 
    324     if (!TEST_int_eq(ossl_quic_wire_decode_frame_new_token(pkt,
    325                          &token,
    326                          &token_len),
    327             fail < 0))
    328         return 0;
    329 
    330     if (fail >= 0)
    331         return 1;
    332 
    333     if (!TEST_mem_eq(token, token_len,
    334             encode_case_7_token, sizeof(encode_case_7_token)))
    335         return 0;
    336 
    337     return 1;
    338 }
    339 
    340 static const unsigned char encode_case_7_expect[] = {
    341     0x07, /* Type */
    342     0x10, /* Length */
    343     0xde, 0x06, 0xcb, 0x76, 0x5d, 0xb1, 0xa7, 0x71, /* Token */
    344     0x78, 0x09, 0xbb, 0xe8, 0x50, 0x19, 0x12, 0x9a
    345 };
    346 
    347 /* 8. STREAM (no length, no offset, no fin) */
    348 static const unsigned char encode_case_8_data[] = {
    349     0xde, 0x06, 0xcb, 0x76, 0x5d
    350 };
    351 static const OSSL_QUIC_FRAME_STREAM encode_case_8_f = {
    352     0x1234, 0, 5, encode_case_8_data, 0, 0
    353 };
    354 
    355 static int encode_case_8_enc(WPACKET *pkt)
    356 {
    357     if (!TEST_ptr(ossl_quic_wire_encode_frame_stream(pkt,
    358             &encode_case_8_f)))
    359         return 0;
    360 
    361     return 1;
    362 }
    363 
    364 static int encode_case_8_dec(PACKET *pkt, ossl_ssize_t fail)
    365 {
    366     OSSL_QUIC_FRAME_STREAM f = { 0 };
    367 
    368     if (fail >= 3)
    369         /*
    370          * This case uses implicit length signalling so truncation will not
    371          * cause it to fail unless the header (which is 3 bytes) is truncated.
    372          */
    373         return 1;
    374 
    375     if (!TEST_int_eq(ossl_quic_wire_decode_frame_stream(pkt, 0, &f), fail < 0))
    376         return 0;
    377 
    378     if (fail >= 0)
    379         return 1;
    380 
    381     if (!TEST_uint64_t_le(f.len, SIZE_MAX))
    382         return 0;
    383 
    384     if (!TEST_mem_eq(f.data, (size_t)f.len,
    385             encode_case_8_data, sizeof(encode_case_8_data)))
    386         return 0;
    387 
    388     if (!TEST_uint64_t_eq(f.stream_id, 0x1234))
    389         return 0;
    390 
    391     if (!TEST_uint64_t_eq(f.offset, 0))
    392         return 0;
    393 
    394     if (!TEST_int_eq(f.has_explicit_len, 0))
    395         return 0;
    396 
    397     if (!TEST_int_eq(f.is_fin, 0))
    398         return 0;
    399 
    400     return 1;
    401 }
    402 
    403 static const unsigned char encode_case_8_expect[] = {
    404     0x08, /* Type (OFF=0, LEN=0, FIN=0) */
    405     0x52, 0x34, /* Stream ID */
    406     0xde, 0x06, 0xcb, 0x76, 0x5d /* Data */
    407 };
    408 
    409 /* 9. STREAM (length, offset, fin) */
    410 static const unsigned char encode_case_9_data[] = {
    411     0xde, 0x06, 0xcb, 0x76, 0x5d
    412 };
    413 static const OSSL_QUIC_FRAME_STREAM encode_case_9_f = {
    414     0x1234, 0x39, 5, encode_case_9_data, 1, 1
    415 };
    416 
    417 static int encode_case_9_enc(WPACKET *pkt)
    418 {
    419     if (!TEST_ptr(ossl_quic_wire_encode_frame_stream(pkt,
    420             &encode_case_9_f)))
    421         return 0;
    422 
    423     return 1;
    424 }
    425 
    426 static int encode_case_9_dec(PACKET *pkt, ossl_ssize_t fail)
    427 {
    428     OSSL_QUIC_FRAME_STREAM f = { 0 };
    429 
    430     if (!TEST_int_eq(ossl_quic_wire_decode_frame_stream(pkt, 0, &f), fail < 0))
    431         return 0;
    432 
    433     if (fail >= 0)
    434         return 1;
    435 
    436     if (!TEST_uint64_t_le(f.len, SIZE_MAX))
    437         return 0;
    438 
    439     if (!TEST_mem_eq(f.data, (size_t)f.len,
    440             encode_case_9_data, sizeof(encode_case_9_data)))
    441         return 0;
    442 
    443     if (!TEST_uint64_t_eq(f.stream_id, 0x1234))
    444         return 0;
    445 
    446     if (!TEST_uint64_t_eq(f.offset, 0x39))
    447         return 0;
    448 
    449     if (!TEST_int_eq(f.has_explicit_len, 1))
    450         return 0;
    451 
    452     if (!TEST_int_eq(f.is_fin, 1))
    453         return 0;
    454 
    455     return 1;
    456 }
    457 
    458 static const unsigned char encode_case_9_expect[] = {
    459     0x0f, /* Type (OFF=1, LEN=1, FIN=1) */
    460     0x52, 0x34, /* Stream ID */
    461     0x39, /* Offset */
    462     0x05, /* Length */
    463     0xde, 0x06, 0xcb, 0x76, 0x5d /* Data */
    464 };
    465 
    466 /* 10. MAX_DATA */
    467 static int encode_case_10_enc(WPACKET *pkt)
    468 {
    469     if (!TEST_int_eq(ossl_quic_wire_encode_frame_max_data(pkt, 0x1234), 1))
    470         return 0;
    471 
    472     return 1;
    473 }
    474 
    475 static int encode_case_10_dec(PACKET *pkt, ossl_ssize_t fail)
    476 {
    477     uint64_t max_data = 0;
    478 
    479     if (!TEST_int_eq(ossl_quic_wire_decode_frame_max_data(pkt, &max_data), fail < 0))
    480         return 0;
    481 
    482     if (fail >= 0)
    483         return 1;
    484 
    485     if (!TEST_uint64_t_eq(max_data, 0x1234))
    486         return 0;
    487 
    488     return 1;
    489 }
    490 
    491 static const unsigned char encode_case_10_expect[] = {
    492     0x10, /* Type */
    493     0x52,
    494     0x34, /* Max Data */
    495 };
    496 
    497 /* 11. MAX_STREAM_DATA */
    498 static int encode_case_11_enc(WPACKET *pkt)
    499 {
    500     if (!TEST_int_eq(ossl_quic_wire_encode_frame_max_stream_data(pkt,
    501                          0x1234,
    502                          0x9781),
    503             1))
    504         return 0;
    505 
    506     return 1;
    507 }
    508 
    509 static int encode_case_11_dec(PACKET *pkt, ossl_ssize_t fail)
    510 {
    511     uint64_t stream_id = 0, max_data = 0;
    512 
    513     if (!TEST_int_eq(ossl_quic_wire_decode_frame_max_stream_data(pkt,
    514                          &stream_id,
    515                          &max_data),
    516             fail < 0))
    517         return 0;
    518 
    519     if (fail >= 0)
    520         return 1;
    521 
    522     if (!TEST_uint64_t_eq(stream_id, 0x1234))
    523         return 0;
    524 
    525     if (!TEST_uint64_t_eq(max_data, 0x9781))
    526         return 0;
    527 
    528     return 1;
    529 }
    530 
    531 static const unsigned char encode_case_11_expect[] = {
    532     0x11, /* Type */
    533     0x52,
    534     0x34, /* Stream ID */
    535     0x80,
    536     0x00,
    537     0x97,
    538     0x81, /* Max Data */
    539 };
    540 
    541 /* 12. MAX_STREAMS */
    542 static int encode_case_12_enc(WPACKET *pkt)
    543 {
    544     if (!TEST_int_eq(ossl_quic_wire_encode_frame_max_streams(pkt, 0, 0x1234), 1))
    545         return 0;
    546 
    547     if (!TEST_int_eq(ossl_quic_wire_encode_frame_max_streams(pkt, 1, 0x9781), 1))
    548         return 0;
    549 
    550     return 1;
    551 }
    552 
    553 static int encode_case_12_dec(PACKET *pkt, ossl_ssize_t fail)
    554 {
    555     uint64_t max_streams_1 = 0, max_streams_2 = 0,
    556              frame_type_1 = 0, frame_type_2 = 0;
    557     int is_minimal = 1, success_if;
    558 
    559     success_if = (fail < 0 || fail >= 1);
    560     if (!TEST_int_eq(ossl_quic_wire_peek_frame_header(pkt, &frame_type_1,
    561                          &is_minimal),
    562             success_if))
    563         return 0;
    564 
    565     if (!TEST_true(!success_if || is_minimal))
    566         return 0;
    567 
    568     success_if = (fail < 0 || fail >= 3);
    569     if (!TEST_int_eq(ossl_quic_wire_decode_frame_max_streams(pkt,
    570                          &max_streams_1),
    571             success_if))
    572         return 0;
    573 
    574     success_if = (fail < 0 || fail >= 4);
    575     if (!TEST_int_eq(ossl_quic_wire_peek_frame_header(pkt, &frame_type_2,
    576                          &is_minimal),
    577             success_if))
    578         return 0;
    579 
    580     if (!TEST_true(!success_if || is_minimal))
    581         return 0;
    582 
    583     success_if = (fail < 0);
    584     if (!TEST_int_eq(ossl_quic_wire_decode_frame_max_streams(pkt,
    585                          &max_streams_2),
    586             success_if))
    587         return 0;
    588 
    589     if ((fail < 0 || fail >= 3)
    590         && !TEST_uint64_t_eq(frame_type_1, OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI))
    591         return 0;
    592 
    593     if ((fail < 0 || fail >= 3)
    594         && !TEST_uint64_t_eq(max_streams_1, 0x1234))
    595         return 0;
    596 
    597     if ((fail < 0 || fail >= 8)
    598         && !TEST_uint64_t_eq(frame_type_2, OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_UNI))
    599         return 0;
    600 
    601     if ((fail < 0 || fail >= 8)
    602         && !TEST_uint64_t_eq(max_streams_2, 0x9781))
    603         return 0;
    604 
    605     return 1;
    606 }
    607 
    608 static const unsigned char encode_case_12_expect[] = {
    609     0x12, /* Type (MAX_STREAMS Bidirectional) */
    610     0x52,
    611     0x34, /* Max Streams */
    612     0x13, /* Type (MAX_STREAMS Unidirectional) */
    613     0x80,
    614     0x00,
    615     0x97,
    616     0x81, /* Max Streams */
    617 };
    618 
    619 /* 13. DATA_BLOCKED */
    620 static int encode_case_13_enc(WPACKET *pkt)
    621 {
    622     if (!TEST_int_eq(ossl_quic_wire_encode_frame_data_blocked(pkt, 0x1234), 1))
    623         return 0;
    624 
    625     return 1;
    626 }
    627 
    628 static int encode_case_13_dec(PACKET *pkt, ossl_ssize_t fail)
    629 {
    630     uint64_t max_data = 0;
    631 
    632     if (!TEST_int_eq(ossl_quic_wire_decode_frame_data_blocked(pkt,
    633                          &max_data),
    634             fail < 0))
    635         return 0;
    636 
    637     if (fail >= 0)
    638         return 1;
    639 
    640     if (!TEST_uint64_t_eq(max_data, 0x1234))
    641         return 0;
    642 
    643     return 1;
    644 }
    645 
    646 static const unsigned char encode_case_13_expect[] = {
    647     0x14, /* Type */
    648     0x52,
    649     0x34, /* Max Data */
    650 };
    651 
    652 /* 14. STREAM_DATA_BLOCKED */
    653 static int encode_case_14_enc(WPACKET *pkt)
    654 {
    655     if (!TEST_int_eq(ossl_quic_wire_encode_frame_stream_data_blocked(pkt,
    656                          0x1234,
    657                          0x9781),
    658             1))
    659         return 0;
    660 
    661     return 1;
    662 }
    663 
    664 static int encode_case_14_dec(PACKET *pkt, ossl_ssize_t fail)
    665 {
    666     uint64_t stream_id = 0, max_data = 0;
    667 
    668     if (!TEST_int_eq(ossl_quic_wire_decode_frame_stream_data_blocked(pkt,
    669                          &stream_id,
    670                          &max_data),
    671             fail < 0))
    672         return 0;
    673 
    674     if (fail >= 0)
    675         return 1;
    676 
    677     if (!TEST_uint64_t_eq(stream_id, 0x1234))
    678         return 0;
    679 
    680     if (!TEST_uint64_t_eq(max_data, 0x9781))
    681         return 0;
    682 
    683     return 1;
    684 }
    685 
    686 static const unsigned char encode_case_14_expect[] = {
    687     0x15, /* Type */
    688     0x52,
    689     0x34, /* Stream ID */
    690     0x80,
    691     0x00,
    692     0x97,
    693     0x81, /* Max Data */
    694 };
    695 
    696 /* 15. STREAMS_BLOCKED */
    697 static int encode_case_15_enc(WPACKET *pkt)
    698 {
    699     if (!TEST_int_eq(ossl_quic_wire_encode_frame_streams_blocked(pkt, 0, 0x1234), 1))
    700         return 0;
    701 
    702     if (!TEST_int_eq(ossl_quic_wire_encode_frame_streams_blocked(pkt, 1, 0x9781), 1))
    703         return 0;
    704 
    705     return 1;
    706 }
    707 
    708 static int encode_case_15_dec(PACKET *pkt, ossl_ssize_t fail)
    709 {
    710     uint64_t max_streams_1 = 0, max_streams_2 = 0,
    711              frame_type_1 = 0, frame_type_2 = 0;
    712     int is_minimal = 1, success_if;
    713 
    714     success_if = (fail < 0 || fail >= 1);
    715     if (!TEST_int_eq(ossl_quic_wire_peek_frame_header(pkt, &frame_type_1,
    716                          &is_minimal),
    717             success_if))
    718         return 0;
    719 
    720     if (!TEST_true(!success_if || is_minimal))
    721         return 0;
    722 
    723     success_if = (fail < 0 || fail >= 3);
    724     if (!TEST_int_eq(ossl_quic_wire_decode_frame_streams_blocked(pkt,
    725                          &max_streams_1),
    726             success_if))
    727         return 0;
    728 
    729     success_if = (fail < 0 || fail >= 4);
    730     if (!TEST_int_eq(ossl_quic_wire_peek_frame_header(pkt, &frame_type_2,
    731                          &is_minimal),
    732             success_if))
    733         return 0;
    734 
    735     if (!TEST_true(!success_if || is_minimal))
    736         return 0;
    737 
    738     if (!TEST_int_eq(ossl_quic_wire_decode_frame_streams_blocked(pkt,
    739                          &max_streams_2),
    740             fail < 0 || fail >= 8))
    741         return 0;
    742 
    743     if ((fail < 0 || fail >= 1)
    744         && !TEST_uint64_t_eq(frame_type_1, OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI))
    745         return 0;
    746 
    747     if ((fail < 0 || fail >= 3)
    748         && !TEST_uint64_t_eq(max_streams_1, 0x1234))
    749         return 0;
    750 
    751     if ((fail < 0 || fail >= 4)
    752         && !TEST_uint64_t_eq(frame_type_2, OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_UNI))
    753         return 0;
    754 
    755     if ((fail < 0 || fail >= 8)
    756         && !TEST_uint64_t_eq(max_streams_2, 0x9781))
    757         return 0;
    758 
    759     return 1;
    760 }
    761 
    762 static const unsigned char encode_case_15_expect[] = {
    763     0x16, /* Type (STREAMS_BLOCKED Bidirectional) */
    764     0x52,
    765     0x34, /* Max Streams */
    766     0x17, /* Type (STREAMS_BLOCKED Unidirectional) */
    767     0x80,
    768     0x00,
    769     0x97,
    770     0x81, /* Max Streams */
    771 };
    772 
    773 /* 16. NEW_CONNECTION_ID */
    774 static const unsigned char encode_case_16_conn_id[] = {
    775     0x33, 0x44, 0x55, 0x66
    776 };
    777 
    778 static const OSSL_QUIC_FRAME_NEW_CONN_ID encode_case_16_f = {
    779     0x9781,
    780     0x1234,
    781     { 0x4,
    782         { 0x33, 0x44, 0x55, 0x66 } },
    783     { { 0xde, 0x06, 0xcb, 0x76, 0x5d, 0xb1, 0xa7, 0x71,
    784         0x78, 0x09, 0xbb, 0xe8, 0x50, 0x19, 0x12, 0x9a } }
    785 };
    786 
    787 static int encode_case_16_enc(WPACKET *pkt)
    788 {
    789     if (!TEST_int_eq(ossl_quic_wire_encode_frame_new_conn_id(pkt,
    790                          &encode_case_16_f),
    791             1))
    792         return 0;
    793 
    794     return 1;
    795 }
    796 
    797 static int encode_case_16_dec(PACKET *pkt, ossl_ssize_t fail)
    798 {
    799     OSSL_QUIC_FRAME_NEW_CONN_ID f = { 0 };
    800 
    801     if (!TEST_int_eq(ossl_quic_wire_decode_frame_new_conn_id(pkt, &f), fail < 0))
    802         return 0;
    803 
    804     if (fail >= 0)
    805         return 1;
    806 
    807     if (!TEST_uint64_t_eq(f.seq_num, 0x9781))
    808         return 0;
    809 
    810     if (!TEST_uint64_t_eq(f.retire_prior_to, 0x1234))
    811         return 0;
    812 
    813     if (!TEST_uint64_t_eq(f.conn_id.id_len, sizeof(encode_case_16_conn_id)))
    814         return 0;
    815 
    816     if (!TEST_mem_eq(f.conn_id.id, f.conn_id.id_len,
    817             encode_case_16_conn_id, sizeof(encode_case_16_conn_id)))
    818         return 0;
    819 
    820     if (!TEST_mem_eq(f.stateless_reset.token,
    821             sizeof(f.stateless_reset.token),
    822             encode_case_16_f.stateless_reset.token,
    823             sizeof(encode_case_16_f.stateless_reset.token)))
    824         return 0;
    825 
    826     return 1;
    827 }
    828 
    829 static const unsigned char encode_case_16_expect[] = {
    830     0x18, /* Type */
    831     0x80, 0x00, 0x97, 0x81, /* Sequence Number */
    832     0x52, 0x34, /* Retire Prior To */
    833     0x04, /* Connection ID Length */
    834     0x33, 0x44, 0x55, 0x66, /* Connection ID */
    835     0xde, 0x06, 0xcb, 0x76, 0x5d, 0xb1, 0xa7, 0x71, /* Stateless Reset Token */
    836     0x78, 0x09, 0xbb, 0xe8, 0x50, 0x19, 0x12, 0x9a
    837 };
    838 
    839 /* 16b. NEW_CONNECTION_ID seq_num < retire_prior_to */
    840 static const OSSL_QUIC_FRAME_NEW_CONN_ID encode_case_16b_f = {
    841     0x1234,
    842     0x9781,
    843     { 0x4,
    844         { 0x33, 0x44, 0x55, 0x66 } },
    845     { { 0xde, 0x06, 0xcb, 0x76, 0x5d, 0xb1, 0xa7, 0x71,
    846         0x78, 0x09, 0xbb, 0xe8, 0x50, 0x19, 0x12, 0x9a } }
    847 };
    848 
    849 static int encode_case_16b_enc(WPACKET *pkt)
    850 {
    851     if (!TEST_int_eq(ossl_quic_wire_encode_frame_new_conn_id(pkt,
    852                          &encode_case_16b_f),
    853             1))
    854         return 0;
    855 
    856     return 1;
    857 }
    858 
    859 static int encode_case_16b_dec(PACKET *pkt, ossl_ssize_t fail)
    860 {
    861     OSSL_QUIC_FRAME_NEW_CONN_ID f = { 0 };
    862 
    863     if (!TEST_int_eq(ossl_quic_wire_decode_frame_new_conn_id(pkt, &f), 0))
    864         return 0;
    865 
    866     if (!TEST_true(PACKET_forward(pkt, PACKET_remaining(pkt))))
    867         return 0;
    868 
    869     return 1;
    870 }
    871 
    872 static const unsigned char encode_case_16b_expect[] = {
    873     0x18, /* Type */
    874     0x52, 0x34, /* Sequence Number */
    875     0x80, 0x00, 0x97, 0x81, /* Retire Prior To */
    876     0x04, /* Connection ID Length */
    877     0x33, 0x44, 0x55, 0x66, /* Connection ID */
    878     0xde, 0x06, 0xcb, 0x76, 0x5d, 0xb1, 0xa7, 0x71, /* Stateless Reset Token */
    879     0x78, 0x09, 0xbb, 0xe8, 0x50, 0x19, 0x12, 0x9a
    880 };
    881 
    882 /* 17. RETIRE_CONNECTION_ID */
    883 static int encode_case_17_enc(WPACKET *pkt)
    884 {
    885     if (!TEST_int_eq(ossl_quic_wire_encode_frame_retire_conn_id(pkt, 0x1234), 1))
    886         return 0;
    887 
    888     return 1;
    889 }
    890 
    891 static int encode_case_17_dec(PACKET *pkt, ossl_ssize_t fail)
    892 {
    893     uint64_t seq_num = 0;
    894 
    895     if (!TEST_int_eq(ossl_quic_wire_decode_frame_retire_conn_id(pkt, &seq_num), fail < 0))
    896         return 0;
    897 
    898     if (fail >= 0)
    899         return 1;
    900 
    901     if (!TEST_uint64_t_eq(seq_num, 0x1234))
    902         return 0;
    903 
    904     return 1;
    905 }
    906 
    907 static const unsigned char encode_case_17_expect[] = {
    908     0x19, /* Type */
    909     0x52,
    910     0x34, /* Seq Num */
    911 };
    912 
    913 /* 18. PATH_CHALLENGE */
    914 static const uint64_t encode_case_18_data
    915     = (((uint64_t)0x5f4b12) << 40) | (uint64_t)0x731834UL;
    916 
    917 static int encode_case_18_enc(WPACKET *pkt)
    918 {
    919     if (!TEST_int_eq(ossl_quic_wire_encode_frame_path_challenge(pkt,
    920                          encode_case_18_data),
    921             1))
    922         return 0;
    923 
    924     return 1;
    925 }
    926 
    927 static int encode_case_18_dec(PACKET *pkt, ossl_ssize_t fail)
    928 {
    929     uint64_t challenge = 0;
    930 
    931     if (!TEST_int_eq(ossl_quic_wire_decode_frame_path_challenge(pkt, &challenge), fail < 0))
    932         return 0;
    933 
    934     if (fail >= 0)
    935         return 1;
    936 
    937     if (!TEST_uint64_t_eq(challenge, encode_case_18_data))
    938         return 0;
    939 
    940     return 1;
    941 }
    942 
    943 static const unsigned char encode_case_18_expect[] = {
    944     0x1A, /* Type */
    945     0x5f,
    946     0x4b,
    947     0x12,
    948     0x00,
    949     0x00,
    950     0x73,
    951     0x18,
    952     0x34, /* Data */
    953 };
    954 
    955 /* 19. PATH_RESPONSE */
    956 static const uint64_t encode_case_19_data
    957     = (((uint64_t)0x5f4b12) << 40) | (uint64_t)0x731834UL;
    958 
    959 static int encode_case_19_enc(WPACKET *pkt)
    960 {
    961     if (!TEST_int_eq(ossl_quic_wire_encode_frame_path_response(pkt,
    962                          encode_case_19_data),
    963             1))
    964         return 0;
    965 
    966     return 1;
    967 }
    968 
    969 static int encode_case_19_dec(PACKET *pkt, ossl_ssize_t fail)
    970 {
    971     uint64_t challenge = 0;
    972 
    973     if (!TEST_int_eq(ossl_quic_wire_decode_frame_path_response(pkt, &challenge), fail < 0))
    974         return 0;
    975 
    976     if (fail >= 0)
    977         return 1;
    978 
    979     if (!TEST_uint64_t_eq(challenge, encode_case_19_data))
    980         return 0;
    981 
    982     return 1;
    983 }
    984 
    985 static const unsigned char encode_case_19_expect[] = {
    986     0x1B, /* Type */
    987     0x5f,
    988     0x4b,
    989     0x12,
    990     0x00,
    991     0x00,
    992     0x73,
    993     0x18,
    994     0x34, /* Data */
    995 };
    996 
    997 /* 20. CONNECTION_CLOSE (transport) */
    998 static const char encode_case_20_reason[] = {
    999     /* "reason for closure" */
   1000     0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x66, 0x6f,
   1001     0x72, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65
   1002 };
   1003 
   1004 static const OSSL_QUIC_FRAME_CONN_CLOSE encode_case_20_f = {
   1005     0,
   1006     0x1234,
   1007     0x9781,
   1008     (char *)encode_case_20_reason,
   1009     sizeof(encode_case_20_reason)
   1010 };
   1011 
   1012 static int encode_case_20_enc(WPACKET *pkt)
   1013 {
   1014     if (!TEST_int_eq(ossl_quic_wire_encode_frame_conn_close(pkt,
   1015                          &encode_case_20_f),
   1016             1))
   1017         return 0;
   1018 
   1019     return 1;
   1020 }
   1021 
   1022 static int encode_case_20_dec(PACKET *pkt, ossl_ssize_t fail)
   1023 {
   1024     OSSL_QUIC_FRAME_CONN_CLOSE f = { 0 };
   1025 
   1026     if (!TEST_int_eq(ossl_quic_wire_decode_frame_conn_close(pkt, &f), fail < 0))
   1027         return 0;
   1028 
   1029     if (fail >= 0)
   1030         return 1;
   1031 
   1032     if (!TEST_int_eq(f.is_app, 0))
   1033         return 0;
   1034 
   1035     if (!TEST_uint64_t_eq(f.error_code, 0x1234))
   1036         return 0;
   1037 
   1038     if (!TEST_uint64_t_eq(f.frame_type, 0x9781))
   1039         return 0;
   1040 
   1041     if (!TEST_size_t_eq(f.reason_len, 18))
   1042         return 0;
   1043 
   1044     if (!TEST_mem_eq(f.reason, f.reason_len,
   1045             encode_case_20_f.reason, encode_case_20_f.reason_len))
   1046         return 0;
   1047 
   1048     return 1;
   1049 }
   1050 
   1051 static const unsigned char encode_case_20_expect[] = {
   1052     0x1C, /* Type */
   1053     0x52, 0x34, /* Sequence Number */
   1054     0x80, 0x00, 0x97, 0x81, /* Frame Type */
   1055     0x12, /* Reason Length */
   1056     0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x66, 0x6f, /* Reason */
   1057     0x72, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65
   1058 };
   1059 
   1060 /* 21. HANDSHAKE_DONE */
   1061 static int encode_case_21_enc(WPACKET *pkt)
   1062 {
   1063 
   1064     if (!TEST_int_eq(ossl_quic_wire_encode_frame_handshake_done(pkt), 1))
   1065         return 0;
   1066 
   1067     return 1;
   1068 }
   1069 
   1070 static int encode_case_21_dec(PACKET *pkt, ossl_ssize_t fail)
   1071 {
   1072 
   1073     if (!TEST_int_eq(ossl_quic_wire_decode_frame_handshake_done(pkt), fail < 0))
   1074         return 0;
   1075 
   1076     return 1;
   1077 }
   1078 
   1079 static const unsigned char encode_case_21_expect[] = {
   1080     0x1E
   1081 };
   1082 
   1083 /* 22. Buffer Transport Parameter */
   1084 static const unsigned char encode_case_22_data[] = { 0x55, 0x77, 0x32, 0x46, 0x99 };
   1085 
   1086 static int encode_case_22_enc(WPACKET *pkt)
   1087 {
   1088     unsigned char *p;
   1089 
   1090     if (!TEST_ptr(ossl_quic_wire_encode_transport_param_bytes(pkt, 0x1234,
   1091             encode_case_22_data,
   1092             sizeof(encode_case_22_data))))
   1093         return 0;
   1094 
   1095     if (!TEST_ptr(p = ossl_quic_wire_encode_transport_param_bytes(pkt, 0x9781,
   1096                       NULL, 2)))
   1097         return 0;
   1098 
   1099     p[0] = 0x33;
   1100     p[1] = 0x44;
   1101 
   1102     return 1;
   1103 }
   1104 
   1105 static int encode_case_22_dec(PACKET *pkt, ossl_ssize_t fail)
   1106 {
   1107     uint64_t id = 0;
   1108     size_t len = 0;
   1109     const unsigned char *p;
   1110     static const unsigned char data[] = { 0x33, 0x44 };
   1111 
   1112     if (!TEST_int_eq(ossl_quic_wire_peek_transport_param(pkt, &id),
   1113             fail < 0 || fail >= 2))
   1114         return 0;
   1115 
   1116     if ((fail < 0 || fail >= 2)
   1117         && !TEST_uint64_t_eq(id, 0x1234))
   1118         return 0;
   1119 
   1120     id = 0;
   1121 
   1122     p = ossl_quic_wire_decode_transport_param_bytes(pkt, &id, &len);
   1123     if (fail < 0 || fail >= 8) {
   1124         if (!TEST_ptr(p))
   1125             return 0;
   1126     } else {
   1127         if (!TEST_ptr_null(p))
   1128             return 0;
   1129     }
   1130 
   1131     if ((fail < 0 || fail >= 8)
   1132         && !TEST_uint64_t_eq(id, 0x1234))
   1133         return 0;
   1134 
   1135     if ((fail < 0 || fail >= 8)
   1136         && !TEST_mem_eq(p, len, encode_case_22_data, sizeof(encode_case_22_data)))
   1137         return 0;
   1138 
   1139     if ((fail < 0 || fail >= 8)
   1140         && !TEST_int_eq(ossl_quic_wire_peek_transport_param(pkt, &id),
   1141             fail < 0 || fail >= 12))
   1142         return 0;
   1143 
   1144     if ((fail < 0 || fail >= 12)
   1145         && !TEST_uint64_t_eq(id, 0x9781))
   1146         return 0;
   1147 
   1148     id = 0;
   1149 
   1150     p = ossl_quic_wire_decode_transport_param_bytes(pkt, &id, &len);
   1151     if (fail < 0 || fail >= 15) {
   1152         if (!TEST_ptr(p))
   1153             return 0;
   1154     } else {
   1155         if (!TEST_ptr_null(p))
   1156             return 0;
   1157     }
   1158 
   1159     if ((fail < 0 || fail >= 15)
   1160         && !TEST_uint64_t_eq(id, 0x9781))
   1161         return 0;
   1162 
   1163     if ((fail < 0 || fail >= 15)
   1164         && !TEST_mem_eq(p, len, data, sizeof(data)))
   1165         return 0;
   1166 
   1167     return 1;
   1168 }
   1169 
   1170 static const unsigned char encode_case_22_expect[] = {
   1171     0x52, 0x34, /* ID */
   1172     0x05, /* Length */
   1173     0x55, 0x77, 0x32, 0x46, 0x99, /* Data */
   1174 
   1175     0x80, 0x00, 0x97, 0x81, /* ID */
   1176     0x02, /* Length */
   1177     0x33, 0x44 /* Data */
   1178 };
   1179 
   1180 /* 23. Integer Transport Parameter */
   1181 static int encode_case_23_enc(WPACKET *pkt)
   1182 {
   1183     if (!TEST_int_eq(ossl_quic_wire_encode_transport_param_int(pkt, 0x1234, 0x9781), 1))
   1184         return 0;
   1185 
   1186     if (!TEST_int_eq(ossl_quic_wire_encode_transport_param_int(pkt, 0x2233, 0x4545), 1))
   1187         return 0;
   1188 
   1189     return 1;
   1190 }
   1191 
   1192 static int encode_case_23_dec(PACKET *pkt, ossl_ssize_t fail)
   1193 {
   1194     uint64_t id = 0, value = 0;
   1195 
   1196     if (!TEST_int_eq(ossl_quic_wire_decode_transport_param_int(pkt,
   1197                          &id, &value),
   1198             fail < 0 || fail >= 7))
   1199         return 0;
   1200 
   1201     if ((fail < 0 || fail >= 7)
   1202         && !TEST_uint64_t_eq(id, 0x1234))
   1203         return 0;
   1204 
   1205     if ((fail < 0 || fail >= 7)
   1206         && !TEST_uint64_t_eq(value, 0x9781))
   1207         return 0;
   1208 
   1209     if (!TEST_int_eq(ossl_quic_wire_decode_transport_param_int(pkt,
   1210                          &id, &value),
   1211             fail < 0 || fail >= 14))
   1212         return 0;
   1213 
   1214     if ((fail < 0 || fail >= 14)
   1215         && !TEST_uint64_t_eq(id, 0x2233))
   1216         return 0;
   1217 
   1218     if ((fail < 0 || fail >= 14)
   1219         && !TEST_uint64_t_eq(value, 0x4545))
   1220         return 0;
   1221 
   1222     return 1;
   1223 }
   1224 
   1225 static const unsigned char encode_case_23_expect[] = {
   1226     0x52,
   1227     0x34,
   1228     0x04,
   1229     0x80,
   1230     0x00,
   1231     0x97,
   1232     0x81,
   1233 
   1234     0x62,
   1235     0x33,
   1236     0x04,
   1237     0x80,
   1238     0x00,
   1239     0x45,
   1240     0x45,
   1241 };
   1242 
   1243 #define ENCODE_CASE(n)                        \
   1244     {                                         \
   1245         encode_case_##n##_enc,                \
   1246         encode_case_##n##_expect,             \
   1247         OSSL_NELEM(encode_case_##n##_expect), \
   1248         encode_case_##n##_dec                 \
   1249     },
   1250 
   1251 static const struct encode_test_case encode_cases[] = {
   1252     ENCODE_CASE(1)
   1253         ENCODE_CASE(2)
   1254             ENCODE_CASE(3)
   1255                 ENCODE_CASE(4)
   1256                     ENCODE_CASE(5)
   1257                         ENCODE_CASE(6)
   1258                             ENCODE_CASE(7)
   1259                                 ENCODE_CASE(8)
   1260                                     ENCODE_CASE(9)
   1261                                         ENCODE_CASE(10)
   1262                                             ENCODE_CASE(11)
   1263                                                 ENCODE_CASE(12)
   1264                                                     ENCODE_CASE(13)
   1265                                                         ENCODE_CASE(14)
   1266                                                             ENCODE_CASE(15)
   1267                                                                 ENCODE_CASE(16)
   1268                                                                     ENCODE_CASE(16b)
   1269                                                                         ENCODE_CASE(17)
   1270                                                                             ENCODE_CASE(18)
   1271                                                                                 ENCODE_CASE(19)
   1272                                                                                     ENCODE_CASE(20)
   1273                                                                                         ENCODE_CASE(21)
   1274                                                                                             ENCODE_CASE(22)
   1275                                                                                                 ENCODE_CASE(23)
   1276 };
   1277 
   1278 static int test_wire_encode(int idx)
   1279 {
   1280     int testresult = 0;
   1281     WPACKET wpkt;
   1282     PACKET pkt;
   1283     BUF_MEM *buf = NULL;
   1284     size_t written;
   1285     const struct encode_test_case *c = &encode_cases[idx];
   1286     int have_wpkt = 0;
   1287     size_t i;
   1288 
   1289     if (!TEST_ptr(buf = BUF_MEM_new()))
   1290         goto err;
   1291 
   1292     if (!TEST_int_eq(WPACKET_init(&wpkt, buf), 1))
   1293         goto err;
   1294 
   1295     have_wpkt = 1;
   1296     if (!TEST_int_eq(c->serializer(&wpkt), 1))
   1297         goto err;
   1298 
   1299     if (!TEST_int_eq(WPACKET_get_total_written(&wpkt, &written), 1))
   1300         goto err;
   1301 
   1302     if (!TEST_mem_eq(buf->data, written, c->expect_buf, c->expect_buf_len))
   1303         goto err;
   1304 
   1305     if (!TEST_int_eq(PACKET_buf_init(&pkt, (unsigned char *)buf->data, written), 1))
   1306         goto err;
   1307 
   1308     if (!TEST_int_eq(c->deserializer(&pkt, -1), 1))
   1309         goto err;
   1310 
   1311     if (!TEST_false(PACKET_remaining(&pkt)))
   1312         goto err;
   1313 
   1314     for (i = 0; i < c->expect_buf_len; ++i) {
   1315         PACKET pkt2;
   1316 
   1317         /*
   1318          * Check parsing truncated (i.e., malformed) input is handled correctly.
   1319          * Generate all possible truncations of our reference encoding and
   1320          * verify that they are handled correctly. The number of bytes of the
   1321          * truncated encoding is passed as an argument to the deserializer to
   1322          * help it determine whether decoding should fail or not.
   1323          */
   1324         if (!TEST_int_eq(PACKET_buf_init(&pkt2, (unsigned char *)c->expect_buf, i), 1))
   1325             goto err;
   1326 
   1327         if (!TEST_int_eq(c->deserializer(&pkt2, i), 1))
   1328             goto err;
   1329     }
   1330 
   1331     testresult = 1;
   1332 err:
   1333     if (have_wpkt)
   1334         WPACKET_finish(&wpkt);
   1335     BUF_MEM_free(buf);
   1336     return testresult;
   1337 }
   1338 
   1339 struct ack_test_case {
   1340     const unsigned char *input_buf;
   1341     size_t input_buf_len;
   1342     int (*deserializer)(PACKET *pkt);
   1343     int expect_fail;
   1344 };
   1345 
   1346 /* ACK Frame with Excessive First ACK Range Field */
   1347 static const unsigned char ack_case_1_input[] = {
   1348     0x02, /* ACK Without ECN */
   1349     0x08, /* Largest Acknowledged */
   1350     0x01, /* ACK Delay */
   1351     0x00, /* ACK Range Count */
   1352     0x09, /* First ACK Range */
   1353 };
   1354 
   1355 /* ACK Frame with Valid ACK Range Field */
   1356 static const unsigned char ack_case_2_input[] = {
   1357     0x02, /* ACK Without ECN */
   1358     0x08, /* Largest Acknowledged */
   1359     0x01, /* ACK Delay */
   1360     0x00, /* ACK Range Count */
   1361     0x08, /* First ACK Range */
   1362 };
   1363 
   1364 /* ACK Frame with Excessive ACK Range Gap */
   1365 static const unsigned char ack_case_3_input[] = {
   1366     0x02, /* ACK Without ECN */
   1367     0x08, /* Largest Acknowledged */
   1368     0x01, /* ACK Delay */
   1369     0x01, /* ACK Range Count */
   1370     0x01, /* First ACK Range */
   1371 
   1372     0x05, /* Gap */
   1373     0x01, /* ACK Range Length */
   1374 };
   1375 
   1376 /* ACK Frame with Valid ACK Range */
   1377 static const unsigned char ack_case_4_input[] = {
   1378     0x02, /* ACK Without ECN */
   1379     0x08, /* Largest Acknowledged */
   1380     0x01, /* ACK Delay */
   1381     0x01, /* ACK Range Count */
   1382     0x01, /* First ACK Range */
   1383 
   1384     0x04, /* Gap */
   1385     0x01, /* ACK Range Length */
   1386 };
   1387 
   1388 /* ACK Frame with Excessive ACK Range Length */
   1389 static const unsigned char ack_case_5_input[] = {
   1390     0x02, /* ACK Without ECN */
   1391     0x08, /* Largest Acknowledged */
   1392     0x01, /* ACK Delay */
   1393     0x01, /* ACK Range Count */
   1394     0x01, /* First ACK Range */
   1395 
   1396     0x04, /* Gap */
   1397     0x02, /* ACK Range Length */
   1398 };
   1399 
   1400 /* ACK Frame with Multiple ACK Ranges, Final Having Excessive Length */
   1401 static const unsigned char ack_case_6_input[] = {
   1402     0x02, /* ACK Without ECN */
   1403     0x08, /* Largest Acknowledged */
   1404     0x01, /* ACK Delay */
   1405     0x02, /* ACK Range Count */
   1406     0x01, /* First ACK Range */
   1407 
   1408     0x01, /* Gap */
   1409     0x02, /* ACK Range Length */
   1410 
   1411     0x00, /* Gap */
   1412     0x01, /* ACK Range Length */
   1413 };
   1414 
   1415 /* ACK Frame with Multiple ACK Ranges, Valid */
   1416 static const unsigned char ack_case_7_input[] = {
   1417     0x02, /* ACK Without ECN */
   1418     0x08, /* Largest Acknowledged */
   1419     0x01, /* ACK Delay */
   1420     0x02, /* ACK Range Count */
   1421     0x01, /* First ACK Range */
   1422 
   1423     0x01, /* Gap */
   1424     0x02, /* ACK Range Length */
   1425 
   1426     0x00, /* Gap */
   1427     0x00, /* ACK Range Length */
   1428 };
   1429 
   1430 static int ack_generic_decode(PACKET *pkt)
   1431 {
   1432     OSSL_QUIC_ACK_RANGE ranges[8] = { 0 };
   1433     OSSL_QUIC_FRAME_ACK f = { 0 };
   1434     uint64_t total_ranges = 0, peek_total_ranges = 0;
   1435     int r;
   1436     size_t i;
   1437 
   1438     f.ack_ranges = ranges;
   1439     f.num_ack_ranges = OSSL_NELEM(ranges);
   1440 
   1441     if (!TEST_int_eq(ossl_quic_wire_peek_frame_ack_num_ranges(pkt,
   1442                          &peek_total_ranges),
   1443             1))
   1444         return 0;
   1445 
   1446     r = ossl_quic_wire_decode_frame_ack(pkt, 3, &f, &total_ranges);
   1447     if (r == 0)
   1448         return 0;
   1449 
   1450     if (!TEST_uint64_t_eq(total_ranges, peek_total_ranges))
   1451         return 0;
   1452 
   1453     for (i = 0; i < f.num_ack_ranges; ++i) {
   1454         if (!TEST_uint64_t_le(f.ack_ranges[i].start, f.ack_ranges[i].end))
   1455             return 0;
   1456         if (!TEST_uint64_t_lt(f.ack_ranges[i].end, 1000))
   1457             return 0;
   1458     }
   1459 
   1460     return 1;
   1461 }
   1462 
   1463 #define ACK_CASE(n, expect_fail, dec) \
   1464     {                                 \
   1465         ack_case_##n##_input,         \
   1466         sizeof(ack_case_##n##_input), \
   1467         (dec),                        \
   1468         (expect_fail)                 \
   1469     },
   1470 
   1471 static const struct ack_test_case ack_cases[] = {
   1472     ACK_CASE(1, 1, ack_generic_decode)
   1473         ACK_CASE(2, 0, ack_generic_decode)
   1474             ACK_CASE(3, 1, ack_generic_decode)
   1475                 ACK_CASE(4, 0, ack_generic_decode)
   1476                     ACK_CASE(5, 1, ack_generic_decode)
   1477                         ACK_CASE(6, 1, ack_generic_decode)
   1478                             ACK_CASE(7, 0, ack_generic_decode)
   1479 };
   1480 
   1481 static int test_wire_ack(int idx)
   1482 {
   1483     int testresult = 0, r;
   1484     PACKET pkt;
   1485     const struct ack_test_case *c = &ack_cases[idx];
   1486 
   1487     if (!TEST_int_eq(PACKET_buf_init(&pkt,
   1488                          (unsigned char *)c->input_buf,
   1489                          c->input_buf_len),
   1490             1))
   1491         goto err;
   1492 
   1493     r = c->deserializer(&pkt);
   1494     if (c->expect_fail) {
   1495         if (!TEST_int_eq(r, 0))
   1496             goto err;
   1497     } else {
   1498         if (!TEST_int_eq(r, 1))
   1499             goto err;
   1500 
   1501         if (!TEST_false(PACKET_remaining(&pkt)))
   1502             goto err;
   1503     }
   1504 
   1505     testresult = 1;
   1506 err:
   1507     return testresult;
   1508 }
   1509 
   1510 /* Packet Header PN Encoding Tests */
   1511 struct pn_test {
   1512     QUIC_PN pn, tx_largest_acked, rx_largest_pn;
   1513     char expected_len;
   1514     unsigned char expected_bytes[4];
   1515 };
   1516 
   1517 static const struct pn_test pn_tests[] = {
   1518     /* RFC 9000 Section A.2 */
   1519     { 0xac5c02, 0xabe8b3, 0xabe8b3, 2, { 0x5c, 0x02 } },
   1520     { 0xace8fe, 0xabe8b3, 0xabe8b3, 3, { 0xac, 0xe8, 0xfe } },
   1521     /* RFC 9000 Section A.3 */
   1522     { 0xa82f9b32, 0xa82f30ea, 0xa82f30ea, 2, { 0x9b, 0x32 } },
   1523     /* Boundary Cases */
   1524     { 1, 0, 0, 1, { 0x01 } },
   1525     { 256, 255, 255, 1, { 0x00 } },
   1526     { 257, 255, 255, 1, { 0x01 } },
   1527     { 256, 128, 128, 1, { 0x00 } },
   1528     { 256, 127, 127, 2, { 0x01, 0x00 } },
   1529     { 65536, 32768, 32768, 2, { 0x00, 0x00 } },
   1530     { 65537, 32769, 32769, 2, { 0x00, 0x01 } },
   1531     { 65536, 32767, 32767, 3, { 0x01, 0x00, 0x00 } },
   1532     { 65537, 32768, 32768, 3, { 0x01, 0x00, 0x01 } },
   1533     { 16777216, 8388608, 8388608, 3, { 0x00, 0x00, 0x00 } },
   1534     { 16777217, 8388609, 8388609, 3, { 0x00, 0x00, 0x01 } },
   1535     { 16777216, 8388607, 8388607, 4, { 0x01, 0x00, 0x00, 0x00 } },
   1536     { 16777217, 8388608, 8388608, 4, { 0x01, 0x00, 0x00, 0x01 } },
   1537     { 4294967296, 2147483648, 2147483648, 4, { 0x00, 0x00, 0x00, 0x00 } },
   1538     { 4294967297, 2147483648, 2147483648, 4, { 0x00, 0x00, 0x00, 0x01 } },
   1539 };
   1540 
   1541 static int test_wire_pkt_hdr_pn(int tidx)
   1542 {
   1543     int testresult = 0;
   1544     const struct pn_test *t = &pn_tests[tidx];
   1545     unsigned char buf[4];
   1546     int pn_len;
   1547     QUIC_PN res_pn;
   1548 
   1549     pn_len = ossl_quic_wire_determine_pn_len(t->pn, t->tx_largest_acked);
   1550     if (!TEST_int_eq(pn_len, (int)t->expected_len))
   1551         goto err;
   1552 
   1553     if (!TEST_true(ossl_quic_wire_encode_pkt_hdr_pn(t->pn, buf, pn_len)))
   1554         goto err;
   1555 
   1556     if (!TEST_mem_eq(t->expected_bytes, t->expected_len, buf, pn_len))
   1557         goto err;
   1558 
   1559     if (!TEST_true(ossl_quic_wire_decode_pkt_hdr_pn(buf, pn_len,
   1560             t->rx_largest_pn, &res_pn)))
   1561         goto err;
   1562 
   1563     if (!TEST_uint64_t_eq(res_pn, t->pn))
   1564         goto err;
   1565 
   1566     testresult = 1;
   1567 err:
   1568     return testresult;
   1569 }
   1570 
   1571 /* RFC 9001 s. A.4 */
   1572 static const QUIC_CONN_ID retry_orig_dcid = {
   1573     8, { 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08 }
   1574 };
   1575 
   1576 static const unsigned char retry_encoded[] = {
   1577     0xff, /* Long Header, Retry */
   1578     0x00, 0x00, 0x00, 0x01, /* Version 1 */
   1579     0x00, /* DCID */
   1580     0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID */
   1581 
   1582     /* Retry Token */
   1583     0x74, 0x6f, 0x6b, 0x65, 0x6e,
   1584 
   1585     /* Retry Integrity Tag */
   1586     0x04, 0xa2, 0x65, 0xba, 0x2e, 0xff, 0x4d, 0x82, 0x90, 0x58, 0xfb, 0x3f, 0x0f,
   1587     0x24, 0x96, 0xba
   1588 };
   1589 
   1590 static int test_wire_retry_integrity_tag(void)
   1591 {
   1592     int testresult = 0;
   1593     PACKET pkt = { 0 };
   1594     QUIC_PKT_HDR hdr = { 0 };
   1595     unsigned char got_tag[QUIC_RETRY_INTEGRITY_TAG_LEN] = { 0 };
   1596 
   1597     if (!TEST_true(PACKET_buf_init(&pkt, retry_encoded, sizeof(retry_encoded))))
   1598         goto err;
   1599 
   1600     if (!TEST_true(ossl_quic_wire_decode_pkt_hdr(&pkt, 0, 0, 0, &hdr, NULL, NULL)))
   1601         goto err;
   1602 
   1603     if (!TEST_int_eq(hdr.type, QUIC_PKT_TYPE_RETRY))
   1604         goto err;
   1605 
   1606     if (!TEST_true(ossl_quic_calculate_retry_integrity_tag(NULL, NULL, &hdr,
   1607             &retry_orig_dcid,
   1608             got_tag)))
   1609         goto err;
   1610 
   1611     if (!TEST_mem_eq(got_tag, sizeof(got_tag),
   1612             retry_encoded + sizeof(retry_encoded)
   1613                 - QUIC_RETRY_INTEGRITY_TAG_LEN,
   1614             QUIC_RETRY_INTEGRITY_TAG_LEN))
   1615         goto err;
   1616 
   1617     if (!TEST_true(ossl_quic_validate_retry_integrity_tag(NULL, NULL, &hdr,
   1618             &retry_orig_dcid)))
   1619         goto err;
   1620 
   1621     testresult = 1;
   1622 err:
   1623     return testresult;
   1624 }
   1625 
   1626 /* is_minimal=0 test */
   1627 static const unsigned char non_minimal_1[] = {
   1628     0x40, 0x00
   1629 };
   1630 
   1631 static const unsigned char non_minimal_2[] = {
   1632     0x40, 0x3F
   1633 };
   1634 
   1635 static const unsigned char non_minimal_3[] = {
   1636     0x80, 0x00, 0x00, 0x00
   1637 };
   1638 
   1639 static const unsigned char non_minimal_4[] = {
   1640     0x80, 0x00, 0x3F, 0xFF
   1641 };
   1642 
   1643 static const unsigned char non_minimal_5[] = {
   1644     0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   1645 };
   1646 
   1647 static const unsigned char non_minimal_6[] = {
   1648     0xC0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF
   1649 };
   1650 
   1651 static const unsigned char *const non_minimal[] = {
   1652     non_minimal_1,
   1653     non_minimal_2,
   1654     non_minimal_3,
   1655     non_minimal_4,
   1656     non_minimal_5,
   1657     non_minimal_6,
   1658 };
   1659 
   1660 static const size_t non_minimal_len[] = {
   1661     OSSL_NELEM(non_minimal_1),
   1662     OSSL_NELEM(non_minimal_2),
   1663     OSSL_NELEM(non_minimal_3),
   1664     OSSL_NELEM(non_minimal_4),
   1665     OSSL_NELEM(non_minimal_5),
   1666     OSSL_NELEM(non_minimal_6),
   1667 };
   1668 
   1669 static int test_wire_minimal(int idx)
   1670 {
   1671     int testresult = 0;
   1672     int is_minimal;
   1673     uint64_t frame_type;
   1674     PACKET pkt;
   1675 
   1676     if (!TEST_true(PACKET_buf_init(&pkt, non_minimal[idx],
   1677             non_minimal_len[idx])))
   1678         goto err;
   1679 
   1680     if (!TEST_true(ossl_quic_wire_peek_frame_header(&pkt, &frame_type,
   1681             &is_minimal)))
   1682         goto err;
   1683 
   1684     if (!TEST_false(is_minimal))
   1685         goto err;
   1686 
   1687     testresult = 1;
   1688 err:
   1689     return testresult;
   1690 }
   1691 
   1692 int setup_tests(void)
   1693 {
   1694     ADD_ALL_TESTS(test_wire_encode, OSSL_NELEM(encode_cases));
   1695     ADD_ALL_TESTS(test_wire_ack, OSSL_NELEM(ack_cases));
   1696     ADD_ALL_TESTS(test_wire_pkt_hdr_pn, OSSL_NELEM(pn_tests));
   1697     ADD_TEST(test_wire_retry_integrity_tag);
   1698     ADD_ALL_TESTS(test_wire_minimal, OSSL_NELEM(non_minimal_len));
   1699     return 1;
   1700 }
   1701