Home | History | Annotate | Line # | Download | only in test
      1      1.1  christos /*
      2      1.1  christos  * Copyright 2023-2024 The OpenSSL Project Authors. All Rights Reserved.
      3      1.1  christos  *
      4      1.1  christos  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5      1.1  christos  * this file except in compliance with the License.  You can obtain a copy
      6      1.1  christos  * in the file LICENSE in the source distribution or at
      7      1.1  christos  * https://www.openssl.org/source/license.html
      8      1.1  christos  */
      9      1.1  christos 
     10      1.1  christos #include "internal/quic_rcidm.h"
     11      1.1  christos #include "testutil.h"
     12      1.1  christos 
     13      1.1  christos static const QUIC_CONN_ID cid8_1 = { 8, { 1 } };
     14      1.1  christos static const QUIC_CONN_ID cid8_2 = { 8, { 2 } };
     15      1.1  christos static const QUIC_CONN_ID cid8_3 = { 8, { 3 } };
     16      1.1  christos static const QUIC_CONN_ID cid8_4 = { 8, { 4 } };
     17      1.1  christos static const QUIC_CONN_ID cid8_5 = { 8, { 5 } };
     18      1.1  christos 
     19      1.1  christos /*
     20      1.1  christos  * 0: Client, Initial ODCID
     21      1.1  christos  * 1: Client, Initial ODCID + Retry ODCID
     22      1.1  christos  * 2: Server, doesn't start with Initial ODCID
     23      1.1  christos  */
     24      1.1  christos static int test_rcidm(int idx)
     25      1.1  christos {
     26      1.1  christos     int testresult = 0;
     27      1.1  christos     QUIC_RCIDM *rcidm;
     28  1.1.1.2  christos     OSSL_QUIC_FRAME_NEW_CONN_ID ncid_frame_1 = { 0 }, ncid_frame_2 = { 0 };
     29      1.1  christos     QUIC_CONN_ID dcid_out;
     30      1.1  christos     const QUIC_CONN_ID *odcid = NULL;
     31      1.1  christos     uint64_t seq_num_out;
     32      1.1  christos 
     33  1.1.1.2  christos     ncid_frame_1.seq_num = 2;
     34      1.1  christos     ncid_frame_1.conn_id.id_len = 8;
     35  1.1.1.2  christos     ncid_frame_1.conn_id.id[0] = 3;
     36      1.1  christos 
     37  1.1.1.2  christos     ncid_frame_2.seq_num = 3;
     38      1.1  christos     ncid_frame_2.conn_id.id_len = 8;
     39  1.1.1.2  christos     ncid_frame_2.conn_id.id[0] = 4;
     40      1.1  christos 
     41      1.1  christos     odcid = ((idx == 2) ? NULL : &cid8_1);
     42      1.1  christos     if (!TEST_ptr(rcidm = ossl_quic_rcidm_new(odcid)))
     43      1.1  christos         goto err;
     44      1.1  christos 
     45      1.1  christos     if (idx != 2) {
     46      1.1  christos         if (/* ODCID not counted */
     47      1.1  christos             !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
     48      1.1  christos             || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
     49      1.1  christos             || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
     50      1.1  christos 
     51      1.1  christos             || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_1))
     52      1.1  christos             || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
     53      1.1  christos             goto err;
     54      1.1  christos     } else {
     55      1.1  christos         if (!TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
     56      1.1  christos             || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
     57      1.1  christos             goto err;
     58      1.1  christos     }
     59      1.1  christos 
     60      1.1  christos     if (idx == 1) {
     61      1.1  christos         if (!TEST_true(ossl_quic_rcidm_add_from_server_retry(rcidm, &cid8_5))
     62      1.1  christos             || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
     63      1.1  christos             || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
     64      1.1  christos             || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
     65      1.1  christos 
     66      1.1  christos             || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_5))
     67      1.1  christos             || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
     68      1.1  christos             goto err;
     69      1.1  christos     }
     70      1.1  christos 
     71      1.1  christos     if (!TEST_true(ossl_quic_rcidm_add_from_initial(rcidm, &cid8_2))
     72      1.1  christos         /* Initial SCID (seq=0) is counted */
     73      1.1  christos         || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 1)
     74      1.1  christos         || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
     75      1.1  christos         || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
     76      1.1  christos         || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
     77      1.1  christos         || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2))
     78      1.1  christos 
     79      1.1  christos         || !TEST_true(ossl_quic_rcidm_add_from_ncid(rcidm, &ncid_frame_1))
     80      1.1  christos         || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 2)
     81      1.1  christos         /* Not changed over yet - handshake not confirmed */
     82      1.1  christos         || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
     83      1.1  christos         || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
     84      1.1  christos         || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2))
     85      1.1  christos 
     86      1.1  christos         || !TEST_true(ossl_quic_rcidm_add_from_ncid(rcidm, &ncid_frame_2))
     87      1.1  christos         || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 3)
     88      1.1  christos         || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 0)
     89      1.1  christos         || !TEST_false(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
     90      1.1  christos         /* Not changed over yet - handshake not confirmed */
     91      1.1  christos         || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
     92      1.1  christos         || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
     93      1.1  christos         || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2)))
     94      1.1  christos         goto err;
     95      1.1  christos 
     96      1.1  christos     ossl_quic_rcidm_on_handshake_complete(rcidm);
     97      1.1  christos 
     98      1.1  christos     if (!TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
     99      1.1  christos         || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
    100      1.1  christos         || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
    101      1.1  christos         || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_3))
    102      1.1  christos         || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 1)
    103      1.1  christos         || !TEST_true(ossl_quic_rcidm_peek_retire_seq_num(rcidm, &seq_num_out))
    104      1.1  christos         || !TEST_uint64_t_eq(seq_num_out, 0))
    105      1.1  christos         goto err;
    106      1.1  christos 
    107      1.1  christos     ossl_quic_rcidm_request_roll(rcidm);
    108      1.1  christos 
    109      1.1  christos     if (!TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
    110      1.1  christos         || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
    111      1.1  christos         || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
    112      1.1  christos         || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_4))
    113      1.1  christos         || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 2)
    114      1.1  christos         || !TEST_true(ossl_quic_rcidm_peek_retire_seq_num(rcidm, &seq_num_out))
    115      1.1  christos         || !TEST_uint64_t_eq(seq_num_out, 0)
    116      1.1  christos         || !TEST_true(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
    117      1.1  christos         || !TEST_uint64_t_eq(seq_num_out, 0)
    118      1.1  christos         || !TEST_true(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
    119      1.1  christos         || !TEST_uint64_t_eq(seq_num_out, 2))
    120      1.1  christos         goto err;
    121      1.1  christos 
    122      1.1  christos     testresult = 1;
    123      1.1  christos err:
    124      1.1  christos     ossl_quic_rcidm_free(rcidm);
    125      1.1  christos     return testresult;
    126      1.1  christos }
    127      1.1  christos 
    128      1.1  christos int setup_tests(void)
    129      1.1  christos {
    130      1.1  christos     ADD_ALL_TESTS(test_rcidm, 3);
    131      1.1  christos     return 1;
    132      1.1  christos }
    133