xref: /aosp_15_r20/external/mbedtls/tests/suites/test_suite_ssl.function (revision 62c56f9862f102b96d72393aff6076c951fb8148)
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