1*62c56f98SSadaf Ebrahimi/* BEGIN_HEADER */ 2*62c56f98SSadaf Ebrahimi#include <ssl_misc.h> 3*62c56f98SSadaf Ebrahimi#include <mbedtls/timing.h> 4*62c56f98SSadaf Ebrahimi#include <mbedtls/debug.h> 5*62c56f98SSadaf Ebrahimi#include <mbedtls/pk.h> 6*62c56f98SSadaf Ebrahimi#include <ssl_tls13_keys.h> 7*62c56f98SSadaf Ebrahimi#include <ssl_tls13_invasive.h> 8*62c56f98SSadaf Ebrahimi#include <test/ssl_helpers.h> 9*62c56f98SSadaf Ebrahimi 10*62c56f98SSadaf Ebrahimi#include <constant_time_internal.h> 11*62c56f98SSadaf Ebrahimi#include <test/constant_flow.h> 12*62c56f98SSadaf Ebrahimi 13*62c56f98SSadaf Ebrahimi#define SSL_MESSAGE_QUEUE_INIT { NULL, 0, 0, 0 } 14*62c56f98SSadaf Ebrahimi 15*62c56f98SSadaf Ebrahimi/* END_HEADER */ 16*62c56f98SSadaf Ebrahimi 17*62c56f98SSadaf Ebrahimi/* BEGIN_DEPENDENCIES 18*62c56f98SSadaf Ebrahimi * depends_on:MBEDTLS_SSL_TLS_C 19*62c56f98SSadaf Ebrahimi * END_DEPENDENCIES 20*62c56f98SSadaf Ebrahimi */ 21*62c56f98SSadaf Ebrahimi 22*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 23*62c56f98SSadaf Ebrahimivoid test_callback_buffer_sanity() 24*62c56f98SSadaf Ebrahimi{ 25*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 26*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_buffer buf; 27*62c56f98SSadaf Ebrahimi unsigned char input[MSGLEN]; 28*62c56f98SSadaf Ebrahimi unsigned char output[MSGLEN]; 29*62c56f98SSadaf Ebrahimi 30*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 31*62c56f98SSadaf Ebrahimi memset(input, 0, sizeof(input)); 32*62c56f98SSadaf Ebrahimi 33*62c56f98SSadaf Ebrahimi /* Make sure calling put and get on NULL buffer results in error. */ 34*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, input, sizeof(input)) 35*62c56f98SSadaf Ebrahimi == -1); 36*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, output, sizeof(output)) 37*62c56f98SSadaf Ebrahimi == -1); 38*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, sizeof(input)) 39*62c56f98SSadaf Ebrahimi == -1); 40*62c56f98SSadaf Ebrahimi 41*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, 0) == -1); 42*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, NULL, 0) == -1); 43*62c56f98SSadaf Ebrahimi 44*62c56f98SSadaf Ebrahimi /* Make sure calling put and get on a buffer that hasn't been set up results 45*62c56f98SSadaf Ebrahimi * in error. */ 46*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_buffer_init(&buf); 47*62c56f98SSadaf Ebrahimi 48*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input)) 49*62c56f98SSadaf Ebrahimi == -1); 50*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, sizeof(output)) 51*62c56f98SSadaf Ebrahimi == -1); 52*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input)) 53*62c56f98SSadaf Ebrahimi == -1); 54*62c56f98SSadaf Ebrahimi 55*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == -1); 56*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == -1); 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimi /* Make sure calling put and get on NULL input only results in 59*62c56f98SSadaf Ebrahimi * error if the length is not zero, and that a NULL output is valid for data 60*62c56f98SSadaf Ebrahimi * dropping. 61*62c56f98SSadaf Ebrahimi */ 62*62c56f98SSadaf Ebrahimi 63*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, sizeof(input)) == 0); 64*62c56f98SSadaf Ebrahimi 65*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input)) 66*62c56f98SSadaf Ebrahimi == -1); 67*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, sizeof(output)) 68*62c56f98SSadaf Ebrahimi == 0); 69*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == 0); 70*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == 0); 71*62c56f98SSadaf Ebrahimi 72*62c56f98SSadaf Ebrahimi /* Make sure calling put several times in the row is safe */ 73*62c56f98SSadaf Ebrahimi 74*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input)) 75*62c56f98SSadaf Ebrahimi == sizeof(input)); 76*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, 2) == 2); 77*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 1) == 1); 78*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 1); 79*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 0); 80*62c56f98SSadaf Ebrahimi 81*62c56f98SSadaf Ebrahimi 82*62c56f98SSadaf Ebrahimiexit: 83*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_buffer_free(&buf); 84*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 85*62c56f98SSadaf Ebrahimi} 86*62c56f98SSadaf Ebrahimi/* END_CASE */ 87*62c56f98SSadaf Ebrahimi 88*62c56f98SSadaf Ebrahimi/* 89*62c56f98SSadaf Ebrahimi * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is 90*62c56f98SSadaf Ebrahimi * correct and works as expected. 91*62c56f98SSadaf Ebrahimi * 92*62c56f98SSadaf Ebrahimi * That is 93*62c56f98SSadaf Ebrahimi * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes. 94*62c56f98SSadaf Ebrahimi * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes. 95*62c56f98SSadaf Ebrahimi * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret 96*62c56f98SSadaf Ebrahimi * bytes. 97*62c56f98SSadaf Ebrahimi * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes. 98*62c56f98SSadaf Ebrahimi * - All of the bytes we got match the bytes we put in in a FIFO manner. 99*62c56f98SSadaf Ebrahimi */ 100*62c56f98SSadaf Ebrahimi 101*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 102*62c56f98SSadaf Ebrahimivoid test_callback_buffer(int size, int put1, int put1_ret, 103*62c56f98SSadaf Ebrahimi int get1, int get1_ret, int put2, int put2_ret, 104*62c56f98SSadaf Ebrahimi int get2, int get2_ret) 105*62c56f98SSadaf Ebrahimi{ 106*62c56f98SSadaf Ebrahimi enum { ROUNDS = 2 }; 107*62c56f98SSadaf Ebrahimi size_t put[ROUNDS]; 108*62c56f98SSadaf Ebrahimi int put_ret[ROUNDS]; 109*62c56f98SSadaf Ebrahimi size_t get[ROUNDS]; 110*62c56f98SSadaf Ebrahimi int get_ret[ROUNDS]; 111*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_buffer buf; 112*62c56f98SSadaf Ebrahimi unsigned char *input = NULL; 113*62c56f98SSadaf Ebrahimi size_t input_len; 114*62c56f98SSadaf Ebrahimi unsigned char *output = NULL; 115*62c56f98SSadaf Ebrahimi size_t output_len; 116*62c56f98SSadaf Ebrahimi size_t i, j, written, read; 117*62c56f98SSadaf Ebrahimi 118*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_buffer_init(&buf); 119*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 120*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, size) == 0); 121*62c56f98SSadaf Ebrahimi 122*62c56f98SSadaf Ebrahimi /* Check the sanity of input parameters and initialise local variables. That 123*62c56f98SSadaf Ebrahimi * is, ensure that the amount of data is not negative and that we are not 124*62c56f98SSadaf Ebrahimi * expecting more to put or get than we actually asked for. */ 125*62c56f98SSadaf Ebrahimi TEST_ASSERT(put1 >= 0); 126*62c56f98SSadaf Ebrahimi put[0] = put1; 127*62c56f98SSadaf Ebrahimi put_ret[0] = put1_ret; 128*62c56f98SSadaf Ebrahimi TEST_ASSERT(put1_ret <= put1); 129*62c56f98SSadaf Ebrahimi TEST_ASSERT(put2 >= 0); 130*62c56f98SSadaf Ebrahimi put[1] = put2; 131*62c56f98SSadaf Ebrahimi put_ret[1] = put2_ret; 132*62c56f98SSadaf Ebrahimi TEST_ASSERT(put2_ret <= put2); 133*62c56f98SSadaf Ebrahimi 134*62c56f98SSadaf Ebrahimi TEST_ASSERT(get1 >= 0); 135*62c56f98SSadaf Ebrahimi get[0] = get1; 136*62c56f98SSadaf Ebrahimi get_ret[0] = get1_ret; 137*62c56f98SSadaf Ebrahimi TEST_ASSERT(get1_ret <= get1); 138*62c56f98SSadaf Ebrahimi TEST_ASSERT(get2 >= 0); 139*62c56f98SSadaf Ebrahimi get[1] = get2; 140*62c56f98SSadaf Ebrahimi get_ret[1] = get2_ret; 141*62c56f98SSadaf Ebrahimi TEST_ASSERT(get2_ret <= get2); 142*62c56f98SSadaf Ebrahimi 143*62c56f98SSadaf Ebrahimi input_len = 0; 144*62c56f98SSadaf Ebrahimi /* Calculate actual input and output lengths */ 145*62c56f98SSadaf Ebrahimi for (j = 0; j < ROUNDS; j++) { 146*62c56f98SSadaf Ebrahimi if (put_ret[j] > 0) { 147*62c56f98SSadaf Ebrahimi input_len += put_ret[j]; 148*62c56f98SSadaf Ebrahimi } 149*62c56f98SSadaf Ebrahimi } 150*62c56f98SSadaf Ebrahimi /* In order to always have a valid pointer we always allocate at least 1 151*62c56f98SSadaf Ebrahimi * byte. */ 152*62c56f98SSadaf Ebrahimi if (input_len == 0) { 153*62c56f98SSadaf Ebrahimi input_len = 1; 154*62c56f98SSadaf Ebrahimi } 155*62c56f98SSadaf Ebrahimi TEST_CALLOC(input, input_len); 156*62c56f98SSadaf Ebrahimi 157*62c56f98SSadaf Ebrahimi output_len = 0; 158*62c56f98SSadaf Ebrahimi for (j = 0; j < ROUNDS; j++) { 159*62c56f98SSadaf Ebrahimi if (get_ret[j] > 0) { 160*62c56f98SSadaf Ebrahimi output_len += get_ret[j]; 161*62c56f98SSadaf Ebrahimi } 162*62c56f98SSadaf Ebrahimi } 163*62c56f98SSadaf Ebrahimi TEST_ASSERT(output_len <= input_len); 164*62c56f98SSadaf Ebrahimi /* In order to always have a valid pointer we always allocate at least 1 165*62c56f98SSadaf Ebrahimi * byte. */ 166*62c56f98SSadaf Ebrahimi if (output_len == 0) { 167*62c56f98SSadaf Ebrahimi output_len = 1; 168*62c56f98SSadaf Ebrahimi } 169*62c56f98SSadaf Ebrahimi TEST_CALLOC(output, output_len); 170*62c56f98SSadaf Ebrahimi 171*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 172*62c56f98SSadaf Ebrahimi * can be detected */ 173*62c56f98SSadaf Ebrahimi for (i = 0; i < input_len; i++) { 174*62c56f98SSadaf Ebrahimi input[i] = i & 0xFF; 175*62c56f98SSadaf Ebrahimi } 176*62c56f98SSadaf Ebrahimi 177*62c56f98SSadaf Ebrahimi written = read = 0; 178*62c56f98SSadaf Ebrahimi for (j = 0; j < ROUNDS; j++) { 179*62c56f98SSadaf Ebrahimi TEST_ASSERT(put_ret[j] == mbedtls_test_ssl_buffer_put(&buf, 180*62c56f98SSadaf Ebrahimi input + written, put[j])); 181*62c56f98SSadaf Ebrahimi written += put_ret[j]; 182*62c56f98SSadaf Ebrahimi TEST_ASSERT(get_ret[j] == mbedtls_test_ssl_buffer_get(&buf, 183*62c56f98SSadaf Ebrahimi output + read, get[j])); 184*62c56f98SSadaf Ebrahimi read += get_ret[j]; 185*62c56f98SSadaf Ebrahimi TEST_ASSERT(read <= written); 186*62c56f98SSadaf Ebrahimi if (get_ret[j] > 0) { 187*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output + read - get_ret[j], 188*62c56f98SSadaf Ebrahimi input + read - get_ret[j], get_ret[j]) 189*62c56f98SSadaf Ebrahimi == 0); 190*62c56f98SSadaf Ebrahimi } 191*62c56f98SSadaf Ebrahimi } 192*62c56f98SSadaf Ebrahimi 193*62c56f98SSadaf Ebrahimiexit: 194*62c56f98SSadaf Ebrahimi mbedtls_free(input); 195*62c56f98SSadaf Ebrahimi mbedtls_free(output); 196*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_buffer_free(&buf); 197*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 198*62c56f98SSadaf Ebrahimi} 199*62c56f98SSadaf Ebrahimi/* END_CASE */ 200*62c56f98SSadaf Ebrahimi 201*62c56f98SSadaf Ebrahimi/* 202*62c56f98SSadaf Ebrahimi * Test if the implementation of `mbedtls_test_mock_socket` related 203*62c56f98SSadaf Ebrahimi * I/O functions is correct and works as expected on unconnected sockets. 204*62c56f98SSadaf Ebrahimi */ 205*62c56f98SSadaf Ebrahimi 206*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 207*62c56f98SSadaf Ebrahimivoid ssl_mock_sanity() 208*62c56f98SSadaf Ebrahimi{ 209*62c56f98SSadaf Ebrahimi enum { MSGLEN = 105 }; 210*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN] = { 0 }; 211*62c56f98SSadaf Ebrahimi unsigned char received[MSGLEN] = { 0 }; 212*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket socket; 213*62c56f98SSadaf Ebrahimi 214*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&socket); 215*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 216*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_b(&socket, message, MSGLEN) < 0); 217*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&socket); 218*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&socket); 219*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_b(&socket, received, MSGLEN) < 0); 220*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&socket); 221*62c56f98SSadaf Ebrahimi 222*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&socket); 223*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_nb(&socket, message, MSGLEN) < 0); 224*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&socket); 225*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&socket); 226*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0); 227*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&socket); 228*62c56f98SSadaf Ebrahimi 229*62c56f98SSadaf Ebrahimiexit: 230*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&socket); 231*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 232*62c56f98SSadaf Ebrahimi} 233*62c56f98SSadaf Ebrahimi/* END_CASE */ 234*62c56f98SSadaf Ebrahimi 235*62c56f98SSadaf Ebrahimi/* 236*62c56f98SSadaf Ebrahimi * Test if the implementation of `mbedtls_test_mock_socket` related functions 237*62c56f98SSadaf Ebrahimi * can send a single message from the client to the server. 238*62c56f98SSadaf Ebrahimi */ 239*62c56f98SSadaf Ebrahimi 240*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 241*62c56f98SSadaf Ebrahimivoid ssl_mock_tcp(int blocking) 242*62c56f98SSadaf Ebrahimi{ 243*62c56f98SSadaf Ebrahimi enum { MSGLEN = 105 }; 244*62c56f98SSadaf Ebrahimi enum { BUFLEN = MSGLEN / 5 }; 245*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN]; 246*62c56f98SSadaf Ebrahimi unsigned char received[MSGLEN]; 247*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client; 248*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket server; 249*62c56f98SSadaf Ebrahimi size_t written, read; 250*62c56f98SSadaf Ebrahimi int send_ret, recv_ret; 251*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_t *send; 252*62c56f98SSadaf Ebrahimi mbedtls_ssl_recv_t *recv; 253*62c56f98SSadaf Ebrahimi unsigned i; 254*62c56f98SSadaf Ebrahimi 255*62c56f98SSadaf Ebrahimi if (blocking == 0) { 256*62c56f98SSadaf Ebrahimi send = mbedtls_test_mock_tcp_send_nb; 257*62c56f98SSadaf Ebrahimi recv = mbedtls_test_mock_tcp_recv_nb; 258*62c56f98SSadaf Ebrahimi } else { 259*62c56f98SSadaf Ebrahimi send = mbedtls_test_mock_tcp_send_b; 260*62c56f98SSadaf Ebrahimi recv = mbedtls_test_mock_tcp_recv_b; 261*62c56f98SSadaf Ebrahimi } 262*62c56f98SSadaf Ebrahimi 263*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&client); 264*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&server); 265*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 266*62c56f98SSadaf Ebrahimi 267*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 268*62c56f98SSadaf Ebrahimi * can be detected */ 269*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 270*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 271*62c56f98SSadaf Ebrahimi } 272*62c56f98SSadaf Ebrahimi 273*62c56f98SSadaf Ebrahimi /* Make sure that sending a message takes a few iterations. */ 274*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 275*62c56f98SSadaf Ebrahimi BUFLEN)); 276*62c56f98SSadaf Ebrahimi 277*62c56f98SSadaf Ebrahimi /* Send the message to the server */ 278*62c56f98SSadaf Ebrahimi send_ret = recv_ret = 1; 279*62c56f98SSadaf Ebrahimi written = read = 0; 280*62c56f98SSadaf Ebrahimi while (send_ret != 0 || recv_ret != 0) { 281*62c56f98SSadaf Ebrahimi send_ret = send(&client, message + written, MSGLEN - written); 282*62c56f98SSadaf Ebrahimi 283*62c56f98SSadaf Ebrahimi TEST_ASSERT(send_ret >= 0); 284*62c56f98SSadaf Ebrahimi TEST_ASSERT(send_ret <= BUFLEN); 285*62c56f98SSadaf Ebrahimi written += send_ret; 286*62c56f98SSadaf Ebrahimi 287*62c56f98SSadaf Ebrahimi /* If the buffer is full we can test blocking and non-blocking send */ 288*62c56f98SSadaf Ebrahimi if (send_ret == BUFLEN) { 289*62c56f98SSadaf Ebrahimi int blocking_ret = send(&client, message, 1); 290*62c56f98SSadaf Ebrahimi if (blocking) { 291*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == 0); 292*62c56f98SSadaf Ebrahimi } else { 293*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE); 294*62c56f98SSadaf Ebrahimi } 295*62c56f98SSadaf Ebrahimi } 296*62c56f98SSadaf Ebrahimi 297*62c56f98SSadaf Ebrahimi recv_ret = recv(&server, received + read, MSGLEN - read); 298*62c56f98SSadaf Ebrahimi 299*62c56f98SSadaf Ebrahimi /* The result depends on whether any data was sent */ 300*62c56f98SSadaf Ebrahimi if (send_ret > 0) { 301*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret > 0); 302*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret <= BUFLEN); 303*62c56f98SSadaf Ebrahimi read += recv_ret; 304*62c56f98SSadaf Ebrahimi } else if (blocking) { 305*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret == 0); 306*62c56f98SSadaf Ebrahimi } else { 307*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ); 308*62c56f98SSadaf Ebrahimi recv_ret = 0; 309*62c56f98SSadaf Ebrahimi } 310*62c56f98SSadaf Ebrahimi 311*62c56f98SSadaf Ebrahimi /* If the buffer is empty we can test blocking and non-blocking read */ 312*62c56f98SSadaf Ebrahimi if (recv_ret == BUFLEN) { 313*62c56f98SSadaf Ebrahimi int blocking_ret = recv(&server, received, 1); 314*62c56f98SSadaf Ebrahimi if (blocking) { 315*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == 0); 316*62c56f98SSadaf Ebrahimi } else { 317*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ); 318*62c56f98SSadaf Ebrahimi } 319*62c56f98SSadaf Ebrahimi } 320*62c56f98SSadaf Ebrahimi } 321*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 322*62c56f98SSadaf Ebrahimi 323*62c56f98SSadaf Ebrahimiexit: 324*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&client); 325*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&server); 326*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 327*62c56f98SSadaf Ebrahimi} 328*62c56f98SSadaf Ebrahimi/* END_CASE */ 329*62c56f98SSadaf Ebrahimi 330*62c56f98SSadaf Ebrahimi/* 331*62c56f98SSadaf Ebrahimi * Test if the implementation of `mbedtls_test_mock_socket` related functions 332*62c56f98SSadaf Ebrahimi * can send messages in both direction at the same time (with the I/O calls 333*62c56f98SSadaf Ebrahimi * interleaving). 334*62c56f98SSadaf Ebrahimi */ 335*62c56f98SSadaf Ebrahimi 336*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 337*62c56f98SSadaf Ebrahimivoid ssl_mock_tcp_interleaving(int blocking) 338*62c56f98SSadaf Ebrahimi{ 339*62c56f98SSadaf Ebrahimi enum { ROUNDS = 2 }; 340*62c56f98SSadaf Ebrahimi enum { MSGLEN = 105 }; 341*62c56f98SSadaf Ebrahimi enum { BUFLEN = MSGLEN / 5 }; 342*62c56f98SSadaf Ebrahimi unsigned char message[ROUNDS][MSGLEN]; 343*62c56f98SSadaf Ebrahimi unsigned char received[ROUNDS][MSGLEN]; 344*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client; 345*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket server; 346*62c56f98SSadaf Ebrahimi size_t written[ROUNDS]; 347*62c56f98SSadaf Ebrahimi size_t read[ROUNDS]; 348*62c56f98SSadaf Ebrahimi int send_ret[ROUNDS]; 349*62c56f98SSadaf Ebrahimi int recv_ret[ROUNDS]; 350*62c56f98SSadaf Ebrahimi unsigned i, j, progress; 351*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_t *send; 352*62c56f98SSadaf Ebrahimi mbedtls_ssl_recv_t *recv; 353*62c56f98SSadaf Ebrahimi 354*62c56f98SSadaf Ebrahimi if (blocking == 0) { 355*62c56f98SSadaf Ebrahimi send = mbedtls_test_mock_tcp_send_nb; 356*62c56f98SSadaf Ebrahimi recv = mbedtls_test_mock_tcp_recv_nb; 357*62c56f98SSadaf Ebrahimi } else { 358*62c56f98SSadaf Ebrahimi send = mbedtls_test_mock_tcp_send_b; 359*62c56f98SSadaf Ebrahimi recv = mbedtls_test_mock_tcp_recv_b; 360*62c56f98SSadaf Ebrahimi } 361*62c56f98SSadaf Ebrahimi 362*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&client); 363*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_init(&server); 364*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 365*62c56f98SSadaf Ebrahimi 366*62c56f98SSadaf Ebrahimi /* Fill up the buffers with structured data so that unwanted changes 367*62c56f98SSadaf Ebrahimi * can be detected */ 368*62c56f98SSadaf Ebrahimi for (i = 0; i < ROUNDS; i++) { 369*62c56f98SSadaf Ebrahimi for (j = 0; j < MSGLEN; j++) { 370*62c56f98SSadaf Ebrahimi message[i][j] = (i * MSGLEN + j) & 0xFF; 371*62c56f98SSadaf Ebrahimi } 372*62c56f98SSadaf Ebrahimi } 373*62c56f98SSadaf Ebrahimi 374*62c56f98SSadaf Ebrahimi /* Make sure that sending a message takes a few iterations. */ 375*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 376*62c56f98SSadaf Ebrahimi BUFLEN)); 377*62c56f98SSadaf Ebrahimi 378*62c56f98SSadaf Ebrahimi /* Send the message from both sides, interleaving. */ 379*62c56f98SSadaf Ebrahimi progress = 1; 380*62c56f98SSadaf Ebrahimi for (i = 0; i < ROUNDS; i++) { 381*62c56f98SSadaf Ebrahimi written[i] = 0; 382*62c56f98SSadaf Ebrahimi read[i] = 0; 383*62c56f98SSadaf Ebrahimi } 384*62c56f98SSadaf Ebrahimi /* This loop does not stop as long as there was a successful write or read 385*62c56f98SSadaf Ebrahimi * of at least one byte on either side. */ 386*62c56f98SSadaf Ebrahimi while (progress != 0) { 387*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket *socket; 388*62c56f98SSadaf Ebrahimi 389*62c56f98SSadaf Ebrahimi for (i = 0; i < ROUNDS; i++) { 390*62c56f98SSadaf Ebrahimi /* First sending is from the client */ 391*62c56f98SSadaf Ebrahimi socket = (i % 2 == 0) ? (&client) : (&server); 392*62c56f98SSadaf Ebrahimi 393*62c56f98SSadaf Ebrahimi send_ret[i] = send(socket, message[i] + written[i], 394*62c56f98SSadaf Ebrahimi MSGLEN - written[i]); 395*62c56f98SSadaf Ebrahimi TEST_ASSERT(send_ret[i] >= 0); 396*62c56f98SSadaf Ebrahimi TEST_ASSERT(send_ret[i] <= BUFLEN); 397*62c56f98SSadaf Ebrahimi written[i] += send_ret[i]; 398*62c56f98SSadaf Ebrahimi 399*62c56f98SSadaf Ebrahimi /* If the buffer is full we can test blocking and non-blocking 400*62c56f98SSadaf Ebrahimi * send */ 401*62c56f98SSadaf Ebrahimi if (send_ret[i] == BUFLEN) { 402*62c56f98SSadaf Ebrahimi int blocking_ret = send(socket, message[i], 1); 403*62c56f98SSadaf Ebrahimi if (blocking) { 404*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == 0); 405*62c56f98SSadaf Ebrahimi } else { 406*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE); 407*62c56f98SSadaf Ebrahimi } 408*62c56f98SSadaf Ebrahimi } 409*62c56f98SSadaf Ebrahimi } 410*62c56f98SSadaf Ebrahimi 411*62c56f98SSadaf Ebrahimi for (i = 0; i < ROUNDS; i++) { 412*62c56f98SSadaf Ebrahimi /* First receiving is from the server */ 413*62c56f98SSadaf Ebrahimi socket = (i % 2 == 0) ? (&server) : (&client); 414*62c56f98SSadaf Ebrahimi 415*62c56f98SSadaf Ebrahimi recv_ret[i] = recv(socket, received[i] + read[i], 416*62c56f98SSadaf Ebrahimi MSGLEN - read[i]); 417*62c56f98SSadaf Ebrahimi 418*62c56f98SSadaf Ebrahimi /* The result depends on whether any data was sent */ 419*62c56f98SSadaf Ebrahimi if (send_ret[i] > 0) { 420*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret[i] > 0); 421*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret[i] <= BUFLEN); 422*62c56f98SSadaf Ebrahimi read[i] += recv_ret[i]; 423*62c56f98SSadaf Ebrahimi } else if (blocking) { 424*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret[i] == 0); 425*62c56f98SSadaf Ebrahimi } else { 426*62c56f98SSadaf Ebrahimi TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ); 427*62c56f98SSadaf Ebrahimi recv_ret[i] = 0; 428*62c56f98SSadaf Ebrahimi } 429*62c56f98SSadaf Ebrahimi 430*62c56f98SSadaf Ebrahimi /* If the buffer is empty we can test blocking and non-blocking 431*62c56f98SSadaf Ebrahimi * read */ 432*62c56f98SSadaf Ebrahimi if (recv_ret[i] == BUFLEN) { 433*62c56f98SSadaf Ebrahimi int blocking_ret = recv(socket, received[i], 1); 434*62c56f98SSadaf Ebrahimi if (blocking) { 435*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == 0); 436*62c56f98SSadaf Ebrahimi } else { 437*62c56f98SSadaf Ebrahimi TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ); 438*62c56f98SSadaf Ebrahimi } 439*62c56f98SSadaf Ebrahimi } 440*62c56f98SSadaf Ebrahimi } 441*62c56f98SSadaf Ebrahimi 442*62c56f98SSadaf Ebrahimi progress = 0; 443*62c56f98SSadaf Ebrahimi for (i = 0; i < ROUNDS; i++) { 444*62c56f98SSadaf Ebrahimi progress += send_ret[i] + recv_ret[i]; 445*62c56f98SSadaf Ebrahimi } 446*62c56f98SSadaf Ebrahimi } 447*62c56f98SSadaf Ebrahimi 448*62c56f98SSadaf Ebrahimi for (i = 0; i < ROUNDS; i++) { 449*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0); 450*62c56f98SSadaf Ebrahimi } 451*62c56f98SSadaf Ebrahimi 452*62c56f98SSadaf Ebrahimiexit: 453*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&client); 454*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket_close(&server); 455*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 456*62c56f98SSadaf Ebrahimi} 457*62c56f98SSadaf Ebrahimi/* END_CASE */ 458*62c56f98SSadaf Ebrahimi 459*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 460*62c56f98SSadaf Ebrahimivoid ssl_message_queue_sanity() 461*62c56f98SSadaf Ebrahimi{ 462*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 463*62c56f98SSadaf Ebrahimi 464*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 465*62c56f98SSadaf Ebrahimi /* Trying to push/pull to an empty queue */ 466*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(NULL, 1) 467*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_ARG_NULL); 468*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(NULL, 1) 469*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_ARG_NULL); 470*62c56f98SSadaf Ebrahimi 471*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 472*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.capacity == 3); 473*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.num == 0); 474*62c56f98SSadaf Ebrahimi 475*62c56f98SSadaf Ebrahimiexit: 476*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue_free(&queue); 477*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 478*62c56f98SSadaf Ebrahimi} 479*62c56f98SSadaf Ebrahimi/* END_CASE */ 480*62c56f98SSadaf Ebrahimi 481*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 482*62c56f98SSadaf Ebrahimivoid ssl_message_queue_basic() 483*62c56f98SSadaf Ebrahimi{ 484*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 485*62c56f98SSadaf Ebrahimi 486*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 487*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 488*62c56f98SSadaf Ebrahimi 489*62c56f98SSadaf Ebrahimi /* Sanity test - 3 pushes and 3 pops with sufficient space */ 490*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 491*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.capacity == 3); 492*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.num == 1); 493*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 494*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.capacity == 3); 495*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.num == 2); 496*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2); 497*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.capacity == 3); 498*62c56f98SSadaf Ebrahimi TEST_ASSERT(queue.num == 3); 499*62c56f98SSadaf Ebrahimi 500*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 501*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 502*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2); 503*62c56f98SSadaf Ebrahimi 504*62c56f98SSadaf Ebrahimiexit: 505*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue_free(&queue); 506*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 507*62c56f98SSadaf Ebrahimi} 508*62c56f98SSadaf Ebrahimi/* END_CASE */ 509*62c56f98SSadaf Ebrahimi 510*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 511*62c56f98SSadaf Ebrahimivoid ssl_message_queue_overflow_underflow() 512*62c56f98SSadaf Ebrahimi{ 513*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 514*62c56f98SSadaf Ebrahimi 515*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 516*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 517*62c56f98SSadaf Ebrahimi 518*62c56f98SSadaf Ebrahimi /* 4 pushes (last one with an error), 4 pops (last one with an error) */ 519*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 520*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 521*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2); 522*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) 523*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_WRITE); 524*62c56f98SSadaf Ebrahimi 525*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 526*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 527*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2); 528*62c56f98SSadaf Ebrahimi 529*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) 530*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_READ); 531*62c56f98SSadaf Ebrahimi 532*62c56f98SSadaf Ebrahimiexit: 533*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue_free(&queue); 534*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 535*62c56f98SSadaf Ebrahimi} 536*62c56f98SSadaf Ebrahimi/* END_CASE */ 537*62c56f98SSadaf Ebrahimi 538*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 539*62c56f98SSadaf Ebrahimivoid ssl_message_queue_interleaved() 540*62c56f98SSadaf Ebrahimi{ 541*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 542*62c56f98SSadaf Ebrahimi 543*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 544*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0); 545*62c56f98SSadaf Ebrahimi 546*62c56f98SSadaf Ebrahimi /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops 547*62c56f98SSadaf Ebrahimi * (to wrap around the buffer) */ 548*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 549*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1); 550*62c56f98SSadaf Ebrahimi 551*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 552*62c56f98SSadaf Ebrahimi 553*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2); 554*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) == 3); 555*62c56f98SSadaf Ebrahimi 556*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1); 557*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2); 558*62c56f98SSadaf Ebrahimi 559*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 5) == 5); 560*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 8) == 8); 561*62c56f98SSadaf Ebrahimi 562*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 3) == 3); 563*62c56f98SSadaf Ebrahimi 564*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 5) == 5); 565*62c56f98SSadaf Ebrahimi 566*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 8) == 8); 567*62c56f98SSadaf Ebrahimi 568*62c56f98SSadaf Ebrahimiexit: 569*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue_free(&queue); 570*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 571*62c56f98SSadaf Ebrahimi} 572*62c56f98SSadaf Ebrahimi/* END_CASE */ 573*62c56f98SSadaf Ebrahimi 574*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 575*62c56f98SSadaf Ebrahimivoid ssl_message_queue_insufficient_buffer() 576*62c56f98SSadaf Ebrahimi{ 577*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT; 578*62c56f98SSadaf Ebrahimi size_t message_len = 10; 579*62c56f98SSadaf Ebrahimi size_t buffer_len = 5; 580*62c56f98SSadaf Ebrahimi 581*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 582*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 1) == 0); 583*62c56f98SSadaf Ebrahimi 584*62c56f98SSadaf Ebrahimi /* Popping without a sufficient buffer */ 585*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, message_len) 586*62c56f98SSadaf Ebrahimi == (int) message_len); 587*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, buffer_len) 588*62c56f98SSadaf Ebrahimi == (int) buffer_len); 589*62c56f98SSadaf Ebrahimiexit: 590*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue_free(&queue); 591*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 592*62c56f98SSadaf Ebrahimi} 593*62c56f98SSadaf Ebrahimi/* END_CASE */ 594*62c56f98SSadaf Ebrahimi 595*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 596*62c56f98SSadaf Ebrahimivoid ssl_message_mock_uninitialized() 597*62c56f98SSadaf Ebrahimi{ 598*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 599*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN] = { 0 }, received[MSGLEN]; 600*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 601*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 602*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 603*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 604*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 605*62c56f98SSadaf Ebrahimi 606*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 607*62c56f98SSadaf Ebrahimi /* Send with a NULL context */ 608*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(NULL, message, MSGLEN) 609*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_CONTEXT_ERROR); 610*62c56f98SSadaf Ebrahimi 611*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(NULL, message, MSGLEN) 612*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_CONTEXT_ERROR); 613*62c56f98SSadaf Ebrahimi 614*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 615*62c56f98SSadaf Ebrahimi &client_queue, 1, 616*62c56f98SSadaf Ebrahimi &server, 617*62c56f98SSadaf Ebrahimi &server_context) == 0); 618*62c56f98SSadaf Ebrahimi 619*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 620*62c56f98SSadaf Ebrahimi &server_queue, 1, 621*62c56f98SSadaf Ebrahimi &client, 622*62c56f98SSadaf Ebrahimi &client_context) == 0); 623*62c56f98SSadaf Ebrahimi 624*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 625*62c56f98SSadaf Ebrahimi MSGLEN) 626*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_SEND_FAILED); 627*62c56f98SSadaf Ebrahimi 628*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 629*62c56f98SSadaf Ebrahimi MSGLEN) 630*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_READ); 631*62c56f98SSadaf Ebrahimi 632*62c56f98SSadaf Ebrahimi /* Push directly to a queue to later simulate a disconnected behavior */ 633*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&server_queue, 634*62c56f98SSadaf Ebrahimi MSGLEN) 635*62c56f98SSadaf Ebrahimi == MSGLEN); 636*62c56f98SSadaf Ebrahimi 637*62c56f98SSadaf Ebrahimi /* Test if there's an error when trying to read from a disconnected 638*62c56f98SSadaf Ebrahimi * socket */ 639*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 640*62c56f98SSadaf Ebrahimi MSGLEN) 641*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_RECV_FAILED); 642*62c56f98SSadaf Ebrahimiexit: 643*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 644*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 645*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 646*62c56f98SSadaf Ebrahimi} 647*62c56f98SSadaf Ebrahimi/* END_CASE */ 648*62c56f98SSadaf Ebrahimi 649*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 650*62c56f98SSadaf Ebrahimivoid ssl_message_mock_basic() 651*62c56f98SSadaf Ebrahimi{ 652*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 653*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN], received[MSGLEN]; 654*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 655*62c56f98SSadaf Ebrahimi unsigned i; 656*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 657*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 658*62c56f98SSadaf Ebrahimi 659*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 660*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 661*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 662*62c56f98SSadaf Ebrahimi 663*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 664*62c56f98SSadaf Ebrahimi &client_queue, 1, 665*62c56f98SSadaf Ebrahimi &server, 666*62c56f98SSadaf Ebrahimi &server_context) == 0); 667*62c56f98SSadaf Ebrahimi 668*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 669*62c56f98SSadaf Ebrahimi &server_queue, 1, 670*62c56f98SSadaf Ebrahimi &client, 671*62c56f98SSadaf Ebrahimi &client_context) == 0); 672*62c56f98SSadaf Ebrahimi 673*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 674*62c56f98SSadaf Ebrahimi * can be detected */ 675*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 676*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 677*62c56f98SSadaf Ebrahimi } 678*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 679*62c56f98SSadaf Ebrahimi MSGLEN)); 680*62c56f98SSadaf Ebrahimi 681*62c56f98SSadaf Ebrahimi /* Send the message to the server */ 682*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 683*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 684*62c56f98SSadaf Ebrahimi 685*62c56f98SSadaf Ebrahimi /* Read from the server */ 686*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 687*62c56f98SSadaf Ebrahimi MSGLEN) 688*62c56f98SSadaf Ebrahimi == MSGLEN); 689*62c56f98SSadaf Ebrahimi 690*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 691*62c56f98SSadaf Ebrahimi memset(received, 0, MSGLEN); 692*62c56f98SSadaf Ebrahimi 693*62c56f98SSadaf Ebrahimi /* Send the message to the client */ 694*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message, 695*62c56f98SSadaf Ebrahimi MSGLEN) 696*62c56f98SSadaf Ebrahimi == MSGLEN); 697*62c56f98SSadaf Ebrahimi 698*62c56f98SSadaf Ebrahimi /* Read from the client */ 699*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 700*62c56f98SSadaf Ebrahimi MSGLEN) 701*62c56f98SSadaf Ebrahimi == MSGLEN); 702*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 703*62c56f98SSadaf Ebrahimi 704*62c56f98SSadaf Ebrahimiexit: 705*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 706*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 707*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 708*62c56f98SSadaf Ebrahimi} 709*62c56f98SSadaf Ebrahimi/* END_CASE */ 710*62c56f98SSadaf Ebrahimi 711*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 712*62c56f98SSadaf Ebrahimivoid ssl_message_mock_queue_overflow_underflow() 713*62c56f98SSadaf Ebrahimi{ 714*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 715*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN], received[MSGLEN]; 716*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 717*62c56f98SSadaf Ebrahimi unsigned i; 718*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 719*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 720*62c56f98SSadaf Ebrahimi 721*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 722*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 723*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 724*62c56f98SSadaf Ebrahimi 725*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 726*62c56f98SSadaf Ebrahimi &client_queue, 2, 727*62c56f98SSadaf Ebrahimi &server, 728*62c56f98SSadaf Ebrahimi &server_context) == 0); 729*62c56f98SSadaf Ebrahimi 730*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 731*62c56f98SSadaf Ebrahimi &server_queue, 2, 732*62c56f98SSadaf Ebrahimi &client, 733*62c56f98SSadaf Ebrahimi &client_context) == 0); 734*62c56f98SSadaf Ebrahimi 735*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 736*62c56f98SSadaf Ebrahimi * can be detected */ 737*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 738*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 739*62c56f98SSadaf Ebrahimi } 740*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 741*62c56f98SSadaf Ebrahimi MSGLEN*2)); 742*62c56f98SSadaf Ebrahimi 743*62c56f98SSadaf Ebrahimi /* Send three message to the server, last one with an error */ 744*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 745*62c56f98SSadaf Ebrahimi MSGLEN - 1) 746*62c56f98SSadaf Ebrahimi == MSGLEN - 1); 747*62c56f98SSadaf Ebrahimi 748*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 749*62c56f98SSadaf Ebrahimi MSGLEN) 750*62c56f98SSadaf Ebrahimi == MSGLEN); 751*62c56f98SSadaf Ebrahimi 752*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 753*62c56f98SSadaf Ebrahimi MSGLEN) 754*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_WRITE); 755*62c56f98SSadaf Ebrahimi 756*62c56f98SSadaf Ebrahimi /* Read three messages from the server, last one with an error */ 757*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 758*62c56f98SSadaf Ebrahimi MSGLEN - 1) 759*62c56f98SSadaf Ebrahimi == MSGLEN - 1); 760*62c56f98SSadaf Ebrahimi 761*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 762*62c56f98SSadaf Ebrahimi MSGLEN) 763*62c56f98SSadaf Ebrahimi == MSGLEN); 764*62c56f98SSadaf Ebrahimi 765*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 766*62c56f98SSadaf Ebrahimi 767*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 768*62c56f98SSadaf Ebrahimi MSGLEN) 769*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_READ); 770*62c56f98SSadaf Ebrahimi 771*62c56f98SSadaf Ebrahimiexit: 772*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 773*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 774*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 775*62c56f98SSadaf Ebrahimi} 776*62c56f98SSadaf Ebrahimi/* END_CASE */ 777*62c56f98SSadaf Ebrahimi 778*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 779*62c56f98SSadaf Ebrahimivoid ssl_message_mock_socket_overflow() 780*62c56f98SSadaf Ebrahimi{ 781*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 782*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN], received[MSGLEN]; 783*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 784*62c56f98SSadaf Ebrahimi unsigned i; 785*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 786*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 787*62c56f98SSadaf Ebrahimi 788*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 789*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 790*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 791*62c56f98SSadaf Ebrahimi 792*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 793*62c56f98SSadaf Ebrahimi &client_queue, 2, 794*62c56f98SSadaf Ebrahimi &server, 795*62c56f98SSadaf Ebrahimi &server_context) == 0); 796*62c56f98SSadaf Ebrahimi 797*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 798*62c56f98SSadaf Ebrahimi &server_queue, 2, 799*62c56f98SSadaf Ebrahimi &client, 800*62c56f98SSadaf Ebrahimi &client_context) == 0); 801*62c56f98SSadaf Ebrahimi 802*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 803*62c56f98SSadaf Ebrahimi * can be detected */ 804*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 805*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 806*62c56f98SSadaf Ebrahimi } 807*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 808*62c56f98SSadaf Ebrahimi MSGLEN)); 809*62c56f98SSadaf Ebrahimi 810*62c56f98SSadaf Ebrahimi /* Send two message to the server, second one with an error */ 811*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 812*62c56f98SSadaf Ebrahimi MSGLEN) 813*62c56f98SSadaf Ebrahimi == MSGLEN); 814*62c56f98SSadaf Ebrahimi 815*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 816*62c56f98SSadaf Ebrahimi MSGLEN) 817*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_SEND_FAILED); 818*62c56f98SSadaf Ebrahimi 819*62c56f98SSadaf Ebrahimi /* Read the only message from the server */ 820*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 821*62c56f98SSadaf Ebrahimi MSGLEN) 822*62c56f98SSadaf Ebrahimi == MSGLEN); 823*62c56f98SSadaf Ebrahimi 824*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 825*62c56f98SSadaf Ebrahimi 826*62c56f98SSadaf Ebrahimiexit: 827*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 828*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 829*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 830*62c56f98SSadaf Ebrahimi} 831*62c56f98SSadaf Ebrahimi/* END_CASE */ 832*62c56f98SSadaf Ebrahimi 833*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 834*62c56f98SSadaf Ebrahimivoid ssl_message_mock_truncated() 835*62c56f98SSadaf Ebrahimi{ 836*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 837*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN], received[MSGLEN]; 838*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 839*62c56f98SSadaf Ebrahimi unsigned i; 840*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 841*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 842*62c56f98SSadaf Ebrahimi 843*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 844*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 845*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 846*62c56f98SSadaf Ebrahimi 847*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 848*62c56f98SSadaf Ebrahimi &client_queue, 2, 849*62c56f98SSadaf Ebrahimi &server, 850*62c56f98SSadaf Ebrahimi &server_context) == 0); 851*62c56f98SSadaf Ebrahimi 852*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 853*62c56f98SSadaf Ebrahimi &server_queue, 2, 854*62c56f98SSadaf Ebrahimi &client, 855*62c56f98SSadaf Ebrahimi &client_context) == 0); 856*62c56f98SSadaf Ebrahimi 857*62c56f98SSadaf Ebrahimi memset(received, 0, MSGLEN); 858*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 859*62c56f98SSadaf Ebrahimi * can be detected */ 860*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 861*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 862*62c56f98SSadaf Ebrahimi } 863*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 864*62c56f98SSadaf Ebrahimi 2 * MSGLEN)); 865*62c56f98SSadaf Ebrahimi 866*62c56f98SSadaf Ebrahimi /* Send two messages to the server, the second one small enough to fit in the 867*62c56f98SSadaf Ebrahimi * receiver's buffer. */ 868*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 869*62c56f98SSadaf Ebrahimi MSGLEN) 870*62c56f98SSadaf Ebrahimi == MSGLEN); 871*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 872*62c56f98SSadaf Ebrahimi MSGLEN / 2) 873*62c56f98SSadaf Ebrahimi == MSGLEN / 2); 874*62c56f98SSadaf Ebrahimi /* Read a truncated message from the server */ 875*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 876*62c56f98SSadaf Ebrahimi MSGLEN/2) 877*62c56f98SSadaf Ebrahimi == MSGLEN/2); 878*62c56f98SSadaf Ebrahimi 879*62c56f98SSadaf Ebrahimi /* Test that the first half of the message is valid, and second one isn't */ 880*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0); 881*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2) 882*62c56f98SSadaf Ebrahimi != 0); 883*62c56f98SSadaf Ebrahimi memset(received, 0, MSGLEN); 884*62c56f98SSadaf Ebrahimi 885*62c56f98SSadaf Ebrahimi /* Read a full message from the server */ 886*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 887*62c56f98SSadaf Ebrahimi MSGLEN/2) 888*62c56f98SSadaf Ebrahimi == MSGLEN / 2); 889*62c56f98SSadaf Ebrahimi 890*62c56f98SSadaf Ebrahimi /* Test that the first half of the message is valid */ 891*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0); 892*62c56f98SSadaf Ebrahimi 893*62c56f98SSadaf Ebrahimiexit: 894*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 895*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 896*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 897*62c56f98SSadaf Ebrahimi} 898*62c56f98SSadaf Ebrahimi/* END_CASE */ 899*62c56f98SSadaf Ebrahimi 900*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 901*62c56f98SSadaf Ebrahimivoid ssl_message_mock_socket_read_error() 902*62c56f98SSadaf Ebrahimi{ 903*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 904*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN], received[MSGLEN]; 905*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 906*62c56f98SSadaf Ebrahimi unsigned i; 907*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 908*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 909*62c56f98SSadaf Ebrahimi 910*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 911*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 912*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 913*62c56f98SSadaf Ebrahimi 914*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 915*62c56f98SSadaf Ebrahimi &client_queue, 1, 916*62c56f98SSadaf Ebrahimi &server, 917*62c56f98SSadaf Ebrahimi &server_context) == 0); 918*62c56f98SSadaf Ebrahimi 919*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 920*62c56f98SSadaf Ebrahimi &server_queue, 1, 921*62c56f98SSadaf Ebrahimi &client, 922*62c56f98SSadaf Ebrahimi &client_context) == 0); 923*62c56f98SSadaf Ebrahimi 924*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 925*62c56f98SSadaf Ebrahimi * can be detected */ 926*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 927*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 928*62c56f98SSadaf Ebrahimi } 929*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 930*62c56f98SSadaf Ebrahimi MSGLEN)); 931*62c56f98SSadaf Ebrahimi 932*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 933*62c56f98SSadaf Ebrahimi MSGLEN) 934*62c56f98SSadaf Ebrahimi == MSGLEN); 935*62c56f98SSadaf Ebrahimi 936*62c56f98SSadaf Ebrahimi /* Force a read error by disconnecting the socket by hand */ 937*62c56f98SSadaf Ebrahimi server.status = 0; 938*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 939*62c56f98SSadaf Ebrahimi MSGLEN) 940*62c56f98SSadaf Ebrahimi == MBEDTLS_TEST_ERROR_RECV_FAILED); 941*62c56f98SSadaf Ebrahimi /* Return to a valid state */ 942*62c56f98SSadaf Ebrahimi server.status = MBEDTLS_MOCK_SOCKET_CONNECTED; 943*62c56f98SSadaf Ebrahimi 944*62c56f98SSadaf Ebrahimi memset(received, 0, sizeof(received)); 945*62c56f98SSadaf Ebrahimi 946*62c56f98SSadaf Ebrahimi /* Test that even though the server tried to read once disconnected, the 947*62c56f98SSadaf Ebrahimi * continuity is preserved */ 948*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 949*62c56f98SSadaf Ebrahimi MSGLEN) 950*62c56f98SSadaf Ebrahimi == MSGLEN); 951*62c56f98SSadaf Ebrahimi 952*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 953*62c56f98SSadaf Ebrahimi 954*62c56f98SSadaf Ebrahimiexit: 955*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 956*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 957*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 958*62c56f98SSadaf Ebrahimi} 959*62c56f98SSadaf Ebrahimi/* END_CASE */ 960*62c56f98SSadaf Ebrahimi 961*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 962*62c56f98SSadaf Ebrahimivoid ssl_message_mock_interleaved_one_way() 963*62c56f98SSadaf Ebrahimi{ 964*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 965*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN], received[MSGLEN]; 966*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 967*62c56f98SSadaf Ebrahimi unsigned i; 968*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 969*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 970*62c56f98SSadaf Ebrahimi 971*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 972*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 973*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 974*62c56f98SSadaf Ebrahimi 975*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 976*62c56f98SSadaf Ebrahimi &client_queue, 3, 977*62c56f98SSadaf Ebrahimi &server, 978*62c56f98SSadaf Ebrahimi &server_context) == 0); 979*62c56f98SSadaf Ebrahimi 980*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 981*62c56f98SSadaf Ebrahimi &server_queue, 3, 982*62c56f98SSadaf Ebrahimi &client, 983*62c56f98SSadaf Ebrahimi &client_context) == 0); 984*62c56f98SSadaf Ebrahimi 985*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 986*62c56f98SSadaf Ebrahimi * can be detected */ 987*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 988*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 989*62c56f98SSadaf Ebrahimi } 990*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 991*62c56f98SSadaf Ebrahimi MSGLEN*3)); 992*62c56f98SSadaf Ebrahimi 993*62c56f98SSadaf Ebrahimi /* Interleaved test - [2 sends, 1 read] twice, and then two reads 994*62c56f98SSadaf Ebrahimi * (to wrap around the buffer) */ 995*62c56f98SSadaf Ebrahimi for (i = 0; i < 2; i++) { 996*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 997*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 998*62c56f98SSadaf Ebrahimi 999*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 1000*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1001*62c56f98SSadaf Ebrahimi 1002*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1003*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1004*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1005*62c56f98SSadaf Ebrahimi memset(received, 0, sizeof(received)); 1006*62c56f98SSadaf Ebrahimi } 1007*62c56f98SSadaf Ebrahimi 1008*62c56f98SSadaf Ebrahimi for (i = 0; i < 2; i++) { 1009*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1010*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1011*62c56f98SSadaf Ebrahimi 1012*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1013*62c56f98SSadaf Ebrahimi } 1014*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1015*62c56f98SSadaf Ebrahimi MSGLEN) 1016*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_READ); 1017*62c56f98SSadaf Ebrahimiexit: 1018*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 1019*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 1020*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 1021*62c56f98SSadaf Ebrahimi} 1022*62c56f98SSadaf Ebrahimi/* END_CASE */ 1023*62c56f98SSadaf Ebrahimi 1024*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 1025*62c56f98SSadaf Ebrahimivoid ssl_message_mock_interleaved_two_ways() 1026*62c56f98SSadaf Ebrahimi{ 1027*62c56f98SSadaf Ebrahimi enum { MSGLEN = 10 }; 1028*62c56f98SSadaf Ebrahimi unsigned char message[MSGLEN], received[MSGLEN]; 1029*62c56f98SSadaf Ebrahimi mbedtls_test_mock_socket client, server; 1030*62c56f98SSadaf Ebrahimi unsigned i; 1031*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_message_queue server_queue, client_queue; 1032*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 1033*62c56f98SSadaf Ebrahimi 1034*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 1035*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 1036*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 1037*62c56f98SSadaf Ebrahimi 1038*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue, 1039*62c56f98SSadaf Ebrahimi &client_queue, 3, 1040*62c56f98SSadaf Ebrahimi &server, 1041*62c56f98SSadaf Ebrahimi &server_context) == 0); 1042*62c56f98SSadaf Ebrahimi 1043*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue, 1044*62c56f98SSadaf Ebrahimi &server_queue, 3, 1045*62c56f98SSadaf Ebrahimi &client, 1046*62c56f98SSadaf Ebrahimi &client_context) == 0); 1047*62c56f98SSadaf Ebrahimi 1048*62c56f98SSadaf Ebrahimi /* Fill up the buffer with structured data so that unwanted changes 1049*62c56f98SSadaf Ebrahimi * can be detected */ 1050*62c56f98SSadaf Ebrahimi for (i = 0; i < MSGLEN; i++) { 1051*62c56f98SSadaf Ebrahimi message[i] = i & 0xFF; 1052*62c56f98SSadaf Ebrahimi } 1053*62c56f98SSadaf Ebrahimi TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, 1054*62c56f98SSadaf Ebrahimi MSGLEN*3)); 1055*62c56f98SSadaf Ebrahimi 1056*62c56f98SSadaf Ebrahimi /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads 1057*62c56f98SSadaf Ebrahimi * (to wrap around the buffer) both ways. */ 1058*62c56f98SSadaf Ebrahimi for (i = 0; i < 2; i++) { 1059*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 1060*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1061*62c56f98SSadaf Ebrahimi 1062*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message, 1063*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1064*62c56f98SSadaf Ebrahimi 1065*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message, 1066*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1067*62c56f98SSadaf Ebrahimi 1068*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message, 1069*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1070*62c56f98SSadaf Ebrahimi 1071*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1072*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1073*62c56f98SSadaf Ebrahimi 1074*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1075*62c56f98SSadaf Ebrahimi 1076*62c56f98SSadaf Ebrahimi memset(received, 0, sizeof(received)); 1077*62c56f98SSadaf Ebrahimi 1078*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 1079*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1080*62c56f98SSadaf Ebrahimi 1081*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1082*62c56f98SSadaf Ebrahimi 1083*62c56f98SSadaf Ebrahimi memset(received, 0, sizeof(received)); 1084*62c56f98SSadaf Ebrahimi } 1085*62c56f98SSadaf Ebrahimi 1086*62c56f98SSadaf Ebrahimi for (i = 0; i < 2; i++) { 1087*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1088*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1089*62c56f98SSadaf Ebrahimi 1090*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1091*62c56f98SSadaf Ebrahimi memset(received, 0, sizeof(received)); 1092*62c56f98SSadaf Ebrahimi 1093*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 1094*62c56f98SSadaf Ebrahimi MSGLEN) == MSGLEN); 1095*62c56f98SSadaf Ebrahimi 1096*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(message, received, MSGLEN) == 0); 1097*62c56f98SSadaf Ebrahimi memset(received, 0, sizeof(received)); 1098*62c56f98SSadaf Ebrahimi } 1099*62c56f98SSadaf Ebrahimi 1100*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received, 1101*62c56f98SSadaf Ebrahimi MSGLEN) 1102*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_READ); 1103*62c56f98SSadaf Ebrahimi 1104*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received, 1105*62c56f98SSadaf Ebrahimi MSGLEN) 1106*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_WANT_READ); 1107*62c56f98SSadaf Ebrahimiexit: 1108*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&server_context); 1109*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_close(&client_context); 1110*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 1111*62c56f98SSadaf Ebrahimi} 1112*62c56f98SSadaf Ebrahimi/* END_CASE */ 1113*62c56f98SSadaf Ebrahimi 1114*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */ 1115*62c56f98SSadaf Ebrahimivoid ssl_dtls_replay(data_t *prevs, data_t *new, int ret) 1116*62c56f98SSadaf Ebrahimi{ 1117*62c56f98SSadaf Ebrahimi uint32_t len = 0; 1118*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 1119*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 1120*62c56f98SSadaf Ebrahimi 1121*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 1122*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 1123*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 1124*62c56f98SSadaf Ebrahimi 1125*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_config_defaults(&conf, 1126*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_CLIENT, 1127*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TRANSPORT_DATAGRAM, 1128*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRESET_DEFAULT) == 0); 1129*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 1130*62c56f98SSadaf Ebrahimi 1131*62c56f98SSadaf Ebrahimi /* Read previous record numbers */ 1132*62c56f98SSadaf Ebrahimi for (len = 0; len < prevs->len; len += 6) { 1133*62c56f98SSadaf Ebrahimi memcpy(ssl.in_ctr + 2, prevs->x + len, 6); 1134*62c56f98SSadaf Ebrahimi mbedtls_ssl_dtls_replay_update(&ssl); 1135*62c56f98SSadaf Ebrahimi } 1136*62c56f98SSadaf Ebrahimi 1137*62c56f98SSadaf Ebrahimi /* Check new number */ 1138*62c56f98SSadaf Ebrahimi memcpy(ssl.in_ctr + 2, new->x, 6); 1139*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret); 1140*62c56f98SSadaf Ebrahimi 1141*62c56f98SSadaf Ebrahimiexit: 1142*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 1143*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 1144*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 1145*62c56f98SSadaf Ebrahimi} 1146*62c56f98SSadaf Ebrahimi/* END_CASE */ 1147*62c56f98SSadaf Ebrahimi 1148*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ 1149*62c56f98SSadaf Ebrahimivoid ssl_set_hostname_twice(char *hostname0, char *hostname1) 1150*62c56f98SSadaf Ebrahimi{ 1151*62c56f98SSadaf Ebrahimi const char *hostname; 1152*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 1153*62c56f98SSadaf Ebrahimi 1154*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 1155*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 1156*62c56f98SSadaf Ebrahimi 1157*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname0) == 0); 1158*62c56f98SSadaf Ebrahimi hostname = mbedtls_ssl_get_hostname(&ssl); 1159*62c56f98SSadaf Ebrahimi TEST_ASSERT(strcmp(hostname0, hostname) == 0); 1160*62c56f98SSadaf Ebrahimi 1161*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname1) == 0); 1162*62c56f98SSadaf Ebrahimi hostname = mbedtls_ssl_get_hostname(&ssl); 1163*62c56f98SSadaf Ebrahimi TEST_ASSERT(strcmp(hostname1, hostname) == 0); 1164*62c56f98SSadaf Ebrahimi 1165*62c56f98SSadaf Ebrahimiexit: 1166*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 1167*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 1168*62c56f98SSadaf Ebrahimi} 1169*62c56f98SSadaf Ebrahimi/* END_CASE */ 1170*62c56f98SSadaf Ebrahimi 1171*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 1172*62c56f98SSadaf Ebrahimivoid ssl_crypt_record(int cipher_type, int hash_id, 1173*62c56f98SSadaf Ebrahimi int etm, int tag_mode, int ver, 1174*62c56f98SSadaf Ebrahimi int cid0_len, int cid1_len) 1175*62c56f98SSadaf Ebrahimi{ 1176*62c56f98SSadaf Ebrahimi /* 1177*62c56f98SSadaf Ebrahimi * Test several record encryptions and decryptions 1178*62c56f98SSadaf Ebrahimi * with plenty of space before and after the data 1179*62c56f98SSadaf Ebrahimi * within the record buffer. 1180*62c56f98SSadaf Ebrahimi */ 1181*62c56f98SSadaf Ebrahimi 1182*62c56f98SSadaf Ebrahimi int ret; 1183*62c56f98SSadaf Ebrahimi int num_records = 16; 1184*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; /* ONLY for debugging */ 1185*62c56f98SSadaf Ebrahimi 1186*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform t0, t1; 1187*62c56f98SSadaf Ebrahimi unsigned char *buf = NULL; 1188*62c56f98SSadaf Ebrahimi size_t const buflen = 512; 1189*62c56f98SSadaf Ebrahimi mbedtls_record rec, rec_backup; 1190*62c56f98SSadaf Ebrahimi 1191*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 1192*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_init(&t0); 1193*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_init(&t1); 1194*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 1195*62c56f98SSadaf Ebrahimi 1196*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id, 1197*62c56f98SSadaf Ebrahimi etm, tag_mode, ver, 1198*62c56f98SSadaf Ebrahimi (size_t) cid0_len, 1199*62c56f98SSadaf Ebrahimi (size_t) cid1_len); 1200*62c56f98SSadaf Ebrahimi 1201*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0); 1202*62c56f98SSadaf Ebrahimi 1203*62c56f98SSadaf Ebrahimi TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL); 1204*62c56f98SSadaf Ebrahimi 1205*62c56f98SSadaf Ebrahimi while (num_records-- > 0) { 1206*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform *t_dec, *t_enc; 1207*62c56f98SSadaf Ebrahimi /* Take turns in who's sending and who's receiving. */ 1208*62c56f98SSadaf Ebrahimi if (num_records % 3 == 0) { 1209*62c56f98SSadaf Ebrahimi t_dec = &t0; 1210*62c56f98SSadaf Ebrahimi t_enc = &t1; 1211*62c56f98SSadaf Ebrahimi } else { 1212*62c56f98SSadaf Ebrahimi t_dec = &t1; 1213*62c56f98SSadaf Ebrahimi t_enc = &t0; 1214*62c56f98SSadaf Ebrahimi } 1215*62c56f98SSadaf Ebrahimi 1216*62c56f98SSadaf Ebrahimi /* 1217*62c56f98SSadaf Ebrahimi * The record header affects the transformation in two ways: 1218*62c56f98SSadaf Ebrahimi * 1) It determines the AEAD additional data 1219*62c56f98SSadaf Ebrahimi * 2) The record counter sometimes determines the IV. 1220*62c56f98SSadaf Ebrahimi * 1221*62c56f98SSadaf Ebrahimi * Apart from that, the fields don't have influence. 1222*62c56f98SSadaf Ebrahimi * In particular, it is currently not the responsibility 1223*62c56f98SSadaf Ebrahimi * of ssl_encrypt/decrypt_buf to check if the transform 1224*62c56f98SSadaf Ebrahimi * version matches the record version, or that the 1225*62c56f98SSadaf Ebrahimi * type is sensible. 1226*62c56f98SSadaf Ebrahimi */ 1227*62c56f98SSadaf Ebrahimi 1228*62c56f98SSadaf Ebrahimi memset(rec.ctr, num_records, sizeof(rec.ctr)); 1229*62c56f98SSadaf Ebrahimi rec.type = 42; 1230*62c56f98SSadaf Ebrahimi rec.ver[0] = num_records; 1231*62c56f98SSadaf Ebrahimi rec.ver[1] = num_records; 1232*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1233*62c56f98SSadaf Ebrahimi rec.cid_len = 0; 1234*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1235*62c56f98SSadaf Ebrahimi 1236*62c56f98SSadaf Ebrahimi rec.buf = buf; 1237*62c56f98SSadaf Ebrahimi rec.buf_len = buflen; 1238*62c56f98SSadaf Ebrahimi rec.data_offset = 16; 1239*62c56f98SSadaf Ebrahimi /* Make sure to vary the length to exercise different 1240*62c56f98SSadaf Ebrahimi * paddings. */ 1241*62c56f98SSadaf Ebrahimi rec.data_len = 1 + num_records; 1242*62c56f98SSadaf Ebrahimi 1243*62c56f98SSadaf Ebrahimi memset(rec.buf + rec.data_offset, 42, rec.data_len); 1244*62c56f98SSadaf Ebrahimi 1245*62c56f98SSadaf Ebrahimi /* Make a copy for later comparison */ 1246*62c56f98SSadaf Ebrahimi rec_backup = rec; 1247*62c56f98SSadaf Ebrahimi 1248*62c56f98SSadaf Ebrahimi /* Encrypt record */ 1249*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec, 1250*62c56f98SSadaf Ebrahimi mbedtls_test_rnd_std_rand, NULL); 1251*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 1252*62c56f98SSadaf Ebrahimi if (ret != 0) { 1253*62c56f98SSadaf Ebrahimi continue; 1254*62c56f98SSadaf Ebrahimi } 1255*62c56f98SSadaf Ebrahimi 1256*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1257*62c56f98SSadaf Ebrahimi if (rec.cid_len != 0) { 1258*62c56f98SSadaf Ebrahimi /* DTLS 1.2 + CID hides the real content type and 1259*62c56f98SSadaf Ebrahimi * uses a special CID content type in the protected 1260*62c56f98SSadaf Ebrahimi * record. Double-check this. */ 1261*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID); 1262*62c56f98SSadaf Ebrahimi } 1263*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1264*62c56f98SSadaf Ebrahimi 1265*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 1266*62c56f98SSadaf Ebrahimi if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 1267*62c56f98SSadaf Ebrahimi /* TLS 1.3 hides the real content type and 1268*62c56f98SSadaf Ebrahimi * always uses Application Data as the content type 1269*62c56f98SSadaf Ebrahimi * for protected records. Double-check this. */ 1270*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA); 1271*62c56f98SSadaf Ebrahimi } 1272*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 1273*62c56f98SSadaf Ebrahimi 1274*62c56f98SSadaf Ebrahimi /* Decrypt record with t_dec */ 1275*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec); 1276*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0); 1277*62c56f98SSadaf Ebrahimi 1278*62c56f98SSadaf Ebrahimi /* Compare results */ 1279*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.type == rec_backup.type); 1280*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0); 1281*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]); 1282*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]); 1283*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.data_len == rec_backup.data_len); 1284*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.data_offset == rec_backup.data_offset); 1285*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(rec.buf + rec.data_offset, 1286*62c56f98SSadaf Ebrahimi rec_backup.buf + rec_backup.data_offset, 1287*62c56f98SSadaf Ebrahimi rec.data_len) == 0); 1288*62c56f98SSadaf Ebrahimi } 1289*62c56f98SSadaf Ebrahimi 1290*62c56f98SSadaf Ebrahimiexit: 1291*62c56f98SSadaf Ebrahimi 1292*62c56f98SSadaf Ebrahimi /* Cleanup */ 1293*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 1294*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(&t0); 1295*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(&t1); 1296*62c56f98SSadaf Ebrahimi 1297*62c56f98SSadaf Ebrahimi mbedtls_free(buf); 1298*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 1299*62c56f98SSadaf Ebrahimi} 1300*62c56f98SSadaf Ebrahimi/* END_CASE */ 1301*62c56f98SSadaf Ebrahimi 1302*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 1303*62c56f98SSadaf Ebrahimivoid ssl_crypt_record_small(int cipher_type, int hash_id, 1304*62c56f98SSadaf Ebrahimi int etm, int tag_mode, int ver, 1305*62c56f98SSadaf Ebrahimi int cid0_len, int cid1_len) 1306*62c56f98SSadaf Ebrahimi{ 1307*62c56f98SSadaf Ebrahimi /* 1308*62c56f98SSadaf Ebrahimi * Test pairs of encryption and decryption with an increasing 1309*62c56f98SSadaf Ebrahimi * amount of space in the record buffer - in more detail: 1310*62c56f98SSadaf Ebrahimi * 1) Try to encrypt with 0, 1, 2, ... bytes available 1311*62c56f98SSadaf Ebrahimi * in front of the plaintext, and expect the encryption 1312*62c56f98SSadaf Ebrahimi * to succeed starting from some offset. Always keep 1313*62c56f98SSadaf Ebrahimi * enough space in the end of the buffer. 1314*62c56f98SSadaf Ebrahimi * 2) Try to encrypt with 0, 1, 2, ... bytes available 1315*62c56f98SSadaf Ebrahimi * at the end of the plaintext, and expect the encryption 1316*62c56f98SSadaf Ebrahimi * to succeed starting from some offset. Always keep 1317*62c56f98SSadaf Ebrahimi * enough space at the beginning of the buffer. 1318*62c56f98SSadaf Ebrahimi * 3) Try to encrypt with 0, 1, 2, ... bytes available 1319*62c56f98SSadaf Ebrahimi * both at the front and end of the plaintext, 1320*62c56f98SSadaf Ebrahimi * and expect the encryption to succeed starting from 1321*62c56f98SSadaf Ebrahimi * some offset. 1322*62c56f98SSadaf Ebrahimi * 1323*62c56f98SSadaf Ebrahimi * If encryption succeeds, check that decryption succeeds 1324*62c56f98SSadaf Ebrahimi * and yields the original record. 1325*62c56f98SSadaf Ebrahimi */ 1326*62c56f98SSadaf Ebrahimi 1327*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; /* ONLY for debugging */ 1328*62c56f98SSadaf Ebrahimi 1329*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform t0, t1; 1330*62c56f98SSadaf Ebrahimi unsigned char *buf = NULL; 1331*62c56f98SSadaf Ebrahimi size_t const buflen = 256; 1332*62c56f98SSadaf Ebrahimi mbedtls_record rec, rec_backup; 1333*62c56f98SSadaf Ebrahimi 1334*62c56f98SSadaf Ebrahimi int ret; 1335*62c56f98SSadaf Ebrahimi int mode; /* Mode 1, 2 or 3 as explained above */ 1336*62c56f98SSadaf Ebrahimi size_t offset; /* Available space at beginning/end/both */ 1337*62c56f98SSadaf Ebrahimi size_t threshold = 96; /* Maximum offset to test against */ 1338*62c56f98SSadaf Ebrahimi 1339*62c56f98SSadaf Ebrahimi size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */ 1340*62c56f98SSadaf Ebrahimi size_t default_post_padding = 128; /* Post-padding to use in mode 1 */ 1341*62c56f98SSadaf Ebrahimi 1342*62c56f98SSadaf Ebrahimi int seen_success; /* Indicates if in the current mode we've 1343*62c56f98SSadaf Ebrahimi * already seen a successful test. */ 1344*62c56f98SSadaf Ebrahimi 1345*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 1346*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_init(&t0); 1347*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_init(&t1); 1348*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 1349*62c56f98SSadaf Ebrahimi 1350*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id, 1351*62c56f98SSadaf Ebrahimi etm, tag_mode, ver, 1352*62c56f98SSadaf Ebrahimi (size_t) cid0_len, 1353*62c56f98SSadaf Ebrahimi (size_t) cid1_len); 1354*62c56f98SSadaf Ebrahimi 1355*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0); 1356*62c56f98SSadaf Ebrahimi 1357*62c56f98SSadaf Ebrahimi TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL); 1358*62c56f98SSadaf Ebrahimi 1359*62c56f98SSadaf Ebrahimi for (mode = 1; mode <= 3; mode++) { 1360*62c56f98SSadaf Ebrahimi seen_success = 0; 1361*62c56f98SSadaf Ebrahimi for (offset = 0; offset <= threshold; offset++) { 1362*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform *t_dec, *t_enc; 1363*62c56f98SSadaf Ebrahimi t_dec = &t0; 1364*62c56f98SSadaf Ebrahimi t_enc = &t1; 1365*62c56f98SSadaf Ebrahimi 1366*62c56f98SSadaf Ebrahimi memset(rec.ctr, offset, sizeof(rec.ctr)); 1367*62c56f98SSadaf Ebrahimi rec.type = 42; 1368*62c56f98SSadaf Ebrahimi rec.ver[0] = offset; 1369*62c56f98SSadaf Ebrahimi rec.ver[1] = offset; 1370*62c56f98SSadaf Ebrahimi rec.buf = buf; 1371*62c56f98SSadaf Ebrahimi rec.buf_len = buflen; 1372*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1373*62c56f98SSadaf Ebrahimi rec.cid_len = 0; 1374*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1375*62c56f98SSadaf Ebrahimi 1376*62c56f98SSadaf Ebrahimi switch (mode) { 1377*62c56f98SSadaf Ebrahimi case 1: /* Space in the beginning */ 1378*62c56f98SSadaf Ebrahimi rec.data_offset = offset; 1379*62c56f98SSadaf Ebrahimi rec.data_len = buflen - offset - default_post_padding; 1380*62c56f98SSadaf Ebrahimi break; 1381*62c56f98SSadaf Ebrahimi 1382*62c56f98SSadaf Ebrahimi case 2: /* Space in the end */ 1383*62c56f98SSadaf Ebrahimi rec.data_offset = default_pre_padding; 1384*62c56f98SSadaf Ebrahimi rec.data_len = buflen - default_pre_padding - offset; 1385*62c56f98SSadaf Ebrahimi break; 1386*62c56f98SSadaf Ebrahimi 1387*62c56f98SSadaf Ebrahimi case 3: /* Space in the beginning and end */ 1388*62c56f98SSadaf Ebrahimi rec.data_offset = offset; 1389*62c56f98SSadaf Ebrahimi rec.data_len = buflen - 2 * offset; 1390*62c56f98SSadaf Ebrahimi break; 1391*62c56f98SSadaf Ebrahimi 1392*62c56f98SSadaf Ebrahimi default: 1393*62c56f98SSadaf Ebrahimi TEST_ASSERT(0); 1394*62c56f98SSadaf Ebrahimi break; 1395*62c56f98SSadaf Ebrahimi } 1396*62c56f98SSadaf Ebrahimi 1397*62c56f98SSadaf Ebrahimi memset(rec.buf + rec.data_offset, 42, rec.data_len); 1398*62c56f98SSadaf Ebrahimi 1399*62c56f98SSadaf Ebrahimi /* Make a copy for later comparison */ 1400*62c56f98SSadaf Ebrahimi rec_backup = rec; 1401*62c56f98SSadaf Ebrahimi 1402*62c56f98SSadaf Ebrahimi /* Encrypt record */ 1403*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec, 1404*62c56f98SSadaf Ebrahimi mbedtls_test_rnd_std_rand, NULL); 1405*62c56f98SSadaf Ebrahimi 1406*62c56f98SSadaf Ebrahimi if (ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) { 1407*62c56f98SSadaf Ebrahimi /* It's ok if the output buffer is too small. We do insist 1408*62c56f98SSadaf Ebrahimi * on at least one mode succeeding; this is tracked by 1409*62c56f98SSadaf Ebrahimi * seen_success. */ 1410*62c56f98SSadaf Ebrahimi continue; 1411*62c56f98SSadaf Ebrahimi } 1412*62c56f98SSadaf Ebrahimi 1413*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 1414*62c56f98SSadaf Ebrahimi seen_success = 1; 1415*62c56f98SSadaf Ebrahimi 1416*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1417*62c56f98SSadaf Ebrahimi if (rec.cid_len != 0) { 1418*62c56f98SSadaf Ebrahimi /* DTLS 1.2 + CID hides the real content type and 1419*62c56f98SSadaf Ebrahimi * uses a special CID content type in the protected 1420*62c56f98SSadaf Ebrahimi * record. Double-check this. */ 1421*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID); 1422*62c56f98SSadaf Ebrahimi } 1423*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1424*62c56f98SSadaf Ebrahimi 1425*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 1426*62c56f98SSadaf Ebrahimi if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 1427*62c56f98SSadaf Ebrahimi /* TLS 1.3 hides the real content type and 1428*62c56f98SSadaf Ebrahimi * always uses Application Data as the content type 1429*62c56f98SSadaf Ebrahimi * for protected records. Double-check this. */ 1430*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA); 1431*62c56f98SSadaf Ebrahimi } 1432*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 1433*62c56f98SSadaf Ebrahimi 1434*62c56f98SSadaf Ebrahimi /* Decrypt record with t_dec */ 1435*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0); 1436*62c56f98SSadaf Ebrahimi 1437*62c56f98SSadaf Ebrahimi /* Compare results */ 1438*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.type == rec_backup.type); 1439*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0); 1440*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]); 1441*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]); 1442*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.data_len == rec_backup.data_len); 1443*62c56f98SSadaf Ebrahimi TEST_ASSERT(rec.data_offset == rec_backup.data_offset); 1444*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(rec.buf + rec.data_offset, 1445*62c56f98SSadaf Ebrahimi rec_backup.buf + rec_backup.data_offset, 1446*62c56f98SSadaf Ebrahimi rec.data_len) == 0); 1447*62c56f98SSadaf Ebrahimi } 1448*62c56f98SSadaf Ebrahimi 1449*62c56f98SSadaf Ebrahimi TEST_ASSERT(seen_success == 1); 1450*62c56f98SSadaf Ebrahimi } 1451*62c56f98SSadaf Ebrahimi 1452*62c56f98SSadaf Ebrahimiexit: 1453*62c56f98SSadaf Ebrahimi 1454*62c56f98SSadaf Ebrahimi /* Cleanup */ 1455*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 1456*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(&t0); 1457*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(&t1); 1458*62c56f98SSadaf Ebrahimi 1459*62c56f98SSadaf Ebrahimi mbedtls_free(buf); 1460*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 1461*62c56f98SSadaf Ebrahimi} 1462*62c56f98SSadaf Ebrahimi/* END_CASE */ 1463*62c56f98SSadaf Ebrahimi 1464*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1465*62c56f98SSadaf Ebrahimivoid ssl_tls13_hkdf_expand_label(int hash_alg, 1466*62c56f98SSadaf Ebrahimi data_t *secret, 1467*62c56f98SSadaf Ebrahimi int label_idx, 1468*62c56f98SSadaf Ebrahimi data_t *ctx, 1469*62c56f98SSadaf Ebrahimi int desired_length, 1470*62c56f98SSadaf Ebrahimi data_t *expected) 1471*62c56f98SSadaf Ebrahimi{ 1472*62c56f98SSadaf Ebrahimi unsigned char dst[100]; 1473*62c56f98SSadaf Ebrahimi 1474*62c56f98SSadaf Ebrahimi unsigned char const *lbl = NULL; 1475*62c56f98SSadaf Ebrahimi size_t lbl_len; 1476*62c56f98SSadaf Ebrahimi#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \ 1477*62c56f98SSadaf Ebrahimi if (label_idx == (int) tls13_label_ ## name) \ 1478*62c56f98SSadaf Ebrahimi { \ 1479*62c56f98SSadaf Ebrahimi lbl = mbedtls_ssl_tls13_labels.name; \ 1480*62c56f98SSadaf Ebrahimi lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \ 1481*62c56f98SSadaf Ebrahimi } 1482*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS1_3_LABEL_LIST 1483*62c56f98SSadaf Ebrahimi#undef MBEDTLS_SSL_TLS1_3_LABEL 1484*62c56f98SSadaf Ebrahimi TEST_ASSERT(lbl != NULL); 1485*62c56f98SSadaf Ebrahimi 1486*62c56f98SSadaf Ebrahimi /* Check sanity of test parameters. */ 1487*62c56f98SSadaf Ebrahimi TEST_ASSERT((size_t) desired_length <= sizeof(dst)); 1488*62c56f98SSadaf Ebrahimi TEST_ASSERT((size_t) desired_length == expected->len); 1489*62c56f98SSadaf Ebrahimi 1490*62c56f98SSadaf Ebrahimi PSA_INIT(); 1491*62c56f98SSadaf Ebrahimi 1492*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_hkdf_expand_label( 1493*62c56f98SSadaf Ebrahimi (psa_algorithm_t) hash_alg, 1494*62c56f98SSadaf Ebrahimi secret->x, secret->len, 1495*62c56f98SSadaf Ebrahimi lbl, lbl_len, 1496*62c56f98SSadaf Ebrahimi ctx->x, ctx->len, 1497*62c56f98SSadaf Ebrahimi dst, desired_length) == 0); 1498*62c56f98SSadaf Ebrahimi 1499*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(dst, (size_t) desired_length, 1500*62c56f98SSadaf Ebrahimi expected->x, (size_t) expected->len); 1501*62c56f98SSadaf Ebrahimi 1502*62c56f98SSadaf Ebrahimiexit: 1503*62c56f98SSadaf Ebrahimi PSA_DONE(); 1504*62c56f98SSadaf Ebrahimi} 1505*62c56f98SSadaf Ebrahimi/* END_CASE */ 1506*62c56f98SSadaf Ebrahimi 1507*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1508*62c56f98SSadaf Ebrahimivoid ssl_tls13_traffic_key_generation(int hash_alg, 1509*62c56f98SSadaf Ebrahimi data_t *server_secret, 1510*62c56f98SSadaf Ebrahimi data_t *client_secret, 1511*62c56f98SSadaf Ebrahimi int desired_iv_len, 1512*62c56f98SSadaf Ebrahimi int desired_key_len, 1513*62c56f98SSadaf Ebrahimi data_t *expected_server_write_key, 1514*62c56f98SSadaf Ebrahimi data_t *expected_server_write_iv, 1515*62c56f98SSadaf Ebrahimi data_t *expected_client_write_key, 1516*62c56f98SSadaf Ebrahimi data_t *expected_client_write_iv) 1517*62c56f98SSadaf Ebrahimi{ 1518*62c56f98SSadaf Ebrahimi mbedtls_ssl_key_set keys; 1519*62c56f98SSadaf Ebrahimi 1520*62c56f98SSadaf Ebrahimi /* Check sanity of test parameters. */ 1521*62c56f98SSadaf Ebrahimi TEST_ASSERT(client_secret->len == server_secret->len); 1522*62c56f98SSadaf Ebrahimi TEST_ASSERT( 1523*62c56f98SSadaf Ebrahimi expected_client_write_iv->len == expected_server_write_iv->len && 1524*62c56f98SSadaf Ebrahimi expected_client_write_iv->len == (size_t) desired_iv_len); 1525*62c56f98SSadaf Ebrahimi TEST_ASSERT( 1526*62c56f98SSadaf Ebrahimi expected_client_write_key->len == expected_server_write_key->len && 1527*62c56f98SSadaf Ebrahimi expected_client_write_key->len == (size_t) desired_key_len); 1528*62c56f98SSadaf Ebrahimi 1529*62c56f98SSadaf Ebrahimi PSA_INIT(); 1530*62c56f98SSadaf Ebrahimi 1531*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_make_traffic_keys( 1532*62c56f98SSadaf Ebrahimi (psa_algorithm_t) hash_alg, 1533*62c56f98SSadaf Ebrahimi client_secret->x, 1534*62c56f98SSadaf Ebrahimi server_secret->x, 1535*62c56f98SSadaf Ebrahimi client_secret->len /* == server_secret->len */, 1536*62c56f98SSadaf Ebrahimi desired_key_len, desired_iv_len, 1537*62c56f98SSadaf Ebrahimi &keys) == 0); 1538*62c56f98SSadaf Ebrahimi 1539*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(keys.client_write_key, 1540*62c56f98SSadaf Ebrahimi keys.key_len, 1541*62c56f98SSadaf Ebrahimi expected_client_write_key->x, 1542*62c56f98SSadaf Ebrahimi (size_t) desired_key_len); 1543*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(keys.server_write_key, 1544*62c56f98SSadaf Ebrahimi keys.key_len, 1545*62c56f98SSadaf Ebrahimi expected_server_write_key->x, 1546*62c56f98SSadaf Ebrahimi (size_t) desired_key_len); 1547*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(keys.client_write_iv, 1548*62c56f98SSadaf Ebrahimi keys.iv_len, 1549*62c56f98SSadaf Ebrahimi expected_client_write_iv->x, 1550*62c56f98SSadaf Ebrahimi (size_t) desired_iv_len); 1551*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(keys.server_write_iv, 1552*62c56f98SSadaf Ebrahimi keys.iv_len, 1553*62c56f98SSadaf Ebrahimi expected_server_write_iv->x, 1554*62c56f98SSadaf Ebrahimi (size_t) desired_iv_len); 1555*62c56f98SSadaf Ebrahimi 1556*62c56f98SSadaf Ebrahimiexit: 1557*62c56f98SSadaf Ebrahimi PSA_DONE(); 1558*62c56f98SSadaf Ebrahimi} 1559*62c56f98SSadaf Ebrahimi/* END_CASE */ 1560*62c56f98SSadaf Ebrahimi 1561*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1562*62c56f98SSadaf Ebrahimivoid ssl_tls13_derive_secret(int hash_alg, 1563*62c56f98SSadaf Ebrahimi data_t *secret, 1564*62c56f98SSadaf Ebrahimi int label_idx, 1565*62c56f98SSadaf Ebrahimi data_t *ctx, 1566*62c56f98SSadaf Ebrahimi int desired_length, 1567*62c56f98SSadaf Ebrahimi int already_hashed, 1568*62c56f98SSadaf Ebrahimi data_t *expected) 1569*62c56f98SSadaf Ebrahimi{ 1570*62c56f98SSadaf Ebrahimi unsigned char dst[100]; 1571*62c56f98SSadaf Ebrahimi 1572*62c56f98SSadaf Ebrahimi unsigned char const *lbl = NULL; 1573*62c56f98SSadaf Ebrahimi size_t lbl_len; 1574*62c56f98SSadaf Ebrahimi#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \ 1575*62c56f98SSadaf Ebrahimi if (label_idx == (int) tls13_label_ ## name) \ 1576*62c56f98SSadaf Ebrahimi { \ 1577*62c56f98SSadaf Ebrahimi lbl = mbedtls_ssl_tls13_labels.name; \ 1578*62c56f98SSadaf Ebrahimi lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \ 1579*62c56f98SSadaf Ebrahimi } 1580*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS1_3_LABEL_LIST 1581*62c56f98SSadaf Ebrahimi#undef MBEDTLS_SSL_TLS1_3_LABEL 1582*62c56f98SSadaf Ebrahimi TEST_ASSERT(lbl != NULL); 1583*62c56f98SSadaf Ebrahimi 1584*62c56f98SSadaf Ebrahimi /* Check sanity of test parameters. */ 1585*62c56f98SSadaf Ebrahimi TEST_ASSERT((size_t) desired_length <= sizeof(dst)); 1586*62c56f98SSadaf Ebrahimi TEST_ASSERT((size_t) desired_length == expected->len); 1587*62c56f98SSadaf Ebrahimi 1588*62c56f98SSadaf Ebrahimi PSA_INIT(); 1589*62c56f98SSadaf Ebrahimi 1590*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_derive_secret( 1591*62c56f98SSadaf Ebrahimi (psa_algorithm_t) hash_alg, 1592*62c56f98SSadaf Ebrahimi secret->x, secret->len, 1593*62c56f98SSadaf Ebrahimi lbl, lbl_len, 1594*62c56f98SSadaf Ebrahimi ctx->x, ctx->len, 1595*62c56f98SSadaf Ebrahimi already_hashed, 1596*62c56f98SSadaf Ebrahimi dst, desired_length) == 0); 1597*62c56f98SSadaf Ebrahimi 1598*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(dst, desired_length, 1599*62c56f98SSadaf Ebrahimi expected->x, desired_length); 1600*62c56f98SSadaf Ebrahimi 1601*62c56f98SSadaf Ebrahimiexit: 1602*62c56f98SSadaf Ebrahimi PSA_DONE(); 1603*62c56f98SSadaf Ebrahimi} 1604*62c56f98SSadaf Ebrahimi/* END_CASE */ 1605*62c56f98SSadaf Ebrahimi 1606*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1607*62c56f98SSadaf Ebrahimivoid ssl_tls13_derive_early_secrets(int hash_alg, 1608*62c56f98SSadaf Ebrahimi data_t *secret, 1609*62c56f98SSadaf Ebrahimi data_t *transcript, 1610*62c56f98SSadaf Ebrahimi data_t *traffic_expected, 1611*62c56f98SSadaf Ebrahimi data_t *exporter_expected) 1612*62c56f98SSadaf Ebrahimi{ 1613*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_early_secrets secrets; 1614*62c56f98SSadaf Ebrahimi 1615*62c56f98SSadaf Ebrahimi /* Double-check that we've passed sane parameters. */ 1616*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1617*62c56f98SSadaf Ebrahimi size_t const hash_len = PSA_HASH_LENGTH(alg); 1618*62c56f98SSadaf Ebrahimi TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1619*62c56f98SSadaf Ebrahimi secret->len == hash_len && 1620*62c56f98SSadaf Ebrahimi transcript->len == hash_len && 1621*62c56f98SSadaf Ebrahimi traffic_expected->len == hash_len && 1622*62c56f98SSadaf Ebrahimi exporter_expected->len == hash_len); 1623*62c56f98SSadaf Ebrahimi 1624*62c56f98SSadaf Ebrahimi PSA_INIT(); 1625*62c56f98SSadaf Ebrahimi 1626*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_derive_early_secrets( 1627*62c56f98SSadaf Ebrahimi alg, secret->x, transcript->x, transcript->len, 1628*62c56f98SSadaf Ebrahimi &secrets) == 0); 1629*62c56f98SSadaf Ebrahimi 1630*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.client_early_traffic_secret, hash_len, 1631*62c56f98SSadaf Ebrahimi traffic_expected->x, traffic_expected->len); 1632*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.early_exporter_master_secret, hash_len, 1633*62c56f98SSadaf Ebrahimi exporter_expected->x, exporter_expected->len); 1634*62c56f98SSadaf Ebrahimi 1635*62c56f98SSadaf Ebrahimiexit: 1636*62c56f98SSadaf Ebrahimi PSA_DONE(); 1637*62c56f98SSadaf Ebrahimi} 1638*62c56f98SSadaf Ebrahimi/* END_CASE */ 1639*62c56f98SSadaf Ebrahimi 1640*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1641*62c56f98SSadaf Ebrahimivoid ssl_tls13_derive_handshake_secrets(int hash_alg, 1642*62c56f98SSadaf Ebrahimi data_t *secret, 1643*62c56f98SSadaf Ebrahimi data_t *transcript, 1644*62c56f98SSadaf Ebrahimi data_t *client_expected, 1645*62c56f98SSadaf Ebrahimi data_t *server_expected) 1646*62c56f98SSadaf Ebrahimi{ 1647*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_handshake_secrets secrets; 1648*62c56f98SSadaf Ebrahimi 1649*62c56f98SSadaf Ebrahimi /* Double-check that we've passed sane parameters. */ 1650*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1651*62c56f98SSadaf Ebrahimi size_t const hash_len = PSA_HASH_LENGTH(alg); 1652*62c56f98SSadaf Ebrahimi TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1653*62c56f98SSadaf Ebrahimi secret->len == hash_len && 1654*62c56f98SSadaf Ebrahimi transcript->len == hash_len && 1655*62c56f98SSadaf Ebrahimi client_expected->len == hash_len && 1656*62c56f98SSadaf Ebrahimi server_expected->len == hash_len); 1657*62c56f98SSadaf Ebrahimi 1658*62c56f98SSadaf Ebrahimi PSA_INIT(); 1659*62c56f98SSadaf Ebrahimi 1660*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_derive_handshake_secrets( 1661*62c56f98SSadaf Ebrahimi alg, secret->x, transcript->x, transcript->len, 1662*62c56f98SSadaf Ebrahimi &secrets) == 0); 1663*62c56f98SSadaf Ebrahimi 1664*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.client_handshake_traffic_secret, hash_len, 1665*62c56f98SSadaf Ebrahimi client_expected->x, client_expected->len); 1666*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.server_handshake_traffic_secret, hash_len, 1667*62c56f98SSadaf Ebrahimi server_expected->x, server_expected->len); 1668*62c56f98SSadaf Ebrahimi 1669*62c56f98SSadaf Ebrahimiexit: 1670*62c56f98SSadaf Ebrahimi PSA_DONE(); 1671*62c56f98SSadaf Ebrahimi} 1672*62c56f98SSadaf Ebrahimi/* END_CASE */ 1673*62c56f98SSadaf Ebrahimi 1674*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1675*62c56f98SSadaf Ebrahimivoid ssl_tls13_derive_application_secrets(int hash_alg, 1676*62c56f98SSadaf Ebrahimi data_t *secret, 1677*62c56f98SSadaf Ebrahimi data_t *transcript, 1678*62c56f98SSadaf Ebrahimi data_t *client_expected, 1679*62c56f98SSadaf Ebrahimi data_t *server_expected, 1680*62c56f98SSadaf Ebrahimi data_t *exporter_expected) 1681*62c56f98SSadaf Ebrahimi{ 1682*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_application_secrets secrets; 1683*62c56f98SSadaf Ebrahimi 1684*62c56f98SSadaf Ebrahimi /* Double-check that we've passed sane parameters. */ 1685*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1686*62c56f98SSadaf Ebrahimi size_t const hash_len = PSA_HASH_LENGTH(alg); 1687*62c56f98SSadaf Ebrahimi TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1688*62c56f98SSadaf Ebrahimi secret->len == hash_len && 1689*62c56f98SSadaf Ebrahimi transcript->len == hash_len && 1690*62c56f98SSadaf Ebrahimi client_expected->len == hash_len && 1691*62c56f98SSadaf Ebrahimi server_expected->len == hash_len && 1692*62c56f98SSadaf Ebrahimi exporter_expected->len == hash_len); 1693*62c56f98SSadaf Ebrahimi 1694*62c56f98SSadaf Ebrahimi PSA_INIT(); 1695*62c56f98SSadaf Ebrahimi 1696*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_derive_application_secrets( 1697*62c56f98SSadaf Ebrahimi alg, secret->x, transcript->x, transcript->len, 1698*62c56f98SSadaf Ebrahimi &secrets) == 0); 1699*62c56f98SSadaf Ebrahimi 1700*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.client_application_traffic_secret_N, hash_len, 1701*62c56f98SSadaf Ebrahimi client_expected->x, client_expected->len); 1702*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.server_application_traffic_secret_N, hash_len, 1703*62c56f98SSadaf Ebrahimi server_expected->x, server_expected->len); 1704*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.exporter_master_secret, hash_len, 1705*62c56f98SSadaf Ebrahimi exporter_expected->x, exporter_expected->len); 1706*62c56f98SSadaf Ebrahimi 1707*62c56f98SSadaf Ebrahimiexit: 1708*62c56f98SSadaf Ebrahimi PSA_DONE(); 1709*62c56f98SSadaf Ebrahimi} 1710*62c56f98SSadaf Ebrahimi/* END_CASE */ 1711*62c56f98SSadaf Ebrahimi 1712*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1713*62c56f98SSadaf Ebrahimivoid ssl_tls13_derive_resumption_secrets(int hash_alg, 1714*62c56f98SSadaf Ebrahimi data_t *secret, 1715*62c56f98SSadaf Ebrahimi data_t *transcript, 1716*62c56f98SSadaf Ebrahimi data_t *resumption_expected) 1717*62c56f98SSadaf Ebrahimi{ 1718*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_application_secrets secrets; 1719*62c56f98SSadaf Ebrahimi 1720*62c56f98SSadaf Ebrahimi /* Double-check that we've passed sane parameters. */ 1721*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1722*62c56f98SSadaf Ebrahimi size_t const hash_len = PSA_HASH_LENGTH(alg); 1723*62c56f98SSadaf Ebrahimi TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1724*62c56f98SSadaf Ebrahimi secret->len == hash_len && 1725*62c56f98SSadaf Ebrahimi transcript->len == hash_len && 1726*62c56f98SSadaf Ebrahimi resumption_expected->len == hash_len); 1727*62c56f98SSadaf Ebrahimi 1728*62c56f98SSadaf Ebrahimi PSA_INIT(); 1729*62c56f98SSadaf Ebrahimi 1730*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_derive_resumption_master_secret( 1731*62c56f98SSadaf Ebrahimi alg, secret->x, transcript->x, transcript->len, 1732*62c56f98SSadaf Ebrahimi &secrets) == 0); 1733*62c56f98SSadaf Ebrahimi 1734*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secrets.resumption_master_secret, hash_len, 1735*62c56f98SSadaf Ebrahimi resumption_expected->x, resumption_expected->len); 1736*62c56f98SSadaf Ebrahimi 1737*62c56f98SSadaf Ebrahimiexit: 1738*62c56f98SSadaf Ebrahimi PSA_DONE(); 1739*62c56f98SSadaf Ebrahimi} 1740*62c56f98SSadaf Ebrahimi/* END_CASE */ 1741*62c56f98SSadaf Ebrahimi 1742*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1743*62c56f98SSadaf Ebrahimivoid ssl_tls13_create_psk_binder(int hash_alg, 1744*62c56f98SSadaf Ebrahimi data_t *psk, 1745*62c56f98SSadaf Ebrahimi int psk_type, 1746*62c56f98SSadaf Ebrahimi data_t *transcript, 1747*62c56f98SSadaf Ebrahimi data_t *binder_expected) 1748*62c56f98SSadaf Ebrahimi{ 1749*62c56f98SSadaf Ebrahimi unsigned char binder[MBEDTLS_MD_MAX_SIZE]; 1750*62c56f98SSadaf Ebrahimi 1751*62c56f98SSadaf Ebrahimi /* Double-check that we've passed sane parameters. */ 1752*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = (psa_algorithm_t) hash_alg; 1753*62c56f98SSadaf Ebrahimi size_t const hash_len = PSA_HASH_LENGTH(alg); 1754*62c56f98SSadaf Ebrahimi TEST_ASSERT(PSA_ALG_IS_HASH(alg) && 1755*62c56f98SSadaf Ebrahimi transcript->len == hash_len && 1756*62c56f98SSadaf Ebrahimi binder_expected->len == hash_len); 1757*62c56f98SSadaf Ebrahimi 1758*62c56f98SSadaf Ebrahimi PSA_INIT(); 1759*62c56f98SSadaf Ebrahimi 1760*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_create_psk_binder( 1761*62c56f98SSadaf Ebrahimi NULL, /* SSL context for debugging only */ 1762*62c56f98SSadaf Ebrahimi alg, 1763*62c56f98SSadaf Ebrahimi psk->x, psk->len, 1764*62c56f98SSadaf Ebrahimi psk_type, 1765*62c56f98SSadaf Ebrahimi transcript->x, 1766*62c56f98SSadaf Ebrahimi binder) == 0); 1767*62c56f98SSadaf Ebrahimi 1768*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(binder, hash_len, 1769*62c56f98SSadaf Ebrahimi binder_expected->x, binder_expected->len); 1770*62c56f98SSadaf Ebrahimi 1771*62c56f98SSadaf Ebrahimiexit: 1772*62c56f98SSadaf Ebrahimi PSA_DONE(); 1773*62c56f98SSadaf Ebrahimi} 1774*62c56f98SSadaf Ebrahimi/* END_CASE */ 1775*62c56f98SSadaf Ebrahimi 1776*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1777*62c56f98SSadaf Ebrahimivoid ssl_tls13_record_protection(int ciphersuite, 1778*62c56f98SSadaf Ebrahimi int endpoint, 1779*62c56f98SSadaf Ebrahimi int ctr, 1780*62c56f98SSadaf Ebrahimi int padding_used, 1781*62c56f98SSadaf Ebrahimi data_t *server_write_key, 1782*62c56f98SSadaf Ebrahimi data_t *server_write_iv, 1783*62c56f98SSadaf Ebrahimi data_t *client_write_key, 1784*62c56f98SSadaf Ebrahimi data_t *client_write_iv, 1785*62c56f98SSadaf Ebrahimi data_t *plaintext, 1786*62c56f98SSadaf Ebrahimi data_t *ciphertext) 1787*62c56f98SSadaf Ebrahimi{ 1788*62c56f98SSadaf Ebrahimi mbedtls_ssl_key_set keys; 1789*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform transform_send; 1790*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform transform_recv; 1791*62c56f98SSadaf Ebrahimi mbedtls_record rec; 1792*62c56f98SSadaf Ebrahimi unsigned char *buf = NULL; 1793*62c56f98SSadaf Ebrahimi size_t buf_len; 1794*62c56f98SSadaf Ebrahimi int other_endpoint; 1795*62c56f98SSadaf Ebrahimi 1796*62c56f98SSadaf Ebrahimi TEST_ASSERT(endpoint == MBEDTLS_SSL_IS_CLIENT || 1797*62c56f98SSadaf Ebrahimi endpoint == MBEDTLS_SSL_IS_SERVER); 1798*62c56f98SSadaf Ebrahimi 1799*62c56f98SSadaf Ebrahimi if (endpoint == MBEDTLS_SSL_IS_SERVER) { 1800*62c56f98SSadaf Ebrahimi other_endpoint = MBEDTLS_SSL_IS_CLIENT; 1801*62c56f98SSadaf Ebrahimi } 1802*62c56f98SSadaf Ebrahimi if (endpoint == MBEDTLS_SSL_IS_CLIENT) { 1803*62c56f98SSadaf Ebrahimi other_endpoint = MBEDTLS_SSL_IS_SERVER; 1804*62c56f98SSadaf Ebrahimi } 1805*62c56f98SSadaf Ebrahimi 1806*62c56f98SSadaf Ebrahimi TEST_ASSERT(server_write_key->len == client_write_key->len); 1807*62c56f98SSadaf Ebrahimi TEST_ASSERT(server_write_iv->len == client_write_iv->len); 1808*62c56f98SSadaf Ebrahimi 1809*62c56f98SSadaf Ebrahimi memcpy(keys.client_write_key, 1810*62c56f98SSadaf Ebrahimi client_write_key->x, client_write_key->len); 1811*62c56f98SSadaf Ebrahimi memcpy(keys.client_write_iv, 1812*62c56f98SSadaf Ebrahimi client_write_iv->x, client_write_iv->len); 1813*62c56f98SSadaf Ebrahimi memcpy(keys.server_write_key, 1814*62c56f98SSadaf Ebrahimi server_write_key->x, server_write_key->len); 1815*62c56f98SSadaf Ebrahimi memcpy(keys.server_write_iv, 1816*62c56f98SSadaf Ebrahimi server_write_iv->x, server_write_iv->len); 1817*62c56f98SSadaf Ebrahimi 1818*62c56f98SSadaf Ebrahimi keys.key_len = server_write_key->len; 1819*62c56f98SSadaf Ebrahimi keys.iv_len = server_write_iv->len; 1820*62c56f98SSadaf Ebrahimi 1821*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_init(&transform_recv); 1822*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_init(&transform_send); 1823*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 1824*62c56f98SSadaf Ebrahimi 1825*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_populate_transform( 1826*62c56f98SSadaf Ebrahimi &transform_send, endpoint, 1827*62c56f98SSadaf Ebrahimi ciphersuite, &keys, NULL) == 0); 1828*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_populate_transform( 1829*62c56f98SSadaf Ebrahimi &transform_recv, other_endpoint, 1830*62c56f98SSadaf Ebrahimi ciphersuite, &keys, NULL) == 0); 1831*62c56f98SSadaf Ebrahimi 1832*62c56f98SSadaf Ebrahimi /* Make sure we have enough space in the buffer even if 1833*62c56f98SSadaf Ebrahimi * we use more padding than the KAT. */ 1834*62c56f98SSadaf Ebrahimi buf_len = ciphertext->len + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY; 1835*62c56f98SSadaf Ebrahimi TEST_CALLOC(buf, buf_len); 1836*62c56f98SSadaf Ebrahimi rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA; 1837*62c56f98SSadaf Ebrahimi 1838*62c56f98SSadaf Ebrahimi /* TLS 1.3 uses the version identifier from TLS 1.2 on the wire. */ 1839*62c56f98SSadaf Ebrahimi mbedtls_ssl_write_version(rec.ver, 1840*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TRANSPORT_STREAM, 1841*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_VERSION_TLS1_2); 1842*62c56f98SSadaf Ebrahimi 1843*62c56f98SSadaf Ebrahimi /* Copy plaintext into record structure */ 1844*62c56f98SSadaf Ebrahimi rec.buf = buf; 1845*62c56f98SSadaf Ebrahimi rec.buf_len = buf_len; 1846*62c56f98SSadaf Ebrahimi rec.data_offset = 0; 1847*62c56f98SSadaf Ebrahimi TEST_ASSERT(plaintext->len <= ciphertext->len); 1848*62c56f98SSadaf Ebrahimi memcpy(rec.buf + rec.data_offset, plaintext->x, plaintext->len); 1849*62c56f98SSadaf Ebrahimi rec.data_len = plaintext->len; 1850*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) 1851*62c56f98SSadaf Ebrahimi rec.cid_len = 0; 1852*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ 1853*62c56f98SSadaf Ebrahimi 1854*62c56f98SSadaf Ebrahimi memset(&rec.ctr[0], 0, 8); 1855*62c56f98SSadaf Ebrahimi rec.ctr[7] = ctr; 1856*62c56f98SSadaf Ebrahimi 1857*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_encrypt_buf(NULL, &transform_send, &rec, 1858*62c56f98SSadaf Ebrahimi NULL, NULL) == 0); 1859*62c56f98SSadaf Ebrahimi 1860*62c56f98SSadaf Ebrahimi if (padding_used == MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) { 1861*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len, 1862*62c56f98SSadaf Ebrahimi ciphertext->x, ciphertext->len); 1863*62c56f98SSadaf Ebrahimi } 1864*62c56f98SSadaf Ebrahimi 1865*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_decrypt_buf(NULL, &transform_recv, &rec) == 0); 1866*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len, 1867*62c56f98SSadaf Ebrahimi plaintext->x, plaintext->len); 1868*62c56f98SSadaf Ebrahimi 1869*62c56f98SSadaf Ebrahimiexit: 1870*62c56f98SSadaf Ebrahimi mbedtls_free(buf); 1871*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(&transform_send); 1872*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(&transform_recv); 1873*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 1874*62c56f98SSadaf Ebrahimi} 1875*62c56f98SSadaf Ebrahimi/* END_CASE */ 1876*62c56f98SSadaf Ebrahimi 1877*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */ 1878*62c56f98SSadaf Ebrahimivoid ssl_tls13_key_evolution(int hash_alg, 1879*62c56f98SSadaf Ebrahimi data_t *secret, 1880*62c56f98SSadaf Ebrahimi data_t *input, 1881*62c56f98SSadaf Ebrahimi data_t *expected) 1882*62c56f98SSadaf Ebrahimi{ 1883*62c56f98SSadaf Ebrahimi unsigned char secret_new[MBEDTLS_MD_MAX_SIZE]; 1884*62c56f98SSadaf Ebrahimi 1885*62c56f98SSadaf Ebrahimi PSA_INIT(); 1886*62c56f98SSadaf Ebrahimi 1887*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls13_evolve_secret( 1888*62c56f98SSadaf Ebrahimi (psa_algorithm_t) hash_alg, 1889*62c56f98SSadaf Ebrahimi secret->len ? secret->x : NULL, 1890*62c56f98SSadaf Ebrahimi input->len ? input->x : NULL, input->len, 1891*62c56f98SSadaf Ebrahimi secret_new) == 0); 1892*62c56f98SSadaf Ebrahimi 1893*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(secret_new, (size_t) expected->len, 1894*62c56f98SSadaf Ebrahimi expected->x, (size_t) expected->len); 1895*62c56f98SSadaf Ebrahimi 1896*62c56f98SSadaf Ebrahimiexit: 1897*62c56f98SSadaf Ebrahimi PSA_DONE(); 1898*62c56f98SSadaf Ebrahimi} 1899*62c56f98SSadaf Ebrahimi/* END_CASE */ 1900*62c56f98SSadaf Ebrahimi 1901*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2 */ 1902*62c56f98SSadaf Ebrahimivoid ssl_tls_prf(int type, data_t *secret, data_t *random, 1903*62c56f98SSadaf Ebrahimi char *label, data_t *result_str, int exp_ret) 1904*62c56f98SSadaf Ebrahimi{ 1905*62c56f98SSadaf Ebrahimi unsigned char *output; 1906*62c56f98SSadaf Ebrahimi 1907*62c56f98SSadaf Ebrahimi output = mbedtls_calloc(1, result_str->len); 1908*62c56f98SSadaf Ebrahimi if (output == NULL) { 1909*62c56f98SSadaf Ebrahimi goto exit; 1910*62c56f98SSadaf Ebrahimi } 1911*62c56f98SSadaf Ebrahimi 1912*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 1913*62c56f98SSadaf Ebrahimi 1914*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len, 1915*62c56f98SSadaf Ebrahimi label, random->x, random->len, 1916*62c56f98SSadaf Ebrahimi output, result_str->len) == exp_ret); 1917*62c56f98SSadaf Ebrahimi 1918*62c56f98SSadaf Ebrahimi if (exp_ret == 0) { 1919*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x, 1920*62c56f98SSadaf Ebrahimi result_str->len, result_str->len) == 0); 1921*62c56f98SSadaf Ebrahimi } 1922*62c56f98SSadaf Ebrahimiexit: 1923*62c56f98SSadaf Ebrahimi 1924*62c56f98SSadaf Ebrahimi mbedtls_free(output); 1925*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 1926*62c56f98SSadaf Ebrahimi} 1927*62c56f98SSadaf Ebrahimi/* END_CASE */ 1928*62c56f98SSadaf Ebrahimi 1929*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 1930*62c56f98SSadaf Ebrahimivoid ssl_serialize_session_save_load(int ticket_len, char *crt_file, 1931*62c56f98SSadaf Ebrahimi int endpoint_type, int tls_version) 1932*62c56f98SSadaf Ebrahimi{ 1933*62c56f98SSadaf Ebrahimi mbedtls_ssl_session original, restored; 1934*62c56f98SSadaf Ebrahimi unsigned char *buf = NULL; 1935*62c56f98SSadaf Ebrahimi size_t len; 1936*62c56f98SSadaf Ebrahimi 1937*62c56f98SSadaf Ebrahimi /* 1938*62c56f98SSadaf Ebrahimi * Test that a save-load pair is the identity 1939*62c56f98SSadaf Ebrahimi */ 1940*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_init(&original); 1941*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_init(&restored); 1942*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 1943*62c56f98SSadaf Ebrahimi 1944*62c56f98SSadaf Ebrahimi /* Prepare a dummy session to work on */ 1945*62c56f98SSadaf Ebrahimi ((void) endpoint_type); 1946*62c56f98SSadaf Ebrahimi ((void) tls_version); 1947*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 1948*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 1949*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 1950*62c56f98SSadaf Ebrahimi &original, 0, endpoint_type) == 0); 1951*62c56f98SSadaf Ebrahimi } else 1952*62c56f98SSadaf Ebrahimi#endif 1953*62c56f98SSadaf Ebrahimi { 1954*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 1955*62c56f98SSadaf Ebrahimi &original, ticket_len, crt_file) == 0); 1956*62c56f98SSadaf Ebrahimi } 1957*62c56f98SSadaf Ebrahimi 1958*62c56f98SSadaf Ebrahimi /* Serialize it */ 1959*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len) 1960*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 1961*62c56f98SSadaf Ebrahimi TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL); 1962*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len) 1963*62c56f98SSadaf Ebrahimi == 0); 1964*62c56f98SSadaf Ebrahimi 1965*62c56f98SSadaf Ebrahimi /* Restore session from serialized data */ 1966*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0); 1967*62c56f98SSadaf Ebrahimi 1968*62c56f98SSadaf Ebrahimi /* 1969*62c56f98SSadaf Ebrahimi * Make sure both session structures are identical 1970*62c56f98SSadaf Ebrahimi */ 1971*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_HAVE_TIME) 1972*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.start == restored.start); 1973*62c56f98SSadaf Ebrahimi#endif 1974*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.tls_version == restored.tls_version); 1975*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ciphersuite == restored.ciphersuite); 1976*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 1977*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) { 1978*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.id_len == restored.id_len); 1979*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(original.id, 1980*62c56f98SSadaf Ebrahimi restored.id, sizeof(original.id)) == 0); 1981*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(original.master, 1982*62c56f98SSadaf Ebrahimi restored.master, sizeof(original.master)) == 0); 1983*62c56f98SSadaf Ebrahimi 1984*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) 1985*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) 1986*62c56f98SSadaf Ebrahimi TEST_ASSERT((original.peer_cert == NULL) == 1987*62c56f98SSadaf Ebrahimi (restored.peer_cert == NULL)); 1988*62c56f98SSadaf Ebrahimi if (original.peer_cert != NULL) { 1989*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.peer_cert->raw.len == 1990*62c56f98SSadaf Ebrahimi restored.peer_cert->raw.len); 1991*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(original.peer_cert->raw.p, 1992*62c56f98SSadaf Ebrahimi restored.peer_cert->raw.p, 1993*62c56f98SSadaf Ebrahimi original.peer_cert->raw.len) == 0); 1994*62c56f98SSadaf Ebrahimi } 1995*62c56f98SSadaf Ebrahimi#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ 1996*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.peer_cert_digest_type == 1997*62c56f98SSadaf Ebrahimi restored.peer_cert_digest_type); 1998*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.peer_cert_digest_len == 1999*62c56f98SSadaf Ebrahimi restored.peer_cert_digest_len); 2000*62c56f98SSadaf Ebrahimi TEST_ASSERT((original.peer_cert_digest == NULL) == 2001*62c56f98SSadaf Ebrahimi (restored.peer_cert_digest == NULL)); 2002*62c56f98SSadaf Ebrahimi if (original.peer_cert_digest != NULL) { 2003*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(original.peer_cert_digest, 2004*62c56f98SSadaf Ebrahimi restored.peer_cert_digest, 2005*62c56f98SSadaf Ebrahimi original.peer_cert_digest_len) == 0); 2006*62c56f98SSadaf Ebrahimi } 2007*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ 2008*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ 2009*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.verify_result == restored.verify_result); 2010*62c56f98SSadaf Ebrahimi 2011*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 2012*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.mfl_code == restored.mfl_code); 2013*62c56f98SSadaf Ebrahimi#endif 2014*62c56f98SSadaf Ebrahimi 2015*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 2016*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac); 2017*62c56f98SSadaf Ebrahimi#endif 2018*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) 2019*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket_len == restored.ticket_len); 2020*62c56f98SSadaf Ebrahimi if (original.ticket_len != 0) { 2021*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket != NULL); 2022*62c56f98SSadaf Ebrahimi TEST_ASSERT(restored.ticket != NULL); 2023*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(original.ticket, 2024*62c56f98SSadaf Ebrahimi restored.ticket, original.ticket_len) == 0); 2025*62c56f98SSadaf Ebrahimi } 2026*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime); 2027*62c56f98SSadaf Ebrahimi#endif 2028*62c56f98SSadaf Ebrahimi } 2029*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 2030*62c56f98SSadaf Ebrahimi 2031*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2032*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 2033*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.endpoint == restored.endpoint); 2034*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ciphersuite == restored.ciphersuite); 2035*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket_age_add == restored.ticket_age_add); 2036*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket_flags == restored.ticket_flags); 2037*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.resumption_key_len == restored.resumption_key_len); 2038*62c56f98SSadaf Ebrahimi if (original.resumption_key_len != 0) { 2039*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.resumption_key != NULL); 2040*62c56f98SSadaf Ebrahimi TEST_ASSERT(restored.resumption_key != NULL); 2041*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(original.resumption_key, 2042*62c56f98SSadaf Ebrahimi restored.resumption_key, 2043*62c56f98SSadaf Ebrahimi original.resumption_key_len) == 0); 2044*62c56f98SSadaf Ebrahimi } 2045*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C) 2046*62c56f98SSadaf Ebrahimi if (endpoint_type == MBEDTLS_SSL_IS_SERVER) { 2047*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.start == restored.start); 2048*62c56f98SSadaf Ebrahimi } 2049*62c56f98SSadaf Ebrahimi#endif 2050*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) 2051*62c56f98SSadaf Ebrahimi if (endpoint_type == MBEDTLS_SSL_IS_CLIENT) { 2052*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_HAVE_TIME) 2053*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket_received == restored.ticket_received); 2054*62c56f98SSadaf Ebrahimi#endif 2055*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime); 2056*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket_len == restored.ticket_len); 2057*62c56f98SSadaf Ebrahimi if (original.ticket_len != 0) { 2058*62c56f98SSadaf Ebrahimi TEST_ASSERT(original.ticket != NULL); 2059*62c56f98SSadaf Ebrahimi TEST_ASSERT(restored.ticket != NULL); 2060*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(original.ticket, 2061*62c56f98SSadaf Ebrahimi restored.ticket, 2062*62c56f98SSadaf Ebrahimi original.ticket_len) == 0); 2063*62c56f98SSadaf Ebrahimi } 2064*62c56f98SSadaf Ebrahimi 2065*62c56f98SSadaf Ebrahimi } 2066*62c56f98SSadaf Ebrahimi#endif 2067*62c56f98SSadaf Ebrahimi } 2068*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 2069*62c56f98SSadaf Ebrahimi 2070*62c56f98SSadaf Ebrahimiexit: 2071*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&original); 2072*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&restored); 2073*62c56f98SSadaf Ebrahimi mbedtls_free(buf); 2074*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 2075*62c56f98SSadaf Ebrahimi} 2076*62c56f98SSadaf Ebrahimi/* END_CASE */ 2077*62c56f98SSadaf Ebrahimi 2078*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 2079*62c56f98SSadaf Ebrahimivoid ssl_serialize_session_load_save(int ticket_len, char *crt_file, 2080*62c56f98SSadaf Ebrahimi int endpoint_type, int tls_version) 2081*62c56f98SSadaf Ebrahimi{ 2082*62c56f98SSadaf Ebrahimi mbedtls_ssl_session session; 2083*62c56f98SSadaf Ebrahimi unsigned char *buf1 = NULL, *buf2 = NULL; 2084*62c56f98SSadaf Ebrahimi size_t len0, len1, len2; 2085*62c56f98SSadaf Ebrahimi 2086*62c56f98SSadaf Ebrahimi /* 2087*62c56f98SSadaf Ebrahimi * Test that a load-save pair is the identity 2088*62c56f98SSadaf Ebrahimi */ 2089*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_init(&session); 2090*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 2091*62c56f98SSadaf Ebrahimi 2092*62c56f98SSadaf Ebrahimi /* Prepare a dummy session to work on */ 2093*62c56f98SSadaf Ebrahimi ((void) endpoint_type); 2094*62c56f98SSadaf Ebrahimi ((void) tls_version); 2095*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2096*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 2097*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2098*62c56f98SSadaf Ebrahimi &session, 0, endpoint_type) == 0); 2099*62c56f98SSadaf Ebrahimi } else 2100*62c56f98SSadaf Ebrahimi#endif 2101*62c56f98SSadaf Ebrahimi { 2102*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2103*62c56f98SSadaf Ebrahimi &session, ticket_len, crt_file) == 0); 2104*62c56f98SSadaf Ebrahimi } 2105*62c56f98SSadaf Ebrahimi 2106*62c56f98SSadaf Ebrahimi /* Get desired buffer size for serializing */ 2107*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0) 2108*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2109*62c56f98SSadaf Ebrahimi 2110*62c56f98SSadaf Ebrahimi /* Allocate first buffer */ 2111*62c56f98SSadaf Ebrahimi buf1 = mbedtls_calloc(1, len0); 2112*62c56f98SSadaf Ebrahimi TEST_ASSERT(buf1 != NULL); 2113*62c56f98SSadaf Ebrahimi 2114*62c56f98SSadaf Ebrahimi /* Serialize to buffer and free live session */ 2115*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1) 2116*62c56f98SSadaf Ebrahimi == 0); 2117*62c56f98SSadaf Ebrahimi TEST_ASSERT(len0 == len1); 2118*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&session); 2119*62c56f98SSadaf Ebrahimi 2120*62c56f98SSadaf Ebrahimi /* Restore session from serialized data */ 2121*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0); 2122*62c56f98SSadaf Ebrahimi 2123*62c56f98SSadaf Ebrahimi /* Allocate second buffer and serialize to it */ 2124*62c56f98SSadaf Ebrahimi buf2 = mbedtls_calloc(1, len0); 2125*62c56f98SSadaf Ebrahimi TEST_ASSERT(buf2 != NULL); 2126*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2) 2127*62c56f98SSadaf Ebrahimi == 0); 2128*62c56f98SSadaf Ebrahimi 2129*62c56f98SSadaf Ebrahimi /* Make sure both serialized versions are identical */ 2130*62c56f98SSadaf Ebrahimi TEST_ASSERT(len1 == len2); 2131*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(buf1, buf2, len1) == 0); 2132*62c56f98SSadaf Ebrahimi 2133*62c56f98SSadaf Ebrahimiexit: 2134*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&session); 2135*62c56f98SSadaf Ebrahimi mbedtls_free(buf1); 2136*62c56f98SSadaf Ebrahimi mbedtls_free(buf2); 2137*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 2138*62c56f98SSadaf Ebrahimi} 2139*62c56f98SSadaf Ebrahimi/* END_CASE */ 2140*62c56f98SSadaf Ebrahimi 2141*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 2142*62c56f98SSadaf Ebrahimivoid ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file, 2143*62c56f98SSadaf Ebrahimi int endpoint_type, int tls_version) 2144*62c56f98SSadaf Ebrahimi{ 2145*62c56f98SSadaf Ebrahimi mbedtls_ssl_session session; 2146*62c56f98SSadaf Ebrahimi unsigned char *buf = NULL; 2147*62c56f98SSadaf Ebrahimi size_t good_len, bad_len, test_len; 2148*62c56f98SSadaf Ebrahimi 2149*62c56f98SSadaf Ebrahimi /* 2150*62c56f98SSadaf Ebrahimi * Test that session_save() fails cleanly on small buffers 2151*62c56f98SSadaf Ebrahimi */ 2152*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_init(&session); 2153*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 2154*62c56f98SSadaf Ebrahimi 2155*62c56f98SSadaf Ebrahimi /* Prepare dummy session and get serialized size */ 2156*62c56f98SSadaf Ebrahimi ((void) endpoint_type); 2157*62c56f98SSadaf Ebrahimi ((void) tls_version); 2158*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2159*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 2160*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2161*62c56f98SSadaf Ebrahimi &session, 0, endpoint_type) == 0); 2162*62c56f98SSadaf Ebrahimi } else 2163*62c56f98SSadaf Ebrahimi#endif 2164*62c56f98SSadaf Ebrahimi { 2165*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2166*62c56f98SSadaf Ebrahimi &session, ticket_len, crt_file) == 0); 2167*62c56f98SSadaf Ebrahimi } 2168*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len) 2169*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2170*62c56f98SSadaf Ebrahimi 2171*62c56f98SSadaf Ebrahimi /* Try all possible bad lengths */ 2172*62c56f98SSadaf Ebrahimi for (bad_len = 1; bad_len < good_len; bad_len++) { 2173*62c56f98SSadaf Ebrahimi /* Allocate exact size so that asan/valgrind can detect any overwrite */ 2174*62c56f98SSadaf Ebrahimi mbedtls_free(buf); 2175*62c56f98SSadaf Ebrahimi TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL); 2176*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len, 2177*62c56f98SSadaf Ebrahimi &test_len) 2178*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2179*62c56f98SSadaf Ebrahimi TEST_ASSERT(test_len == good_len); 2180*62c56f98SSadaf Ebrahimi } 2181*62c56f98SSadaf Ebrahimi 2182*62c56f98SSadaf Ebrahimiexit: 2183*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&session); 2184*62c56f98SSadaf Ebrahimi mbedtls_free(buf); 2185*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 2186*62c56f98SSadaf Ebrahimi} 2187*62c56f98SSadaf Ebrahimi/* END_CASE */ 2188*62c56f98SSadaf Ebrahimi 2189*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 2190*62c56f98SSadaf Ebrahimivoid ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file, 2191*62c56f98SSadaf Ebrahimi int endpoint_type, int tls_version) 2192*62c56f98SSadaf Ebrahimi{ 2193*62c56f98SSadaf Ebrahimi mbedtls_ssl_session session; 2194*62c56f98SSadaf Ebrahimi unsigned char *good_buf = NULL, *bad_buf = NULL; 2195*62c56f98SSadaf Ebrahimi size_t good_len, bad_len; 2196*62c56f98SSadaf Ebrahimi 2197*62c56f98SSadaf Ebrahimi /* 2198*62c56f98SSadaf Ebrahimi * Test that session_load() fails cleanly on small buffers 2199*62c56f98SSadaf Ebrahimi */ 2200*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_init(&session); 2201*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 2202*62c56f98SSadaf Ebrahimi 2203*62c56f98SSadaf Ebrahimi /* Prepare serialized session data */ 2204*62c56f98SSadaf Ebrahimi ((void) endpoint_type); 2205*62c56f98SSadaf Ebrahimi ((void) tls_version); 2206*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2207*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 2208*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2209*62c56f98SSadaf Ebrahimi &session, 0, endpoint_type) == 0); 2210*62c56f98SSadaf Ebrahimi } else 2211*62c56f98SSadaf Ebrahimi#endif 2212*62c56f98SSadaf Ebrahimi { 2213*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2214*62c56f98SSadaf Ebrahimi &session, ticket_len, crt_file) == 0); 2215*62c56f98SSadaf Ebrahimi } 2216*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len) 2217*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL); 2218*62c56f98SSadaf Ebrahimi TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL); 2219*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len, 2220*62c56f98SSadaf Ebrahimi &good_len) == 0); 2221*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&session); 2222*62c56f98SSadaf Ebrahimi 2223*62c56f98SSadaf Ebrahimi /* Try all possible bad lengths */ 2224*62c56f98SSadaf Ebrahimi for (bad_len = 0; bad_len < good_len; bad_len++) { 2225*62c56f98SSadaf Ebrahimi /* Allocate exact size so that asan/valgrind can detect any overread */ 2226*62c56f98SSadaf Ebrahimi mbedtls_free(bad_buf); 2227*62c56f98SSadaf Ebrahimi bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1); 2228*62c56f98SSadaf Ebrahimi TEST_ASSERT(bad_buf != NULL); 2229*62c56f98SSadaf Ebrahimi memcpy(bad_buf, good_buf, bad_len); 2230*62c56f98SSadaf Ebrahimi 2231*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len) 2232*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 2233*62c56f98SSadaf Ebrahimi } 2234*62c56f98SSadaf Ebrahimi 2235*62c56f98SSadaf Ebrahimiexit: 2236*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&session); 2237*62c56f98SSadaf Ebrahimi mbedtls_free(good_buf); 2238*62c56f98SSadaf Ebrahimi mbedtls_free(bad_buf); 2239*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 2240*62c56f98SSadaf Ebrahimi} 2241*62c56f98SSadaf Ebrahimi/* END_CASE */ 2242*62c56f98SSadaf Ebrahimi 2243*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 2244*62c56f98SSadaf Ebrahimivoid ssl_session_serialize_version_check(int corrupt_major, 2245*62c56f98SSadaf Ebrahimi int corrupt_minor, 2246*62c56f98SSadaf Ebrahimi int corrupt_patch, 2247*62c56f98SSadaf Ebrahimi int corrupt_config, 2248*62c56f98SSadaf Ebrahimi int endpoint_type, 2249*62c56f98SSadaf Ebrahimi int tls_version) 2250*62c56f98SSadaf Ebrahimi{ 2251*62c56f98SSadaf Ebrahimi unsigned char serialized_session[2048]; 2252*62c56f98SSadaf Ebrahimi size_t serialized_session_len; 2253*62c56f98SSadaf Ebrahimi unsigned cur_byte; 2254*62c56f98SSadaf Ebrahimi mbedtls_ssl_session session; 2255*62c56f98SSadaf Ebrahimi uint8_t should_corrupt_byte[] = { corrupt_major == 1, 2256*62c56f98SSadaf Ebrahimi corrupt_minor == 1, 2257*62c56f98SSadaf Ebrahimi corrupt_patch == 1, 2258*62c56f98SSadaf Ebrahimi corrupt_config == 1, 2259*62c56f98SSadaf Ebrahimi corrupt_config == 1 }; 2260*62c56f98SSadaf Ebrahimi 2261*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_init(&session); 2262*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 2263*62c56f98SSadaf Ebrahimi ((void) endpoint_type); 2264*62c56f98SSadaf Ebrahimi ((void) tls_version); 2265*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 2266*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 2267*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session( 2268*62c56f98SSadaf Ebrahimi &session, 0, endpoint_type) == 0); 2269*62c56f98SSadaf Ebrahimi } else 2270*62c56f98SSadaf Ebrahimi#endif 2271*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session( 2272*62c56f98SSadaf Ebrahimi &session, 0, NULL) == 0); 2273*62c56f98SSadaf Ebrahimi 2274*62c56f98SSadaf Ebrahimi 2275*62c56f98SSadaf Ebrahimi /* Infer length of serialized session. */ 2276*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_save(&session, 2277*62c56f98SSadaf Ebrahimi serialized_session, 2278*62c56f98SSadaf Ebrahimi sizeof(serialized_session), 2279*62c56f98SSadaf Ebrahimi &serialized_session_len) == 0); 2280*62c56f98SSadaf Ebrahimi 2281*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&session); 2282*62c56f98SSadaf Ebrahimi 2283*62c56f98SSadaf Ebrahimi /* Without any modification, we should be able to successfully 2284*62c56f98SSadaf Ebrahimi * de-serialize the session - double-check that. */ 2285*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_load(&session, 2286*62c56f98SSadaf Ebrahimi serialized_session, 2287*62c56f98SSadaf Ebrahimi serialized_session_len) == 0); 2288*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(&session); 2289*62c56f98SSadaf Ebrahimi 2290*62c56f98SSadaf Ebrahimi /* Go through the bytes in the serialized session header and 2291*62c56f98SSadaf Ebrahimi * corrupt them bit-by-bit. */ 2292*62c56f98SSadaf Ebrahimi for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) { 2293*62c56f98SSadaf Ebrahimi int cur_bit; 2294*62c56f98SSadaf Ebrahimi unsigned char * const byte = &serialized_session[cur_byte]; 2295*62c56f98SSadaf Ebrahimi 2296*62c56f98SSadaf Ebrahimi if (should_corrupt_byte[cur_byte] == 0) { 2297*62c56f98SSadaf Ebrahimi continue; 2298*62c56f98SSadaf Ebrahimi } 2299*62c56f98SSadaf Ebrahimi 2300*62c56f98SSadaf Ebrahimi for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) { 2301*62c56f98SSadaf Ebrahimi unsigned char const corrupted_bit = 0x1u << cur_bit; 2302*62c56f98SSadaf Ebrahimi /* Modify a single bit in the serialized session. */ 2303*62c56f98SSadaf Ebrahimi *byte ^= corrupted_bit; 2304*62c56f98SSadaf Ebrahimi 2305*62c56f98SSadaf Ebrahimi /* Attempt to deserialize */ 2306*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_session_load(&session, 2307*62c56f98SSadaf Ebrahimi serialized_session, 2308*62c56f98SSadaf Ebrahimi serialized_session_len) == 2309*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_VERSION_MISMATCH); 2310*62c56f98SSadaf Ebrahimi 2311*62c56f98SSadaf Ebrahimi /* Undo the change */ 2312*62c56f98SSadaf Ebrahimi *byte ^= corrupted_bit; 2313*62c56f98SSadaf Ebrahimi } 2314*62c56f98SSadaf Ebrahimi } 2315*62c56f98SSadaf Ebrahimiexit: 2316*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 2317*62c56f98SSadaf Ebrahimi} 2318*62c56f98SSadaf Ebrahimi/* END_CASE */ 2319*62c56f98SSadaf Ebrahimi 2320*62c56f98SSadaf Ebrahimi/* 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 */ 2321*62c56f98SSadaf Ebrahimivoid mbedtls_endpoint_sanity(int endpoint_type) 2322*62c56f98SSadaf Ebrahimi{ 2323*62c56f98SSadaf Ebrahimi enum { BUFFSIZE = 1024 }; 2324*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint ep; 2325*62c56f98SSadaf Ebrahimi int ret = -1; 2326*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2327*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2328*62c56f98SSadaf Ebrahimi options.pk_alg = MBEDTLS_PK_RSA; 2329*62c56f98SSadaf Ebrahimi 2330*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2331*62c56f98SSadaf Ebrahimi 2332*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, &options, 2333*62c56f98SSadaf Ebrahimi NULL, NULL, NULL, NULL); 2334*62c56f98SSadaf Ebrahimi TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret); 2335*62c56f98SSadaf Ebrahimi 2336*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, options.pk_alg, 2337*62c56f98SSadaf Ebrahimi 0, 0, 0); 2338*62c56f98SSadaf Ebrahimi TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret); 2339*62c56f98SSadaf Ebrahimi 2340*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, &options, 2341*62c56f98SSadaf Ebrahimi NULL, NULL, NULL, NULL); 2342*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0); 2343*62c56f98SSadaf Ebrahimi 2344*62c56f98SSadaf Ebrahimiexit: 2345*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&ep, NULL); 2346*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2347*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2348*62c56f98SSadaf Ebrahimi} 2349*62c56f98SSadaf Ebrahimi/* END_CASE */ 2350*62c56f98SSadaf Ebrahimi 2351*62c56f98SSadaf Ebrahimi/* 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 */ 2352*62c56f98SSadaf Ebrahimivoid move_handshake_to_state(int endpoint_type, int tls_version, int state, int need_pass) 2353*62c56f98SSadaf Ebrahimi{ 2354*62c56f98SSadaf Ebrahimi enum { BUFFSIZE = 1024 }; 2355*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint base_ep, second_ep; 2356*62c56f98SSadaf Ebrahimi int ret = -1; 2357*62c56f98SSadaf Ebrahimi (void) tls_version; 2358*62c56f98SSadaf Ebrahimi 2359*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2360*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2361*62c56f98SSadaf Ebrahimi 2362*62c56f98SSadaf Ebrahimi options.pk_alg = MBEDTLS_PK_RSA; 2363*62c56f98SSadaf Ebrahimi 2364*62c56f98SSadaf Ebrahimi /* 2365*62c56f98SSadaf Ebrahimi * If both TLS 1.2 and 1.3 are enabled and we want to do a TLS 1.2 2366*62c56f98SSadaf Ebrahimi * handshake, force the TLS 1.2 version on endpoint under test. 2367*62c56f98SSadaf Ebrahimi */ 2368*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_PROTO_TLS1_2) 2369*62c56f98SSadaf Ebrahimi if (MBEDTLS_SSL_VERSION_TLS1_2 == tls_version) { 2370*62c56f98SSadaf Ebrahimi if (MBEDTLS_SSL_IS_CLIENT == endpoint_type) { 2371*62c56f98SSadaf Ebrahimi options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2372*62c56f98SSadaf Ebrahimi options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2373*62c56f98SSadaf Ebrahimi } else { 2374*62c56f98SSadaf Ebrahimi options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2375*62c56f98SSadaf Ebrahimi options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2376*62c56f98SSadaf Ebrahimi } 2377*62c56f98SSadaf Ebrahimi } 2378*62c56f98SSadaf Ebrahimi#endif 2379*62c56f98SSadaf Ebrahimi 2380*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2381*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&base_ep, sizeof(base_ep)); 2382*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&second_ep, sizeof(second_ep)); 2383*62c56f98SSadaf Ebrahimi 2384*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type, &options, 2385*62c56f98SSadaf Ebrahimi NULL, NULL, NULL, NULL); 2386*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0); 2387*62c56f98SSadaf Ebrahimi 2388*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_endpoint_init( 2389*62c56f98SSadaf Ebrahimi &second_ep, 2390*62c56f98SSadaf Ebrahimi (endpoint_type == MBEDTLS_SSL_IS_SERVER) ? 2391*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER, 2392*62c56f98SSadaf Ebrahimi &options, NULL, NULL, NULL, NULL); 2393*62c56f98SSadaf Ebrahimi 2394*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0); 2395*62c56f98SSadaf Ebrahimi 2396*62c56f98SSadaf Ebrahimi ret = mbedtls_test_mock_socket_connect(&(base_ep.socket), 2397*62c56f98SSadaf Ebrahimi &(second_ep.socket), 2398*62c56f98SSadaf Ebrahimi BUFFSIZE); 2399*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0); 2400*62c56f98SSadaf Ebrahimi 2401*62c56f98SSadaf Ebrahimi ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl), 2402*62c56f98SSadaf Ebrahimi &(second_ep.ssl), 2403*62c56f98SSadaf Ebrahimi state); 2404*62c56f98SSadaf Ebrahimi if (need_pass) { 2405*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret == 0 || 2406*62c56f98SSadaf Ebrahimi ret == MBEDTLS_ERR_SSL_WANT_READ || 2407*62c56f98SSadaf Ebrahimi ret == MBEDTLS_ERR_SSL_WANT_WRITE); 2408*62c56f98SSadaf Ebrahimi TEST_ASSERT(base_ep.ssl.state == state); 2409*62c56f98SSadaf Ebrahimi } else { 2410*62c56f98SSadaf Ebrahimi TEST_ASSERT(ret != 0 && 2411*62c56f98SSadaf Ebrahimi ret != MBEDTLS_ERR_SSL_WANT_READ && 2412*62c56f98SSadaf Ebrahimi ret != MBEDTLS_ERR_SSL_WANT_WRITE); 2413*62c56f98SSadaf Ebrahimi TEST_ASSERT(base_ep.ssl.state != state); 2414*62c56f98SSadaf Ebrahimi } 2415*62c56f98SSadaf Ebrahimi 2416*62c56f98SSadaf Ebrahimiexit: 2417*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2418*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&base_ep, NULL); 2419*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&second_ep, NULL); 2420*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2421*62c56f98SSadaf Ebrahimi} 2422*62c56f98SSadaf Ebrahimi/* END_CASE */ 2423*62c56f98SSadaf Ebrahimi 2424*62c56f98SSadaf Ebrahimi/* 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 */ 2425*62c56f98SSadaf Ebrahimivoid handshake_version(int dtls, int client_min_version, int client_max_version, 2426*62c56f98SSadaf Ebrahimi int server_min_version, int server_max_version, 2427*62c56f98SSadaf Ebrahimi int expected_negotiated_version) 2428*62c56f98SSadaf Ebrahimi{ 2429*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2430*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2431*62c56f98SSadaf Ebrahimi 2432*62c56f98SSadaf Ebrahimi options.client_min_version = client_min_version; 2433*62c56f98SSadaf Ebrahimi options.client_max_version = client_max_version; 2434*62c56f98SSadaf Ebrahimi options.server_min_version = server_min_version; 2435*62c56f98SSadaf Ebrahimi options.server_max_version = server_max_version; 2436*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = expected_negotiated_version; 2437*62c56f98SSadaf Ebrahimi 2438*62c56f98SSadaf Ebrahimi options.dtls = dtls; 2439*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2440*62c56f98SSadaf Ebrahimi 2441*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2442*62c56f98SSadaf Ebrahimi goto exit; 2443*62c56f98SSadaf Ebrahimi 2444*62c56f98SSadaf Ebrahimiexit: 2445*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2446*62c56f98SSadaf Ebrahimi} 2447*62c56f98SSadaf Ebrahimi/* END_CASE */ 2448*62c56f98SSadaf Ebrahimi 2449*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */ 2450*62c56f98SSadaf Ebrahimivoid handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls) 2451*62c56f98SSadaf Ebrahimi{ 2452*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2453*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2454*62c56f98SSadaf Ebrahimi 2455*62c56f98SSadaf Ebrahimi options.cipher = cipher; 2456*62c56f98SSadaf Ebrahimi options.dtls = dtls; 2457*62c56f98SSadaf Ebrahimi options.psk_str = psk_str; 2458*62c56f98SSadaf Ebrahimi options.pk_alg = pk_alg; 2459*62c56f98SSadaf Ebrahimi 2460*62c56f98SSadaf Ebrahimi options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2461*62c56f98SSadaf Ebrahimi options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2462*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2463*62c56f98SSadaf Ebrahimi 2464*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2465*62c56f98SSadaf Ebrahimi 2466*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2467*62c56f98SSadaf Ebrahimi goto exit; 2468*62c56f98SSadaf Ebrahimi 2469*62c56f98SSadaf Ebrahimiexit: 2470*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2471*62c56f98SSadaf Ebrahimi} 2472*62c56f98SSadaf Ebrahimi/* END_CASE */ 2473*62c56f98SSadaf Ebrahimi 2474*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */ 2475*62c56f98SSadaf Ebrahimivoid handshake_cipher(char *cipher, int pk_alg, int dtls) 2476*62c56f98SSadaf Ebrahimi{ 2477*62c56f98SSadaf Ebrahimi test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls); 2478*62c56f98SSadaf Ebrahimi 2479*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2480*62c56f98SSadaf Ebrahimi goto exit; 2481*62c56f98SSadaf Ebrahimi} 2482*62c56f98SSadaf Ebrahimi/* END_CASE */ 2483*62c56f98SSadaf Ebrahimi 2484*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */ 2485*62c56f98SSadaf Ebrahimivoid handshake_ciphersuite_select(char *cipher, int pk_alg, data_t *psk_str, 2486*62c56f98SSadaf Ebrahimi int psa_alg, int psa_alg2, int psa_usage, 2487*62c56f98SSadaf Ebrahimi int expected_handshake_result, 2488*62c56f98SSadaf Ebrahimi int expected_ciphersuite) 2489*62c56f98SSadaf Ebrahimi{ 2490*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2491*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2492*62c56f98SSadaf Ebrahimi 2493*62c56f98SSadaf Ebrahimi options.cipher = cipher; 2494*62c56f98SSadaf Ebrahimi options.psk_str = psk_str; 2495*62c56f98SSadaf Ebrahimi options.pk_alg = pk_alg; 2496*62c56f98SSadaf Ebrahimi options.opaque_alg = psa_alg; 2497*62c56f98SSadaf Ebrahimi options.opaque_alg2 = psa_alg2; 2498*62c56f98SSadaf Ebrahimi options.opaque_usage = psa_usage; 2499*62c56f98SSadaf Ebrahimi options.expected_handshake_result = expected_handshake_result; 2500*62c56f98SSadaf Ebrahimi options.expected_ciphersuite = expected_ciphersuite; 2501*62c56f98SSadaf Ebrahimi 2502*62c56f98SSadaf Ebrahimi options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2503*62c56f98SSadaf Ebrahimi options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2504*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2505*62c56f98SSadaf Ebrahimi 2506*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2507*62c56f98SSadaf Ebrahimi 2508*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2509*62c56f98SSadaf Ebrahimi goto exit; 2510*62c56f98SSadaf Ebrahimi 2511*62c56f98SSadaf Ebrahimiexit: 2512*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2513*62c56f98SSadaf Ebrahimi} 2514*62c56f98SSadaf Ebrahimi/* END_CASE */ 2515*62c56f98SSadaf Ebrahimi 2516*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_MD_CAN_SHA256 */ 2517*62c56f98SSadaf Ebrahimivoid app_data(int mfl, int cli_msg_len, int srv_msg_len, 2518*62c56f98SSadaf Ebrahimi int expected_cli_fragments, 2519*62c56f98SSadaf Ebrahimi int expected_srv_fragments, int dtls) 2520*62c56f98SSadaf Ebrahimi{ 2521*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2522*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2523*62c56f98SSadaf Ebrahimi 2524*62c56f98SSadaf Ebrahimi options.mfl = mfl; 2525*62c56f98SSadaf Ebrahimi options.cli_msg_len = cli_msg_len; 2526*62c56f98SSadaf Ebrahimi options.srv_msg_len = srv_msg_len; 2527*62c56f98SSadaf Ebrahimi options.expected_cli_fragments = expected_cli_fragments; 2528*62c56f98SSadaf Ebrahimi options.expected_srv_fragments = expected_srv_fragments; 2529*62c56f98SSadaf Ebrahimi options.dtls = dtls; 2530*62c56f98SSadaf Ebrahimi 2531*62c56f98SSadaf Ebrahimi options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 2532*62c56f98SSadaf Ebrahimi options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 2533*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2534*62c56f98SSadaf Ebrahimi 2535*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2536*62c56f98SSadaf Ebrahimi 2537*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2538*62c56f98SSadaf Ebrahimi goto exit; 2539*62c56f98SSadaf Ebrahimi 2540*62c56f98SSadaf Ebrahimiexit: 2541*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2542*62c56f98SSadaf Ebrahimi} 2543*62c56f98SSadaf Ebrahimi/* END_CASE */ 2544*62c56f98SSadaf Ebrahimi 2545*62c56f98SSadaf Ebrahimi/* 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 */ 2546*62c56f98SSadaf Ebrahimivoid app_data_tls(int mfl, int cli_msg_len, int srv_msg_len, 2547*62c56f98SSadaf Ebrahimi int expected_cli_fragments, 2548*62c56f98SSadaf Ebrahimi int expected_srv_fragments) 2549*62c56f98SSadaf Ebrahimi{ 2550*62c56f98SSadaf Ebrahimi test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments, 2551*62c56f98SSadaf Ebrahimi expected_srv_fragments, 0); 2552*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2553*62c56f98SSadaf Ebrahimi goto exit; 2554*62c56f98SSadaf Ebrahimi} 2555*62c56f98SSadaf Ebrahimi/* END_CASE */ 2556*62c56f98SSadaf Ebrahimi 2557*62c56f98SSadaf Ebrahimi/* 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 */ 2558*62c56f98SSadaf Ebrahimivoid app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len, 2559*62c56f98SSadaf Ebrahimi int expected_cli_fragments, 2560*62c56f98SSadaf Ebrahimi int expected_srv_fragments) 2561*62c56f98SSadaf Ebrahimi{ 2562*62c56f98SSadaf Ebrahimi test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments, 2563*62c56f98SSadaf Ebrahimi expected_srv_fragments, 1); 2564*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2565*62c56f98SSadaf Ebrahimi goto exit; 2566*62c56f98SSadaf Ebrahimi} 2567*62c56f98SSadaf Ebrahimi/* END_CASE */ 2568*62c56f98SSadaf Ebrahimi 2569*62c56f98SSadaf Ebrahimi/* 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 */ 2570*62c56f98SSadaf Ebrahimivoid handshake_serialization() 2571*62c56f98SSadaf Ebrahimi{ 2572*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2573*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2574*62c56f98SSadaf Ebrahimi 2575*62c56f98SSadaf Ebrahimi options.serialize = 1; 2576*62c56f98SSadaf Ebrahimi options.dtls = 1; 2577*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2578*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2579*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2580*62c56f98SSadaf Ebrahimi goto exit; 2581*62c56f98SSadaf Ebrahimiexit: 2582*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2583*62c56f98SSadaf Ebrahimi} 2584*62c56f98SSadaf Ebrahimi/* END_CASE */ 2585*62c56f98SSadaf Ebrahimi 2586*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_AES_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_MD_CAN_SHA256:MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ 2587*62c56f98SSadaf Ebrahimivoid handshake_fragmentation(int mfl, 2588*62c56f98SSadaf Ebrahimi int expected_srv_hs_fragmentation, 2589*62c56f98SSadaf Ebrahimi int expected_cli_hs_fragmentation) 2590*62c56f98SSadaf Ebrahimi{ 2591*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2592*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern; 2593*62c56f98SSadaf Ebrahimi 2594*62c56f98SSadaf Ebrahimi srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake"; 2595*62c56f98SSadaf Ebrahimi srv_pattern.counter = 0; 2596*62c56f98SSadaf Ebrahimi cli_pattern.counter = 0; 2597*62c56f98SSadaf Ebrahimi 2598*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2599*62c56f98SSadaf Ebrahimi options.dtls = 1; 2600*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2601*62c56f98SSadaf Ebrahimi options.mfl = mfl; 2602*62c56f98SSadaf Ebrahimi /* Set cipher to one using CBC so that record splitting can be tested */ 2603*62c56f98SSadaf Ebrahimi options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256"; 2604*62c56f98SSadaf Ebrahimi options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED; 2605*62c56f98SSadaf Ebrahimi options.srv_log_obj = &srv_pattern; 2606*62c56f98SSadaf Ebrahimi options.cli_log_obj = &cli_pattern; 2607*62c56f98SSadaf Ebrahimi options.srv_log_fun = mbedtls_test_ssl_log_analyzer; 2608*62c56f98SSadaf Ebrahimi options.cli_log_fun = mbedtls_test_ssl_log_analyzer; 2609*62c56f98SSadaf Ebrahimi 2610*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2611*62c56f98SSadaf Ebrahimi 2612*62c56f98SSadaf Ebrahimi /* Test if the server received a fragmented handshake */ 2613*62c56f98SSadaf Ebrahimi if (expected_srv_hs_fragmentation) { 2614*62c56f98SSadaf Ebrahimi TEST_ASSERT(srv_pattern.counter >= 1); 2615*62c56f98SSadaf Ebrahimi } 2616*62c56f98SSadaf Ebrahimi /* Test if the client received a fragmented handshake */ 2617*62c56f98SSadaf Ebrahimi if (expected_cli_hs_fragmentation) { 2618*62c56f98SSadaf Ebrahimi TEST_ASSERT(cli_pattern.counter >= 1); 2619*62c56f98SSadaf Ebrahimi } 2620*62c56f98SSadaf Ebrahimi 2621*62c56f98SSadaf Ebrahimiexit: 2622*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2623*62c56f98SSadaf Ebrahimi} 2624*62c56f98SSadaf Ebrahimi/* END_CASE */ 2625*62c56f98SSadaf Ebrahimi 2626*62c56f98SSadaf Ebrahimi/* 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 */ 2627*62c56f98SSadaf Ebrahimivoid renegotiation(int legacy_renegotiation) 2628*62c56f98SSadaf Ebrahimi{ 2629*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2630*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2631*62c56f98SSadaf Ebrahimi 2632*62c56f98SSadaf Ebrahimi options.renegotiate = 1; 2633*62c56f98SSadaf Ebrahimi options.legacy_renegotiation = legacy_renegotiation; 2634*62c56f98SSadaf Ebrahimi options.dtls = 1; 2635*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2636*62c56f98SSadaf Ebrahimi 2637*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2638*62c56f98SSadaf Ebrahimi 2639*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2640*62c56f98SSadaf Ebrahimi goto exit; 2641*62c56f98SSadaf Ebrahimiexit: 2642*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2643*62c56f98SSadaf Ebrahimi} 2644*62c56f98SSadaf Ebrahimi/* END_CASE */ 2645*62c56f98SSadaf Ebrahimi 2646*62c56f98SSadaf Ebrahimi/* 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 */ 2647*62c56f98SSadaf Ebrahimivoid resize_buffers(int mfl, int renegotiation, int legacy_renegotiation, 2648*62c56f98SSadaf Ebrahimi int serialize, int dtls, char *cipher) 2649*62c56f98SSadaf Ebrahimi{ 2650*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2651*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2652*62c56f98SSadaf Ebrahimi 2653*62c56f98SSadaf Ebrahimi options.mfl = mfl; 2654*62c56f98SSadaf Ebrahimi options.cipher = cipher; 2655*62c56f98SSadaf Ebrahimi options.renegotiate = renegotiation; 2656*62c56f98SSadaf Ebrahimi options.legacy_renegotiation = legacy_renegotiation; 2657*62c56f98SSadaf Ebrahimi options.serialize = serialize; 2658*62c56f98SSadaf Ebrahimi options.dtls = dtls; 2659*62c56f98SSadaf Ebrahimi if (dtls) { 2660*62c56f98SSadaf Ebrahimi options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2; 2661*62c56f98SSadaf Ebrahimi } 2662*62c56f98SSadaf Ebrahimi options.resize_buffers = 1; 2663*62c56f98SSadaf Ebrahimi 2664*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_perform_handshake(&options); 2665*62c56f98SSadaf Ebrahimi 2666*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2667*62c56f98SSadaf Ebrahimi goto exit; 2668*62c56f98SSadaf Ebrahimiexit: 2669*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2670*62c56f98SSadaf Ebrahimi} 2671*62c56f98SSadaf Ebrahimi/* END_CASE */ 2672*62c56f98SSadaf Ebrahimi 2673*62c56f98SSadaf Ebrahimi/* 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 */ 2674*62c56f98SSadaf Ebrahimivoid resize_buffers_serialize_mfl(int mfl) 2675*62c56f98SSadaf Ebrahimi{ 2676*62c56f98SSadaf Ebrahimi test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1, 2677*62c56f98SSadaf Ebrahimi (char *) ""); 2678*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2679*62c56f98SSadaf Ebrahimi goto exit; 2680*62c56f98SSadaf Ebrahimi} 2681*62c56f98SSadaf Ebrahimi/* END_CASE */ 2682*62c56f98SSadaf Ebrahimi 2683*62c56f98SSadaf Ebrahimi/* 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 */ 2684*62c56f98SSadaf Ebrahimivoid resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation, 2685*62c56f98SSadaf Ebrahimi char *cipher) 2686*62c56f98SSadaf Ebrahimi{ 2687*62c56f98SSadaf Ebrahimi test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher); 2688*62c56f98SSadaf Ebrahimi /* The goto below is used to avoid an "unused label" warning.*/ 2689*62c56f98SSadaf Ebrahimi goto exit; 2690*62c56f98SSadaf Ebrahimi} 2691*62c56f98SSadaf Ebrahimi/* END_CASE */ 2692*62c56f98SSadaf Ebrahimi 2693*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ 2694*62c56f98SSadaf Ebrahimivoid test_multiple_psks() 2695*62c56f98SSadaf Ebrahimi{ 2696*62c56f98SSadaf Ebrahimi unsigned char psk0[10] = { 0 }; 2697*62c56f98SSadaf Ebrahimi unsigned char psk0_identity[] = { 'f', 'o', 'o' }; 2698*62c56f98SSadaf Ebrahimi 2699*62c56f98SSadaf Ebrahimi unsigned char psk1[10] = { 0 }; 2700*62c56f98SSadaf Ebrahimi unsigned char psk1_identity[] = { 'b', 'a', 'r' }; 2701*62c56f98SSadaf Ebrahimi 2702*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 2703*62c56f98SSadaf Ebrahimi 2704*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 2705*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2706*62c56f98SSadaf Ebrahimi 2707*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2708*62c56f98SSadaf Ebrahimi psk0, sizeof(psk0), 2709*62c56f98SSadaf Ebrahimi psk0_identity, sizeof(psk0_identity)) == 0); 2710*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2711*62c56f98SSadaf Ebrahimi psk1, sizeof(psk1), 2712*62c56f98SSadaf Ebrahimi psk1_identity, sizeof(psk1_identity)) == 2713*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2714*62c56f98SSadaf Ebrahimi 2715*62c56f98SSadaf Ebrahimiexit: 2716*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 2717*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2718*62c56f98SSadaf Ebrahimi} 2719*62c56f98SSadaf Ebrahimi/* END_CASE */ 2720*62c56f98SSadaf Ebrahimi 2721*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED:MBEDTLS_USE_PSA_CRYPTO */ 2722*62c56f98SSadaf Ebrahimivoid test_multiple_psks_opaque(int mode) 2723*62c56f98SSadaf Ebrahimi{ 2724*62c56f98SSadaf Ebrahimi /* 2725*62c56f98SSadaf Ebrahimi * Mode 0: Raw PSK, then opaque PSK 2726*62c56f98SSadaf Ebrahimi * Mode 1: Opaque PSK, then raw PSK 2727*62c56f98SSadaf Ebrahimi * Mode 2: 2x opaque PSK 2728*62c56f98SSadaf Ebrahimi */ 2729*62c56f98SSadaf Ebrahimi 2730*62c56f98SSadaf Ebrahimi unsigned char psk0_raw[10] = { 0 }; 2731*62c56f98SSadaf Ebrahimi unsigned char psk0_raw_identity[] = { 'f', 'o', 'o' }; 2732*62c56f98SSadaf Ebrahimi 2733*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t psk0_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 1); 2734*62c56f98SSadaf Ebrahimi 2735*62c56f98SSadaf Ebrahimi unsigned char psk0_opaque_identity[] = { 'f', 'o', 'o' }; 2736*62c56f98SSadaf Ebrahimi 2737*62c56f98SSadaf Ebrahimi unsigned char psk1_raw[10] = { 0 }; 2738*62c56f98SSadaf Ebrahimi unsigned char psk1_raw_identity[] = { 'b', 'a', 'r' }; 2739*62c56f98SSadaf Ebrahimi 2740*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t psk1_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 2); 2741*62c56f98SSadaf Ebrahimi 2742*62c56f98SSadaf Ebrahimi unsigned char psk1_opaque_identity[] = { 'b', 'a', 'r' }; 2743*62c56f98SSadaf Ebrahimi 2744*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 2745*62c56f98SSadaf Ebrahimi 2746*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 2747*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2748*62c56f98SSadaf Ebrahimi 2749*62c56f98SSadaf Ebrahimi switch (mode) { 2750*62c56f98SSadaf Ebrahimi case 0: 2751*62c56f98SSadaf Ebrahimi 2752*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2753*62c56f98SSadaf Ebrahimi psk0_raw, sizeof(psk0_raw), 2754*62c56f98SSadaf Ebrahimi psk0_raw_identity, sizeof(psk0_raw_identity)) 2755*62c56f98SSadaf Ebrahimi == 0); 2756*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2757*62c56f98SSadaf Ebrahimi psk1_opaque, 2758*62c56f98SSadaf Ebrahimi psk1_opaque_identity, 2759*62c56f98SSadaf Ebrahimi sizeof(psk1_opaque_identity)) 2760*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2761*62c56f98SSadaf Ebrahimi break; 2762*62c56f98SSadaf Ebrahimi 2763*62c56f98SSadaf Ebrahimi case 1: 2764*62c56f98SSadaf Ebrahimi 2765*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2766*62c56f98SSadaf Ebrahimi psk0_opaque, 2767*62c56f98SSadaf Ebrahimi psk0_opaque_identity, 2768*62c56f98SSadaf Ebrahimi sizeof(psk0_opaque_identity)) 2769*62c56f98SSadaf Ebrahimi == 0); 2770*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk(&conf, 2771*62c56f98SSadaf Ebrahimi psk1_raw, sizeof(psk1_raw), 2772*62c56f98SSadaf Ebrahimi psk1_raw_identity, sizeof(psk1_raw_identity)) 2773*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2774*62c56f98SSadaf Ebrahimi 2775*62c56f98SSadaf Ebrahimi break; 2776*62c56f98SSadaf Ebrahimi 2777*62c56f98SSadaf Ebrahimi case 2: 2778*62c56f98SSadaf Ebrahimi 2779*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2780*62c56f98SSadaf Ebrahimi psk0_opaque, 2781*62c56f98SSadaf Ebrahimi psk0_opaque_identity, 2782*62c56f98SSadaf Ebrahimi sizeof(psk0_opaque_identity)) 2783*62c56f98SSadaf Ebrahimi == 0); 2784*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf, 2785*62c56f98SSadaf Ebrahimi psk1_opaque, 2786*62c56f98SSadaf Ebrahimi psk1_opaque_identity, 2787*62c56f98SSadaf Ebrahimi sizeof(psk1_opaque_identity)) 2788*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE); 2789*62c56f98SSadaf Ebrahimi 2790*62c56f98SSadaf Ebrahimi break; 2791*62c56f98SSadaf Ebrahimi 2792*62c56f98SSadaf Ebrahimi default: 2793*62c56f98SSadaf Ebrahimi TEST_ASSERT(0); 2794*62c56f98SSadaf Ebrahimi break; 2795*62c56f98SSadaf Ebrahimi } 2796*62c56f98SSadaf Ebrahimi 2797*62c56f98SSadaf Ebrahimiexit: 2798*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 2799*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2800*62c56f98SSadaf Ebrahimi 2801*62c56f98SSadaf Ebrahimi} 2802*62c56f98SSadaf Ebrahimi/* END_CASE */ 2803*62c56f98SSadaf Ebrahimi 2804*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 2805*62c56f98SSadaf Ebrahimivoid conf_version(int endpoint, int transport, 2806*62c56f98SSadaf Ebrahimi int min_tls_version, int max_tls_version, 2807*62c56f98SSadaf Ebrahimi int expected_ssl_setup_result) 2808*62c56f98SSadaf Ebrahimi{ 2809*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 2810*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 2811*62c56f98SSadaf Ebrahimi 2812*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 2813*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 2814*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2815*62c56f98SSadaf Ebrahimi 2816*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_endpoint(&conf, endpoint); 2817*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_transport(&conf, transport); 2818*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_min_tls_version(&conf, min_tls_version); 2819*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_max_tls_version(&conf, max_tls_version); 2820*62c56f98SSadaf Ebrahimi 2821*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == expected_ssl_setup_result); 2822*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_ssl_conf_get_endpoint( 2823*62c56f98SSadaf Ebrahimi mbedtls_ssl_context_get_config(&ssl)), endpoint); 2824*62c56f98SSadaf Ebrahimi 2825*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 2826*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 2827*62c56f98SSadaf Ebrahimi 2828*62c56f98SSadaf Ebrahimiexit: 2829*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2830*62c56f98SSadaf Ebrahimi} 2831*62c56f98SSadaf Ebrahimi/* END_CASE */ 2832*62c56f98SSadaf Ebrahimi 2833*62c56f98SSadaf Ebrahimi/* 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 */ 2834*62c56f98SSadaf Ebrahimivoid conf_curve() 2835*62c56f98SSadaf Ebrahimi{ 2836*62c56f98SSadaf Ebrahimi 2837*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP192R1, 2838*62c56f98SSadaf Ebrahimi MBEDTLS_ECP_DP_SECP224R1, 2839*62c56f98SSadaf Ebrahimi MBEDTLS_ECP_DP_SECP256R1, 2840*62c56f98SSadaf Ebrahimi MBEDTLS_ECP_DP_NONE }; 2841*62c56f98SSadaf Ebrahimi uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1, 2842*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1, 2843*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 2844*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_NONE }; 2845*62c56f98SSadaf Ebrahimi 2846*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 2847*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 2848*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 2849*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 2850*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 2851*62c56f98SSadaf Ebrahimi#else 2852*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3); 2853*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3); 2854*62c56f98SSadaf Ebrahimi#endif 2855*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_curves(&conf, curve_list); 2856*62c56f98SSadaf Ebrahimi 2857*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 2858*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 2859*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2860*62c56f98SSadaf Ebrahimi 2861*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 2862*62c56f98SSadaf Ebrahimi 2863*62c56f98SSadaf Ebrahimi TEST_ASSERT(ssl.handshake != NULL && ssl.handshake->group_list != NULL); 2864*62c56f98SSadaf Ebrahimi TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list == NULL); 2865*62c56f98SSadaf Ebrahimi 2866*62c56f98SSadaf Ebrahimi TEST_EQUAL(ssl.handshake-> 2867*62c56f98SSadaf Ebrahimi group_list[ARRAY_LENGTH(iana_tls_group_list) - 1], 2868*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_NONE); 2869*62c56f98SSadaf Ebrahimi 2870*62c56f98SSadaf Ebrahimi for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) { 2871*62c56f98SSadaf Ebrahimi TEST_EQUAL(iana_tls_group_list[i], ssl.handshake->group_list[i]); 2872*62c56f98SSadaf Ebrahimi } 2873*62c56f98SSadaf Ebrahimi 2874*62c56f98SSadaf Ebrahimiexit: 2875*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 2876*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 2877*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2878*62c56f98SSadaf Ebrahimi} 2879*62c56f98SSadaf Ebrahimi/* END_CASE */ 2880*62c56f98SSadaf Ebrahimi 2881*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_DEPRECATED_REMOVED */ 2882*62c56f98SSadaf Ebrahimivoid conf_group() 2883*62c56f98SSadaf Ebrahimi{ 2884*62c56f98SSadaf Ebrahimi uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1, 2885*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1, 2886*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 2887*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_NONE }; 2888*62c56f98SSadaf Ebrahimi 2889*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 2890*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 2891*62c56f98SSadaf Ebrahimi 2892*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 2893*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2); 2894*62c56f98SSadaf Ebrahimi 2895*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_groups(&conf, iana_tls_group_list); 2896*62c56f98SSadaf Ebrahimi 2897*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 2898*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 2899*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2900*62c56f98SSadaf Ebrahimi 2901*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 2902*62c56f98SSadaf Ebrahimi 2903*62c56f98SSadaf Ebrahimi TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list != NULL); 2904*62c56f98SSadaf Ebrahimi 2905*62c56f98SSadaf Ebrahimi TEST_EQUAL(ssl.conf-> 2906*62c56f98SSadaf Ebrahimi group_list[ARRAY_LENGTH(iana_tls_group_list) - 1], 2907*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_NONE); 2908*62c56f98SSadaf Ebrahimi 2909*62c56f98SSadaf Ebrahimi for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) { 2910*62c56f98SSadaf Ebrahimi TEST_EQUAL(iana_tls_group_list[i], ssl.conf->group_list[i]); 2911*62c56f98SSadaf Ebrahimi } 2912*62c56f98SSadaf Ebrahimi 2913*62c56f98SSadaf Ebrahimiexit: 2914*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 2915*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 2916*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2917*62c56f98SSadaf Ebrahimi} 2918*62c56f98SSadaf Ebrahimi/* END_CASE */ 2919*62c56f98SSadaf Ebrahimi 2920*62c56f98SSadaf Ebrahimi/* 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 */ 2921*62c56f98SSadaf Ebrahimivoid force_bad_session_id_len() 2922*62c56f98SSadaf Ebrahimi{ 2923*62c56f98SSadaf Ebrahimi enum { BUFFSIZE = 1024 }; 2924*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 2925*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint client, server; 2926*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern; 2927*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_context server_context, client_context; 2928*62c56f98SSadaf Ebrahimi 2929*62c56f98SSadaf Ebrahimi srv_pattern.pattern = cli_pattern.pattern = "cache did not store session"; 2930*62c56f98SSadaf Ebrahimi srv_pattern.counter = 0; 2931*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 2932*62c56f98SSadaf Ebrahimi 2933*62c56f98SSadaf Ebrahimi options.srv_log_obj = &srv_pattern; 2934*62c56f98SSadaf Ebrahimi options.srv_log_fun = mbedtls_test_ssl_log_analyzer; 2935*62c56f98SSadaf Ebrahimi 2936*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&client, sizeof(client)); 2937*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&server, sizeof(server)); 2938*62c56f98SSadaf Ebrahimi 2939*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&server_context); 2940*62c56f98SSadaf Ebrahimi mbedtls_test_message_socket_init(&client_context); 2941*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 2942*62c56f98SSadaf Ebrahimi 2943*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT, 2944*62c56f98SSadaf Ebrahimi &options, NULL, NULL, 2945*62c56f98SSadaf Ebrahimi NULL, NULL) == 0); 2946*62c56f98SSadaf Ebrahimi 2947*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER, 2948*62c56f98SSadaf Ebrahimi &options, NULL, NULL, NULL, 2949*62c56f98SSadaf Ebrahimi NULL) == 0); 2950*62c56f98SSadaf Ebrahimi 2951*62c56f98SSadaf Ebrahimi mbedtls_debug_set_threshold(1); 2952*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_dbg(&server.conf, options.srv_log_fun, 2953*62c56f98SSadaf Ebrahimi options.srv_log_obj); 2954*62c56f98SSadaf Ebrahimi 2955*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_mock_socket_connect(&(client.socket), 2956*62c56f98SSadaf Ebrahimi &(server.socket), 2957*62c56f98SSadaf Ebrahimi BUFFSIZE) == 0); 2958*62c56f98SSadaf Ebrahimi 2959*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_move_handshake_to_state( 2960*62c56f98SSadaf Ebrahimi &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_WRAPUP) 2961*62c56f98SSadaf Ebrahimi == 0); 2962*62c56f98SSadaf Ebrahimi /* Force a bad session_id_len that will be read by the server in 2963*62c56f98SSadaf Ebrahimi * mbedtls_ssl_cache_set. */ 2964*62c56f98SSadaf Ebrahimi server.ssl.session_negotiate->id_len = 33; 2965*62c56f98SSadaf Ebrahimi if (options.cli_msg_len != 0 || options.srv_msg_len != 0) { 2966*62c56f98SSadaf Ebrahimi /* Start data exchanging test */ 2967*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_test_ssl_exchange_data( 2968*62c56f98SSadaf Ebrahimi &(client.ssl), options.cli_msg_len, 2969*62c56f98SSadaf Ebrahimi options.expected_cli_fragments, 2970*62c56f98SSadaf Ebrahimi &(server.ssl), options.srv_msg_len, 2971*62c56f98SSadaf Ebrahimi options.expected_srv_fragments) 2972*62c56f98SSadaf Ebrahimi == 0); 2973*62c56f98SSadaf Ebrahimi } 2974*62c56f98SSadaf Ebrahimi 2975*62c56f98SSadaf Ebrahimi /* Make sure that the cache did not store the session */ 2976*62c56f98SSadaf Ebrahimi TEST_EQUAL(srv_pattern.counter, 1); 2977*62c56f98SSadaf Ebrahimiexit: 2978*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&client, NULL); 2979*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&server, NULL); 2980*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 2981*62c56f98SSadaf Ebrahimi mbedtls_debug_set_threshold(0); 2982*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 2983*62c56f98SSadaf Ebrahimi} 2984*62c56f98SSadaf Ebrahimi/* END_CASE */ 2985*62c56f98SSadaf Ebrahimi 2986*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */ 2987*62c56f98SSadaf Ebrahimivoid cookie_parsing(data_t *cookie, int exp_ret) 2988*62c56f98SSadaf Ebrahimi{ 2989*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 2990*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 2991*62c56f98SSadaf Ebrahimi size_t len; 2992*62c56f98SSadaf Ebrahimi 2993*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 2994*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 2995*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 2996*62c56f98SSadaf Ebrahimi 2997*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER, 2998*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TRANSPORT_DATAGRAM, 2999*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRESET_DEFAULT), 3000*62c56f98SSadaf Ebrahimi 0); 3001*62c56f98SSadaf Ebrahimi 3002*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0); 3003*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id, 3004*62c56f98SSadaf Ebrahimi ssl.cli_id_len, 3005*62c56f98SSadaf Ebrahimi cookie->x, cookie->len, 3006*62c56f98SSadaf Ebrahimi ssl.out_buf, 3007*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_OUT_CONTENT_LEN, 3008*62c56f98SSadaf Ebrahimi &len), 3009*62c56f98SSadaf Ebrahimi exp_ret); 3010*62c56f98SSadaf Ebrahimi 3011*62c56f98SSadaf Ebrahimiexit: 3012*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 3013*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 3014*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 3015*62c56f98SSadaf Ebrahimi} 3016*62c56f98SSadaf Ebrahimi/* END_CASE */ 3017*62c56f98SSadaf Ebrahimi 3018*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_TIMING_C:MBEDTLS_HAVE_TIME */ 3019*62c56f98SSadaf Ebrahimivoid timing_final_delay_accessor() 3020*62c56f98SSadaf Ebrahimi{ 3021*62c56f98SSadaf Ebrahimi mbedtls_timing_delay_context delay_context; 3022*62c56f98SSadaf Ebrahimi 3023*62c56f98SSadaf Ebrahimi USE_PSA_INIT(); 3024*62c56f98SSadaf Ebrahimi mbedtls_timing_set_delay(&delay_context, 50, 100); 3025*62c56f98SSadaf Ebrahimi 3026*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_timing_get_final_delay(&delay_context) == 100); 3027*62c56f98SSadaf Ebrahimi 3028*62c56f98SSadaf Ebrahimiexit: 3029*62c56f98SSadaf Ebrahimi USE_PSA_DONE(); 3030*62c56f98SSadaf Ebrahimi} 3031*62c56f98SSadaf Ebrahimi/* END_CASE */ 3032*62c56f98SSadaf Ebrahimi 3033*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_CONNECTION_ID */ 3034*62c56f98SSadaf Ebrahimivoid cid_sanity() 3035*62c56f98SSadaf Ebrahimi{ 3036*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 3037*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 3038*62c56f98SSadaf Ebrahimi 3039*62c56f98SSadaf Ebrahimi unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX]; 3040*62c56f98SSadaf Ebrahimi unsigned char test_cid[MBEDTLS_SSL_CID_IN_LEN_MAX]; 3041*62c56f98SSadaf Ebrahimi int cid_enabled; 3042*62c56f98SSadaf Ebrahimi size_t own_cid_len; 3043*62c56f98SSadaf Ebrahimi 3044*62c56f98SSadaf Ebrahimi mbedtls_test_rnd_std_rand(NULL, own_cid, sizeof(own_cid)); 3045*62c56f98SSadaf Ebrahimi 3046*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 3047*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 3048*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 3049*62c56f98SSadaf Ebrahimi 3050*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_config_defaults(&conf, 3051*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_CLIENT, 3052*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TRANSPORT_STREAM, 3053*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRESET_DEFAULT) 3054*62c56f98SSadaf Ebrahimi == 0); 3055*62c56f98SSadaf Ebrahimi 3056*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 3057*62c56f98SSadaf Ebrahimi 3058*62c56f98SSadaf Ebrahimi /* Can't use CID functions with stream transport. */ 3059*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid, 3060*62c56f98SSadaf Ebrahimi sizeof(own_cid)) 3061*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3062*62c56f98SSadaf Ebrahimi 3063*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid, 3064*62c56f98SSadaf Ebrahimi &own_cid_len) 3065*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3066*62c56f98SSadaf Ebrahimi 3067*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_config_defaults(&conf, 3068*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_CLIENT, 3069*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TRANSPORT_DATAGRAM, 3070*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRESET_DEFAULT) 3071*62c56f98SSadaf Ebrahimi == 0); 3072*62c56f98SSadaf Ebrahimi 3073*62c56f98SSadaf Ebrahimi /* Attempt to set config cid size too big. */ 3074*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, MBEDTLS_SSL_CID_IN_LEN_MAX + 1, 3075*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) 3076*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3077*62c56f98SSadaf Ebrahimi 3078*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, sizeof(own_cid), 3079*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) 3080*62c56f98SSadaf Ebrahimi == 0); 3081*62c56f98SSadaf Ebrahimi 3082*62c56f98SSadaf Ebrahimi /* Attempt to set CID length not matching config. */ 3083*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid, 3084*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CID_IN_LEN_MAX - 1) 3085*62c56f98SSadaf Ebrahimi == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3086*62c56f98SSadaf Ebrahimi 3087*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid, 3088*62c56f98SSadaf Ebrahimi sizeof(own_cid)) 3089*62c56f98SSadaf Ebrahimi == 0); 3090*62c56f98SSadaf Ebrahimi 3091*62c56f98SSadaf Ebrahimi /* Test we get back what we put in. */ 3092*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid, 3093*62c56f98SSadaf Ebrahimi &own_cid_len) 3094*62c56f98SSadaf Ebrahimi == 0); 3095*62c56f98SSadaf Ebrahimi 3096*62c56f98SSadaf Ebrahimi TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_ENABLED); 3097*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(own_cid, own_cid_len, test_cid, own_cid_len); 3098*62c56f98SSadaf Ebrahimi 3099*62c56f98SSadaf Ebrahimi /* Test disabling works. */ 3100*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_DISABLED, NULL, 3101*62c56f98SSadaf Ebrahimi 0) 3102*62c56f98SSadaf Ebrahimi == 0); 3103*62c56f98SSadaf Ebrahimi 3104*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid, 3105*62c56f98SSadaf Ebrahimi &own_cid_len) 3106*62c56f98SSadaf Ebrahimi == 0); 3107*62c56f98SSadaf Ebrahimi 3108*62c56f98SSadaf Ebrahimi TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_DISABLED); 3109*62c56f98SSadaf Ebrahimi 3110*62c56f98SSadaf Ebrahimiexit: 3111*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 3112*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 3113*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 3114*62c56f98SSadaf Ebrahimi} 3115*62c56f98SSadaf Ebrahimi/* END_CASE */ 3116*62c56f98SSadaf Ebrahimi 3117*62c56f98SSadaf Ebrahimi/* 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 */ 3118*62c56f98SSadaf Ebrahimivoid raw_key_agreement_fail(int bad_server_ecdhe_key) 3119*62c56f98SSadaf Ebrahimi{ 3120*62c56f98SSadaf Ebrahimi enum { BUFFSIZE = 17000 }; 3121*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint client, server; 3122*62c56f98SSadaf Ebrahimi mbedtls_psa_stats_t stats; 3123*62c56f98SSadaf Ebrahimi size_t free_slots_before = -1; 3124*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options options; 3125*62c56f98SSadaf Ebrahimi 3126*62c56f98SSadaf Ebrahimi uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 3127*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_NONE }; 3128*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 3129*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&client, sizeof(client)); 3130*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&server, sizeof(server)); 3131*62c56f98SSadaf Ebrahimi 3132*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&options); 3133*62c56f98SSadaf Ebrahimi options.pk_alg = MBEDTLS_PK_ECDSA; 3134*62c56f98SSadaf Ebrahimi options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2; 3135*62c56f98SSadaf Ebrahimi options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2; 3136*62c56f98SSadaf Ebrahimi 3137*62c56f98SSadaf Ebrahimi /* Client side, force SECP256R1 to make one key bitflip fail 3138*62c56f98SSadaf Ebrahimi * the raw key agreement. Flipping the first byte makes the 3139*62c56f98SSadaf Ebrahimi * required 0x04 identifier invalid. */ 3140*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT, 3141*62c56f98SSadaf Ebrahimi &options, NULL, NULL, 3142*62c56f98SSadaf Ebrahimi NULL, iana_tls_group_list), 0); 3143*62c56f98SSadaf Ebrahimi 3144*62c56f98SSadaf Ebrahimi /* Server side */ 3145*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER, 3146*62c56f98SSadaf Ebrahimi &options, NULL, NULL, 3147*62c56f98SSadaf Ebrahimi NULL, NULL), 0); 3148*62c56f98SSadaf Ebrahimi 3149*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket), 3150*62c56f98SSadaf Ebrahimi &(server.socket), 3151*62c56f98SSadaf Ebrahimi BUFFSIZE), 0); 3152*62c56f98SSadaf Ebrahimi 3153*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_test_move_handshake_to_state( 3154*62c56f98SSadaf Ebrahimi &(client.ssl), &(server.ssl), 3155*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CLIENT_KEY_EXCHANGE), 0); 3156*62c56f98SSadaf Ebrahimi 3157*62c56f98SSadaf Ebrahimi mbedtls_psa_get_stats(&stats); 3158*62c56f98SSadaf Ebrahimi /* Save the number of slots in use up to this point. 3159*62c56f98SSadaf Ebrahimi * With PSA, one can be used for the ECDH private key. */ 3160*62c56f98SSadaf Ebrahimi free_slots_before = stats.empty_slots; 3161*62c56f98SSadaf Ebrahimi 3162*62c56f98SSadaf Ebrahimi if (bad_server_ecdhe_key) { 3163*62c56f98SSadaf Ebrahimi /* Force a simulated bitflip in the server key. to make the 3164*62c56f98SSadaf Ebrahimi * raw key agreement in ssl_write_client_key_exchange fail. */ 3165*62c56f98SSadaf Ebrahimi (client.ssl).handshake->xxdh_psa_peerkey[0] ^= 0x02; 3166*62c56f98SSadaf Ebrahimi } 3167*62c56f98SSadaf Ebrahimi 3168*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_test_move_handshake_to_state( 3169*62c56f98SSadaf Ebrahimi &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER), 3170*62c56f98SSadaf Ebrahimi bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0); 3171*62c56f98SSadaf Ebrahimi 3172*62c56f98SSadaf Ebrahimi mbedtls_psa_get_stats(&stats); 3173*62c56f98SSadaf Ebrahimi 3174*62c56f98SSadaf Ebrahimi /* Make sure that the key slot is already destroyed in case of failure, 3175*62c56f98SSadaf Ebrahimi * without waiting to close the connection. */ 3176*62c56f98SSadaf Ebrahimi if (bad_server_ecdhe_key) { 3177*62c56f98SSadaf Ebrahimi TEST_EQUAL(free_slots_before, stats.empty_slots); 3178*62c56f98SSadaf Ebrahimi } 3179*62c56f98SSadaf Ebrahimi 3180*62c56f98SSadaf Ebrahimiexit: 3181*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&client, NULL); 3182*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&server, NULL); 3183*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&options); 3184*62c56f98SSadaf Ebrahimi 3185*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 3186*62c56f98SSadaf Ebrahimi} 3187*62c56f98SSadaf Ebrahimi/* END_CASE */ 3188*62c56f98SSadaf Ebrahimi/* 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 */ 3189*62c56f98SSadaf Ebrahimivoid tls13_server_certificate_msg_invalid_vector_len() 3190*62c56f98SSadaf Ebrahimi{ 3191*62c56f98SSadaf Ebrahimi int ret = -1; 3192*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint client_ep, server_ep; 3193*62c56f98SSadaf Ebrahimi unsigned char *buf, *end; 3194*62c56f98SSadaf Ebrahimi size_t buf_len; 3195*62c56f98SSadaf Ebrahimi int step = 0; 3196*62c56f98SSadaf Ebrahimi int expected_result; 3197*62c56f98SSadaf Ebrahimi mbedtls_ssl_chk_buf_ptr_args expected_chk_buf_ptr_args; 3198*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options client_options; 3199*62c56f98SSadaf Ebrahimi mbedtls_test_handshake_test_options server_options; 3200*62c56f98SSadaf Ebrahimi 3201*62c56f98SSadaf Ebrahimi /* 3202*62c56f98SSadaf Ebrahimi * Test set-up 3203*62c56f98SSadaf Ebrahimi */ 3204*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&client_ep, sizeof(client_ep)); 3205*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(&server_ep, sizeof(server_ep)); 3206*62c56f98SSadaf Ebrahimi 3207*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&client_options); 3208*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 3209*62c56f98SSadaf Ebrahimi 3210*62c56f98SSadaf Ebrahimi client_options.pk_alg = MBEDTLS_PK_ECDSA; 3211*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT, 3212*62c56f98SSadaf Ebrahimi &client_options, NULL, NULL, NULL, 3213*62c56f98SSadaf Ebrahimi NULL); 3214*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3215*62c56f98SSadaf Ebrahimi 3216*62c56f98SSadaf Ebrahimi mbedtls_test_init_handshake_options(&server_options); 3217*62c56f98SSadaf Ebrahimi server_options.pk_alg = MBEDTLS_PK_ECDSA; 3218*62c56f98SSadaf Ebrahimi ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER, 3219*62c56f98SSadaf Ebrahimi &server_options, NULL, NULL, NULL, 3220*62c56f98SSadaf Ebrahimi NULL); 3221*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3222*62c56f98SSadaf Ebrahimi 3223*62c56f98SSadaf Ebrahimi ret = mbedtls_test_mock_socket_connect(&(client_ep.socket), 3224*62c56f98SSadaf Ebrahimi &(server_ep.socket), 1024); 3225*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3226*62c56f98SSadaf Ebrahimi 3227*62c56f98SSadaf Ebrahimi while (1) { 3228*62c56f98SSadaf Ebrahimi mbedtls_test_set_step(++step); 3229*62c56f98SSadaf Ebrahimi 3230*62c56f98SSadaf Ebrahimi ret = mbedtls_test_move_handshake_to_state( 3231*62c56f98SSadaf Ebrahimi &(server_ep.ssl), &(client_ep.ssl), 3232*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CERTIFICATE_VERIFY); 3233*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3234*62c56f98SSadaf Ebrahimi 3235*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_flush_output(&(server_ep.ssl)); 3236*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3237*62c56f98SSadaf Ebrahimi 3238*62c56f98SSadaf Ebrahimi ret = mbedtls_test_move_handshake_to_state( 3239*62c56f98SSadaf Ebrahimi &(client_ep.ssl), &(server_ep.ssl), 3240*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_SERVER_CERTIFICATE); 3241*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3242*62c56f98SSadaf Ebrahimi 3243*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_fetch_handshake_msg(&(client_ep.ssl), 3244*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_HS_CERTIFICATE, 3245*62c56f98SSadaf Ebrahimi &buf, &buf_len); 3246*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3247*62c56f98SSadaf Ebrahimi 3248*62c56f98SSadaf Ebrahimi end = buf + buf_len; 3249*62c56f98SSadaf Ebrahimi 3250*62c56f98SSadaf Ebrahimi /* 3251*62c56f98SSadaf Ebrahimi * Tweak server Certificate message and parse it. 3252*62c56f98SSadaf Ebrahimi */ 3253*62c56f98SSadaf Ebrahimi 3254*62c56f98SSadaf Ebrahimi ret = mbedtls_test_tweak_tls13_certificate_msg_vector_len( 3255*62c56f98SSadaf Ebrahimi buf, &end, step, &expected_result, &expected_chk_buf_ptr_args); 3256*62c56f98SSadaf Ebrahimi 3257*62c56f98SSadaf Ebrahimi if (ret != 0) { 3258*62c56f98SSadaf Ebrahimi break; 3259*62c56f98SSadaf Ebrahimi } 3260*62c56f98SSadaf Ebrahimi 3261*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_parse_certificate(&(client_ep.ssl), buf, end); 3262*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, expected_result); 3263*62c56f98SSadaf Ebrahimi 3264*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_ssl_cmp_chk_buf_ptr_fail_args( 3265*62c56f98SSadaf Ebrahimi &expected_chk_buf_ptr_args) == 0); 3266*62c56f98SSadaf Ebrahimi 3267*62c56f98SSadaf Ebrahimi mbedtls_ssl_reset_chk_buf_ptr_fail_args(); 3268*62c56f98SSadaf Ebrahimi 3269*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_session_reset(&(client_ep.ssl)); 3270*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3271*62c56f98SSadaf Ebrahimi 3272*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_session_reset(&(server_ep.ssl)); 3273*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, 0); 3274*62c56f98SSadaf Ebrahimi } 3275*62c56f98SSadaf Ebrahimi 3276*62c56f98SSadaf Ebrahimiexit: 3277*62c56f98SSadaf Ebrahimi mbedtls_ssl_reset_chk_buf_ptr_fail_args(); 3278*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&client_ep, NULL); 3279*62c56f98SSadaf Ebrahimi mbedtls_test_ssl_endpoint_free(&server_ep, NULL); 3280*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&client_options); 3281*62c56f98SSadaf Ebrahimi mbedtls_test_free_handshake_options(&server_options); 3282*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 3283*62c56f98SSadaf Ebrahimi} 3284*62c56f98SSadaf Ebrahimi/* END_CASE */ 3285*62c56f98SSadaf Ebrahimi 3286*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 3287*62c56f98SSadaf Ebrahimivoid ssl_ecjpake_set_password(int use_opaque_arg) 3288*62c56f98SSadaf Ebrahimi{ 3289*62c56f98SSadaf Ebrahimi mbedtls_ssl_context ssl; 3290*62c56f98SSadaf Ebrahimi mbedtls_ssl_config conf; 3291*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO) 3292*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t pwd_slot = MBEDTLS_SVC_KEY_ID_INIT; 3293*62c56f98SSadaf Ebrahimi#else /* MBEDTLS_USE_PSA_CRYPTO */ 3294*62c56f98SSadaf Ebrahimi (void) use_opaque_arg; 3295*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */ 3296*62c56f98SSadaf Ebrahimi unsigned char pwd_string[sizeof(ECJPAKE_TEST_PWD)] = ""; 3297*62c56f98SSadaf Ebrahimi size_t pwd_len = 0; 3298*62c56f98SSadaf Ebrahimi int ret; 3299*62c56f98SSadaf Ebrahimi 3300*62c56f98SSadaf Ebrahimi mbedtls_ssl_init(&ssl); 3301*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 3302*62c56f98SSadaf Ebrahimi 3303*62c56f98SSadaf Ebrahimi /* test with uninitalized SSL context */ 3304*62c56f98SSadaf Ebrahimi ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3305*62c56f98SSadaf Ebrahimi 3306*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_init(&conf); 3307*62c56f98SSadaf Ebrahimi 3308*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, 3309*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_CLIENT, 3310*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TRANSPORT_STREAM, 3311*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRESET_DEFAULT), 0); 3312*62c56f98SSadaf Ebrahimi 3313*62c56f98SSadaf Ebrahimi TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0); 3314*62c56f98SSadaf Ebrahimi 3315*62c56f98SSadaf Ebrahimi /* test with empty password or unitialized password key (depending on use_opaque_arg) */ 3316*62c56f98SSadaf Ebrahimi ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA); 3317*62c56f98SSadaf Ebrahimi 3318*62c56f98SSadaf Ebrahimi pwd_len = strlen(ECJPAKE_TEST_PWD); 3319*62c56f98SSadaf Ebrahimi memcpy(pwd_string, ECJPAKE_TEST_PWD, pwd_len); 3320*62c56f98SSadaf Ebrahimi 3321*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO) 3322*62c56f98SSadaf Ebrahimi if (use_opaque_arg) { 3323*62c56f98SSadaf Ebrahimi psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; 3324*62c56f98SSadaf Ebrahimi psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT; 3325*62c56f98SSadaf Ebrahimi 3326*62c56f98SSadaf Ebrahimi /* First try with an invalid usage */ 3327*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH); 3328*62c56f98SSadaf Ebrahimi psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE); 3329*62c56f98SSadaf Ebrahimi psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD); 3330*62c56f98SSadaf Ebrahimi 3331*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_import_key(&attributes, pwd_string, 3332*62c56f98SSadaf Ebrahimi pwd_len, &pwd_slot)); 3333*62c56f98SSadaf Ebrahimi 3334*62c56f98SSadaf Ebrahimi ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED); 3335*62c56f98SSadaf Ebrahimi 3336*62c56f98SSadaf Ebrahimi /* check that the opaque key is still valid after failure */ 3337*62c56f98SSadaf Ebrahimi TEST_EQUAL(psa_get_key_attributes(pwd_slot, &check_attributes), 3338*62c56f98SSadaf Ebrahimi PSA_SUCCESS); 3339*62c56f98SSadaf Ebrahimi 3340*62c56f98SSadaf Ebrahimi psa_destroy_key(pwd_slot); 3341*62c56f98SSadaf Ebrahimi 3342*62c56f98SSadaf Ebrahimi /* Then set the correct usage */ 3343*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE); 3344*62c56f98SSadaf Ebrahimi 3345*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_import_key(&attributes, pwd_string, 3346*62c56f98SSadaf Ebrahimi pwd_len, &pwd_slot)); 3347*62c56f98SSadaf Ebrahimi } 3348*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */ 3349*62c56f98SSadaf Ebrahimi 3350*62c56f98SSadaf Ebrahimi /* final check which should work without errors */ 3351*62c56f98SSadaf Ebrahimi ECJPAKE_TEST_SET_PASSWORD(0); 3352*62c56f98SSadaf Ebrahimi 3353*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO) 3354*62c56f98SSadaf Ebrahimi if (use_opaque_arg) { 3355*62c56f98SSadaf Ebrahimi psa_destroy_key(pwd_slot); 3356*62c56f98SSadaf Ebrahimi } 3357*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */ 3358*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(&ssl); 3359*62c56f98SSadaf Ebrahimi mbedtls_ssl_config_free(&conf); 3360*62c56f98SSadaf Ebrahimi 3361*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 3362*62c56f98SSadaf Ebrahimi} 3363*62c56f98SSadaf Ebrahimi/* END_CASE */ 3364*62c56f98SSadaf Ebrahimi 3365*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 3366*62c56f98SSadaf Ebrahimivoid elliptic_curve_get_properties() 3367*62c56f98SSadaf Ebrahimi{ 3368*62c56f98SSadaf Ebrahimi psa_key_type_t psa_type = PSA_KEY_TYPE_NONE; 3369*62c56f98SSadaf Ebrahimi size_t psa_bits; 3370*62c56f98SSadaf Ebrahimi 3371*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_INIT(); 3372*62c56f98SSadaf Ebrahimi 3373*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP521R1) || defined(PSA_WANT_ECC_SECP_R1_521) 3374*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521); 3375*62c56f98SSadaf Ebrahimi#else 3376*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521); 3377*62c56f98SSadaf Ebrahimi#endif 3378*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_BP512R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) 3379*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512); 3380*62c56f98SSadaf Ebrahimi#else 3381*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512); 3382*62c56f98SSadaf Ebrahimi#endif 3383*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP384R1) || defined(PSA_WANT_ECC_SECP_R1_384) 3384*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384); 3385*62c56f98SSadaf Ebrahimi#else 3386*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384); 3387*62c56f98SSadaf Ebrahimi#endif 3388*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_BP384R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) 3389*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384); 3390*62c56f98SSadaf Ebrahimi#else 3391*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384); 3392*62c56f98SSadaf Ebrahimi#endif 3393*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP256R1) || defined(PSA_WANT_ECC_SECP_R1_256) 3394*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256); 3395*62c56f98SSadaf Ebrahimi#else 3396*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256); 3397*62c56f98SSadaf Ebrahimi#endif 3398*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP256K1) || defined(PSA_WANT_ECC_SECP_K1_256) 3399*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256); 3400*62c56f98SSadaf Ebrahimi#else 3401*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256); 3402*62c56f98SSadaf Ebrahimi#endif 3403*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_BP256R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) 3404*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256); 3405*62c56f98SSadaf Ebrahimi#else 3406*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256); 3407*62c56f98SSadaf Ebrahimi#endif 3408*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP224R1) || defined(PSA_WANT_ECC_SECP_R1_224) 3409*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224); 3410*62c56f98SSadaf Ebrahimi#else 3411*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224); 3412*62c56f98SSadaf Ebrahimi#endif 3413*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP224K1) || defined(PSA_WANT_ECC_SECP_K1_224) 3414*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224); 3415*62c56f98SSadaf Ebrahimi#else 3416*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224); 3417*62c56f98SSadaf Ebrahimi#endif 3418*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP192R1) || defined(PSA_WANT_ECC_SECP_R1_192) 3419*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192); 3420*62c56f98SSadaf Ebrahimi#else 3421*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192); 3422*62c56f98SSadaf Ebrahimi#endif 3423*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_SECP192K1) || defined(PSA_WANT_ECC_SECP_K1_192) 3424*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192); 3425*62c56f98SSadaf Ebrahimi#else 3426*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192); 3427*62c56f98SSadaf Ebrahimi#endif 3428*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_CURVE25519) || defined(PSA_WANT_ECC_MONTGOMERY_255) 3429*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255); 3430*62c56f98SSadaf Ebrahimi#else 3431*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255); 3432*62c56f98SSadaf Ebrahimi#endif 3433*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_HAVE_CURVE448) || defined(PSA_WANT_ECC_MONTGOMERY_448) 3434*62c56f98SSadaf Ebrahimi TEST_AVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448); 3435*62c56f98SSadaf Ebrahimi#else 3436*62c56f98SSadaf Ebrahimi TEST_UNAVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448); 3437*62c56f98SSadaf Ebrahimi#endif 3438*62c56f98SSadaf Ebrahimi goto exit; 3439*62c56f98SSadaf Ebrahimiexit: 3440*62c56f98SSadaf Ebrahimi MD_OR_USE_PSA_DONE(); 3441*62c56f98SSadaf Ebrahimi} 3442*62c56f98SSadaf Ebrahimi/* END_CASE */ 3443