1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include <ssl_misc.h> 3a8e1175bSopenharmony_ci#include <mbedtls/timing.h> 4a8e1175bSopenharmony_ci#include <mbedtls/debug.h> 5a8e1175bSopenharmony_ci#include <mbedtls/pk.h> 6a8e1175bSopenharmony_ci#include <ssl_tls13_keys.h> 7a8e1175bSopenharmony_ci#include <ssl_tls13_invasive.h> 8a8e1175bSopenharmony_ci#include <test/ssl_helpers.h> 9a8e1175bSopenharmony_ci 10a8e1175bSopenharmony_ci#include <constant_time_internal.h> 11a8e1175bSopenharmony_ci#include <test/constant_flow.h> 12a8e1175bSopenharmony_ci 13a8e1175bSopenharmony_ci#define SSL_MESSAGE_QUEUE_INIT { NULL, 0, 0, 0 } 14a8e1175bSopenharmony_ci 15a8e1175bSopenharmony_ci/* Mnemonics for the early data test scenarios */ 16a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_ACCEPTED 0 17a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_NO_INDICATION_SENT 1 18a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_SERVER_REJECTS 2 19a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_HRR 3 20a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_SAME_ALPN 4 21a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_DIFF_ALPN 5 22a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_NO_INITIAL_ALPN 6 23a8e1175bSopenharmony_ci#define TEST_EARLY_DATA_NO_LATER_ALPN 7 24a8e1175bSopenharmony_ci 25a8e1175bSopenharmony_ci#if (!defined(MBEDTLS_SSL_PROTO_TLS1_2)) && \ 26a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_CLI_C) && \ 27a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_DEBUG_C) && \ 28a8e1175bSopenharmony_ci defined(MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE) && \ 29a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) && \ 30a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED) && \ 31a8e1175bSopenharmony_ci defined(MBEDTLS_MD_CAN_SHA256) && \ 32a8e1175bSopenharmony_ci defined(MBEDTLS_ECP_HAVE_SECP256R1) && defined(MBEDTLS_ECP_HAVE_SECP384R1) && \ 33a8e1175bSopenharmony_ci defined(MBEDTLS_PK_CAN_ECDSA_VERIFY) && defined(MBEDTLS_SSL_SESSION_TICKETS) 34a8e1175bSopenharmony_ci/* 35a8e1175bSopenharmony_ci * Test function to write early data for negative tests where 36a8e1175bSopenharmony_ci * mbedtls_ssl_write_early_data() cannot be used. 37a8e1175bSopenharmony_ci */ 38a8e1175bSopenharmony_cistatic int write_early_data(mbedtls_ssl_context *ssl, 39a8e1175bSopenharmony_ci unsigned char *buf, size_t len) 40a8e1175bSopenharmony_ci{ 41a8e1175bSopenharmony_ci int ret = mbedtls_ssl_get_max_out_record_payload(ssl); 42a8e1175bSopenharmony_ci 43a8e1175bSopenharmony_ci TEST_ASSERT(ret > 0); 44a8e1175bSopenharmony_ci TEST_LE_U(len, (size_t) ret); 45a8e1175bSopenharmony_ci 46a8e1175bSopenharmony_ci ret = mbedtls_ssl_flush_output(ssl); 47a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 48a8e1175bSopenharmony_ci TEST_EQUAL(ssl->out_left, 0); 49a8e1175bSopenharmony_ci 50a8e1175bSopenharmony_ci ssl->out_msglen = len; 51a8e1175bSopenharmony_ci ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA; 52a8e1175bSopenharmony_ci if (len > 0) { 53a8e1175bSopenharmony_ci memcpy(ssl->out_msg, buf, len); 54a8e1175bSopenharmony_ci } 55a8e1175bSopenharmony_ci 56a8e1175bSopenharmony_ci ret = mbedtls_ssl_write_record(ssl, 1); 57a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 58a8e1175bSopenharmony_ci 59a8e1175bSopenharmony_ci ret = len; 60a8e1175bSopenharmony_ci 61a8e1175bSopenharmony_ciexit: 62a8e1175bSopenharmony_ci return ret; 63a8e1175bSopenharmony_ci} 64a8e1175bSopenharmony_ci#endif 65a8e1175bSopenharmony_ci 66a8e1175bSopenharmony_ci/* END_HEADER */ 67a8e1175bSopenharmony_ci 68a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 69a8e1175bSopenharmony_ci * depends_on:MBEDTLS_SSL_TLS_C 70a8e1175bSopenharmony_ci * END_DEPENDENCIES 71a8e1175bSopenharmony_ci */ 72a8e1175bSopenharmony_ci 73a8e1175bSopenharmony_ci/* BEGIN_CASE */ 74a8e1175bSopenharmony_civoid test_callback_buffer_sanity() 75a8e1175bSopenharmony_ci{ 76a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 77a8e1175bSopenharmony_ci mbedtls_test_ssl_buffer buf; 78a8e1175bSopenharmony_ci mbedtls_test_ssl_buffer_init(&buf); 79a8e1175bSopenharmony_ci unsigned char input[MSGLEN]; 80a8e1175bSopenharmony_ci unsigned char output[MSGLEN]; 81a8e1175bSopenharmony_ci 82a8e1175bSopenharmony_ci USE_PSA_INIT(); 83a8e1175bSopenharmony_ci memset(input, 0, sizeof(input)); 84a8e1175bSopenharmony_ci 85a8e1175bSopenharmony_ci /* Make sure calling put and get on NULL buffer results in error. */ 86a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, input, sizeof(input)) 87a8e1175bSopenharmony_ci == -1); 88a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, output, sizeof(output)) 89a8e1175bSopenharmony_ci == -1); 90a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, sizeof(input)) 91a8e1175bSopenharmony_ci == -1); 92a8e1175bSopenharmony_ci 93a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, 0) == -1); 94a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, NULL, 0) == -1); 95a8e1175bSopenharmony_ci 96a8e1175bSopenharmony_ci /* Make sure calling put and get on a buffer that hasn't been set up results 97a8e1175bSopenharmony_ci * in error. */ 98a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input)) 99a8e1175bSopenharmony_ci == -1); 100a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, sizeof(output)) 101a8e1175bSopenharmony_ci == -1); 102a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input)) 103a8e1175bSopenharmony_ci == -1); 104a8e1175bSopenharmony_ci 105a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == -1); 106a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == -1); 107a8e1175bSopenharmony_ci 108a8e1175bSopenharmony_ci /* Make sure calling put and get on NULL input only results in 109a8e1175bSopenharmony_ci * error if the length is not zero, and that a NULL output is valid for data 110a8e1175bSopenharmony_ci * dropping. 111a8e1175bSopenharmony_ci */ 112a8e1175bSopenharmony_ci 113a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, sizeof(input)) == 0); 114a8e1175bSopenharmony_ci 115a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input)) 116a8e1175bSopenharmony_ci == -1); 117a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, sizeof(output)) 118a8e1175bSopenharmony_ci == 0); 119a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == 0); 120a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == 0); 121a8e1175bSopenharmony_ci 122a8e1175bSopenharmony_ci /* Make sure calling put several times in the row is safe */ 123a8e1175bSopenharmony_ci 124a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input)) 125a8e1175bSopenharmony_ci == sizeof(input)); 126a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, 2) == 2); 127a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 1) == 1); 128a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 1); 129a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 0); 130a8e1175bSopenharmony_ci 131a8e1175bSopenharmony_ci 132a8e1175bSopenharmony_ciexit: 133a8e1175bSopenharmony_ci mbedtls_test_ssl_buffer_free(&buf); 134a8e1175bSopenharmony_ci USE_PSA_DONE(); 135a8e1175bSopenharmony_ci} 136a8e1175bSopenharmony_ci/* END_CASE */ 137a8e1175bSopenharmony_ci 138a8e1175bSopenharmony_ci/* 139a8e1175bSopenharmony_ci * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is 140a8e1175bSopenharmony_ci * correct and works as expected. 141a8e1175bSopenharmony_ci * 142a8e1175bSopenharmony_ci * That is 143a8e1175bSopenharmony_ci * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes. 144a8e1175bSopenharmony_ci * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes. 145a8e1175bSopenharmony_ci * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret 146a8e1175bSopenharmony_ci * bytes. 147a8e1175bSopenharmony_ci * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes. 148a8e1175bSopenharmony_ci * - All of the bytes we got match the bytes we put in in a FIFO manner. 149a8e1175bSopenharmony_ci */ 150a8e1175bSopenharmony_ci 151a8e1175bSopenharmony_ci/* BEGIN_CASE */ 152a8e1175bSopenharmony_civoid test_callback_buffer(int size, int put1, int put1_ret, 153a8e1175bSopenharmony_ci int get1, int get1_ret, int put2, int put2_ret, 154a8e1175bSopenharmony_ci int get2, int get2_ret) 155a8e1175bSopenharmony_ci{ 156a8e1175bSopenharmony_ci enum { ROUNDS = 2 }; 157a8e1175bSopenharmony_ci size_t put[ROUNDS]; 158a8e1175bSopenharmony_ci int put_ret[ROUNDS]; 159a8e1175bSopenharmony_ci size_t get[ROUNDS]; 160a8e1175bSopenharmony_ci int get_ret[ROUNDS]; 161a8e1175bSopenharmony_ci mbedtls_test_ssl_buffer buf; 162a8e1175bSopenharmony_ci unsigned char *input = NULL; 163a8e1175bSopenharmony_ci size_t input_len; 164a8e1175bSopenharmony_ci unsigned char *output = NULL; 165a8e1175bSopenharmony_ci size_t output_len; 166a8e1175bSopenharmony_ci size_t i, j, written, read; 167a8e1175bSopenharmony_ci 168a8e1175bSopenharmony_ci mbedtls_test_ssl_buffer_init(&buf); 169a8e1175bSopenharmony_ci USE_PSA_INIT(); 170a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, size) == 0); 171a8e1175bSopenharmony_ci 172a8e1175bSopenharmony_ci /* Check the sanity of input parameters and initialise local variables. That 173a8e1175bSopenharmony_ci * is, ensure that the amount of data is not negative and that we are not 174a8e1175bSopenharmony_ci * expecting more to put or get than we actually asked for. */ 175a8e1175bSopenharmony_ci TEST_ASSERT(put1 >= 0); 176a8e1175bSopenharmony_ci put[0] = put1; 177a8e1175bSopenharmony_ci put_ret[0] = put1_ret; 178a8e1175bSopenharmony_ci TEST_ASSERT(put1_ret <= put1); 179a8e1175bSopenharmony_ci TEST_ASSERT(put2 >= 0); 180a8e1175bSopenharmony_ci put[1] = put2; 181a8e1175bSopenharmony_ci put_ret[1] = put2_ret; 182a8e1175bSopenharmony_ci TEST_ASSERT(put2_ret <= put2); 183a8e1175bSopenharmony_ci 184a8e1175bSopenharmony_ci TEST_ASSERT(get1 >= 0); 185a8e1175bSopenharmony_ci get[0] = get1; 186a8e1175bSopenharmony_ci get_ret[0] = get1_ret; 187a8e1175bSopenharmony_ci TEST_ASSERT(get1_ret <= get1); 188a8e1175bSopenharmony_ci TEST_ASSERT(get2 >= 0); 189a8e1175bSopenharmony_ci get[1] = get2; 190a8e1175bSopenharmony_ci get_ret[1] = get2_ret; 191a8e1175bSopenharmony_ci TEST_ASSERT(get2_ret <= get2); 192a8e1175bSopenharmony_ci 193a8e1175bSopenharmony_ci input_len = 0; 194a8e1175bSopenharmony_ci /* Calculate actual input and output lengths */ 195a8e1175bSopenharmony_ci for (j = 0; j < ROUNDS; j++) { 196a8e1175bSopenharmony_ci if (put_ret[j] > 0) { 197a8e1175bSopenharmony_ci input_len += put_ret[j]; 198a8e1175bSopenharmony_ci } 199a8e1175bSopenharmony_ci } 200a8e1175bSopenharmony_ci /* In order to always have a valid pointer we always allocate at least 1 201a8e1175bSopenharmony_ci * byte. */ 202a8e1175bSopenharmony_ci if (input_len == 0) { 203a8e1175bSopenharmony_ci input_len = 1; 204a8e1175bSopenharmony_ci } 205a8e1175bSopenharmony_ci TEST_CALLOC(input, input_len); 206a8e1175bSopenharmony_ci 207a8e1175bSopenharmony_ci output_len = 0; 208a8e1175bSopenharmony_ci for (j = 0; j < ROUNDS; j++) { 209a8e1175bSopenharmony_ci if (get_ret[j] > 0) { 210a8e1175bSopenharmony_ci output_len += get_ret[j]; 211a8e1175bSopenharmony_ci } 212a8e1175bSopenharmony_ci } 213a8e1175bSopenharmony_ci TEST_ASSERT(output_len <= input_len); 214a8e1175bSopenharmony_ci /* In order to always have a valid pointer we always allocate at least 1 215a8e1175bSopenharmony_ci * byte. */ 216a8e1175bSopenharmony_ci if (output_len == 0) { 217a8e1175bSopenharmony_ci output_len = 1; 218a8e1175bSopenharmony_ci } 219a8e1175bSopenharmony_ci TEST_CALLOC(output, output_len); 220a8e1175bSopenharmony_ci 221a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 222a8e1175bSopenharmony_ci * can be detected */ 223a8e1175bSopenharmony_ci for (i = 0; i < input_len; i++) { 224a8e1175bSopenharmony_ci input[i] = i & 0xFF; 225a8e1175bSopenharmony_ci } 226a8e1175bSopenharmony_ci 227a8e1175bSopenharmony_ci written = read = 0; 228a8e1175bSopenharmony_ci for (j = 0; j < ROUNDS; j++) { 229a8e1175bSopenharmony_ci TEST_ASSERT(put_ret[j] == mbedtls_test_ssl_buffer_put(&buf, 230a8e1175bSopenharmony_ci input + written, put[j])); 231a8e1175bSopenharmony_ci written += put_ret[j]; 232a8e1175bSopenharmony_ci TEST_ASSERT(get_ret[j] == mbedtls_test_ssl_buffer_get(&buf, 233a8e1175bSopenharmony_ci output + read, get[j])); 234a8e1175bSopenharmony_ci read += get_ret[j]; 235a8e1175bSopenharmony_ci TEST_ASSERT(read <= written); 236a8e1175bSopenharmony_ci if (get_ret[j] > 0) { 237a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output + read - get_ret[j], 238a8e1175bSopenharmony_ci input + read - get_ret[j], get_ret[j]) 239a8e1175bSopenharmony_ci == 0); 240a8e1175bSopenharmony_ci } 241a8e1175bSopenharmony_ci } 242a8e1175bSopenharmony_ci 243a8e1175bSopenharmony_ciexit: 244a8e1175bSopenharmony_ci mbedtls_free(input); 245a8e1175bSopenharmony_ci mbedtls_free(output); 246a8e1175bSopenharmony_ci mbedtls_test_ssl_buffer_free(&buf); 247a8e1175bSopenharmony_ci USE_PSA_DONE(); 248a8e1175bSopenharmony_ci} 249a8e1175bSopenharmony_ci/* END_CASE */ 250a8e1175bSopenharmony_ci 251a8e1175bSopenharmony_ci/* 252a8e1175bSopenharmony_ci * Test if the implementation of `mbedtls_test_mock_socket` related 253a8e1175bSopenharmony_ci * I/O functions is correct and works as expected on unconnected sockets. 254a8e1175bSopenharmony_ci */ 255a8e1175bSopenharmony_ci 256a8e1175bSopenharmony_ci/* BEGIN_CASE */ 257a8e1175bSopenharmony_civoid ssl_mock_sanity() 258a8e1175bSopenharmony_ci{ 259a8e1175bSopenharmony_ci enum { MSGLEN = 105 }; 260a8e1175bSopenharmony_ci unsigned char message[MSGLEN] = { 0 }; 261a8e1175bSopenharmony_ci unsigned char received[MSGLEN] = { 0 }; 262a8e1175bSopenharmony_ci mbedtls_test_mock_socket socket; 263a8e1175bSopenharmony_ci 264a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&socket); 265a8e1175bSopenharmony_ci USE_PSA_INIT(); 266a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_b(&socket, message, MSGLEN) < 0); 267a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&socket); 268a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&socket); 269a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_b(&socket, received, MSGLEN) < 0); 270a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&socket); 271a8e1175bSopenharmony_ci 272a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&socket); 273a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_nb(&socket, message, MSGLEN) < 0); 274a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&socket); 275a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&socket); 276a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0); 277a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&socket); 278a8e1175bSopenharmony_ci 279a8e1175bSopenharmony_ciexit: 280a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&socket); 281a8e1175bSopenharmony_ci USE_PSA_DONE(); 282a8e1175bSopenharmony_ci} 283a8e1175bSopenharmony_ci/* END_CASE */ 284a8e1175bSopenharmony_ci 285a8e1175bSopenharmony_ci/* 286a8e1175bSopenharmony_ci * Test if the implementation of `mbedtls_test_mock_socket` related functions 287a8e1175bSopenharmony_ci * can send a single message from the client to the server. 288a8e1175bSopenharmony_ci */ 289a8e1175bSopenharmony_ci 290a8e1175bSopenharmony_ci/* BEGIN_CASE */ 291a8e1175bSopenharmony_civoid ssl_mock_tcp(int blocking) 292a8e1175bSopenharmony_ci{ 293a8e1175bSopenharmony_ci enum { MSGLEN = 105 }; 294a8e1175bSopenharmony_ci enum { BUFLEN = MSGLEN / 5 }; 295a8e1175bSopenharmony_ci unsigned char message[MSGLEN]; 296a8e1175bSopenharmony_ci unsigned char received[MSGLEN]; 297a8e1175bSopenharmony_ci mbedtls_test_mock_socket client; 298a8e1175bSopenharmony_ci mbedtls_test_mock_socket server; 299a8e1175bSopenharmony_ci size_t written, read; 300a8e1175bSopenharmony_ci int send_ret, recv_ret; 301a8e1175bSopenharmony_ci mbedtls_ssl_send_t *send; 302a8e1175bSopenharmony_ci mbedtls_ssl_recv_t *recv; 303a8e1175bSopenharmony_ci unsigned i; 304a8e1175bSopenharmony_ci 305a8e1175bSopenharmony_ci if (blocking == 0) { 306a8e1175bSopenharmony_ci send = mbedtls_test_mock_tcp_send_nb; 307a8e1175bSopenharmony_ci recv = mbedtls_test_mock_tcp_recv_nb; 308a8e1175bSopenharmony_ci } else { 309a8e1175bSopenharmony_ci send = mbedtls_test_mock_tcp_send_b; 310a8e1175bSopenharmony_ci recv = mbedtls_test_mock_tcp_recv_b; 311a8e1175bSopenharmony_ci } 312a8e1175bSopenharmony_ci 313a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&client); 314a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&server); 315a8e1175bSopenharmony_ci USE_PSA_INIT(); 316a8e1175bSopenharmony_ci 317a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 318a8e1175bSopenharmony_ci * can be detected */ 319a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 320a8e1175bSopenharmony_ci message[i] = i & 0xFF; 321a8e1175bSopenharmony_ci } 322a8e1175bSopenharmony_ci 323a8e1175bSopenharmony_ci /* Make sure that sending a message takes a few iterations. */ 324a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 325a8e1175bSopenharmony_ci BUFLEN)); 326a8e1175bSopenharmony_ci 327a8e1175bSopenharmony_ci /* Send the message to the server */ 328a8e1175bSopenharmony_ci send_ret = recv_ret = 1; 329a8e1175bSopenharmony_ci written = read = 0; 330a8e1175bSopenharmony_ci while (send_ret != 0 || recv_ret != 0) { 331a8e1175bSopenharmony_ci send_ret = send(&client, message + written, MSGLEN - written); 332a8e1175bSopenharmony_ci 333a8e1175bSopenharmony_ci TEST_ASSERT(send_ret >= 0); 334a8e1175bSopenharmony_ci TEST_ASSERT(send_ret <= BUFLEN); 335a8e1175bSopenharmony_ci written += send_ret; 336a8e1175bSopenharmony_ci 337a8e1175bSopenharmony_ci /* If the buffer is full we can test blocking and non-blocking send */ 338a8e1175bSopenharmony_ci if (send_ret == BUFLEN) { 339a8e1175bSopenharmony_ci int blocking_ret = send(&client, message, 1); 340a8e1175bSopenharmony_ci if (blocking) { 341a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == 0); 342a8e1175bSopenharmony_ci } else { 343a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE); 344a8e1175bSopenharmony_ci } 345a8e1175bSopenharmony_ci } 346a8e1175bSopenharmony_ci 347a8e1175bSopenharmony_ci recv_ret = recv(&server, received + read, MSGLEN - read); 348a8e1175bSopenharmony_ci 349a8e1175bSopenharmony_ci /* The result depends on whether any data was sent */ 350a8e1175bSopenharmony_ci if (send_ret > 0) { 351a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret > 0); 352a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret <= BUFLEN); 353a8e1175bSopenharmony_ci read += recv_ret; 354a8e1175bSopenharmony_ci } else if (blocking) { 355a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret == 0); 356a8e1175bSopenharmony_ci } else { 357a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ); 358a8e1175bSopenharmony_ci recv_ret = 0; 359a8e1175bSopenharmony_ci } 360a8e1175bSopenharmony_ci 361a8e1175bSopenharmony_ci /* If the buffer is empty we can test blocking and non-blocking read */ 362a8e1175bSopenharmony_ci if (recv_ret == BUFLEN) { 363a8e1175bSopenharmony_ci int blocking_ret = recv(&server, received, 1); 364a8e1175bSopenharmony_ci if (blocking) { 365a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == 0); 366a8e1175bSopenharmony_ci } else { 367a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ); 368a8e1175bSopenharmony_ci } 369a8e1175bSopenharmony_ci } 370a8e1175bSopenharmony_ci } 371a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 372a8e1175bSopenharmony_ci 373a8e1175bSopenharmony_ciexit: 374a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&client); 375a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&server); 376a8e1175bSopenharmony_ci USE_PSA_DONE(); 377a8e1175bSopenharmony_ci} 378a8e1175bSopenharmony_ci/* END_CASE */ 379a8e1175bSopenharmony_ci 380a8e1175bSopenharmony_ci/* 381a8e1175bSopenharmony_ci * Test if the implementation of `mbedtls_test_mock_socket` related functions 382a8e1175bSopenharmony_ci * can send messages in both direction at the same time (with the I/O calls 383a8e1175bSopenharmony_ci * interleaving). 384a8e1175bSopenharmony_ci */ 385a8e1175bSopenharmony_ci 386a8e1175bSopenharmony_ci/* BEGIN_CASE */ 387a8e1175bSopenharmony_civoid ssl_mock_tcp_interleaving(int blocking) 388a8e1175bSopenharmony_ci{ 389a8e1175bSopenharmony_ci enum { ROUNDS = 2 }; 390a8e1175bSopenharmony_ci enum { MSGLEN = 105 }; 391a8e1175bSopenharmony_ci enum { BUFLEN = MSGLEN / 5 }; 392a8e1175bSopenharmony_ci unsigned char message[ROUNDS][MSGLEN]; 393a8e1175bSopenharmony_ci unsigned char received[ROUNDS][MSGLEN]; 394a8e1175bSopenharmony_ci mbedtls_test_mock_socket client; 395a8e1175bSopenharmony_ci mbedtls_test_mock_socket server; 396a8e1175bSopenharmony_ci size_t written[ROUNDS]; 397a8e1175bSopenharmony_ci size_t read[ROUNDS]; 398a8e1175bSopenharmony_ci int send_ret[ROUNDS]; 399a8e1175bSopenharmony_ci int recv_ret[ROUNDS]; 400a8e1175bSopenharmony_ci unsigned i, j, progress; 401a8e1175bSopenharmony_ci mbedtls_ssl_send_t *send; 402a8e1175bSopenharmony_ci mbedtls_ssl_recv_t *recv; 403a8e1175bSopenharmony_ci 404a8e1175bSopenharmony_ci if (blocking == 0) { 405a8e1175bSopenharmony_ci send = mbedtls_test_mock_tcp_send_nb; 406a8e1175bSopenharmony_ci recv = mbedtls_test_mock_tcp_recv_nb; 407a8e1175bSopenharmony_ci } else { 408a8e1175bSopenharmony_ci send = mbedtls_test_mock_tcp_send_b; 409a8e1175bSopenharmony_ci recv = mbedtls_test_mock_tcp_recv_b; 410a8e1175bSopenharmony_ci } 411a8e1175bSopenharmony_ci 412a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&client); 413a8e1175bSopenharmony_ci mbedtls_test_mock_socket_init(&server); 414a8e1175bSopenharmony_ci USE_PSA_INIT(); 415a8e1175bSopenharmony_ci 416a8e1175bSopenharmony_ci /* Fill up the buffers with structured data so that unwanted changes 417a8e1175bSopenharmony_ci * can be detected */ 418a8e1175bSopenharmony_ci for (i = 0; i < ROUNDS; i++) { 419a8e1175bSopenharmony_ci for (j = 0; j < MSGLEN; j++) { 420a8e1175bSopenharmony_ci message[i][j] = (i * MSGLEN + j) & 0xFF; 421a8e1175bSopenharmony_ci } 422a8e1175bSopenharmony_ci } 423a8e1175bSopenharmony_ci 424a8e1175bSopenharmony_ci /* Make sure that sending a message takes a few iterations. */ 425a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 426a8e1175bSopenharmony_ci BUFLEN)); 427a8e1175bSopenharmony_ci 428a8e1175bSopenharmony_ci /* Send the message from both sides, interleaving. */ 429a8e1175bSopenharmony_ci progress = 1; 430a8e1175bSopenharmony_ci for (i = 0; i < ROUNDS; i++) { 431a8e1175bSopenharmony_ci written[i] = 0; 432a8e1175bSopenharmony_ci read[i] = 0; 433a8e1175bSopenharmony_ci } 434a8e1175bSopenharmony_ci /* This loop does not stop as long as there was a successful write or read 435a8e1175bSopenharmony_ci * of at least one byte on either side. */ 436a8e1175bSopenharmony_ci while (progress != 0) { 437a8e1175bSopenharmony_ci mbedtls_test_mock_socket *socket; 438a8e1175bSopenharmony_ci 439a8e1175bSopenharmony_ci for (i = 0; i < ROUNDS; i++) { 440a8e1175bSopenharmony_ci /* First sending is from the client */ 441a8e1175bSopenharmony_ci socket = (i % 2 == 0) ? (&client) : (&server); 442a8e1175bSopenharmony_ci 443a8e1175bSopenharmony_ci send_ret[i] = send(socket, message[i] + written[i], 444a8e1175bSopenharmony_ci MSGLEN - written[i]); 445a8e1175bSopenharmony_ci TEST_ASSERT(send_ret[i] >= 0); 446a8e1175bSopenharmony_ci TEST_ASSERT(send_ret[i] <= BUFLEN); 447a8e1175bSopenharmony_ci written[i] += send_ret[i]; 448a8e1175bSopenharmony_ci 449a8e1175bSopenharmony_ci /* If the buffer is full we can test blocking and non-blocking 450a8e1175bSopenharmony_ci * send */ 451a8e1175bSopenharmony_ci if (send_ret[i] == BUFLEN) { 452a8e1175bSopenharmony_ci int blocking_ret = send(socket, message[i], 1); 453a8e1175bSopenharmony_ci if (blocking) { 454a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == 0); 455a8e1175bSopenharmony_ci } else { 456a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE); 457a8e1175bSopenharmony_ci } 458a8e1175bSopenharmony_ci } 459a8e1175bSopenharmony_ci } 460a8e1175bSopenharmony_ci 461a8e1175bSopenharmony_ci for (i = 0; i < ROUNDS; i++) { 462a8e1175bSopenharmony_ci /* First receiving is from the server */ 463a8e1175bSopenharmony_ci socket = (i % 2 == 0) ? (&server) : (&client); 464a8e1175bSopenharmony_ci 465a8e1175bSopenharmony_ci recv_ret[i] = recv(socket, received[i] + read[i], 466a8e1175bSopenharmony_ci MSGLEN - read[i]); 467a8e1175bSopenharmony_ci 468a8e1175bSopenharmony_ci /* The result depends on whether any data was sent */ 469a8e1175bSopenharmony_ci if (send_ret[i] > 0) { 470a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret[i] > 0); 471a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret[i] <= BUFLEN); 472a8e1175bSopenharmony_ci read[i] += recv_ret[i]; 473a8e1175bSopenharmony_ci } else if (blocking) { 474a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret[i] == 0); 475a8e1175bSopenharmony_ci } else { 476a8e1175bSopenharmony_ci TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ); 477a8e1175bSopenharmony_ci recv_ret[i] = 0; 478a8e1175bSopenharmony_ci } 479a8e1175bSopenharmony_ci 480a8e1175bSopenharmony_ci /* If the buffer is empty we can test blocking and non-blocking 481a8e1175bSopenharmony_ci * read */ 482a8e1175bSopenharmony_ci if (recv_ret[i] == BUFLEN) { 483a8e1175bSopenharmony_ci int blocking_ret = recv(socket, received[i], 1); 484a8e1175bSopenharmony_ci if (blocking) { 485a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == 0); 486a8e1175bSopenharmony_ci } else { 487a8e1175bSopenharmony_ci TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ); 488a8e1175bSopenharmony_ci } 489a8e1175bSopenharmony_ci } 490a8e1175bSopenharmony_ci } 491a8e1175bSopenharmony_ci 492a8e1175bSopenharmony_ci progress = 0; 493a8e1175bSopenharmony_ci for (i = 0; i < ROUNDS; i++) { 494a8e1175bSopenharmony_ci progress += send_ret[i] + recv_ret[i]; 495a8e1175bSopenharmony_ci } 496a8e1175bSopenharmony_ci } 497a8e1175bSopenharmony_ci 498a8e1175bSopenharmony_ci for (i = 0; i < ROUNDS; i++) { 499a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0); 500a8e1175bSopenharmony_ci } 501a8e1175bSopenharmony_ci 502a8e1175bSopenharmony_ciexit: 503a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&client); 504a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&server); 505a8e1175bSopenharmony_ci USE_PSA_DONE(); 506a8e1175bSopenharmony_ci} 507a8e1175bSopenharmony_ci/* END_CASE */ 508a8e1175bSopenharmony_ci 509a8e1175bSopenharmony_ci/* BEGIN_CASE */ 510a8e1175bSopenharmony_civoid ssl_message_queue_sanity() 511a8e1175bSopenharmony_ci{ 512a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 513a8e1175bSopenharmony_ci 514a8e1175bSopenharmony_ci USE_PSA_INIT(); 515a8e1175bSopenharmony_ci /* Trying to push/pull to an empty queue */ 516a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(NULL, 1) 517a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_ARG_NULL); 518a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(NULL, 1) 519a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_ARG_NULL); 520a8e1175bSopenharmony_ci 521a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 522a8e1175bSopenharmony_ci TEST_ASSERT(queue.capacity == 3); 523a8e1175bSopenharmony_ci TEST_ASSERT(queue.num == 0); 524a8e1175bSopenharmony_ci 525a8e1175bSopenharmony_ciexit: 526a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue_free(&queue); 527a8e1175bSopenharmony_ci USE_PSA_DONE(); 528a8e1175bSopenharmony_ci} 529a8e1175bSopenharmony_ci/* END_CASE */ 530a8e1175bSopenharmony_ci 531a8e1175bSopenharmony_ci/* BEGIN_CASE */ 532a8e1175bSopenharmony_civoid ssl_message_queue_basic() 533a8e1175bSopenharmony_ci{ 534a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 535a8e1175bSopenharmony_ci 536a8e1175bSopenharmony_ci USE_PSA_INIT(); 537a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 538a8e1175bSopenharmony_ci 539a8e1175bSopenharmony_ci /* Sanity test - 3 pushes and 3 pops with sufficient space */ 540a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 541a8e1175bSopenharmony_ci TEST_ASSERT(queue.capacity == 3); 542a8e1175bSopenharmony_ci TEST_ASSERT(queue.num == 1); 543a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 544a8e1175bSopenharmony_ci TEST_ASSERT(queue.capacity == 3); 545a8e1175bSopenharmony_ci TEST_ASSERT(queue.num == 2); 546a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2); 547a8e1175bSopenharmony_ci TEST_ASSERT(queue.capacity == 3); 548a8e1175bSopenharmony_ci TEST_ASSERT(queue.num == 3); 549a8e1175bSopenharmony_ci 550a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 551a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 552a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2); 553a8e1175bSopenharmony_ci 554a8e1175bSopenharmony_ciexit: 555a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue_free(&queue); 556a8e1175bSopenharmony_ci USE_PSA_DONE(); 557a8e1175bSopenharmony_ci} 558a8e1175bSopenharmony_ci/* END_CASE */ 559a8e1175bSopenharmony_ci 560a8e1175bSopenharmony_ci/* BEGIN_CASE */ 561a8e1175bSopenharmony_civoid ssl_message_queue_overflow_underflow() 562a8e1175bSopenharmony_ci{ 563a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 564a8e1175bSopenharmony_ci 565a8e1175bSopenharmony_ci USE_PSA_INIT(); 566a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 567a8e1175bSopenharmony_ci 568a8e1175bSopenharmony_ci /* 4 pushes (last one with an error), 4 pops (last one with an error) */ 569a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 570a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 571a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2); 572a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) 573a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_WRITE); 574a8e1175bSopenharmony_ci 575a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 576a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 577a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2); 578a8e1175bSopenharmony_ci 579a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) 580a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_READ); 581a8e1175bSopenharmony_ci 582a8e1175bSopenharmony_ciexit: 583a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue_free(&queue); 584a8e1175bSopenharmony_ci USE_PSA_DONE(); 585a8e1175bSopenharmony_ci} 586a8e1175bSopenharmony_ci/* END_CASE */ 587a8e1175bSopenharmony_ci 588a8e1175bSopenharmony_ci/* BEGIN_CASE */ 589a8e1175bSopenharmony_civoid ssl_message_queue_interleaved() 590a8e1175bSopenharmony_ci{ 591a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 592a8e1175bSopenharmony_ci 593a8e1175bSopenharmony_ci USE_PSA_INIT(); 594a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 595a8e1175bSopenharmony_ci 596a8e1175bSopenharmony_ci /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops 597a8e1175bSopenharmony_ci * (to wrap around the buffer) */ 598a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 599a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 600a8e1175bSopenharmony_ci 601a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 602a8e1175bSopenharmony_ci 603a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2); 604a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) == 3); 605a8e1175bSopenharmony_ci 606a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 607a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2); 608a8e1175bSopenharmony_ci 609a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 5) == 5); 610a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 8) == 8); 611a8e1175bSopenharmony_ci 612a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 3) == 3); 613a8e1175bSopenharmony_ci 614a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 5) == 5); 615a8e1175bSopenharmony_ci 616a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 8) == 8); 617a8e1175bSopenharmony_ci 618a8e1175bSopenharmony_ciexit: 619a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue_free(&queue); 620a8e1175bSopenharmony_ci USE_PSA_DONE(); 621a8e1175bSopenharmony_ci} 622a8e1175bSopenharmony_ci/* END_CASE */ 623a8e1175bSopenharmony_ci 624a8e1175bSopenharmony_ci/* BEGIN_CASE */ 625a8e1175bSopenharmony_civoid ssl_message_queue_insufficient_buffer() 626a8e1175bSopenharmony_ci{ 627a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 628a8e1175bSopenharmony_ci size_t message_len = 10; 629a8e1175bSopenharmony_ci size_t buffer_len = 5; 630a8e1175bSopenharmony_ci 631a8e1175bSopenharmony_ci USE_PSA_INIT(); 632a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 1) == 0); 633a8e1175bSopenharmony_ci 634a8e1175bSopenharmony_ci /* Popping without a sufficient buffer */ 635a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, message_len) 636a8e1175bSopenharmony_ci == (int) message_len); 637a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, buffer_len) 638a8e1175bSopenharmony_ci == (int) buffer_len); 639a8e1175bSopenharmony_ciexit: 640a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue_free(&queue); 641a8e1175bSopenharmony_ci USE_PSA_DONE(); 642a8e1175bSopenharmony_ci} 643a8e1175bSopenharmony_ci/* END_CASE */ 644a8e1175bSopenharmony_ci 645a8e1175bSopenharmony_ci/* BEGIN_CASE */ 646a8e1175bSopenharmony_civoid ssl_message_mock_uninitialized() 647a8e1175bSopenharmony_ci{ 648a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 649a8e1175bSopenharmony_ci unsigned char message[MSGLEN] = { 0 }, received[MSGLEN]; 650a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 651a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 652a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 653a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 654a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 655a8e1175bSopenharmony_ci 656a8e1175bSopenharmony_ci USE_PSA_INIT(); 657a8e1175bSopenharmony_ci /* Send with a NULL context */ 658a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(NULL, message, MSGLEN) 659a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_CONTEXT_ERROR); 660a8e1175bSopenharmony_ci 661a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(NULL, message, MSGLEN) 662a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_CONTEXT_ERROR); 663a8e1175bSopenharmony_ci 664a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 665a8e1175bSopenharmony_ci &client_queue, 1, 666a8e1175bSopenharmony_ci &server, 667a8e1175bSopenharmony_ci &server_context) == 0); 668a8e1175bSopenharmony_ci 669a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 670a8e1175bSopenharmony_ci &server_queue, 1, 671a8e1175bSopenharmony_ci &client, 672a8e1175bSopenharmony_ci &client_context) == 0); 673a8e1175bSopenharmony_ci 674a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 675a8e1175bSopenharmony_ci MSGLEN) 676a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_SEND_FAILED); 677a8e1175bSopenharmony_ci 678a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 679a8e1175bSopenharmony_ci MSGLEN) 680a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_READ); 681a8e1175bSopenharmony_ci 682a8e1175bSopenharmony_ci /* Push directly to a queue to later simulate a disconnected behavior */ 683a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&server_queue, 684a8e1175bSopenharmony_ci MSGLEN) 685a8e1175bSopenharmony_ci == MSGLEN); 686a8e1175bSopenharmony_ci 687a8e1175bSopenharmony_ci /* Test if there's an error when trying to read from a disconnected 688a8e1175bSopenharmony_ci * socket */ 689a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 690a8e1175bSopenharmony_ci MSGLEN) 691a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_RECV_FAILED); 692a8e1175bSopenharmony_ciexit: 693a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 694a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 695a8e1175bSopenharmony_ci USE_PSA_DONE(); 696a8e1175bSopenharmony_ci} 697a8e1175bSopenharmony_ci/* END_CASE */ 698a8e1175bSopenharmony_ci 699a8e1175bSopenharmony_ci/* BEGIN_CASE */ 700a8e1175bSopenharmony_civoid ssl_message_mock_basic() 701a8e1175bSopenharmony_ci{ 702a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 703a8e1175bSopenharmony_ci unsigned char message[MSGLEN], received[MSGLEN]; 704a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 705a8e1175bSopenharmony_ci unsigned i; 706a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 707a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 708a8e1175bSopenharmony_ci 709a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 710a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 711a8e1175bSopenharmony_ci USE_PSA_INIT(); 712a8e1175bSopenharmony_ci 713a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 714a8e1175bSopenharmony_ci &client_queue, 1, 715a8e1175bSopenharmony_ci &server, 716a8e1175bSopenharmony_ci &server_context) == 0); 717a8e1175bSopenharmony_ci 718a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 719a8e1175bSopenharmony_ci &server_queue, 1, 720a8e1175bSopenharmony_ci &client, 721a8e1175bSopenharmony_ci &client_context) == 0); 722a8e1175bSopenharmony_ci 723a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 724a8e1175bSopenharmony_ci * can be detected */ 725a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 726a8e1175bSopenharmony_ci message[i] = i & 0xFF; 727a8e1175bSopenharmony_ci } 728a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 729a8e1175bSopenharmony_ci MSGLEN)); 730a8e1175bSopenharmony_ci 731a8e1175bSopenharmony_ci /* Send the message to the server */ 732a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 733a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 734a8e1175bSopenharmony_ci 735a8e1175bSopenharmony_ci /* Read from the server */ 736a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 737a8e1175bSopenharmony_ci MSGLEN) 738a8e1175bSopenharmony_ci == MSGLEN); 739a8e1175bSopenharmony_ci 740a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 741a8e1175bSopenharmony_ci memset(received, 0, MSGLEN); 742a8e1175bSopenharmony_ci 743a8e1175bSopenharmony_ci /* Send the message to the client */ 744a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message, 745a8e1175bSopenharmony_ci MSGLEN) 746a8e1175bSopenharmony_ci == MSGLEN); 747a8e1175bSopenharmony_ci 748a8e1175bSopenharmony_ci /* Read from the client */ 749a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 750a8e1175bSopenharmony_ci MSGLEN) 751a8e1175bSopenharmony_ci == MSGLEN); 752a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 753a8e1175bSopenharmony_ci 754a8e1175bSopenharmony_ciexit: 755a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 756a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 757a8e1175bSopenharmony_ci USE_PSA_DONE(); 758a8e1175bSopenharmony_ci} 759a8e1175bSopenharmony_ci/* END_CASE */ 760a8e1175bSopenharmony_ci 761a8e1175bSopenharmony_ci/* BEGIN_CASE */ 762a8e1175bSopenharmony_civoid ssl_message_mock_queue_overflow_underflow() 763a8e1175bSopenharmony_ci{ 764a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 765a8e1175bSopenharmony_ci unsigned char message[MSGLEN], received[MSGLEN]; 766a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 767a8e1175bSopenharmony_ci unsigned i; 768a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 769a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 770a8e1175bSopenharmony_ci 771a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 772a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 773a8e1175bSopenharmony_ci USE_PSA_INIT(); 774a8e1175bSopenharmony_ci 775a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 776a8e1175bSopenharmony_ci &client_queue, 2, 777a8e1175bSopenharmony_ci &server, 778a8e1175bSopenharmony_ci &server_context) == 0); 779a8e1175bSopenharmony_ci 780a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 781a8e1175bSopenharmony_ci &server_queue, 2, 782a8e1175bSopenharmony_ci &client, 783a8e1175bSopenharmony_ci &client_context) == 0); 784a8e1175bSopenharmony_ci 785a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 786a8e1175bSopenharmony_ci * can be detected */ 787a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 788a8e1175bSopenharmony_ci message[i] = i & 0xFF; 789a8e1175bSopenharmony_ci } 790a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 791a8e1175bSopenharmony_ci MSGLEN*2)); 792a8e1175bSopenharmony_ci 793a8e1175bSopenharmony_ci /* Send three message to the server, last one with an error */ 794a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 795a8e1175bSopenharmony_ci MSGLEN - 1) 796a8e1175bSopenharmony_ci == MSGLEN - 1); 797a8e1175bSopenharmony_ci 798a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 799a8e1175bSopenharmony_ci MSGLEN) 800a8e1175bSopenharmony_ci == MSGLEN); 801a8e1175bSopenharmony_ci 802a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 803a8e1175bSopenharmony_ci MSGLEN) 804a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_WRITE); 805a8e1175bSopenharmony_ci 806a8e1175bSopenharmony_ci /* Read three messages from the server, last one with an error */ 807a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 808a8e1175bSopenharmony_ci MSGLEN - 1) 809a8e1175bSopenharmony_ci == MSGLEN - 1); 810a8e1175bSopenharmony_ci 811a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 812a8e1175bSopenharmony_ci MSGLEN) 813a8e1175bSopenharmony_ci == MSGLEN); 814a8e1175bSopenharmony_ci 815a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 816a8e1175bSopenharmony_ci 817a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 818a8e1175bSopenharmony_ci MSGLEN) 819a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_READ); 820a8e1175bSopenharmony_ci 821a8e1175bSopenharmony_ciexit: 822a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 823a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 824a8e1175bSopenharmony_ci USE_PSA_DONE(); 825a8e1175bSopenharmony_ci} 826a8e1175bSopenharmony_ci/* END_CASE */ 827a8e1175bSopenharmony_ci 828a8e1175bSopenharmony_ci/* BEGIN_CASE */ 829a8e1175bSopenharmony_civoid ssl_message_mock_socket_overflow() 830a8e1175bSopenharmony_ci{ 831a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 832a8e1175bSopenharmony_ci unsigned char message[MSGLEN], received[MSGLEN]; 833a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 834a8e1175bSopenharmony_ci unsigned i; 835a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 836a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 837a8e1175bSopenharmony_ci 838a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 839a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 840a8e1175bSopenharmony_ci USE_PSA_INIT(); 841a8e1175bSopenharmony_ci 842a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 843a8e1175bSopenharmony_ci &client_queue, 2, 844a8e1175bSopenharmony_ci &server, 845a8e1175bSopenharmony_ci &server_context) == 0); 846a8e1175bSopenharmony_ci 847a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 848a8e1175bSopenharmony_ci &server_queue, 2, 849a8e1175bSopenharmony_ci &client, 850a8e1175bSopenharmony_ci &client_context) == 0); 851a8e1175bSopenharmony_ci 852a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 853a8e1175bSopenharmony_ci * can be detected */ 854a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 855a8e1175bSopenharmony_ci message[i] = i & 0xFF; 856a8e1175bSopenharmony_ci } 857a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 858a8e1175bSopenharmony_ci MSGLEN)); 859a8e1175bSopenharmony_ci 860a8e1175bSopenharmony_ci /* Send two message to the server, second one with an error */ 861a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 862a8e1175bSopenharmony_ci MSGLEN) 863a8e1175bSopenharmony_ci == MSGLEN); 864a8e1175bSopenharmony_ci 865a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 866a8e1175bSopenharmony_ci MSGLEN) 867a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_SEND_FAILED); 868a8e1175bSopenharmony_ci 869a8e1175bSopenharmony_ci /* Read the only message from the server */ 870a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 871a8e1175bSopenharmony_ci MSGLEN) 872a8e1175bSopenharmony_ci == MSGLEN); 873a8e1175bSopenharmony_ci 874a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 875a8e1175bSopenharmony_ci 876a8e1175bSopenharmony_ciexit: 877a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 878a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 879a8e1175bSopenharmony_ci USE_PSA_DONE(); 880a8e1175bSopenharmony_ci} 881a8e1175bSopenharmony_ci/* END_CASE */ 882a8e1175bSopenharmony_ci 883a8e1175bSopenharmony_ci/* BEGIN_CASE */ 884a8e1175bSopenharmony_civoid ssl_message_mock_truncated() 885a8e1175bSopenharmony_ci{ 886a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 887a8e1175bSopenharmony_ci unsigned char message[MSGLEN], received[MSGLEN]; 888a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 889a8e1175bSopenharmony_ci unsigned i; 890a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 891a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 892a8e1175bSopenharmony_ci 893a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 894a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 895a8e1175bSopenharmony_ci USE_PSA_INIT(); 896a8e1175bSopenharmony_ci 897a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 898a8e1175bSopenharmony_ci &client_queue, 2, 899a8e1175bSopenharmony_ci &server, 900a8e1175bSopenharmony_ci &server_context) == 0); 901a8e1175bSopenharmony_ci 902a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 903a8e1175bSopenharmony_ci &server_queue, 2, 904a8e1175bSopenharmony_ci &client, 905a8e1175bSopenharmony_ci &client_context) == 0); 906a8e1175bSopenharmony_ci 907a8e1175bSopenharmony_ci memset(received, 0, MSGLEN); 908a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 909a8e1175bSopenharmony_ci * can be detected */ 910a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 911a8e1175bSopenharmony_ci message[i] = i & 0xFF; 912a8e1175bSopenharmony_ci } 913a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 914a8e1175bSopenharmony_ci 2 * MSGLEN)); 915a8e1175bSopenharmony_ci 916a8e1175bSopenharmony_ci /* Send two messages to the server, the second one small enough to fit in the 917a8e1175bSopenharmony_ci * receiver's buffer. */ 918a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 919a8e1175bSopenharmony_ci MSGLEN) 920a8e1175bSopenharmony_ci == MSGLEN); 921a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 922a8e1175bSopenharmony_ci MSGLEN / 2) 923a8e1175bSopenharmony_ci == MSGLEN / 2); 924a8e1175bSopenharmony_ci /* Read a truncated message from the server */ 925a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 926a8e1175bSopenharmony_ci MSGLEN/2) 927a8e1175bSopenharmony_ci == MSGLEN/2); 928a8e1175bSopenharmony_ci 929a8e1175bSopenharmony_ci /* Test that the first half of the message is valid, and second one isn't */ 930a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0); 931a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2) 932a8e1175bSopenharmony_ci != 0); 933a8e1175bSopenharmony_ci memset(received, 0, MSGLEN); 934a8e1175bSopenharmony_ci 935a8e1175bSopenharmony_ci /* Read a full message from the server */ 936a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 937a8e1175bSopenharmony_ci MSGLEN/2) 938a8e1175bSopenharmony_ci == MSGLEN / 2); 939a8e1175bSopenharmony_ci 940a8e1175bSopenharmony_ci /* Test that the first half of the message is valid */ 941a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0); 942a8e1175bSopenharmony_ci 943a8e1175bSopenharmony_ciexit: 944a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 945a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 946a8e1175bSopenharmony_ci USE_PSA_DONE(); 947a8e1175bSopenharmony_ci} 948a8e1175bSopenharmony_ci/* END_CASE */ 949a8e1175bSopenharmony_ci 950a8e1175bSopenharmony_ci/* BEGIN_CASE */ 951a8e1175bSopenharmony_civoid ssl_message_mock_socket_read_error() 952a8e1175bSopenharmony_ci{ 953a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 954a8e1175bSopenharmony_ci unsigned char message[MSGLEN], received[MSGLEN]; 955a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 956a8e1175bSopenharmony_ci unsigned i; 957a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 958a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 959a8e1175bSopenharmony_ci 960a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 961a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 962a8e1175bSopenharmony_ci USE_PSA_INIT(); 963a8e1175bSopenharmony_ci 964a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 965a8e1175bSopenharmony_ci &client_queue, 1, 966a8e1175bSopenharmony_ci &server, 967a8e1175bSopenharmony_ci &server_context) == 0); 968a8e1175bSopenharmony_ci 969a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 970a8e1175bSopenharmony_ci &server_queue, 1, 971a8e1175bSopenharmony_ci &client, 972a8e1175bSopenharmony_ci &client_context) == 0); 973a8e1175bSopenharmony_ci 974a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 975a8e1175bSopenharmony_ci * can be detected */ 976a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 977a8e1175bSopenharmony_ci message[i] = i & 0xFF; 978a8e1175bSopenharmony_ci } 979a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 980a8e1175bSopenharmony_ci MSGLEN)); 981a8e1175bSopenharmony_ci 982a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 983a8e1175bSopenharmony_ci MSGLEN) 984a8e1175bSopenharmony_ci == MSGLEN); 985a8e1175bSopenharmony_ci 986a8e1175bSopenharmony_ci /* Force a read error by disconnecting the socket by hand */ 987a8e1175bSopenharmony_ci server.status = 0; 988a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 989a8e1175bSopenharmony_ci MSGLEN) 990a8e1175bSopenharmony_ci == MBEDTLS_TEST_ERROR_RECV_FAILED); 991a8e1175bSopenharmony_ci /* Return to a valid state */ 992a8e1175bSopenharmony_ci server.status = MBEDTLS_MOCK_SOCKET_CONNECTED; 993a8e1175bSopenharmony_ci 994a8e1175bSopenharmony_ci memset(received, 0, sizeof(received)); 995a8e1175bSopenharmony_ci 996a8e1175bSopenharmony_ci /* Test that even though the server tried to read once disconnected, the 997a8e1175bSopenharmony_ci * continuity is preserved */ 998a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 999a8e1175bSopenharmony_ci MSGLEN) 1000a8e1175bSopenharmony_ci == MSGLEN); 1001a8e1175bSopenharmony_ci 1002a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1003a8e1175bSopenharmony_ci 1004a8e1175bSopenharmony_ciexit: 1005a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 1006a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 1007a8e1175bSopenharmony_ci USE_PSA_DONE(); 1008a8e1175bSopenharmony_ci} 1009a8e1175bSopenharmony_ci/* END_CASE */ 1010a8e1175bSopenharmony_ci 1011a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1012a8e1175bSopenharmony_civoid ssl_message_mock_interleaved_one_way() 1013a8e1175bSopenharmony_ci{ 1014a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 1015a8e1175bSopenharmony_ci unsigned char message[MSGLEN], received[MSGLEN]; 1016a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 1017a8e1175bSopenharmony_ci unsigned i; 1018a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 1019a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 1020a8e1175bSopenharmony_ci 1021a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 1022a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 1023a8e1175bSopenharmony_ci USE_PSA_INIT(); 1024a8e1175bSopenharmony_ci 1025a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 1026a8e1175bSopenharmony_ci &client_queue, 3, 1027a8e1175bSopenharmony_ci &server, 1028a8e1175bSopenharmony_ci &server_context) == 0); 1029a8e1175bSopenharmony_ci 1030a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 1031a8e1175bSopenharmony_ci &server_queue, 3, 1032a8e1175bSopenharmony_ci &client, 1033a8e1175bSopenharmony_ci &client_context) == 0); 1034a8e1175bSopenharmony_ci 1035a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 1036a8e1175bSopenharmony_ci * can be detected */ 1037a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 1038a8e1175bSopenharmony_ci message[i] = i & 0xFF; 1039a8e1175bSopenharmony_ci } 1040a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 1041a8e1175bSopenharmony_ci MSGLEN*3)); 1042a8e1175bSopenharmony_ci 1043a8e1175bSopenharmony_ci /* Interleaved test - [2 sends, 1 read] twice, and then two reads 1044a8e1175bSopenharmony_ci * (to wrap around the buffer) */ 1045a8e1175bSopenharmony_ci for (i = 0; i < 2; i++) { 1046a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 1047a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1048a8e1175bSopenharmony_ci 1049a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 1050a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1051a8e1175bSopenharmony_ci 1052a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1053a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1054a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1055a8e1175bSopenharmony_ci memset(received, 0, sizeof(received)); 1056a8e1175bSopenharmony_ci } 1057a8e1175bSopenharmony_ci 1058a8e1175bSopenharmony_ci for (i = 0; i < 2; i++) { 1059a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1060a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1061a8e1175bSopenharmony_ci 1062a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1063a8e1175bSopenharmony_ci } 1064a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1065a8e1175bSopenharmony_ci MSGLEN) 1066a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_READ); 1067a8e1175bSopenharmony_ciexit: 1068a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 1069a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 1070a8e1175bSopenharmony_ci USE_PSA_DONE(); 1071a8e1175bSopenharmony_ci} 1072a8e1175bSopenharmony_ci/* END_CASE */ 1073a8e1175bSopenharmony_ci 1074a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1075a8e1175bSopenharmony_civoid ssl_message_mock_interleaved_two_ways() 1076a8e1175bSopenharmony_ci{ 1077a8e1175bSopenharmony_ci enum { MSGLEN = 10 }; 1078a8e1175bSopenharmony_ci unsigned char message[MSGLEN], received[MSGLEN]; 1079a8e1175bSopenharmony_ci mbedtls_test_mock_socket client, server; 1080a8e1175bSopenharmony_ci unsigned i; 1081a8e1175bSopenharmony_ci mbedtls_test_ssl_message_queue server_queue, client_queue; 1082a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 1083a8e1175bSopenharmony_ci 1084a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 1085a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 1086a8e1175bSopenharmony_ci USE_PSA_INIT(); 1087a8e1175bSopenharmony_ci 1088a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 1089a8e1175bSopenharmony_ci &client_queue, 3, 1090a8e1175bSopenharmony_ci &server, 1091a8e1175bSopenharmony_ci &server_context) == 0); 1092a8e1175bSopenharmony_ci 1093a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 1094a8e1175bSopenharmony_ci &server_queue, 3, 1095a8e1175bSopenharmony_ci &client, 1096a8e1175bSopenharmony_ci &client_context) == 0); 1097a8e1175bSopenharmony_ci 1098a8e1175bSopenharmony_ci /* Fill up the buffer with structured data so that unwanted changes 1099a8e1175bSopenharmony_ci * can be detected */ 1100a8e1175bSopenharmony_ci for (i = 0; i < MSGLEN; i++) { 1101a8e1175bSopenharmony_ci message[i] = i & 0xFF; 1102a8e1175bSopenharmony_ci } 1103a8e1175bSopenharmony_ci TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 1104a8e1175bSopenharmony_ci MSGLEN*3)); 1105a8e1175bSopenharmony_ci 1106a8e1175bSopenharmony_ci /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads 1107a8e1175bSopenharmony_ci * (to wrap around the buffer) both ways. */ 1108a8e1175bSopenharmony_ci for (i = 0; i < 2; i++) { 1109a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 1110a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1111a8e1175bSopenharmony_ci 1112a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 1113a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1114a8e1175bSopenharmony_ci 1115a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message, 1116a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1117a8e1175bSopenharmony_ci 1118a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message, 1119a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1120a8e1175bSopenharmony_ci 1121a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1122a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1123a8e1175bSopenharmony_ci 1124a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1125a8e1175bSopenharmony_ci 1126a8e1175bSopenharmony_ci memset(received, 0, sizeof(received)); 1127a8e1175bSopenharmony_ci 1128a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 1129a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1130a8e1175bSopenharmony_ci 1131a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1132a8e1175bSopenharmony_ci 1133a8e1175bSopenharmony_ci memset(received, 0, sizeof(received)); 1134a8e1175bSopenharmony_ci } 1135a8e1175bSopenharmony_ci 1136a8e1175bSopenharmony_ci for (i = 0; i < 2; i++) { 1137a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1138a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1139a8e1175bSopenharmony_ci 1140a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1141a8e1175bSopenharmony_ci memset(received, 0, sizeof(received)); 1142a8e1175bSopenharmony_ci 1143a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 1144a8e1175bSopenharmony_ci MSGLEN) == MSGLEN); 1145a8e1175bSopenharmony_ci 1146a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1147a8e1175bSopenharmony_ci memset(received, 0, sizeof(received)); 1148a8e1175bSopenharmony_ci } 1149a8e1175bSopenharmony_ci 1150a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1151a8e1175bSopenharmony_ci MSGLEN) 1152a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_READ); 1153a8e1175bSopenharmony_ci 1154a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 1155a8e1175bSopenharmony_ci MSGLEN) 1156a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_WANT_READ); 1157a8e1175bSopenharmony_ciexit: 1158a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&server_context); 1159a8e1175bSopenharmony_ci mbedtls_test_message_socket_close(&client_context); 1160a8e1175bSopenharmony_ci USE_PSA_DONE(); 1161a8e1175bSopenharmony_ci} 1162a8e1175bSopenharmony_ci/* END_CASE */ 1163a8e1175bSopenharmony_ci 1164a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */ 1165a8e1175bSopenharmony_civoid ssl_dtls_replay(data_t *prevs, data_t *new, int ret) 1166a8e1175bSopenharmony_ci{ 1167a8e1175bSopenharmony_ci uint32_t len = 0; 1168a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 1169a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 1170a8e1175bSopenharmony_ci 1171a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 1172a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 1173a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 1174a8e1175bSopenharmony_ci 1175a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_config_defaults(&conf, 1176a8e1175bSopenharmony_ci MBEDTLS_SSL_IS_CLIENT, 1177a8e1175bSopenharmony_ci MBEDTLS_SSL_TRANSPORT_DATAGRAM, 1178a8e1175bSopenharmony_ci MBEDTLS_SSL_PRESET_DEFAULT) == 0); 1179a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 1180a8e1175bSopenharmony_ci 1181a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 1182a8e1175bSopenharmony_ci 1183a8e1175bSopenharmony_ci /* Read previous record numbers */ 1184a8e1175bSopenharmony_ci for (len = 0; len < prevs->len; len += 6) { 1185a8e1175bSopenharmony_ci memcpy(ssl.in_ctr + 2, prevs->x + len, 6); 1186a8e1175bSopenharmony_ci mbedtls_ssl_dtls_replay_update(&ssl); 1187a8e1175bSopenharmony_ci } 1188a8e1175bSopenharmony_ci 1189a8e1175bSopenharmony_ci /* Check new number */ 1190a8e1175bSopenharmony_ci memcpy(ssl.in_ctr + 2, new->x, 6); 1191a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret); 1192a8e1175bSopenharmony_ci 1193a8e1175bSopenharmony_ciexit: 1194a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 1195a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 1196a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 1197a8e1175bSopenharmony_ci} 1198a8e1175bSopenharmony_ci/* END_CASE */ 1199a8e1175bSopenharmony_ci 1200a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ 1201a8e1175bSopenharmony_civoid ssl_set_hostname_twice(char *input_hostname0, char *input_hostname1) 1202a8e1175bSopenharmony_ci{ 1203a8e1175bSopenharmony_ci const char *output_hostname; 1204a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 1205a8e1175bSopenharmony_ci 1206a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 1207a8e1175bSopenharmony_ci USE_PSA_INIT(); 1208a8e1175bSopenharmony_ci 1209a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, input_hostname0) == 0); 1210a8e1175bSopenharmony_ci output_hostname = mbedtls_ssl_get_hostname(&ssl); 1211a8e1175bSopenharmony_ci TEST_ASSERT(strcmp(input_hostname0, output_hostname) == 0); 1212a8e1175bSopenharmony_ci 1213a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, input_hostname1) == 0); 1214a8e1175bSopenharmony_ci output_hostname = mbedtls_ssl_get_hostname(&ssl); 1215a8e1175bSopenharmony_ci TEST_ASSERT(strcmp(input_hostname1, output_hostname) == 0); 1216a8e1175bSopenharmony_ci 1217a8e1175bSopenharmony_ciexit: 1218a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 1219a8e1175bSopenharmony_ci USE_PSA_DONE(); 1220a8e1175bSopenharmony_ci} 1221a8e1175bSopenharmony_ci/* END_CASE */ 1222a8e1175bSopenharmony_ci 1223a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1224a8e1175bSopenharmony_civoid ssl_crypt_record(int cipher_type, int hash_id, 1225a8e1175bSopenharmony_ci int etm, int tag_mode, int ver, 1226a8e1175bSopenharmony_ci int cid0_len, int cid1_len) 1227a8e1175bSopenharmony_ci{ 1228a8e1175bSopenharmony_ci /* 1229a8e1175bSopenharmony_ci * Test several record encryptions and decryptions 1230a8e1175bSopenharmony_ci * with plenty of space before and after the data 1231a8e1175bSopenharmony_ci * within the record buffer. 1232a8e1175bSopenharmony_ci */ 1233a8e1175bSopenharmony_ci 1234a8e1175bSopenharmony_ci int ret; 1235a8e1175bSopenharmony_ci int num_records = 16; 1236a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; /* ONLY for debugging */ 1237a8e1175bSopenharmony_ci 1238a8e1175bSopenharmony_ci mbedtls_ssl_transform t0, t1; 1239a8e1175bSopenharmony_ci unsigned char *buf = NULL; 1240a8e1175bSopenharmony_ci size_t const buflen = 512; 1241a8e1175bSopenharmony_ci mbedtls_record rec, rec_backup; 1242a8e1175bSopenharmony_ci 1243a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 1244a8e1175bSopenharmony_ci mbedtls_ssl_transform_init(&t0); 1245a8e1175bSopenharmony_ci mbedtls_ssl_transform_init(&t1); 1246a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 1247a8e1175bSopenharmony_ci 1248a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id, 1249a8e1175bSopenharmony_ci etm, tag_mode, ver, 1250a8e1175bSopenharmony_ci (size_t) cid0_len, 1251a8e1175bSopenharmony_ci (size_t) cid1_len); 1252a8e1175bSopenharmony_ci 1253a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 1254a8e1175bSopenharmony_ci 1255a8e1175bSopenharmony_ci TEST_CALLOC(buf, buflen); 1256a8e1175bSopenharmony_ci 1257a8e1175bSopenharmony_ci while (num_records-- > 0) { 1258a8e1175bSopenharmony_ci mbedtls_ssl_transform *t_dec, *t_enc; 1259a8e1175bSopenharmony_ci /* Take turns in who's sending and who's receiving. */ 1260a8e1175bSopenharmony_ci if (num_records % 3 == 0) { 1261a8e1175bSopenharmony_ci t_dec = &t0; 1262a8e1175bSopenharmony_ci t_enc = &t1; 1263a8e1175bSopenharmony_ci } else { 1264a8e1175bSopenharmony_ci t_dec = &t1; 1265a8e1175bSopenharmony_ci t_enc = &t0; 1266a8e1175bSopenharmony_ci } 1267a8e1175bSopenharmony_ci 1268a8e1175bSopenharmony_ci /* 1269a8e1175bSopenharmony_ci * The record header affects the transformation in two ways: 1270a8e1175bSopenharmony_ci * 1) It determines the AEAD additional data 1271a8e1175bSopenharmony_ci * 2) The record counter sometimes determines the IV. 1272a8e1175bSopenharmony_ci * 1273a8e1175bSopenharmony_ci * Apart from that, the fields don't have influence. 1274a8e1175bSopenharmony_ci * In particular, it is currently not the responsibility 1275a8e1175bSopenharmony_ci * of ssl_encrypt/decrypt_buf to check if the transform 1276a8e1175bSopenharmony_ci * version matches the record version, or that the 1277a8e1175bSopenharmony_ci * type is sensible. 1278a8e1175bSopenharmony_ci */ 1279a8e1175bSopenharmony_ci 1280a8e1175bSopenharmony_ci memset(rec.ctr, num_records, sizeof(rec.ctr)); 1281a8e1175bSopenharmony_ci rec.type = 42; 1282a8e1175bSopenharmony_ci rec.ver[0] = num_records; 1283a8e1175bSopenharmony_ci rec.ver[1] = num_records; 1284a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1285a8e1175bSopenharmony_ci rec.cid_len = 0; 1286a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1287a8e1175bSopenharmony_ci 1288a8e1175bSopenharmony_ci rec.buf = buf; 1289a8e1175bSopenharmony_ci rec.buf_len = buflen; 1290a8e1175bSopenharmony_ci rec.data_offset = 16; 1291a8e1175bSopenharmony_ci /* Make sure to vary the length to exercise different 1292a8e1175bSopenharmony_ci * paddings. */ 1293a8e1175bSopenharmony_ci rec.data_len = 1 + num_records; 1294a8e1175bSopenharmony_ci 1295a8e1175bSopenharmony_ci memset(rec.buf + rec.data_offset, 42, rec.data_len); 1296a8e1175bSopenharmony_ci 1297a8e1175bSopenharmony_ci /* Make a copy for later comparison */ 1298a8e1175bSopenharmony_ci rec_backup = rec; 1299a8e1175bSopenharmony_ci 1300a8e1175bSopenharmony_ci /* Encrypt record */ 1301a8e1175bSopenharmony_ci ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec, 1302a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand, NULL); 1303a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 1304a8e1175bSopenharmony_ci if (ret != 0) { 1305a8e1175bSopenharmony_ci continue; 1306a8e1175bSopenharmony_ci } 1307a8e1175bSopenharmony_ci 1308a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1309a8e1175bSopenharmony_ci if (rec.cid_len != 0) { 1310a8e1175bSopenharmony_ci /* DTLS 1.2 + CID hides the real content type and 1311a8e1175bSopenharmony_ci * uses a special CID content type in the protected 1312a8e1175bSopenharmony_ci * record. Double-check this. */ 1313a8e1175bSopenharmony_ci TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID); 1314a8e1175bSopenharmony_ci } 1315a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1316a8e1175bSopenharmony_ci 1317a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 1318a8e1175bSopenharmony_ci if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 1319a8e1175bSopenharmony_ci /* TLS 1.3 hides the real content type and 1320a8e1175bSopenharmony_ci * always uses Application Data as the content type 1321a8e1175bSopenharmony_ci * for protected records. Double-check this. */ 1322a8e1175bSopenharmony_ci TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA); 1323a8e1175bSopenharmony_ci } 1324a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 1325a8e1175bSopenharmony_ci 1326a8e1175bSopenharmony_ci /* Decrypt record with t_dec */ 1327a8e1175bSopenharmony_ci ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec); 1328a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 1329a8e1175bSopenharmony_ci 1330a8e1175bSopenharmony_ci /* Compare results */ 1331a8e1175bSopenharmony_ci TEST_ASSERT(rec.type == rec_backup.type); 1332a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0); 1333a8e1175bSopenharmony_ci TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]); 1334a8e1175bSopenharmony_ci TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]); 1335a8e1175bSopenharmony_ci TEST_ASSERT(rec.data_len == rec_backup.data_len); 1336a8e1175bSopenharmony_ci TEST_ASSERT(rec.data_offset == rec_backup.data_offset); 1337a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(rec.buf + rec.data_offset, 1338a8e1175bSopenharmony_ci rec_backup.buf + rec_backup.data_offset, 1339a8e1175bSopenharmony_ci rec.data_len) == 0); 1340a8e1175bSopenharmony_ci } 1341a8e1175bSopenharmony_ci 1342a8e1175bSopenharmony_ciexit: 1343a8e1175bSopenharmony_ci 1344a8e1175bSopenharmony_ci /* Cleanup */ 1345a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 1346a8e1175bSopenharmony_ci mbedtls_ssl_transform_free(&t0); 1347a8e1175bSopenharmony_ci mbedtls_ssl_transform_free(&t1); 1348a8e1175bSopenharmony_ci 1349a8e1175bSopenharmony_ci mbedtls_free(buf); 1350a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 1351a8e1175bSopenharmony_ci} 1352a8e1175bSopenharmony_ci/* END_CASE */ 1353a8e1175bSopenharmony_ci 1354a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1355a8e1175bSopenharmony_civoid ssl_crypt_record_small(int cipher_type, int hash_id, 1356a8e1175bSopenharmony_ci int etm, int tag_mode, int ver, 1357a8e1175bSopenharmony_ci int cid0_len, int cid1_len) 1358a8e1175bSopenharmony_ci{ 1359a8e1175bSopenharmony_ci /* 1360a8e1175bSopenharmony_ci * Test pairs of encryption and decryption with an increasing 1361a8e1175bSopenharmony_ci * amount of space in the record buffer - in more detail: 1362a8e1175bSopenharmony_ci * 1) Try to encrypt with 0, 1, 2, ... bytes available 1363a8e1175bSopenharmony_ci * in front of the plaintext, and expect the encryption 1364a8e1175bSopenharmony_ci * to succeed starting from some offset. Always keep 1365a8e1175bSopenharmony_ci * enough space in the end of the buffer. 1366a8e1175bSopenharmony_ci * 2) Try to encrypt with 0, 1, 2, ... bytes available 1367a8e1175bSopenharmony_ci * at the end of the plaintext, and expect the encryption 1368a8e1175bSopenharmony_ci * to succeed starting from some offset. Always keep 1369a8e1175bSopenharmony_ci * enough space at the beginning of the buffer. 1370a8e1175bSopenharmony_ci * 3) Try to encrypt with 0, 1, 2, ... bytes available 1371a8e1175bSopenharmony_ci * both at the front and end of the plaintext, 1372a8e1175bSopenharmony_ci * and expect the encryption to succeed starting from 1373a8e1175bSopenharmony_ci * some offset. 1374a8e1175bSopenharmony_ci * 1375a8e1175bSopenharmony_ci * If encryption succeeds, check that decryption succeeds 1376a8e1175bSopenharmony_ci * and yields the original record. 1377a8e1175bSopenharmony_ci */ 1378a8e1175bSopenharmony_ci 1379a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; /* ONLY for debugging */ 1380a8e1175bSopenharmony_ci 1381a8e1175bSopenharmony_ci mbedtls_ssl_transform t0, t1; 1382a8e1175bSopenharmony_ci unsigned char *buf = NULL; 1383a8e1175bSopenharmony_ci size_t const buflen = 256; 1384a8e1175bSopenharmony_ci mbedtls_record rec, rec_backup; 1385a8e1175bSopenharmony_ci 1386a8e1175bSopenharmony_ci int ret; 1387a8e1175bSopenharmony_ci int mode; /* Mode 1, 2 or 3 as explained above */ 1388a8e1175bSopenharmony_ci size_t offset; /* Available space at beginning/end/both */ 1389a8e1175bSopenharmony_ci size_t threshold = 96; /* Maximum offset to test against */ 1390a8e1175bSopenharmony_ci 1391a8e1175bSopenharmony_ci size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */ 1392a8e1175bSopenharmony_ci size_t default_post_padding = 128; /* Post-padding to use in mode 1 */ 1393a8e1175bSopenharmony_ci 1394a8e1175bSopenharmony_ci int seen_success; /* Indicates if in the current mode we've 1395a8e1175bSopenharmony_ci * already seen a successful test. */ 1396a8e1175bSopenharmony_ci 1397a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 1398a8e1175bSopenharmony_ci mbedtls_ssl_transform_init(&t0); 1399a8e1175bSopenharmony_ci mbedtls_ssl_transform_init(&t1); 1400a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 1401a8e1175bSopenharmony_ci 1402a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id, 1403a8e1175bSopenharmony_ci etm, tag_mode, ver, 1404a8e1175bSopenharmony_ci (size_t) cid0_len, 1405a8e1175bSopenharmony_ci (size_t) cid1_len); 1406a8e1175bSopenharmony_ci 1407a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 1408a8e1175bSopenharmony_ci 1409a8e1175bSopenharmony_ci TEST_CALLOC(buf, buflen); 1410a8e1175bSopenharmony_ci 1411a8e1175bSopenharmony_ci for (mode = 1; mode <= 3; mode++) { 1412a8e1175bSopenharmony_ci seen_success = 0; 1413a8e1175bSopenharmony_ci for (offset = 0; offset <= threshold; offset++) { 1414a8e1175bSopenharmony_ci mbedtls_ssl_transform *t_dec, *t_enc; 1415a8e1175bSopenharmony_ci t_dec = &t0; 1416a8e1175bSopenharmony_ci t_enc = &t1; 1417a8e1175bSopenharmony_ci 1418a8e1175bSopenharmony_ci memset(rec.ctr, offset, sizeof(rec.ctr)); 1419a8e1175bSopenharmony_ci rec.type = 42; 1420a8e1175bSopenharmony_ci rec.ver[0] = offset; 1421a8e1175bSopenharmony_ci rec.ver[1] = offset; 1422a8e1175bSopenharmony_ci rec.buf = buf; 1423a8e1175bSopenharmony_ci rec.buf_len = buflen; 1424a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1425a8e1175bSopenharmony_ci rec.cid_len = 0; 1426a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1427a8e1175bSopenharmony_ci 1428a8e1175bSopenharmony_ci switch (mode) { 1429a8e1175bSopenharmony_ci case 1: /* Space in the beginning */ 1430a8e1175bSopenharmony_ci rec.data_offset = offset; 1431a8e1175bSopenharmony_ci rec.data_len = buflen - offset - default_post_padding; 1432a8e1175bSopenharmony_ci break; 1433a8e1175bSopenharmony_ci 1434a8e1175bSopenharmony_ci case 2: /* Space in the end */ 1435a8e1175bSopenharmony_ci rec.data_offset = default_pre_padding; 1436a8e1175bSopenharmony_ci rec.data_len = buflen - default_pre_padding - offset; 1437a8e1175bSopenharmony_ci break; 1438a8e1175bSopenharmony_ci 1439a8e1175bSopenharmony_ci case 3: /* Space in the beginning and end */ 1440a8e1175bSopenharmony_ci rec.data_offset = offset; 1441a8e1175bSopenharmony_ci rec.data_len = buflen - 2 * offset; 1442a8e1175bSopenharmony_ci break; 1443a8e1175bSopenharmony_ci 1444a8e1175bSopenharmony_ci default: 1445a8e1175bSopenharmony_ci TEST_ASSERT(0); 1446a8e1175bSopenharmony_ci break; 1447a8e1175bSopenharmony_ci } 1448a8e1175bSopenharmony_ci 1449a8e1175bSopenharmony_ci memset(rec.buf + rec.data_offset, 42, rec.data_len); 1450a8e1175bSopenharmony_ci 1451a8e1175bSopenharmony_ci /* Make a copy for later comparison */ 1452a8e1175bSopenharmony_ci rec_backup = rec; 1453a8e1175bSopenharmony_ci 1454a8e1175bSopenharmony_ci /* Encrypt record */ 1455a8e1175bSopenharmony_ci ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec, 1456a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand, NULL); 1457a8e1175bSopenharmony_ci 1458a8e1175bSopenharmony_ci if (ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) { 1459a8e1175bSopenharmony_ci /* It's ok if the output buffer is too small. We do insist 1460a8e1175bSopenharmony_ci * on at least one mode succeeding; this is tracked by 1461a8e1175bSopenharmony_ci * seen_success. */ 1462a8e1175bSopenharmony_ci continue; 1463a8e1175bSopenharmony_ci } 1464a8e1175bSopenharmony_ci 1465a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 1466a8e1175bSopenharmony_ci seen_success = 1; 1467a8e1175bSopenharmony_ci 1468a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1469a8e1175bSopenharmony_ci if (rec.cid_len != 0) { 1470a8e1175bSopenharmony_ci /* DTLS 1.2 + CID hides the real content type and 1471a8e1175bSopenharmony_ci * uses a special CID content type in the protected 1472a8e1175bSopenharmony_ci * record. Double-check this. */ 1473a8e1175bSopenharmony_ci TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID); 1474a8e1175bSopenharmony_ci } 1475a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1476a8e1175bSopenharmony_ci 1477a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 1478a8e1175bSopenharmony_ci if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 1479a8e1175bSopenharmony_ci /* TLS 1.3 hides the real content type and 1480a8e1175bSopenharmony_ci * always uses Application Data as the content type 1481a8e1175bSopenharmony_ci * for protected records. Double-check this. */ 1482a8e1175bSopenharmony_ci TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA); 1483a8e1175bSopenharmony_ci } 1484a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 1485a8e1175bSopenharmony_ci 1486a8e1175bSopenharmony_ci /* Decrypt record with t_dec */ 1487a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0); 1488a8e1175bSopenharmony_ci 1489a8e1175bSopenharmony_ci /* Compare results */ 1490a8e1175bSopenharmony_ci TEST_ASSERT(rec.type == rec_backup.type); 1491a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0); 1492a8e1175bSopenharmony_ci TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]); 1493a8e1175bSopenharmony_ci TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]); 1494a8e1175bSopenharmony_ci TEST_ASSERT(rec.data_len == rec_backup.data_len); 1495a8e1175bSopenharmony_ci TEST_ASSERT(rec.data_offset == rec_backup.data_offset); 1496a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(rec.buf + rec.data_offset, 1497a8e1175bSopenharmony_ci rec_backup.buf + rec_backup.data_offset, 1498a8e1175bSopenharmony_ci rec.data_len) == 0); 1499a8e1175bSopenharmony_ci } 1500a8e1175bSopenharmony_ci 1501a8e1175bSopenharmony_ci TEST_ASSERT(seen_success == 1); 1502a8e1175bSopenharmony_ci } 1503a8e1175bSopenharmony_ci 1504a8e1175bSopenharmony_ciexit: 1505a8e1175bSopenharmony_ci 1506a8e1175bSopenharmony_ci /* Cleanup */ 1507a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 1508a8e1175bSopenharmony_ci mbedtls_ssl_transform_free(&t0); 1509a8e1175bSopenharmony_ci mbedtls_ssl_transform_free(&t1); 1510a8e1175bSopenharmony_ci 1511a8e1175bSopenharmony_ci mbedtls_free(buf); 1512a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 1513a8e1175bSopenharmony_ci} 1514a8e1175bSopenharmony_ci/* END_CASE */ 1515a8e1175bSopenharmony_ci 1516a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1517a8e1175bSopenharmony_civoid ssl_tls13_hkdf_expand_label(int hash_alg, 1518a8e1175bSopenharmony_ci data_t *secret, 1519a8e1175bSopenharmony_ci int label_idx, 1520a8e1175bSopenharmony_ci data_t *ctx, 1521a8e1175bSopenharmony_ci int desired_length, 1522a8e1175bSopenharmony_ci data_t *expected) 1523a8e1175bSopenharmony_ci{ 1524a8e1175bSopenharmony_ci unsigned char dst[100]; 1525a8e1175bSopenharmony_ci 1526a8e1175bSopenharmony_ci unsigned char const *lbl = NULL; 1527a8e1175bSopenharmony_ci size_t lbl_len; 1528a8e1175bSopenharmony_ci#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \ 1529a8e1175bSopenharmony_ci if (label_idx == (int) tls13_label_ ## name) \ 1530a8e1175bSopenharmony_ci { \ 1531a8e1175bSopenharmony_ci lbl = mbedtls_ssl_tls13_labels.name; \ 1532a8e1175bSopenharmony_ci lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \ 1533a8e1175bSopenharmony_ci } 1534a8e1175bSopenharmony_ci MBEDTLS_SSL_TLS1_3_LABEL_LIST 1535a8e1175bSopenharmony_ci#undef MBEDTLS_SSL_TLS1_3_LABEL 1536a8e1175bSopenharmony_ci TEST_ASSERT(lbl != NULL); 1537a8e1175bSopenharmony_ci 1538a8e1175bSopenharmony_ci /* Check sanity of test parameters. */ 1539a8e1175bSopenharmony_ci TEST_ASSERT((size_t) desired_length <= sizeof(dst)); 1540a8e1175bSopenharmony_ci TEST_ASSERT((size_t) desired_length == expected->len); 1541a8e1175bSopenharmony_ci 1542a8e1175bSopenharmony_ci PSA_INIT(); 1543a8e1175bSopenharmony_ci 1544a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_hkdf_expand_label( 1545a8e1175bSopenharmony_ci (psa_algorithm_t) hash_alg, 1546a8e1175bSopenharmony_ci secret->x, secret->len, 1547a8e1175bSopenharmony_ci lbl, lbl_len, 1548a8e1175bSopenharmony_ci ctx->x, ctx->len, 1549a8e1175bSopenharmony_ci dst, desired_length) == 0); 1550a8e1175bSopenharmony_ci 1551a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(dst, (size_t) desired_length, 1552a8e1175bSopenharmony_ci expected->x, (size_t) expected->len); 1553a8e1175bSopenharmony_ci 1554a8e1175bSopenharmony_ciexit: 1555a8e1175bSopenharmony_ci PSA_DONE(); 1556a8e1175bSopenharmony_ci} 1557a8e1175bSopenharmony_ci/* END_CASE */ 1558a8e1175bSopenharmony_ci 1559a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1560a8e1175bSopenharmony_civoid ssl_tls13_traffic_key_generation(int hash_alg, 1561a8e1175bSopenharmony_ci data_t *server_secret, 1562a8e1175bSopenharmony_ci data_t *client_secret, 1563a8e1175bSopenharmony_ci int desired_iv_len, 1564a8e1175bSopenharmony_ci int desired_key_len, 1565a8e1175bSopenharmony_ci data_t *expected_server_write_key, 1566a8e1175bSopenharmony_ci data_t *expected_server_write_iv, 1567a8e1175bSopenharmony_ci data_t *expected_client_write_key, 1568a8e1175bSopenharmony_ci data_t *expected_client_write_iv) 1569a8e1175bSopenharmony_ci{ 1570a8e1175bSopenharmony_ci mbedtls_ssl_key_set keys; 1571a8e1175bSopenharmony_ci 1572a8e1175bSopenharmony_ci /* Check sanity of test parameters. */ 1573a8e1175bSopenharmony_ci TEST_ASSERT(client_secret->len == server_secret->len); 1574a8e1175bSopenharmony_ci TEST_ASSERT( 1575a8e1175bSopenharmony_ci expected_client_write_iv->len == expected_server_write_iv->len && 1576a8e1175bSopenharmony_ci expected_client_write_iv->len == (size_t) desired_iv_len); 1577a8e1175bSopenharmony_ci TEST_ASSERT( 1578a8e1175bSopenharmony_ci expected_client_write_key->len == expected_server_write_key->len && 1579a8e1175bSopenharmony_ci expected_client_write_key->len == (size_t) desired_key_len); 1580a8e1175bSopenharmony_ci 1581a8e1175bSopenharmony_ci PSA_INIT(); 1582a8e1175bSopenharmony_ci 1583a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_make_traffic_keys( 1584a8e1175bSopenharmony_ci (psa_algorithm_t) hash_alg, 1585a8e1175bSopenharmony_ci client_secret->x, 1586a8e1175bSopenharmony_ci server_secret->x, 1587a8e1175bSopenharmony_ci client_secret->len /* == server_secret->len */, 1588a8e1175bSopenharmony_ci desired_key_len, desired_iv_len, 1589a8e1175bSopenharmony_ci &keys) == 0); 1590a8e1175bSopenharmony_ci 1591a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(keys.client_write_key, 1592a8e1175bSopenharmony_ci keys.key_len, 1593a8e1175bSopenharmony_ci expected_client_write_key->x, 1594a8e1175bSopenharmony_ci (size_t) desired_key_len); 1595a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(keys.server_write_key, 1596a8e1175bSopenharmony_ci keys.key_len, 1597a8e1175bSopenharmony_ci expected_server_write_key->x, 1598a8e1175bSopenharmony_ci (size_t) desired_key_len); 1599a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(keys.client_write_iv, 1600a8e1175bSopenharmony_ci keys.iv_len, 1601a8e1175bSopenharmony_ci expected_client_write_iv->x, 1602a8e1175bSopenharmony_ci (size_t) desired_iv_len); 1603a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(keys.server_write_iv, 1604a8e1175bSopenharmony_ci keys.iv_len, 1605a8e1175bSopenharmony_ci expected_server_write_iv->x, 1606a8e1175bSopenharmony_ci (size_t) desired_iv_len); 1607a8e1175bSopenharmony_ci 1608a8e1175bSopenharmony_ciexit: 1609a8e1175bSopenharmony_ci PSA_DONE(); 1610a8e1175bSopenharmony_ci} 1611a8e1175bSopenharmony_ci/* END_CASE */ 1612a8e1175bSopenharmony_ci 1613a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1614a8e1175bSopenharmony_civoid ssl_tls13_derive_secret(int hash_alg, 1615a8e1175bSopenharmony_ci data_t *secret, 1616a8e1175bSopenharmony_ci int label_idx, 1617a8e1175bSopenharmony_ci data_t *ctx, 1618a8e1175bSopenharmony_ci int desired_length, 1619a8e1175bSopenharmony_ci int already_hashed, 1620a8e1175bSopenharmony_ci data_t *expected) 1621a8e1175bSopenharmony_ci{ 1622a8e1175bSopenharmony_ci unsigned char dst[100]; 1623a8e1175bSopenharmony_ci 1624a8e1175bSopenharmony_ci unsigned char const *lbl = NULL; 1625a8e1175bSopenharmony_ci size_t lbl_len; 1626a8e1175bSopenharmony_ci#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \ 1627a8e1175bSopenharmony_ci if (label_idx == (int) tls13_label_ ## name) \ 1628a8e1175bSopenharmony_ci { \ 1629a8e1175bSopenharmony_ci lbl = mbedtls_ssl_tls13_labels.name; \ 1630a8e1175bSopenharmony_ci lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \ 1631a8e1175bSopenharmony_ci } 1632a8e1175bSopenharmony_ci MBEDTLS_SSL_TLS1_3_LABEL_LIST 1633a8e1175bSopenharmony_ci#undef MBEDTLS_SSL_TLS1_3_LABEL 1634a8e1175bSopenharmony_ci TEST_ASSERT(lbl != NULL); 1635a8e1175bSopenharmony_ci 1636a8e1175bSopenharmony_ci /* Check sanity of test parameters. */ 1637a8e1175bSopenharmony_ci TEST_ASSERT((size_t) desired_length <= sizeof(dst)); 1638a8e1175bSopenharmony_ci TEST_ASSERT((size_t) desired_length == expected->len); 1639a8e1175bSopenharmony_ci 1640a8e1175bSopenharmony_ci PSA_INIT(); 1641a8e1175bSopenharmony_ci 1642a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_derive_secret( 1643a8e1175bSopenharmony_ci (psa_algorithm_t) hash_alg, 1644a8e1175bSopenharmony_ci secret->x, secret->len, 1645a8e1175bSopenharmony_ci lbl, lbl_len, 1646a8e1175bSopenharmony_ci ctx->x, ctx->len, 1647a8e1175bSopenharmony_ci already_hashed, 1648a8e1175bSopenharmony_ci dst, desired_length) == 0); 1649a8e1175bSopenharmony_ci 1650a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(dst, desired_length, 1651a8e1175bSopenharmony_ci expected->x, desired_length); 1652a8e1175bSopenharmony_ci 1653a8e1175bSopenharmony_ciexit: 1654a8e1175bSopenharmony_ci PSA_DONE(); 1655a8e1175bSopenharmony_ci} 1656a8e1175bSopenharmony_ci/* END_CASE */ 1657a8e1175bSopenharmony_ci 1658a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1659a8e1175bSopenharmony_civoid ssl_tls13_derive_early_secrets(int hash_alg, 1660a8e1175bSopenharmony_ci data_t *secret, 1661a8e1175bSopenharmony_ci data_t *transcript, 1662a8e1175bSopenharmony_ci data_t *traffic_expected, 1663a8e1175bSopenharmony_ci data_t *exporter_expected) 1664a8e1175bSopenharmony_ci{ 1665a8e1175bSopenharmony_ci mbedtls_ssl_tls13_early_secrets secrets; 1666a8e1175bSopenharmony_ci 1667a8e1175bSopenharmony_ci /* Double-check that we've passed sane parameters. */ 1668a8e1175bSopenharmony_ci psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1669a8e1175bSopenharmony_ci size_t const hash_len = PSA_HASH_LENGTH(alg); 1670a8e1175bSopenharmony_ci TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1671a8e1175bSopenharmony_ci secret->len == hash_len && 1672a8e1175bSopenharmony_ci transcript->len == hash_len && 1673a8e1175bSopenharmony_ci traffic_expected->len == hash_len && 1674a8e1175bSopenharmony_ci exporter_expected->len == hash_len); 1675a8e1175bSopenharmony_ci 1676a8e1175bSopenharmony_ci PSA_INIT(); 1677a8e1175bSopenharmony_ci 1678a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_derive_early_secrets( 1679a8e1175bSopenharmony_ci alg, secret->x, transcript->x, transcript->len, 1680a8e1175bSopenharmony_ci &secrets) == 0); 1681a8e1175bSopenharmony_ci 1682a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.client_early_traffic_secret, hash_len, 1683a8e1175bSopenharmony_ci traffic_expected->x, traffic_expected->len); 1684a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.early_exporter_master_secret, hash_len, 1685a8e1175bSopenharmony_ci exporter_expected->x, exporter_expected->len); 1686a8e1175bSopenharmony_ci 1687a8e1175bSopenharmony_ciexit: 1688a8e1175bSopenharmony_ci PSA_DONE(); 1689a8e1175bSopenharmony_ci} 1690a8e1175bSopenharmony_ci/* END_CASE */ 1691a8e1175bSopenharmony_ci 1692a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1693a8e1175bSopenharmony_civoid ssl_tls13_derive_handshake_secrets(int hash_alg, 1694a8e1175bSopenharmony_ci data_t *secret, 1695a8e1175bSopenharmony_ci data_t *transcript, 1696a8e1175bSopenharmony_ci data_t *client_expected, 1697a8e1175bSopenharmony_ci data_t *server_expected) 1698a8e1175bSopenharmony_ci{ 1699a8e1175bSopenharmony_ci mbedtls_ssl_tls13_handshake_secrets secrets; 1700a8e1175bSopenharmony_ci 1701a8e1175bSopenharmony_ci /* Double-check that we've passed sane parameters. */ 1702a8e1175bSopenharmony_ci psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1703a8e1175bSopenharmony_ci size_t const hash_len = PSA_HASH_LENGTH(alg); 1704a8e1175bSopenharmony_ci TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1705a8e1175bSopenharmony_ci secret->len == hash_len && 1706a8e1175bSopenharmony_ci transcript->len == hash_len && 1707a8e1175bSopenharmony_ci client_expected->len == hash_len && 1708a8e1175bSopenharmony_ci server_expected->len == hash_len); 1709a8e1175bSopenharmony_ci 1710a8e1175bSopenharmony_ci PSA_INIT(); 1711a8e1175bSopenharmony_ci 1712a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_derive_handshake_secrets( 1713a8e1175bSopenharmony_ci alg, secret->x, transcript->x, transcript->len, 1714a8e1175bSopenharmony_ci &secrets) == 0); 1715a8e1175bSopenharmony_ci 1716a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.client_handshake_traffic_secret, hash_len, 1717a8e1175bSopenharmony_ci client_expected->x, client_expected->len); 1718a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.server_handshake_traffic_secret, hash_len, 1719a8e1175bSopenharmony_ci server_expected->x, server_expected->len); 1720a8e1175bSopenharmony_ci 1721a8e1175bSopenharmony_ciexit: 1722a8e1175bSopenharmony_ci PSA_DONE(); 1723a8e1175bSopenharmony_ci} 1724a8e1175bSopenharmony_ci/* END_CASE */ 1725a8e1175bSopenharmony_ci 1726a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1727a8e1175bSopenharmony_civoid ssl_tls13_derive_application_secrets(int hash_alg, 1728a8e1175bSopenharmony_ci data_t *secret, 1729a8e1175bSopenharmony_ci data_t *transcript, 1730a8e1175bSopenharmony_ci data_t *client_expected, 1731a8e1175bSopenharmony_ci data_t *server_expected, 1732a8e1175bSopenharmony_ci data_t *exporter_expected) 1733a8e1175bSopenharmony_ci{ 1734a8e1175bSopenharmony_ci mbedtls_ssl_tls13_application_secrets secrets; 1735a8e1175bSopenharmony_ci 1736a8e1175bSopenharmony_ci /* Double-check that we've passed sane parameters. */ 1737a8e1175bSopenharmony_ci psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1738a8e1175bSopenharmony_ci size_t const hash_len = PSA_HASH_LENGTH(alg); 1739a8e1175bSopenharmony_ci TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1740a8e1175bSopenharmony_ci secret->len == hash_len && 1741a8e1175bSopenharmony_ci transcript->len == hash_len && 1742a8e1175bSopenharmony_ci client_expected->len == hash_len && 1743a8e1175bSopenharmony_ci server_expected->len == hash_len && 1744a8e1175bSopenharmony_ci exporter_expected->len == hash_len); 1745a8e1175bSopenharmony_ci 1746a8e1175bSopenharmony_ci PSA_INIT(); 1747a8e1175bSopenharmony_ci 1748a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_derive_application_secrets( 1749a8e1175bSopenharmony_ci alg, secret->x, transcript->x, transcript->len, 1750a8e1175bSopenharmony_ci &secrets) == 0); 1751a8e1175bSopenharmony_ci 1752a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.client_application_traffic_secret_N, hash_len, 1753a8e1175bSopenharmony_ci client_expected->x, client_expected->len); 1754a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.server_application_traffic_secret_N, hash_len, 1755a8e1175bSopenharmony_ci server_expected->x, server_expected->len); 1756a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.exporter_master_secret, hash_len, 1757a8e1175bSopenharmony_ci exporter_expected->x, exporter_expected->len); 1758a8e1175bSopenharmony_ci 1759a8e1175bSopenharmony_ciexit: 1760a8e1175bSopenharmony_ci PSA_DONE(); 1761a8e1175bSopenharmony_ci} 1762a8e1175bSopenharmony_ci/* END_CASE */ 1763a8e1175bSopenharmony_ci 1764a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1765a8e1175bSopenharmony_civoid ssl_tls13_derive_resumption_secrets(int hash_alg, 1766a8e1175bSopenharmony_ci data_t *secret, 1767a8e1175bSopenharmony_ci data_t *transcript, 1768a8e1175bSopenharmony_ci data_t *resumption_expected) 1769a8e1175bSopenharmony_ci{ 1770a8e1175bSopenharmony_ci mbedtls_ssl_tls13_application_secrets secrets; 1771a8e1175bSopenharmony_ci 1772a8e1175bSopenharmony_ci /* Double-check that we've passed sane parameters. */ 1773a8e1175bSopenharmony_ci psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1774a8e1175bSopenharmony_ci size_t const hash_len = PSA_HASH_LENGTH(alg); 1775a8e1175bSopenharmony_ci TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1776a8e1175bSopenharmony_ci secret->len == hash_len && 1777a8e1175bSopenharmony_ci transcript->len == hash_len && 1778a8e1175bSopenharmony_ci resumption_expected->len == hash_len); 1779a8e1175bSopenharmony_ci 1780a8e1175bSopenharmony_ci PSA_INIT(); 1781a8e1175bSopenharmony_ci 1782a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_derive_resumption_master_secret( 1783a8e1175bSopenharmony_ci alg, secret->x, transcript->x, transcript->len, 1784a8e1175bSopenharmony_ci &secrets) == 0); 1785a8e1175bSopenharmony_ci 1786a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secrets.resumption_master_secret, hash_len, 1787a8e1175bSopenharmony_ci resumption_expected->x, resumption_expected->len); 1788a8e1175bSopenharmony_ci 1789a8e1175bSopenharmony_ciexit: 1790a8e1175bSopenharmony_ci PSA_DONE(); 1791a8e1175bSopenharmony_ci} 1792a8e1175bSopenharmony_ci/* END_CASE */ 1793a8e1175bSopenharmony_ci 1794a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1795a8e1175bSopenharmony_civoid ssl_tls13_create_psk_binder(int hash_alg, 1796a8e1175bSopenharmony_ci data_t *psk, 1797a8e1175bSopenharmony_ci int psk_type, 1798a8e1175bSopenharmony_ci data_t *transcript, 1799a8e1175bSopenharmony_ci data_t *binder_expected) 1800a8e1175bSopenharmony_ci{ 1801a8e1175bSopenharmony_ci unsigned char binder[MBEDTLS_MD_MAX_SIZE]; 1802a8e1175bSopenharmony_ci 1803a8e1175bSopenharmony_ci /* Double-check that we've passed sane parameters. */ 1804a8e1175bSopenharmony_ci psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1805a8e1175bSopenharmony_ci size_t const hash_len = PSA_HASH_LENGTH(alg); 1806a8e1175bSopenharmony_ci TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1807a8e1175bSopenharmony_ci transcript->len == hash_len && 1808a8e1175bSopenharmony_ci binder_expected->len == hash_len); 1809a8e1175bSopenharmony_ci 1810a8e1175bSopenharmony_ci PSA_INIT(); 1811a8e1175bSopenharmony_ci 1812a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_create_psk_binder( 1813a8e1175bSopenharmony_ci NULL, /* SSL context for debugging only */ 1814a8e1175bSopenharmony_ci alg, 1815a8e1175bSopenharmony_ci psk->x, psk->len, 1816a8e1175bSopenharmony_ci psk_type, 1817a8e1175bSopenharmony_ci transcript->x, 1818a8e1175bSopenharmony_ci binder) == 0); 1819a8e1175bSopenharmony_ci 1820a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(binder, hash_len, 1821a8e1175bSopenharmony_ci binder_expected->x, binder_expected->len); 1822a8e1175bSopenharmony_ci 1823a8e1175bSopenharmony_ciexit: 1824a8e1175bSopenharmony_ci PSA_DONE(); 1825a8e1175bSopenharmony_ci} 1826a8e1175bSopenharmony_ci/* END_CASE */ 1827a8e1175bSopenharmony_ci 1828a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1829a8e1175bSopenharmony_civoid ssl_tls13_record_protection(int ciphersuite, 1830a8e1175bSopenharmony_ci int endpoint, 1831a8e1175bSopenharmony_ci int ctr, 1832a8e1175bSopenharmony_ci int padding_used, 1833a8e1175bSopenharmony_ci data_t *server_write_key, 1834a8e1175bSopenharmony_ci data_t *server_write_iv, 1835a8e1175bSopenharmony_ci data_t *client_write_key, 1836a8e1175bSopenharmony_ci data_t *client_write_iv, 1837a8e1175bSopenharmony_ci data_t *plaintext, 1838a8e1175bSopenharmony_ci data_t *ciphertext) 1839a8e1175bSopenharmony_ci{ 1840a8e1175bSopenharmony_ci mbedtls_ssl_key_set keys; 1841a8e1175bSopenharmony_ci mbedtls_ssl_transform transform_send; 1842a8e1175bSopenharmony_ci mbedtls_ssl_transform_init(&transform_send); 1843a8e1175bSopenharmony_ci mbedtls_ssl_transform transform_recv; 1844a8e1175bSopenharmony_ci mbedtls_ssl_transform_init(&transform_recv); 1845a8e1175bSopenharmony_ci mbedtls_record rec; 1846a8e1175bSopenharmony_ci unsigned char *buf = NULL; 1847a8e1175bSopenharmony_ci size_t buf_len; 1848a8e1175bSopenharmony_ci int other_endpoint; 1849a8e1175bSopenharmony_ci 1850a8e1175bSopenharmony_ci TEST_ASSERT(endpoint == MBEDTLS_SSL_IS_CLIENT || 1851a8e1175bSopenharmony_ci endpoint == MBEDTLS_SSL_IS_SERVER); 1852a8e1175bSopenharmony_ci 1853a8e1175bSopenharmony_ci if (endpoint == MBEDTLS_SSL_IS_SERVER) { 1854a8e1175bSopenharmony_ci other_endpoint = MBEDTLS_SSL_IS_CLIENT; 1855a8e1175bSopenharmony_ci } 1856a8e1175bSopenharmony_ci if (endpoint == MBEDTLS_SSL_IS_CLIENT) { 1857a8e1175bSopenharmony_ci other_endpoint = MBEDTLS_SSL_IS_SERVER; 1858a8e1175bSopenharmony_ci } 1859a8e1175bSopenharmony_ci 1860a8e1175bSopenharmony_ci TEST_ASSERT(server_write_key->len == client_write_key->len); 1861a8e1175bSopenharmony_ci TEST_ASSERT(server_write_iv->len == client_write_iv->len); 1862a8e1175bSopenharmony_ci 1863a8e1175bSopenharmony_ci memcpy(keys.client_write_key, 1864a8e1175bSopenharmony_ci client_write_key->x, client_write_key->len); 1865a8e1175bSopenharmony_ci memcpy(keys.client_write_iv, 1866a8e1175bSopenharmony_ci client_write_iv->x, client_write_iv->len); 1867a8e1175bSopenharmony_ci memcpy(keys.server_write_key, 1868a8e1175bSopenharmony_ci server_write_key->x, server_write_key->len); 1869a8e1175bSopenharmony_ci memcpy(keys.server_write_iv, 1870a8e1175bSopenharmony_ci server_write_iv->x, server_write_iv->len); 1871a8e1175bSopenharmony_ci 1872a8e1175bSopenharmony_ci keys.key_len = server_write_key->len; 1873a8e1175bSopenharmony_ci keys.iv_len = server_write_iv->len; 1874a8e1175bSopenharmony_ci 1875a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 1876a8e1175bSopenharmony_ci 1877a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_populate_transform( 1878a8e1175bSopenharmony_ci &transform_send, endpoint, 1879a8e1175bSopenharmony_ci ciphersuite, &keys, NULL) == 0); 1880a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_populate_transform( 1881a8e1175bSopenharmony_ci &transform_recv, other_endpoint, 1882a8e1175bSopenharmony_ci ciphersuite, &keys, NULL) == 0); 1883a8e1175bSopenharmony_ci 1884a8e1175bSopenharmony_ci /* Make sure we have enough space in the buffer even if 1885a8e1175bSopenharmony_ci * we use more padding than the KAT. */ 1886a8e1175bSopenharmony_ci buf_len = ciphertext->len + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY; 1887a8e1175bSopenharmony_ci TEST_CALLOC(buf, buf_len); 1888a8e1175bSopenharmony_ci rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA; 1889a8e1175bSopenharmony_ci 1890a8e1175bSopenharmony_ci /* TLS 1.3 uses the version identifier from TLS 1.2 on the wire. */ 1891a8e1175bSopenharmony_ci mbedtls_ssl_write_version(rec.ver, 1892a8e1175bSopenharmony_ci MBEDTLS_SSL_TRANSPORT_STREAM, 1893a8e1175bSopenharmony_ci MBEDTLS_SSL_VERSION_TLS1_2); 1894a8e1175bSopenharmony_ci 1895a8e1175bSopenharmony_ci /* Copy plaintext into record structure */ 1896a8e1175bSopenharmony_ci rec.buf = buf; 1897a8e1175bSopenharmony_ci rec.buf_len = buf_len; 1898a8e1175bSopenharmony_ci rec.data_offset = 0; 1899a8e1175bSopenharmony_ci TEST_ASSERT(plaintext->len <= ciphertext->len); 1900a8e1175bSopenharmony_ci memcpy(rec.buf + rec.data_offset, plaintext->x, plaintext->len); 1901a8e1175bSopenharmony_ci rec.data_len = plaintext->len; 1902a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1903a8e1175bSopenharmony_ci rec.cid_len = 0; 1904a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1905a8e1175bSopenharmony_ci 1906a8e1175bSopenharmony_ci memset(&rec.ctr[0], 0, 8); 1907a8e1175bSopenharmony_ci rec.ctr[7] = ctr; 1908a8e1175bSopenharmony_ci 1909a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_encrypt_buf(NULL, &transform_send, &rec, 1910a8e1175bSopenharmony_ci NULL, NULL) == 0); 1911a8e1175bSopenharmony_ci 1912a8e1175bSopenharmony_ci if (padding_used == MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) { 1913a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len, 1914a8e1175bSopenharmony_ci ciphertext->x, ciphertext->len); 1915a8e1175bSopenharmony_ci } 1916a8e1175bSopenharmony_ci 1917a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_decrypt_buf(NULL, &transform_recv, &rec) == 0); 1918a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len, 1919a8e1175bSopenharmony_ci plaintext->x, plaintext->len); 1920a8e1175bSopenharmony_ci 1921a8e1175bSopenharmony_ciexit: 1922a8e1175bSopenharmony_ci mbedtls_free(buf); 1923a8e1175bSopenharmony_ci mbedtls_ssl_transform_free(&transform_send); 1924a8e1175bSopenharmony_ci mbedtls_ssl_transform_free(&transform_recv); 1925a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 1926a8e1175bSopenharmony_ci} 1927a8e1175bSopenharmony_ci/* END_CASE */ 1928a8e1175bSopenharmony_ci 1929a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1930a8e1175bSopenharmony_civoid ssl_tls13_key_evolution(int hash_alg, 1931a8e1175bSopenharmony_ci data_t *secret, 1932a8e1175bSopenharmony_ci data_t *input, 1933a8e1175bSopenharmony_ci data_t *expected) 1934a8e1175bSopenharmony_ci{ 1935a8e1175bSopenharmony_ci unsigned char secret_new[MBEDTLS_MD_MAX_SIZE]; 1936a8e1175bSopenharmony_ci 1937a8e1175bSopenharmony_ci PSA_INIT(); 1938a8e1175bSopenharmony_ci 1939a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls13_evolve_secret( 1940a8e1175bSopenharmony_ci (psa_algorithm_t) hash_alg, 1941a8e1175bSopenharmony_ci secret->len ? secret->x : NULL, 1942a8e1175bSopenharmony_ci input->len ? input->x : NULL, input->len, 1943a8e1175bSopenharmony_ci secret_new) == 0); 1944a8e1175bSopenharmony_ci 1945a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(secret_new, (size_t) expected->len, 1946a8e1175bSopenharmony_ci expected->x, (size_t) expected->len); 1947a8e1175bSopenharmony_ci 1948a8e1175bSopenharmony_ciexit: 1949a8e1175bSopenharmony_ci PSA_DONE(); 1950a8e1175bSopenharmony_ci} 1951a8e1175bSopenharmony_ci/* END_CASE */ 1952a8e1175bSopenharmony_ci 1953a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2 */ 1954a8e1175bSopenharmony_civoid ssl_tls_prf(int type, data_t *secret, data_t *random, 1955a8e1175bSopenharmony_ci char *label, data_t *result_str, int exp_ret) 1956a8e1175bSopenharmony_ci{ 1957a8e1175bSopenharmony_ci unsigned char *output; 1958a8e1175bSopenharmony_ci 1959a8e1175bSopenharmony_ci output = mbedtls_calloc(1, result_str->len); 1960a8e1175bSopenharmony_ci if (output == NULL) { 1961a8e1175bSopenharmony_ci goto exit; 1962a8e1175bSopenharmony_ci } 1963a8e1175bSopenharmony_ci 1964a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 1965a8e1175bSopenharmony_ci 1966a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len, 1967a8e1175bSopenharmony_ci label, random->x, random->len, 1968a8e1175bSopenharmony_ci output, result_str->len) == exp_ret); 1969a8e1175bSopenharmony_ci 1970a8e1175bSopenharmony_ci if (exp_ret == 0) { 1971a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x, 1972a8e1175bSopenharmony_ci result_str->len, result_str->len) == 0); 1973a8e1175bSopenharmony_ci } 1974a8e1175bSopenharmony_ciexit: 1975a8e1175bSopenharmony_ci 1976a8e1175bSopenharmony_ci mbedtls_free(output); 1977a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 1978a8e1175bSopenharmony_ci} 1979a8e1175bSopenharmony_ci/* END_CASE */ 1980a8e1175bSopenharmony_ci 1981a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1982a8e1175bSopenharmony_civoid ssl_serialize_session_save_load(int ticket_len, char *crt_file, 1983a8e1175bSopenharmony_ci int endpoint_type, int tls_version) 1984a8e1175bSopenharmony_ci{ 1985a8e1175bSopenharmony_ci mbedtls_ssl_session original, restored; 1986a8e1175bSopenharmony_ci unsigned char *buf = NULL; 1987a8e1175bSopenharmony_ci size_t len; 1988a8e1175bSopenharmony_ci 1989a8e1175bSopenharmony_ci /* 1990a8e1175bSopenharmony_ci * Test that a save-load pair is the identity 1991a8e1175bSopenharmony_ci */ 1992a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&original); 1993a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&restored); 1994a8e1175bSopenharmony_ci USE_PSA_INIT(); 1995a8e1175bSopenharmony_ci 1996a8e1175bSopenharmony_ci /* Prepare a dummy session to work on */ 1997a8e1175bSopenharmony_ci ((void) tls_version); 1998a8e1175bSopenharmony_ci ((void) ticket_len); 1999a8e1175bSopenharmony_ci ((void) crt_file); 2000a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2001a8e1175bSopenharmony_ci if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 2002a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2003a8e1175bSopenharmony_ci &original, 0, endpoint_type) == 0); 2004a8e1175bSopenharmony_ci } 2005a8e1175bSopenharmony_ci#endif 2006a8e1175bSopenharmony_ci 2007a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2008a8e1175bSopenharmony_ci if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) { 2009a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2010a8e1175bSopenharmony_ci &original, ticket_len, endpoint_type, crt_file) == 0); 2011a8e1175bSopenharmony_ci } 2012a8e1175bSopenharmony_ci#endif 2013a8e1175bSopenharmony_ci 2014a8e1175bSopenharmony_ci /* Serialize it */ 2015a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len) 2016a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2017a8e1175bSopenharmony_ci TEST_CALLOC(buf, len); 2018a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len) 2019a8e1175bSopenharmony_ci == 0); 2020a8e1175bSopenharmony_ci 2021a8e1175bSopenharmony_ci /* Restore session from serialized data */ 2022a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0); 2023a8e1175bSopenharmony_ci 2024a8e1175bSopenharmony_ci /* 2025a8e1175bSopenharmony_ci * Make sure both session structures are identical 2026a8e1175bSopenharmony_ci */ 2027a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME) 2028a8e1175bSopenharmony_ci if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) { 2029a8e1175bSopenharmony_ci TEST_ASSERT(original.start == restored.start); 2030a8e1175bSopenharmony_ci } 2031a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) 2032a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_creation_time == restored.ticket_creation_time); 2033a8e1175bSopenharmony_ci#endif 2034a8e1175bSopenharmony_ci#endif /* MBEDTLS_HAVE_TIME */ 2035a8e1175bSopenharmony_ci 2036a8e1175bSopenharmony_ci TEST_ASSERT(original.tls_version == restored.tls_version); 2037a8e1175bSopenharmony_ci TEST_ASSERT(original.endpoint == restored.endpoint); 2038a8e1175bSopenharmony_ci TEST_ASSERT(original.ciphersuite == restored.ciphersuite); 2039a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2040a8e1175bSopenharmony_ci if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) { 2041a8e1175bSopenharmony_ci TEST_ASSERT(original.id_len == restored.id_len); 2042a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(original.id, 2043a8e1175bSopenharmony_ci restored.id, sizeof(original.id)) == 0); 2044a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(original.master, 2045a8e1175bSopenharmony_ci restored.master, sizeof(original.master)) == 0); 2046a8e1175bSopenharmony_ci 2047a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) 2048a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) 2049a8e1175bSopenharmony_ci TEST_ASSERT((original.peer_cert == NULL) == 2050a8e1175bSopenharmony_ci (restored.peer_cert == NULL)); 2051a8e1175bSopenharmony_ci if (original.peer_cert != NULL) { 2052a8e1175bSopenharmony_ci TEST_ASSERT(original.peer_cert->raw.len == 2053a8e1175bSopenharmony_ci restored.peer_cert->raw.len); 2054a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(original.peer_cert->raw.p, 2055a8e1175bSopenharmony_ci restored.peer_cert->raw.p, 2056a8e1175bSopenharmony_ci original.peer_cert->raw.len) == 0); 2057a8e1175bSopenharmony_ci } 2058a8e1175bSopenharmony_ci#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ 2059a8e1175bSopenharmony_ci TEST_ASSERT(original.peer_cert_digest_type == 2060a8e1175bSopenharmony_ci restored.peer_cert_digest_type); 2061a8e1175bSopenharmony_ci TEST_ASSERT(original.peer_cert_digest_len == 2062a8e1175bSopenharmony_ci restored.peer_cert_digest_len); 2063a8e1175bSopenharmony_ci TEST_ASSERT((original.peer_cert_digest == NULL) == 2064a8e1175bSopenharmony_ci (restored.peer_cert_digest == NULL)); 2065a8e1175bSopenharmony_ci if (original.peer_cert_digest != NULL) { 2066a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(original.peer_cert_digest, 2067a8e1175bSopenharmony_ci restored.peer_cert_digest, 2068a8e1175bSopenharmony_ci original.peer_cert_digest_len) == 0); 2069a8e1175bSopenharmony_ci } 2070a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ 2071a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ 2072a8e1175bSopenharmony_ci TEST_ASSERT(original.verify_result == restored.verify_result); 2073a8e1175bSopenharmony_ci 2074a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 2075a8e1175bSopenharmony_ci TEST_ASSERT(original.mfl_code == restored.mfl_code); 2076a8e1175bSopenharmony_ci#endif 2077a8e1175bSopenharmony_ci 2078a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 2079a8e1175bSopenharmony_ci TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac); 2080a8e1175bSopenharmony_ci#endif 2081a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) 2082a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_len == restored.ticket_len); 2083a8e1175bSopenharmony_ci if (original.ticket_len != 0) { 2084a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket != NULL); 2085a8e1175bSopenharmony_ci TEST_ASSERT(restored.ticket != NULL); 2086a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(original.ticket, 2087a8e1175bSopenharmony_ci restored.ticket, original.ticket_len) == 0); 2088a8e1175bSopenharmony_ci } 2089a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime); 2090a8e1175bSopenharmony_ci#endif 2091a8e1175bSopenharmony_ci } 2092a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 2093a8e1175bSopenharmony_ci 2094a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2095a8e1175bSopenharmony_ci if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 2096a8e1175bSopenharmony_ci TEST_ASSERT(original.ciphersuite == restored.ciphersuite); 2097a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_age_add == restored.ticket_age_add); 2098a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_flags == restored.ticket_flags); 2099a8e1175bSopenharmony_ci TEST_ASSERT(original.resumption_key_len == restored.resumption_key_len); 2100a8e1175bSopenharmony_ci if (original.resumption_key_len != 0) { 2101a8e1175bSopenharmony_ci TEST_ASSERT(original.resumption_key != NULL); 2102a8e1175bSopenharmony_ci TEST_ASSERT(restored.resumption_key != NULL); 2103a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(original.resumption_key, 2104a8e1175bSopenharmony_ci restored.resumption_key, 2105a8e1175bSopenharmony_ci original.resumption_key_len) == 0); 2106a8e1175bSopenharmony_ci } 2107a8e1175bSopenharmony_ci 2108a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_EARLY_DATA) 2109a8e1175bSopenharmony_ci TEST_ASSERT( 2110a8e1175bSopenharmony_ci original.max_early_data_size == restored.max_early_data_size); 2111a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) && defined(MBEDTLS_SSL_SRV_C) 2112a8e1175bSopenharmony_ci if (endpoint_type == MBEDTLS_SSL_IS_SERVER) { 2113a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_alpn != NULL); 2114a8e1175bSopenharmony_ci TEST_ASSERT(restored.ticket_alpn != NULL); 2115a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(original.ticket_alpn, strlen(original.ticket_alpn), 2116a8e1175bSopenharmony_ci restored.ticket_alpn, strlen(restored.ticket_alpn)); 2117a8e1175bSopenharmony_ci } 2118a8e1175bSopenharmony_ci#endif 2119a8e1175bSopenharmony_ci#endif 2120a8e1175bSopenharmony_ci 2121a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) 2122a8e1175bSopenharmony_ci if (endpoint_type == MBEDTLS_SSL_IS_CLIENT) { 2123a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME) 2124a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_reception_time == restored.ticket_reception_time); 2125a8e1175bSopenharmony_ci#endif 2126a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime); 2127a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket_len == restored.ticket_len); 2128a8e1175bSopenharmony_ci if (original.ticket_len != 0) { 2129a8e1175bSopenharmony_ci TEST_ASSERT(original.ticket != NULL); 2130a8e1175bSopenharmony_ci TEST_ASSERT(restored.ticket != NULL); 2131a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(original.ticket, 2132a8e1175bSopenharmony_ci restored.ticket, 2133a8e1175bSopenharmony_ci original.ticket_len) == 0); 2134a8e1175bSopenharmony_ci } 2135a8e1175bSopenharmony_ci 2136a8e1175bSopenharmony_ci } 2137a8e1175bSopenharmony_ci#endif 2138a8e1175bSopenharmony_ci } 2139a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 2140a8e1175bSopenharmony_ci 2141a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT) 2142a8e1175bSopenharmony_ci TEST_ASSERT(original.record_size_limit == restored.record_size_limit); 2143a8e1175bSopenharmony_ci#endif 2144a8e1175bSopenharmony_ci 2145a8e1175bSopenharmony_ciexit: 2146a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&original); 2147a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&restored); 2148a8e1175bSopenharmony_ci mbedtls_free(buf); 2149a8e1175bSopenharmony_ci USE_PSA_DONE(); 2150a8e1175bSopenharmony_ci} 2151a8e1175bSopenharmony_ci/* END_CASE */ 2152a8e1175bSopenharmony_ci 2153a8e1175bSopenharmony_ci/* BEGIN_CASE */ 2154a8e1175bSopenharmony_civoid ssl_serialize_session_load_save(int ticket_len, char *crt_file, 2155a8e1175bSopenharmony_ci int endpoint_type, int tls_version) 2156a8e1175bSopenharmony_ci{ 2157a8e1175bSopenharmony_ci mbedtls_ssl_session session; 2158a8e1175bSopenharmony_ci unsigned char *buf1 = NULL, *buf2 = NULL; 2159a8e1175bSopenharmony_ci size_t len0, len1, len2; 2160a8e1175bSopenharmony_ci 2161a8e1175bSopenharmony_ci /* 2162a8e1175bSopenharmony_ci * Test that a load-save pair is the identity 2163a8e1175bSopenharmony_ci */ 2164a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&session); 2165a8e1175bSopenharmony_ci USE_PSA_INIT(); 2166a8e1175bSopenharmony_ci 2167a8e1175bSopenharmony_ci /* Prepare a dummy session to work on */ 2168a8e1175bSopenharmony_ci ((void) ticket_len); 2169a8e1175bSopenharmony_ci ((void) crt_file); 2170a8e1175bSopenharmony_ci 2171a8e1175bSopenharmony_ci switch (tls_version) { 2172a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2173a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_3: 2174a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2175a8e1175bSopenharmony_ci &session, 0, endpoint_type) == 0); 2176a8e1175bSopenharmony_ci break; 2177a8e1175bSopenharmony_ci#endif 2178a8e1175bSopenharmony_ci 2179a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2180a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_2: 2181a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2182a8e1175bSopenharmony_ci &session, ticket_len, endpoint_type, crt_file) == 0); 2183a8e1175bSopenharmony_ci break; 2184a8e1175bSopenharmony_ci#endif 2185a8e1175bSopenharmony_ci default: 2186a8e1175bSopenharmony_ci /* should never happen */ 2187a8e1175bSopenharmony_ci TEST_ASSERT(0); 2188a8e1175bSopenharmony_ci break; 2189a8e1175bSopenharmony_ci } 2190a8e1175bSopenharmony_ci 2191a8e1175bSopenharmony_ci /* Get desired buffer size for serializing */ 2192a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0) 2193a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2194a8e1175bSopenharmony_ci 2195a8e1175bSopenharmony_ci /* Allocate first buffer */ 2196a8e1175bSopenharmony_ci buf1 = mbedtls_calloc(1, len0); 2197a8e1175bSopenharmony_ci TEST_ASSERT(buf1 != NULL); 2198a8e1175bSopenharmony_ci 2199a8e1175bSopenharmony_ci /* Serialize to buffer and free live session */ 2200a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1) 2201a8e1175bSopenharmony_ci == 0); 2202a8e1175bSopenharmony_ci TEST_ASSERT(len0 == len1); 2203a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2204a8e1175bSopenharmony_ci 2205a8e1175bSopenharmony_ci /* Restore session from serialized data */ 2206a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0); 2207a8e1175bSopenharmony_ci 2208a8e1175bSopenharmony_ci /* Allocate second buffer and serialize to it */ 2209a8e1175bSopenharmony_ci buf2 = mbedtls_calloc(1, len0); 2210a8e1175bSopenharmony_ci TEST_ASSERT(buf2 != NULL); 2211a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2) 2212a8e1175bSopenharmony_ci == 0); 2213a8e1175bSopenharmony_ci 2214a8e1175bSopenharmony_ci /* Make sure both serialized versions are identical */ 2215a8e1175bSopenharmony_ci TEST_ASSERT(len1 == len2); 2216a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(buf1, buf2, len1) == 0); 2217a8e1175bSopenharmony_ci 2218a8e1175bSopenharmony_ciexit: 2219a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2220a8e1175bSopenharmony_ci mbedtls_free(buf1); 2221a8e1175bSopenharmony_ci mbedtls_free(buf2); 2222a8e1175bSopenharmony_ci USE_PSA_DONE(); 2223a8e1175bSopenharmony_ci} 2224a8e1175bSopenharmony_ci/* END_CASE */ 2225a8e1175bSopenharmony_ci 2226a8e1175bSopenharmony_ci/* BEGIN_CASE */ 2227a8e1175bSopenharmony_civoid ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file, 2228a8e1175bSopenharmony_ci int endpoint_type, int tls_version) 2229a8e1175bSopenharmony_ci{ 2230a8e1175bSopenharmony_ci mbedtls_ssl_session session; 2231a8e1175bSopenharmony_ci unsigned char *buf = NULL; 2232a8e1175bSopenharmony_ci size_t good_len, bad_len, test_len; 2233a8e1175bSopenharmony_ci 2234a8e1175bSopenharmony_ci /* 2235a8e1175bSopenharmony_ci * Test that session_save() fails cleanly on small buffers 2236a8e1175bSopenharmony_ci */ 2237a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&session); 2238a8e1175bSopenharmony_ci USE_PSA_INIT(); 2239a8e1175bSopenharmony_ci 2240a8e1175bSopenharmony_ci /* Prepare dummy session and get serialized size */ 2241a8e1175bSopenharmony_ci ((void) ticket_len); 2242a8e1175bSopenharmony_ci ((void) crt_file); 2243a8e1175bSopenharmony_ci 2244a8e1175bSopenharmony_ci switch (tls_version) { 2245a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2246a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_3: 2247a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2248a8e1175bSopenharmony_ci &session, 0, endpoint_type) == 0); 2249a8e1175bSopenharmony_ci break; 2250a8e1175bSopenharmony_ci#endif 2251a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2252a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_2: 2253a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2254a8e1175bSopenharmony_ci &session, ticket_len, endpoint_type, crt_file) == 0); 2255a8e1175bSopenharmony_ci break; 2256a8e1175bSopenharmony_ci#endif 2257a8e1175bSopenharmony_ci default: 2258a8e1175bSopenharmony_ci /* should never happen */ 2259a8e1175bSopenharmony_ci TEST_ASSERT(0); 2260a8e1175bSopenharmony_ci break; 2261a8e1175bSopenharmony_ci } 2262a8e1175bSopenharmony_ci 2263a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len) 2264a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2265a8e1175bSopenharmony_ci 2266a8e1175bSopenharmony_ci /* Try all possible bad lengths */ 2267a8e1175bSopenharmony_ci for (bad_len = 1; bad_len < good_len; bad_len++) { 2268a8e1175bSopenharmony_ci /* Allocate exact size so that asan/valgrind can detect any overwrite */ 2269a8e1175bSopenharmony_ci mbedtls_free(buf); 2270a8e1175bSopenharmony_ci buf = NULL; 2271a8e1175bSopenharmony_ci TEST_CALLOC(buf, bad_len); 2272a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len, 2273a8e1175bSopenharmony_ci &test_len) 2274a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2275a8e1175bSopenharmony_ci TEST_ASSERT(test_len == good_len); 2276a8e1175bSopenharmony_ci } 2277a8e1175bSopenharmony_ci 2278a8e1175bSopenharmony_ciexit: 2279a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2280a8e1175bSopenharmony_ci mbedtls_free(buf); 2281a8e1175bSopenharmony_ci USE_PSA_DONE(); 2282a8e1175bSopenharmony_ci} 2283a8e1175bSopenharmony_ci/* END_CASE */ 2284a8e1175bSopenharmony_ci 2285a8e1175bSopenharmony_ci/* BEGIN_CASE */ 2286a8e1175bSopenharmony_civoid ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file, 2287a8e1175bSopenharmony_ci int endpoint_type, int tls_version) 2288a8e1175bSopenharmony_ci{ 2289a8e1175bSopenharmony_ci mbedtls_ssl_session session; 2290a8e1175bSopenharmony_ci unsigned char *good_buf = NULL, *bad_buf = NULL; 2291a8e1175bSopenharmony_ci size_t good_len, bad_len; 2292a8e1175bSopenharmony_ci 2293a8e1175bSopenharmony_ci /* 2294a8e1175bSopenharmony_ci * Test that session_load() fails cleanly on small buffers 2295a8e1175bSopenharmony_ci */ 2296a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&session); 2297a8e1175bSopenharmony_ci USE_PSA_INIT(); 2298a8e1175bSopenharmony_ci 2299a8e1175bSopenharmony_ci /* Prepare serialized session data */ 2300a8e1175bSopenharmony_ci ((void) ticket_len); 2301a8e1175bSopenharmony_ci ((void) crt_file); 2302a8e1175bSopenharmony_ci 2303a8e1175bSopenharmony_ci switch (tls_version) { 2304a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2305a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_3: 2306a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2307a8e1175bSopenharmony_ci &session, 0, endpoint_type) == 0); 2308a8e1175bSopenharmony_ci break; 2309a8e1175bSopenharmony_ci#endif 2310a8e1175bSopenharmony_ci 2311a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2312a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_2: 2313a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2314a8e1175bSopenharmony_ci &session, ticket_len, endpoint_type, crt_file) == 0); 2315a8e1175bSopenharmony_ci break; 2316a8e1175bSopenharmony_ci#endif 2317a8e1175bSopenharmony_ci 2318a8e1175bSopenharmony_ci default: 2319a8e1175bSopenharmony_ci /* should never happen */ 2320a8e1175bSopenharmony_ci TEST_ASSERT(0); 2321a8e1175bSopenharmony_ci break; 2322a8e1175bSopenharmony_ci } 2323a8e1175bSopenharmony_ci 2324a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len) 2325a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2326a8e1175bSopenharmony_ci TEST_CALLOC(good_buf, good_len); 2327a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len, 2328a8e1175bSopenharmony_ci &good_len) == 0); 2329a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2330a8e1175bSopenharmony_ci 2331a8e1175bSopenharmony_ci /* Try all possible bad lengths */ 2332a8e1175bSopenharmony_ci for (bad_len = 0; bad_len < good_len; bad_len++) { 2333a8e1175bSopenharmony_ci /* Allocate exact size so that asan/valgrind can detect any overread */ 2334a8e1175bSopenharmony_ci mbedtls_free(bad_buf); 2335a8e1175bSopenharmony_ci bad_buf = NULL; 2336a8e1175bSopenharmony_ci TEST_CALLOC_NONNULL(bad_buf, bad_len); 2337a8e1175bSopenharmony_ci memcpy(bad_buf, good_buf, bad_len); 2338a8e1175bSopenharmony_ci 2339a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len) 2340a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 2341a8e1175bSopenharmony_ci } 2342a8e1175bSopenharmony_ci 2343a8e1175bSopenharmony_ciexit: 2344a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2345a8e1175bSopenharmony_ci mbedtls_free(good_buf); 2346a8e1175bSopenharmony_ci mbedtls_free(bad_buf); 2347a8e1175bSopenharmony_ci USE_PSA_DONE(); 2348a8e1175bSopenharmony_ci} 2349a8e1175bSopenharmony_ci/* END_CASE */ 2350a8e1175bSopenharmony_ci 2351a8e1175bSopenharmony_ci/* BEGIN_CASE */ 2352a8e1175bSopenharmony_civoid ssl_session_serialize_version_check(int corrupt_major, 2353a8e1175bSopenharmony_ci int corrupt_minor, 2354a8e1175bSopenharmony_ci int corrupt_patch, 2355a8e1175bSopenharmony_ci int corrupt_config, 2356a8e1175bSopenharmony_ci int endpoint_type, 2357a8e1175bSopenharmony_ci int tls_version) 2358a8e1175bSopenharmony_ci{ 2359a8e1175bSopenharmony_ci unsigned char serialized_session[2048]; 2360a8e1175bSopenharmony_ci size_t serialized_session_len; 2361a8e1175bSopenharmony_ci unsigned cur_byte; 2362a8e1175bSopenharmony_ci mbedtls_ssl_session session; 2363a8e1175bSopenharmony_ci uint8_t should_corrupt_byte[] = { corrupt_major == 1, 2364a8e1175bSopenharmony_ci corrupt_minor == 1, 2365a8e1175bSopenharmony_ci corrupt_patch == 1, 2366a8e1175bSopenharmony_ci corrupt_config == 1, 2367a8e1175bSopenharmony_ci corrupt_config == 1 }; 2368a8e1175bSopenharmony_ci 2369a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&session); 2370a8e1175bSopenharmony_ci USE_PSA_INIT(); 2371a8e1175bSopenharmony_ci 2372a8e1175bSopenharmony_ci switch (tls_version) { 2373a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2374a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_3: 2375a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2376a8e1175bSopenharmony_ci &session, 0, endpoint_type) == 0); 2377a8e1175bSopenharmony_ci break; 2378a8e1175bSopenharmony_ci#endif 2379a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2380a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_2: 2381a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2382a8e1175bSopenharmony_ci &session, 0, endpoint_type, NULL) == 0); 2383a8e1175bSopenharmony_ci 2384a8e1175bSopenharmony_ci break; 2385a8e1175bSopenharmony_ci#endif 2386a8e1175bSopenharmony_ci default: 2387a8e1175bSopenharmony_ci /* should never happen */ 2388a8e1175bSopenharmony_ci TEST_ASSERT(0); 2389a8e1175bSopenharmony_ci break; 2390a8e1175bSopenharmony_ci } 2391a8e1175bSopenharmony_ci 2392a8e1175bSopenharmony_ci /* Infer length of serialized session. */ 2393a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_save(&session, 2394a8e1175bSopenharmony_ci serialized_session, 2395a8e1175bSopenharmony_ci sizeof(serialized_session), 2396a8e1175bSopenharmony_ci &serialized_session_len) == 0); 2397a8e1175bSopenharmony_ci 2398a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2399a8e1175bSopenharmony_ci 2400a8e1175bSopenharmony_ci /* Without any modification, we should be able to successfully 2401a8e1175bSopenharmony_ci * de-serialize the session - double-check that. */ 2402a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_load(&session, 2403a8e1175bSopenharmony_ci serialized_session, 2404a8e1175bSopenharmony_ci serialized_session_len) == 0); 2405a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2406a8e1175bSopenharmony_ci 2407a8e1175bSopenharmony_ci /* Go through the bytes in the serialized session header and 2408a8e1175bSopenharmony_ci * corrupt them bit-by-bit. */ 2409a8e1175bSopenharmony_ci for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) { 2410a8e1175bSopenharmony_ci int cur_bit; 2411a8e1175bSopenharmony_ci unsigned char *const byte = &serialized_session[cur_byte]; 2412a8e1175bSopenharmony_ci 2413a8e1175bSopenharmony_ci if (should_corrupt_byte[cur_byte] == 0) { 2414a8e1175bSopenharmony_ci continue; 2415a8e1175bSopenharmony_ci } 2416a8e1175bSopenharmony_ci 2417a8e1175bSopenharmony_ci for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) { 2418a8e1175bSopenharmony_ci unsigned char const corrupted_bit = 0x1u << cur_bit; 2419a8e1175bSopenharmony_ci /* Modify a single bit in the serialized session. */ 2420a8e1175bSopenharmony_ci *byte ^= corrupted_bit; 2421a8e1175bSopenharmony_ci 2422a8e1175bSopenharmony_ci /* Attempt to deserialize */ 2423a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_load(&session, 2424a8e1175bSopenharmony_ci serialized_session, 2425a8e1175bSopenharmony_ci serialized_session_len) == 2426a8e1175bSopenharmony_ci MBEDTLS_ERR_SSL_VERSION_MISMATCH); 2427a8e1175bSopenharmony_ci 2428a8e1175bSopenharmony_ci /* Undo the change */ 2429a8e1175bSopenharmony_ci *byte ^= corrupted_bit; 2430a8e1175bSopenharmony_ci } 2431a8e1175bSopenharmony_ci } 2432a8e1175bSopenharmony_ciexit: 2433a8e1175bSopenharmony_ci USE_PSA_DONE(); 2434a8e1175bSopenharmony_ci} 2435a8e1175bSopenharmony_ci/* END_CASE */ 2436a8e1175bSopenharmony_ci 2437a8e1175bSopenharmony_ci/* BEGIN_CASE */ 2438a8e1175bSopenharmony_civoid ssl_session_id_accessors_check(int tls_version) 2439a8e1175bSopenharmony_ci{ 2440a8e1175bSopenharmony_ci mbedtls_ssl_session session; 2441a8e1175bSopenharmony_ci int ciphersuite_id; 2442a8e1175bSopenharmony_ci const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 2443a8e1175bSopenharmony_ci 2444a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&session); 2445a8e1175bSopenharmony_ci USE_PSA_INIT(); 2446a8e1175bSopenharmony_ci 2447a8e1175bSopenharmony_ci switch (tls_version) { 2448a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2449a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_3: 2450a8e1175bSopenharmony_ci ciphersuite_id = MBEDTLS_TLS1_3_AES_128_GCM_SHA256; 2451a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2452a8e1175bSopenharmony_ci &session, 0, MBEDTLS_SSL_IS_SERVER) == 0); 2453a8e1175bSopenharmony_ci break; 2454a8e1175bSopenharmony_ci#endif 2455a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2456a8e1175bSopenharmony_ci case MBEDTLS_SSL_VERSION_TLS1_2: 2457a8e1175bSopenharmony_ci ciphersuite_id = MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256; 2458a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2459a8e1175bSopenharmony_ci &session, 0, MBEDTLS_SSL_IS_SERVER, NULL) == 0); 2460a8e1175bSopenharmony_ci 2461a8e1175bSopenharmony_ci break; 2462a8e1175bSopenharmony_ci#endif 2463a8e1175bSopenharmony_ci default: 2464a8e1175bSopenharmony_ci /* should never happen */ 2465a8e1175bSopenharmony_ci TEST_ASSERT(0); 2466a8e1175bSopenharmony_ci break; 2467a8e1175bSopenharmony_ci } 2468a8e1175bSopenharmony_ci TEST_ASSERT(*mbedtls_ssl_session_get_id(&session) == session.id); 2469a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_get_id_len(&session) == session.id_len); 2470a8e1175bSopenharmony_ci /* mbedtls_test_ssl_tls1x_populate_session sets a mock suite-id of 0xabcd */ 2471a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_session_get_ciphersuite_id(&session) == 0xabcd); 2472a8e1175bSopenharmony_ci 2473a8e1175bSopenharmony_ci /* Test setting a reference id for tls1.3 and tls1.2 */ 2474a8e1175bSopenharmony_ci ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite_id); 2475a8e1175bSopenharmony_ci if (ciphersuite_info != NULL) { 2476a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_ciphersuite_get_id(ciphersuite_info) == ciphersuite_id); 2477a8e1175bSopenharmony_ci } 2478a8e1175bSopenharmony_ci 2479a8e1175bSopenharmony_ciexit: 2480a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&session); 2481a8e1175bSopenharmony_ci USE_PSA_DONE(); 2482a8e1175bSopenharmony_ci} 2483a8e1175bSopenharmony_ci/* END_CASE */ 2484a8e1175bSopenharmony_ci 2485a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_MD_CAN_SHA256 */ 2486a8e1175bSopenharmony_civoid mbedtls_endpoint_sanity(int endpoint_type) 2487a8e1175bSopenharmony_ci{ 2488a8e1175bSopenharmony_ci enum { BUFFSIZE = 1024 }; 2489a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint ep; 2490a8e1175bSopenharmony_ci int ret = -1; 2491a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2492a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2493a8e1175bSopenharmony_ci options.pk_alg = MBEDTLS_PK_RSA; 2494a8e1175bSopenharmony_ci 2495a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 2496a8e1175bSopenharmony_ci 2497a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, &options, 2498a8e1175bSopenharmony_ci NULL, NULL, NULL); 2499a8e1175bSopenharmony_ci TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret); 2500a8e1175bSopenharmony_ci 2501a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, options.pk_alg, 2502a8e1175bSopenharmony_ci 0, 0, 0); 2503a8e1175bSopenharmony_ci TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret); 2504a8e1175bSopenharmony_ci 2505a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, &options, 2506a8e1175bSopenharmony_ci NULL, NULL, NULL); 2507a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 2508a8e1175bSopenharmony_ci 2509a8e1175bSopenharmony_ciexit: 2510a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&ep, NULL); 2511a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2512a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 2513a8e1175bSopenharmony_ci} 2514a8e1175bSopenharmony_ci/* END_CASE */ 2515a8e1175bSopenharmony_ci 2516a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PKCS1_V15:MBEDTLS_MD_CAN_SHA256:MBEDTLS_PK_HAVE_ECC_KEYS */ 2517a8e1175bSopenharmony_civoid move_handshake_to_state(int endpoint_type, int tls_version, int state, int need_pass) 2518a8e1175bSopenharmony_ci{ 2519a8e1175bSopenharmony_ci enum { BUFFSIZE = 1024 }; 2520a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint base_ep, second_ep; 2521a8e1175bSopenharmony_ci int ret = -1; 2522a8e1175bSopenharmony_ci (void) tls_version; 2523a8e1175bSopenharmony_ci 2524a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2525a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2526a8e1175bSopenharmony_ci 2527a8e1175bSopenharmony_ci options.pk_alg = MBEDTLS_PK_RSA; 2528a8e1175bSopenharmony_ci 2529a8e1175bSopenharmony_ci /* 2530a8e1175bSopenharmony_ci * If both TLS 1.2 and 1.3 are enabled and we want to do a TLS 1.2 2531a8e1175bSopenharmony_ci * handshake, force the TLS 1.2 version on endpoint under test. 2532a8e1175bSopenharmony_ci */ 2533a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_PROTO_TLS1_2) 2534a8e1175bSopenharmony_ci if (MBEDTLS_SSL_VERSION_TLS1_2 == tls_version) { 2535a8e1175bSopenharmony_ci if (MBEDTLS_SSL_IS_CLIENT == endpoint_type) { 2536a8e1175bSopenharmony_ci options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2537a8e1175bSopenharmony_ci options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2538a8e1175bSopenharmony_ci } else { 2539a8e1175bSopenharmony_ci options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2540a8e1175bSopenharmony_ci options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2541a8e1175bSopenharmony_ci } 2542a8e1175bSopenharmony_ci } 2543a8e1175bSopenharmony_ci#endif 2544a8e1175bSopenharmony_ci 2545a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 2546a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&base_ep, sizeof(base_ep)); 2547a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&second_ep, sizeof(second_ep)); 2548a8e1175bSopenharmony_ci 2549a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type, &options, 2550a8e1175bSopenharmony_ci NULL, NULL, NULL); 2551a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 2552a8e1175bSopenharmony_ci 2553a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init( 2554a8e1175bSopenharmony_ci &second_ep, 2555a8e1175bSopenharmony_ci (endpoint_type == MBEDTLS_SSL_IS_SERVER) ? 2556a8e1175bSopenharmony_ci MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER, 2557a8e1175bSopenharmony_ci &options, NULL, NULL, NULL); 2558a8e1175bSopenharmony_ci 2559a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 2560a8e1175bSopenharmony_ci 2561a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(base_ep.socket), 2562a8e1175bSopenharmony_ci &(second_ep.socket), 2563a8e1175bSopenharmony_ci BUFFSIZE); 2564a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 2565a8e1175bSopenharmony_ci 2566a8e1175bSopenharmony_ci ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl), 2567a8e1175bSopenharmony_ci &(second_ep.ssl), 2568a8e1175bSopenharmony_ci state); 2569a8e1175bSopenharmony_ci if (need_pass) { 2570a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0 || 2571a8e1175bSopenharmony_ci ret == MBEDTLS_ERR_SSL_WANT_READ || 2572a8e1175bSopenharmony_ci ret == MBEDTLS_ERR_SSL_WANT_WRITE); 2573a8e1175bSopenharmony_ci TEST_ASSERT(base_ep.ssl.state == state); 2574a8e1175bSopenharmony_ci } else { 2575a8e1175bSopenharmony_ci TEST_ASSERT(ret != 0 && 2576a8e1175bSopenharmony_ci ret != MBEDTLS_ERR_SSL_WANT_READ && 2577a8e1175bSopenharmony_ci ret != MBEDTLS_ERR_SSL_WANT_WRITE); 2578a8e1175bSopenharmony_ci TEST_ASSERT(base_ep.ssl.state != state); 2579a8e1175bSopenharmony_ci } 2580a8e1175bSopenharmony_ci 2581a8e1175bSopenharmony_ciexit: 2582a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2583a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&base_ep, NULL); 2584a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&second_ep, NULL); 2585a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 2586a8e1175bSopenharmony_ci} 2587a8e1175bSopenharmony_ci/* END_CASE */ 2588a8e1175bSopenharmony_ci 2589a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_MD_CAN_SHA256:MBEDTLS_PK_HAVE_ECC_KEYS:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */ 2590a8e1175bSopenharmony_civoid handshake_version(int dtls, int client_min_version, int client_max_version, 2591a8e1175bSopenharmony_ci int server_min_version, int server_max_version, 2592a8e1175bSopenharmony_ci int expected_negotiated_version) 2593a8e1175bSopenharmony_ci{ 2594a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2595a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2596a8e1175bSopenharmony_ci 2597a8e1175bSopenharmony_ci options.client_min_version = client_min_version; 2598a8e1175bSopenharmony_ci options.client_max_version = client_max_version; 2599a8e1175bSopenharmony_ci options.server_min_version = server_min_version; 2600a8e1175bSopenharmony_ci options.server_max_version = server_max_version; 2601a8e1175bSopenharmony_ci options.expected_negotiated_version = expected_negotiated_version; 2602a8e1175bSopenharmony_ci 2603a8e1175bSopenharmony_ci options.dtls = dtls; 2604a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2605a8e1175bSopenharmony_ci 2606a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2607a8e1175bSopenharmony_ci goto exit; 2608a8e1175bSopenharmony_ci 2609a8e1175bSopenharmony_ciexit: 2610a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2611a8e1175bSopenharmony_ci} 2612a8e1175bSopenharmony_ci/* END_CASE */ 2613a8e1175bSopenharmony_ci 2614a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */ 2615a8e1175bSopenharmony_civoid handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls) 2616a8e1175bSopenharmony_ci{ 2617a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2618a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2619a8e1175bSopenharmony_ci 2620a8e1175bSopenharmony_ci options.cipher = cipher; 2621a8e1175bSopenharmony_ci options.dtls = dtls; 2622a8e1175bSopenharmony_ci options.psk_str = psk_str; 2623a8e1175bSopenharmony_ci options.pk_alg = pk_alg; 2624a8e1175bSopenharmony_ci 2625a8e1175bSopenharmony_ci options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2626a8e1175bSopenharmony_ci options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2627a8e1175bSopenharmony_ci options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2628a8e1175bSopenharmony_ci 2629a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2630a8e1175bSopenharmony_ci 2631a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2632a8e1175bSopenharmony_ci goto exit; 2633a8e1175bSopenharmony_ci 2634a8e1175bSopenharmony_ciexit: 2635a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2636a8e1175bSopenharmony_ci} 2637a8e1175bSopenharmony_ci/* END_CASE */ 2638a8e1175bSopenharmony_ci 2639a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */ 2640a8e1175bSopenharmony_civoid handshake_cipher(char *cipher, int pk_alg, int dtls) 2641a8e1175bSopenharmony_ci{ 2642a8e1175bSopenharmony_ci test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls); 2643a8e1175bSopenharmony_ci 2644a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2645a8e1175bSopenharmony_ci goto exit; 2646a8e1175bSopenharmony_ci} 2647a8e1175bSopenharmony_ci/* END_CASE */ 2648a8e1175bSopenharmony_ci 2649a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */ 2650a8e1175bSopenharmony_civoid handshake_ciphersuite_select(char *cipher, int pk_alg, data_t *psk_str, 2651a8e1175bSopenharmony_ci int psa_alg, int psa_alg2, int psa_usage, 2652a8e1175bSopenharmony_ci int expected_handshake_result, 2653a8e1175bSopenharmony_ci int expected_ciphersuite) 2654a8e1175bSopenharmony_ci{ 2655a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2656a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2657a8e1175bSopenharmony_ci 2658a8e1175bSopenharmony_ci options.cipher = cipher; 2659a8e1175bSopenharmony_ci options.psk_str = psk_str; 2660a8e1175bSopenharmony_ci options.pk_alg = pk_alg; 2661a8e1175bSopenharmony_ci options.opaque_alg = psa_alg; 2662a8e1175bSopenharmony_ci options.opaque_alg2 = psa_alg2; 2663a8e1175bSopenharmony_ci options.opaque_usage = psa_usage; 2664a8e1175bSopenharmony_ci options.expected_handshake_result = expected_handshake_result; 2665a8e1175bSopenharmony_ci options.expected_ciphersuite = expected_ciphersuite; 2666a8e1175bSopenharmony_ci 2667a8e1175bSopenharmony_ci options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2668a8e1175bSopenharmony_ci options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2669a8e1175bSopenharmony_ci options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2670a8e1175bSopenharmony_ci 2671a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2672a8e1175bSopenharmony_ci 2673a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2674a8e1175bSopenharmony_ci goto exit; 2675a8e1175bSopenharmony_ci 2676a8e1175bSopenharmony_ciexit: 2677a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2678a8e1175bSopenharmony_ci} 2679a8e1175bSopenharmony_ci/* END_CASE */ 2680a8e1175bSopenharmony_ci 2681a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_MD_CAN_SHA256 */ 2682a8e1175bSopenharmony_civoid app_data(int mfl, int cli_msg_len, int srv_msg_len, 2683a8e1175bSopenharmony_ci int expected_cli_fragments, 2684a8e1175bSopenharmony_ci int expected_srv_fragments, int dtls) 2685a8e1175bSopenharmony_ci{ 2686a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2687a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2688a8e1175bSopenharmony_ci 2689a8e1175bSopenharmony_ci options.mfl = mfl; 2690a8e1175bSopenharmony_ci options.cli_msg_len = cli_msg_len; 2691a8e1175bSopenharmony_ci options.srv_msg_len = srv_msg_len; 2692a8e1175bSopenharmony_ci options.expected_cli_fragments = expected_cli_fragments; 2693a8e1175bSopenharmony_ci options.expected_srv_fragments = expected_srv_fragments; 2694a8e1175bSopenharmony_ci options.dtls = dtls; 2695a8e1175bSopenharmony_ci 2696a8e1175bSopenharmony_ci options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2697a8e1175bSopenharmony_ci options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2698a8e1175bSopenharmony_ci options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2699a8e1175bSopenharmony_ci 2700a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2701a8e1175bSopenharmony_ci 2702a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2703a8e1175bSopenharmony_ci goto exit; 2704a8e1175bSopenharmony_ci 2705a8e1175bSopenharmony_ciexit: 2706a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2707a8e1175bSopenharmony_ci} 2708a8e1175bSopenharmony_ci/* END_CASE */ 2709a8e1175bSopenharmony_ci 2710a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_MD_CAN_SHA256:MBEDTLS_PK_HAVE_ECC_KEYS:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */ 2711a8e1175bSopenharmony_civoid app_data_tls(int mfl, int cli_msg_len, int srv_msg_len, 2712a8e1175bSopenharmony_ci int expected_cli_fragments, 2713a8e1175bSopenharmony_ci int expected_srv_fragments) 2714a8e1175bSopenharmony_ci{ 2715a8e1175bSopenharmony_ci test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments, 2716a8e1175bSopenharmony_ci expected_srv_fragments, 0); 2717a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2718a8e1175bSopenharmony_ci goto exit; 2719a8e1175bSopenharmony_ci} 2720a8e1175bSopenharmony_ci/* END_CASE */ 2721a8e1175bSopenharmony_ci 2722a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_MD_CAN_SHA256:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */ 2723a8e1175bSopenharmony_civoid app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len, 2724a8e1175bSopenharmony_ci int expected_cli_fragments, 2725a8e1175bSopenharmony_ci int expected_srv_fragments) 2726a8e1175bSopenharmony_ci{ 2727a8e1175bSopenharmony_ci test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments, 2728a8e1175bSopenharmony_ci expected_srv_fragments, 1); 2729a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2730a8e1175bSopenharmony_ci goto exit; 2731a8e1175bSopenharmony_ci} 2732a8e1175bSopenharmony_ci/* END_CASE */ 2733a8e1175bSopenharmony_ci 2734a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_MD_CAN_SHA256:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */ 2735a8e1175bSopenharmony_civoid handshake_serialization() 2736a8e1175bSopenharmony_ci{ 2737a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2738a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2739a8e1175bSopenharmony_ci 2740a8e1175bSopenharmony_ci options.serialize = 1; 2741a8e1175bSopenharmony_ci options.dtls = 1; 2742a8e1175bSopenharmony_ci options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2743a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2744a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2745a8e1175bSopenharmony_ci goto exit; 2746a8e1175bSopenharmony_ciexit: 2747a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2748a8e1175bSopenharmony_ci} 2749a8e1175bSopenharmony_ci/* END_CASE */ 2750a8e1175bSopenharmony_ci 2751a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_SSL_HAVE_AES:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_SSL_HAVE_CBC:MBEDTLS_MD_CAN_SHA256:MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ 2752a8e1175bSopenharmony_civoid handshake_fragmentation(int mfl, 2753a8e1175bSopenharmony_ci int expected_srv_hs_fragmentation, 2754a8e1175bSopenharmony_ci int expected_cli_hs_fragmentation) 2755a8e1175bSopenharmony_ci{ 2756a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2757a8e1175bSopenharmony_ci mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern; 2758a8e1175bSopenharmony_ci 2759a8e1175bSopenharmony_ci srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake"; 2760a8e1175bSopenharmony_ci srv_pattern.counter = 0; 2761a8e1175bSopenharmony_ci cli_pattern.counter = 0; 2762a8e1175bSopenharmony_ci 2763a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2764a8e1175bSopenharmony_ci options.dtls = 1; 2765a8e1175bSopenharmony_ci options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2766a8e1175bSopenharmony_ci options.mfl = mfl; 2767a8e1175bSopenharmony_ci /* Set cipher to one using CBC so that record splitting can be tested */ 2768a8e1175bSopenharmony_ci options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256"; 2769a8e1175bSopenharmony_ci options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED; 2770a8e1175bSopenharmony_ci options.srv_log_obj = &srv_pattern; 2771a8e1175bSopenharmony_ci options.cli_log_obj = &cli_pattern; 2772a8e1175bSopenharmony_ci options.srv_log_fun = mbedtls_test_ssl_log_analyzer; 2773a8e1175bSopenharmony_ci options.cli_log_fun = mbedtls_test_ssl_log_analyzer; 2774a8e1175bSopenharmony_ci 2775a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2776a8e1175bSopenharmony_ci 2777a8e1175bSopenharmony_ci /* Test if the server received a fragmented handshake */ 2778a8e1175bSopenharmony_ci if (expected_srv_hs_fragmentation) { 2779a8e1175bSopenharmony_ci TEST_ASSERT(srv_pattern.counter >= 1); 2780a8e1175bSopenharmony_ci } 2781a8e1175bSopenharmony_ci /* Test if the client received a fragmented handshake */ 2782a8e1175bSopenharmony_ci if (expected_cli_hs_fragmentation) { 2783a8e1175bSopenharmony_ci TEST_ASSERT(cli_pattern.counter >= 1); 2784a8e1175bSopenharmony_ci } 2785a8e1175bSopenharmony_ci 2786a8e1175bSopenharmony_ciexit: 2787a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2788a8e1175bSopenharmony_ci} 2789a8e1175bSopenharmony_ci/* END_CASE */ 2790a8e1175bSopenharmony_ci 2791a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_MD_CAN_SHA256:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */ 2792a8e1175bSopenharmony_civoid renegotiation(int legacy_renegotiation) 2793a8e1175bSopenharmony_ci{ 2794a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2795a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2796a8e1175bSopenharmony_ci 2797a8e1175bSopenharmony_ci options.renegotiate = 1; 2798a8e1175bSopenharmony_ci options.legacy_renegotiation = legacy_renegotiation; 2799a8e1175bSopenharmony_ci options.dtls = 1; 2800a8e1175bSopenharmony_ci options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2801a8e1175bSopenharmony_ci 2802a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2803a8e1175bSopenharmony_ci 2804a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2805a8e1175bSopenharmony_ci goto exit; 2806a8e1175bSopenharmony_ciexit: 2807a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2808a8e1175bSopenharmony_ci} 2809a8e1175bSopenharmony_ci/* END_CASE */ 2810a8e1175bSopenharmony_ci 2811a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_MD_CAN_SHA256 */ 2812a8e1175bSopenharmony_civoid resize_buffers(int mfl, int renegotiation, int legacy_renegotiation, 2813a8e1175bSopenharmony_ci int serialize, int dtls, char *cipher) 2814a8e1175bSopenharmony_ci{ 2815a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 2816a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 2817a8e1175bSopenharmony_ci 2818a8e1175bSopenharmony_ci options.mfl = mfl; 2819a8e1175bSopenharmony_ci options.cipher = cipher; 2820a8e1175bSopenharmony_ci options.renegotiate = renegotiation; 2821a8e1175bSopenharmony_ci options.legacy_renegotiation = legacy_renegotiation; 2822a8e1175bSopenharmony_ci options.serialize = serialize; 2823a8e1175bSopenharmony_ci options.dtls = dtls; 2824a8e1175bSopenharmony_ci if (dtls) { 2825a8e1175bSopenharmony_ci options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2826a8e1175bSopenharmony_ci } 2827a8e1175bSopenharmony_ci options.resize_buffers = 1; 2828a8e1175bSopenharmony_ci 2829a8e1175bSopenharmony_ci mbedtls_test_ssl_perform_handshake(&options); 2830a8e1175bSopenharmony_ci 2831a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2832a8e1175bSopenharmony_ci goto exit; 2833a8e1175bSopenharmony_ciexit: 2834a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 2835a8e1175bSopenharmony_ci} 2836a8e1175bSopenharmony_ci/* END_CASE */ 2837a8e1175bSopenharmony_ci 2838a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_MD_CAN_SHA256:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */ 2839a8e1175bSopenharmony_civoid resize_buffers_serialize_mfl(int mfl) 2840a8e1175bSopenharmony_ci{ 2841a8e1175bSopenharmony_ci test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1, 2842a8e1175bSopenharmony_ci (char *) ""); 2843a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2844a8e1175bSopenharmony_ci goto exit; 2845a8e1175bSopenharmony_ci} 2846a8e1175bSopenharmony_ci/* END_CASE */ 2847a8e1175bSopenharmony_ci 2848a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_MD_CAN_SHA256:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */ 2849a8e1175bSopenharmony_civoid resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation, 2850a8e1175bSopenharmony_ci char *cipher) 2851a8e1175bSopenharmony_ci{ 2852a8e1175bSopenharmony_ci test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher); 2853a8e1175bSopenharmony_ci /* The goto below is used to avoid an "unused label" warning.*/ 2854a8e1175bSopenharmony_ci goto exit; 2855a8e1175bSopenharmony_ci} 2856a8e1175bSopenharmony_ci/* END_CASE */ 2857a8e1175bSopenharmony_ci 2858a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ 2859a8e1175bSopenharmony_civoid test_multiple_psks() 2860a8e1175bSopenharmony_ci{ 2861a8e1175bSopenharmony_ci unsigned char psk0[10] = { 0 }; 2862a8e1175bSopenharmony_ci unsigned char psk0_identity[] = { 'f', 'o', 'o' }; 2863a8e1175bSopenharmony_ci 2864a8e1175bSopenharmony_ci unsigned char psk1[10] = { 0 }; 2865a8e1175bSopenharmony_ci unsigned char psk1_identity[] = { 'b', 'a', 'r' }; 2866a8e1175bSopenharmony_ci 2867a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 2868a8e1175bSopenharmony_ci 2869a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 2870a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 2871a8e1175bSopenharmony_ci 2872a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2873a8e1175bSopenharmony_ci psk0, sizeof(psk0), 2874a8e1175bSopenharmony_ci psk0_identity, sizeof(psk0_identity)) == 0); 2875a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2876a8e1175bSopenharmony_ci psk1, sizeof(psk1), 2877a8e1175bSopenharmony_ci psk1_identity, sizeof(psk1_identity)) == 2878a8e1175bSopenharmony_ci MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2879a8e1175bSopenharmony_ci 2880a8e1175bSopenharmony_ciexit: 2881a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 2882a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 2883a8e1175bSopenharmony_ci} 2884a8e1175bSopenharmony_ci/* END_CASE */ 2885a8e1175bSopenharmony_ci 2886a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED:MBEDTLS_USE_PSA_CRYPTO */ 2887a8e1175bSopenharmony_civoid test_multiple_psks_opaque(int mode) 2888a8e1175bSopenharmony_ci{ 2889a8e1175bSopenharmony_ci /* 2890a8e1175bSopenharmony_ci * Mode 0: Raw PSK, then opaque PSK 2891a8e1175bSopenharmony_ci * Mode 1: Opaque PSK, then raw PSK 2892a8e1175bSopenharmony_ci * Mode 2: 2x opaque PSK 2893a8e1175bSopenharmony_ci */ 2894a8e1175bSopenharmony_ci 2895a8e1175bSopenharmony_ci unsigned char psk0_raw[10] = { 0 }; 2896a8e1175bSopenharmony_ci unsigned char psk0_raw_identity[] = { 'f', 'o', 'o' }; 2897a8e1175bSopenharmony_ci 2898a8e1175bSopenharmony_ci mbedtls_svc_key_id_t psk0_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 1); 2899a8e1175bSopenharmony_ci 2900a8e1175bSopenharmony_ci unsigned char psk0_opaque_identity[] = { 'f', 'o', 'o' }; 2901a8e1175bSopenharmony_ci 2902a8e1175bSopenharmony_ci unsigned char psk1_raw[10] = { 0 }; 2903a8e1175bSopenharmony_ci unsigned char psk1_raw_identity[] = { 'b', 'a', 'r' }; 2904a8e1175bSopenharmony_ci 2905a8e1175bSopenharmony_ci mbedtls_svc_key_id_t psk1_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 2); 2906a8e1175bSopenharmony_ci 2907a8e1175bSopenharmony_ci unsigned char psk1_opaque_identity[] = { 'b', 'a', 'r' }; 2908a8e1175bSopenharmony_ci 2909a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 2910a8e1175bSopenharmony_ci 2911a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 2912a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 2913a8e1175bSopenharmony_ci 2914a8e1175bSopenharmony_ci switch (mode) { 2915a8e1175bSopenharmony_ci case 0: 2916a8e1175bSopenharmony_ci 2917a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2918a8e1175bSopenharmony_ci psk0_raw, sizeof(psk0_raw), 2919a8e1175bSopenharmony_ci psk0_raw_identity, sizeof(psk0_raw_identity)) 2920a8e1175bSopenharmony_ci == 0); 2921a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2922a8e1175bSopenharmony_ci psk1_opaque, 2923a8e1175bSopenharmony_ci psk1_opaque_identity, 2924a8e1175bSopenharmony_ci sizeof(psk1_opaque_identity)) 2925a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2926a8e1175bSopenharmony_ci break; 2927a8e1175bSopenharmony_ci 2928a8e1175bSopenharmony_ci case 1: 2929a8e1175bSopenharmony_ci 2930a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2931a8e1175bSopenharmony_ci psk0_opaque, 2932a8e1175bSopenharmony_ci psk0_opaque_identity, 2933a8e1175bSopenharmony_ci sizeof(psk0_opaque_identity)) 2934a8e1175bSopenharmony_ci == 0); 2935a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2936a8e1175bSopenharmony_ci psk1_raw, sizeof(psk1_raw), 2937a8e1175bSopenharmony_ci psk1_raw_identity, sizeof(psk1_raw_identity)) 2938a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2939a8e1175bSopenharmony_ci 2940a8e1175bSopenharmony_ci break; 2941a8e1175bSopenharmony_ci 2942a8e1175bSopenharmony_ci case 2: 2943a8e1175bSopenharmony_ci 2944a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2945a8e1175bSopenharmony_ci psk0_opaque, 2946a8e1175bSopenharmony_ci psk0_opaque_identity, 2947a8e1175bSopenharmony_ci sizeof(psk0_opaque_identity)) 2948a8e1175bSopenharmony_ci == 0); 2949a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2950a8e1175bSopenharmony_ci psk1_opaque, 2951a8e1175bSopenharmony_ci psk1_opaque_identity, 2952a8e1175bSopenharmony_ci sizeof(psk1_opaque_identity)) 2953a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2954a8e1175bSopenharmony_ci 2955a8e1175bSopenharmony_ci break; 2956a8e1175bSopenharmony_ci 2957a8e1175bSopenharmony_ci default: 2958a8e1175bSopenharmony_ci TEST_ASSERT(0); 2959a8e1175bSopenharmony_ci break; 2960a8e1175bSopenharmony_ci } 2961a8e1175bSopenharmony_ci 2962a8e1175bSopenharmony_ciexit: 2963a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 2964a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 2965a8e1175bSopenharmony_ci 2966a8e1175bSopenharmony_ci} 2967a8e1175bSopenharmony_ci/* END_CASE */ 2968a8e1175bSopenharmony_ci 2969a8e1175bSopenharmony_ci/* BEGIN_CASE */ 2970a8e1175bSopenharmony_civoid conf_version(int endpoint, int transport, 2971a8e1175bSopenharmony_ci int min_tls_version, int max_tls_version, 2972a8e1175bSopenharmony_ci int expected_ssl_setup_result) 2973a8e1175bSopenharmony_ci{ 2974a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 2975a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 2976a8e1175bSopenharmony_ci 2977a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 2978a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 2979a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 2980a8e1175bSopenharmony_ci 2981a8e1175bSopenharmony_ci mbedtls_ssl_conf_endpoint(&conf, endpoint); 2982a8e1175bSopenharmony_ci mbedtls_ssl_conf_transport(&conf, transport); 2983a8e1175bSopenharmony_ci mbedtls_ssl_conf_min_tls_version(&conf, min_tls_version); 2984a8e1175bSopenharmony_ci mbedtls_ssl_conf_max_tls_version(&conf, max_tls_version); 2985a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 2986a8e1175bSopenharmony_ci 2987a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == expected_ssl_setup_result); 2988a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_conf_get_endpoint( 2989a8e1175bSopenharmony_ci mbedtls_ssl_context_get_config(&ssl)), endpoint); 2990a8e1175bSopenharmony_ci 2991a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 2992a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 2993a8e1175bSopenharmony_ci 2994a8e1175bSopenharmony_ciexit: 2995a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 2996a8e1175bSopenharmony_ci} 2997a8e1175bSopenharmony_ci/* END_CASE */ 2998a8e1175bSopenharmony_ci 2999a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_ECP_C:!MBEDTLS_DEPRECATED_REMOVED:!MBEDTLS_DEPRECATED_WARNING:MBEDTLS_ECP_HAVE_SECP192R1:MBEDTLS_ECP_HAVE_SECP224R1:MBEDTLS_ECP_HAVE_SECP256R1 */ 3000a8e1175bSopenharmony_civoid conf_curve() 3001a8e1175bSopenharmony_ci{ 3002a8e1175bSopenharmony_ci 3003a8e1175bSopenharmony_ci mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP192R1, 3004a8e1175bSopenharmony_ci MBEDTLS_ECP_DP_SECP224R1, 3005a8e1175bSopenharmony_ci MBEDTLS_ECP_DP_SECP256R1, 3006a8e1175bSopenharmony_ci MBEDTLS_ECP_DP_NONE }; 3007a8e1175bSopenharmony_ci uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1, 3008a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1, 3009a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 3010a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE }; 3011a8e1175bSopenharmony_ci 3012a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 3013a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 3014a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 3015a8e1175bSopenharmony_ci mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 3016a8e1175bSopenharmony_ci mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 3017a8e1175bSopenharmony_ci#else 3018a8e1175bSopenharmony_ci mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3); 3019a8e1175bSopenharmony_ci mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3); 3020a8e1175bSopenharmony_ci#endif 3021a8e1175bSopenharmony_ci mbedtls_ssl_conf_curves(&conf, curve_list); 3022a8e1175bSopenharmony_ci 3023a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 3024a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 3025a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3026a8e1175bSopenharmony_ci 3027a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 3028a8e1175bSopenharmony_ci 3029a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 3030a8e1175bSopenharmony_ci 3031a8e1175bSopenharmony_ci TEST_ASSERT(ssl.handshake != NULL && ssl.handshake->group_list != NULL); 3032a8e1175bSopenharmony_ci TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list == NULL); 3033a8e1175bSopenharmony_ci 3034a8e1175bSopenharmony_ci TEST_EQUAL(ssl.handshake-> 3035a8e1175bSopenharmony_ci group_list[ARRAY_LENGTH(iana_tls_group_list) - 1], 3036a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE); 3037a8e1175bSopenharmony_ci 3038a8e1175bSopenharmony_ci for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) { 3039a8e1175bSopenharmony_ci TEST_EQUAL(iana_tls_group_list[i], ssl.handshake->group_list[i]); 3040a8e1175bSopenharmony_ci } 3041a8e1175bSopenharmony_ci 3042a8e1175bSopenharmony_ciexit: 3043a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 3044a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 3045a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3046a8e1175bSopenharmony_ci} 3047a8e1175bSopenharmony_ci/* END_CASE */ 3048a8e1175bSopenharmony_ci 3049a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_DEPRECATED_REMOVED */ 3050a8e1175bSopenharmony_civoid conf_group() 3051a8e1175bSopenharmony_ci{ 3052a8e1175bSopenharmony_ci uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1, 3053a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1, 3054a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 3055a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE }; 3056a8e1175bSopenharmony_ci 3057a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 3058a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 3059a8e1175bSopenharmony_ci 3060a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 3061a8e1175bSopenharmony_ci mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 3062a8e1175bSopenharmony_ci mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 3063a8e1175bSopenharmony_ci 3064a8e1175bSopenharmony_ci mbedtls_ssl_conf_groups(&conf, iana_tls_group_list); 3065a8e1175bSopenharmony_ci 3066a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 3067a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 3068a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3069a8e1175bSopenharmony_ci 3070a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 3071a8e1175bSopenharmony_ci 3072a8e1175bSopenharmony_ci TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list != NULL); 3073a8e1175bSopenharmony_ci 3074a8e1175bSopenharmony_ci TEST_EQUAL(ssl.conf-> 3075a8e1175bSopenharmony_ci group_list[ARRAY_LENGTH(iana_tls_group_list) - 1], 3076a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE); 3077a8e1175bSopenharmony_ci 3078a8e1175bSopenharmony_ci for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) { 3079a8e1175bSopenharmony_ci TEST_EQUAL(iana_tls_group_list[i], ssl.conf->group_list[i]); 3080a8e1175bSopenharmony_ci } 3081a8e1175bSopenharmony_ci 3082a8e1175bSopenharmony_ciexit: 3083a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 3084a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 3085a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3086a8e1175bSopenharmony_ci} 3087a8e1175bSopenharmony_ci/* END_CASE */ 3088a8e1175bSopenharmony_ci 3089a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_CACHE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PKCS1_V15:MBEDTLS_MD_CAN_SHA256 */ 3090a8e1175bSopenharmony_civoid force_bad_session_id_len() 3091a8e1175bSopenharmony_ci{ 3092a8e1175bSopenharmony_ci enum { BUFFSIZE = 1024 }; 3093a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options options; 3094a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client, server; 3095a8e1175bSopenharmony_ci mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern; 3096a8e1175bSopenharmony_ci mbedtls_test_message_socket_context server_context, client_context; 3097a8e1175bSopenharmony_ci 3098a8e1175bSopenharmony_ci srv_pattern.pattern = cli_pattern.pattern = "cache did not store session"; 3099a8e1175bSopenharmony_ci srv_pattern.counter = 0; 3100a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&options); 3101a8e1175bSopenharmony_ci 3102a8e1175bSopenharmony_ci options.srv_log_obj = &srv_pattern; 3103a8e1175bSopenharmony_ci options.srv_log_fun = mbedtls_test_ssl_log_analyzer; 3104a8e1175bSopenharmony_ci 3105a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client, sizeof(client)); 3106a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server, sizeof(server)); 3107a8e1175bSopenharmony_ci 3108a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&server_context); 3109a8e1175bSopenharmony_ci mbedtls_test_message_socket_init(&client_context); 3110a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3111a8e1175bSopenharmony_ci 3112a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT, 3113a8e1175bSopenharmony_ci &options, NULL, NULL, 3114a8e1175bSopenharmony_ci NULL) == 0); 3115a8e1175bSopenharmony_ci 3116a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER, 3117a8e1175bSopenharmony_ci &options, NULL, NULL, NULL) == 0); 3118a8e1175bSopenharmony_ci 3119a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(1); 3120a8e1175bSopenharmony_ci mbedtls_ssl_conf_dbg(&server.conf, options.srv_log_fun, 3121a8e1175bSopenharmony_ci options.srv_log_obj); 3122a8e1175bSopenharmony_ci 3123a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_mock_socket_connect(&(client.socket), 3124a8e1175bSopenharmony_ci &(server.socket), 3125a8e1175bSopenharmony_ci BUFFSIZE) == 0); 3126a8e1175bSopenharmony_ci 3127a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_move_handshake_to_state( 3128a8e1175bSopenharmony_ci &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_WRAPUP) 3129a8e1175bSopenharmony_ci == 0); 3130a8e1175bSopenharmony_ci /* Force a bad session_id_len that will be read by the server in 3131a8e1175bSopenharmony_ci * mbedtls_ssl_cache_set. */ 3132a8e1175bSopenharmony_ci server.ssl.session_negotiate->id_len = 33; 3133a8e1175bSopenharmony_ci if (options.cli_msg_len != 0 || options.srv_msg_len != 0) { 3134a8e1175bSopenharmony_ci /* Start data exchanging test */ 3135a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_ssl_exchange_data( 3136a8e1175bSopenharmony_ci &(client.ssl), options.cli_msg_len, 3137a8e1175bSopenharmony_ci options.expected_cli_fragments, 3138a8e1175bSopenharmony_ci &(server.ssl), options.srv_msg_len, 3139a8e1175bSopenharmony_ci options.expected_srv_fragments) 3140a8e1175bSopenharmony_ci == 0); 3141a8e1175bSopenharmony_ci } 3142a8e1175bSopenharmony_ci 3143a8e1175bSopenharmony_ci /* Make sure that the cache did not store the session */ 3144a8e1175bSopenharmony_ci TEST_EQUAL(srv_pattern.counter, 1); 3145a8e1175bSopenharmony_ciexit: 3146a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client, NULL); 3147a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server, NULL); 3148a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&options); 3149a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(0); 3150a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3151a8e1175bSopenharmony_ci} 3152a8e1175bSopenharmony_ci/* END_CASE */ 3153a8e1175bSopenharmony_ci 3154a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */ 3155a8e1175bSopenharmony_civoid cookie_parsing(data_t *cookie, int exp_ret) 3156a8e1175bSopenharmony_ci{ 3157a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 3158a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 3159a8e1175bSopenharmony_ci size_t len; 3160a8e1175bSopenharmony_ci 3161a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 3162a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 3163a8e1175bSopenharmony_ci USE_PSA_INIT(); 3164a8e1175bSopenharmony_ci 3165a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER, 3166a8e1175bSopenharmony_ci MBEDTLS_SSL_TRANSPORT_DATAGRAM, 3167a8e1175bSopenharmony_ci MBEDTLS_SSL_PRESET_DEFAULT), 3168a8e1175bSopenharmony_ci 0); 3169a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 3170a8e1175bSopenharmony_ci 3171a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0); 3172a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id, 3173a8e1175bSopenharmony_ci ssl.cli_id_len, 3174a8e1175bSopenharmony_ci cookie->x, cookie->len, 3175a8e1175bSopenharmony_ci ssl.out_buf, 3176a8e1175bSopenharmony_ci MBEDTLS_SSL_OUT_CONTENT_LEN, 3177a8e1175bSopenharmony_ci &len), 3178a8e1175bSopenharmony_ci exp_ret); 3179a8e1175bSopenharmony_ci 3180a8e1175bSopenharmony_ciexit: 3181a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 3182a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 3183a8e1175bSopenharmony_ci USE_PSA_DONE(); 3184a8e1175bSopenharmony_ci} 3185a8e1175bSopenharmony_ci/* END_CASE */ 3186a8e1175bSopenharmony_ci 3187a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_TIMING_C:MBEDTLS_HAVE_TIME */ 3188a8e1175bSopenharmony_civoid timing_final_delay_accessor() 3189a8e1175bSopenharmony_ci{ 3190a8e1175bSopenharmony_ci mbedtls_timing_delay_context delay_context; 3191a8e1175bSopenharmony_ci 3192a8e1175bSopenharmony_ci USE_PSA_INIT(); 3193a8e1175bSopenharmony_ci mbedtls_timing_set_delay(&delay_context, 50, 100); 3194a8e1175bSopenharmony_ci 3195a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_timing_get_final_delay(&delay_context) == 100); 3196a8e1175bSopenharmony_ci 3197a8e1175bSopenharmony_ciexit: 3198a8e1175bSopenharmony_ci USE_PSA_DONE(); 3199a8e1175bSopenharmony_ci} 3200a8e1175bSopenharmony_ci/* END_CASE */ 3201a8e1175bSopenharmony_ci 3202a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_CONNECTION_ID */ 3203a8e1175bSopenharmony_civoid cid_sanity() 3204a8e1175bSopenharmony_ci{ 3205a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 3206a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 3207a8e1175bSopenharmony_ci 3208a8e1175bSopenharmony_ci unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX]; 3209a8e1175bSopenharmony_ci unsigned char test_cid[MBEDTLS_SSL_CID_IN_LEN_MAX]; 3210a8e1175bSopenharmony_ci int cid_enabled; 3211a8e1175bSopenharmony_ci size_t own_cid_len; 3212a8e1175bSopenharmony_ci 3213a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand(NULL, own_cid, sizeof(own_cid)); 3214a8e1175bSopenharmony_ci 3215a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 3216a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 3217a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3218a8e1175bSopenharmony_ci 3219a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_config_defaults(&conf, 3220a8e1175bSopenharmony_ci MBEDTLS_SSL_IS_CLIENT, 3221a8e1175bSopenharmony_ci MBEDTLS_SSL_TRANSPORT_STREAM, 3222a8e1175bSopenharmony_ci MBEDTLS_SSL_PRESET_DEFAULT) 3223a8e1175bSopenharmony_ci == 0); 3224a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 3225a8e1175bSopenharmony_ci 3226a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 3227a8e1175bSopenharmony_ci 3228a8e1175bSopenharmony_ci /* Can't use CID functions with stream transport. */ 3229a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid, 3230a8e1175bSopenharmony_ci sizeof(own_cid)) 3231a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3232a8e1175bSopenharmony_ci 3233a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid, 3234a8e1175bSopenharmony_ci &own_cid_len) 3235a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3236a8e1175bSopenharmony_ci 3237a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_config_defaults(&conf, 3238a8e1175bSopenharmony_ci MBEDTLS_SSL_IS_CLIENT, 3239a8e1175bSopenharmony_ci MBEDTLS_SSL_TRANSPORT_DATAGRAM, 3240a8e1175bSopenharmony_ci MBEDTLS_SSL_PRESET_DEFAULT) 3241a8e1175bSopenharmony_ci == 0); 3242a8e1175bSopenharmony_ci 3243a8e1175bSopenharmony_ci /* Attempt to set config cid size too big. */ 3244a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, MBEDTLS_SSL_CID_IN_LEN_MAX + 1, 3245a8e1175bSopenharmony_ci MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) 3246a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3247a8e1175bSopenharmony_ci 3248a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, sizeof(own_cid), 3249a8e1175bSopenharmony_ci MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) 3250a8e1175bSopenharmony_ci == 0); 3251a8e1175bSopenharmony_ci 3252a8e1175bSopenharmony_ci /* Attempt to set CID length not matching config. */ 3253a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid, 3254a8e1175bSopenharmony_ci MBEDTLS_SSL_CID_IN_LEN_MAX - 1) 3255a8e1175bSopenharmony_ci == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3256a8e1175bSopenharmony_ci 3257a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid, 3258a8e1175bSopenharmony_ci sizeof(own_cid)) 3259a8e1175bSopenharmony_ci == 0); 3260a8e1175bSopenharmony_ci 3261a8e1175bSopenharmony_ci /* Test we get back what we put in. */ 3262a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid, 3263a8e1175bSopenharmony_ci &own_cid_len) 3264a8e1175bSopenharmony_ci == 0); 3265a8e1175bSopenharmony_ci 3266a8e1175bSopenharmony_ci TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_ENABLED); 3267a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(own_cid, own_cid_len, test_cid, own_cid_len); 3268a8e1175bSopenharmony_ci 3269a8e1175bSopenharmony_ci /* Test disabling works. */ 3270a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_DISABLED, NULL, 3271a8e1175bSopenharmony_ci 0) 3272a8e1175bSopenharmony_ci == 0); 3273a8e1175bSopenharmony_ci 3274a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid, 3275a8e1175bSopenharmony_ci &own_cid_len) 3276a8e1175bSopenharmony_ci == 0); 3277a8e1175bSopenharmony_ci 3278a8e1175bSopenharmony_ci TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_DISABLED); 3279a8e1175bSopenharmony_ci 3280a8e1175bSopenharmony_ciexit: 3281a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 3282a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 3283a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3284a8e1175bSopenharmony_ci} 3285a8e1175bSopenharmony_ci/* END_CASE */ 3286a8e1175bSopenharmony_ci 3287a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_SOME */ 3288a8e1175bSopenharmony_civoid raw_key_agreement_fail(int bad_server_ecdhe_key) 3289a8e1175bSopenharmony_ci{ 3290a8e1175bSopenharmony_ci enum { BUFFSIZE = 17000 }; 3291a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client, server; 3292a8e1175bSopenharmony_ci mbedtls_psa_stats_t stats; 3293a8e1175bSopenharmony_ci size_t free_slots_before = -1; 3294a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options, server_options; 3295a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 3296a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 3297a8e1175bSopenharmony_ci 3298a8e1175bSopenharmony_ci uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 3299a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE }; 3300a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3301a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client, sizeof(client)); 3302a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server, sizeof(server)); 3303a8e1175bSopenharmony_ci 3304a8e1175bSopenharmony_ci /* Client side, force SECP256R1 to make one key bitflip fail 3305a8e1175bSopenharmony_ci * the raw key agreement. Flipping the first byte makes the 3306a8e1175bSopenharmony_ci * required 0x04 identifier invalid. */ 3307a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 3308a8e1175bSopenharmony_ci client_options.group_list = iana_tls_group_list; 3309a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT, 3310a8e1175bSopenharmony_ci &client_options, NULL, NULL, 3311a8e1175bSopenharmony_ci NULL), 0); 3312a8e1175bSopenharmony_ci 3313a8e1175bSopenharmony_ci /* Server side */ 3314a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 3315a8e1175bSopenharmony_ci server_options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 3316a8e1175bSopenharmony_ci server_options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 3317a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER, 3318a8e1175bSopenharmony_ci &server_options, NULL, NULL, 3319a8e1175bSopenharmony_ci NULL), 0); 3320a8e1175bSopenharmony_ci 3321a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket), 3322a8e1175bSopenharmony_ci &(server.socket), 3323a8e1175bSopenharmony_ci BUFFSIZE), 0); 3324a8e1175bSopenharmony_ci 3325a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 3326a8e1175bSopenharmony_ci &(client.ssl), &(server.ssl), 3327a8e1175bSopenharmony_ci MBEDTLS_SSL_CLIENT_KEY_EXCHANGE), 0); 3328a8e1175bSopenharmony_ci 3329a8e1175bSopenharmony_ci mbedtls_psa_get_stats(&stats); 3330a8e1175bSopenharmony_ci /* Save the number of slots in use up to this point. 3331a8e1175bSopenharmony_ci * With PSA, one can be used for the ECDH private key. */ 3332a8e1175bSopenharmony_ci free_slots_before = stats.empty_slots; 3333a8e1175bSopenharmony_ci 3334a8e1175bSopenharmony_ci if (bad_server_ecdhe_key) { 3335a8e1175bSopenharmony_ci /* Force a simulated bitflip in the server key. to make the 3336a8e1175bSopenharmony_ci * raw key agreement in ssl_write_client_key_exchange fail. */ 3337a8e1175bSopenharmony_ci (client.ssl).handshake->xxdh_psa_peerkey[0] ^= 0x02; 3338a8e1175bSopenharmony_ci } 3339a8e1175bSopenharmony_ci 3340a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 3341a8e1175bSopenharmony_ci &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER), 3342a8e1175bSopenharmony_ci bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0); 3343a8e1175bSopenharmony_ci 3344a8e1175bSopenharmony_ci mbedtls_psa_get_stats(&stats); 3345a8e1175bSopenharmony_ci 3346a8e1175bSopenharmony_ci /* Make sure that the key slot is already destroyed in case of failure, 3347a8e1175bSopenharmony_ci * without waiting to close the connection. */ 3348a8e1175bSopenharmony_ci if (bad_server_ecdhe_key) { 3349a8e1175bSopenharmony_ci TEST_EQUAL(free_slots_before, stats.empty_slots); 3350a8e1175bSopenharmony_ci } 3351a8e1175bSopenharmony_ci 3352a8e1175bSopenharmony_ciexit: 3353a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client, NULL); 3354a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server, NULL); 3355a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 3356a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 3357a8e1175bSopenharmony_ci 3358a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3359a8e1175bSopenharmony_ci} 3360a8e1175bSopenharmony_ci/* END_CASE */ 3361a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_SSL_PROTO_TLS1_3:!MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_ECP_HAVE_SECP384R1 */ 3362a8e1175bSopenharmony_civoid tls13_server_certificate_msg_invalid_vector_len() 3363a8e1175bSopenharmony_ci{ 3364a8e1175bSopenharmony_ci int ret = -1; 3365a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client_ep, server_ep; 3366a8e1175bSopenharmony_ci unsigned char *buf, *end; 3367a8e1175bSopenharmony_ci size_t buf_len; 3368a8e1175bSopenharmony_ci int step = 0; 3369a8e1175bSopenharmony_ci int expected_result; 3370a8e1175bSopenharmony_ci mbedtls_ssl_chk_buf_ptr_args expected_chk_buf_ptr_args; 3371a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options; 3372a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options server_options; 3373a8e1175bSopenharmony_ci 3374a8e1175bSopenharmony_ci /* 3375a8e1175bSopenharmony_ci * Test set-up 3376a8e1175bSopenharmony_ci */ 3377a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 3378a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 3379a8e1175bSopenharmony_ci 3380a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 3381a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3382a8e1175bSopenharmony_ci 3383a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 3384a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 3385a8e1175bSopenharmony_ci &client_options, NULL, NULL, NULL); 3386a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3387a8e1175bSopenharmony_ci 3388a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 3389a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 3390a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 3391a8e1175bSopenharmony_ci &server_options, NULL, NULL, NULL); 3392a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3393a8e1175bSopenharmony_ci 3394a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 3395a8e1175bSopenharmony_ci &(server_ep.socket), 1024); 3396a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3397a8e1175bSopenharmony_ci 3398a8e1175bSopenharmony_ci while (1) { 3399a8e1175bSopenharmony_ci mbedtls_test_set_step(++step); 3400a8e1175bSopenharmony_ci 3401a8e1175bSopenharmony_ci ret = mbedtls_test_move_handshake_to_state( 3402a8e1175bSopenharmony_ci &(server_ep.ssl), &(client_ep.ssl), 3403a8e1175bSopenharmony_ci MBEDTLS_SSL_CERTIFICATE_VERIFY); 3404a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3405a8e1175bSopenharmony_ci 3406a8e1175bSopenharmony_ci ret = mbedtls_ssl_flush_output(&(server_ep.ssl)); 3407a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3408a8e1175bSopenharmony_ci 3409a8e1175bSopenharmony_ci ret = mbedtls_test_move_handshake_to_state( 3410a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), 3411a8e1175bSopenharmony_ci MBEDTLS_SSL_SERVER_CERTIFICATE); 3412a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3413a8e1175bSopenharmony_ci 3414a8e1175bSopenharmony_ci ret = mbedtls_ssl_tls13_fetch_handshake_msg(&(client_ep.ssl), 3415a8e1175bSopenharmony_ci MBEDTLS_SSL_HS_CERTIFICATE, 3416a8e1175bSopenharmony_ci &buf, &buf_len); 3417a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3418a8e1175bSopenharmony_ci 3419a8e1175bSopenharmony_ci end = buf + buf_len; 3420a8e1175bSopenharmony_ci 3421a8e1175bSopenharmony_ci /* 3422a8e1175bSopenharmony_ci * Tweak server Certificate message and parse it. 3423a8e1175bSopenharmony_ci */ 3424a8e1175bSopenharmony_ci 3425a8e1175bSopenharmony_ci ret = mbedtls_test_tweak_tls13_certificate_msg_vector_len( 3426a8e1175bSopenharmony_ci buf, &end, step, &expected_result, &expected_chk_buf_ptr_args); 3427a8e1175bSopenharmony_ci 3428a8e1175bSopenharmony_ci if (ret != 0) { 3429a8e1175bSopenharmony_ci break; 3430a8e1175bSopenharmony_ci } 3431a8e1175bSopenharmony_ci 3432a8e1175bSopenharmony_ci ret = mbedtls_ssl_tls13_parse_certificate(&(client_ep.ssl), buf, end); 3433a8e1175bSopenharmony_ci TEST_EQUAL(ret, expected_result); 3434a8e1175bSopenharmony_ci 3435a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_ssl_cmp_chk_buf_ptr_fail_args( 3436a8e1175bSopenharmony_ci &expected_chk_buf_ptr_args) == 0); 3437a8e1175bSopenharmony_ci 3438a8e1175bSopenharmony_ci mbedtls_ssl_reset_chk_buf_ptr_fail_args(); 3439a8e1175bSopenharmony_ci 3440a8e1175bSopenharmony_ci ret = mbedtls_ssl_session_reset(&(client_ep.ssl)); 3441a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3442a8e1175bSopenharmony_ci 3443a8e1175bSopenharmony_ci ret = mbedtls_ssl_session_reset(&(server_ep.ssl)); 3444a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3445a8e1175bSopenharmony_ci } 3446a8e1175bSopenharmony_ci 3447a8e1175bSopenharmony_ciexit: 3448a8e1175bSopenharmony_ci mbedtls_ssl_reset_chk_buf_ptr_fail_args(); 3449a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 3450a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 3451a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 3452a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 3453a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3454a8e1175bSopenharmony_ci} 3455a8e1175bSopenharmony_ci/* END_CASE */ 3456a8e1175bSopenharmony_ci 3457a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 3458a8e1175bSopenharmony_civoid ssl_ecjpake_set_password(int use_opaque_arg) 3459a8e1175bSopenharmony_ci{ 3460a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 3461a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 3462a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO) 3463a8e1175bSopenharmony_ci mbedtls_svc_key_id_t pwd_slot = MBEDTLS_SVC_KEY_ID_INIT; 3464a8e1175bSopenharmony_ci#else /* MBEDTLS_USE_PSA_CRYPTO */ 3465a8e1175bSopenharmony_ci (void) use_opaque_arg; 3466a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */ 3467a8e1175bSopenharmony_ci unsigned char pwd_string[sizeof(ECJPAKE_TEST_PWD)] = ""; 3468a8e1175bSopenharmony_ci size_t pwd_len = 0; 3469a8e1175bSopenharmony_ci int ret; 3470a8e1175bSopenharmony_ci 3471a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 3472a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3473a8e1175bSopenharmony_ci 3474a8e1175bSopenharmony_ci /* test with uninitalized SSL context */ 3475a8e1175bSopenharmony_ci ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3476a8e1175bSopenharmony_ci 3477a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 3478a8e1175bSopenharmony_ci 3479a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, 3480a8e1175bSopenharmony_ci MBEDTLS_SSL_IS_CLIENT, 3481a8e1175bSopenharmony_ci MBEDTLS_SSL_TRANSPORT_STREAM, 3482a8e1175bSopenharmony_ci MBEDTLS_SSL_PRESET_DEFAULT), 0); 3483a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 3484a8e1175bSopenharmony_ci 3485a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0); 3486a8e1175bSopenharmony_ci 3487a8e1175bSopenharmony_ci /* test with empty password or unitialized password key (depending on use_opaque_arg) */ 3488a8e1175bSopenharmony_ci ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3489a8e1175bSopenharmony_ci 3490a8e1175bSopenharmony_ci pwd_len = strlen(ECJPAKE_TEST_PWD); 3491a8e1175bSopenharmony_ci memcpy(pwd_string, ECJPAKE_TEST_PWD, pwd_len); 3492a8e1175bSopenharmony_ci 3493a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO) 3494a8e1175bSopenharmony_ci if (use_opaque_arg) { 3495a8e1175bSopenharmony_ci psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; 3496a8e1175bSopenharmony_ci psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT; 3497a8e1175bSopenharmony_ci 3498a8e1175bSopenharmony_ci /* First try with an invalid usage */ 3499a8e1175bSopenharmony_ci psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH); 3500a8e1175bSopenharmony_ci psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE); 3501a8e1175bSopenharmony_ci psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD); 3502a8e1175bSopenharmony_ci 3503a8e1175bSopenharmony_ci PSA_ASSERT(psa_import_key(&attributes, pwd_string, 3504a8e1175bSopenharmony_ci pwd_len, &pwd_slot)); 3505a8e1175bSopenharmony_ci 3506a8e1175bSopenharmony_ci ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED); 3507a8e1175bSopenharmony_ci 3508a8e1175bSopenharmony_ci /* check that the opaque key is still valid after failure */ 3509a8e1175bSopenharmony_ci TEST_EQUAL(psa_get_key_attributes(pwd_slot, &check_attributes), 3510a8e1175bSopenharmony_ci PSA_SUCCESS); 3511a8e1175bSopenharmony_ci 3512a8e1175bSopenharmony_ci psa_destroy_key(pwd_slot); 3513a8e1175bSopenharmony_ci 3514a8e1175bSopenharmony_ci /* Then set the correct usage */ 3515a8e1175bSopenharmony_ci psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE); 3516a8e1175bSopenharmony_ci 3517a8e1175bSopenharmony_ci PSA_ASSERT(psa_import_key(&attributes, pwd_string, 3518a8e1175bSopenharmony_ci pwd_len, &pwd_slot)); 3519a8e1175bSopenharmony_ci } 3520a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */ 3521a8e1175bSopenharmony_ci 3522a8e1175bSopenharmony_ci /* final check which should work without errors */ 3523a8e1175bSopenharmony_ci ECJPAKE_TEST_SET_PASSWORD(0); 3524a8e1175bSopenharmony_ci 3525a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO) 3526a8e1175bSopenharmony_ci if (use_opaque_arg) { 3527a8e1175bSopenharmony_ci psa_destroy_key(pwd_slot); 3528a8e1175bSopenharmony_ci } 3529a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */ 3530a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 3531a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 3532a8e1175bSopenharmony_ci 3533a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3534a8e1175bSopenharmony_ci} 3535a8e1175bSopenharmony_ci/* END_CASE */ 3536a8e1175bSopenharmony_ci 3537a8e1175bSopenharmony_ci/* BEGIN_CASE */ 3538a8e1175bSopenharmony_civoid elliptic_curve_get_properties() 3539a8e1175bSopenharmony_ci{ 3540a8e1175bSopenharmony_ci psa_key_type_t psa_type = PSA_KEY_TYPE_NONE; 3541a8e1175bSopenharmony_ci size_t psa_bits; 3542a8e1175bSopenharmony_ci 3543a8e1175bSopenharmony_ci MD_OR_USE_PSA_INIT(); 3544a8e1175bSopenharmony_ci 3545a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP521R1) || defined(PSA_WANT_ECC_SECP_R1_521) 3546a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521); 3547a8e1175bSopenharmony_ci#else 3548a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521); 3549a8e1175bSopenharmony_ci#endif 3550a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_BP512R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) 3551a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512); 3552a8e1175bSopenharmony_ci#else 3553a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512); 3554a8e1175bSopenharmony_ci#endif 3555a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP384R1) || defined(PSA_WANT_ECC_SECP_R1_384) 3556a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384); 3557a8e1175bSopenharmony_ci#else 3558a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384); 3559a8e1175bSopenharmony_ci#endif 3560a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_BP384R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) 3561a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384); 3562a8e1175bSopenharmony_ci#else 3563a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384); 3564a8e1175bSopenharmony_ci#endif 3565a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP256R1) || defined(PSA_WANT_ECC_SECP_R1_256) 3566a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256); 3567a8e1175bSopenharmony_ci#else 3568a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256); 3569a8e1175bSopenharmony_ci#endif 3570a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP256K1) || defined(PSA_WANT_ECC_SECP_K1_256) 3571a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256); 3572a8e1175bSopenharmony_ci#else 3573a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256); 3574a8e1175bSopenharmony_ci#endif 3575a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_BP256R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) 3576a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256); 3577a8e1175bSopenharmony_ci#else 3578a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256); 3579a8e1175bSopenharmony_ci#endif 3580a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP224R1) || defined(PSA_WANT_ECC_SECP_R1_224) 3581a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224); 3582a8e1175bSopenharmony_ci#else 3583a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224); 3584a8e1175bSopenharmony_ci#endif 3585a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP224K1) || defined(PSA_WANT_ECC_SECP_K1_224) 3586a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224); 3587a8e1175bSopenharmony_ci#else 3588a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224); 3589a8e1175bSopenharmony_ci#endif 3590a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP192R1) || defined(PSA_WANT_ECC_SECP_R1_192) 3591a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192); 3592a8e1175bSopenharmony_ci#else 3593a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192); 3594a8e1175bSopenharmony_ci#endif 3595a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_SECP192K1) || defined(PSA_WANT_ECC_SECP_K1_192) 3596a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192); 3597a8e1175bSopenharmony_ci#else 3598a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192); 3599a8e1175bSopenharmony_ci#endif 3600a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_CURVE25519) || defined(PSA_WANT_ECC_MONTGOMERY_255) 3601a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255); 3602a8e1175bSopenharmony_ci#else 3603a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255); 3604a8e1175bSopenharmony_ci#endif 3605a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_HAVE_CURVE448) || defined(PSA_WANT_ECC_MONTGOMERY_448) 3606a8e1175bSopenharmony_ci TEST_AVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448); 3607a8e1175bSopenharmony_ci#else 3608a8e1175bSopenharmony_ci TEST_UNAVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448); 3609a8e1175bSopenharmony_ci#endif 3610a8e1175bSopenharmony_ci goto exit; 3611a8e1175bSopenharmony_ciexit: 3612a8e1175bSopenharmony_ci MD_OR_USE_PSA_DONE(); 3613a8e1175bSopenharmony_ci} 3614a8e1175bSopenharmony_ci/* END_CASE */ 3615a8e1175bSopenharmony_ci 3616a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */ 3617a8e1175bSopenharmony_civoid tls13_resume_session_with_ticket() 3618a8e1175bSopenharmony_ci{ 3619a8e1175bSopenharmony_ci int ret = -1; 3620a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client_ep, server_ep; 3621a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options; 3622a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options server_options; 3623a8e1175bSopenharmony_ci mbedtls_ssl_session saved_session; 3624a8e1175bSopenharmony_ci 3625a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 3626a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 3627a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 3628a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 3629a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&saved_session); 3630a8e1175bSopenharmony_ci 3631a8e1175bSopenharmony_ci PSA_INIT(); 3632a8e1175bSopenharmony_ci 3633a8e1175bSopenharmony_ci /* 3634a8e1175bSopenharmony_ci * Run first handshake to get a ticket from the server. 3635a8e1175bSopenharmony_ci */ 3636a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 3637a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 3638a8e1175bSopenharmony_ci 3639a8e1175bSopenharmony_ci ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options, 3640a8e1175bSopenharmony_ci &saved_session); 3641a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3642a8e1175bSopenharmony_ci 3643a8e1175bSopenharmony_ci /* 3644a8e1175bSopenharmony_ci * Prepare for handshake with the ticket. 3645a8e1175bSopenharmony_ci */ 3646a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 3647a8e1175bSopenharmony_ci &client_options, NULL, NULL, NULL); 3648a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3649a8e1175bSopenharmony_ci 3650a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 3651a8e1175bSopenharmony_ci &server_options, NULL, NULL, NULL); 3652a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3653a8e1175bSopenharmony_ci 3654a8e1175bSopenharmony_ci mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf, 3655a8e1175bSopenharmony_ci mbedtls_test_ticket_write, 3656a8e1175bSopenharmony_ci mbedtls_test_ticket_parse, 3657a8e1175bSopenharmony_ci NULL); 3658a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3659a8e1175bSopenharmony_ci 3660a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 3661a8e1175bSopenharmony_ci &(server_ep.socket), 1024); 3662a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3663a8e1175bSopenharmony_ci 3664a8e1175bSopenharmony_ci ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session); 3665a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3666a8e1175bSopenharmony_ci 3667a8e1175bSopenharmony_ci /* 3668a8e1175bSopenharmony_ci * Handshake with ticket. 3669a8e1175bSopenharmony_ci * 3670a8e1175bSopenharmony_ci * Run the handshake up to MBEDTLS_SSL_HANDSHAKE_WRAPUP and not 3671a8e1175bSopenharmony_ci * MBEDTLS_SSL_HANDSHAKE_OVER to preserve handshake data for the checks 3672a8e1175bSopenharmony_ci * below. 3673a8e1175bSopenharmony_ci */ 3674a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 3675a8e1175bSopenharmony_ci &(server_ep.ssl), &(client_ep.ssl), 3676a8e1175bSopenharmony_ci MBEDTLS_SSL_HANDSHAKE_WRAPUP), 0); 3677a8e1175bSopenharmony_ci 3678a8e1175bSopenharmony_ci TEST_EQUAL(server_ep.ssl.handshake->resume, 1); 3679a8e1175bSopenharmony_ci TEST_EQUAL(server_ep.ssl.handshake->new_session_tickets_count, 1); 3680a8e1175bSopenharmony_ci TEST_EQUAL(server_ep.ssl.handshake->key_exchange_mode, 3681a8e1175bSopenharmony_ci MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL); 3682a8e1175bSopenharmony_ci 3683a8e1175bSopenharmony_ciexit: 3684a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 3685a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 3686a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 3687a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 3688a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&saved_session); 3689a8e1175bSopenharmony_ci PSA_DONE(); 3690a8e1175bSopenharmony_ci} 3691a8e1175bSopenharmony_ci/* END_CASE */ 3692a8e1175bSopenharmony_ci 3693a8e1175bSopenharmony_ci/* 3694a8e1175bSopenharmony_ci * The !MBEDTLS_SSL_PROTO_TLS1_2 dependency of tls13_read_early_data() below is 3695a8e1175bSopenharmony_ci * a temporary workaround to not run the test in Windows-2013 where there is 3696a8e1175bSopenharmony_ci * an issue with mbedtls_vsnprintf(). 3697a8e1175bSopenharmony_ci */ 3698a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:!MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_DEBUG_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */ 3699a8e1175bSopenharmony_civoid tls13_read_early_data(int scenario) 3700a8e1175bSopenharmony_ci{ 3701a8e1175bSopenharmony_ci int ret = -1; 3702a8e1175bSopenharmony_ci unsigned char buf[64]; 3703a8e1175bSopenharmony_ci const char *early_data = "This is early data."; 3704a8e1175bSopenharmony_ci size_t early_data_len = strlen(early_data); 3705a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client_ep, server_ep; 3706a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options; 3707a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options server_options; 3708a8e1175bSopenharmony_ci mbedtls_ssl_session saved_session; 3709a8e1175bSopenharmony_ci mbedtls_test_ssl_log_pattern server_pattern = { NULL, 0 }; 3710a8e1175bSopenharmony_ci uint16_t group_list[3] = { 3711a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 3712a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, 3713a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE 3714a8e1175bSopenharmony_ci }; 3715a8e1175bSopenharmony_ci 3716a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 3717a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 3718a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 3719a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 3720a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&saved_session); 3721a8e1175bSopenharmony_ci 3722a8e1175bSopenharmony_ci PSA_INIT(); 3723a8e1175bSopenharmony_ci 3724a8e1175bSopenharmony_ci /* 3725a8e1175bSopenharmony_ci * Run first handshake to get a ticket from the server. 3726a8e1175bSopenharmony_ci */ 3727a8e1175bSopenharmony_ci 3728a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 3729a8e1175bSopenharmony_ci client_options.group_list = group_list; 3730a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 3731a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 3732a8e1175bSopenharmony_ci server_options.group_list = group_list; 3733a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 3734a8e1175bSopenharmony_ci 3735a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) 3736a8e1175bSopenharmony_ci switch (scenario) { 3737a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SAME_ALPN: 3738a8e1175bSopenharmony_ci case TEST_EARLY_DATA_DIFF_ALPN: 3739a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_LATER_ALPN: 3740a8e1175bSopenharmony_ci client_options.alpn_list[0] = "ALPNExample"; 3741a8e1175bSopenharmony_ci client_options.alpn_list[1] = NULL; 3742a8e1175bSopenharmony_ci server_options.alpn_list[0] = "ALPNExample"; 3743a8e1175bSopenharmony_ci server_options.alpn_list[1] = NULL; 3744a8e1175bSopenharmony_ci break; 3745a8e1175bSopenharmony_ci } 3746a8e1175bSopenharmony_ci#endif 3747a8e1175bSopenharmony_ci 3748a8e1175bSopenharmony_ci ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options, 3749a8e1175bSopenharmony_ci &saved_session); 3750a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3751a8e1175bSopenharmony_ci 3752a8e1175bSopenharmony_ci /* 3753a8e1175bSopenharmony_ci * Prepare for handshake with the ticket. 3754a8e1175bSopenharmony_ci */ 3755a8e1175bSopenharmony_ci switch (scenario) { 3756a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 3757a8e1175bSopenharmony_ci break; 3758a8e1175bSopenharmony_ci 3759a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 3760a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED; 3761a8e1175bSopenharmony_ci break; 3762a8e1175bSopenharmony_ci 3763a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 3764a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(3); 3765a8e1175bSopenharmony_ci server_pattern.pattern = 3766a8e1175bSopenharmony_ci "EarlyData: deprotect and discard app data records."; 3767a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED; 3768a8e1175bSopenharmony_ci break; 3769a8e1175bSopenharmony_ci 3770a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 3771a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(3); 3772a8e1175bSopenharmony_ci server_pattern.pattern = 3773a8e1175bSopenharmony_ci "EarlyData: Ignore application message before 2nd ClientHello"; 3774a8e1175bSopenharmony_ci server_options.group_list = group_list + 1; 3775a8e1175bSopenharmony_ci break; 3776a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) 3777a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SAME_ALPN: 3778a8e1175bSopenharmony_ci client_options.alpn_list[0] = "ALPNExample"; 3779a8e1175bSopenharmony_ci client_options.alpn_list[1] = NULL; 3780a8e1175bSopenharmony_ci server_options.alpn_list[0] = "ALPNExample"; 3781a8e1175bSopenharmony_ci server_options.alpn_list[1] = NULL; 3782a8e1175bSopenharmony_ci break; 3783a8e1175bSopenharmony_ci case TEST_EARLY_DATA_DIFF_ALPN: 3784a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INITIAL_ALPN: 3785a8e1175bSopenharmony_ci client_options.alpn_list[0] = "ALPNExample2"; 3786a8e1175bSopenharmony_ci client_options.alpn_list[1] = NULL; 3787a8e1175bSopenharmony_ci server_options.alpn_list[0] = "ALPNExample2"; 3788a8e1175bSopenharmony_ci server_options.alpn_list[1] = NULL; 3789a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(3); 3790a8e1175bSopenharmony_ci server_pattern.pattern = 3791a8e1175bSopenharmony_ci "EarlyData: rejected, the selected ALPN is different " 3792a8e1175bSopenharmony_ci "from the one associated with the pre-shared key."; 3793a8e1175bSopenharmony_ci break; 3794a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_LATER_ALPN: 3795a8e1175bSopenharmony_ci client_options.alpn_list[0] = NULL; 3796a8e1175bSopenharmony_ci server_options.alpn_list[0] = NULL; 3797a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(3); 3798a8e1175bSopenharmony_ci server_pattern.pattern = 3799a8e1175bSopenharmony_ci "EarlyData: rejected, the selected ALPN is different " 3800a8e1175bSopenharmony_ci "from the one associated with the pre-shared key."; 3801a8e1175bSopenharmony_ci break; 3802a8e1175bSopenharmony_ci#endif 3803a8e1175bSopenharmony_ci 3804a8e1175bSopenharmony_ci default: 3805a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 3806a8e1175bSopenharmony_ci } 3807a8e1175bSopenharmony_ci 3808a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 3809a8e1175bSopenharmony_ci &client_options, NULL, NULL, NULL); 3810a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3811a8e1175bSopenharmony_ci 3812a8e1175bSopenharmony_ci server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer; 3813a8e1175bSopenharmony_ci server_options.srv_log_obj = &server_pattern; 3814a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 3815a8e1175bSopenharmony_ci &server_options, NULL, NULL, NULL); 3816a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3817a8e1175bSopenharmony_ci 3818a8e1175bSopenharmony_ci mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf, 3819a8e1175bSopenharmony_ci mbedtls_test_ticket_write, 3820a8e1175bSopenharmony_ci mbedtls_test_ticket_parse, 3821a8e1175bSopenharmony_ci NULL); 3822a8e1175bSopenharmony_ci 3823a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 3824a8e1175bSopenharmony_ci &(server_ep.socket), 1024); 3825a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3826a8e1175bSopenharmony_ci 3827a8e1175bSopenharmony_ci ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session); 3828a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3829a8e1175bSopenharmony_ci 3830a8e1175bSopenharmony_ci /* 3831a8e1175bSopenharmony_ci * Handshake with ticket and send early data. 3832a8e1175bSopenharmony_ci */ 3833a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 3834a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), 3835a8e1175bSopenharmony_ci MBEDTLS_SSL_SERVER_HELLO), 0); 3836a8e1175bSopenharmony_ci 3837a8e1175bSopenharmony_ci ret = mbedtls_ssl_write_early_data(&(client_ep.ssl), 3838a8e1175bSopenharmony_ci (unsigned char *) early_data, 3839a8e1175bSopenharmony_ci early_data_len); 3840a8e1175bSopenharmony_ci 3841a8e1175bSopenharmony_ci if (client_ep.ssl.early_data_state != 3842a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT) { 3843a8e1175bSopenharmony_ci TEST_EQUAL(ret, early_data_len); 3844a8e1175bSopenharmony_ci } else { 3845a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 3846a8e1175bSopenharmony_ci } 3847a8e1175bSopenharmony_ci 3848a8e1175bSopenharmony_ci ret = mbedtls_test_move_handshake_to_state( 3849a8e1175bSopenharmony_ci &(server_ep.ssl), &(client_ep.ssl), 3850a8e1175bSopenharmony_ci MBEDTLS_SSL_HANDSHAKE_WRAPUP); 3851a8e1175bSopenharmony_ci 3852a8e1175bSopenharmony_ci switch (scenario) { 3853a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 3854a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) 3855a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SAME_ALPN: 3856a8e1175bSopenharmony_ci#endif 3857a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA); 3858a8e1175bSopenharmony_ci TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 1); 3859a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_read_early_data(&(server_ep.ssl), 3860a8e1175bSopenharmony_ci buf, sizeof(buf)), early_data_len); 3861a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(buf, early_data_len, early_data, early_data_len); 3862a8e1175bSopenharmony_ci break; 3863a8e1175bSopenharmony_ci 3864a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 3865a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3866a8e1175bSopenharmony_ci TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 0); 3867a8e1175bSopenharmony_ci break; 3868a8e1175bSopenharmony_ci 3869a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 3870a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 3871a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) 3872a8e1175bSopenharmony_ci case TEST_EARLY_DATA_DIFF_ALPN: 3873a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INITIAL_ALPN: 3874a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_LATER_ALPN: 3875a8e1175bSopenharmony_ci#endif 3876a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3877a8e1175bSopenharmony_ci TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 0); 3878a8e1175bSopenharmony_ci TEST_EQUAL(server_pattern.counter, 1); 3879a8e1175bSopenharmony_ci break; 3880a8e1175bSopenharmony_ci 3881a8e1175bSopenharmony_ci default: 3882a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 3883a8e1175bSopenharmony_ci } 3884a8e1175bSopenharmony_ci 3885a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 3886a8e1175bSopenharmony_ci &(server_ep.ssl), &(client_ep.ssl), 3887a8e1175bSopenharmony_ci MBEDTLS_SSL_HANDSHAKE_OVER), 0); 3888a8e1175bSopenharmony_ci 3889a8e1175bSopenharmony_ciexit: 3890a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 3891a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 3892a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 3893a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 3894a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&saved_session); 3895a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(0); 3896a8e1175bSopenharmony_ci PSA_DONE(); 3897a8e1175bSopenharmony_ci} 3898a8e1175bSopenharmony_ci/* END_CASE */ 3899a8e1175bSopenharmony_ci 3900a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */ 3901a8e1175bSopenharmony_civoid tls13_cli_early_data_state(int scenario) 3902a8e1175bSopenharmony_ci{ 3903a8e1175bSopenharmony_ci int ret = -1; 3904a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client_ep, server_ep; 3905a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options; 3906a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options server_options; 3907a8e1175bSopenharmony_ci mbedtls_ssl_session saved_session; 3908a8e1175bSopenharmony_ci uint16_t group_list[3] = { 3909a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 3910a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, 3911a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE 3912a8e1175bSopenharmony_ci }; 3913a8e1175bSopenharmony_ci uint8_t client_random[MBEDTLS_CLIENT_HELLO_RANDOM_LEN]; 3914a8e1175bSopenharmony_ci 3915a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 3916a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 3917a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 3918a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 3919a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&saved_session); 3920a8e1175bSopenharmony_ci 3921a8e1175bSopenharmony_ci PSA_INIT(); 3922a8e1175bSopenharmony_ci 3923a8e1175bSopenharmony_ci /* 3924a8e1175bSopenharmony_ci * Run first handshake to get a ticket from the server. 3925a8e1175bSopenharmony_ci */ 3926a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 3927a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 3928a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 3929a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 3930a8e1175bSopenharmony_ci if (scenario == TEST_EARLY_DATA_HRR) { 3931a8e1175bSopenharmony_ci client_options.group_list = group_list; 3932a8e1175bSopenharmony_ci server_options.group_list = group_list; 3933a8e1175bSopenharmony_ci } 3934a8e1175bSopenharmony_ci 3935a8e1175bSopenharmony_ci ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options, 3936a8e1175bSopenharmony_ci &saved_session); 3937a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3938a8e1175bSopenharmony_ci 3939a8e1175bSopenharmony_ci /* 3940a8e1175bSopenharmony_ci * Prepare for handshake with the ticket. 3941a8e1175bSopenharmony_ci */ 3942a8e1175bSopenharmony_ci switch (scenario) { 3943a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 3944a8e1175bSopenharmony_ci break; 3945a8e1175bSopenharmony_ci 3946a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 3947a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED; 3948a8e1175bSopenharmony_ci break; 3949a8e1175bSopenharmony_ci 3950a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 3951a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED; 3952a8e1175bSopenharmony_ci break; 3953a8e1175bSopenharmony_ci 3954a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 3955a8e1175bSopenharmony_ci server_options.group_list = group_list + 1; 3956a8e1175bSopenharmony_ci break; 3957a8e1175bSopenharmony_ci 3958a8e1175bSopenharmony_ci default: 3959a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 3960a8e1175bSopenharmony_ci } 3961a8e1175bSopenharmony_ci 3962a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 3963a8e1175bSopenharmony_ci &client_options, NULL, NULL, NULL); 3964a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3965a8e1175bSopenharmony_ci 3966a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 3967a8e1175bSopenharmony_ci &server_options, NULL, NULL, NULL); 3968a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3969a8e1175bSopenharmony_ci 3970a8e1175bSopenharmony_ci mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf, 3971a8e1175bSopenharmony_ci mbedtls_test_ticket_write, 3972a8e1175bSopenharmony_ci mbedtls_test_ticket_parse, 3973a8e1175bSopenharmony_ci NULL); 3974a8e1175bSopenharmony_ci 3975a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 3976a8e1175bSopenharmony_ci &(server_ep.socket), 1024); 3977a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3978a8e1175bSopenharmony_ci 3979a8e1175bSopenharmony_ci ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session); 3980a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 3981a8e1175bSopenharmony_ci 3982a8e1175bSopenharmony_ci /* 3983a8e1175bSopenharmony_ci * Go through the handshake sequence, state by state, checking the early 3984a8e1175bSopenharmony_ci * data status each time. 3985a8e1175bSopenharmony_ci */ 3986a8e1175bSopenharmony_ci do { 3987a8e1175bSopenharmony_ci int state = client_ep.ssl.state; 3988a8e1175bSopenharmony_ci 3989a8e1175bSopenharmony_ci /* Progress the handshake from at least one state */ 3990a8e1175bSopenharmony_ci while (client_ep.ssl.state == state) { 3991a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake_step(&(client_ep.ssl)); 3992a8e1175bSopenharmony_ci TEST_ASSERT((ret == 0) || 3993a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_READ) || 3994a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_WRITE)); 3995a8e1175bSopenharmony_ci if (client_ep.ssl.state != state) { 3996a8e1175bSopenharmony_ci break; 3997a8e1175bSopenharmony_ci } 3998a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake_step(&(server_ep.ssl)); 3999a8e1175bSopenharmony_ci TEST_ASSERT((ret == 0) || 4000a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_READ) || 4001a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_WRITE)); 4002a8e1175bSopenharmony_ci } 4003a8e1175bSopenharmony_ci 4004a8e1175bSopenharmony_ci if (client_ep.ssl.state != MBEDTLS_SSL_HANDSHAKE_OVER) { 4005a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_ssl_get_early_data_status(&(client_ep.ssl)), 4006a8e1175bSopenharmony_ci MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 4007a8e1175bSopenharmony_ci } 4008a8e1175bSopenharmony_ci 4009a8e1175bSopenharmony_ci switch (client_ep.ssl.state) { 4010a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_HELLO: 4011a8e1175bSopenharmony_ci switch (scenario) { 4012a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4013a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: /* Intentional fallthrough */ 4014a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4015a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4016a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_IDLE); 4017a8e1175bSopenharmony_ci break; 4018a8e1175bSopenharmony_ci 4019a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4020a8e1175bSopenharmony_ci if (!client_ep.ssl.handshake->hello_retry_request_flag) { 4021a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4022a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_IDLE); 4023a8e1175bSopenharmony_ci } else { 4024a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4025a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4026a8e1175bSopenharmony_ci } 4027a8e1175bSopenharmony_ci break; 4028a8e1175bSopenharmony_ci 4029a8e1175bSopenharmony_ci default: 4030a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4031a8e1175bSopenharmony_ci } 4032a8e1175bSopenharmony_ci break; 4033a8e1175bSopenharmony_ci 4034a8e1175bSopenharmony_ci case MBEDTLS_SSL_SERVER_HELLO: 4035a8e1175bSopenharmony_ci switch (scenario) { 4036a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4037a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4038a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4039a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE); 4040a8e1175bSopenharmony_ci break; 4041a8e1175bSopenharmony_ci 4042a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4043a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4044a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4045a8e1175bSopenharmony_ci break; 4046a8e1175bSopenharmony_ci 4047a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4048a8e1175bSopenharmony_ci if (!client_ep.ssl.handshake->hello_retry_request_flag) { 4049a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4050a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE); 4051a8e1175bSopenharmony_ci memcpy(client_random, 4052a8e1175bSopenharmony_ci client_ep.ssl.handshake->randbytes, 4053a8e1175bSopenharmony_ci MBEDTLS_CLIENT_HELLO_RANDOM_LEN); 4054a8e1175bSopenharmony_ci } else { 4055a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4056a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4057a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(client_random, 4058a8e1175bSopenharmony_ci MBEDTLS_CLIENT_HELLO_RANDOM_LEN, 4059a8e1175bSopenharmony_ci client_ep.ssl.handshake->randbytes, 4060a8e1175bSopenharmony_ci MBEDTLS_CLIENT_HELLO_RANDOM_LEN); 4061a8e1175bSopenharmony_ci } 4062a8e1175bSopenharmony_ci break; 4063a8e1175bSopenharmony_ci 4064a8e1175bSopenharmony_ci default: 4065a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4066a8e1175bSopenharmony_ci } 4067a8e1175bSopenharmony_ci break; 4068a8e1175bSopenharmony_ci 4069a8e1175bSopenharmony_ci case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS: 4070a8e1175bSopenharmony_ci switch (scenario) { 4071a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4072a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4073a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4074a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE); 4075a8e1175bSopenharmony_ci break; 4076a8e1175bSopenharmony_ci 4077a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4078a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4079a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4080a8e1175bSopenharmony_ci break; 4081a8e1175bSopenharmony_ci 4082a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4083a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4084a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4085a8e1175bSopenharmony_ci break; 4086a8e1175bSopenharmony_ci 4087a8e1175bSopenharmony_ci default: 4088a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4089a8e1175bSopenharmony_ci } 4090a8e1175bSopenharmony_ci break; 4091a8e1175bSopenharmony_ci 4092a8e1175bSopenharmony_ci case MBEDTLS_SSL_SERVER_FINISHED: 4093a8e1175bSopenharmony_ci switch (scenario) { 4094a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4095a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4096a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_ACCEPTED); 4097a8e1175bSopenharmony_ci break; 4098a8e1175bSopenharmony_ci 4099a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4100a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4101a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4102a8e1175bSopenharmony_ci break; 4103a8e1175bSopenharmony_ci 4104a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4105a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4106a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4107a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4108a8e1175bSopenharmony_ci break; 4109a8e1175bSopenharmony_ci 4110a8e1175bSopenharmony_ci default: 4111a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4112a8e1175bSopenharmony_ci } 4113a8e1175bSopenharmony_ci break; 4114a8e1175bSopenharmony_ci 4115a8e1175bSopenharmony_ci case MBEDTLS_SSL_END_OF_EARLY_DATA: 4116a8e1175bSopenharmony_ci TEST_EQUAL(scenario, TEST_EARLY_DATA_ACCEPTED); 4117a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4118a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED); 4119a8e1175bSopenharmony_ci break; 4120a8e1175bSopenharmony_ci 4121a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CERTIFICATE: 4122a8e1175bSopenharmony_ci switch (scenario) { 4123a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4124a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4125a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED); 4126a8e1175bSopenharmony_ci break; 4127a8e1175bSopenharmony_ci 4128a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4129a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4130a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4131a8e1175bSopenharmony_ci break; 4132a8e1175bSopenharmony_ci 4133a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4134a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4135a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4136a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4137a8e1175bSopenharmony_ci break; 4138a8e1175bSopenharmony_ci 4139a8e1175bSopenharmony_ci default: 4140a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4141a8e1175bSopenharmony_ci } 4142a8e1175bSopenharmony_ci break; 4143a8e1175bSopenharmony_ci 4144a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_FINISHED: 4145a8e1175bSopenharmony_ci switch (scenario) { 4146a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4147a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4148a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED); 4149a8e1175bSopenharmony_ci break; 4150a8e1175bSopenharmony_ci 4151a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4152a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4153a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4154a8e1175bSopenharmony_ci break; 4155a8e1175bSopenharmony_ci 4156a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4157a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4158a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4159a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4160a8e1175bSopenharmony_ci break; 4161a8e1175bSopenharmony_ci 4162a8e1175bSopenharmony_ci default: 4163a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4164a8e1175bSopenharmony_ci } 4165a8e1175bSopenharmony_ci break; 4166a8e1175bSopenharmony_ci 4167a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 4168a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO: 4169a8e1175bSopenharmony_ci switch (scenario) { 4170a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4171a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4172a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4173a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4174a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_IND_SENT); 4175a8e1175bSopenharmony_ci break; 4176a8e1175bSopenharmony_ci 4177a8e1175bSopenharmony_ci default: 4178a8e1175bSopenharmony_ci TEST_FAIL("Unexpected or unknown scenario."); 4179a8e1175bSopenharmony_ci } 4180a8e1175bSopenharmony_ci break; 4181a8e1175bSopenharmony_ci 4182a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO: 4183a8e1175bSopenharmony_ci TEST_ASSERT(scenario == TEST_EARLY_DATA_HRR); 4184a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4185a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4186a8e1175bSopenharmony_ci break; 4187a8e1175bSopenharmony_ci 4188a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED: 4189a8e1175bSopenharmony_ci switch (scenario) { 4190a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4191a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4192a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4193a8e1175bSopenharmony_ci break; 4194a8e1175bSopenharmony_ci 4195a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4196a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4197a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4198a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4199a8e1175bSopenharmony_ci break; 4200a8e1175bSopenharmony_ci 4201a8e1175bSopenharmony_ci default: 4202a8e1175bSopenharmony_ci TEST_FAIL("Unexpected or unknown scenario."); 4203a8e1175bSopenharmony_ci } 4204a8e1175bSopenharmony_ci break; 4205a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */ 4206a8e1175bSopenharmony_ci 4207a8e1175bSopenharmony_ci case MBEDTLS_SSL_FLUSH_BUFFERS: /* Intentional fallthrough */ 4208a8e1175bSopenharmony_ci case MBEDTLS_SSL_HANDSHAKE_WRAPUP: /* Intentional fallthrough */ 4209a8e1175bSopenharmony_ci case MBEDTLS_SSL_HANDSHAKE_OVER: 4210a8e1175bSopenharmony_ci switch (scenario) { 4211a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4212a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4213a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED); 4214a8e1175bSopenharmony_ci break; 4215a8e1175bSopenharmony_ci 4216a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4217a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4218a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4219a8e1175bSopenharmony_ci break; 4220a8e1175bSopenharmony_ci 4221a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4222a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4223a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4224a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED); 4225a8e1175bSopenharmony_ci break; 4226a8e1175bSopenharmony_ci 4227a8e1175bSopenharmony_ci default: 4228a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4229a8e1175bSopenharmony_ci } 4230a8e1175bSopenharmony_ci break; 4231a8e1175bSopenharmony_ci 4232a8e1175bSopenharmony_ci default: 4233a8e1175bSopenharmony_ci TEST_FAIL("Unexpected state."); 4234a8e1175bSopenharmony_ci } 4235a8e1175bSopenharmony_ci } while (client_ep.ssl.state != MBEDTLS_SSL_HANDSHAKE_OVER); 4236a8e1175bSopenharmony_ci 4237a8e1175bSopenharmony_ci ret = mbedtls_ssl_get_early_data_status(&(client_ep.ssl)); 4238a8e1175bSopenharmony_ci switch (scenario) { 4239a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4240a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED); 4241a8e1175bSopenharmony_ci break; 4242a8e1175bSopenharmony_ci 4243a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4244a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_INDICATED); 4245a8e1175bSopenharmony_ci break; 4246a8e1175bSopenharmony_ci 4247a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4248a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4249a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED); 4250a8e1175bSopenharmony_ci break; 4251a8e1175bSopenharmony_ci 4252a8e1175bSopenharmony_ci default: 4253a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4254a8e1175bSopenharmony_ci } 4255a8e1175bSopenharmony_ci 4256a8e1175bSopenharmony_ci ret = mbedtls_ssl_get_early_data_status(&(server_ep.ssl)); 4257a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 4258a8e1175bSopenharmony_ci 4259a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 4260a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.handshake->ccs_sent, 1); 4261a8e1175bSopenharmony_ci#endif 4262a8e1175bSopenharmony_ci 4263a8e1175bSopenharmony_ciexit: 4264a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 4265a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 4266a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 4267a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 4268a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&saved_session); 4269a8e1175bSopenharmony_ci PSA_DONE(); 4270a8e1175bSopenharmony_ci} 4271a8e1175bSopenharmony_ci/* END_CASE */ 4272a8e1175bSopenharmony_ci 4273a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */ 4274a8e1175bSopenharmony_civoid tls13_write_early_data(int scenario) 4275a8e1175bSopenharmony_ci{ 4276a8e1175bSopenharmony_ci int ret = -1; 4277a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client_ep, server_ep; 4278a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options; 4279a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options server_options; 4280a8e1175bSopenharmony_ci mbedtls_ssl_session saved_session; 4281a8e1175bSopenharmony_ci uint16_t group_list[3] = { 4282a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 4283a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, 4284a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE 4285a8e1175bSopenharmony_ci }; 4286a8e1175bSopenharmony_ci int beyond_first_hello = 0; 4287a8e1175bSopenharmony_ci 4288a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 4289a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 4290a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 4291a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 4292a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&saved_session); 4293a8e1175bSopenharmony_ci 4294a8e1175bSopenharmony_ci PSA_INIT(); 4295a8e1175bSopenharmony_ci 4296a8e1175bSopenharmony_ci /* 4297a8e1175bSopenharmony_ci * Run first handshake to get a ticket from the server. 4298a8e1175bSopenharmony_ci */ 4299a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 4300a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 4301a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 4302a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 4303a8e1175bSopenharmony_ci if (scenario == TEST_EARLY_DATA_HRR) { 4304a8e1175bSopenharmony_ci client_options.group_list = group_list; 4305a8e1175bSopenharmony_ci server_options.group_list = group_list; 4306a8e1175bSopenharmony_ci } 4307a8e1175bSopenharmony_ci 4308a8e1175bSopenharmony_ci ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options, 4309a8e1175bSopenharmony_ci &saved_session); 4310a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4311a8e1175bSopenharmony_ci 4312a8e1175bSopenharmony_ci /* 4313a8e1175bSopenharmony_ci * Prepare for handshake with the ticket. 4314a8e1175bSopenharmony_ci */ 4315a8e1175bSopenharmony_ci switch (scenario) { 4316a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4317a8e1175bSopenharmony_ci break; 4318a8e1175bSopenharmony_ci 4319a8e1175bSopenharmony_ci case TEST_EARLY_DATA_NO_INDICATION_SENT: 4320a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED; 4321a8e1175bSopenharmony_ci break; 4322a8e1175bSopenharmony_ci 4323a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4324a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED; 4325a8e1175bSopenharmony_ci break; 4326a8e1175bSopenharmony_ci 4327a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4328a8e1175bSopenharmony_ci /* 4329a8e1175bSopenharmony_ci * Remove server support for the group negotiated in 4330a8e1175bSopenharmony_ci * mbedtls_test_get_tls13_ticket() forcing a HelloRetryRequest. 4331a8e1175bSopenharmony_ci */ 4332a8e1175bSopenharmony_ci server_options.group_list = group_list + 1; 4333a8e1175bSopenharmony_ci break; 4334a8e1175bSopenharmony_ci 4335a8e1175bSopenharmony_ci default: 4336a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4337a8e1175bSopenharmony_ci } 4338a8e1175bSopenharmony_ci 4339a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 4340a8e1175bSopenharmony_ci &client_options, NULL, NULL, NULL); 4341a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4342a8e1175bSopenharmony_ci 4343a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 4344a8e1175bSopenharmony_ci &server_options, NULL, NULL, NULL); 4345a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4346a8e1175bSopenharmony_ci 4347a8e1175bSopenharmony_ci mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf, 4348a8e1175bSopenharmony_ci mbedtls_test_ticket_write, 4349a8e1175bSopenharmony_ci mbedtls_test_ticket_parse, 4350a8e1175bSopenharmony_ci NULL); 4351a8e1175bSopenharmony_ci 4352a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 4353a8e1175bSopenharmony_ci &(server_ep.socket), 1024); 4354a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4355a8e1175bSopenharmony_ci 4356a8e1175bSopenharmony_ci ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session); 4357a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4358a8e1175bSopenharmony_ci 4359a8e1175bSopenharmony_ci /* 4360a8e1175bSopenharmony_ci * Run handshakes going one state further in the handshake sequence at each 4361a8e1175bSopenharmony_ci * loop up to the point where we reach the MBEDTLS_SSL_HANDSHAKE_OVER 4362a8e1175bSopenharmony_ci * state. For each reached handshake state, check the result of the call 4363a8e1175bSopenharmony_ci * to mbedtls_ssl_write_early_data(), make sure we can complete the 4364a8e1175bSopenharmony_ci * handshake successfully and then reset the connection to restart the 4365a8e1175bSopenharmony_ci * handshake from scratch. 4366a8e1175bSopenharmony_ci */ 4367a8e1175bSopenharmony_ci do { 4368a8e1175bSopenharmony_ci int client_state = client_ep.ssl.state; 4369a8e1175bSopenharmony_ci int previous_client_state; 4370a8e1175bSopenharmony_ci const char *early_data_string = "This is early data."; 4371a8e1175bSopenharmony_ci const unsigned char *early_data = (const unsigned char *) early_data_string; 4372a8e1175bSopenharmony_ci size_t early_data_len = strlen(early_data_string); 4373a8e1175bSopenharmony_ci int write_early_data_ret, read_early_data_ret; 4374a8e1175bSopenharmony_ci unsigned char read_buf[64]; 4375a8e1175bSopenharmony_ci 4376a8e1175bSopenharmony_ci write_early_data_ret = mbedtls_ssl_write_early_data(&(client_ep.ssl), 4377a8e1175bSopenharmony_ci early_data, 4378a8e1175bSopenharmony_ci early_data_len); 4379a8e1175bSopenharmony_ci 4380a8e1175bSopenharmony_ci if (scenario == TEST_EARLY_DATA_NO_INDICATION_SENT) { 4381a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4382a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, client_state); 4383a8e1175bSopenharmony_ci goto complete_handshake; 4384a8e1175bSopenharmony_ci } 4385a8e1175bSopenharmony_ci 4386a8e1175bSopenharmony_ci switch (client_state) { 4387a8e1175bSopenharmony_ci case MBEDTLS_SSL_HELLO_REQUEST: /* Intentional fallthrough */ 4388a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_HELLO: 4389a8e1175bSopenharmony_ci switch (scenario) { 4390a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4391a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4392a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, early_data_len); 4393a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO); 4394a8e1175bSopenharmony_ci break; 4395a8e1175bSopenharmony_ci 4396a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4397a8e1175bSopenharmony_ci if (!client_ep.ssl.handshake->hello_retry_request_flag) { 4398a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, early_data_len); 4399a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO); 4400a8e1175bSopenharmony_ci } else { 4401a8e1175bSopenharmony_ci beyond_first_hello = 1; 4402a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, 4403a8e1175bSopenharmony_ci MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4404a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_CLIENT_HELLO); 4405a8e1175bSopenharmony_ci } 4406a8e1175bSopenharmony_ci break; 4407a8e1175bSopenharmony_ci 4408a8e1175bSopenharmony_ci default: 4409a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4410a8e1175bSopenharmony_ci } 4411a8e1175bSopenharmony_ci break; 4412a8e1175bSopenharmony_ci 4413a8e1175bSopenharmony_ci case MBEDTLS_SSL_SERVER_HELLO: 4414a8e1175bSopenharmony_ci switch (scenario) { 4415a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4416a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4417a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, early_data_len); 4418a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO); 4419a8e1175bSopenharmony_ci break; 4420a8e1175bSopenharmony_ci 4421a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4422a8e1175bSopenharmony_ci if (!client_ep.ssl.handshake->hello_retry_request_flag) { 4423a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, early_data_len); 4424a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO); 4425a8e1175bSopenharmony_ci } else { 4426a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, 4427a8e1175bSopenharmony_ci MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4428a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO); 4429a8e1175bSopenharmony_ci } 4430a8e1175bSopenharmony_ci break; 4431a8e1175bSopenharmony_ci 4432a8e1175bSopenharmony_ci default: 4433a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4434a8e1175bSopenharmony_ci } 4435a8e1175bSopenharmony_ci break; 4436a8e1175bSopenharmony_ci 4437a8e1175bSopenharmony_ci case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS: 4438a8e1175bSopenharmony_ci switch (scenario) { 4439a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4440a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4441a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, early_data_len); 4442a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS); 4443a8e1175bSopenharmony_ci break; 4444a8e1175bSopenharmony_ci 4445a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4446a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4447a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS); 4448a8e1175bSopenharmony_ci break; 4449a8e1175bSopenharmony_ci 4450a8e1175bSopenharmony_ci default: 4451a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4452a8e1175bSopenharmony_ci } 4453a8e1175bSopenharmony_ci break; 4454a8e1175bSopenharmony_ci 4455a8e1175bSopenharmony_ci case MBEDTLS_SSL_SERVER_FINISHED: 4456a8e1175bSopenharmony_ci switch (scenario) { 4457a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4458a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, early_data_len); 4459a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED); 4460a8e1175bSopenharmony_ci break; 4461a8e1175bSopenharmony_ci 4462a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4463a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4464a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED); 4465a8e1175bSopenharmony_ci break; 4466a8e1175bSopenharmony_ci 4467a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4468a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4469a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED); 4470a8e1175bSopenharmony_ci break; 4471a8e1175bSopenharmony_ci 4472a8e1175bSopenharmony_ci default: 4473a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4474a8e1175bSopenharmony_ci } 4475a8e1175bSopenharmony_ci break; 4476a8e1175bSopenharmony_ci 4477a8e1175bSopenharmony_ci case MBEDTLS_SSL_END_OF_EARLY_DATA: 4478a8e1175bSopenharmony_ci TEST_EQUAL(scenario, TEST_EARLY_DATA_ACCEPTED); 4479a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4480a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_END_OF_EARLY_DATA); 4481a8e1175bSopenharmony_ci break; 4482a8e1175bSopenharmony_ci 4483a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 4484a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO: 4485a8e1175bSopenharmony_ci switch (scenario) { 4486a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4487a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4488a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4489a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, early_data_len); 4490a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO); 4491a8e1175bSopenharmony_ci break; 4492a8e1175bSopenharmony_ci default: 4493a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4494a8e1175bSopenharmony_ci } 4495a8e1175bSopenharmony_ci break; 4496a8e1175bSopenharmony_ci 4497a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO: 4498a8e1175bSopenharmony_ci TEST_EQUAL(scenario, TEST_EARLY_DATA_HRR); 4499a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4500a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO); 4501a8e1175bSopenharmony_ci break; 4502a8e1175bSopenharmony_ci 4503a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED: 4504a8e1175bSopenharmony_ci switch (scenario) { 4505a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4506a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4507a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, 4508a8e1175bSopenharmony_ci MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4509a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, 4510a8e1175bSopenharmony_ci MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED); 4511a8e1175bSopenharmony_ci break; 4512a8e1175bSopenharmony_ci default: 4513a8e1175bSopenharmony_ci TEST_FAIL("Unexpected or unknown scenario."); 4514a8e1175bSopenharmony_ci } 4515a8e1175bSopenharmony_ci break; 4516a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */ 4517a8e1175bSopenharmony_ci 4518a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_CERTIFICATE: /* Intentional fallthrough */ 4519a8e1175bSopenharmony_ci case MBEDTLS_SSL_CLIENT_FINISHED: /* Intentional fallthrough */ 4520a8e1175bSopenharmony_ci case MBEDTLS_SSL_FLUSH_BUFFERS: /* Intentional fallthrough */ 4521a8e1175bSopenharmony_ci case MBEDTLS_SSL_HANDSHAKE_WRAPUP: /* Intentional fallthrough */ 4522a8e1175bSopenharmony_ci case MBEDTLS_SSL_HANDSHAKE_OVER: 4523a8e1175bSopenharmony_ci switch (scenario) { 4524a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */ 4525a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4526a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4527a8e1175bSopenharmony_ci TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4528a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.state, client_state); 4529a8e1175bSopenharmony_ci break; 4530a8e1175bSopenharmony_ci default: 4531a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4532a8e1175bSopenharmony_ci } 4533a8e1175bSopenharmony_ci break; 4534a8e1175bSopenharmony_ci 4535a8e1175bSopenharmony_ci default: 4536a8e1175bSopenharmony_ci TEST_FAIL("Unexpected state."); 4537a8e1175bSopenharmony_ci } 4538a8e1175bSopenharmony_ci 4539a8e1175bSopenharmony_cicomplete_handshake: 4540a8e1175bSopenharmony_ci do { 4541a8e1175bSopenharmony_ci ret = mbedtls_test_move_handshake_to_state( 4542a8e1175bSopenharmony_ci &(server_ep.ssl), &(client_ep.ssl), 4543a8e1175bSopenharmony_ci MBEDTLS_SSL_HANDSHAKE_OVER); 4544a8e1175bSopenharmony_ci 4545a8e1175bSopenharmony_ci if (ret == MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA) { 4546a8e1175bSopenharmony_ci read_early_data_ret = mbedtls_ssl_read_early_data( 4547a8e1175bSopenharmony_ci &(server_ep.ssl), read_buf, sizeof(read_buf)); 4548a8e1175bSopenharmony_ci 4549a8e1175bSopenharmony_ci TEST_EQUAL(read_early_data_ret, early_data_len); 4550a8e1175bSopenharmony_ci } 4551a8e1175bSopenharmony_ci } while (ret == MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA); 4552a8e1175bSopenharmony_ci 4553a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4554a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 4555a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), 4556a8e1175bSopenharmony_ci MBEDTLS_SSL_HANDSHAKE_OVER), 0); 4557a8e1175bSopenharmony_ci 4558a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&(client_ep.socket)); 4559a8e1175bSopenharmony_ci mbedtls_test_mock_socket_close(&(server_ep.socket)); 4560a8e1175bSopenharmony_ci 4561a8e1175bSopenharmony_ci ret = mbedtls_ssl_session_reset(&(client_ep.ssl)); 4562a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4563a8e1175bSopenharmony_ci 4564a8e1175bSopenharmony_ci ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session); 4565a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4566a8e1175bSopenharmony_ci 4567a8e1175bSopenharmony_ci ret = mbedtls_ssl_session_reset(&(server_ep.ssl)); 4568a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4569a8e1175bSopenharmony_ci 4570a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 4571a8e1175bSopenharmony_ci &(server_ep.socket), 1024); 4572a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4573a8e1175bSopenharmony_ci 4574a8e1175bSopenharmony_ci previous_client_state = client_state; 4575a8e1175bSopenharmony_ci if (previous_client_state == MBEDTLS_SSL_HANDSHAKE_OVER) { 4576a8e1175bSopenharmony_ci break; 4577a8e1175bSopenharmony_ci } 4578a8e1175bSopenharmony_ci 4579a8e1175bSopenharmony_ci /* In case of HRR scenario, once we have been through it, move over 4580a8e1175bSopenharmony_ci * the first ClientHello and ServerHello otherwise we just keep playing 4581a8e1175bSopenharmony_ci * this first part of the handshake with HRR. 4582a8e1175bSopenharmony_ci */ 4583a8e1175bSopenharmony_ci if ((scenario == TEST_EARLY_DATA_HRR) && (beyond_first_hello)) { 4584a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_move_handshake_to_state( 4585a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), 4586a8e1175bSopenharmony_ci MBEDTLS_SSL_SERVER_HELLO) == 0); 4587a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_move_handshake_to_state( 4588a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), 4589a8e1175bSopenharmony_ci MBEDTLS_SSL_CLIENT_HELLO) == 0); 4590a8e1175bSopenharmony_ci } 4591a8e1175bSopenharmony_ci 4592a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 4593a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), 4594a8e1175bSopenharmony_ci previous_client_state), 0); 4595a8e1175bSopenharmony_ci 4596a8e1175bSopenharmony_ci /* Progress the handshake from at least one state */ 4597a8e1175bSopenharmony_ci while (client_ep.ssl.state == previous_client_state) { 4598a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake_step(&(client_ep.ssl)); 4599a8e1175bSopenharmony_ci TEST_ASSERT((ret == 0) || 4600a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_READ) || 4601a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_WRITE)); 4602a8e1175bSopenharmony_ci if (client_ep.ssl.state != previous_client_state) { 4603a8e1175bSopenharmony_ci break; 4604a8e1175bSopenharmony_ci } 4605a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake_step(&(server_ep.ssl)); 4606a8e1175bSopenharmony_ci TEST_ASSERT((ret == 0) || 4607a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_READ) || 4608a8e1175bSopenharmony_ci (ret == MBEDTLS_ERR_SSL_WANT_WRITE)); 4609a8e1175bSopenharmony_ci } 4610a8e1175bSopenharmony_ci } while (1); 4611a8e1175bSopenharmony_ci 4612a8e1175bSopenharmony_ciexit: 4613a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 4614a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 4615a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 4616a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 4617a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&saved_session); 4618a8e1175bSopenharmony_ci PSA_DONE(); 4619a8e1175bSopenharmony_ci} 4620a8e1175bSopenharmony_ci/* END_CASE */ 4621a8e1175bSopenharmony_ci 4622a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_DEBUG_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */ 4623a8e1175bSopenharmony_civoid tls13_cli_max_early_data_size(int max_early_data_size_arg) 4624a8e1175bSopenharmony_ci{ 4625a8e1175bSopenharmony_ci int ret = -1; 4626a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client_ep, server_ep; 4627a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options; 4628a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options server_options; 4629a8e1175bSopenharmony_ci mbedtls_ssl_session saved_session; 4630a8e1175bSopenharmony_ci unsigned char *buf = NULL; 4631a8e1175bSopenharmony_ci uint32_t buf_size = 64; 4632a8e1175bSopenharmony_ci uint32_t max_early_data_size; 4633a8e1175bSopenharmony_ci uint32_t written_early_data_size = 0; 4634a8e1175bSopenharmony_ci uint32_t read_early_data_size = 0; 4635a8e1175bSopenharmony_ci 4636a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 4637a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 4638a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 4639a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 4640a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&saved_session); 4641a8e1175bSopenharmony_ci 4642a8e1175bSopenharmony_ci PSA_INIT(); 4643a8e1175bSopenharmony_ci TEST_CALLOC(buf, buf_size); 4644a8e1175bSopenharmony_ci 4645a8e1175bSopenharmony_ci /* 4646a8e1175bSopenharmony_ci * Run first handshake to get a ticket from the server. 4647a8e1175bSopenharmony_ci */ 4648a8e1175bSopenharmony_ci 4649a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 4650a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 4651a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 4652a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 4653a8e1175bSopenharmony_ci server_options.max_early_data_size = max_early_data_size_arg; 4654a8e1175bSopenharmony_ci 4655a8e1175bSopenharmony_ci ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options, 4656a8e1175bSopenharmony_ci &saved_session); 4657a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4658a8e1175bSopenharmony_ci 4659a8e1175bSopenharmony_ci /* 4660a8e1175bSopenharmony_ci * Prepare for handshake with the ticket. 4661a8e1175bSopenharmony_ci */ 4662a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 4663a8e1175bSopenharmony_ci &client_options, NULL, NULL, NULL); 4664a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4665a8e1175bSopenharmony_ci 4666a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 4667a8e1175bSopenharmony_ci &server_options, NULL, NULL, NULL); 4668a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4669a8e1175bSopenharmony_ci 4670a8e1175bSopenharmony_ci mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf, 4671a8e1175bSopenharmony_ci mbedtls_test_ticket_write, 4672a8e1175bSopenharmony_ci mbedtls_test_ticket_parse, 4673a8e1175bSopenharmony_ci NULL); 4674a8e1175bSopenharmony_ci 4675a8e1175bSopenharmony_ci max_early_data_size = saved_session.max_early_data_size; 4676a8e1175bSopenharmony_ci /* 4677a8e1175bSopenharmony_ci * (max_early_data_size + 1024) for the size of the socket buffers for the 4678a8e1175bSopenharmony_ci * server one to be able to contain the maximum number of early data bytes 4679a8e1175bSopenharmony_ci * plus the first flight of client messages. Needed because we cannot 4680a8e1175bSopenharmony_ci * initiate the handshake on server side before doing all the calls to 4681a8e1175bSopenharmony_ci * mbedtls_ssl_write_early_data() we want to test. See below for more 4682a8e1175bSopenharmony_ci * information. 4683a8e1175bSopenharmony_ci */ 4684a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 4685a8e1175bSopenharmony_ci &(server_ep.socket), 4686a8e1175bSopenharmony_ci max_early_data_size + 1024); 4687a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4688a8e1175bSopenharmony_ci 4689a8e1175bSopenharmony_ci /* If our server is configured with max_early_data_size equal to zero, it 4690a8e1175bSopenharmony_ci * does not set the MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA flag for 4691a8e1175bSopenharmony_ci * the tickets it creates. To be able to test early data with a ticket 4692a8e1175bSopenharmony_ci * allowing early data in its flags but with max_early_data_size equal to 4693a8e1175bSopenharmony_ci * zero (case supported by our client) tweak the ticket flags here. 4694a8e1175bSopenharmony_ci */ 4695a8e1175bSopenharmony_ci if (max_early_data_size == 0) { 4696a8e1175bSopenharmony_ci saved_session.ticket_flags |= MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA; 4697a8e1175bSopenharmony_ci } 4698a8e1175bSopenharmony_ci 4699a8e1175bSopenharmony_ci ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session); 4700a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4701a8e1175bSopenharmony_ci 4702a8e1175bSopenharmony_ci while (written_early_data_size < max_early_data_size) { 4703a8e1175bSopenharmony_ci uint32_t remaining = max_early_data_size - written_early_data_size; 4704a8e1175bSopenharmony_ci 4705a8e1175bSopenharmony_ci for (size_t i = 0; i < buf_size; i++) { 4706a8e1175bSopenharmony_ci buf[i] = (unsigned char) (written_early_data_size + i); 4707a8e1175bSopenharmony_ci } 4708a8e1175bSopenharmony_ci 4709a8e1175bSopenharmony_ci ret = mbedtls_ssl_write_early_data(&(client_ep.ssl), 4710a8e1175bSopenharmony_ci buf, 4711a8e1175bSopenharmony_ci buf_size); 4712a8e1175bSopenharmony_ci 4713a8e1175bSopenharmony_ci if (buf_size <= remaining) { 4714a8e1175bSopenharmony_ci TEST_EQUAL(ret, buf_size); 4715a8e1175bSopenharmony_ci } else { 4716a8e1175bSopenharmony_ci TEST_EQUAL(ret, remaining); 4717a8e1175bSopenharmony_ci } 4718a8e1175bSopenharmony_ci written_early_data_size += buf_size; 4719a8e1175bSopenharmony_ci } 4720a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.total_early_data_size, max_early_data_size); 4721a8e1175bSopenharmony_ci 4722a8e1175bSopenharmony_ci ret = mbedtls_ssl_write_early_data(&(client_ep.ssl), buf, 1); 4723a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA); 4724a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.total_early_data_size, max_early_data_size); 4725a8e1175bSopenharmony_ci TEST_EQUAL(client_ep.ssl.early_data_state, 4726a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE); 4727a8e1175bSopenharmony_ci 4728a8e1175bSopenharmony_ci /* 4729a8e1175bSopenharmony_ci * Now, check data on server side. It is not done in the previous loop as 4730a8e1175bSopenharmony_ci * in the first call to mbedtls_ssl_handshake(), the server ends up sending 4731a8e1175bSopenharmony_ci * its Finished message and then in the following call to 4732a8e1175bSopenharmony_ci * mbedtls_ssl_write_early_data() we go past the early data writing window 4733a8e1175bSopenharmony_ci * and we cannot test multiple calls to the API is this writing window. 4734a8e1175bSopenharmony_ci */ 4735a8e1175bSopenharmony_ci while (read_early_data_size < max_early_data_size) { 4736a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake(&(server_ep.ssl)); 4737a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA); 4738a8e1175bSopenharmony_ci 4739a8e1175bSopenharmony_ci ret = mbedtls_ssl_read_early_data(&(server_ep.ssl), 4740a8e1175bSopenharmony_ci buf, 4741a8e1175bSopenharmony_ci buf_size); 4742a8e1175bSopenharmony_ci TEST_ASSERT(ret > 0); 4743a8e1175bSopenharmony_ci 4744a8e1175bSopenharmony_ci for (size_t i = 0; i < (size_t) ret; i++) { 4745a8e1175bSopenharmony_ci TEST_EQUAL(buf[i], (unsigned char) (read_early_data_size + i)); 4746a8e1175bSopenharmony_ci } 4747a8e1175bSopenharmony_ci 4748a8e1175bSopenharmony_ci read_early_data_size += ret; 4749a8e1175bSopenharmony_ci } 4750a8e1175bSopenharmony_ci TEST_EQUAL(read_early_data_size, max_early_data_size); 4751a8e1175bSopenharmony_ci 4752a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake(&(server_ep.ssl)); 4753a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ); 4754a8e1175bSopenharmony_ci 4755a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_move_handshake_to_state( 4756a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), MBEDTLS_SSL_HANDSHAKE_OVER) 4757a8e1175bSopenharmony_ci == 0); 4758a8e1175bSopenharmony_ci 4759a8e1175bSopenharmony_ciexit: 4760a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 4761a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 4762a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 4763a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 4764a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&saved_session); 4765a8e1175bSopenharmony_ci mbedtls_free(buf); 4766a8e1175bSopenharmony_ci PSA_DONE(); 4767a8e1175bSopenharmony_ci} 4768a8e1175bSopenharmony_ci/* END_CASE */ 4769a8e1175bSopenharmony_ci 4770a8e1175bSopenharmony_ci/* 4771a8e1175bSopenharmony_ci * The !MBEDTLS_SSL_PROTO_TLS1_2 dependency of tls13_early_data() below is 4772a8e1175bSopenharmony_ci * a temporary workaround to not run the test in Windows-2013 where there is 4773a8e1175bSopenharmony_ci * an issue with mbedtls_vsnprintf(). 4774a8e1175bSopenharmony_ci */ 4775a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:!MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_DEBUG_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */ 4776a8e1175bSopenharmony_civoid tls13_srv_max_early_data_size(int scenario, int max_early_data_size_arg, int write_size_arg) 4777a8e1175bSopenharmony_ci{ 4778a8e1175bSopenharmony_ci int ret = -1; 4779a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint client_ep, server_ep; 4780a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options client_options; 4781a8e1175bSopenharmony_ci mbedtls_test_handshake_test_options server_options; 4782a8e1175bSopenharmony_ci mbedtls_ssl_session saved_session; 4783a8e1175bSopenharmony_ci mbedtls_test_ssl_log_pattern server_pattern = { NULL, 0 }; 4784a8e1175bSopenharmony_ci uint16_t group_list[3] = { 4785a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 4786a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, 4787a8e1175bSopenharmony_ci MBEDTLS_SSL_IANA_TLS_GROUP_NONE 4788a8e1175bSopenharmony_ci }; 4789a8e1175bSopenharmony_ci char pattern[128]; 4790a8e1175bSopenharmony_ci unsigned char *buf_write = NULL; 4791a8e1175bSopenharmony_ci uint32_t write_size = (uint32_t) write_size_arg; 4792a8e1175bSopenharmony_ci unsigned char *buf_read = NULL; 4793a8e1175bSopenharmony_ci uint32_t read_size; 4794a8e1175bSopenharmony_ci uint32_t expanded_early_data_chunk_size = 0; 4795a8e1175bSopenharmony_ci uint32_t written_early_data_size = 0; 4796a8e1175bSopenharmony_ci uint32_t max_early_data_size; 4797a8e1175bSopenharmony_ci 4798a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 4799a8e1175bSopenharmony_ci mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 4800a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&client_options); 4801a8e1175bSopenharmony_ci mbedtls_test_init_handshake_options(&server_options); 4802a8e1175bSopenharmony_ci mbedtls_ssl_session_init(&saved_session); 4803a8e1175bSopenharmony_ci PSA_INIT(); 4804a8e1175bSopenharmony_ci 4805a8e1175bSopenharmony_ci TEST_CALLOC(buf_write, write_size); 4806a8e1175bSopenharmony_ci 4807a8e1175bSopenharmony_ci /* 4808a8e1175bSopenharmony_ci * Allocate a smaller buffer for early data reading to exercise the reading 4809a8e1175bSopenharmony_ci * of data in one record in multiple calls. 4810a8e1175bSopenharmony_ci */ 4811a8e1175bSopenharmony_ci read_size = (write_size / 2) + 1; 4812a8e1175bSopenharmony_ci TEST_CALLOC(buf_read, read_size); 4813a8e1175bSopenharmony_ci 4814a8e1175bSopenharmony_ci /* 4815a8e1175bSopenharmony_ci * Run first handshake to get a ticket from the server. 4816a8e1175bSopenharmony_ci */ 4817a8e1175bSopenharmony_ci 4818a8e1175bSopenharmony_ci client_options.pk_alg = MBEDTLS_PK_ECDSA; 4819a8e1175bSopenharmony_ci client_options.group_list = group_list; 4820a8e1175bSopenharmony_ci client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 4821a8e1175bSopenharmony_ci server_options.pk_alg = MBEDTLS_PK_ECDSA; 4822a8e1175bSopenharmony_ci server_options.group_list = group_list; 4823a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED; 4824a8e1175bSopenharmony_ci server_options.max_early_data_size = max_early_data_size_arg; 4825a8e1175bSopenharmony_ci 4826a8e1175bSopenharmony_ci ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options, 4827a8e1175bSopenharmony_ci &saved_session); 4828a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4829a8e1175bSopenharmony_ci 4830a8e1175bSopenharmony_ci /* 4831a8e1175bSopenharmony_ci * Prepare for handshake with the ticket. 4832a8e1175bSopenharmony_ci */ 4833a8e1175bSopenharmony_ci server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer; 4834a8e1175bSopenharmony_ci server_options.srv_log_obj = &server_pattern; 4835a8e1175bSopenharmony_ci server_pattern.pattern = pattern; 4836a8e1175bSopenharmony_ci 4837a8e1175bSopenharmony_ci switch (scenario) { 4838a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4839a8e1175bSopenharmony_ci break; 4840a8e1175bSopenharmony_ci 4841a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: 4842a8e1175bSopenharmony_ci server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED; 4843a8e1175bSopenharmony_ci ret = mbedtls_snprintf(pattern, sizeof(pattern), 4844a8e1175bSopenharmony_ci "EarlyData: deprotect and discard app data records."); 4845a8e1175bSopenharmony_ci TEST_ASSERT(ret < (int) sizeof(pattern)); 4846a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(3); 4847a8e1175bSopenharmony_ci break; 4848a8e1175bSopenharmony_ci 4849a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4850a8e1175bSopenharmony_ci /* 4851a8e1175bSopenharmony_ci * Remove server support for the group negotiated in 4852a8e1175bSopenharmony_ci * mbedtls_test_get_tls13_ticket() forcing an HelloRetryRequest. 4853a8e1175bSopenharmony_ci */ 4854a8e1175bSopenharmony_ci server_options.group_list = group_list + 1; 4855a8e1175bSopenharmony_ci ret = mbedtls_snprintf( 4856a8e1175bSopenharmony_ci pattern, sizeof(pattern), 4857a8e1175bSopenharmony_ci "EarlyData: Ignore application message before 2nd ClientHello"); 4858a8e1175bSopenharmony_ci TEST_ASSERT(ret < (int) sizeof(pattern)); 4859a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(3); 4860a8e1175bSopenharmony_ci break; 4861a8e1175bSopenharmony_ci 4862a8e1175bSopenharmony_ci default: 4863a8e1175bSopenharmony_ci TEST_FAIL("Unknown scenario."); 4864a8e1175bSopenharmony_ci } 4865a8e1175bSopenharmony_ci 4866a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 4867a8e1175bSopenharmony_ci &client_options, NULL, NULL, NULL); 4868a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4869a8e1175bSopenharmony_ci 4870a8e1175bSopenharmony_ci ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 4871a8e1175bSopenharmony_ci &server_options, NULL, NULL, NULL); 4872a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4873a8e1175bSopenharmony_ci 4874a8e1175bSopenharmony_ci mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf, 4875a8e1175bSopenharmony_ci mbedtls_test_ticket_write, 4876a8e1175bSopenharmony_ci mbedtls_test_ticket_parse, 4877a8e1175bSopenharmony_ci NULL); 4878a8e1175bSopenharmony_ci 4879a8e1175bSopenharmony_ci ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 4880a8e1175bSopenharmony_ci &(server_ep.socket), 1024); 4881a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4882a8e1175bSopenharmony_ci 4883a8e1175bSopenharmony_ci max_early_data_size = saved_session.max_early_data_size; 4884a8e1175bSopenharmony_ci 4885a8e1175bSopenharmony_ci ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session); 4886a8e1175bSopenharmony_ci TEST_EQUAL(ret, 0); 4887a8e1175bSopenharmony_ci 4888a8e1175bSopenharmony_ci /* 4889a8e1175bSopenharmony_ci * Start an handshake based on the ticket up to the point where early data 4890a8e1175bSopenharmony_ci * can be sent from client side. Then send in a loop as much early data as 4891a8e1175bSopenharmony_ci * possible without going over the maximum permitted size for the ticket. 4892a8e1175bSopenharmony_ci * Finally, do a last writting to go past that maximum permitted size and 4893a8e1175bSopenharmony_ci * check that we detect it. 4894a8e1175bSopenharmony_ci */ 4895a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_move_handshake_to_state( 4896a8e1175bSopenharmony_ci &(client_ep.ssl), &(server_ep.ssl), 4897a8e1175bSopenharmony_ci MBEDTLS_SSL_SERVER_HELLO), 0); 4898a8e1175bSopenharmony_ci 4899a8e1175bSopenharmony_ci TEST_ASSERT(client_ep.ssl.early_data_state != 4900a8e1175bSopenharmony_ci MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT); 4901a8e1175bSopenharmony_ci 4902a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake(&(server_ep.ssl)); 4903a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ); 4904a8e1175bSopenharmony_ci 4905a8e1175bSopenharmony_ci /* 4906a8e1175bSopenharmony_ci * Write and if possible read as much as possible chunks of write_size 4907a8e1175bSopenharmony_ci * bytes data without getting over the max_early_data_size limit. 4908a8e1175bSopenharmony_ci */ 4909a8e1175bSopenharmony_ci do { 4910a8e1175bSopenharmony_ci uint32_t read_early_data_size = 0; 4911a8e1175bSopenharmony_ci 4912a8e1175bSopenharmony_ci /* 4913a8e1175bSopenharmony_ci * The contents of the early data are not very important, write a 4914a8e1175bSopenharmony_ci * pattern that varies byte-by-byte and is different for every chunk of 4915a8e1175bSopenharmony_ci * early data. 4916a8e1175bSopenharmony_ci */ 4917a8e1175bSopenharmony_ci if ((written_early_data_size + write_size) > max_early_data_size) { 4918a8e1175bSopenharmony_ci break; 4919a8e1175bSopenharmony_ci } 4920a8e1175bSopenharmony_ci 4921a8e1175bSopenharmony_ci /* 4922a8e1175bSopenharmony_ci * If the server rejected early data, base the determination of when 4923a8e1175bSopenharmony_ci * to stop the loop on the expanded size (padding and encryption 4924a8e1175bSopenharmony_ci * expansion) of early data on server side and the number of early data 4925a8e1175bSopenharmony_ci * received so far by the server (multiple of the expanded size). 4926a8e1175bSopenharmony_ci */ 4927a8e1175bSopenharmony_ci if ((expanded_early_data_chunk_size != 0) && 4928a8e1175bSopenharmony_ci ((server_ep.ssl.total_early_data_size + 4929a8e1175bSopenharmony_ci expanded_early_data_chunk_size) > max_early_data_size)) { 4930a8e1175bSopenharmony_ci break; 4931a8e1175bSopenharmony_ci } 4932a8e1175bSopenharmony_ci 4933a8e1175bSopenharmony_ci for (size_t i = 0; i < write_size; i++) { 4934a8e1175bSopenharmony_ci buf_write[i] = (unsigned char) (written_early_data_size + i); 4935a8e1175bSopenharmony_ci } 4936a8e1175bSopenharmony_ci 4937a8e1175bSopenharmony_ci ret = write_early_data(&(client_ep.ssl), buf_write, write_size); 4938a8e1175bSopenharmony_ci TEST_EQUAL(ret, write_size); 4939a8e1175bSopenharmony_ci written_early_data_size += write_size; 4940a8e1175bSopenharmony_ci 4941a8e1175bSopenharmony_ci switch (scenario) { 4942a8e1175bSopenharmony_ci case TEST_EARLY_DATA_ACCEPTED: 4943a8e1175bSopenharmony_ci while (read_early_data_size < write_size) { 4944a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake(&(server_ep.ssl)); 4945a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA); 4946a8e1175bSopenharmony_ci 4947a8e1175bSopenharmony_ci ret = mbedtls_ssl_read_early_data(&(server_ep.ssl), 4948a8e1175bSopenharmony_ci buf_read, read_size); 4949a8e1175bSopenharmony_ci TEST_ASSERT(ret > 0); 4950a8e1175bSopenharmony_ci 4951a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(buf_read, ret, 4952a8e1175bSopenharmony_ci buf_write + read_early_data_size, ret); 4953a8e1175bSopenharmony_ci read_early_data_size += ret; 4954a8e1175bSopenharmony_ci 4955a8e1175bSopenharmony_ci TEST_EQUAL(server_ep.ssl.total_early_data_size, 4956a8e1175bSopenharmony_ci written_early_data_size); 4957a8e1175bSopenharmony_ci } 4958a8e1175bSopenharmony_ci break; 4959a8e1175bSopenharmony_ci 4960a8e1175bSopenharmony_ci case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */ 4961a8e1175bSopenharmony_ci case TEST_EARLY_DATA_HRR: 4962a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake(&(server_ep.ssl)); 4963a8e1175bSopenharmony_ci /* 4964a8e1175bSopenharmony_ci * In this write loop we try to always stay below the 4965a8e1175bSopenharmony_ci * max_early_data_size limit but if max_early_data_size is very 4966a8e1175bSopenharmony_ci * small we may exceed the max_early_data_size limit on the 4967a8e1175bSopenharmony_ci * first write. In TEST_EARLY_DATA_SERVER_REJECTS/ 4968a8e1175bSopenharmony_ci * TEST_EARLY_DATA_HRR scenario, this is for sure the case if 4969a8e1175bSopenharmony_ci * max_early_data_size is smaller than the smallest possible 4970a8e1175bSopenharmony_ci * inner content/protected record. Take into account this 4971a8e1175bSopenharmony_ci * possibility here but only for max_early_data_size values 4972a8e1175bSopenharmony_ci * that are close to write_size. Below, '1' is for the inner 4973a8e1175bSopenharmony_ci * type byte and '16' is to take into account some AEAD 4974a8e1175bSopenharmony_ci * expansion (tag, ...). 4975a8e1175bSopenharmony_ci */ 4976a8e1175bSopenharmony_ci if (ret == MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE) { 4977a8e1175bSopenharmony_ci if (scenario == TEST_EARLY_DATA_SERVER_REJECTS) { 4978a8e1175bSopenharmony_ci TEST_LE_U(max_early_data_size, 4979a8e1175bSopenharmony_ci write_size + 1 + 4980a8e1175bSopenharmony_ci MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY); 4981a8e1175bSopenharmony_ci } else { 4982a8e1175bSopenharmony_ci TEST_LE_U(max_early_data_size, 4983a8e1175bSopenharmony_ci write_size + 1 + 16 + 4984a8e1175bSopenharmony_ci MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY); 4985a8e1175bSopenharmony_ci } 4986a8e1175bSopenharmony_ci goto exit; 4987a8e1175bSopenharmony_ci } 4988a8e1175bSopenharmony_ci 4989a8e1175bSopenharmony_ci TEST_ASSERT(ret == MBEDTLS_ERR_SSL_WANT_READ); 4990a8e1175bSopenharmony_ci 4991a8e1175bSopenharmony_ci TEST_EQUAL(server_pattern.counter, 1); 4992a8e1175bSopenharmony_ci server_pattern.counter = 0; 4993a8e1175bSopenharmony_ci if (expanded_early_data_chunk_size == 0) { 4994a8e1175bSopenharmony_ci expanded_early_data_chunk_size = server_ep.ssl.total_early_data_size; 4995a8e1175bSopenharmony_ci } 4996a8e1175bSopenharmony_ci break; 4997a8e1175bSopenharmony_ci } 4998a8e1175bSopenharmony_ci TEST_LE_U(server_ep.ssl.total_early_data_size, max_early_data_size); 4999a8e1175bSopenharmony_ci } while (1); 5000a8e1175bSopenharmony_ci 5001a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(3); 5002a8e1175bSopenharmony_ci ret = write_early_data(&(client_ep.ssl), buf_write, write_size); 5003a8e1175bSopenharmony_ci TEST_EQUAL(ret, write_size); 5004a8e1175bSopenharmony_ci 5005a8e1175bSopenharmony_ci ret = mbedtls_snprintf(pattern, sizeof(pattern), 5006a8e1175bSopenharmony_ci "EarlyData: Too much early data received"); 5007a8e1175bSopenharmony_ci TEST_ASSERT(ret < (int) sizeof(pattern)); 5008a8e1175bSopenharmony_ci 5009a8e1175bSopenharmony_ci ret = mbedtls_ssl_handshake(&(server_ep.ssl)); 5010a8e1175bSopenharmony_ci TEST_EQUAL(ret, MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE); 5011a8e1175bSopenharmony_ci TEST_EQUAL(server_pattern.counter, 1); 5012a8e1175bSopenharmony_ci 5013a8e1175bSopenharmony_ciexit: 5014a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 5015a8e1175bSopenharmony_ci mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 5016a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&client_options); 5017a8e1175bSopenharmony_ci mbedtls_test_free_handshake_options(&server_options); 5018a8e1175bSopenharmony_ci mbedtls_ssl_session_free(&saved_session); 5019a8e1175bSopenharmony_ci mbedtls_free(buf_write); 5020a8e1175bSopenharmony_ci mbedtls_free(buf_read); 5021a8e1175bSopenharmony_ci mbedtls_debug_set_threshold(0); 5022a8e1175bSopenharmony_ci PSA_DONE(); 5023a8e1175bSopenharmony_ci} 5024a8e1175bSopenharmony_ci/* END_CASE */ 5025