blob: 99fbef3e873bdba57bcd4a65eefd6eade52da930 [file] [log] [blame]
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001/* BEGIN_HEADER */
Chris Jones84a773f2021-03-05 18:38:47 +00002#include <ssl_misc.h>
Andrzej Kurek941962e2020-02-07 09:20:32 -05003#include <mbedtls/timing.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004#include <mbedtls/debug.h>
Valerio Setti1b08d422023-02-13 11:33:26 +01005#include <mbedtls/pk.h>
Hanno Becker73c825a2020-09-08 10:52:58 +01006#include <ssl_tls13_keys.h>
Gabor Mezeib35759d2022-02-09 16:59:11 +01007#include <ssl_tls13_invasive.h>
Yanray Wang47907a42022-10-24 14:42:01 +08008#include <test/ssl_helpers.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +01009
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020010#include <constant_time_internal.h>
Manuel Pégourié-Gonnard9670a592020-07-10 10:21:46 +020011#include <test/constant_flow.h>
12
Valerio Setti7c0f91b2023-04-28 12:20:34 +020013#define SSL_MESSAGE_QUEUE_INIT { NULL, 0, 0, 0 }
14
Ronald Cron33327da2024-02-05 17:46:41 +010015/* Mnemonics for the early data test scenarios */
Ronald Cron5c208d72024-01-24 10:13:30 +010016#define TEST_EARLY_DATA_ACCEPTED 0
Ronald Cron265273e2024-01-24 11:13:19 +010017#define TEST_EARLY_DATA_NO_INDICATION_SENT 1
Ronald Crond6dba672024-01-24 12:22:24 +010018#define TEST_EARLY_DATA_SERVER_REJECTS 2
Ronald Cron2261ab22024-01-24 13:38:31 +010019#define TEST_EARLY_DATA_HRR 3
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +000020#define TEST_EARLY_DATA_SAME_ALPN 4
21#define TEST_EARLY_DATA_DIFF_ALPN 5
22#define TEST_EARLY_DATA_NO_INITIAL_ALPN 6
23#define TEST_EARLY_DATA_NO_LATER_ALPN 7
Ronald Cron33327da2024-02-05 17:46:41 +010024
Ronald Cronae2d81c2024-01-22 09:13:41 +010025#if (!defined(MBEDTLS_SSL_PROTO_TLS1_2)) && \
26 defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_CLI_C) && \
Ronald Crona8dd81b2024-01-16 17:50:52 +010027 defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_DEBUG_C) && \
28 defined(MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE) && \
29 defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) && \
30 defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED) && \
31 defined(MBEDTLS_MD_CAN_SHA256) && \
32 defined(MBEDTLS_ECP_HAVE_SECP256R1) && defined(MBEDTLS_ECP_HAVE_SECP384R1) && \
33 defined(MBEDTLS_PK_CAN_ECDSA_VERIFY) && defined(MBEDTLS_SSL_SESSION_TICKETS)
34/*
Ronald Cronfcbf7762024-03-01 10:00:42 +010035 * Test function to write early data for negative tests where
36 * mbedtls_ssl_write_early_data() cannot be used.
Ronald Crona8dd81b2024-01-16 17:50:52 +010037 */
38static int write_early_data(mbedtls_ssl_context *ssl,
39 unsigned char *buf, size_t len)
40{
41 int ret = mbedtls_ssl_get_max_out_record_payload(ssl);
42
43 TEST_ASSERT(ret > 0);
Ronald Cron4facb0a2024-03-08 11:40:07 +010044 TEST_LE_U(len, (size_t) ret);
Ronald Crona8dd81b2024-01-16 17:50:52 +010045
46 ret = mbedtls_ssl_flush_output(ssl);
47 TEST_EQUAL(ret, 0);
48 TEST_EQUAL(ssl->out_left, 0);
49
50 ssl->out_msglen = len;
51 ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA;
52 if (len > 0) {
53 memcpy(ssl->out_msg, buf, len);
54 }
55
56 ret = mbedtls_ssl_write_record(ssl, 1);
57 TEST_EQUAL(ret, 0);
58
59 ret = len;
60
61exit:
62 return ret;
63}
64#endif
65
Gilles Peskine39bcbb62025-03-07 20:40:50 +010066typedef enum {
67 RECOMBINE_NOMINAL, /* param: ignored */
68 RECOMBINE_COALESCE, /* param: min number of records */
69} recombine_records_instruction_t;
70
71/* Coalesce TLS handshake records.
72 * DTLS is not supported.
73 * Encrypted or authenticated handshake records are not supported.
74 * Assume the buffer content is a valid sequence of records.
75 */
76static int recombine_coalesce_handshake_records(mbedtls_test_ssl_buffer *buf,
77 int max)
78{
79 const size_t header_length = 5;
80 TEST_LE_U(header_length, buf->content_length);
81 if (buf->buffer[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
82 return 0;
83 }
84
85 size_t record_length = MBEDTLS_GET_UINT16_BE(buf->buffer, header_length - 2);
86 TEST_LE_U(header_length + record_length, buf->content_length);
87
88 int count;
89 for (count = 1; count < max; count++) {
90 size_t next_start = header_length + record_length;
91 if (next_start >= buf->content_length) {
92 /* We've already reached the last record. */
93 break;
94 }
95
96 TEST_LE_U(next_start + header_length, buf->content_length);
97 if (buf->buffer[next_start] != MBEDTLS_SSL_MSG_HANDSHAKE) {
98 /* There's another record, but it isn't a handshake record. */
99 break;
100 }
101 size_t next_length =
102 MBEDTLS_GET_UINT16_BE(buf->buffer, next_start + header_length - 2);
103 TEST_LE_U(next_start + header_length + next_length, buf->content_length);
104
105 /* Erase the next record header */
106 memmove(buf->buffer + next_start,
107 buf->buffer + next_start + header_length,
108 buf->content_length - next_start);
109 buf->content_length -= header_length;
110 /* Update the first record length */
111 record_length += next_length;
112 TEST_LE_U(record_length, 0xffff);
113 MBEDTLS_PUT_UINT16_BE(record_length, buf->buffer, header_length - 2);
114 }
115
116 return count;
117
118exit:
119 return -1;
120}
121
122static int recombine_records(mbedtls_test_ssl_endpoint *server,
123 recombine_records_instruction_t instruction,
124 int param)
125{
126 mbedtls_test_ssl_buffer *buf = server->socket.output;
127 int ret;
128
129 /* buf is a circular buffer. For simplicity, this code assumes that
130 * the data is located at the beginning. This should be ok since
131 * this function is only meant to be used on the first flight
132 * emitted by a server. */
133 TEST_EQUAL(buf->start, 0);
134
135 switch (instruction) {
136 case RECOMBINE_NOMINAL:
137 break;
138
139 case RECOMBINE_COALESCE:
140 ret = recombine_coalesce_handshake_records(buf, param);
141 if (param == INT_MAX) {
142 TEST_LE_S(1, ret);
143 } else {
144 TEST_EQUAL(ret, param);
145 }
146 break;
147
148 default:
149 TEST_FAIL("Instructions not understood");
150 }
151
152 return 1;
153
154exit:
155 return 0;
156}
157
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +0200158/* END_HEADER */
159
160/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200161 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +0200162 * END_DEPENDENCIES
163 */
164
Janos Follath6264e662019-11-26 11:11:15 +0000165/* BEGIN_CASE */
166void test_callback_buffer_sanity()
167{
168 enum { MSGLEN = 10 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800169 mbedtls_test_ssl_buffer buf;
Gilles Peskine21e46b32023-10-17 16:35:20 +0200170 mbedtls_test_ssl_buffer_init(&buf);
Janos Follath6264e662019-11-26 11:11:15 +0000171 unsigned char input[MSGLEN];
172 unsigned char output[MSGLEN];
173
Valerio Setti285dae82023-04-19 15:10:45 +0200174 USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +0100175 memset(input, 0, sizeof(input));
Janos Follath6264e662019-11-26 11:11:15 +0000176
177 /* Make sure calling put and get on NULL buffer results in error. */
Yanray Wangf7b62352022-10-26 11:51:53 +0800178 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, input, sizeof(input))
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 == -1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800180 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, output, sizeof(output))
Gilles Peskine449bd832023-01-11 14:50:10 +0100181 == -1);
Yanray Wangbd296832022-10-26 18:28:11 +0800182 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, sizeof(input))
183 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -0500184
Yanray Wangf7b62352022-10-26 11:51:53 +0800185 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, 0) == -1);
186 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +0000187
188 /* Make sure calling put and get on a buffer that hasn't been set up results
Shaun Case8b0ecbc2021-12-20 21:14:10 -0800189 * in error. */
Yanray Wangbd296832022-10-26 18:28:11 +0800190 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
191 == -1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800192 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, sizeof(output))
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 == -1);
Yanray Wangbd296832022-10-26 18:28:11 +0800194 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
195 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -0500196
Yanray Wangf7b62352022-10-26 11:51:53 +0800197 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == -1);
198 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +0000199
Andrzej Kurekf7774142020-01-22 06:34:59 -0500200 /* Make sure calling put and get on NULL input only results in
201 * error if the length is not zero, and that a NULL output is valid for data
202 * dropping.
203 */
Janos Follath6264e662019-11-26 11:11:15 +0000204
Yanray Wangf7b62352022-10-26 11:51:53 +0800205 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, sizeof(input)) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000206
Yanray Wangbd296832022-10-26 18:28:11 +0800207 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
208 == -1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800209 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, sizeof(output))
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 == 0);
Yanray Wangf7b62352022-10-26 11:51:53 +0800211 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == 0);
212 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000213
Piotr Nowickifb437d72020-01-13 16:59:12 +0100214 /* Make sure calling put several times in the row is safe */
215
Yanray Wangf7b62352022-10-26 11:51:53 +0800216 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
Gilles Peskine449bd832023-01-11 14:50:10 +0100217 == sizeof(input));
Yanray Wangf7b62352022-10-26 11:51:53 +0800218 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, 2) == 2);
219 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 1) == 1);
220 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 1);
221 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 0);
Piotr Nowickifb437d72020-01-13 16:59:12 +0100222
223
Janos Follath6264e662019-11-26 11:11:15 +0000224exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800225 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti285dae82023-04-19 15:10:45 +0200226 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +0000227}
228/* END_CASE */
229
230/*
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800231 * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is
Janos Follath6264e662019-11-26 11:11:15 +0000232 * correct and works as expected.
233 *
234 * That is
235 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
236 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
237 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
238 * bytes.
239 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
240 * - All of the bytes we got match the bytes we put in in a FIFO manner.
241 */
242
243/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100244void test_callback_buffer(int size, int put1, int put1_ret,
245 int get1, int get1_ret, int put2, int put2_ret,
246 int get2, int get2_ret)
Janos Follath6264e662019-11-26 11:11:15 +0000247{
248 enum { ROUNDS = 2 };
249 size_t put[ROUNDS];
250 int put_ret[ROUNDS];
251 size_t get[ROUNDS];
252 int get_ret[ROUNDS];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800253 mbedtls_test_ssl_buffer buf;
Gilles Peskine449bd832023-01-11 14:50:10 +0100254 unsigned char *input = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000255 size_t input_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 unsigned char *output = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000257 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +0000258 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +0000259
Yanray Wangf7b62352022-10-26 11:51:53 +0800260 mbedtls_test_ssl_buffer_init(&buf);
Valerio Setti00a256f2023-04-27 17:22:27 +0200261 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800262 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, size) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000263
264 /* Check the sanity of input parameters and initialise local variables. That
265 * is, ensure that the amount of data is not negative and that we are not
266 * expecting more to put or get than we actually asked for. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 TEST_ASSERT(put1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000268 put[0] = put1;
269 put_ret[0] = put1_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 TEST_ASSERT(put1_ret <= put1);
271 TEST_ASSERT(put2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000272 put[1] = put2;
273 put_ret[1] = put2_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 TEST_ASSERT(put2_ret <= put2);
Janos Follath6264e662019-11-26 11:11:15 +0000275
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 TEST_ASSERT(get1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000277 get[0] = get1;
278 get_ret[0] = get1_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 TEST_ASSERT(get1_ret <= get1);
280 TEST_ASSERT(get2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000281 get[1] = get2;
282 get_ret[1] = get2_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100283 TEST_ASSERT(get2_ret <= get2);
Janos Follath6264e662019-11-26 11:11:15 +0000284
285 input_len = 0;
286 /* Calculate actual input and output lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 for (j = 0; j < ROUNDS; j++) {
288 if (put_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000289 input_len += put_ret[j];
290 }
291 }
292 /* In order to always have a valid pointer we always allocate at least 1
293 * byte. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 if (input_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000295 input_len = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 }
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100297 TEST_CALLOC(input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000298
299 output_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 for (j = 0; j < ROUNDS; j++) {
301 if (get_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000302 output_len += get_ret[j];
303 }
304 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 TEST_ASSERT(output_len <= input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000306 /* In order to always have a valid pointer we always allocate at least 1
307 * byte. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 if (output_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000309 output_len = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100310 }
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100311 TEST_CALLOC(output, output_len);
Janos Follath6264e662019-11-26 11:11:15 +0000312
313 /* Fill up the buffer with structured data so that unwanted changes
314 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 for (i = 0; i < input_len; i++) {
Janos Follath6264e662019-11-26 11:11:15 +0000316 input[i] = i & 0xFF;
317 }
318
319 written = read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 for (j = 0; j < ROUNDS; j++) {
Yanray Wangf7b62352022-10-26 11:51:53 +0800321 TEST_ASSERT(put_ret[j] == mbedtls_test_ssl_buffer_put(&buf,
322 input + written, put[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000323 written += put_ret[j];
Yanray Wangf7b62352022-10-26 11:51:53 +0800324 TEST_ASSERT(get_ret[j] == mbedtls_test_ssl_buffer_get(&buf,
325 output + read, get[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000326 read += get_ret[j];
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 TEST_ASSERT(read <= written);
328 if (get_ret[j] > 0) {
329 TEST_ASSERT(memcmp(output + read - get_ret[j],
330 input + read - get_ret[j], get_ret[j])
331 == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000332 }
333 }
334
335exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100336 mbedtls_free(input);
337 mbedtls_free(output);
Yanray Wangf7b62352022-10-26 11:51:53 +0800338 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti285dae82023-04-19 15:10:45 +0200339 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +0000340}
341/* END_CASE */
342
Janos Follath031827f2019-11-27 11:12:14 +0000343/*
Yanray Wangbd296832022-10-26 18:28:11 +0800344 * Test if the implementation of `mbedtls_test_mock_socket` related
345 * I/O functions is correct and works as expected on unconnected sockets.
Janos Follathc673c2c2019-12-02 15:47:26 +0000346 */
347
348/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100349void ssl_mock_sanity()
Janos Follathc673c2c2019-12-02 15:47:26 +0000350{
351 enum { MSGLEN = 105 };
Paul Elliott21c8fe52021-11-24 16:54:26 +0000352 unsigned char message[MSGLEN] = { 0 };
353 unsigned char received[MSGLEN] = { 0 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800354 mbedtls_test_mock_socket socket;
Janos Follathc673c2c2019-12-02 15:47:26 +0000355
Yanray Wang5f86a422023-03-15 16:02:29 +0800356 mbedtls_test_mock_socket_init(&socket);
Valerio Setti00a256f2023-04-27 17:22:27 +0200357 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800358 TEST_ASSERT(mbedtls_test_mock_tcp_send_b(&socket, message, MSGLEN) < 0);
359 mbedtls_test_mock_socket_close(&socket);
Yanray Wang5f86a422023-03-15 16:02:29 +0800360 mbedtls_test_mock_socket_init(&socket);
Yanray Wangf7b62352022-10-26 11:51:53 +0800361 TEST_ASSERT(mbedtls_test_mock_tcp_recv_b(&socket, received, MSGLEN) < 0);
362 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000363
Yanray Wang5f86a422023-03-15 16:02:29 +0800364 mbedtls_test_mock_socket_init(&socket);
Yanray Wangf7b62352022-10-26 11:51:53 +0800365 TEST_ASSERT(mbedtls_test_mock_tcp_send_nb(&socket, message, MSGLEN) < 0);
366 mbedtls_test_mock_socket_close(&socket);
Yanray Wang5f86a422023-03-15 16:02:29 +0800367 mbedtls_test_mock_socket_init(&socket);
Yanray Wangf7b62352022-10-26 11:51:53 +0800368 TEST_ASSERT(mbedtls_test_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0);
369 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000370
371exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800372 mbedtls_test_mock_socket_close(&socket);
Valerio Setti285dae82023-04-19 15:10:45 +0200373 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000374}
375/* END_CASE */
376
377/*
Yanray Wangbd296832022-10-26 18:28:11 +0800378 * Test if the implementation of `mbedtls_test_mock_socket` related functions
379 * can send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +0000380 */
381
382/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100383void ssl_mock_tcp(int blocking)
Janos Follath031827f2019-11-27 11:12:14 +0000384{
Janos Follathc673c2c2019-12-02 15:47:26 +0000385 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100386 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +0000387 unsigned char message[MSGLEN];
388 unsigned char received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800389 mbedtls_test_mock_socket client;
390 mbedtls_test_mock_socket server;
Janos Follathc673c2c2019-12-02 15:47:26 +0000391 size_t written, read;
392 int send_ret, recv_ret;
393 mbedtls_ssl_send_t *send;
394 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +0000395 unsigned i;
396
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 if (blocking == 0) {
Yanray Wangf7b62352022-10-26 11:51:53 +0800398 send = mbedtls_test_mock_tcp_send_nb;
399 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine449bd832023-01-11 14:50:10 +0100400 } else {
Yanray Wangf7b62352022-10-26 11:51:53 +0800401 send = mbedtls_test_mock_tcp_send_b;
402 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follathc673c2c2019-12-02 15:47:26 +0000403 }
404
Yanray Wang5f86a422023-03-15 16:02:29 +0800405 mbedtls_test_mock_socket_init(&client);
406 mbedtls_test_mock_socket_init(&server);
Valerio Setti00a256f2023-04-27 17:22:27 +0200407 USE_PSA_INIT();
Janos Follathc673c2c2019-12-02 15:47:26 +0000408
409 /* Fill up the buffer with structured data so that unwanted changes
410 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 for (i = 0; i < MSGLEN; i++) {
Janos Follathc673c2c2019-12-02 15:47:26 +0000412 message[i] = i & 0xFF;
413 }
414
415 /* Make sure that sending a message takes a few iterations. */
Yanray Wangbd296832022-10-26 18:28:11 +0800416 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
417 BUFLEN));
Janos Follathc673c2c2019-12-02 15:47:26 +0000418
419 /* Send the message to the server */
420 send_ret = recv_ret = 1;
421 written = read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 while (send_ret != 0 || recv_ret != 0) {
423 send_ret = send(&client, message + written, MSGLEN - written);
Janos Follathc673c2c2019-12-02 15:47:26 +0000424
Gilles Peskine449bd832023-01-11 14:50:10 +0100425 TEST_ASSERT(send_ret >= 0);
426 TEST_ASSERT(send_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100427 written += send_ret;
428
429 /* If the buffer is full we can test blocking and non-blocking send */
Gilles Peskine449bd832023-01-11 14:50:10 +0100430 if (send_ret == BUFLEN) {
431 int blocking_ret = send(&client, message, 1);
432 if (blocking) {
433 TEST_ASSERT(blocking_ret == 0);
434 } else {
435 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100436 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000437 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000438
Gilles Peskine449bd832023-01-11 14:50:10 +0100439 recv_ret = recv(&server, received + read, MSGLEN - read);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100440
441 /* The result depends on whether any data was sent */
Gilles Peskine449bd832023-01-11 14:50:10 +0100442 if (send_ret > 0) {
443 TEST_ASSERT(recv_ret > 0);
444 TEST_ASSERT(recv_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100445 read += recv_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100446 } else if (blocking) {
447 TEST_ASSERT(recv_ret == 0);
448 } else {
449 TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100450 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +0000451 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100452
453 /* If the buffer is empty we can test blocking and non-blocking read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100454 if (recv_ret == BUFLEN) {
455 int blocking_ret = recv(&server, received, 1);
456 if (blocking) {
457 TEST_ASSERT(blocking_ret == 0);
458 } else {
459 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100460 }
461 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000462 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100463 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Janos Follathc673c2c2019-12-02 15:47:26 +0000464
465exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800466 mbedtls_test_mock_socket_close(&client);
467 mbedtls_test_mock_socket_close(&server);
Valerio Setti285dae82023-04-19 15:10:45 +0200468 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000469}
470/* END_CASE */
471
472/*
Yanray Wangbd296832022-10-26 18:28:11 +0800473 * Test if the implementation of `mbedtls_test_mock_socket` related functions
474 * can send messages in both direction at the same time (with the I/O calls
Janos Follathc673c2c2019-12-02 15:47:26 +0000475 * interleaving).
476 */
477
478/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100479void ssl_mock_tcp_interleaving(int blocking)
Janos Follathc673c2c2019-12-02 15:47:26 +0000480{
Janos Follath031827f2019-11-27 11:12:14 +0000481 enum { ROUNDS = 2 };
482 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100483 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +0000484 unsigned char message[ROUNDS][MSGLEN];
485 unsigned char received[ROUNDS][MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800486 mbedtls_test_mock_socket client;
487 mbedtls_test_mock_socket server;
Janos Follath031827f2019-11-27 11:12:14 +0000488 size_t written[ROUNDS];
489 size_t read[ROUNDS];
490 int send_ret[ROUNDS];
491 int recv_ret[ROUNDS];
492 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +0000493 mbedtls_ssl_send_t *send;
494 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +0000495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496 if (blocking == 0) {
Yanray Wangf7b62352022-10-26 11:51:53 +0800497 send = mbedtls_test_mock_tcp_send_nb;
498 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine449bd832023-01-11 14:50:10 +0100499 } else {
Yanray Wangf7b62352022-10-26 11:51:53 +0800500 send = mbedtls_test_mock_tcp_send_b;
501 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follath3766ba52019-11-27 13:31:42 +0000502 }
Janos Follath031827f2019-11-27 11:12:14 +0000503
Yanray Wang5f86a422023-03-15 16:02:29 +0800504 mbedtls_test_mock_socket_init(&client);
505 mbedtls_test_mock_socket_init(&server);
Valerio Setti00a256f2023-04-27 17:22:27 +0200506 USE_PSA_INIT();
Janos Follath031827f2019-11-27 11:12:14 +0000507
508 /* Fill up the buffers with structured data so that unwanted changes
509 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100510 for (i = 0; i < ROUNDS; i++) {
511 for (j = 0; j < MSGLEN; j++) {
512 message[i][j] = (i * MSGLEN + j) & 0xFF;
Janos Follath031827f2019-11-27 11:12:14 +0000513 }
514 }
515
Janos Follath031827f2019-11-27 11:12:14 +0000516 /* Make sure that sending a message takes a few iterations. */
Yanray Wangbd296832022-10-26 18:28:11 +0800517 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
518 BUFLEN));
Janos Follath031827f2019-11-27 11:12:14 +0000519
Janos Follath031827f2019-11-27 11:12:14 +0000520 /* Send the message from both sides, interleaving. */
521 progress = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100522 for (i = 0; i < ROUNDS; i++) {
Janos Follath031827f2019-11-27 11:12:14 +0000523 written[i] = 0;
524 read[i] = 0;
525 }
526 /* This loop does not stop as long as there was a successful write or read
527 * of at least one byte on either side. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100528 while (progress != 0) {
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800529 mbedtls_test_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +0000530
Gilles Peskine449bd832023-01-11 14:50:10 +0100531 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100532 /* First sending is from the client */
Gilles Peskine449bd832023-01-11 14:50:10 +0100533 socket = (i % 2 == 0) ? (&client) : (&server);
Janos Follath031827f2019-11-27 11:12:14 +0000534
Gilles Peskine449bd832023-01-11 14:50:10 +0100535 send_ret[i] = send(socket, message[i] + written[i],
536 MSGLEN - written[i]);
537 TEST_ASSERT(send_ret[i] >= 0);
538 TEST_ASSERT(send_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100539 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000540
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100541 /* If the buffer is full we can test blocking and non-blocking
542 * send */
Gilles Peskine449bd832023-01-11 14:50:10 +0100543 if (send_ret[i] == BUFLEN) {
544 int blocking_ret = send(socket, message[i], 1);
545 if (blocking) {
546 TEST_ASSERT(blocking_ret == 0);
547 } else {
548 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100549 }
550 }
Janos Follath3766ba52019-11-27 13:31:42 +0000551 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100552
Gilles Peskine449bd832023-01-11 14:50:10 +0100553 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100554 /* First receiving is from the server */
Gilles Peskine449bd832023-01-11 14:50:10 +0100555 socket = (i % 2 == 0) ? (&server) : (&client);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100556
Gilles Peskine449bd832023-01-11 14:50:10 +0100557 recv_ret[i] = recv(socket, received[i] + read[i],
558 MSGLEN - read[i]);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100559
560 /* The result depends on whether any data was sent */
Gilles Peskine449bd832023-01-11 14:50:10 +0100561 if (send_ret[i] > 0) {
562 TEST_ASSERT(recv_ret[i] > 0);
563 TEST_ASSERT(recv_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100564 read[i] += recv_ret[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100565 } else if (blocking) {
566 TEST_ASSERT(recv_ret[i] == 0);
567 } else {
568 TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100569 recv_ret[i] = 0;
570 }
571
572 /* If the buffer is empty we can test blocking and non-blocking
573 * read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 if (recv_ret[i] == BUFLEN) {
575 int blocking_ret = recv(socket, received[i], 1);
576 if (blocking) {
577 TEST_ASSERT(blocking_ret == 0);
578 } else {
579 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100580 }
581 }
Janos Follath3766ba52019-11-27 13:31:42 +0000582 }
Janos Follath031827f2019-11-27 11:12:14 +0000583
584 progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100586 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000587 }
588 }
589
Gilles Peskine449bd832023-01-11 14:50:10 +0100590 for (i = 0; i < ROUNDS; i++) {
591 TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0);
592 }
Janos Follath031827f2019-11-27 11:12:14 +0000593
594exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800595 mbedtls_test_mock_socket_close(&client);
596 mbedtls_test_mock_socket_close(&server);
Valerio Setti285dae82023-04-19 15:10:45 +0200597 USE_PSA_DONE();
Janos Follath031827f2019-11-27 11:12:14 +0000598}
599/* END_CASE */
600
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500601/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100602void ssl_message_queue_sanity()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500603{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200604 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500605
Valerio Setti285dae82023-04-19 15:10:45 +0200606 USE_PSA_INIT();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500607 /* Trying to push/pull to an empty queue */
Yanray Wangf7b62352022-10-26 11:51:53 +0800608 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(NULL, 1)
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 == MBEDTLS_TEST_ERROR_ARG_NULL);
Yanray Wangf7b62352022-10-26 11:51:53 +0800610 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(NULL, 1)
Gilles Peskine449bd832023-01-11 14:50:10 +0100611 == MBEDTLS_TEST_ERROR_ARG_NULL);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500612
Yanray Wangf7b62352022-10-26 11:51:53 +0800613 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 TEST_ASSERT(queue.capacity == 3);
615 TEST_ASSERT(queue.num == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500616
617exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800618 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200619 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500620}
621/* END_CASE */
622
623/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100624void ssl_message_queue_basic()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500625{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200626 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500627
Valerio Setti285dae82023-04-19 15:10:45 +0200628 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800629 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500630
631 /* Sanity test - 3 pushes and 3 pops with sufficient space */
Yanray Wangf7b62352022-10-26 11:51:53 +0800632 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine449bd832023-01-11 14:50:10 +0100633 TEST_ASSERT(queue.capacity == 3);
634 TEST_ASSERT(queue.num == 1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800635 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 TEST_ASSERT(queue.capacity == 3);
637 TEST_ASSERT(queue.num == 2);
Yanray Wangf7b62352022-10-26 11:51:53 +0800638 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
Gilles Peskine449bd832023-01-11 14:50:10 +0100639 TEST_ASSERT(queue.capacity == 3);
640 TEST_ASSERT(queue.num == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500641
Yanray Wangf7b62352022-10-26 11:51:53 +0800642 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
643 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
644 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500645
646exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800647 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200648 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500649}
650/* END_CASE */
651
652/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100653void ssl_message_queue_overflow_underflow()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500654{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200655 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500656
Valerio Setti285dae82023-04-19 15:10:45 +0200657 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800658 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500659
660 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
Yanray Wangf7b62352022-10-26 11:51:53 +0800661 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
662 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
663 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
664 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3)
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500666
Yanray Wangf7b62352022-10-26 11:51:53 +0800667 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
668 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
669 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500670
Yanray Wangf7b62352022-10-26 11:51:53 +0800671 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1)
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500673
674exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800675 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200676 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500677}
678/* END_CASE */
679
680/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100681void ssl_message_queue_interleaved()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500682{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200683 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500684
Valerio Setti285dae82023-04-19 15:10:45 +0200685 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800686 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500687
688 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
689 * (to wrap around the buffer) */
Yanray Wangf7b62352022-10-26 11:51:53 +0800690 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
691 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500692
Yanray Wangf7b62352022-10-26 11:51:53 +0800693 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500694
Yanray Wangf7b62352022-10-26 11:51:53 +0800695 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
696 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500697
Yanray Wangf7b62352022-10-26 11:51:53 +0800698 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
699 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500700
Yanray Wangf7b62352022-10-26 11:51:53 +0800701 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 5) == 5);
702 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500703
Yanray Wangf7b62352022-10-26 11:51:53 +0800704 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500705
Yanray Wangf7b62352022-10-26 11:51:53 +0800706 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 5) == 5);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500707
Yanray Wangf7b62352022-10-26 11:51:53 +0800708 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500709
710exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800711 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200712 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500713}
714/* END_CASE */
715
716/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100717void ssl_message_queue_insufficient_buffer()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500718{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200719 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500720 size_t message_len = 10;
721 size_t buffer_len = 5;
722
Valerio Setti285dae82023-04-19 15:10:45 +0200723 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800724 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 1) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500725
726 /* Popping without a sufficient buffer */
Yanray Wangf7b62352022-10-26 11:51:53 +0800727 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, message_len)
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 == (int) message_len);
Yanray Wangf7b62352022-10-26 11:51:53 +0800729 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, buffer_len)
Gilles Peskine449bd832023-01-11 14:50:10 +0100730 == (int) buffer_len);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500731exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800732 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200733 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500734}
735/* END_CASE */
736
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500737/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100738void ssl_message_mock_uninitialized()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500739{
740 enum { MSGLEN = 10 };
Gilles Peskine449bd832023-01-11 14:50:10 +0100741 unsigned char message[MSGLEN] = { 0 }, received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800742 mbedtls_test_mock_socket client, server;
743 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500744 mbedtls_test_message_socket_context server_context, client_context;
Yanray Wangf7b62352022-10-26 11:51:53 +0800745 mbedtls_test_message_socket_init(&server_context);
746 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500747
Valerio Setti285dae82023-04-19 15:10:45 +0200748 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500749 /* Send with a NULL context */
Yanray Wangf7b62352022-10-26 11:51:53 +0800750 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(NULL, message, MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100751 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500752
Yanray Wangf7b62352022-10-26 11:51:53 +0800753 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(NULL, message, MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100754 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500755
Yanray Wangbd296832022-10-26 18:28:11 +0800756 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
757 &client_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800758 &server,
759 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500760
Yanray Wangbd296832022-10-26 18:28:11 +0800761 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
762 &server_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800763 &client,
764 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500765
Yanray Wangbd296832022-10-26 18:28:11 +0800766 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
767 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100768 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500769
Yanray Wangbd296832022-10-26 18:28:11 +0800770 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
771 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100772 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500773
774 /* Push directly to a queue to later simulate a disconnected behavior */
Yanray Wangbd296832022-10-26 18:28:11 +0800775 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&server_queue,
776 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100777 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500778
779 /* Test if there's an error when trying to read from a disconnected
780 * socket */
Yanray Wangbd296832022-10-26 18:28:11 +0800781 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
782 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100783 == MBEDTLS_TEST_ERROR_RECV_FAILED);
784exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800785 mbedtls_test_message_socket_close(&server_context);
786 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +0200787 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500788}
789/* END_CASE */
790
791/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100792void ssl_message_mock_basic()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500793{
794 enum { MSGLEN = 10 };
795 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800796 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500797 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800798 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500799 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +0200800
Yanray Wangf7b62352022-10-26 11:51:53 +0800801 mbedtls_test_message_socket_init(&server_context);
802 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +0200803 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500804
Yanray Wangbd296832022-10-26 18:28:11 +0800805 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
806 &client_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800807 &server,
808 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500809
Yanray Wangbd296832022-10-26 18:28:11 +0800810 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
811 &server_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800812 &client,
813 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500814
815 /* Fill up the buffer with structured data so that unwanted changes
816 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100817 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500818 message[i] = i & 0xFF;
819 }
Yanray Wangf7b62352022-10-26 11:51:53 +0800820 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
821 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500822
823 /* Send the message to the server */
Yanray Wangf7b62352022-10-26 11:51:53 +0800824 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
825 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500826
827 /* Read from the server */
Yanray Wangbd296832022-10-26 18:28:11 +0800828 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
829 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100830 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500831
Gilles Peskine449bd832023-01-11 14:50:10 +0100832 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
833 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500834
835 /* Send the message to the client */
Yanray Wangf7b62352022-10-26 11:51:53 +0800836 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +0800837 MSGLEN)
838 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500839
840 /* Read from the client */
Yanray Wangbd296832022-10-26 18:28:11 +0800841 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
842 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100843 == MSGLEN);
844 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500845
Gilles Peskine449bd832023-01-11 14:50:10 +0100846exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800847 mbedtls_test_message_socket_close(&server_context);
848 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +0200849 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500850}
851/* END_CASE */
852
853/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100854void ssl_message_mock_queue_overflow_underflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500855{
856 enum { MSGLEN = 10 };
857 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800858 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500859 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800860 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500861 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +0200862
Yanray Wangf7b62352022-10-26 11:51:53 +0800863 mbedtls_test_message_socket_init(&server_context);
864 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +0200865 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500866
Yanray Wangbd296832022-10-26 18:28:11 +0800867 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
868 &client_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +0800869 &server,
870 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500871
Yanray Wangbd296832022-10-26 18:28:11 +0800872 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
873 &server_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +0800874 &client,
875 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500876
877 /* Fill up the buffer with structured data so that unwanted changes
878 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100879 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500880 message[i] = i & 0xFF;
881 }
Yanray Wangf7b62352022-10-26 11:51:53 +0800882 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
883 MSGLEN*2));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500884
885 /* Send three message to the server, last one with an error */
Yanray Wangf7b62352022-10-26 11:51:53 +0800886 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +0800887 MSGLEN - 1)
888 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500889
Yanray Wangf7b62352022-10-26 11:51:53 +0800890 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +0800891 MSGLEN)
892 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500893
Yanray Wangf7b62352022-10-26 11:51:53 +0800894 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
895 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500897
898 /* Read three messages from the server, last one with an error */
Yanray Wangf7b62352022-10-26 11:51:53 +0800899 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
Yanray Wangbd296832022-10-26 18:28:11 +0800900 MSGLEN - 1)
901 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500902
Yanray Wangbd296832022-10-26 18:28:11 +0800903 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
904 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100905 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500906
Gilles Peskine449bd832023-01-11 14:50:10 +0100907 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500908
Yanray Wangbd296832022-10-26 18:28:11 +0800909 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
910 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100911 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800914 mbedtls_test_message_socket_close(&server_context);
915 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +0200916 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500917}
918/* END_CASE */
919
920/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100921void ssl_message_mock_socket_overflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500922{
923 enum { MSGLEN = 10 };
924 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800925 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500926 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800927 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500928 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +0200929
Yanray Wangf7b62352022-10-26 11:51:53 +0800930 mbedtls_test_message_socket_init(&server_context);
931 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +0200932 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500933
Yanray Wangbd296832022-10-26 18:28:11 +0800934 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
935 &client_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +0800936 &server,
937 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500938
Yanray Wangbd296832022-10-26 18:28:11 +0800939 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
940 &server_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +0800941 &client,
942 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500943
944 /* Fill up the buffer with structured data so that unwanted changes
945 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500947 message[i] = i & 0xFF;
948 }
Yanray Wangf7b62352022-10-26 11:51:53 +0800949 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
950 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500951
952 /* Send two message to the server, second one with an error */
Yanray Wangf7b62352022-10-26 11:51:53 +0800953 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +0800954 MSGLEN)
955 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500956
Yanray Wangf7b62352022-10-26 11:51:53 +0800957 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
958 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500960
961 /* Read the only message from the server */
Yanray Wangbd296832022-10-26 18:28:11 +0800962 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
963 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500965
Gilles Peskine449bd832023-01-11 14:50:10 +0100966 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500967
Gilles Peskine449bd832023-01-11 14:50:10 +0100968exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800969 mbedtls_test_message_socket_close(&server_context);
970 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +0200971 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500972}
973/* END_CASE */
974
975/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100976void ssl_message_mock_truncated()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500977{
978 enum { MSGLEN = 10 };
979 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800980 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500981 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800982 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500983 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +0200984
Yanray Wangf7b62352022-10-26 11:51:53 +0800985 mbedtls_test_message_socket_init(&server_context);
986 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +0200987 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500988
Yanray Wangbd296832022-10-26 18:28:11 +0800989 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
990 &client_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +0800991 &server,
992 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500993
Yanray Wangbd296832022-10-26 18:28:11 +0800994 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
995 &server_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +0800996 &client,
997 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500998
Gilles Peskine449bd832023-01-11 14:50:10 +0100999 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001000 /* Fill up the buffer with structured data so that unwanted changes
1001 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001002 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001003 message[i] = i & 0xFF;
1004 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001005 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1006 2 * MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001007
1008 /* Send two messages to the server, the second one small enough to fit in the
1009 * receiver's buffer. */
Yanray Wangf7b62352022-10-26 11:51:53 +08001010 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001011 MSGLEN)
1012 == MSGLEN);
Yanray Wangf7b62352022-10-26 11:51:53 +08001013 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001014 MSGLEN / 2)
1015 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001016 /* Read a truncated message from the server */
Yanray Wangbd296832022-10-26 18:28:11 +08001017 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1018 MSGLEN/2)
Gilles Peskine449bd832023-01-11 14:50:10 +01001019 == MSGLEN/2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001020
1021 /* Test that the first half of the message is valid, and second one isn't */
Gilles Peskine449bd832023-01-11 14:50:10 +01001022 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
1023 TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2)
1024 != 0);
1025 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001026
1027 /* Read a full message from the server */
Yanray Wangbd296832022-10-26 18:28:11 +08001028 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1029 MSGLEN/2)
Gilles Peskine449bd832023-01-11 14:50:10 +01001030 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001031
1032 /* Test that the first half of the message is valid */
Gilles Peskine449bd832023-01-11 14:50:10 +01001033 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001034
Gilles Peskine449bd832023-01-11 14:50:10 +01001035exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001036 mbedtls_test_message_socket_close(&server_context);
1037 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001038 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001039}
1040/* END_CASE */
1041
1042/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001043void ssl_message_mock_socket_read_error()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001044{
1045 enum { MSGLEN = 10 };
1046 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001047 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001048 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001049 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001050 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001051
Yanray Wangf7b62352022-10-26 11:51:53 +08001052 mbedtls_test_message_socket_init(&server_context);
1053 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001054 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001055
Yanray Wangbd296832022-10-26 18:28:11 +08001056 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1057 &client_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +08001058 &server,
1059 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001060
Yanray Wangbd296832022-10-26 18:28:11 +08001061 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1062 &server_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +08001063 &client,
1064 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001065
1066 /* Fill up the buffer with structured data so that unwanted changes
1067 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001069 message[i] = i & 0xFF;
1070 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001071 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1072 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001073
Yanray Wangf7b62352022-10-26 11:51:53 +08001074 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001075 MSGLEN)
1076 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001077
1078 /* Force a read error by disconnecting the socket by hand */
1079 server.status = 0;
Yanray Wangbd296832022-10-26 18:28:11 +08001080 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1081 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001082 == MBEDTLS_TEST_ERROR_RECV_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001083 /* Return to a valid state */
1084 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
1085
Gilles Peskine449bd832023-01-11 14:50:10 +01001086 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001087
1088 /* Test that even though the server tried to read once disconnected, the
1089 * continuity is preserved */
Yanray Wangbd296832022-10-26 18:28:11 +08001090 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1091 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001093
Gilles Peskine449bd832023-01-11 14:50:10 +01001094 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001095
Gilles Peskine449bd832023-01-11 14:50:10 +01001096exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001097 mbedtls_test_message_socket_close(&server_context);
1098 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001099 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001100}
1101/* END_CASE */
1102
1103/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001104void ssl_message_mock_interleaved_one_way()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001105{
1106 enum { MSGLEN = 10 };
1107 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001108 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001109 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001110 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001111 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001112
Yanray Wangf7b62352022-10-26 11:51:53 +08001113 mbedtls_test_message_socket_init(&server_context);
1114 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001115 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001116
Yanray Wangbd296832022-10-26 18:28:11 +08001117 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1118 &client_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001119 &server,
1120 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001121
Yanray Wangbd296832022-10-26 18:28:11 +08001122 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1123 &server_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001124 &client,
1125 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001126
1127 /* Fill up the buffer with structured data so that unwanted changes
1128 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001129 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001130 message[i] = i & 0xFF;
1131 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001132 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1133 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001134
1135 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
1136 * (to wrap around the buffer) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001137 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001138 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1139 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001140
Yanray Wangf7b62352022-10-26 11:51:53 +08001141 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1142 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001143
Yanray Wangf7b62352022-10-26 11:51:53 +08001144 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1145 MSGLEN) == MSGLEN);
Gilles Peskine449bd832023-01-11 14:50:10 +01001146 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1147 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001148 }
1149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001151 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1152 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001153
Gilles Peskine449bd832023-01-11 14:50:10 +01001154 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001155 }
Yanray Wangbd296832022-10-26 18:28:11 +08001156 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1157 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001158 == MBEDTLS_ERR_SSL_WANT_READ);
1159exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001160 mbedtls_test_message_socket_close(&server_context);
1161 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001162 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001163}
1164/* END_CASE */
1165
1166/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001167void ssl_message_mock_interleaved_two_ways()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001168{
1169 enum { MSGLEN = 10 };
1170 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001171 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001172 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001173 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001174 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001175
Yanray Wangf7b62352022-10-26 11:51:53 +08001176 mbedtls_test_message_socket_init(&server_context);
1177 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001178 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001179
Yanray Wangbd296832022-10-26 18:28:11 +08001180 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1181 &client_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001182 &server,
1183 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001184
Yanray Wangbd296832022-10-26 18:28:11 +08001185 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1186 &server_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001187 &client,
1188 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001189
1190 /* Fill up the buffer with structured data so that unwanted changes
1191 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001193 message[i] = i & 0xFF;
1194 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001195 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1196 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001197
1198 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
1199 * (to wrap around the buffer) both ways. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001201 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1202 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001203
Yanray Wangf7b62352022-10-26 11:51:53 +08001204 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1205 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001206
Yanray Wangf7b62352022-10-26 11:51:53 +08001207 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1208 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001209
Yanray Wangf7b62352022-10-26 11:51:53 +08001210 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1211 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001212
Yanray Wangf7b62352022-10-26 11:51:53 +08001213 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1214 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001215
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001217
Gilles Peskine449bd832023-01-11 14:50:10 +01001218 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001219
Yanray Wangf7b62352022-10-26 11:51:53 +08001220 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1221 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001222
Gilles Peskine449bd832023-01-11 14:50:10 +01001223 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001224
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001226 }
1227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001229 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1230 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001231
Gilles Peskine449bd832023-01-11 14:50:10 +01001232 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1233 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001234
Yanray Wangf7b62352022-10-26 11:51:53 +08001235 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1236 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001237
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1239 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001240 }
1241
Yanray Wangbd296832022-10-26 18:28:11 +08001242 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1243 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001244 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001245
Yanray Wangbd296832022-10-26 18:28:11 +08001246 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1247 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 == MBEDTLS_ERR_SSL_WANT_READ);
1249exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001250 mbedtls_test_message_socket_close(&server_context);
1251 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001252 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001253}
1254/* END_CASE */
1255
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001256/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Gilles Peskine449bd832023-01-11 14:50:10 +01001257void ssl_dtls_replay(data_t *prevs, data_t *new, int ret)
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001258{
Azim Khand30ca132017-06-09 04:32:58 +01001259 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001260 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001261 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001262
Gilles Peskine449bd832023-01-11 14:50:10 +01001263 mbedtls_ssl_init(&ssl);
1264 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02001265 MD_OR_USE_PSA_INIT();
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02001266
Gilles Peskine449bd832023-01-11 14:50:10 +01001267 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
1268 MBEDTLS_SSL_IS_CLIENT,
1269 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
1270 MBEDTLS_SSL_PRESET_DEFAULT) == 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01001271 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
1272
Gilles Peskine449bd832023-01-11 14:50:10 +01001273 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001274
1275 /* Read previous record numbers */
Gilles Peskine449bd832023-01-11 14:50:10 +01001276 for (len = 0; len < prevs->len; len += 6) {
1277 memcpy(ssl.in_ctr + 2, prevs->x + len, 6);
1278 mbedtls_ssl_dtls_replay_update(&ssl);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001279 }
1280
1281 /* Check new number */
Gilles Peskine449bd832023-01-11 14:50:10 +01001282 memcpy(ssl.in_ctr + 2, new->x, 6);
1283 TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001284
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001285exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001286 mbedtls_ssl_free(&ssl);
1287 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001288 MD_OR_USE_PSA_DONE();
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001289}
1290/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001291
Ronald Crone68ab4f2022-10-05 12:46:29 +02001292/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Pengyu Lv9d87a382023-07-11 10:15:16 +08001293void ssl_set_hostname_twice(char *input_hostname0, char *input_hostname1)
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001294{
Pengyu Lv9d87a382023-07-11 10:15:16 +08001295 const char *output_hostname;
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001296 mbedtls_ssl_context ssl;
Valerio Setti285dae82023-04-19 15:10:45 +02001297
Gilles Peskine449bd832023-01-11 14:50:10 +01001298 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02001299 USE_PSA_INIT();
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001300
Pengyu Lv9d87a382023-07-11 10:15:16 +08001301 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, input_hostname0) == 0);
1302 output_hostname = mbedtls_ssl_get_hostname(&ssl);
1303 TEST_ASSERT(strcmp(input_hostname0, output_hostname) == 0);
Pengyu Lv30e08702023-07-10 10:53:11 +08001304
Pengyu Lv9d87a382023-07-11 10:15:16 +08001305 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, input_hostname1) == 0);
1306 output_hostname = mbedtls_ssl_get_hostname(&ssl);
1307 TEST_ASSERT(strcmp(input_hostname1, output_hostname) == 0);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001308
valerio32f2ac92023-04-20 11:59:52 +02001309exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001310 mbedtls_ssl_free(&ssl);
Valerio Setti285dae82023-04-19 15:10:45 +02001311 USE_PSA_DONE();
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001312}
Darryl Green11999bb2018-03-13 15:22:58 +00001313/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00001314
1315/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001316void ssl_crypt_record(int cipher_type, int hash_id,
1317 int etm, int tag_mode, int ver,
1318 int cid0_len, int cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00001319{
1320 /*
1321 * Test several record encryptions and decryptions
1322 * with plenty of space before and after the data
1323 * within the record buffer.
1324 */
1325
1326 int ret;
1327 int num_records = 16;
1328 mbedtls_ssl_context ssl; /* ONLY for debugging */
1329
1330 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001331 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001332 size_t const buflen = 512;
1333 mbedtls_record rec, rec_backup;
1334
Gilles Peskine449bd832023-01-11 14:50:10 +01001335 mbedtls_ssl_init(&ssl);
1336 mbedtls_ssl_transform_init(&t0);
1337 mbedtls_ssl_transform_init(&t1);
valerio32f2ac92023-04-20 11:59:52 +02001338 MD_OR_USE_PSA_INIT();
1339
Yanray Wangf7b62352022-10-26 11:51:53 +08001340 ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1341 etm, tag_mode, ver,
1342 (size_t) cid0_len,
1343 (size_t) cid1_len);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001344
Gilles Peskine449bd832023-01-11 14:50:10 +01001345 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001346
Gilles Peskined681ffd2023-10-17 17:31:50 +02001347 TEST_CALLOC(buf, buflen);
Hanno Beckera18d1322018-01-03 14:27:32 +00001348
Gilles Peskine449bd832023-01-11 14:50:10 +01001349 while (num_records-- > 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001350 mbedtls_ssl_transform *t_dec, *t_enc;
1351 /* Take turns in who's sending and who's receiving. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 if (num_records % 3 == 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001353 t_dec = &t0;
1354 t_enc = &t1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 } else {
Hanno Beckera18d1322018-01-03 14:27:32 +00001356 t_dec = &t1;
1357 t_enc = &t0;
1358 }
1359
1360 /*
1361 * The record header affects the transformation in two ways:
1362 * 1) It determines the AEAD additional data
1363 * 2) The record counter sometimes determines the IV.
1364 *
1365 * Apart from that, the fields don't have influence.
1366 * In particular, it is currently not the responsibility
1367 * of ssl_encrypt/decrypt_buf to check if the transform
1368 * version matches the record version, or that the
1369 * type is sensible.
1370 */
1371
Gilles Peskine449bd832023-01-11 14:50:10 +01001372 memset(rec.ctr, num_records, sizeof(rec.ctr));
Hanno Beckera18d1322018-01-03 14:27:32 +00001373 rec.type = 42;
1374 rec.ver[0] = num_records;
1375 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001376#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001377 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001378#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00001379
1380 rec.buf = buf;
1381 rec.buf_len = buflen;
1382 rec.data_offset = 16;
1383 /* Make sure to vary the length to exercise different
1384 * paddings. */
1385 rec.data_len = 1 + num_records;
1386
Gilles Peskine449bd832023-01-11 14:50:10 +01001387 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckera18d1322018-01-03 14:27:32 +00001388
1389 /* Make a copy for later comparison */
1390 rec_backup = rec;
1391
1392 /* Encrypt record */
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1394 mbedtls_test_rnd_std_rand, NULL);
1395 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1396 if (ret != 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001397 continue;
1398 }
1399
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001400#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001401 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001402 /* DTLS 1.2 + CID hides the real content type and
1403 * uses a special CID content type in the protected
1404 * record. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001405 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001406 }
1407#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1408
Ronald Cron6f135e12021-12-08 16:57:54 +01001409#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01001410 if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001411 /* TLS 1.3 hides the real content type and
1412 * always uses Application Data as the content type
1413 * for protected records. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001414 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001415 }
Ronald Cron6f135e12021-12-08 16:57:54 +01001416#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001417
Hanno Beckera18d1322018-01-03 14:27:32 +00001418 /* Decrypt record with t_dec */
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec);
1420 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001421
1422 /* Compare results */
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 TEST_ASSERT(rec.type == rec_backup.type);
1424 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1425 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1426 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1427 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1428 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1429 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1430 rec_backup.buf + rec_backup.data_offset,
1431 rec.data_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001432 }
1433
Hanno Becker81e16a32019-03-01 11:21:44 +00001434exit:
1435
Hanno Beckera18d1322018-01-03 14:27:32 +00001436 /* Cleanup */
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 mbedtls_ssl_free(&ssl);
1438 mbedtls_ssl_transform_free(&t0);
1439 mbedtls_ssl_transform_free(&t1);
Hanno Beckera18d1322018-01-03 14:27:32 +00001440
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 mbedtls_free(buf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001442 MD_OR_USE_PSA_DONE();
Hanno Beckera18d1322018-01-03 14:27:32 +00001443}
1444/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001445
1446/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001447void ssl_crypt_record_small(int cipher_type, int hash_id,
1448 int etm, int tag_mode, int ver,
1449 int cid0_len, int cid1_len)
Hanno Beckerb3268da2018-01-05 15:20:24 +00001450{
1451 /*
1452 * Test pairs of encryption and decryption with an increasing
1453 * amount of space in the record buffer - in more detail:
1454 * 1) Try to encrypt with 0, 1, 2, ... bytes available
1455 * in front of the plaintext, and expect the encryption
1456 * to succeed starting from some offset. Always keep
1457 * enough space in the end of the buffer.
1458 * 2) Try to encrypt with 0, 1, 2, ... bytes available
1459 * at the end of the plaintext, and expect the encryption
1460 * to succeed starting from some offset. Always keep
1461 * enough space at the beginning of the buffer.
1462 * 3) Try to encrypt with 0, 1, 2, ... bytes available
1463 * both at the front and end of the plaintext,
1464 * and expect the encryption to succeed starting from
1465 * some offset.
1466 *
1467 * If encryption succeeds, check that decryption succeeds
1468 * and yields the original record.
1469 */
1470
1471 mbedtls_ssl_context ssl; /* ONLY for debugging */
1472
1473 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001474 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01001475 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001476 mbedtls_record rec, rec_backup;
1477
1478 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01001479 int mode; /* Mode 1, 2 or 3 as explained above */
1480 size_t offset; /* Available space at beginning/end/both */
1481 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001482
Hanno Beckerd856c822019-04-29 17:30:59 +01001483 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
1484 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001485
1486 int seen_success; /* Indicates if in the current mode we've
1487 * already seen a successful test. */
1488
Gilles Peskine449bd832023-01-11 14:50:10 +01001489 mbedtls_ssl_init(&ssl);
1490 mbedtls_ssl_transform_init(&t0);
1491 mbedtls_ssl_transform_init(&t1);
valerio32f2ac92023-04-20 11:59:52 +02001492 MD_OR_USE_PSA_INIT();
1493
Yanray Wangf7b62352022-10-26 11:51:53 +08001494 ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1495 etm, tag_mode, ver,
1496 (size_t) cid0_len,
1497 (size_t) cid1_len);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001498
Gilles Peskine449bd832023-01-11 14:50:10 +01001499 TEST_ASSERT(ret == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001500
Gilles Peskined681ffd2023-10-17 17:31:50 +02001501 TEST_CALLOC(buf, buflen);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001502
Gilles Peskine449bd832023-01-11 14:50:10 +01001503 for (mode = 1; mode <= 3; mode++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001504 seen_success = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 for (offset = 0; offset <= threshold; offset++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001506 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01001507 t_dec = &t0;
1508 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001509
Gilles Peskine449bd832023-01-11 14:50:10 +01001510 memset(rec.ctr, offset, sizeof(rec.ctr));
Hanno Beckerb3268da2018-01-05 15:20:24 +00001511 rec.type = 42;
1512 rec.ver[0] = offset;
1513 rec.ver[1] = offset;
1514 rec.buf = buf;
1515 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001516#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001517 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001518#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001519
Gilles Peskine449bd832023-01-11 14:50:10 +01001520 switch (mode) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001521 case 1: /* Space in the beginning */
1522 rec.data_offset = offset;
1523 rec.data_len = buflen - offset - default_post_padding;
1524 break;
1525
1526 case 2: /* Space in the end */
1527 rec.data_offset = default_pre_padding;
1528 rec.data_len = buflen - default_pre_padding - offset;
1529 break;
1530
1531 case 3: /* Space in the beginning and end */
1532 rec.data_offset = offset;
1533 rec.data_len = buflen - 2 * offset;
1534 break;
1535
1536 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001537 TEST_ASSERT(0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001538 break;
1539 }
1540
Gilles Peskine449bd832023-01-11 14:50:10 +01001541 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001542
1543 /* Make a copy for later comparison */
1544 rec_backup = rec;
1545
1546 /* Encrypt record */
Gilles Peskine449bd832023-01-11 14:50:10 +01001547 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1548 mbedtls_test_rnd_std_rand, NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001549
Gilles Peskine5fd88b72023-07-20 22:18:23 +02001550 if (ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
1551 /* It's ok if the output buffer is too small. We do insist
1552 * on at least one mode succeeding; this is tracked by
1553 * seen_success. */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001554 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001555 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001556
Gilles Peskine5fd88b72023-07-20 22:18:23 +02001557 TEST_EQUAL(ret, 0);
1558 seen_success = 1;
1559
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001560#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001562 /* DTLS 1.2 + CID hides the real content type and
1563 * uses a special CID content type in the protected
1564 * record. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001566 }
1567#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1568
Ronald Cron6f135e12021-12-08 16:57:54 +01001569#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01001570 if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001571 /* TLS 1.3 hides the real content type and
1572 * always uses Application Data as the content type
1573 * for protected records. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001574 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001575 }
Ronald Cron6f135e12021-12-08 16:57:54 +01001576#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001577
Hanno Beckerb3268da2018-01-05 15:20:24 +00001578 /* Decrypt record with t_dec */
Gilles Peskine449bd832023-01-11 14:50:10 +01001579 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001580
1581 /* Compare results */
Gilles Peskine449bd832023-01-11 14:50:10 +01001582 TEST_ASSERT(rec.type == rec_backup.type);
1583 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1584 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1585 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1586 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1587 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1588 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1589 rec_backup.buf + rec_backup.data_offset,
1590 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001591 }
1592
Gilles Peskine449bd832023-01-11 14:50:10 +01001593 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001594 }
1595
Hanno Becker81e16a32019-03-01 11:21:44 +00001596exit:
1597
Hanno Beckerb3268da2018-01-05 15:20:24 +00001598 /* Cleanup */
Gilles Peskine449bd832023-01-11 14:50:10 +01001599 mbedtls_ssl_free(&ssl);
1600 mbedtls_ssl_transform_free(&t0);
1601 mbedtls_ssl_transform_free(&t1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001602
Gilles Peskine449bd832023-01-11 14:50:10 +01001603 mbedtls_free(buf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001604 MD_OR_USE_PSA_DONE();
Hanno Beckerb3268da2018-01-05 15:20:24 +00001605}
1606/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03001607
Ronald Cron6f135e12021-12-08 16:57:54 +01001608/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001609void ssl_tls13_hkdf_expand_label(int hash_alg,
1610 data_t *secret,
1611 int label_idx,
1612 data_t *ctx,
1613 int desired_length,
1614 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01001615{
Gilles Peskine449bd832023-01-11 14:50:10 +01001616 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01001617
Hanno Becker70d7fb02020-09-09 10:11:21 +01001618 unsigned char const *lbl = NULL;
1619 size_t lbl_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001620#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1621 if (label_idx == (int) tls13_label_ ## name) \
Xiaofei Baid25fab62021-12-02 06:36:27 +00001622 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00001623 lbl = mbedtls_ssl_tls13_labels.name; \
Gilles Peskine449bd832023-01-11 14:50:10 +01001624 lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001625 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001626 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001627#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine449bd832023-01-11 14:50:10 +01001628 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01001629
1630 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001631 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1632 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001633
Gilles Peskine449bd832023-01-11 14:50:10 +01001634 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001635
Gilles Peskine449bd832023-01-11 14:50:10 +01001636 TEST_ASSERT(mbedtls_ssl_tls13_hkdf_expand_label(
1637 (psa_algorithm_t) hash_alg,
1638 secret->x, secret->len,
1639 lbl, lbl_len,
1640 ctx->x, ctx->len,
1641 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01001642
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001643 TEST_MEMORY_COMPARE(dst, (size_t) desired_length,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001644 expected->x, (size_t) expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001645
valerio32f2ac92023-04-20 11:59:52 +02001646exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001647 PSA_DONE();
Hanno Becker39ff4922020-08-21 13:36:56 +01001648}
1649/* END_CASE */
1650
Ronald Cron6f135e12021-12-08 16:57:54 +01001651/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001652void ssl_tls13_traffic_key_generation(int hash_alg,
1653 data_t *server_secret,
1654 data_t *client_secret,
1655 int desired_iv_len,
1656 int desired_key_len,
1657 data_t *expected_server_write_key,
1658 data_t *expected_server_write_iv,
1659 data_t *expected_client_write_key,
1660 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01001661{
1662 mbedtls_ssl_key_set keys;
1663
1664 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001665 TEST_ASSERT(client_secret->len == server_secret->len);
Yanray Wangd577a682022-10-27 11:47:54 +08001666 TEST_ASSERT(
1667 expected_client_write_iv->len == expected_server_write_iv->len &&
1668 expected_client_write_iv->len == (size_t) desired_iv_len);
1669 TEST_ASSERT(
1670 expected_client_write_key->len == expected_server_write_key->len &&
1671 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001672
Gilles Peskine449bd832023-01-11 14:50:10 +01001673 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001674
Gilles Peskine449bd832023-01-11 14:50:10 +01001675 TEST_ASSERT(mbedtls_ssl_tls13_make_traffic_keys(
1676 (psa_algorithm_t) hash_alg,
1677 client_secret->x,
1678 server_secret->x,
1679 client_secret->len /* == server_secret->len */,
1680 desired_key_len, desired_iv_len,
1681 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01001682
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001683 TEST_MEMORY_COMPARE(keys.client_write_key,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001684 keys.key_len,
1685 expected_client_write_key->x,
1686 (size_t) desired_key_len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001687 TEST_MEMORY_COMPARE(keys.server_write_key,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001688 keys.key_len,
1689 expected_server_write_key->x,
1690 (size_t) desired_key_len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001691 TEST_MEMORY_COMPARE(keys.client_write_iv,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001692 keys.iv_len,
1693 expected_client_write_iv->x,
1694 (size_t) desired_iv_len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001695 TEST_MEMORY_COMPARE(keys.server_write_iv,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001696 keys.iv_len,
1697 expected_server_write_iv->x,
1698 (size_t) desired_iv_len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001699
valerio32f2ac92023-04-20 11:59:52 +02001700exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 PSA_DONE();
Hanno Becker19498f82020-08-21 13:37:08 +01001702}
1703/* END_CASE */
1704
Ronald Cron6f135e12021-12-08 16:57:54 +01001705/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001706void ssl_tls13_derive_secret(int hash_alg,
1707 data_t *secret,
1708 int label_idx,
1709 data_t *ctx,
1710 int desired_length,
1711 int already_hashed,
1712 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01001713{
Gilles Peskine449bd832023-01-11 14:50:10 +01001714 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01001715
Hanno Becker70d7fb02020-09-09 10:11:21 +01001716 unsigned char const *lbl = NULL;
1717 size_t lbl_len;
Michael Schuster31b1cb82024-06-04 02:41:10 +02001718#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1719 if (label_idx == (int) tls13_label_ ## name) \
Xiaofei Baid25fab62021-12-02 06:36:27 +00001720 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00001721 lbl = mbedtls_ssl_tls13_labels.name; \
Michael Schuster31b1cb82024-06-04 02:41:10 +02001722 lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001723 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001724 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001725#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine449bd832023-01-11 14:50:10 +01001726 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01001727
Hanno Beckere4849d12020-08-21 14:14:14 +01001728 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001729 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1730 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01001731
Gilles Peskine449bd832023-01-11 14:50:10 +01001732 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001733
Gilles Peskine449bd832023-01-11 14:50:10 +01001734 TEST_ASSERT(mbedtls_ssl_tls13_derive_secret(
1735 (psa_algorithm_t) hash_alg,
1736 secret->x, secret->len,
1737 lbl, lbl_len,
1738 ctx->x, ctx->len,
1739 already_hashed,
1740 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01001741
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001742 TEST_MEMORY_COMPARE(dst, desired_length,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001743 expected->x, desired_length);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001744
valerio32f2ac92023-04-20 11:59:52 +02001745exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001746 PSA_DONE();
Hanno Beckere4849d12020-08-21 14:14:14 +01001747}
1748/* END_CASE */
1749
Ronald Cron6f135e12021-12-08 16:57:54 +01001750/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001751void ssl_tls13_derive_early_secrets(int hash_alg,
1752 data_t *secret,
1753 data_t *transcript,
1754 data_t *traffic_expected,
1755 data_t *exporter_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01001756{
Xiaofei Bai746f9482021-11-12 08:53:56 +00001757 mbedtls_ssl_tls13_early_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01001758
1759 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001760 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001761 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001762 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001763 secret->len == hash_len &&
1764 transcript->len == hash_len &&
1765 traffic_expected->len == hash_len &&
1766 exporter_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001767
Gilles Peskine449bd832023-01-11 14:50:10 +01001768 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001769
Gilles Peskine449bd832023-01-11 14:50:10 +01001770 TEST_ASSERT(mbedtls_ssl_tls13_derive_early_secrets(
1771 alg, secret->x, transcript->x, transcript->len,
1772 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001773
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001774 TEST_MEMORY_COMPARE(secrets.client_early_traffic_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001775 traffic_expected->x, traffic_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001776 TEST_MEMORY_COMPARE(secrets.early_exporter_master_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001777 exporter_expected->x, exporter_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001778
valerio32f2ac92023-04-20 11:59:52 +02001779exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001780 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001781}
1782/* END_CASE */
1783
Ronald Cron6f135e12021-12-08 16:57:54 +01001784/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001785void ssl_tls13_derive_handshake_secrets(int hash_alg,
1786 data_t *secret,
1787 data_t *transcript,
1788 data_t *client_expected,
1789 data_t *server_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01001790{
Xiaofei Bai746f9482021-11-12 08:53:56 +00001791 mbedtls_ssl_tls13_handshake_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01001792
1793 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001794 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001795 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001796 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001797 secret->len == hash_len &&
1798 transcript->len == hash_len &&
1799 client_expected->len == hash_len &&
1800 server_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001801
Gilles Peskine449bd832023-01-11 14:50:10 +01001802 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001803
Gilles Peskine449bd832023-01-11 14:50:10 +01001804 TEST_ASSERT(mbedtls_ssl_tls13_derive_handshake_secrets(
1805 alg, secret->x, transcript->x, transcript->len,
1806 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001807
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001808 TEST_MEMORY_COMPARE(secrets.client_handshake_traffic_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001809 client_expected->x, client_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001810 TEST_MEMORY_COMPARE(secrets.server_handshake_traffic_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001811 server_expected->x, server_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001812
valerio32f2ac92023-04-20 11:59:52 +02001813exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001814 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001815}
1816/* END_CASE */
1817
Ronald Cron6f135e12021-12-08 16:57:54 +01001818/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001819void ssl_tls13_derive_application_secrets(int hash_alg,
Xiaofei Bai746f9482021-11-12 08:53:56 +00001820 data_t *secret,
1821 data_t *transcript,
Gilles Peskine449bd832023-01-11 14:50:10 +01001822 data_t *client_expected,
1823 data_t *server_expected,
1824 data_t *exporter_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01001825{
Xiaofei Bai746f9482021-11-12 08:53:56 +00001826 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01001827
1828 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001829 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001830 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001831 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001832 secret->len == hash_len &&
1833 transcript->len == hash_len &&
1834 client_expected->len == hash_len &&
1835 server_expected->len == hash_len &&
1836 exporter_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001837
Gilles Peskine449bd832023-01-11 14:50:10 +01001838 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001839
Gilles Peskine449bd832023-01-11 14:50:10 +01001840 TEST_ASSERT(mbedtls_ssl_tls13_derive_application_secrets(
1841 alg, secret->x, transcript->x, transcript->len,
1842 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001843
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001844 TEST_MEMORY_COMPARE(secrets.client_application_traffic_secret_N, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001845 client_expected->x, client_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001846 TEST_MEMORY_COMPARE(secrets.server_application_traffic_secret_N, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001847 server_expected->x, server_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001848 TEST_MEMORY_COMPARE(secrets.exporter_master_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001849 exporter_expected->x, exporter_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001850
valerio32f2ac92023-04-20 11:59:52 +02001851exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001852 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001853}
1854/* END_CASE */
1855
Ronald Cron6f135e12021-12-08 16:57:54 +01001856/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001857void ssl_tls13_derive_resumption_secrets(int hash_alg,
1858 data_t *secret,
1859 data_t *transcript,
1860 data_t *resumption_expected)
Hanno Becker55bc2c52021-05-24 06:53:52 +01001861{
Gilles Peskine449bd832023-01-11 14:50:10 +01001862 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Becker55bc2c52021-05-24 06:53:52 +01001863
1864 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001865 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001866 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001867 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001868 secret->len == hash_len &&
1869 transcript->len == hash_len &&
1870 resumption_expected->len == hash_len);
Hanno Becker55bc2c52021-05-24 06:53:52 +01001871
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 PSA_INIT();
Hanno Becker55bc2c52021-05-24 06:53:52 +01001873
Gilles Peskine449bd832023-01-11 14:50:10 +01001874 TEST_ASSERT(mbedtls_ssl_tls13_derive_resumption_master_secret(
1875 alg, secret->x, transcript->x, transcript->len,
1876 &secrets) == 0);
Hanno Becker55bc2c52021-05-24 06:53:52 +01001877
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001878 TEST_MEMORY_COMPARE(secrets.resumption_master_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001879 resumption_expected->x, resumption_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001880
valerio32f2ac92023-04-20 11:59:52 +02001881exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001882 PSA_DONE();
1883}
1884/* END_CASE */
1885
1886/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
1887void ssl_tls13_create_psk_binder(int hash_alg,
1888 data_t *psk,
1889 int psk_type,
1890 data_t *transcript,
1891 data_t *binder_expected)
1892{
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02001893 unsigned char binder[MBEDTLS_MD_MAX_SIZE];
Gilles Peskine449bd832023-01-11 14:50:10 +01001894
1895 /* Double-check that we've passed sane parameters. */
1896 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
1897 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001898 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001899 transcript->len == hash_len &&
1900 binder_expected->len == hash_len);
1901
1902 PSA_INIT();
1903
1904 TEST_ASSERT(mbedtls_ssl_tls13_create_psk_binder(
1905 NULL, /* SSL context for debugging only */
1906 alg,
1907 psk->x, psk->len,
1908 psk_type,
1909 transcript->x,
1910 binder) == 0);
1911
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001912 TEST_MEMORY_COMPARE(binder, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001913 binder_expected->x, binder_expected->len);
Gilles Peskine449bd832023-01-11 14:50:10 +01001914
valerio32f2ac92023-04-20 11:59:52 +02001915exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001916 PSA_DONE();
Hanno Becker55bc2c52021-05-24 06:53:52 +01001917}
1918/* END_CASE */
1919
Gilles Peskine9d5952d2023-07-20 20:11:21 +02001920/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001921void ssl_tls13_record_protection(int ciphersuite,
1922 int endpoint,
1923 int ctr,
1924 int padding_used,
1925 data_t *server_write_key,
1926 data_t *server_write_iv,
1927 data_t *client_write_key,
1928 data_t *client_write_iv,
1929 data_t *plaintext,
1930 data_t *ciphertext)
Hanno Beckera77d0052021-03-22 15:16:33 +00001931{
1932 mbedtls_ssl_key_set keys;
1933 mbedtls_ssl_transform transform_send;
Gilles Peskine21e46b32023-10-17 16:35:20 +02001934 mbedtls_ssl_transform_init(&transform_send);
Hanno Beckera77d0052021-03-22 15:16:33 +00001935 mbedtls_ssl_transform transform_recv;
Gilles Peskine21e46b32023-10-17 16:35:20 +02001936 mbedtls_ssl_transform_init(&transform_recv);
Hanno Beckera77d0052021-03-22 15:16:33 +00001937 mbedtls_record rec;
1938 unsigned char *buf = NULL;
Hanno Becker1f918782021-08-01 19:18:28 +01001939 size_t buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00001940 int other_endpoint;
1941
Gilles Peskine449bd832023-01-11 14:50:10 +01001942 TEST_ASSERT(endpoint == MBEDTLS_SSL_IS_CLIENT ||
1943 endpoint == MBEDTLS_SSL_IS_SERVER);
Hanno Beckera77d0052021-03-22 15:16:33 +00001944
Gilles Peskine449bd832023-01-11 14:50:10 +01001945 if (endpoint == MBEDTLS_SSL_IS_SERVER) {
Hanno Beckera77d0052021-03-22 15:16:33 +00001946 other_endpoint = MBEDTLS_SSL_IS_CLIENT;
Gilles Peskine449bd832023-01-11 14:50:10 +01001947 }
1948 if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
Hanno Beckera77d0052021-03-22 15:16:33 +00001949 other_endpoint = MBEDTLS_SSL_IS_SERVER;
Gilles Peskine449bd832023-01-11 14:50:10 +01001950 }
Hanno Beckera77d0052021-03-22 15:16:33 +00001951
Gilles Peskine449bd832023-01-11 14:50:10 +01001952 TEST_ASSERT(server_write_key->len == client_write_key->len);
1953 TEST_ASSERT(server_write_iv->len == client_write_iv->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00001954
Gilles Peskine449bd832023-01-11 14:50:10 +01001955 memcpy(keys.client_write_key,
1956 client_write_key->x, client_write_key->len);
1957 memcpy(keys.client_write_iv,
1958 client_write_iv->x, client_write_iv->len);
1959 memcpy(keys.server_write_key,
1960 server_write_key->x, server_write_key->len);
1961 memcpy(keys.server_write_iv,
1962 server_write_iv->x, server_write_iv->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00001963
1964 keys.key_len = server_write_key->len;
1965 keys.iv_len = server_write_iv->len;
1966
Valerio Setti00a256f2023-04-27 17:22:27 +02001967 MD_OR_USE_PSA_INIT();
Hanno Beckera77d0052021-03-22 15:16:33 +00001968
Gilles Peskine449bd832023-01-11 14:50:10 +01001969 TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
1970 &transform_send, endpoint,
1971 ciphersuite, &keys, NULL) == 0);
1972 TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
1973 &transform_recv, other_endpoint,
1974 ciphersuite, &keys, NULL) == 0);
Hanno Beckera77d0052021-03-22 15:16:33 +00001975
Hanno Becker1f918782021-08-01 19:18:28 +01001976 /* Make sure we have enough space in the buffer even if
1977 * we use more padding than the KAT. */
1978 buf_len = ciphertext->len + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001979 TEST_CALLOC(buf, buf_len);
Hanno Beckera77d0052021-03-22 15:16:33 +00001980 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
Hanno Becker41537452021-04-20 05:35:28 +01001981
1982 /* TLS 1.3 uses the version identifier from TLS 1.2 on the wire. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001983 mbedtls_ssl_write_version(rec.ver,
1984 MBEDTLS_SSL_TRANSPORT_STREAM,
1985 MBEDTLS_SSL_VERSION_TLS1_2);
Hanno Beckera77d0052021-03-22 15:16:33 +00001986
1987 /* Copy plaintext into record structure */
1988 rec.buf = buf;
Hanno Becker1f918782021-08-01 19:18:28 +01001989 rec.buf_len = buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00001990 rec.data_offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001991 TEST_ASSERT(plaintext->len <= ciphertext->len);
1992 memcpy(rec.buf + rec.data_offset, plaintext->x, plaintext->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00001993 rec.data_len = plaintext->len;
1994#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1995 rec.cid_len = 0;
1996#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1997
Gilles Peskine449bd832023-01-11 14:50:10 +01001998 memset(&rec.ctr[0], 0, 8);
Hanno Beckera77d0052021-03-22 15:16:33 +00001999 rec.ctr[7] = ctr;
2000
Gilles Peskine449bd832023-01-11 14:50:10 +01002001 TEST_ASSERT(mbedtls_ssl_encrypt_buf(NULL, &transform_send, &rec,
2002 NULL, NULL) == 0);
Hanno Becker1f918782021-08-01 19:18:28 +01002003
Gilles Peskine449bd832023-01-11 14:50:10 +01002004 if (padding_used == MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002005 TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002006 ciphertext->x, ciphertext->len);
Hanno Becker1f918782021-08-01 19:18:28 +01002007 }
Hanno Beckera77d0052021-03-22 15:16:33 +00002008
Gilles Peskine449bd832023-01-11 14:50:10 +01002009 TEST_ASSERT(mbedtls_ssl_decrypt_buf(NULL, &transform_recv, &rec) == 0);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002010 TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002011 plaintext->x, plaintext->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00002012
valerio32f2ac92023-04-20 11:59:52 +02002013exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002014 mbedtls_free(buf);
2015 mbedtls_ssl_transform_free(&transform_send);
2016 mbedtls_ssl_transform_free(&transform_recv);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002017 MD_OR_USE_PSA_DONE();
Hanno Beckera77d0052021-03-22 15:16:33 +00002018}
2019/* END_CASE */
2020
Andrzej Kurek658442f2022-10-12 11:28:41 -04002021/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002022void ssl_tls13_key_evolution(int hash_alg,
2023 data_t *secret,
2024 data_t *input,
2025 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002026{
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002027 unsigned char secret_new[MBEDTLS_MD_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002028
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01002029 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01002030
Gilles Peskine449bd832023-01-11 14:50:10 +01002031 TEST_ASSERT(mbedtls_ssl_tls13_evolve_secret(
2032 (psa_algorithm_t) hash_alg,
2033 secret->len ? secret->x : NULL,
2034 input->len ? input->x : NULL, input->len,
2035 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002036
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002037 TEST_MEMORY_COMPARE(secret_new, (size_t) expected->len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002038 expected->x, (size_t) expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01002039
valerio32f2ac92023-04-20 11:59:52 +02002040exit:
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01002041 PSA_DONE();
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002042}
2043/* END_CASE */
2044
Jerry Yu53d23e22022-02-09 16:25:09 +08002045/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002046void ssl_tls_prf(int type, data_t *secret, data_t *random,
2047 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03002048{
2049 unsigned char *output;
2050
Gilles Peskine449bd832023-01-11 14:50:10 +01002051 output = mbedtls_calloc(1, result_str->len);
2052 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03002053 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002054 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03002055
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002056 MD_OR_USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03002057
Gilles Peskine449bd832023-01-11 14:50:10 +01002058 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
2059 label, random->x, random->len,
2060 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03002061
Gilles Peskine449bd832023-01-11 14:50:10 +01002062 if (exp_ret == 0) {
2063 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
2064 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03002065 }
2066exit:
2067
Gilles Peskine449bd832023-01-11 14:50:10 +01002068 mbedtls_free(output);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002069 MD_OR_USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03002070}
2071/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002072
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002073/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002074void ssl_serialize_session_save_load(int ticket_len, char *crt_file,
2075 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002076{
2077 mbedtls_ssl_session original, restored;
2078 unsigned char *buf = NULL;
2079 size_t len;
2080
2081 /*
2082 * Test that a save-load pair is the identity
2083 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002084 mbedtls_ssl_session_init(&original);
2085 mbedtls_ssl_session_init(&restored);
valerio32f2ac92023-04-20 11:59:52 +02002086 USE_PSA_INIT();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002087
2088 /* Prepare a dummy session to work on */
Jerry Yuf0926292022-07-15 13:05:57 +08002089 ((void) tls_version);
Jerry Yu28547c42023-10-31 14:42:50 +08002090 ((void) ticket_len);
2091 ((void) crt_file);
Jerry Yuf0926292022-07-15 13:05:57 +08002092#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01002093 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Yanray Wangf7b62352022-10-26 11:51:53 +08002094 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
Gilles Peskine449bd832023-01-11 14:50:10 +01002095 &original, 0, endpoint_type) == 0);
Jerry Yu28547c42023-10-31 14:42:50 +08002096 }
Jerry Yuf0926292022-07-15 13:05:57 +08002097#endif
Jerry Yu28547c42023-10-31 14:42:50 +08002098
2099#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2100 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
Yanray Wangf7b62352022-10-26 11:51:53 +08002101 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002102 &original, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08002103 }
Jerry Yu28547c42023-10-31 14:42:50 +08002104#endif
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002105
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002106 /* Serialize it */
Gilles Peskine449bd832023-01-11 14:50:10 +01002107 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
2108 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002109 TEST_CALLOC(buf, len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002110 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
2111 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002112
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002113 /* Restore session from serialized data */
Gilles Peskine449bd832023-01-11 14:50:10 +01002114 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002115
2116 /*
2117 * Make sure both session structures are identical
2118 */
2119#if defined(MBEDTLS_HAVE_TIME)
Ronald Cronc57f86e2023-11-22 09:50:01 +01002120 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
2121 TEST_ASSERT(original.start == restored.start);
Jerry Yu28547c42023-10-31 14:42:50 +08002122 }
Ronald Cronc57f86e2023-11-22 09:50:01 +01002123#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C)
2124 TEST_ASSERT(original.ticket_creation_time == restored.ticket_creation_time);
Jerry Yu28547c42023-10-31 14:42:50 +08002125#endif
Ronald Cronc57f86e2023-11-22 09:50:01 +01002126#endif /* MBEDTLS_HAVE_TIME */
Jerry Yu28547c42023-10-31 14:42:50 +08002127
Gilles Peskine449bd832023-01-11 14:50:10 +01002128 TEST_ASSERT(original.tls_version == restored.tls_version);
Ronald Cron7b1921a2023-11-23 12:31:56 +01002129 TEST_ASSERT(original.endpoint == restored.endpoint);
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
Jerry Yuf0926292022-07-15 13:05:57 +08002131#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskine449bd832023-01-11 14:50:10 +01002132 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
2133 TEST_ASSERT(original.id_len == restored.id_len);
2134 TEST_ASSERT(memcmp(original.id,
2135 restored.id, sizeof(original.id)) == 0);
2136 TEST_ASSERT(memcmp(original.master,
2137 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002138
Ronald Crone68ab4f2022-10-05 12:46:29 +02002139#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002140#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01002141 TEST_ASSERT((original.peer_cert == NULL) ==
2142 (restored.peer_cert == NULL));
2143 if (original.peer_cert != NULL) {
2144 TEST_ASSERT(original.peer_cert->raw.len ==
2145 restored.peer_cert->raw.len);
2146 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
2147 restored.peer_cert->raw.p,
2148 original.peer_cert->raw.len) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08002149 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002150#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002151 TEST_ASSERT(original.peer_cert_digest_type ==
2152 restored.peer_cert_digest_type);
2153 TEST_ASSERT(original.peer_cert_digest_len ==
2154 restored.peer_cert_digest_len);
2155 TEST_ASSERT((original.peer_cert_digest == NULL) ==
2156 (restored.peer_cert_digest == NULL));
2157 if (original.peer_cert_digest != NULL) {
2158 TEST_ASSERT(memcmp(original.peer_cert_digest,
2159 restored.peer_cert_digest,
2160 original.peer_cert_digest_len) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08002161 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002162#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Crone68ab4f2022-10-05 12:46:29 +02002163#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002165
Jerry Yuf0926292022-07-15 13:05:57 +08002166#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002167 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Jerry Yuf0926292022-07-15 13:05:57 +08002168#endif
2169
2170#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine449bd832023-01-11 14:50:10 +01002171 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Jerry Yuf0926292022-07-15 13:05:57 +08002172#endif
Jerry Yu6ac7c032022-07-21 23:11:55 +08002173#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 TEST_ASSERT(original.ticket_len == restored.ticket_len);
2175 if (original.ticket_len != 0) {
2176 TEST_ASSERT(original.ticket != NULL);
2177 TEST_ASSERT(restored.ticket != NULL);
2178 TEST_ASSERT(memcmp(original.ticket,
2179 restored.ticket, original.ticket_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002180 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002182#endif
Jerry Yuf0926292022-07-15 13:05:57 +08002183 }
Jerry Yu6ac7c032022-07-21 23:11:55 +08002184#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2185
2186#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01002187 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Ronald Cron81963692024-03-26 10:15:08 +01002188#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002189 TEST_ASSERT(original.ticket_age_add == restored.ticket_age_add);
2190 TEST_ASSERT(original.ticket_flags == restored.ticket_flags);
2191 TEST_ASSERT(original.resumption_key_len == restored.resumption_key_len);
2192 if (original.resumption_key_len != 0) {
2193 TEST_ASSERT(original.resumption_key != NULL);
2194 TEST_ASSERT(restored.resumption_key != NULL);
2195 TEST_ASSERT(memcmp(original.resumption_key,
2196 restored.resumption_key,
2197 original.resumption_key_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002198 }
Ronald Cron81963692024-03-26 10:15:08 +01002199#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu34e95162022-12-12 15:14:56 +08002200
Ronald Cron81963692024-03-26 10:15:08 +01002201#if defined(MBEDTLS_SSL_SRV_C)
Waleed Elmelegy2824a202024-02-23 17:51:47 +00002202 if (endpoint_type == MBEDTLS_SSL_IS_SERVER) {
Ronald Cron81963692024-03-26 10:15:08 +01002203#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2204#if defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_ALPN)
Waleed Elmelegy883f77c2024-03-06 19:09:41 +00002205 TEST_ASSERT(original.ticket_alpn != NULL);
2206 TEST_ASSERT(restored.ticket_alpn != NULL);
2207 TEST_MEMORY_COMPARE(original.ticket_alpn, strlen(original.ticket_alpn),
2208 restored.ticket_alpn, strlen(restored.ticket_alpn));
Ronald Cron81963692024-03-26 10:15:08 +01002209#endif
2210#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Waleed Elmelegy2824a202024-02-23 17:51:47 +00002211 }
Ronald Cron81963692024-03-26 10:15:08 +01002212#endif /* MBEDTLS_SSL_SRV_C */
Jerry Yu34e95162022-12-12 15:14:56 +08002213
Ronald Cron81963692024-03-26 10:15:08 +01002214#if defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002215 if (endpoint_type == MBEDTLS_SSL_IS_CLIENT) {
Ronald Cron81963692024-03-26 10:15:08 +01002216#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yu6ac7c032022-07-21 23:11:55 +08002217#if defined(MBEDTLS_HAVE_TIME)
Jerry Yu342a5552023-11-10 14:23:39 +08002218 TEST_ASSERT(original.ticket_reception_time == restored.ticket_reception_time);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002219#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002220 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
2221 TEST_ASSERT(original.ticket_len == restored.ticket_len);
2222 if (original.ticket_len != 0) {
2223 TEST_ASSERT(original.ticket != NULL);
2224 TEST_ASSERT(restored.ticket != NULL);
2225 TEST_ASSERT(memcmp(original.ticket,
2226 restored.ticket,
2227 original.ticket_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002228 }
Ronald Cron346b8182024-03-27 09:30:13 +01002229#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2230 TEST_ASSERT(original.hostname != NULL);
2231 TEST_ASSERT(restored.hostname != NULL);
2232 TEST_MEMORY_COMPARE(original.hostname, strlen(original.hostname),
2233 restored.hostname, strlen(restored.hostname));
2234#endif
Ronald Cron81963692024-03-26 10:15:08 +01002235#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu6ac7c032022-07-21 23:11:55 +08002236 }
Ronald Cron81963692024-03-26 10:15:08 +01002237#endif /* MBEDTLS_SSL_CLI_C */
Jerry Yu6ac7c032022-07-21 23:11:55 +08002238 }
2239#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002240
Ronald Cron81963692024-03-26 10:15:08 +01002241#if defined(MBEDTLS_SSL_EARLY_DATA)
2242 TEST_ASSERT(
2243 original.max_early_data_size == restored.max_early_data_size);
2244#endif
2245
Waleed Elmelegy049cd302023-12-20 17:28:31 +00002246#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
2247 TEST_ASSERT(original.record_size_limit == restored.record_size_limit);
2248#endif
2249
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002250exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002251 mbedtls_ssl_session_free(&original);
2252 mbedtls_ssl_session_free(&restored);
2253 mbedtls_free(buf);
Valerio Setti285dae82023-04-19 15:10:45 +02002254 USE_PSA_DONE();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002255}
2256/* END_CASE */
2257
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02002258/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002259void ssl_serialize_session_load_save(int ticket_len, char *crt_file,
2260 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002261{
2262 mbedtls_ssl_session session;
2263 unsigned char *buf1 = NULL, *buf2 = NULL;
2264 size_t len0, len1, len2;
2265
2266 /*
2267 * Test that a load-save pair is the identity
2268 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002269 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002270 USE_PSA_INIT();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002271
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002272 /* Prepare a dummy session to work on */
Jerry Yu28547c42023-10-31 14:42:50 +08002273 ((void) ticket_len);
2274 ((void) crt_file);
Jerry Yuaa5dc242023-11-20 18:07:54 +08002275
2276 switch (tls_version) {
Jerry Yua180f992022-07-15 12:52:54 +08002277#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yuaa5dc242023-11-20 18:07:54 +08002278 case MBEDTLS_SSL_VERSION_TLS1_3:
2279 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2280 &session, 0, endpoint_type) == 0);
2281 break;
Jerry Yua180f992022-07-15 12:52:54 +08002282#endif
Jerry Yu28547c42023-10-31 14:42:50 +08002283
2284#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuaa5dc242023-11-20 18:07:54 +08002285 case MBEDTLS_SSL_VERSION_TLS1_2:
2286 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002287 &session, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yuaa5dc242023-11-20 18:07:54 +08002288 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002289#endif
Jerry Yuaa5dc242023-11-20 18:07:54 +08002290 default:
2291 /* should never happen */
2292 TEST_ASSERT(0);
2293 break;
2294 }
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002295
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002296 /* Get desired buffer size for serializing */
Gilles Peskine449bd832023-01-11 14:50:10 +01002297 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
2298 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002299
2300 /* Allocate first buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002301 buf1 = mbedtls_calloc(1, len0);
2302 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002303
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002304 /* Serialize to buffer and free live session */
Gilles Peskine449bd832023-01-11 14:50:10 +01002305 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
2306 == 0);
2307 TEST_ASSERT(len0 == len1);
2308 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002309
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002310 /* Restore session from serialized data */
Gilles Peskine449bd832023-01-11 14:50:10 +01002311 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002312
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002313 /* Allocate second buffer and serialize to it */
Gilles Peskine449bd832023-01-11 14:50:10 +01002314 buf2 = mbedtls_calloc(1, len0);
2315 TEST_ASSERT(buf2 != NULL);
2316 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
2317 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002318
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002319 /* Make sure both serialized versions are identical */
Gilles Peskine449bd832023-01-11 14:50:10 +01002320 TEST_ASSERT(len1 == len2);
2321 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002322
2323exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002324 mbedtls_ssl_session_free(&session);
2325 mbedtls_free(buf1);
2326 mbedtls_free(buf2);
Valerio Setti285dae82023-04-19 15:10:45 +02002327 USE_PSA_DONE();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002328}
2329/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002330
2331/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002332void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file,
2333 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002334{
2335 mbedtls_ssl_session session;
2336 unsigned char *buf = NULL;
2337 size_t good_len, bad_len, test_len;
2338
2339 /*
2340 * Test that session_save() fails cleanly on small buffers
2341 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002342 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002343 USE_PSA_INIT();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002344
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002345 /* Prepare dummy session and get serialized size */
Jerry Yu28547c42023-10-31 14:42:50 +08002346 ((void) ticket_len);
2347 ((void) crt_file);
Jerry Yu28547c42023-10-31 14:42:50 +08002348
Jerry Yud84c14f2023-11-16 13:33:57 +08002349 switch (tls_version) {
2350#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2351 case MBEDTLS_SSL_VERSION_TLS1_3:
2352 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2353 &session, 0, endpoint_type) == 0);
2354 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002355#endif
Jerry Yud84c14f2023-11-16 13:33:57 +08002356#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2357 case MBEDTLS_SSL_VERSION_TLS1_2:
2358 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002359 &session, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yud84c14f2023-11-16 13:33:57 +08002360 break;
2361#endif
2362 default:
2363 /* should never happen */
2364 TEST_ASSERT(0);
2365 break;
2366 }
Jerry Yu28547c42023-10-31 14:42:50 +08002367
Gilles Peskine449bd832023-01-11 14:50:10 +01002368 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2369 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002370
2371 /* Try all possible bad lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +01002372 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002373 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine449bd832023-01-11 14:50:10 +01002374 mbedtls_free(buf);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002375 buf = NULL;
2376 TEST_CALLOC(buf, bad_len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002377 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
2378 &test_len)
2379 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2380 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002381 }
2382
2383exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002384 mbedtls_ssl_session_free(&session);
2385 mbedtls_free(buf);
Valerio Setti285dae82023-04-19 15:10:45 +02002386 USE_PSA_DONE();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002387}
2388/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002389
2390/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002391void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file,
2392 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002393{
2394 mbedtls_ssl_session session;
2395 unsigned char *good_buf = NULL, *bad_buf = NULL;
2396 size_t good_len, bad_len;
2397
2398 /*
2399 * Test that session_load() fails cleanly on small buffers
2400 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002401 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002402 USE_PSA_INIT();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002403
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002404 /* Prepare serialized session data */
Jerry Yu28547c42023-10-31 14:42:50 +08002405 ((void) ticket_len);
2406 ((void) crt_file);
Jerry Yu4ac648e2023-11-16 13:58:38 +08002407
2408 switch (tls_version) {
Jerry Yu6e8fec22022-07-15 10:37:02 +08002409#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu4ac648e2023-11-16 13:58:38 +08002410 case MBEDTLS_SSL_VERSION_TLS1_3:
2411 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2412 &session, 0, endpoint_type) == 0);
2413 break;
Jerry Yu6e8fec22022-07-15 10:37:02 +08002414#endif
Jerry Yu28547c42023-10-31 14:42:50 +08002415
2416#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yu4ac648e2023-11-16 13:58:38 +08002417 case MBEDTLS_SSL_VERSION_TLS1_2:
2418 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002419 &session, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yu4ac648e2023-11-16 13:58:38 +08002420 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002421#endif
2422
Jerry Yu4ac648e2023-11-16 13:58:38 +08002423 default:
2424 /* should never happen */
2425 TEST_ASSERT(0);
2426 break;
2427 }
2428
Gilles Peskine449bd832023-01-11 14:50:10 +01002429 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2430 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002431 TEST_CALLOC(good_buf, good_len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002432 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
2433 &good_len) == 0);
2434 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002435
2436 /* Try all possible bad lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002438 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine449bd832023-01-11 14:50:10 +01002439 mbedtls_free(bad_buf);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002440 bad_buf = NULL;
2441 TEST_CALLOC_NONNULL(bad_buf, bad_len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002442 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002443
Gilles Peskine449bd832023-01-11 14:50:10 +01002444 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
2445 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002446 }
2447
2448exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002449 mbedtls_ssl_session_free(&session);
2450 mbedtls_free(good_buf);
2451 mbedtls_free(bad_buf);
Valerio Setti285dae82023-04-19 15:10:45 +02002452 USE_PSA_DONE();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002453}
2454/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002455
Hanno Becker363b6462019-05-29 12:44:28 +01002456/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002457void ssl_session_serialize_version_check(int corrupt_major,
2458 int corrupt_minor,
2459 int corrupt_patch,
2460 int corrupt_config,
2461 int endpoint_type,
2462 int tls_version)
Hanno Becker861d0bb2019-05-21 16:39:30 +01002463{
Gilles Peskine449bd832023-01-11 14:50:10 +01002464 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01002465 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002466 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002467 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002468 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2469 corrupt_minor == 1,
2470 corrupt_patch == 1,
2471 corrupt_config == 1,
2472 corrupt_config == 1 };
2473
Gilles Peskine449bd832023-01-11 14:50:10 +01002474 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002475 USE_PSA_INIT();
Jerry Yu534ff402022-07-14 16:43:43 +08002476
Jerry Yud84c14f2023-11-16 13:33:57 +08002477 switch (tls_version) {
2478#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2479 case MBEDTLS_SSL_VERSION_TLS1_3:
2480 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2481 &session, 0, endpoint_type) == 0);
2482 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002483#endif
Jerry Yud84c14f2023-11-16 13:33:57 +08002484#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2485 case MBEDTLS_SSL_VERSION_TLS1_2:
2486 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002487 &session, 0, endpoint_type, NULL) == 0);
Jerry Yu4ac648e2023-11-16 13:58:38 +08002488
Jerry Yud84c14f2023-11-16 13:33:57 +08002489 break;
2490#endif
2491 default:
2492 /* should never happen */
2493 TEST_ASSERT(0);
2494 break;
2495 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002496
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002497 /* Infer length of serialized session. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002498 TEST_ASSERT(mbedtls_ssl_session_save(&session,
2499 serialized_session,
2500 sizeof(serialized_session),
2501 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002502
Gilles Peskine449bd832023-01-11 14:50:10 +01002503 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002504
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002505 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002506 * de-serialize the session - double-check that. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002507 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2508 serialized_session,
2509 serialized_session_len) == 0);
2510 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002511
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002512 /* Go through the bytes in the serialized session header and
2513 * corrupt them bit-by-bit. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002514 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002515 int cur_bit;
BensonLioubedd2512024-03-13 20:21:26 +08002516 unsigned char *const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002517
Gilles Peskine449bd832023-01-11 14:50:10 +01002518 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002519 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002520 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002521
Gilles Peskine449bd832023-01-11 14:50:10 +01002522 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002523 unsigned char const corrupted_bit = 0x1u << cur_bit;
2524 /* Modify a single bit in the serialized session. */
2525 *byte ^= corrupted_bit;
2526
2527 /* Attempt to deserialize */
Gilles Peskine449bd832023-01-11 14:50:10 +01002528 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2529 serialized_session,
2530 serialized_session_len) ==
2531 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002532
2533 /* Undo the change */
2534 *byte ^= corrupted_bit;
2535 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002536 }
valerio32f2ac92023-04-20 11:59:52 +02002537exit:
Valerio Setti285dae82023-04-19 15:10:45 +02002538 USE_PSA_DONE();
Hanno Becker861d0bb2019-05-21 16:39:30 +01002539}
2540/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002541
Minos Galanakis411cb6c2024-03-04 17:33:52 +00002542/* BEGIN_CASE */
2543void ssl_session_id_accessors_check(int tls_version)
2544{
2545 mbedtls_ssl_session session;
2546 int ciphersuite_id;
2547 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2548
2549 mbedtls_ssl_session_init(&session);
2550 USE_PSA_INIT();
2551
2552 switch (tls_version) {
2553#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2554 case MBEDTLS_SSL_VERSION_TLS1_3:
2555 ciphersuite_id = MBEDTLS_TLS1_3_AES_128_GCM_SHA256;
2556 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2557 &session, 0, MBEDTLS_SSL_IS_SERVER) == 0);
2558 break;
2559#endif
2560#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2561 case MBEDTLS_SSL_VERSION_TLS1_2:
2562 ciphersuite_id = MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256;
2563 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
2564 &session, 0, MBEDTLS_SSL_IS_SERVER, NULL) == 0);
2565
2566 break;
2567#endif
2568 default:
2569 /* should never happen */
2570 TEST_ASSERT(0);
2571 break;
2572 }
2573 TEST_ASSERT(*mbedtls_ssl_session_get_id(&session) == session.id);
2574 TEST_ASSERT(mbedtls_ssl_session_get_id_len(&session) == session.id_len);
2575 /* mbedtls_test_ssl_tls1x_populate_session sets a mock suite-id of 0xabcd */
2576 TEST_ASSERT(mbedtls_ssl_session_get_ciphersuite_id(&session) == 0xabcd);
2577
2578 /* Test setting a reference id for tls1.3 and tls1.2 */
2579 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite_id);
2580 if (ciphersuite_info != NULL) {
2581 TEST_ASSERT(mbedtls_ssl_ciphersuite_get_id(ciphersuite_info) == ciphersuite_id);
2582 }
2583
2584exit:
2585 mbedtls_ssl_session_free(&session);
2586 USE_PSA_DONE();
2587}
2588/* END_CASE */
2589
Valerio Settidb6b4db2023-09-01 09:20:51 +02002590/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002591void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002592{
2593 enum { BUFFSIZE = 1024 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002594 mbedtls_test_ssl_endpoint ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002595 int ret = -1;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002596 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002597 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04002598 options.pk_alg = MBEDTLS_PK_RSA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002599
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002600 MD_OR_USE_PSA_INIT();
2601
Yanray Wangf7b62352022-10-26 11:51:53 +08002602 ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, &options,
Ronald Cronfb536472024-01-26 14:55:25 +01002603 NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01002604 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002605
Yanray Wangbd296832022-10-26 18:28:11 +08002606 ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, options.pk_alg,
2607 0, 0, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +01002608 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002609
Yanray Wangf7b62352022-10-26 11:51:53 +08002610 ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, &options,
Ronald Cronfb536472024-01-26 14:55:25 +01002611 NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01002612 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002613
2614exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002615 mbedtls_test_ssl_endpoint_free(&ep, NULL);
2616 mbedtls_test_free_handshake_options(&options);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002617 MD_OR_USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002618}
2619/* END_CASE */
2620
Valerio Settidb6b4db2023-09-01 09:20:51 +02002621/* 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 */
Ronald Cron43263c02023-03-09 16:48:10 +01002622void move_handshake_to_state(int endpoint_type, int tls_version, int state, int need_pass)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002623{
2624 enum { BUFFSIZE = 1024 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002625 mbedtls_test_ssl_endpoint base_ep, second_ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002626 int ret = -1;
Ronald Cron43263c02023-03-09 16:48:10 +01002627 (void) tls_version;
2628
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002629 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002630 mbedtls_test_init_handshake_options(&options);
Ronald Cron43263c02023-03-09 16:48:10 +01002631
Andrzej Kurek780dc182022-06-10 08:57:19 -04002632 options.pk_alg = MBEDTLS_PK_RSA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002633
Ronald Cron43263c02023-03-09 16:48:10 +01002634 /*
Ronald Cron097ba142023-03-08 16:18:00 +01002635 * If both TLS 1.2 and 1.3 are enabled and we want to do a TLS 1.2
2636 * handshake, force the TLS 1.2 version on endpoint under test.
Ronald Cron43263c02023-03-09 16:48:10 +01002637 */
2638#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Ronald Cron097ba142023-03-08 16:18:00 +01002639 if (MBEDTLS_SSL_VERSION_TLS1_2 == tls_version) {
2640 if (MBEDTLS_SSL_IS_CLIENT == endpoint_type) {
2641 options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2642 options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2643 } else {
2644 options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2645 options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2646 }
Ronald Cron43263c02023-03-09 16:48:10 +01002647 }
2648#endif
2649
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002650 MD_OR_USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +01002651 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
2652 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Neil Armstrong06baf042022-04-14 16:21:15 +02002653
Yanray Wangf7b62352022-10-26 11:51:53 +08002654 ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type, &options,
Ronald Cronfb536472024-01-26 14:55:25 +01002655 NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01002656 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002657
Yanray Wangbd296832022-10-26 18:28:11 +08002658 ret = mbedtls_test_ssl_endpoint_init(
2659 &second_ep,
2660 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
2661 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01002662 &options, NULL, NULL, NULL);
Andrzej Kurek780dc182022-06-10 08:57:19 -04002663
Gilles Peskine449bd832023-01-11 14:50:10 +01002664 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002665
Yanray Wangf7b62352022-10-26 11:51:53 +08002666 ret = mbedtls_test_mock_socket_connect(&(base_ep.socket),
2667 &(second_ep.socket),
2668 BUFFSIZE);
Gilles Peskine449bd832023-01-11 14:50:10 +01002669 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002670
Yanray Wangf7b62352022-10-26 11:51:53 +08002671 ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl),
2672 &(second_ep.ssl),
2673 state);
Gilles Peskine449bd832023-01-11 14:50:10 +01002674 if (need_pass) {
2675 TEST_ASSERT(ret == 0 ||
2676 ret == MBEDTLS_ERR_SSL_WANT_READ ||
2677 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
2678 TEST_ASSERT(base_ep.ssl.state == state);
2679 } else {
2680 TEST_ASSERT(ret != 0 &&
2681 ret != MBEDTLS_ERR_SSL_WANT_READ &&
2682 ret != MBEDTLS_ERR_SSL_WANT_WRITE);
2683 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002684 }
2685
2686exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002687 mbedtls_test_free_handshake_options(&options);
2688 mbedtls_test_ssl_endpoint_free(&base_ep, NULL);
2689 mbedtls_test_ssl_endpoint_free(&second_ep, NULL);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002690 MD_OR_USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002691}
2692/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002693
Valerio Settidb6b4db2023-09-01 09:20:51 +02002694/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002695void handshake_version(int dtls, int client_min_version, int client_max_version,
2696 int server_min_version, int server_max_version,
2697 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002698{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002699 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002700 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002701
Paul Elliottc8570442020-04-15 17:00:50 +01002702 options.client_min_version = client_min_version;
2703 options.client_max_version = client_max_version;
2704 options.server_min_version = server_min_version;
2705 options.server_max_version = server_max_version;
Paul Elliottc8570442020-04-15 17:00:50 +01002706 options.expected_negotiated_version = expected_negotiated_version;
2707
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002708 options.dtls = dtls;
Yanray Wangf7b62352022-10-26 11:51:53 +08002709 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002710
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002711 /* The goto below is used to avoid an "unused label" warning.*/
2712 goto exit;
Andrzej Kureke11acb22022-06-27 06:11:34 -04002713
2714exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002715 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002716}
2717/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05002718
Manuel Pégourié-Gonnardbef824d2023-03-17 12:50:01 +01002719/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002720void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002721{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002722 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002723 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002724
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002725 options.cipher = cipher;
2726 options.dtls = dtls;
2727 options.psk_str = psk_str;
2728 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05002729
Ronald Cron097ba142023-03-08 16:18:00 +01002730 options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2731 options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2732 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
2733
Yanray Wangf7b62352022-10-26 11:51:53 +08002734 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002735
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002736 /* The goto below is used to avoid an "unused label" warning.*/
2737 goto exit;
Andrzej Kureke11acb22022-06-27 06:11:34 -04002738
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04002739exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002740 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002741}
2742/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002743
Manuel Pégourié-Gonnardbef824d2023-03-17 12:50:01 +01002744/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002745void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002746{
Gilles Peskine449bd832023-01-11 14:50:10 +01002747 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002748
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002749 /* The goto below is used to avoid an "unused label" warning.*/
2750 goto exit;
2751}
2752/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002753
Manuel Pégourié-Gonnardbef824d2023-03-17 12:50:01 +01002754/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_MD_CAN_SHA256 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002755void handshake_ciphersuite_select(char *cipher, int pk_alg, data_t *psk_str,
2756 int psa_alg, int psa_alg2, int psa_usage,
2757 int expected_handshake_result,
2758 int expected_ciphersuite)
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002759{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002760 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002761 mbedtls_test_init_handshake_options(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002762
2763 options.cipher = cipher;
Neil Armstrongdb134972022-06-30 09:06:28 +02002764 options.psk_str = psk_str;
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002765 options.pk_alg = pk_alg;
2766 options.opaque_alg = psa_alg;
2767 options.opaque_alg2 = psa_alg2;
2768 options.opaque_usage = psa_usage;
2769 options.expected_handshake_result = expected_handshake_result;
2770 options.expected_ciphersuite = expected_ciphersuite;
Ronald Cron097ba142023-03-08 16:18:00 +01002771
2772 options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2773 options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2774 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
2775
Yanray Wangf7b62352022-10-26 11:51:53 +08002776 mbedtls_test_ssl_perform_handshake(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002777
2778 /* The goto below is used to avoid an "unused label" warning.*/
2779 goto exit;
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04002780
2781exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002782 mbedtls_test_free_handshake_options(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002783}
2784/* END_CASE */
2785
Valerio Settidb6b4db2023-09-01 09:20:51 +02002786/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_MD_CAN_SHA256 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002787void app_data(int mfl, int cli_msg_len, int srv_msg_len,
2788 int expected_cli_fragments,
2789 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002790{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002791 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002792 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002793
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002794 options.mfl = mfl;
2795 options.cli_msg_len = cli_msg_len;
2796 options.srv_msg_len = srv_msg_len;
2797 options.expected_cli_fragments = expected_cli_fragments;
2798 options.expected_srv_fragments = expected_srv_fragments;
2799 options.dtls = dtls;
Ronald Cron097ba142023-03-08 16:18:00 +01002800
2801 options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2802 options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2803 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002804
Yanray Wangf7b62352022-10-26 11:51:53 +08002805 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04002806
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002807 /* The goto below is used to avoid an "unused label" warning.*/
2808 goto exit;
Andrzej Kurek780dc182022-06-10 08:57:19 -04002809
2810exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002811 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002812}
2813/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002814
Valerio Settidb6b4db2023-09-01 09:20:51 +02002815/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002816void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
2817 int expected_cli_fragments,
2818 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002819{
Gilles Peskine449bd832023-01-11 14:50:10 +01002820 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2821 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002822 /* The goto below is used to avoid an "unused label" warning.*/
2823 goto exit;
2824}
2825/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002826
Valerio Settidb6b4db2023-09-01 09:20:51 +02002827/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002828void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
2829 int expected_cli_fragments,
2830 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002831{
Gilles Peskine449bd832023-01-11 14:50:10 +01002832 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2833 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002834 /* The goto below is used to avoid an "unused label" warning.*/
2835 goto exit;
2836}
2837/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002838
Valerio Settidb6b4db2023-09-01 09:20:51 +02002839/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002840void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002841{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002842 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002843 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002844
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002845 options.serialize = 1;
2846 options.dtls = 1;
Ronald Cron097ba142023-03-08 16:18:00 +01002847 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Yanray Wangf7b62352022-10-26 11:51:53 +08002848 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002849 /* The goto below is used to avoid an "unused label" warning.*/
2850 goto exit;
Andrzej Kurek6e518ab2022-06-11 05:08:38 -04002851exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002852 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002853}
2854/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002855
Valerio Settie94ab3c2025-01-20 11:07:09 +01002856/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_SSL_HAVE_AES:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_SSL_HAVE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +01002857void handshake_fragmentation(int mfl,
2858 int expected_srv_hs_fragmentation,
Valerio Settie94ab3c2025-01-20 11:07:09 +01002859 int expected_cli_hs_fragmentation,
2860 char *ciphersuite)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002861{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002862 mbedtls_test_handshake_test_options options;
2863 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002864
2865 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
2866 srv_pattern.counter = 0;
2867 cli_pattern.counter = 0;
2868
Yanray Wangf7b62352022-10-26 11:51:53 +08002869 mbedtls_test_init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002870 options.dtls = 1;
Ronald Cron097ba142023-03-08 16:18:00 +01002871 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002872 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00002873 /* Set cipher to one using CBC so that record splitting can be tested */
Valerio Settie94ab3c2025-01-20 11:07:09 +01002874 options.cipher = ciphersuite;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002875 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
2876 options.srv_log_obj = &srv_pattern;
2877 options.cli_log_obj = &cli_pattern;
Yanray Wangf7b62352022-10-26 11:51:53 +08002878 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
2879 options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002880
Yanray Wangf7b62352022-10-26 11:51:53 +08002881 mbedtls_test_ssl_perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002882
2883 /* Test if the server received a fragmented handshake */
Gilles Peskine449bd832023-01-11 14:50:10 +01002884 if (expected_srv_hs_fragmentation) {
2885 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002886 }
2887 /* Test if the client received a fragmented handshake */
Gilles Peskine449bd832023-01-11 14:50:10 +01002888 if (expected_cli_hs_fragmentation) {
2889 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002890 }
Andrzej Kurek780dc182022-06-10 08:57:19 -04002891
2892exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002893 mbedtls_test_free_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002894}
2895/* END_CASE */
2896
Gilles Peskine39bcbb62025-03-07 20:40:50 +01002897/* BEGIN_CASE */
2898void recombine_server_first_flight(int version,
2899 int instruction, int param,
2900 char *client_log, char *server_log,
2901 int goal_state, int expected_ret)
2902{
2903 enum { BUFFSIZE = 17000 };
2904 mbedtls_test_ssl_endpoint client = { 0 };
2905 mbedtls_test_ssl_endpoint server = { 0 };
2906 mbedtls_test_handshake_test_options client_options;
2907 mbedtls_test_init_handshake_options(&client_options);
2908 mbedtls_test_handshake_test_options server_options;
2909 mbedtls_test_init_handshake_options(&server_options);
2910#if defined(MBEDTLS_DEBUG_C)
2911 mbedtls_test_ssl_log_pattern cli_pattern = { .pattern = client_log };
2912 mbedtls_test_ssl_log_pattern srv_pattern = { .pattern = server_log };
2913#endif
2914 int ret = 0;
2915
2916 MD_OR_USE_PSA_INIT();
2917#if defined(MBEDTLS_DEBUG_C)
2918 mbedtls_debug_set_threshold(3);
2919#endif
2920
2921 client_options.client_min_version = version;
2922 client_options.client_max_version = version;
2923#if defined(MBEDTLS_DEBUG_C)
2924 client_options.cli_log_obj = &cli_pattern;
2925 client_options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
2926#else
2927 (void) cli_pattern;
2928#endif
2929 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
2930 &client_options, NULL, NULL,
2931 NULL), 0);
2932#if defined(MBEDTLS_DEBUG_C)
2933 mbedtls_ssl_conf_dbg(&client.conf, client_options.cli_log_fun,
2934 client_options.cli_log_obj);
2935#endif
2936
2937 server_options.server_min_version = version;
2938 server_options.server_max_version = version;
2939#if defined(MBEDTLS_DEBUG_C)
2940 server_options.srv_log_obj = &srv_pattern;
2941 server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
2942#else
2943 (void) srv_pattern;
2944#endif
2945 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
2946 &server_options, NULL, NULL,
2947 NULL), 0);
2948#if defined(MBEDTLS_DEBUG_C)
2949 mbedtls_ssl_conf_dbg(&server.conf, server_options.srv_log_fun,
2950 server_options.srv_log_obj);
2951#endif
2952
2953 TEST_EQUAL(mbedtls_test_mock_socket_connect(&client.socket,
2954 &server.socket,
2955 BUFFSIZE), 0);
2956
2957 /* Client: emit the first flight from the client */
2958 while (ret == 0) {
2959 mbedtls_test_set_step(client.ssl.state);
2960 ret = mbedtls_ssl_handshake_step(&client.ssl);
2961 }
2962 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
2963 ret = 0;
2964 TEST_EQUAL(client.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
2965
2966 /* Server: parse the first flight from the client
2967 * and emit the first flight from the server */
2968 while (ret == 0) {
2969 mbedtls_test_set_step(1000 + server.ssl.state);
2970 ret = mbedtls_ssl_handshake_step(&server.ssl);
2971 }
2972 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
2973 ret = 0;
2974 TEST_EQUAL(server.ssl.state, MBEDTLS_SSL_SERVER_HELLO_DONE + 1);
2975
2976 /* Recombine the first flight from the server */
2977 TEST_ASSERT(recombine_records(&server, instruction, param));
2978
2979 /* Client: parse the first flight from the server
2980 * and emit the second flight from the client */
2981 while (ret == 0 && !mbedtls_ssl_is_handshake_over(&client.ssl)) {
2982 mbedtls_test_set_step(client.ssl.state);
2983 ret = mbedtls_ssl_handshake_step(&client.ssl);
2984 if (client.ssl.state == goal_state && ret != 0) {
2985 TEST_EQUAL(ret, expected_ret);
2986 goto goal_reached;
2987 }
2988 }
2989#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2990 if (version >= MBEDTLS_SSL_VERSION_TLS1_3 &&
2991 goal_state >= MBEDTLS_SSL_HANDSHAKE_OVER) {
2992 TEST_EQUAL(ret, 0);
2993 } else
2994#endif
2995 {
2996 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
2997 }
2998 ret = 0;
2999
3000 /* Server: parse the first flight from the client
3001 * and emit the second flight from the server */
3002 while (ret == 0 && !mbedtls_ssl_is_handshake_over(&server.ssl)) {
3003 mbedtls_test_set_step(1000 + server.ssl.state);
3004 ret = mbedtls_ssl_handshake_step(&server.ssl);
3005 }
3006 TEST_EQUAL(ret, 0);
3007
3008 /* Client: parse the second flight from the server */
3009 while (ret == 0 && !mbedtls_ssl_is_handshake_over(&client.ssl)) {
3010 mbedtls_test_set_step(client.ssl.state);
3011 ret = mbedtls_ssl_handshake_step(&client.ssl);
3012 }
3013 if (client.ssl.state == goal_state) {
3014 TEST_EQUAL(ret, expected_ret);
3015 } else {
3016 TEST_EQUAL(ret, 0);
3017 }
3018
3019goal_reached:
3020#if defined(MBEDTLS_DEBUG_C)
3021 TEST_ASSERT(cli_pattern.counter >= 1);
3022 TEST_ASSERT(srv_pattern.counter >= 1);
3023#endif
3024
3025exit:
3026 mbedtls_test_ssl_endpoint_free(&client, NULL);
3027 mbedtls_test_ssl_endpoint_free(&server, NULL);
3028 mbedtls_test_free_handshake_options(&client_options);
3029 mbedtls_test_free_handshake_options(&server_options);
3030 MD_OR_USE_PSA_DONE();
3031#if defined(MBEDTLS_DEBUG_C)
3032 mbedtls_debug_set_threshold(0);
3033#endif
3034}
3035/* END_CASE */
3036
Valerio Settidb6b4db2023-09-01 09:20:51 +02003037/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003038void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003039{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003040 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08003041 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003042
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003043 options.renegotiate = 1;
3044 options.legacy_renegotiation = legacy_renegotiation;
3045 options.dtls = 1;
Ronald Cron097ba142023-03-08 16:18:00 +01003046 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003047
Yanray Wangf7b62352022-10-26 11:51:53 +08003048 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04003049
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003050 /* The goto below is used to avoid an "unused label" warning.*/
3051 goto exit;
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04003052exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003053 mbedtls_test_free_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003054}
3055/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003056
Valerio Settidb6b4db2023-09-01 09:20:51 +02003057/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003058void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
3059 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003060{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003061 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08003062 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003063
3064 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003065 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003066 options.renegotiate = renegotiation;
3067 options.legacy_renegotiation = legacy_renegotiation;
3068 options.serialize = serialize;
3069 options.dtls = dtls;
Ronald Cron097ba142023-03-08 16:18:00 +01003070 if (dtls) {
3071 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
3072 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003073 options.resize_buffers = 1;
3074
Yanray Wangf7b62352022-10-26 11:51:53 +08003075 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04003076
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003077 /* The goto below is used to avoid an "unused label" warning.*/
3078 goto exit;
Andrzej Kurek780dc182022-06-10 08:57:19 -04003079exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003080 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003081}
3082/* END_CASE */
3083
Valerio Settidb6b4db2023-09-01 09:20:51 +02003084/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003085void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003086{
Gilles Peskine449bd832023-01-11 14:50:10 +01003087 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
3088 (char *) "");
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003089 /* The goto below is used to avoid an "unused label" warning.*/
3090 goto exit;
3091}
3092/* END_CASE */
3093
Valerio Settidb6b4db2023-09-01 09:20:51 +02003094/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003095void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
3096 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003097{
Gilles Peskine449bd832023-01-11 14:50:10 +01003098 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003099 /* The goto below is used to avoid an "unused label" warning.*/
3100 goto exit;
3101}
3102/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02003103
Ronald Cron73fe8df2022-10-05 14:31:43 +02003104/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
Hanno Becker6667ffd2021-04-19 21:59:22 +01003105void test_multiple_psks()
3106{
3107 unsigned char psk0[10] = { 0 };
3108 unsigned char psk0_identity[] = { 'f', 'o', 'o' };
3109
3110 unsigned char psk1[10] = { 0 };
3111 unsigned char psk1_identity[] = { 'b', 'a', 'r' };
3112
3113 mbedtls_ssl_config conf;
3114
Gilles Peskine449bd832023-01-11 14:50:10 +01003115 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003116 MD_OR_USE_PSA_INIT();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003117
Gilles Peskine449bd832023-01-11 14:50:10 +01003118 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3119 psk0, sizeof(psk0),
3120 psk0_identity, sizeof(psk0_identity)) == 0);
3121 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3122 psk1, sizeof(psk1),
3123 psk1_identity, sizeof(psk1_identity)) ==
3124 MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003125
3126exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003127 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003128 MD_OR_USE_PSA_DONE();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003129}
3130/* END_CASE */
3131
Ronald Cron73fe8df2022-10-05 14:31:43 +02003132/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED:MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003133void test_multiple_psks_opaque(int mode)
Hanno Becker6667ffd2021-04-19 21:59:22 +01003134{
3135 /*
3136 * Mode 0: Raw PSK, then opaque PSK
3137 * Mode 1: Opaque PSK, then raw PSK
3138 * Mode 2: 2x opaque PSK
3139 */
3140
3141 unsigned char psk0_raw[10] = { 0 };
3142 unsigned char psk0_raw_identity[] = { 'f', 'o', 'o' };
3143
Gilles Peskine449bd832023-01-11 14:50:10 +01003144 mbedtls_svc_key_id_t psk0_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 1);
Andrzej Kurek03e01462022-01-03 12:53:24 +01003145
Hanno Becker6667ffd2021-04-19 21:59:22 +01003146 unsigned char psk0_opaque_identity[] = { 'f', 'o', 'o' };
3147
3148 unsigned char psk1_raw[10] = { 0 };
3149 unsigned char psk1_raw_identity[] = { 'b', 'a', 'r' };
3150
Gilles Peskine449bd832023-01-11 14:50:10 +01003151 mbedtls_svc_key_id_t psk1_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 2);
Andrzej Kurek03e01462022-01-03 12:53:24 +01003152
Hanno Becker6667ffd2021-04-19 21:59:22 +01003153 unsigned char psk1_opaque_identity[] = { 'b', 'a', 'r' };
3154
3155 mbedtls_ssl_config conf;
3156
Gilles Peskine449bd832023-01-11 14:50:10 +01003157 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003158 MD_OR_USE_PSA_INIT();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003159
Gilles Peskine449bd832023-01-11 14:50:10 +01003160 switch (mode) {
Hanno Becker6667ffd2021-04-19 21:59:22 +01003161 case 0:
3162
Gilles Peskine449bd832023-01-11 14:50:10 +01003163 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3164 psk0_raw, sizeof(psk0_raw),
3165 psk0_raw_identity, sizeof(psk0_raw_identity))
3166 == 0);
3167 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3168 psk1_opaque,
3169 psk1_opaque_identity,
3170 sizeof(psk1_opaque_identity))
3171 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003172 break;
3173
3174 case 1:
3175
Gilles Peskine449bd832023-01-11 14:50:10 +01003176 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3177 psk0_opaque,
3178 psk0_opaque_identity,
3179 sizeof(psk0_opaque_identity))
3180 == 0);
3181 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3182 psk1_raw, sizeof(psk1_raw),
3183 psk1_raw_identity, sizeof(psk1_raw_identity))
3184 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003185
3186 break;
3187
3188 case 2:
3189
Gilles Peskine449bd832023-01-11 14:50:10 +01003190 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3191 psk0_opaque,
3192 psk0_opaque_identity,
3193 sizeof(psk0_opaque_identity))
3194 == 0);
3195 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3196 psk1_opaque,
3197 psk1_opaque_identity,
3198 sizeof(psk1_opaque_identity))
3199 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003200
3201 break;
3202
3203 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003204 TEST_ASSERT(0);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003205 break;
3206 }
3207
3208exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003209 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003210 MD_OR_USE_PSA_DONE();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003211
3212}
3213/* END_CASE */
Brett Warren7f813d52021-10-20 23:08:38 +01003214
Ronald Cron37bdaab2022-03-30 16:45:51 +02003215/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003216void conf_version(int endpoint, int transport,
3217 int min_tls_version, int max_tls_version,
3218 int expected_ssl_setup_result)
Ronald Cron37bdaab2022-03-30 16:45:51 +02003219{
3220 mbedtls_ssl_config conf;
3221 mbedtls_ssl_context ssl;
3222
Gilles Peskine449bd832023-01-11 14:50:10 +01003223 mbedtls_ssl_config_init(&conf);
3224 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003225 MD_OR_USE_PSA_INIT();
Ronald Cron37bdaab2022-03-30 16:45:51 +02003226
Gilles Peskine449bd832023-01-11 14:50:10 +01003227 mbedtls_ssl_conf_endpoint(&conf, endpoint);
3228 mbedtls_ssl_conf_transport(&conf, transport);
3229 mbedtls_ssl_conf_min_tls_version(&conf, min_tls_version);
3230 mbedtls_ssl_conf_max_tls_version(&conf, max_tls_version);
Ronald Cron10b040f2024-02-05 09:38:09 +01003231 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Ronald Cron37bdaab2022-03-30 16:45:51 +02003232
Gilles Peskine449bd832023-01-11 14:50:10 +01003233 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == expected_ssl_setup_result);
Pengyu Lvdb614332023-07-10 10:56:54 +08003234 TEST_EQUAL(mbedtls_ssl_conf_get_endpoint(
3235 mbedtls_ssl_context_get_config(&ssl)), endpoint);
Ronald Cron37bdaab2022-03-30 16:45:51 +02003236
Gilles Peskine449bd832023-01-11 14:50:10 +01003237 mbedtls_ssl_free(&ssl);
3238 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003239
3240exit:
3241 MD_OR_USE_PSA_DONE();
Ronald Cron37bdaab2022-03-30 16:45:51 +02003242}
3243/* END_CASE */
3244
Manuel Pégourié-Gonnardf07ce3b2023-09-22 11:53:41 +02003245/* 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 */
Brett Warren7f813d52021-10-20 23:08:38 +01003246void conf_curve()
3247{
3248
3249 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP192R1,
3250 MBEDTLS_ECP_DP_SECP224R1,
3251 MBEDTLS_ECP_DP_SECP256R1,
3252 MBEDTLS_ECP_DP_NONE };
Tom Cosgrovea327b522022-08-03 08:33:06 +01003253 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
3254 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
3255 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
3256 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Brett Warren7f813d52021-10-20 23:08:38 +01003257
3258 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01003259 mbedtls_ssl_config_init(&conf);
Jerry Yubaa49342022-02-15 10:26:40 +08003260#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskine449bd832023-01-11 14:50:10 +01003261 mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
3262 mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
Jerry Yubaa49342022-02-15 10:26:40 +08003263#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003264 mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
3265 mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
Jerry Yubaa49342022-02-15 10:26:40 +08003266#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003267 mbedtls_ssl_conf_curves(&conf, curve_list);
Brett Warren7f813d52021-10-20 23:08:38 +01003268
3269 mbedtls_ssl_context ssl;
Gilles Peskine449bd832023-01-11 14:50:10 +01003270 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003271 MD_OR_USE_PSA_INIT();
3272
Ronald Cron10b040f2024-02-05 09:38:09 +01003273 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Yanray Wangd6128e92023-12-01 17:08:56 +08003274
Gilles Peskine449bd832023-01-11 14:50:10 +01003275 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Brett Warren7f813d52021-10-20 23:08:38 +01003276
Gilles Peskine449bd832023-01-11 14:50:10 +01003277 TEST_ASSERT(ssl.handshake != NULL && ssl.handshake->group_list != NULL);
3278 TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list == NULL);
Brett Warren7f813d52021-10-20 23:08:38 +01003279
Yanray Wangd577a682022-10-27 11:47:54 +08003280 TEST_EQUAL(ssl.handshake->
3281 group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
Gilles Peskine449bd832023-01-11 14:50:10 +01003282 MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
Brett Warren7f813d52021-10-20 23:08:38 +01003283
Gilles Peskine449bd832023-01-11 14:50:10 +01003284 for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
3285 TEST_EQUAL(iana_tls_group_list[i], ssl.handshake->group_list[i]);
3286 }
Brett Warren7f813d52021-10-20 23:08:38 +01003287
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003288exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003289 mbedtls_ssl_free(&ssl);
3290 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003291 MD_OR_USE_PSA_DONE();
Brett Warren7f813d52021-10-20 23:08:38 +01003292}
3293/* END_CASE */
3294
Manuel Pégourié-Gonnard632667e2025-01-14 12:25:52 +01003295/* BEGIN_CASE */
Brett Warren7f813d52021-10-20 23:08:38 +01003296void conf_group()
3297{
3298 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
Gilles Peskine449bd832023-01-11 14:50:10 +01003299 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
3300 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
3301 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Brett Warren7f813d52021-10-20 23:08:38 +01003302
3303 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01003304 mbedtls_ssl_config_init(&conf);
Brett Warren7f813d52021-10-20 23:08:38 +01003305
Ronald Cron10b040f2024-02-05 09:38:09 +01003306 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Manuel Pégourié-Gonnardea18c7e2025-01-22 10:04:43 +01003307 mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,
3308 MBEDTLS_SSL_TRANSPORT_STREAM,
3309 MBEDTLS_SSL_PRESET_DEFAULT);
Brett Warren7f813d52021-10-20 23:08:38 +01003310
Gilles Peskine449bd832023-01-11 14:50:10 +01003311 mbedtls_ssl_conf_groups(&conf, iana_tls_group_list);
Brett Warren7f813d52021-10-20 23:08:38 +01003312
3313 mbedtls_ssl_context ssl;
Gilles Peskine449bd832023-01-11 14:50:10 +01003314 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003315 MD_OR_USE_PSA_INIT();
3316
Gilles Peskine449bd832023-01-11 14:50:10 +01003317 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Brett Warren7f813d52021-10-20 23:08:38 +01003318
Gilles Peskine449bd832023-01-11 14:50:10 +01003319 TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list != NULL);
Brett Warren7f813d52021-10-20 23:08:38 +01003320
Yanray Wangd577a682022-10-27 11:47:54 +08003321 TEST_EQUAL(ssl.conf->
3322 group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
Gilles Peskine449bd832023-01-11 14:50:10 +01003323 MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
Brett Warren7f813d52021-10-20 23:08:38 +01003324
Gilles Peskine449bd832023-01-11 14:50:10 +01003325 for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
3326 TEST_EQUAL(iana_tls_group_list[i], ssl.conf->group_list[i]);
3327 }
Brett Warren7f813d52021-10-20 23:08:38 +01003328
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003329exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003330 mbedtls_ssl_free(&ssl);
3331 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003332 MD_OR_USE_PSA_DONE();
Brett Warren7f813d52021-10-20 23:08:38 +01003333}
3334/* END_CASE */
Paul Elliottb9af2db2022-03-09 15:34:37 +00003335
Valerio Settidb6b4db2023-09-01 09:20:51 +02003336/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003337void force_bad_session_id_len()
Andrzej Kurek514683a2022-06-10 10:33:05 -04003338{
3339 enum { BUFFSIZE = 1024 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003340 mbedtls_test_handshake_test_options options;
3341 mbedtls_test_ssl_endpoint client, server;
3342 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Andrzej Kurek514683a2022-06-10 10:33:05 -04003343 mbedtls_test_message_socket_context server_context, client_context;
3344
3345 srv_pattern.pattern = cli_pattern.pattern = "cache did not store session";
3346 srv_pattern.counter = 0;
Yanray Wangf7b62352022-10-26 11:51:53 +08003347 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003348
3349 options.srv_log_obj = &srv_pattern;
Yanray Wangf7b62352022-10-26 11:51:53 +08003350 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
Andrzej Kurek514683a2022-06-10 10:33:05 -04003351
Gilles Peskine449bd832023-01-11 14:50:10 +01003352 mbedtls_platform_zeroize(&client, sizeof(client));
3353 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurek514683a2022-06-10 10:33:05 -04003354
Yanray Wangf7b62352022-10-26 11:51:53 +08003355 mbedtls_test_message_socket_init(&server_context);
3356 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02003357 MD_OR_USE_PSA_INIT();
Andrzej Kurek514683a2022-06-10 10:33:05 -04003358
Yanray Wangf7b62352022-10-26 11:51:53 +08003359 TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
3360 &options, NULL, NULL,
Ronald Cronfb536472024-01-26 14:55:25 +01003361 NULL) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003362
Yanray Wangf7b62352022-10-26 11:51:53 +08003363 TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01003364 &options, NULL, NULL, NULL) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003365
Gilles Peskine449bd832023-01-11 14:50:10 +01003366 mbedtls_debug_set_threshold(1);
3367 mbedtls_ssl_conf_dbg(&server.conf, options.srv_log_fun,
3368 options.srv_log_obj);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003369
Yanray Wangf7b62352022-10-26 11:51:53 +08003370 TEST_ASSERT(mbedtls_test_mock_socket_connect(&(client.socket),
3371 &(server.socket),
3372 BUFFSIZE) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003373
Yanray Wangbd296832022-10-26 18:28:11 +08003374 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
3375 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_WRAPUP)
Gilles Peskine449bd832023-01-11 14:50:10 +01003376 == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003377 /* Force a bad session_id_len that will be read by the server in
3378 * mbedtls_ssl_cache_set. */
3379 server.ssl.session_negotiate->id_len = 33;
Gilles Peskine449bd832023-01-11 14:50:10 +01003380 if (options.cli_msg_len != 0 || options.srv_msg_len != 0) {
Andrzej Kurek514683a2022-06-10 10:33:05 -04003381 /* Start data exchanging test */
Yanray Wangb088bfc2023-03-16 12:15:49 +08003382 TEST_ASSERT(mbedtls_test_ssl_exchange_data(
3383 &(client.ssl), options.cli_msg_len,
3384 options.expected_cli_fragments,
3385 &(server.ssl), options.srv_msg_len,
3386 options.expected_srv_fragments)
Gilles Peskine449bd832023-01-11 14:50:10 +01003387 == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003388 }
Andrzej Kurek514683a2022-06-10 10:33:05 -04003389
3390 /* Make sure that the cache did not store the session */
Gilles Peskine449bd832023-01-11 14:50:10 +01003391 TEST_EQUAL(srv_pattern.counter, 1);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003392exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003393 mbedtls_test_ssl_endpoint_free(&client, NULL);
3394 mbedtls_test_ssl_endpoint_free(&server, NULL);
3395 mbedtls_test_free_handshake_options(&options);
Gilles Peskine449bd832023-01-11 14:50:10 +01003396 mbedtls_debug_set_threshold(0);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003397 MD_OR_USE_PSA_DONE();
Andrzej Kurek514683a2022-06-10 10:33:05 -04003398}
3399/* END_CASE */
3400
Andrzej Kureked4d2172022-06-08 11:57:57 -04003401/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine449bd832023-01-11 14:50:10 +01003402void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003403{
3404 mbedtls_ssl_context ssl;
3405 mbedtls_ssl_config conf;
3406 size_t len;
3407
Gilles Peskine449bd832023-01-11 14:50:10 +01003408 mbedtls_ssl_init(&ssl);
3409 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003410 USE_PSA_INIT();
3411
Gilles Peskine449bd832023-01-11 14:50:10 +01003412 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
3413 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
3414 MBEDTLS_SSL_PRESET_DEFAULT),
3415 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01003416 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003417
Gilles Peskine449bd832023-01-11 14:50:10 +01003418 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
3419 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
3420 ssl.cli_id_len,
3421 cookie->x, cookie->len,
3422 ssl.out_buf,
3423 MBEDTLS_SSL_OUT_CONTENT_LEN,
3424 &len),
3425 exp_ret);
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003426
valerio32f2ac92023-04-20 11:59:52 +02003427exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003428 mbedtls_ssl_free(&ssl);
3429 mbedtls_ssl_config_free(&conf);
Valerio Setti285dae82023-04-19 15:10:45 +02003430 USE_PSA_DONE();
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003431}
3432/* END_CASE */
3433
Paul Elliottb9af2db2022-03-09 15:34:37 +00003434/* BEGIN_CASE depends_on:MBEDTLS_TIMING_C:MBEDTLS_HAVE_TIME */
Gilles Peskine449bd832023-01-11 14:50:10 +01003435void timing_final_delay_accessor()
Paul Elliottb9af2db2022-03-09 15:34:37 +00003436{
3437 mbedtls_timing_delay_context delay_context;
3438
Valerio Setti285dae82023-04-19 15:10:45 +02003439 USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +01003440 mbedtls_timing_set_delay(&delay_context, 50, 100);
Paul Elliottb9af2db2022-03-09 15:34:37 +00003441
Gilles Peskine449bd832023-01-11 14:50:10 +01003442 TEST_ASSERT(mbedtls_timing_get_final_delay(&delay_context) == 100);
valerio32f2ac92023-04-20 11:59:52 +02003443
3444exit:
Valerio Setti285dae82023-04-19 15:10:45 +02003445 USE_PSA_DONE();
Paul Elliottb9af2db2022-03-09 15:34:37 +00003446}
3447/* END_CASE */
Paul Elliott02758a52022-03-16 14:32:33 +00003448
3449/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_CONNECTION_ID */
Gilles Peskine449bd832023-01-11 14:50:10 +01003450void cid_sanity()
Paul Elliott02758a52022-03-16 14:32:33 +00003451{
3452 mbedtls_ssl_context ssl;
3453 mbedtls_ssl_config conf;
3454
3455 unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
3456 unsigned char test_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
3457 int cid_enabled;
3458 size_t own_cid_len;
3459
Gilles Peskine449bd832023-01-11 14:50:10 +01003460 mbedtls_test_rnd_std_rand(NULL, own_cid, sizeof(own_cid));
Paul Elliott02758a52022-03-16 14:32:33 +00003461
Gilles Peskine449bd832023-01-11 14:50:10 +01003462 mbedtls_ssl_init(&ssl);
3463 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003464 MD_OR_USE_PSA_INIT();
Paul Elliott02758a52022-03-16 14:32:33 +00003465
Gilles Peskine449bd832023-01-11 14:50:10 +01003466 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
3467 MBEDTLS_SSL_IS_CLIENT,
3468 MBEDTLS_SSL_TRANSPORT_STREAM,
3469 MBEDTLS_SSL_PRESET_DEFAULT)
3470 == 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01003471 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Paul Elliott02758a52022-03-16 14:32:33 +00003472
Gilles Peskine449bd832023-01-11 14:50:10 +01003473 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003474
3475 /* Can't use CID functions with stream transport. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003476 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
3477 sizeof(own_cid))
3478 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003479
Gilles Peskine449bd832023-01-11 14:50:10 +01003480 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
3481 &own_cid_len)
3482 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003483
Gilles Peskine449bd832023-01-11 14:50:10 +01003484 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
3485 MBEDTLS_SSL_IS_CLIENT,
3486 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
3487 MBEDTLS_SSL_PRESET_DEFAULT)
3488 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003489
3490 /* Attempt to set config cid size too big. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003491 TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, MBEDTLS_SSL_CID_IN_LEN_MAX + 1,
3492 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
3493 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003494
Gilles Peskine449bd832023-01-11 14:50:10 +01003495 TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, sizeof(own_cid),
3496 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
3497 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003498
3499 /* Attempt to set CID length not matching config. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003500 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
3501 MBEDTLS_SSL_CID_IN_LEN_MAX - 1)
3502 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003503
Gilles Peskine449bd832023-01-11 14:50:10 +01003504 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
3505 sizeof(own_cid))
3506 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003507
3508 /* Test we get back what we put in. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003509 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
3510 &own_cid_len)
3511 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003512
Gilles Peskine449bd832023-01-11 14:50:10 +01003513 TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_ENABLED);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01003514 TEST_MEMORY_COMPARE(own_cid, own_cid_len, test_cid, own_cid_len);
Paul Elliott02758a52022-03-16 14:32:33 +00003515
3516 /* Test disabling works. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003517 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_DISABLED, NULL,
3518 0)
3519 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003520
Gilles Peskine449bd832023-01-11 14:50:10 +01003521 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
3522 &own_cid_len)
3523 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003524
Gilles Peskine449bd832023-01-11 14:50:10 +01003525 TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_DISABLED);
Paul Elliott02758a52022-03-16 14:32:33 +00003526
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003527exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003528 mbedtls_ssl_free(&ssl);
3529 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003530 MD_OR_USE_PSA_DONE();
Paul Elliott02758a52022-03-16 14:32:33 +00003531}
3532/* END_CASE */
3533
Elena Uziunaite47a9b3d2024-09-16 14:25:38 +01003534/* 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_SIGN */
Gilles Peskine449bd832023-01-11 14:50:10 +01003535void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb3427822022-03-08 06:55:42 -05003536{
3537 enum { BUFFSIZE = 17000 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003538 mbedtls_test_ssl_endpoint client, server;
Andrzej Kurekb3427822022-03-08 06:55:42 -05003539 mbedtls_psa_stats_t stats;
Andrzej Kurek39d88d42022-03-31 06:30:54 -04003540 size_t free_slots_before = -1;
Ronald Cronfb536472024-01-26 14:55:25 +01003541 mbedtls_test_handshake_test_options client_options, server_options;
3542 mbedtls_test_init_handshake_options(&client_options);
3543 mbedtls_test_init_handshake_options(&server_options);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003544
Andrzej Kurekcc28e9a2022-03-08 18:36:35 -05003545 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
3546 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003547 MD_OR_USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +01003548 mbedtls_platform_zeroize(&client, sizeof(client));
3549 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb3427822022-03-08 06:55:42 -05003550
3551 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek83e60ee2022-04-14 08:51:41 -04003552 * the raw key agreement. Flipping the first byte makes the
3553 * required 0x04 identifier invalid. */
Ronald Cronfb536472024-01-26 14:55:25 +01003554 client_options.pk_alg = MBEDTLS_PK_ECDSA;
3555 client_options.group_list = iana_tls_group_list;
Yanray Wangf7b62352022-10-26 11:51:53 +08003556 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01003557 &client_options, NULL, NULL,
3558 NULL), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003559
3560 /* Server side */
Ronald Cronfb536472024-01-26 14:55:25 +01003561 server_options.pk_alg = MBEDTLS_PK_ECDSA;
3562 server_options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
3563 server_options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
Yanray Wangf7b62352022-10-26 11:51:53 +08003564 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01003565 &server_options, NULL, NULL,
3566 NULL), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003567
Yanray Wangf7b62352022-10-26 11:51:53 +08003568 TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket),
3569 &(server.socket),
3570 BUFFSIZE), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003571
Yanray Wangbd296832022-10-26 18:28:11 +08003572 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
3573 &(client.ssl), &(server.ssl),
3574 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003575
Gilles Peskine449bd832023-01-11 14:50:10 +01003576 mbedtls_psa_get_stats(&stats);
Andrzej Kurek39d88d42022-03-31 06:30:54 -04003577 /* Save the number of slots in use up to this point.
3578 * With PSA, one can be used for the ECDH private key. */
3579 free_slots_before = stats.empty_slots;
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04003580
Gilles Peskine449bd832023-01-11 14:50:10 +01003581 if (bad_server_ecdhe_key) {
Gilles Peskineb4f874d2022-04-08 16:48:09 -04003582 /* Force a simulated bitflip in the server key. to make the
3583 * raw key agreement in ssl_write_client_key_exchange fail. */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003584 (client.ssl).handshake->xxdh_psa_peerkey[0] ^= 0x02;
Gilles Peskineb4f874d2022-04-08 16:48:09 -04003585 }
Andrzej Kurekb3427822022-03-08 06:55:42 -05003586
Yanray Wangbd296832022-10-26 18:28:11 +08003587 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
3588 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER),
Gilles Peskine449bd832023-01-11 14:50:10 +01003589 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003590
Gilles Peskine449bd832023-01-11 14:50:10 +01003591 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003592
Gilles Peskineb4f874d2022-04-08 16:48:09 -04003593 /* Make sure that the key slot is already destroyed in case of failure,
3594 * without waiting to close the connection. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003595 if (bad_server_ecdhe_key) {
3596 TEST_EQUAL(free_slots_before, stats.empty_slots);
3597 }
Andrzej Kurekb3427822022-03-08 06:55:42 -05003598
3599exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003600 mbedtls_test_ssl_endpoint_free(&client, NULL);
3601 mbedtls_test_ssl_endpoint_free(&server, NULL);
Ronald Cronfb536472024-01-26 14:55:25 +01003602 mbedtls_test_free_handshake_options(&client_options);
3603 mbedtls_test_free_handshake_options(&server_options);
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04003604
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003605 MD_OR_USE_PSA_DONE();
Andrzej Kurekb3427822022-03-08 06:55:42 -05003606}
3607/* END_CASE */
Valerio Settidb6b4db2023-09-01 09:20:51 +02003608/* 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003609void tls13_server_certificate_msg_invalid_vector_len()
Ronald Crone3dac4a2022-06-10 17:21:51 +02003610{
3611 int ret = -1;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003612 mbedtls_test_ssl_endpoint client_ep, server_ep;
Ronald Crone3dac4a2022-06-10 17:21:51 +02003613 unsigned char *buf, *end;
3614 size_t buf_len;
3615 int step = 0;
3616 int expected_result;
Ronald Crone7b9b6b2022-06-10 17:24:31 +02003617 mbedtls_ssl_chk_buf_ptr_args expected_chk_buf_ptr_args;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003618 mbedtls_test_handshake_test_options client_options;
3619 mbedtls_test_handshake_test_options server_options;
Ronald Crone3dac4a2022-06-10 17:21:51 +02003620
3621 /*
3622 * Test set-up
3623 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003624 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
3625 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
Ronald Crone3dac4a2022-06-10 17:21:51 +02003626
Yanray Wangf7b62352022-10-26 11:51:53 +08003627 mbedtls_test_init_handshake_options(&client_options);
valerio32f2ac92023-04-20 11:59:52 +02003628 MD_OR_USE_PSA_INIT();
3629
Paul Elliott9a8d7842022-07-10 12:48:57 +01003630 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Yanray Wangf7b62352022-10-26 11:51:53 +08003631 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01003632 &client_options, NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01003633 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003634
Yanray Wangf7b62352022-10-26 11:51:53 +08003635 mbedtls_test_init_handshake_options(&server_options);
Paul Elliott9a8d7842022-07-10 12:48:57 +01003636 server_options.pk_alg = MBEDTLS_PK_ECDSA;
Yanray Wangf7b62352022-10-26 11:51:53 +08003637 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01003638 &server_options, NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01003639 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003640
Yanray Wangf7b62352022-10-26 11:51:53 +08003641 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
3642 &(server_ep.socket), 1024);
Gilles Peskine449bd832023-01-11 14:50:10 +01003643 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003644
Gilles Peskine449bd832023-01-11 14:50:10 +01003645 while (1) {
3646 mbedtls_test_set_step(++step);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003647
Yanray Wangbd296832022-10-26 18:28:11 +08003648 ret = mbedtls_test_move_handshake_to_state(
3649 &(server_ep.ssl), &(client_ep.ssl),
3650 MBEDTLS_SSL_CERTIFICATE_VERIFY);
Gilles Peskine449bd832023-01-11 14:50:10 +01003651 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003652
Gilles Peskine449bd832023-01-11 14:50:10 +01003653 ret = mbedtls_ssl_flush_output(&(server_ep.ssl));
3654 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003655
Yanray Wangbd296832022-10-26 18:28:11 +08003656 ret = mbedtls_test_move_handshake_to_state(
3657 &(client_ep.ssl), &(server_ep.ssl),
3658 MBEDTLS_SSL_SERVER_CERTIFICATE);
Gilles Peskine449bd832023-01-11 14:50:10 +01003659 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003660
Gilles Peskine449bd832023-01-11 14:50:10 +01003661 ret = mbedtls_ssl_tls13_fetch_handshake_msg(&(client_ep.ssl),
3662 MBEDTLS_SSL_HS_CERTIFICATE,
3663 &buf, &buf_len);
3664 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003665
3666 end = buf + buf_len;
3667
3668 /*
3669 * Tweak server Certificate message and parse it.
3670 */
3671
Yanray Wangf56181a2023-03-16 12:21:33 +08003672 ret = mbedtls_test_tweak_tls13_certificate_msg_vector_len(
Gilles Peskine449bd832023-01-11 14:50:10 +01003673 buf, &end, step, &expected_result, &expected_chk_buf_ptr_args);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003674
Gilles Peskine449bd832023-01-11 14:50:10 +01003675 if (ret != 0) {
Ronald Crone3dac4a2022-06-10 17:21:51 +02003676 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01003677 }
Ronald Crone3dac4a2022-06-10 17:21:51 +02003678
Gilles Peskine449bd832023-01-11 14:50:10 +01003679 ret = mbedtls_ssl_tls13_parse_certificate(&(client_ep.ssl), buf, end);
3680 TEST_EQUAL(ret, expected_result);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003681
Gilles Peskine449bd832023-01-11 14:50:10 +01003682 TEST_ASSERT(mbedtls_ssl_cmp_chk_buf_ptr_fail_args(
3683 &expected_chk_buf_ptr_args) == 0);
Ronald Crone7b9b6b2022-06-10 17:24:31 +02003684
Gilles Peskine449bd832023-01-11 14:50:10 +01003685 mbedtls_ssl_reset_chk_buf_ptr_fail_args();
Ronald Crone7b9b6b2022-06-10 17:24:31 +02003686
Gilles Peskine449bd832023-01-11 14:50:10 +01003687 ret = mbedtls_ssl_session_reset(&(client_ep.ssl));
3688 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003689
Gilles Peskine449bd832023-01-11 14:50:10 +01003690 ret = mbedtls_ssl_session_reset(&(server_ep.ssl));
3691 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003692 }
3693
3694exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003695 mbedtls_ssl_reset_chk_buf_ptr_fail_args();
Yanray Wangf7b62352022-10-26 11:51:53 +08003696 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
3697 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
3698 mbedtls_test_free_handshake_options(&client_options);
3699 mbedtls_test_free_handshake_options(&server_options);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003700 MD_OR_USE_PSA_DONE();
Ronald Crone3dac4a2022-06-10 17:21:51 +02003701}
3702/* END_CASE */
Valerio Setti4452e982022-12-01 15:08:35 +01003703
3704/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01003705void ssl_ecjpake_set_password(int use_opaque_arg)
Valerio Setti4452e982022-12-01 15:08:35 +01003706{
3707 mbedtls_ssl_context ssl;
3708 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01003709#if defined(MBEDTLS_USE_PSA_CRYPTO)
Valerio Setti4452e982022-12-01 15:08:35 +01003710 mbedtls_svc_key_id_t pwd_slot = MBEDTLS_SVC_KEY_ID_INIT;
3711#else /* MBEDTLS_USE_PSA_CRYPTO */
3712 (void) use_opaque_arg;
3713#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003714 unsigned char pwd_string[sizeof(ECJPAKE_TEST_PWD)] = "";
Valerio Setti4452e982022-12-01 15:08:35 +01003715 size_t pwd_len = 0;
Valerio Setti4452e982022-12-01 15:08:35 +01003716 int ret;
3717
Gilles Peskine449bd832023-01-11 14:50:10 +01003718 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003719 MD_OR_USE_PSA_INIT();
Valerio Setti4452e982022-12-01 15:08:35 +01003720
Valerio Settie7518ba2022-12-02 12:09:43 +01003721 /* test with uninitalized SSL context */
Gilles Peskine449bd832023-01-11 14:50:10 +01003722 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Valerio Setti4452e982022-12-01 15:08:35 +01003723
Gilles Peskine449bd832023-01-11 14:50:10 +01003724 mbedtls_ssl_config_init(&conf);
Valerio Setti4452e982022-12-01 15:08:35 +01003725
Gilles Peskine449bd832023-01-11 14:50:10 +01003726 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf,
3727 MBEDTLS_SSL_IS_CLIENT,
3728 MBEDTLS_SSL_TRANSPORT_STREAM,
3729 MBEDTLS_SSL_PRESET_DEFAULT), 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01003730 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Valerio Setti4452e982022-12-01 15:08:35 +01003731
Gilles Peskine449bd832023-01-11 14:50:10 +01003732 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
Valerio Setti4452e982022-12-01 15:08:35 +01003733
Valerio Settiba22c9c2022-12-06 11:42:33 +01003734 /* test with empty password or unitialized password key (depending on use_opaque_arg) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003735 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Valerio Setti4452e982022-12-01 15:08:35 +01003736
Gilles Peskine449bd832023-01-11 14:50:10 +01003737 pwd_len = strlen(ECJPAKE_TEST_PWD);
3738 memcpy(pwd_string, ECJPAKE_TEST_PWD, pwd_len);
Valerio Setti4452e982022-12-01 15:08:35 +01003739
Gilles Peskine449bd832023-01-11 14:50:10 +01003740#if defined(MBEDTLS_USE_PSA_CRYPTO)
3741 if (use_opaque_arg) {
Valerio Setti4452e982022-12-01 15:08:35 +01003742 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti785116a2022-12-12 11:59:25 +01003743 psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti4452e982022-12-01 15:08:35 +01003744
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003745 /* First try with an invalid usage */
Gilles Peskine449bd832023-01-11 14:50:10 +01003746 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
3747 psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE);
3748 psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD);
Valerio Setti4452e982022-12-01 15:08:35 +01003749
Gilles Peskine449bd832023-01-11 14:50:10 +01003750 PSA_ASSERT(psa_import_key(&attributes, pwd_string,
3751 pwd_len, &pwd_slot));
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003752
Gilles Peskine449bd832023-01-11 14:50:10 +01003753 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003754
Valerio Setti9d313df2022-12-09 11:38:59 +01003755 /* check that the opaque key is still valid after failure */
Gilles Peskine449bd832023-01-11 14:50:10 +01003756 TEST_EQUAL(psa_get_key_attributes(pwd_slot, &check_attributes),
3757 PSA_SUCCESS);
Valerio Setti9d313df2022-12-09 11:38:59 +01003758
Gilles Peskine449bd832023-01-11 14:50:10 +01003759 psa_destroy_key(pwd_slot);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003760
3761 /* Then set the correct usage */
Gilles Peskine449bd832023-01-11 14:50:10 +01003762 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003763
Gilles Peskine449bd832023-01-11 14:50:10 +01003764 PSA_ASSERT(psa_import_key(&attributes, pwd_string,
3765 pwd_len, &pwd_slot));
Valerio Setti4452e982022-12-01 15:08:35 +01003766 }
3767#endif /* MBEDTLS_USE_PSA_CRYPTO */
3768
Valerio Settie7518ba2022-12-02 12:09:43 +01003769 /* final check which should work without errors */
Gilles Peskine449bd832023-01-11 14:50:10 +01003770 ECJPAKE_TEST_SET_PASSWORD(0);
Valerio Setti4452e982022-12-01 15:08:35 +01003771
Gilles Peskine449bd832023-01-11 14:50:10 +01003772#if defined(MBEDTLS_USE_PSA_CRYPTO)
3773 if (use_opaque_arg) {
3774 psa_destroy_key(pwd_slot);
Valerio Setti31e99bb2022-12-09 14:35:10 +01003775 }
Valerio Settie7518ba2022-12-02 12:09:43 +01003776#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003777 mbedtls_ssl_free(&ssl);
3778 mbedtls_ssl_config_free(&conf);
Valerio Setti4452e982022-12-01 15:08:35 +01003779
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003780 MD_OR_USE_PSA_DONE();
Valerio Setti4452e982022-12-01 15:08:35 +01003781}
3782/* END_CASE */
Valerio Setti73260b62023-01-03 12:53:28 +01003783
Valerio Setti2c121852023-01-09 18:00:39 +01003784/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003785void elliptic_curve_get_properties()
Valerio Setti73260b62023-01-03 12:53:28 +01003786{
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02003787 psa_key_type_t psa_type = PSA_KEY_TYPE_NONE;
Valerio Setti73260b62023-01-03 12:53:28 +01003788 size_t psa_bits;
3789
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003790 MD_OR_USE_PSA_INIT();
Valerio Setti73260b62023-01-03 12:53:28 +01003791
Valerio Settidb6b4db2023-09-01 09:20:51 +02003792#if defined(MBEDTLS_ECP_HAVE_SECP521R1) || defined(PSA_WANT_ECC_SECP_R1_521)
Gilles Peskine449bd832023-01-11 14:50:10 +01003793 TEST_AVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
Valerio Setti73260b62023-01-03 12:53:28 +01003794#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003795 TEST_UNAVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
Valerio Setti73260b62023-01-03 12:53:28 +01003796#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003797#if defined(MBEDTLS_ECP_HAVE_BP512R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
Gilles Peskine449bd832023-01-11 14:50:10 +01003798 TEST_AVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
Valerio Setti73260b62023-01-03 12:53:28 +01003799#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003800 TEST_UNAVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
Valerio Setti73260b62023-01-03 12:53:28 +01003801#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003802#if defined(MBEDTLS_ECP_HAVE_SECP384R1) || defined(PSA_WANT_ECC_SECP_R1_384)
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 TEST_AVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003804#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003805 TEST_UNAVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003806#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003807#if defined(MBEDTLS_ECP_HAVE_BP384R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
Gilles Peskine449bd832023-01-11 14:50:10 +01003808 TEST_AVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003809#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003810 TEST_UNAVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003811#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003812#if defined(MBEDTLS_ECP_HAVE_SECP256R1) || defined(PSA_WANT_ECC_SECP_R1_256)
Gilles Peskine449bd832023-01-11 14:50:10 +01003813 TEST_AVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003814#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003815 TEST_UNAVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003816#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003817#if defined(MBEDTLS_ECP_HAVE_SECP256K1) || defined(PSA_WANT_ECC_SECP_K1_256)
Gilles Peskine449bd832023-01-11 14:50:10 +01003818 TEST_AVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003819#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003820 TEST_UNAVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003821#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003822#if defined(MBEDTLS_ECP_HAVE_BP256R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
Gilles Peskine449bd832023-01-11 14:50:10 +01003823 TEST_AVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003824#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 TEST_UNAVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003826#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003827#if defined(MBEDTLS_ECP_HAVE_SECP224R1) || defined(PSA_WANT_ECC_SECP_R1_224)
Gilles Peskine449bd832023-01-11 14:50:10 +01003828 TEST_AVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003829#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003830 TEST_UNAVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003831#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003832#if defined(MBEDTLS_ECP_HAVE_SECP224K1) || defined(PSA_WANT_ECC_SECP_K1_224)
Gilles Peskine449bd832023-01-11 14:50:10 +01003833 TEST_AVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003834#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003835 TEST_UNAVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003836#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003837#if defined(MBEDTLS_ECP_HAVE_SECP192R1) || defined(PSA_WANT_ECC_SECP_R1_192)
Gilles Peskine449bd832023-01-11 14:50:10 +01003838 TEST_AVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003839#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003840 TEST_UNAVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003841#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003842#if defined(MBEDTLS_ECP_HAVE_SECP192K1) || defined(PSA_WANT_ECC_SECP_K1_192)
Gilles Peskine449bd832023-01-11 14:50:10 +01003843 TEST_AVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003844#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003845 TEST_UNAVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003846#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003847#if defined(MBEDTLS_ECP_HAVE_CURVE25519) || defined(PSA_WANT_ECC_MONTGOMERY_255)
Gilles Peskine449bd832023-01-11 14:50:10 +01003848 TEST_AVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
Valerio Setti73260b62023-01-03 12:53:28 +01003849#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003850 TEST_UNAVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
Valerio Setti73260b62023-01-03 12:53:28 +01003851#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003852#if defined(MBEDTLS_ECP_HAVE_CURVE448) || defined(PSA_WANT_ECC_MONTGOMERY_448)
Gilles Peskine449bd832023-01-11 14:50:10 +01003853 TEST_AVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
Valerio Setti73260b62023-01-03 12:53:28 +01003854#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003855 TEST_UNAVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
Valerio Setti73260b62023-01-03 12:53:28 +01003856#endif
valerio32f2ac92023-04-20 11:59:52 +02003857 goto exit;
3858exit:
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003859 MD_OR_USE_PSA_DONE();
Valerio Setti73260b62023-01-03 12:53:28 +01003860}
3861/* END_CASE */
Ronald Crond903a862024-01-15 15:57:17 +01003862
3863/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */
3864void tls13_resume_session_with_ticket()
3865{
3866 int ret = -1;
Ronald Crond903a862024-01-15 15:57:17 +01003867 mbedtls_test_ssl_endpoint client_ep, server_ep;
3868 mbedtls_test_handshake_test_options client_options;
3869 mbedtls_test_handshake_test_options server_options;
3870 mbedtls_ssl_session saved_session;
3871
Ronald Crond903a862024-01-15 15:57:17 +01003872 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
3873 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
3874 mbedtls_test_init_handshake_options(&client_options);
3875 mbedtls_test_init_handshake_options(&server_options);
3876 mbedtls_ssl_session_init(&saved_session);
3877
Ronald Cron095a3a52024-01-31 14:34:22 +01003878 PSA_INIT();
Ronald Crond903a862024-01-15 15:57:17 +01003879
Ronald Cron1f6e4e42024-01-26 16:31:33 +01003880 /*
3881 * Run first handshake to get a ticket from the server.
3882 */
Ronald Crond903a862024-01-15 15:57:17 +01003883 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cron1f6e4e42024-01-26 16:31:33 +01003884 server_options.pk_alg = MBEDTLS_PK_ECDSA;
3885
3886 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
3887 &saved_session);
3888 TEST_EQUAL(ret, 0);
3889
3890 /*
3891 * Prepare for handshake with the ticket.
3892 */
Ronald Crond903a862024-01-15 15:57:17 +01003893 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01003894 &client_options, NULL, NULL, NULL);
Ronald Crond903a862024-01-15 15:57:17 +01003895 TEST_EQUAL(ret, 0);
3896
Ronald Crond903a862024-01-15 15:57:17 +01003897 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01003898 &server_options, NULL, NULL, NULL);
Ronald Cron1f6e4e42024-01-26 16:31:33 +01003899 TEST_EQUAL(ret, 0);
3900
Ronald Crond903a862024-01-15 15:57:17 +01003901 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
3902 mbedtls_test_ticket_write,
3903 mbedtls_test_ticket_parse,
3904 NULL);
3905 TEST_EQUAL(ret, 0);
3906
3907 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
3908 &(server_ep.socket), 1024);
3909 TEST_EQUAL(ret, 0);
3910
Ronald Crond903a862024-01-15 15:57:17 +01003911 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
3912 TEST_EQUAL(ret, 0);
3913
Ronald Cron5de9c6f2024-01-31 14:45:16 +01003914 /*
Ronald Cron1f6e4e42024-01-26 16:31:33 +01003915 * Handshake with ticket.
3916 *
Ronald Cron5de9c6f2024-01-31 14:45:16 +01003917 * Run the handshake up to MBEDTLS_SSL_HANDSHAKE_WRAPUP and not
3918 * MBEDTLS_SSL_HANDSHAKE_OVER to preserve handshake data for the checks
3919 * below.
3920 */
Ronald Croneb845342024-01-31 14:48:23 +01003921 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
3922 &(server_ep.ssl), &(client_ep.ssl),
3923 MBEDTLS_SSL_HANDSHAKE_WRAPUP), 0);
Ronald Crond903a862024-01-15 15:57:17 +01003924
3925 TEST_EQUAL(server_ep.ssl.handshake->resume, 1);
3926 TEST_EQUAL(server_ep.ssl.handshake->new_session_tickets_count, 1);
3927 TEST_EQUAL(server_ep.ssl.handshake->key_exchange_mode,
3928 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL);
3929
3930exit:
3931 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
3932 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
3933 mbedtls_test_free_handshake_options(&client_options);
3934 mbedtls_test_free_handshake_options(&server_options);
3935 mbedtls_ssl_session_free(&saved_session);
Ronald Cron095a3a52024-01-31 14:34:22 +01003936 PSA_DONE();
Ronald Crond903a862024-01-15 15:57:17 +01003937}
3938/* END_CASE */
Ronald Crona8dd81b2024-01-16 17:50:52 +01003939
Ronald Cronae2d81c2024-01-22 09:13:41 +01003940/*
Ronald Cron86d288c2024-02-22 11:28:29 +01003941 * The !MBEDTLS_SSL_PROTO_TLS1_2 dependency of tls13_read_early_data() below is
Ronald Cronae2d81c2024-01-22 09:13:41 +01003942 * a temporary workaround to not run the test in Windows-2013 where there is
3943 * an issue with mbedtls_vsnprintf().
3944 */
3945/* BEGIN_CASE depends_on:!MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_DEBUG_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */
Ronald Cron86d288c2024-02-22 11:28:29 +01003946void tls13_read_early_data(int scenario)
Ronald Crona8dd81b2024-01-16 17:50:52 +01003947{
3948 int ret = -1;
3949 unsigned char buf[64];
3950 const char *early_data = "This is early data.";
3951 size_t early_data_len = strlen(early_data);
3952 mbedtls_test_ssl_endpoint client_ep, server_ep;
3953 mbedtls_test_handshake_test_options client_options;
3954 mbedtls_test_handshake_test_options server_options;
3955 mbedtls_ssl_session saved_session;
Ronald Cron2995d352024-01-18 16:59:39 +01003956 mbedtls_test_ssl_log_pattern server_pattern = { NULL, 0 };
Jerry Yuf57d14b2023-11-15 16:40:09 +08003957 uint16_t group_list[3] = {
3958 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
3959 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
3960 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
3961 };
Ronald Cron2995d352024-01-18 16:59:39 +01003962
Ronald Crona8dd81b2024-01-16 17:50:52 +01003963 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
3964 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
3965 mbedtls_test_init_handshake_options(&client_options);
3966 mbedtls_test_init_handshake_options(&server_options);
3967 mbedtls_ssl_session_init(&saved_session);
3968
Ronald Cron095a3a52024-01-31 14:34:22 +01003969 PSA_INIT();
Ronald Crona8dd81b2024-01-16 17:50:52 +01003970
Ronald Cronbfcdc062024-01-26 16:57:25 +01003971 /*
3972 * Run first handshake to get a ticket from the server.
3973 */
3974
Ronald Crona8dd81b2024-01-16 17:50:52 +01003975 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cronfb536472024-01-26 14:55:25 +01003976 client_options.group_list = group_list;
Ronald Cronced99be2024-01-26 15:49:12 +01003977 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
Ronald Cronbfcdc062024-01-26 16:57:25 +01003978 server_options.pk_alg = MBEDTLS_PK_ECDSA;
3979 server_options.group_list = group_list;
3980 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
3981
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00003982#if defined(MBEDTLS_SSL_ALPN)
3983 switch (scenario) {
3984 case TEST_EARLY_DATA_SAME_ALPN:
3985 case TEST_EARLY_DATA_DIFF_ALPN:
3986 case TEST_EARLY_DATA_NO_LATER_ALPN:
3987 client_options.alpn_list[0] = "ALPNExample";
3988 client_options.alpn_list[1] = NULL;
3989 server_options.alpn_list[0] = "ALPNExample";
3990 server_options.alpn_list[1] = NULL;
3991 break;
3992 }
3993#endif
3994
Ronald Cronbfcdc062024-01-26 16:57:25 +01003995 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
3996 &saved_session);
3997 TEST_EQUAL(ret, 0);
3998
3999 /*
4000 * Prepare for handshake with the ticket.
4001 */
4002 switch (scenario) {
Ronald Cron5c208d72024-01-24 10:13:30 +01004003 case TEST_EARLY_DATA_ACCEPTED:
Ronald Cronbfcdc062024-01-26 16:57:25 +01004004 break;
4005
Ronald Cron110303f2024-02-22 11:35:21 +01004006 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4007 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4008 break;
4009
Ronald Crond6dba672024-01-24 12:22:24 +01004010 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cronbfcdc062024-01-26 16:57:25 +01004011 mbedtls_debug_set_threshold(3);
4012 server_pattern.pattern =
4013 "EarlyData: deprotect and discard app data records.";
4014 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4015 break;
4016
Ronald Cron2261ab22024-01-24 13:38:31 +01004017 case TEST_EARLY_DATA_HRR:
Ronald Cronbfcdc062024-01-26 16:57:25 +01004018 mbedtls_debug_set_threshold(3);
4019 server_pattern.pattern =
4020 "EarlyData: Ignore application message before 2nd ClientHello";
4021 server_options.group_list = group_list + 1;
4022 break;
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00004023#if defined(MBEDTLS_SSL_ALPN)
4024 case TEST_EARLY_DATA_SAME_ALPN:
4025 client_options.alpn_list[0] = "ALPNExample";
4026 client_options.alpn_list[1] = NULL;
4027 server_options.alpn_list[0] = "ALPNExample";
4028 server_options.alpn_list[1] = NULL;
4029 break;
4030 case TEST_EARLY_DATA_DIFF_ALPN:
4031 case TEST_EARLY_DATA_NO_INITIAL_ALPN:
4032 client_options.alpn_list[0] = "ALPNExample2";
4033 client_options.alpn_list[1] = NULL;
4034 server_options.alpn_list[0] = "ALPNExample2";
4035 server_options.alpn_list[1] = NULL;
4036 mbedtls_debug_set_threshold(3);
4037 server_pattern.pattern =
4038 "EarlyData: rejected, the selected ALPN is different "
4039 "from the one associated with the pre-shared key.";
4040 break;
4041 case TEST_EARLY_DATA_NO_LATER_ALPN:
4042 client_options.alpn_list[0] = NULL;
4043 server_options.alpn_list[0] = NULL;
4044 mbedtls_debug_set_threshold(3);
4045 server_pattern.pattern =
4046 "EarlyData: rejected, the selected ALPN is different "
4047 "from the one associated with the pre-shared key.";
4048 break;
4049#endif
Ronald Cronbfcdc062024-01-26 16:57:25 +01004050
4051 default:
4052 TEST_FAIL("Unknown scenario.");
4053 }
4054
Ronald Crona8dd81b2024-01-16 17:50:52 +01004055 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01004056 &client_options, NULL, NULL, NULL);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004057 TEST_EQUAL(ret, 0);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004058
Ronald Cron2995d352024-01-18 16:59:39 +01004059 server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
4060 server_options.srv_log_obj = &server_pattern;
Ronald Crona8dd81b2024-01-16 17:50:52 +01004061 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01004062 &server_options, NULL, NULL, NULL);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004063 TEST_EQUAL(ret, 0);
Ronald Cronfb536472024-01-26 14:55:25 +01004064
Ronald Crona8dd81b2024-01-16 17:50:52 +01004065 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4066 mbedtls_test_ticket_write,
4067 mbedtls_test_ticket_parse,
4068 NULL);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004069
4070 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4071 &(server_ep.socket), 1024);
4072 TEST_EQUAL(ret, 0);
4073
Ronald Crona8dd81b2024-01-16 17:50:52 +01004074 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4075 TEST_EQUAL(ret, 0);
4076
Ronald Cronbfcdc062024-01-26 16:57:25 +01004077 /*
4078 * Handshake with ticket and send early data.
4079 */
Ronald Croneb845342024-01-31 14:48:23 +01004080 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4081 &(client_ep.ssl), &(server_ep.ssl),
4082 MBEDTLS_SSL_SERVER_HELLO), 0);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004083
Ronald Cron7d158f42024-02-22 11:39:39 +01004084 ret = mbedtls_ssl_write_early_data(&(client_ep.ssl),
4085 (unsigned char *) early_data,
4086 early_data_len);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004087
Ronald Crond2884662024-03-03 15:03:22 +01004088 if (client_ep.ssl.early_data_state !=
Ronald Cron3c5a6832024-03-03 15:46:57 +01004089 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT) {
Ronald Cron110303f2024-02-22 11:35:21 +01004090 TEST_EQUAL(ret, early_data_len);
Ronald Cron7d158f42024-02-22 11:39:39 +01004091 } else {
4092 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
Ronald Cron110303f2024-02-22 11:35:21 +01004093 }
Ronald Crona8dd81b2024-01-16 17:50:52 +01004094
Ronald Cron2995d352024-01-18 16:59:39 +01004095 ret = mbedtls_test_move_handshake_to_state(
4096 &(server_ep.ssl), &(client_ep.ssl),
4097 MBEDTLS_SSL_HANDSHAKE_WRAPUP);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004098
Ronald Cron2995d352024-01-18 16:59:39 +01004099 switch (scenario) {
Ronald Cron5c208d72024-01-24 10:13:30 +01004100 case TEST_EARLY_DATA_ACCEPTED:
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00004101#if defined(MBEDTLS_SSL_ALPN)
4102 case TEST_EARLY_DATA_SAME_ALPN:
4103#endif
Ronald Cron2995d352024-01-18 16:59:39 +01004104 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
4105 TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 1);
4106 TEST_EQUAL(mbedtls_ssl_read_early_data(&(server_ep.ssl),
4107 buf, sizeof(buf)), early_data_len);
4108 TEST_MEMORY_COMPARE(buf, early_data_len, early_data, early_data_len);
Ronald Cron2995d352024-01-18 16:59:39 +01004109 break;
4110
Ronald Cron110303f2024-02-22 11:35:21 +01004111 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4112 TEST_EQUAL(ret, 0);
4113 TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 0);
4114 break;
4115
Ronald Crond6dba672024-01-24 12:22:24 +01004116 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
Ronald Cron2261ab22024-01-24 13:38:31 +01004117 case TEST_EARLY_DATA_HRR:
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00004118#if defined(MBEDTLS_SSL_ALPN)
4119 case TEST_EARLY_DATA_DIFF_ALPN:
4120 case TEST_EARLY_DATA_NO_INITIAL_ALPN:
4121 case TEST_EARLY_DATA_NO_LATER_ALPN:
4122#endif
Ronald Cron2995d352024-01-18 16:59:39 +01004123 TEST_EQUAL(ret, 0);
4124 TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 0);
4125 TEST_EQUAL(server_pattern.counter, 1);
4126 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004127
4128 default:
4129 TEST_FAIL("Unknown scenario.");
Ronald Cron2995d352024-01-18 16:59:39 +01004130 }
Ronald Crona8dd81b2024-01-16 17:50:52 +01004131
Ronald Crond0a77272024-02-05 17:57:05 +01004132 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4133 &(server_ep.ssl), &(client_ep.ssl),
4134 MBEDTLS_SSL_HANDSHAKE_OVER), 0);
4135
Ronald Crona8dd81b2024-01-16 17:50:52 +01004136exit:
4137 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
4138 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
4139 mbedtls_test_free_handshake_options(&client_options);
4140 mbedtls_test_free_handshake_options(&server_options);
4141 mbedtls_ssl_session_free(&saved_session);
Ronald Cron2995d352024-01-18 16:59:39 +01004142 mbedtls_debug_set_threshold(0);
Ronald Cron095a3a52024-01-31 14:34:22 +01004143 PSA_DONE();
Ronald Crona8dd81b2024-01-16 17:50:52 +01004144}
4145/* END_CASE */
Ronald Crona7f94e42024-01-24 09:40:46 +01004146
4147/* BEGIN_CASE depends_on:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */
Ronald Crond2884662024-03-03 15:03:22 +01004148void tls13_cli_early_data_state(int scenario)
Ronald Crona7f94e42024-01-24 09:40:46 +01004149{
4150 int ret = -1;
4151 mbedtls_test_ssl_endpoint client_ep, server_ep;
4152 mbedtls_test_handshake_test_options client_options;
4153 mbedtls_test_handshake_test_options server_options;
4154 mbedtls_ssl_session saved_session;
Ronald Cron2261ab22024-01-24 13:38:31 +01004155 uint16_t group_list[3] = {
4156 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
4157 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
4158 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
4159 };
BensonLiou41bed382024-02-16 16:07:53 +08004160 uint8_t client_random[MBEDTLS_CLIENT_HELLO_RANDOM_LEN];
Ronald Crona7f94e42024-01-24 09:40:46 +01004161
4162 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
4163 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
4164 mbedtls_test_init_handshake_options(&client_options);
4165 mbedtls_test_init_handshake_options(&server_options);
4166 mbedtls_ssl_session_init(&saved_session);
4167
4168 PSA_INIT();
4169
4170 /*
4171 * Run first handshake to get a ticket from the server.
4172 */
4173 client_options.pk_alg = MBEDTLS_PK_ECDSA;
4174 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
4175 server_options.pk_alg = MBEDTLS_PK_ECDSA;
4176 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
Ronald Cron2261ab22024-01-24 13:38:31 +01004177 if (scenario == TEST_EARLY_DATA_HRR) {
4178 client_options.group_list = group_list;
4179 server_options.group_list = group_list;
4180 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004181
4182 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
4183 &saved_session);
4184 TEST_EQUAL(ret, 0);
4185
4186 /*
4187 * Prepare for handshake with the ticket.
4188 */
Ronald Cron5c208d72024-01-24 10:13:30 +01004189 switch (scenario) {
4190 case TEST_EARLY_DATA_ACCEPTED:
4191 break;
4192
Ronald Cron265273e2024-01-24 11:13:19 +01004193 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4194 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4195 break;
4196
Ronald Crond6dba672024-01-24 12:22:24 +01004197 case TEST_EARLY_DATA_SERVER_REJECTS:
4198 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4199 break;
4200
Ronald Cron2261ab22024-01-24 13:38:31 +01004201 case TEST_EARLY_DATA_HRR:
4202 server_options.group_list = group_list + 1;
4203 break;
4204
Ronald Cron5c208d72024-01-24 10:13:30 +01004205 default:
4206 TEST_FAIL("Unknown scenario.");
4207 }
4208
Ronald Crona7f94e42024-01-24 09:40:46 +01004209 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
4210 &client_options, NULL, NULL, NULL);
4211 TEST_EQUAL(ret, 0);
4212
4213 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
4214 &server_options, NULL, NULL, NULL);
4215 TEST_EQUAL(ret, 0);
4216
4217 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4218 mbedtls_test_ticket_write,
4219 mbedtls_test_ticket_parse,
4220 NULL);
4221
4222 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4223 &(server_ep.socket), 1024);
4224 TEST_EQUAL(ret, 0);
4225
4226 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4227 TEST_EQUAL(ret, 0);
4228
4229 /*
4230 * Go through the handshake sequence, state by state, checking the early
4231 * data status each time.
4232 */
4233 do {
4234 int state = client_ep.ssl.state;
4235
4236 /* Progress the handshake from at least one state */
4237 while (client_ep.ssl.state == state) {
4238 ret = mbedtls_ssl_handshake_step(&(client_ep.ssl));
4239 TEST_ASSERT((ret == 0) ||
4240 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4241 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4242 if (client_ep.ssl.state != state) {
4243 break;
4244 }
4245 ret = mbedtls_ssl_handshake_step(&(server_ep.ssl));
4246 TEST_ASSERT((ret == 0) ||
4247 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4248 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4249 }
4250
Ronald Cron9f2c3c02024-02-21 17:03:22 +01004251 if (client_ep.ssl.state != MBEDTLS_SSL_HANDSHAKE_OVER) {
4252 TEST_EQUAL(mbedtls_ssl_get_early_data_status(&(client_ep.ssl)),
4253 MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
4254 }
4255
Ronald Crona7f94e42024-01-24 09:40:46 +01004256 switch (client_ep.ssl.state) {
4257 case MBEDTLS_SSL_CLIENT_HELLO:
Ronald Cron5c208d72024-01-24 10:13:30 +01004258 switch (scenario) {
Ronald Cron265273e2024-01-24 11:13:19 +01004259 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Crond6dba672024-01-24 12:22:24 +01004260 case TEST_EARLY_DATA_NO_INDICATION_SENT: /* Intentional fallthrough */
4261 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Crond2884662024-03-03 15:03:22 +01004262 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron05d7cfb2024-03-03 15:39:30 +01004263 MBEDTLS_SSL_EARLY_DATA_STATE_IDLE);
Ronald Cron5c208d72024-01-24 10:13:30 +01004264 break;
Ronald Cron2261ab22024-01-24 13:38:31 +01004265
4266 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004267 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Crond2884662024-03-03 15:03:22 +01004268 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron05d7cfb2024-03-03 15:39:30 +01004269 MBEDTLS_SSL_EARLY_DATA_STATE_IDLE);
Ronald Cron2261ab22024-01-24 13:38:31 +01004270 } else {
Ronald Crond2884662024-03-03 15:03:22 +01004271 TEST_EQUAL(client_ep.ssl.early_data_state,
4272 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Cron2261ab22024-01-24 13:38:31 +01004273 }
4274 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004275
4276 default:
4277 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004278 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004279 break;
4280
4281 case MBEDTLS_SSL_SERVER_HELLO:
Ronald Cron5c208d72024-01-24 10:13:30 +01004282 switch (scenario) {
Ronald Crond6dba672024-01-24 12:22:24 +01004283 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4284 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Crond2884662024-03-03 15:03:22 +01004285 TEST_EQUAL(client_ep.ssl.early_data_state,
4286 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
Ronald Cron5c208d72024-01-24 10:13:30 +01004287 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004288
4289 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004290 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004291 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004292 break;
Ronald Cron2261ab22024-01-24 13:38:31 +01004293
4294 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004295 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Crond2884662024-03-03 15:03:22 +01004296 TEST_EQUAL(client_ep.ssl.early_data_state,
4297 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
BensonLioubedd2512024-03-13 20:21:26 +08004298 memcpy(client_random,
4299 client_ep.ssl.handshake->randbytes,
4300 MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
Ronald Cron2261ab22024-01-24 13:38:31 +01004301 } else {
Ronald Crond2884662024-03-03 15:03:22 +01004302 TEST_EQUAL(client_ep.ssl.early_data_state,
4303 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
BensonLioubedd2512024-03-13 20:21:26 +08004304 TEST_MEMORY_COMPARE(client_random,
4305 MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
4306 client_ep.ssl.handshake->randbytes,
4307 MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
Ronald Cron2261ab22024-01-24 13:38:31 +01004308 }
4309 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004310
4311 default:
4312 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004313 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004314 break;
4315
4316 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Ronald Cron5c208d72024-01-24 10:13:30 +01004317 switch (scenario) {
Ronald Crond6dba672024-01-24 12:22:24 +01004318 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4319 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Crond2884662024-03-03 15:03:22 +01004320 TEST_EQUAL(client_ep.ssl.early_data_state,
4321 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
Ronald Cron5c208d72024-01-24 10:13:30 +01004322 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004323
4324 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004325 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004326 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004327 break;
Ronald Cron2261ab22024-01-24 13:38:31 +01004328
4329 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004330 TEST_EQUAL(client_ep.ssl.early_data_state,
4331 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Cron2261ab22024-01-24 13:38:31 +01004332 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004333
4334 default:
4335 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004336 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004337 break;
4338
4339 case MBEDTLS_SSL_SERVER_FINISHED:
Ronald Cron5c208d72024-01-24 10:13:30 +01004340 switch (scenario) {
4341 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004342 TEST_EQUAL(client_ep.ssl.early_data_state,
4343 MBEDTLS_SSL_EARLY_DATA_STATE_ACCEPTED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004344 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004345
4346 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004347 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004348 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004349 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004350
Ronald Cron2261ab22024-01-24 13:38:31 +01004351 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4352 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004353 TEST_EQUAL(client_ep.ssl.early_data_state,
4354 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004355 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004356
4357 default:
4358 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004359 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004360 break;
4361
4362 case MBEDTLS_SSL_END_OF_EARLY_DATA:
Ronald Cron265273e2024-01-24 11:13:19 +01004363 TEST_EQUAL(scenario, TEST_EARLY_DATA_ACCEPTED);
Ronald Crond2884662024-03-03 15:03:22 +01004364 TEST_EQUAL(client_ep.ssl.early_data_state,
4365 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Crona7f94e42024-01-24 09:40:46 +01004366 break;
4367
4368 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Ronald Cron5c208d72024-01-24 10:13:30 +01004369 switch (scenario) {
4370 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004371 TEST_EQUAL(client_ep.ssl.early_data_state,
4372 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004373 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004374
4375 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004376 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004377 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004378 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004379
Ronald Cron2261ab22024-01-24 13:38:31 +01004380 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4381 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004382 TEST_EQUAL(client_ep.ssl.early_data_state,
4383 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004384 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004385
4386 default:
4387 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004388 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004389 break;
4390
4391 case MBEDTLS_SSL_CLIENT_FINISHED:
Ronald Cron5c208d72024-01-24 10:13:30 +01004392 switch (scenario) {
4393 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004394 TEST_EQUAL(client_ep.ssl.early_data_state,
4395 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004396 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004397
4398 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004399 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004400 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004401 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004402
Ronald Cron2261ab22024-01-24 13:38:31 +01004403 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4404 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004405 TEST_EQUAL(client_ep.ssl.early_data_state,
4406 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004407 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004408
4409 default:
4410 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004411 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004412 break;
4413
4414#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
4415 case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO:
Ronald Cron5c208d72024-01-24 10:13:30 +01004416 switch (scenario) {
Ronald Crond6dba672024-01-24 12:22:24 +01004417 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Cron2261ab22024-01-24 13:38:31 +01004418 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4419 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004420 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3641df22024-03-03 16:10:58 +01004421 MBEDTLS_SSL_EARLY_DATA_STATE_IND_SENT);
Ronald Cron5c208d72024-01-24 10:13:30 +01004422 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004423
4424 default:
4425 TEST_FAIL("Unexpected or unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004426 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004427 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004428
Ronald Cron2261ab22024-01-24 13:38:31 +01004429 case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO:
4430 TEST_ASSERT(scenario == TEST_EARLY_DATA_HRR);
Ronald Crond2884662024-03-03 15:03:22 +01004431 TEST_EQUAL(client_ep.ssl.early_data_state,
4432 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Cron2261ab22024-01-24 13:38:31 +01004433 break;
4434
Ronald Cron265273e2024-01-24 11:13:19 +01004435 case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED:
Ronald Crond6dba672024-01-24 12:22:24 +01004436 switch (scenario) {
4437 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004438 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004439 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Crond6dba672024-01-24 12:22:24 +01004440 break;
4441
Ronald Cron2261ab22024-01-24 13:38:31 +01004442 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4443 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004444 TEST_EQUAL(client_ep.ssl.early_data_state,
4445 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004446 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004447
4448 default:
4449 TEST_FAIL("Unexpected or unknown scenario.");
Ronald Crond6dba672024-01-24 12:22:24 +01004450 }
Ronald Cron265273e2024-01-24 11:13:19 +01004451 break;
Ronald Crona7f94e42024-01-24 09:40:46 +01004452#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
4453
4454 case MBEDTLS_SSL_FLUSH_BUFFERS: /* Intentional fallthrough */
4455 case MBEDTLS_SSL_HANDSHAKE_WRAPUP: /* Intentional fallthrough */
4456 case MBEDTLS_SSL_HANDSHAKE_OVER:
Ronald Cron5c208d72024-01-24 10:13:30 +01004457 switch (scenario) {
4458 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004459 TEST_EQUAL(client_ep.ssl.early_data_state,
4460 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004461 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004462
4463 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004464 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004465 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004466 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004467
Ronald Cron2261ab22024-01-24 13:38:31 +01004468 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4469 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004470 TEST_EQUAL(client_ep.ssl.early_data_state,
4471 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004472 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004473
4474 default:
4475 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004476 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004477 break;
4478
4479 default:
4480 TEST_FAIL("Unexpected state.");
4481 }
4482 } while (client_ep.ssl.state != MBEDTLS_SSL_HANDSHAKE_OVER);
4483
Ronald Cron9f2c3c02024-02-21 17:03:22 +01004484 ret = mbedtls_ssl_get_early_data_status(&(client_ep.ssl));
4485 switch (scenario) {
4486 case TEST_EARLY_DATA_ACCEPTED:
4487 TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED);
4488 break;
4489
4490 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Cron840de7f2024-03-11 17:49:35 +01004491 TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_INDICATED);
Ronald Cron9f2c3c02024-02-21 17:03:22 +01004492 break;
4493
4494 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4495 case TEST_EARLY_DATA_HRR:
4496 TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED);
4497 break;
4498
4499 default:
4500 TEST_FAIL("Unknown scenario.");
4501 }
4502
Ronald Crondcb09ca2024-02-22 12:12:45 +01004503 ret = mbedtls_ssl_get_early_data_status(&(server_ep.ssl));
4504 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
4505
Ronald Crona7f94e42024-01-24 09:40:46 +01004506#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Ronald Cron5fbd2702024-02-14 10:03:36 +01004507 TEST_EQUAL(client_ep.ssl.handshake->ccs_sent, 1);
Ronald Crona7f94e42024-01-24 09:40:46 +01004508#endif
4509
4510exit:
4511 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
4512 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
4513 mbedtls_test_free_handshake_options(&client_options);
4514 mbedtls_test_free_handshake_options(&server_options);
4515 mbedtls_ssl_session_free(&saved_session);
4516 PSA_DONE();
4517}
4518/* END_CASE */
Ronald Cron2fbbba92024-01-26 20:13:42 +01004519
4520/* BEGIN_CASE depends_on:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */
4521void tls13_write_early_data(int scenario)
4522{
4523 int ret = -1;
4524 mbedtls_test_ssl_endpoint client_ep, server_ep;
4525 mbedtls_test_handshake_test_options client_options;
4526 mbedtls_test_handshake_test_options server_options;
4527 mbedtls_ssl_session saved_session;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004528 uint16_t group_list[3] = {
4529 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
4530 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
4531 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
4532 };
Ronald Cron00046002024-02-21 16:00:12 +01004533 int beyond_first_hello = 0;
Ronald Cron2fbbba92024-01-26 20:13:42 +01004534
4535 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
4536 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
4537 mbedtls_test_init_handshake_options(&client_options);
4538 mbedtls_test_init_handshake_options(&server_options);
4539 mbedtls_ssl_session_init(&saved_session);
4540
4541 PSA_INIT();
4542
4543 /*
4544 * Run first handshake to get a ticket from the server.
4545 */
4546 client_options.pk_alg = MBEDTLS_PK_ECDSA;
4547 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
4548 server_options.pk_alg = MBEDTLS_PK_ECDSA;
4549 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004550 if (scenario == TEST_EARLY_DATA_HRR) {
4551 client_options.group_list = group_list;
4552 server_options.group_list = group_list;
4553 }
Ronald Cron2fbbba92024-01-26 20:13:42 +01004554
4555 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
4556 &saved_session);
4557 TEST_EQUAL(ret, 0);
4558
Ronald Cron2fbbba92024-01-26 20:13:42 +01004559 /*
4560 * Prepare for handshake with the ticket.
4561 */
4562 switch (scenario) {
4563 case TEST_EARLY_DATA_ACCEPTED:
4564 break;
4565
Ronald Cron8fe2b012024-01-26 20:25:00 +01004566 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4567 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4568 break;
4569
Ronald Cron05600e22024-01-26 10:23:31 +01004570 case TEST_EARLY_DATA_SERVER_REJECTS:
4571 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4572 break;
4573
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004574 case TEST_EARLY_DATA_HRR:
Ronald Cron52472102024-03-08 11:29:28 +01004575 /*
4576 * Remove server support for the group negotiated in
Ronald Crone1295fa2024-03-08 17:03:16 +01004577 * mbedtls_test_get_tls13_ticket() forcing a HelloRetryRequest.
Ronald Cron52472102024-03-08 11:29:28 +01004578 */
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004579 server_options.group_list = group_list + 1;
4580 break;
4581
Ronald Cron2fbbba92024-01-26 20:13:42 +01004582 default:
4583 TEST_FAIL("Unknown scenario.");
4584 }
4585
4586 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
4587 &client_options, NULL, NULL, NULL);
4588 TEST_EQUAL(ret, 0);
4589
4590 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
4591 &server_options, NULL, NULL, NULL);
4592 TEST_EQUAL(ret, 0);
4593
4594 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4595 mbedtls_test_ticket_write,
4596 mbedtls_test_ticket_parse,
4597 NULL);
4598
4599 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4600 &(server_ep.socket), 1024);
4601 TEST_EQUAL(ret, 0);
4602
4603 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4604 TEST_EQUAL(ret, 0);
4605
4606 /*
Ronald Crond4069242024-02-21 13:45:52 +01004607 * Run handshakes going one state further in the handshake sequence at each
4608 * loop up to the point where we reach the MBEDTLS_SSL_HANDSHAKE_OVER
4609 * state. For each reached handshake state, check the result of the call
Ronald Cronbf5e9092024-02-21 15:31:36 +01004610 * to mbedtls_ssl_write_early_data(), make sure we can complete the
4611 * handshake successfully and then reset the connection to restart the
4612 * handshake from scratch.
Ronald Cron2fbbba92024-01-26 20:13:42 +01004613 */
Ronald Cron00046002024-02-21 16:00:12 +01004614 do {
4615 int client_state = client_ep.ssl.state;
4616 int previous_client_state;
4617 const char *early_data_string = "This is early data.";
4618 const unsigned char *early_data = (const unsigned char *) early_data_string;
4619 size_t early_data_len = strlen(early_data_string);
4620 int write_early_data_ret, read_early_data_ret;
4621 unsigned char read_buf[64];
Ronald Cron2fbbba92024-01-26 20:13:42 +01004622
Ronald Cron2fbbba92024-01-26 20:13:42 +01004623 write_early_data_ret = mbedtls_ssl_write_early_data(&(client_ep.ssl),
4624 early_data,
4625 early_data_len);
4626
Ronald Cron8fe2b012024-01-26 20:25:00 +01004627 if (scenario == TEST_EARLY_DATA_NO_INDICATION_SENT) {
4628 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4629 TEST_EQUAL(client_ep.ssl.state, client_state);
Ronald Cronbf5e9092024-02-21 15:31:36 +01004630 goto complete_handshake;
Ronald Cron8fe2b012024-01-26 20:25:00 +01004631 }
4632
Ronald Cron2fbbba92024-01-26 20:13:42 +01004633 switch (client_state) {
Ronald Cron00046002024-02-21 16:00:12 +01004634 case MBEDTLS_SSL_HELLO_REQUEST: /* Intentional fallthrough */
Ronald Cron2fbbba92024-01-26 20:13:42 +01004635 case MBEDTLS_SSL_CLIENT_HELLO:
4636 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004637 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4638 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004639 TEST_EQUAL(write_early_data_ret, early_data_len);
4640 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4641 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004642
4643 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004644 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004645 TEST_EQUAL(write_early_data_ret, early_data_len);
4646 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4647 } else {
4648 beyond_first_hello = 1;
4649 TEST_EQUAL(write_early_data_ret,
4650 MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4651 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_CLIENT_HELLO);
4652 }
4653 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004654
4655 default:
4656 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004657 }
4658 break;
4659
4660 case MBEDTLS_SSL_SERVER_HELLO:
4661 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004662 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4663 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004664 TEST_EQUAL(write_early_data_ret, early_data_len);
4665 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4666 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004667
4668 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004669 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004670 TEST_EQUAL(write_early_data_ret, early_data_len);
4671 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4672 } else {
4673 TEST_EQUAL(write_early_data_ret,
4674 MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4675 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4676 }
4677 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004678
4679 default:
4680 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004681 }
4682 break;
4683
4684 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
4685 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004686 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4687 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004688 TEST_EQUAL(write_early_data_ret, early_data_len);
4689 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
4690 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004691
4692 case TEST_EARLY_DATA_HRR:
4693 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4694 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
4695 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004696
4697 default:
4698 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004699 }
4700 break;
4701
4702 case MBEDTLS_SSL_SERVER_FINISHED:
4703 switch (scenario) {
4704 case TEST_EARLY_DATA_ACCEPTED:
4705 TEST_EQUAL(write_early_data_ret, early_data_len);
4706 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED);
4707 break;
Ronald Cron05600e22024-01-26 10:23:31 +01004708
4709 case TEST_EARLY_DATA_SERVER_REJECTS:
4710 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4711 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED);
4712 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004713
4714 case TEST_EARLY_DATA_HRR:
4715 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4716 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED);
4717 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004718
4719 default:
4720 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004721 }
4722 break;
4723
4724 case MBEDTLS_SSL_END_OF_EARLY_DATA:
4725 TEST_EQUAL(scenario, TEST_EARLY_DATA_ACCEPTED);
4726 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4727 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_END_OF_EARLY_DATA);
4728 break;
4729
4730#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
4731 case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO:
4732 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004733 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004734 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4735 case TEST_EARLY_DATA_HRR:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004736 TEST_EQUAL(write_early_data_ret, early_data_len);
4737 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4738 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004739 default:
4740 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004741 }
4742 break;
4743
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004744 case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO:
4745 TEST_EQUAL(scenario, TEST_EARLY_DATA_HRR);
4746 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4747 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO);
4748 break;
4749
Ronald Cron05600e22024-01-26 10:23:31 +01004750 case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED:
Ronald Cron05600e22024-01-26 10:23:31 +01004751 switch (scenario) {
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004752 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4753 case TEST_EARLY_DATA_HRR:
4754 TEST_EQUAL(write_early_data_ret,
4755 MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4756 TEST_EQUAL(client_ep.ssl.state,
4757 MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED);
Ronald Cron05600e22024-01-26 10:23:31 +01004758 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004759 default:
4760 TEST_FAIL("Unexpected or unknown scenario.");
Ronald Cron05600e22024-01-26 10:23:31 +01004761 }
4762 break;
Ronald Cron2fbbba92024-01-26 20:13:42 +01004763#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
4764
4765 case MBEDTLS_SSL_CLIENT_CERTIFICATE: /* Intentional fallthrough */
4766 case MBEDTLS_SSL_CLIENT_FINISHED: /* Intentional fallthrough */
4767 case MBEDTLS_SSL_FLUSH_BUFFERS: /* Intentional fallthrough */
4768 case MBEDTLS_SSL_HANDSHAKE_WRAPUP: /* Intentional fallthrough */
4769 case MBEDTLS_SSL_HANDSHAKE_OVER:
4770 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004771 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004772 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4773 case TEST_EARLY_DATA_HRR:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004774 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4775 TEST_EQUAL(client_ep.ssl.state, client_state);
4776 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004777 default:
4778 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004779 }
4780 break;
4781
4782 default:
4783 TEST_FAIL("Unexpected state.");
4784 }
4785
Ronald Cronbf5e9092024-02-21 15:31:36 +01004786complete_handshake:
4787 do {
4788 ret = mbedtls_test_move_handshake_to_state(
4789 &(server_ep.ssl), &(client_ep.ssl),
4790 MBEDTLS_SSL_HANDSHAKE_OVER);
4791
4792 if (ret == MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA) {
4793 read_early_data_ret = mbedtls_ssl_read_early_data(
4794 &(server_ep.ssl), read_buf, sizeof(read_buf));
4795
4796 TEST_EQUAL(read_early_data_ret, early_data_len);
4797 }
4798 } while (ret == MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
4799
4800 TEST_EQUAL(ret, 0);
4801 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4802 &(client_ep.ssl), &(server_ep.ssl),
4803 MBEDTLS_SSL_HANDSHAKE_OVER), 0);
4804
Ronald Cron2fbbba92024-01-26 20:13:42 +01004805 mbedtls_test_mock_socket_close(&(client_ep.socket));
4806 mbedtls_test_mock_socket_close(&(server_ep.socket));
4807
4808 ret = mbedtls_ssl_session_reset(&(client_ep.ssl));
4809 TEST_EQUAL(ret, 0);
4810
4811 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4812 TEST_EQUAL(ret, 0);
4813
4814 ret = mbedtls_ssl_session_reset(&(server_ep.ssl));
4815 TEST_EQUAL(ret, 0);
4816
4817 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4818 &(server_ep.socket), 1024);
4819 TEST_EQUAL(ret, 0);
4820
4821 previous_client_state = client_state;
Ronald Cron00046002024-02-21 16:00:12 +01004822 if (previous_client_state == MBEDTLS_SSL_HANDSHAKE_OVER) {
4823 break;
4824 }
4825
4826 /* In case of HRR scenario, once we have been through it, move over
4827 * the first ClientHello and ServerHello otherwise we just keep playing
4828 * this first part of the handshake with HRR.
4829 */
4830 if ((scenario == TEST_EARLY_DATA_HRR) && (beyond_first_hello)) {
4831 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
4832 &(client_ep.ssl), &(server_ep.ssl),
4833 MBEDTLS_SSL_SERVER_HELLO) == 0);
4834 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
4835 &(client_ep.ssl), &(server_ep.ssl),
4836 MBEDTLS_SSL_CLIENT_HELLO) == 0);
4837 }
4838
4839 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4840 &(client_ep.ssl), &(server_ep.ssl),
4841 previous_client_state), 0);
4842
4843 /* Progress the handshake from at least one state */
4844 while (client_ep.ssl.state == previous_client_state) {
4845 ret = mbedtls_ssl_handshake_step(&(client_ep.ssl));
4846 TEST_ASSERT((ret == 0) ||
4847 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4848 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4849 if (client_ep.ssl.state != previous_client_state) {
4850 break;
4851 }
4852 ret = mbedtls_ssl_handshake_step(&(server_ep.ssl));
4853 TEST_ASSERT((ret == 0) ||
4854 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4855 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4856 }
4857 } while (1);
Ronald Cron2fbbba92024-01-26 20:13:42 +01004858
4859exit:
4860 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
4861 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
4862 mbedtls_test_free_handshake_options(&client_options);
4863 mbedtls_test_free_handshake_options(&server_options);
4864 mbedtls_ssl_session_free(&saved_session);
4865 PSA_DONE();
4866}
4867/* END_CASE */
Ronald Cronaad85232024-02-07 08:04:07 +01004868
4869/* BEGIN_CASE depends_on:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_DEBUG_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */
4870void tls13_cli_max_early_data_size(int max_early_data_size_arg)
4871{
4872 int ret = -1;
4873 mbedtls_test_ssl_endpoint client_ep, server_ep;
4874 mbedtls_test_handshake_test_options client_options;
4875 mbedtls_test_handshake_test_options server_options;
4876 mbedtls_ssl_session saved_session;
Ronald Cronae6f9a52024-03-01 16:05:59 +01004877 unsigned char *buf = NULL;
4878 uint32_t buf_size = 64;
Ronald Cronaad85232024-02-07 08:04:07 +01004879 uint32_t max_early_data_size;
4880 uint32_t written_early_data_size = 0;
4881 uint32_t read_early_data_size = 0;
4882
4883 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
4884 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
4885 mbedtls_test_init_handshake_options(&client_options);
4886 mbedtls_test_init_handshake_options(&server_options);
4887 mbedtls_ssl_session_init(&saved_session);
4888
4889 PSA_INIT();
Ronald Cronae6f9a52024-03-01 16:05:59 +01004890 TEST_CALLOC(buf, buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01004891
4892 /*
4893 * Run first handshake to get a ticket from the server.
4894 */
4895
4896 client_options.pk_alg = MBEDTLS_PK_ECDSA;
4897 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
4898 server_options.pk_alg = MBEDTLS_PK_ECDSA;
4899 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
4900 server_options.max_early_data_size = max_early_data_size_arg;
4901
4902 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
4903 &saved_session);
4904 TEST_EQUAL(ret, 0);
4905
4906 /*
4907 * Prepare for handshake with the ticket.
4908 */
4909 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
4910 &client_options, NULL, NULL, NULL);
4911 TEST_EQUAL(ret, 0);
4912
4913 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
4914 &server_options, NULL, NULL, NULL);
4915 TEST_EQUAL(ret, 0);
4916
4917 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4918 mbedtls_test_ticket_write,
4919 mbedtls_test_ticket_parse,
4920 NULL);
4921
4922 max_early_data_size = saved_session.max_early_data_size;
4923 /*
4924 * (max_early_data_size + 1024) for the size of the socket buffers for the
4925 * server one to be able to contain the maximum number of early data bytes
Ronald Cron7c07aab2024-03-01 16:01:27 +01004926 * plus the first flight of client messages. Needed because we cannot
4927 * initiate the handshake on server side before doing all the calls to
Ronald Cronaad85232024-02-07 08:04:07 +01004928 * mbedtls_ssl_write_early_data() we want to test. See below for more
4929 * information.
4930 */
4931 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4932 &(server_ep.socket),
4933 max_early_data_size + 1024);
4934 TEST_EQUAL(ret, 0);
4935
4936 /* If our server is configured with max_early_data_size equal to zero, it
4937 * does not set the MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA flag for
4938 * the tickets it creates. To be able to test early data with a ticket
4939 * allowing early data in its flags but with max_early_data_size equal to
4940 * zero (case supported by our client) tweak the ticket flags here.
4941 */
4942 if (max_early_data_size == 0) {
4943 saved_session.ticket_flags |= MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA;
4944 }
4945
4946 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4947 TEST_EQUAL(ret, 0);
4948
4949 while (written_early_data_size < max_early_data_size) {
Ronald Cronaad85232024-02-07 08:04:07 +01004950 uint32_t remaining = max_early_data_size - written_early_data_size;
4951
Ronald Cronae6f9a52024-03-01 16:05:59 +01004952 for (size_t i = 0; i < buf_size; i++) {
Ronald Cronaad85232024-02-07 08:04:07 +01004953 buf[i] = (unsigned char) (written_early_data_size + i);
4954 }
4955
4956 ret = mbedtls_ssl_write_early_data(&(client_ep.ssl),
4957 buf,
Ronald Cronae6f9a52024-03-01 16:05:59 +01004958 buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01004959
Ronald Cronae6f9a52024-03-01 16:05:59 +01004960 if (buf_size <= remaining) {
4961 TEST_EQUAL(ret, buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01004962 } else {
4963 TEST_EQUAL(ret, remaining);
4964 }
Ronald Cronae6f9a52024-03-01 16:05:59 +01004965 written_early_data_size += buf_size;
Ronald Cronaad85232024-02-07 08:04:07 +01004966 }
Ronald Cron7c07aab2024-03-01 16:01:27 +01004967 TEST_EQUAL(client_ep.ssl.total_early_data_size, max_early_data_size);
Ronald Cronaad85232024-02-07 08:04:07 +01004968
Ronald Cronaad85232024-02-07 08:04:07 +01004969 ret = mbedtls_ssl_write_early_data(&(client_ep.ssl), buf, 1);
4970 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
Ronald Cronde9b03d2024-03-01 15:14:17 +01004971 TEST_EQUAL(client_ep.ssl.total_early_data_size, max_early_data_size);
Ronald Crond2884662024-03-03 15:03:22 +01004972 TEST_EQUAL(client_ep.ssl.early_data_state,
4973 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
Ronald Cronaad85232024-02-07 08:04:07 +01004974
4975 /*
4976 * Now, check data on server side. It is not done in the previous loop as
4977 * in the first call to mbedtls_ssl_handshake(), the server ends up sending
4978 * its Finished message and then in the following call to
4979 * mbedtls_ssl_write_early_data() we go past the early data writing window
4980 * and we cannot test multiple calls to the API is this writing window.
4981 */
4982 while (read_early_data_size < max_early_data_size) {
4983 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
4984 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
4985
4986 ret = mbedtls_ssl_read_early_data(&(server_ep.ssl),
4987 buf,
Ronald Cronae6f9a52024-03-01 16:05:59 +01004988 buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01004989 TEST_ASSERT(ret > 0);
4990
4991 for (size_t i = 0; i < (size_t) ret; i++) {
4992 TEST_EQUAL(buf[i], (unsigned char) (read_early_data_size + i));
4993 }
4994
4995 read_early_data_size += ret;
4996 }
4997 TEST_EQUAL(read_early_data_size, max_early_data_size);
4998
4999 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5000 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
5001
Ronald Cron7c07aab2024-03-01 16:01:27 +01005002 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
5003 &(client_ep.ssl), &(server_ep.ssl), MBEDTLS_SSL_HANDSHAKE_OVER)
5004 == 0);
Ronald Cronaad85232024-02-07 08:04:07 +01005005
5006exit:
5007 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
5008 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
5009 mbedtls_test_free_handshake_options(&client_options);
5010 mbedtls_test_free_handshake_options(&server_options);
5011 mbedtls_ssl_session_free(&saved_session);
Ronald Cronae6f9a52024-03-01 16:05:59 +01005012 mbedtls_free(buf);
Ronald Cronaad85232024-02-07 08:04:07 +01005013 PSA_DONE();
5014}
5015/* END_CASE */
Ronald Cron61fd13c2024-03-10 18:09:47 +01005016
Ronald Cron2160bfe2024-02-07 08:04:07 +01005017/*
5018 * The !MBEDTLS_SSL_PROTO_TLS1_2 dependency of tls13_early_data() below is
5019 * a temporary workaround to not run the test in Windows-2013 where there is
5020 * an issue with mbedtls_vsnprintf().
5021 */
5022/* BEGIN_CASE depends_on:!MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_DEBUG_C:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_VERIFY:MBEDTLS_SSL_SESSION_TICKETS */
Ronald Cron25ad10a2024-02-29 00:39:23 +01005023void tls13_srv_max_early_data_size(int scenario, int max_early_data_size_arg, int write_size_arg)
Ronald Cron2160bfe2024-02-07 08:04:07 +01005024{
5025 int ret = -1;
5026 mbedtls_test_ssl_endpoint client_ep, server_ep;
5027 mbedtls_test_handshake_test_options client_options;
5028 mbedtls_test_handshake_test_options server_options;
5029 mbedtls_ssl_session saved_session;
5030 mbedtls_test_ssl_log_pattern server_pattern = { NULL, 0 };
Ronald Cron01d273d2024-02-09 16:17:10 +01005031 uint16_t group_list[3] = {
5032 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5033 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
5034 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
5035 };
Ronald Cron2160bfe2024-02-07 08:04:07 +01005036 char pattern[128];
Ronald Cron25ad10a2024-02-29 00:39:23 +01005037 unsigned char *buf_write = NULL;
5038 uint32_t write_size = (uint32_t) write_size_arg;
5039 unsigned char *buf_read = NULL;
5040 uint32_t read_size;
Ronald Cron4facb0a2024-03-08 11:40:07 +01005041 uint32_t expanded_early_data_chunk_size = 0;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005042 uint32_t written_early_data_size = 0;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005043 uint32_t max_early_data_size;
5044
5045 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
5046 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
5047 mbedtls_test_init_handshake_options(&client_options);
5048 mbedtls_test_init_handshake_options(&server_options);
5049 mbedtls_ssl_session_init(&saved_session);
Ronald Crone93cd1b2024-03-01 19:30:00 +01005050 PSA_INIT();
5051
Ronald Cron25ad10a2024-02-29 00:39:23 +01005052 TEST_CALLOC(buf_write, write_size);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005053
5054 /*
Ronald Cron25ad10a2024-02-29 00:39:23 +01005055 * Allocate a smaller buffer for early data reading to exercise the reading
5056 * of data in one record in multiple calls.
Ronald Crondc81b732024-02-26 15:02:26 +01005057 */
Ronald Cron25ad10a2024-02-29 00:39:23 +01005058 read_size = (write_size / 2) + 1;
5059 TEST_CALLOC(buf_read, read_size);
5060
Ronald Crondc81b732024-02-26 15:02:26 +01005061 /*
Ronald Cron2160bfe2024-02-07 08:04:07 +01005062 * Run first handshake to get a ticket from the server.
5063 */
5064
5065 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cron01d273d2024-02-09 16:17:10 +01005066 client_options.group_list = group_list;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005067 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
5068 server_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cron01d273d2024-02-09 16:17:10 +01005069 server_options.group_list = group_list;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005070 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
5071 server_options.max_early_data_size = max_early_data_size_arg;
5072
5073 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
5074 &saved_session);
5075 TEST_EQUAL(ret, 0);
5076
5077 /*
5078 * Prepare for handshake with the ticket.
5079 */
5080 server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
5081 server_options.srv_log_obj = &server_pattern;
5082 server_pattern.pattern = pattern;
5083
5084 switch (scenario) {
5085 case TEST_EARLY_DATA_ACCEPTED:
5086 break;
5087
Ronald Cron919e5962024-02-08 15:48:29 +01005088 case TEST_EARLY_DATA_SERVER_REJECTS:
5089 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
5090 ret = mbedtls_snprintf(pattern, sizeof(pattern),
5091 "EarlyData: deprotect and discard app data records.");
5092 TEST_ASSERT(ret < (int) sizeof(pattern));
5093 mbedtls_debug_set_threshold(3);
5094 break;
5095
Ronald Cron01d273d2024-02-09 16:17:10 +01005096 case TEST_EARLY_DATA_HRR:
Ronald Cron52472102024-03-08 11:29:28 +01005097 /*
5098 * Remove server support for the group negotiated in
5099 * mbedtls_test_get_tls13_ticket() forcing an HelloRetryRequest.
5100 */
Ronald Cron01d273d2024-02-09 16:17:10 +01005101 server_options.group_list = group_list + 1;
5102 ret = mbedtls_snprintf(
5103 pattern, sizeof(pattern),
5104 "EarlyData: Ignore application message before 2nd ClientHello");
5105 TEST_ASSERT(ret < (int) sizeof(pattern));
5106 mbedtls_debug_set_threshold(3);
5107 break;
5108
Ronald Cron2160bfe2024-02-07 08:04:07 +01005109 default:
5110 TEST_FAIL("Unknown scenario.");
5111 }
5112
5113 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
5114 &client_options, NULL, NULL, NULL);
5115 TEST_EQUAL(ret, 0);
5116
5117 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
5118 &server_options, NULL, NULL, NULL);
5119 TEST_EQUAL(ret, 0);
5120
5121 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
5122 mbedtls_test_ticket_write,
5123 mbedtls_test_ticket_parse,
5124 NULL);
5125
5126 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
5127 &(server_ep.socket), 1024);
5128 TEST_EQUAL(ret, 0);
5129
5130 max_early_data_size = saved_session.max_early_data_size;
5131
5132 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
5133 TEST_EQUAL(ret, 0);
5134
5135 /*
5136 * Start an handshake based on the ticket up to the point where early data
5137 * can be sent from client side. Then send in a loop as much early data as
5138 * possible without going over the maximum permitted size for the ticket.
5139 * Finally, do a last writting to go past that maximum permitted size and
5140 * check that we detect it.
5141 */
5142 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
5143 &(client_ep.ssl), &(server_ep.ssl),
5144 MBEDTLS_SSL_SERVER_HELLO), 0);
5145
Ronald Crond2884662024-03-03 15:03:22 +01005146 TEST_ASSERT(client_ep.ssl.early_data_state !=
Ronald Cron3c5a6832024-03-03 15:46:57 +01005147 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005148
5149 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5150 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
5151
Ronald Cron25ad10a2024-02-29 00:39:23 +01005152 /*
5153 * Write and if possible read as much as possible chunks of write_size
5154 * bytes data without getting over the max_early_data_size limit.
5155 */
5156 do {
Ronald Cron2160bfe2024-02-07 08:04:07 +01005157 uint32_t read_early_data_size = 0;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005158
Ronald Cron52472102024-03-08 11:29:28 +01005159 /*
5160 * The contents of the early data are not very important, write a
5161 * pattern that varies byte-by-byte and is different for every chunk of
5162 * early data.
5163 */
Ronald Cron25ad10a2024-02-29 00:39:23 +01005164 if ((written_early_data_size + write_size) > max_early_data_size) {
5165 break;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005166 }
5167
Ronald Cron25ad10a2024-02-29 00:39:23 +01005168 /*
5169 * If the server rejected early data, base the determination of when
Ronald Cron4facb0a2024-03-08 11:40:07 +01005170 * to stop the loop on the expanded size (padding and encryption
Ronald Cron25ad10a2024-02-29 00:39:23 +01005171 * expansion) of early data on server side and the number of early data
Ronald Cron4facb0a2024-03-08 11:40:07 +01005172 * received so far by the server (multiple of the expanded size).
Ronald Cron25ad10a2024-02-29 00:39:23 +01005173 */
Ronald Cron4facb0a2024-03-08 11:40:07 +01005174 if ((expanded_early_data_chunk_size != 0) &&
Ronald Cron25ad10a2024-02-29 00:39:23 +01005175 ((server_ep.ssl.total_early_data_size +
Ronald Cron4facb0a2024-03-08 11:40:07 +01005176 expanded_early_data_chunk_size) > max_early_data_size)) {
Ronald Cron25ad10a2024-02-29 00:39:23 +01005177 break;
5178 }
5179
5180 for (size_t i = 0; i < write_size; i++) {
Ronald Cron2160bfe2024-02-07 08:04:07 +01005181 buf_write[i] = (unsigned char) (written_early_data_size + i);
5182 }
5183
Ronald Cron25ad10a2024-02-29 00:39:23 +01005184 ret = write_early_data(&(client_ep.ssl), buf_write, write_size);
5185 TEST_EQUAL(ret, write_size);
5186 written_early_data_size += write_size;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005187
5188 switch (scenario) {
5189 case TEST_EARLY_DATA_ACCEPTED:
Ronald Cron25ad10a2024-02-29 00:39:23 +01005190 while (read_early_data_size < write_size) {
Ronald Cron2160bfe2024-02-07 08:04:07 +01005191 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5192 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
5193
5194 ret = mbedtls_ssl_read_early_data(&(server_ep.ssl),
Ronald Cron25ad10a2024-02-29 00:39:23 +01005195 buf_read, read_size);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005196 TEST_ASSERT(ret > 0);
5197
5198 TEST_MEMORY_COMPARE(buf_read, ret,
5199 buf_write + read_early_data_size, ret);
5200 read_early_data_size += ret;
5201
Ronald Cron19bfe0a2024-02-26 16:43:01 +01005202 TEST_EQUAL(server_ep.ssl.total_early_data_size,
Ronald Cron2160bfe2024-02-07 08:04:07 +01005203 written_early_data_size);
5204 }
5205 break;
Ronald Cron919e5962024-02-08 15:48:29 +01005206
Ronald Cron01d273d2024-02-09 16:17:10 +01005207 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
5208 case TEST_EARLY_DATA_HRR:
Ronald Cron919e5962024-02-08 15:48:29 +01005209 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5210 /*
Ronald Cron1a13e2f2024-03-08 14:44:35 +01005211 * In this write loop we try to always stay below the
5212 * max_early_data_size limit but if max_early_data_size is very
5213 * small we may exceed the max_early_data_size limit on the
5214 * first write. In TEST_EARLY_DATA_SERVER_REJECTS/
5215 * TEST_EARLY_DATA_HRR scenario, this is for sure the case if
5216 * max_early_data_size is smaller than the smallest possible
5217 * inner content/protected record. Take into account this
5218 * possibility here but only for max_early_data_size values
Ronald Crone1295fa2024-03-08 17:03:16 +01005219 * that are close to write_size. Below, '1' is for the inner
5220 * type byte and '16' is to take into account some AEAD
5221 * expansion (tag, ...).
Ronald Cron919e5962024-02-08 15:48:29 +01005222 */
5223 if (ret == MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE) {
Ronald Cron1a13e2f2024-03-08 14:44:35 +01005224 if (scenario == TEST_EARLY_DATA_SERVER_REJECTS) {
5225 TEST_LE_U(max_early_data_size,
5226 write_size + 1 +
5227 MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY);
5228 } else {
5229 TEST_LE_U(max_early_data_size,
5230 write_size + 1 + 16 +
5231 MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY);
5232 }
Ronald Cron919e5962024-02-08 15:48:29 +01005233 goto exit;
5234 }
5235
5236 TEST_ASSERT(ret == MBEDTLS_ERR_SSL_WANT_READ);
5237
5238 TEST_EQUAL(server_pattern.counter, 1);
5239 server_pattern.counter = 0;
Ronald Cron4facb0a2024-03-08 11:40:07 +01005240 if (expanded_early_data_chunk_size == 0) {
5241 expanded_early_data_chunk_size = server_ep.ssl.total_early_data_size;
Ronald Cron919e5962024-02-08 15:48:29 +01005242 }
Ronald Cron919e5962024-02-08 15:48:29 +01005243 break;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005244 }
Ronald Cron4facb0a2024-03-08 11:40:07 +01005245 TEST_LE_U(server_ep.ssl.total_early_data_size, max_early_data_size);
Ronald Cron25ad10a2024-02-29 00:39:23 +01005246 } while (1);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005247
5248 mbedtls_debug_set_threshold(3);
Ronald Cron25ad10a2024-02-29 00:39:23 +01005249 ret = write_early_data(&(client_ep.ssl), buf_write, write_size);
5250 TEST_EQUAL(ret, write_size);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005251
5252 ret = mbedtls_snprintf(pattern, sizeof(pattern),
Ronald Cron70eab452024-02-26 15:50:15 +01005253 "EarlyData: Too much early data received");
Ronald Cron2160bfe2024-02-07 08:04:07 +01005254 TEST_ASSERT(ret < (int) sizeof(pattern));
5255
5256 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5257 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
5258 TEST_EQUAL(server_pattern.counter, 1);
5259
5260exit:
5261 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
5262 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
5263 mbedtls_test_free_handshake_options(&client_options);
5264 mbedtls_test_free_handshake_options(&server_options);
5265 mbedtls_ssl_session_free(&saved_session);
Ronald Crone93cd1b2024-03-01 19:30:00 +01005266 mbedtls_free(buf_write);
5267 mbedtls_free(buf_read);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005268 mbedtls_debug_set_threshold(0);
5269 PSA_DONE();
5270}
5271/* END_CASE */
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005272
Manuel Pégourié-Gonnard428ce0a2025-02-25 10:32:20 +01005273/* BEGIN_CASE depends_on:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnardf83bc792025-02-12 12:36:28 +01005274void inject_client_content_on_the_wire(int pk_alg,
5275 int state, data_t *data,
5276 char *log_pattern, int expected_ret)
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005277{
5278 /* This function allows us to inject content at a specific state
5279 * in the handshake, or when it's completed. The content is injected
5280 * on the mock TCP socket, as if we were an active network attacker.
5281 *
5282 * This function is suitable to inject:
5283 * - crafted records, at any point;
5284 * - valid records that contain crafted handshake messages, but only
5285 * when the traffic is still unprotected (for TLS 1.2 that's most of the
5286 * handshake, for TLS 1.3 that's only the Hello messages);
5287 * - handshake messages that are fragmented in a specific way,
5288 * under the same conditions as above.
5289 */
5290 enum { BUFFSIZE = 16384 };
5291 mbedtls_test_ssl_endpoint server, client;
5292 mbedtls_platform_zeroize(&server, sizeof(server));
5293 mbedtls_platform_zeroize(&client, sizeof(client));
5294 mbedtls_test_handshake_test_options options;
5295 mbedtls_test_init_handshake_options(&options);
5296 mbedtls_test_ssl_log_pattern srv_pattern;
5297 memset(&srv_pattern, 0, sizeof(srv_pattern));
5298 int ret = -1;
5299
5300 PSA_INIT();
5301
5302 srv_pattern.pattern = log_pattern;
5303 options.srv_log_obj = &srv_pattern;
5304 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
Manuel Pégourié-Gonnard43a04e72025-03-11 12:12:51 +01005305 mbedtls_debug_set_threshold(3);
Manuel Pégourié-Gonnardf83bc792025-02-12 12:36:28 +01005306
5307 options.pk_alg = pk_alg;
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005308
5309 ret = mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
5310 &options, NULL, NULL, NULL);
5311 TEST_EQUAL(ret, 0);
5312
5313 ret = mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
5314 &options, NULL, NULL, NULL);
5315 TEST_EQUAL(ret, 0);
5316
5317 ret = mbedtls_test_mock_socket_connect(&server.socket, &client.socket,
5318 BUFFSIZE);
5319 TEST_EQUAL(ret, 0);
5320
5321 /* Make the server move to the required state */
5322 ret = mbedtls_test_move_handshake_to_state(&client.ssl, &server.ssl, state);
5323 TEST_EQUAL(ret, 0);
5324
5325 /* Send the crafted message */
Manuel Pégourié-Gonnardf83bc792025-02-12 12:36:28 +01005326 ret = mbedtls_test_mock_tcp_send_b(&client.socket, data->x, data->len);
Manuel Pégourié-Gonnard8476c382025-03-11 10:27:49 +01005327 TEST_EQUAL(ret, (int) data->len);
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005328
5329 /* Have the server process it.
5330 * Need the loop because a server that support 1.3 and 1.2
5331 * will process a 1.2 ClientHello in two steps.
5332 */
5333 do {
5334 ret = mbedtls_ssl_handshake_step(&server.ssl);
5335 } while (ret == 0 && server.ssl.state == state);
5336 TEST_EQUAL(ret, expected_ret);
Manuel Pégourié-Gonnard43a04e72025-03-11 12:12:51 +01005337 TEST_ASSERT(srv_pattern.counter >= 1);
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005338
5339exit:
5340 mbedtls_test_free_handshake_options(&options);
5341 mbedtls_test_ssl_endpoint_free(&server, NULL);
5342 mbedtls_test_ssl_endpoint_free(&client, NULL);
5343 mbedtls_debug_set_threshold(0);
5344 PSA_DONE();
5345}
5346/* END_CASE */
Manuel Pégourié-Gonnard6b25c502025-02-26 13:01:10 +01005347
Manuel Pégourié-Gonnard996c4c02025-03-04 10:12:25 +01005348/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_MD_CAN_SHA256:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_SIGN:MBEDTLS_PK_CAN_ECDSA_VERIFY */
Manuel Pégourié-Gonnard6b25c502025-02-26 13:01:10 +01005349void send_large_fragmented_hello(int hs_len_int, int first_frag_content_len_int,
5350 char *log_pattern, int expected_ret)
5351{
5352 /* This function sends a long message (claiming to be a ClientHello)
5353 * fragmented in 1-byte fragments (except the initial fragment).
5354 * The purpose is to test how the stack reacts when receiving:
5355 * - a message larger than our buffer;
5356 * - a message smaller than our buffer, but where the intermediate size of
5357 * holding all the fragments (including overhead) is larger than our
5358 * buffer.
5359 */
5360 enum { BUFFSIZE = 16384 };
5361 mbedtls_test_ssl_endpoint server, client;
5362 mbedtls_platform_zeroize(&server, sizeof(server));
5363 mbedtls_platform_zeroize(&client, sizeof(client));
5364
5365 mbedtls_test_handshake_test_options options;
5366 mbedtls_test_init_handshake_options(&options);
5367
5368 mbedtls_test_ssl_log_pattern srv_pattern;
5369 memset(&srv_pattern, 0, sizeof(srv_pattern));
5370
5371 unsigned char *first_frag = NULL;
5372 int ret = -1;
5373
5374 size_t hs_len = (size_t) hs_len_int;
5375 size_t first_frag_content_len = (size_t) first_frag_content_len_int;
5376
5377 PSA_INIT();
5378
5379 srv_pattern.pattern = log_pattern;
5380 options.srv_log_obj = &srv_pattern;
5381 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
Manuel Pégourié-Gonnard051b1e22025-03-05 11:53:09 +01005382 mbedtls_debug_set_threshold(1);
Manuel Pégourié-Gonnard6b25c502025-02-26 13:01:10 +01005383
Manuel Pégourié-Gonnard996c4c02025-03-04 10:12:25 +01005384 // Does't really matter but we want to know to declare dependencies.
5385 options.pk_alg = MBEDTLS_PK_ECDSA;
5386
Manuel Pégourié-Gonnard6b25c502025-02-26 13:01:10 +01005387 ret = mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
5388 &options, NULL, NULL, NULL);
5389 TEST_EQUAL(ret, 0);
5390
5391 ret = mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
5392 &options, NULL, NULL, NULL);
5393 TEST_EQUAL(ret, 0);
5394
5395 ret = mbedtls_test_mock_socket_connect(&server.socket, &client.socket,
5396 BUFFSIZE);
5397 TEST_EQUAL(ret, 0);
5398
5399 /* Make the server move past the initial dummy state */
5400 ret = mbedtls_test_move_handshake_to_state(&client.ssl, &server.ssl,
5401 MBEDTLS_SSL_CLIENT_HELLO);
5402 TEST_EQUAL(ret, 0);
5403
5404 /* Prepare initial fragment */
5405 const size_t first_len = 5 // record header, see below
5406 + 4 // handshake header, see balow
5407 + first_frag_content_len;
5408 TEST_CALLOC(first_frag, first_len);
5409 unsigned char *p = first_frag;
5410 // record header
5411 // record type: handshake
5412 *p++ = 0x16,
5413 // record version (actually common to TLS 1.2 and TLS 1.3)
5414 *p++ = 0x03,
5415 *p++ = 0x03,
5416 // record length: two bytes
5417 *p++ = (unsigned char) (((4 + first_frag_content_len) >> 8) & 0xff);
5418 *p++ = (unsigned char) (((4 + first_frag_content_len) >> 0) & 0xff);
5419 // handshake header
5420 // handshake type: ClientHello
5421 *p++ = 0x01,
5422 // handshake length: three bytes
5423 *p++ = (unsigned char) ((hs_len >> 16) & 0xff);
5424 *p++ = (unsigned char) ((hs_len >> 8) & 0xff);
5425 *p++ = (unsigned char) ((hs_len >> 0) & 0xff);
5426 // handshake content: dummy value
5427 memset(p, 0x2a, first_frag_content_len);
5428
5429 /* Send initial fragment and have the server process it. */
5430 ret = mbedtls_test_mock_tcp_send_b(&client.socket, first_frag, first_len);
5431 TEST_ASSERT(ret >= 0 && (size_t) ret == first_len);
5432
5433 ret = mbedtls_ssl_handshake_step(&server.ssl);
5434 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
5435
5436 /* Dummy 1-byte fragment to repeatedly send next */
5437 const unsigned char next[] = {
5438 0x16, 0x03, 0x03, 0x00, 0x01, // record header (see above)
5439 0x2a, // Dummy handshake message content
5440 };
5441 for (size_t left = hs_len - first_frag_content_len; left != 0; left--) {
5442 ret = mbedtls_test_mock_tcp_send_b(&client.socket, next, sizeof(next));
5443 TEST_ASSERT(ret >= 0 && (size_t) ret == sizeof(next));
5444
5445 ret = mbedtls_ssl_handshake_step(&server.ssl);
5446 if (ret != MBEDTLS_ERR_SSL_WANT_READ) {
5447 break;
5448 }
5449 }
5450 TEST_EQUAL(ret, expected_ret);
5451 TEST_EQUAL(srv_pattern.counter, 1);
5452
5453exit:
5454 mbedtls_test_free_handshake_options(&options);
5455 mbedtls_test_ssl_endpoint_free(&server, NULL);
5456 mbedtls_test_ssl_endpoint_free(&client, NULL);
5457 mbedtls_debug_set_threshold(0);
5458 mbedtls_free(first_frag);
5459 PSA_DONE();
5460}
5461/* END_CASE */