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