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