blob: bcc371351d6eb0779060e1283ccc415631f3fa31 [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 */
Gilles Peskinead840442025-03-07 20:48:01 +010068 RECOMBINE_SPLIT_FIRST, /* param: offset of split (<=0 means from end) */
69 RECOMBINE_INSERT_EMPTY, /* param: offset (<0 means from end) */
Gilles Peskine39bcbb62025-03-07 20:40:50 +010070 RECOMBINE_COALESCE, /* param: min number of records */
Gilles Peskinead840442025-03-07 20:48:01 +010071 RECOMBINE_COALESCE_SPLIT_ONCE, /* param: offset of split (<=0 means from end) */
72 RECOMBINE_COALESCE_SPLIT_ENDS, /* the hairiest one? param: offset, must be >0 */
Gilles Peskine39bcbb62025-03-07 20:40:50 +010073} recombine_records_instruction_t;
74
Gilles Peskine7cdf5632025-03-07 23:01:42 +010075#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
76
Gilles Peskinead840442025-03-07 20:48:01 +010077/* Split the first record into two pieces of lengths offset and
78 * record_length-offset. If offset is zero or negative, count from the end of
79 * the record. */
80static int recombine_split_first_record(mbedtls_test_ssl_buffer *buf,
81 int offset)
82{
83 const size_t header_length = 5;
84 TEST_LE_U(header_length, buf->content_length);
85 size_t record_length = MBEDTLS_GET_UINT16_BE(buf->buffer, header_length - 2);
86
87 if (offset > 0) {
88 TEST_LE_S(offset, record_length);
89 } else {
90 TEST_LE_S(-offset, record_length);
91 offset = record_length + offset;
92 }
93
94 /* Check that we have room to insert a record header */
95 TEST_LE_U(buf->content_length + header_length, buf->capacity);
96
97 /* Make room for a record header */
98 size_t new_record_start = header_length + offset;
99 size_t new_content_start = new_record_start + header_length;
100 memmove(buf->buffer + new_content_start,
101 buf->buffer + new_record_start,
102 buf->content_length - new_record_start);
103 buf->content_length += header_length;
104
105 /* Construct a header for the new record based on the existing one */
106 memcpy(buf->buffer + new_record_start, buf->buffer, header_length);
107 MBEDTLS_PUT_UINT16_BE(record_length - offset,
108 buf->buffer, new_content_start - 2);
109
110 /* Adjust the length of the first record */
111 MBEDTLS_PUT_UINT16_BE(offset, buf->buffer, header_length - 2);
112
113 return 0;
114
115exit:
116 return -1;
117}
118
119/* Insert an empty record at the given offset. If offset is negative,
120 * count from the end of the first record. */
121static int recombine_insert_empty_record(mbedtls_test_ssl_buffer *buf,
122 int offset)
123{
124 const size_t header_length = 5;
125 TEST_LE_U(header_length, buf->content_length);
126 size_t record_length = MBEDTLS_GET_UINT16_BE(buf->buffer, header_length - 2);
127
128 if (offset >= 0) {
129 TEST_LE_S(offset, record_length);
130 } else {
131 TEST_LE_S(-offset, record_length);
132 offset = record_length + offset;
133 }
134
135 /* Check that we have room to insert two record headers */
136 TEST_LE_U(buf->content_length + 2 * header_length, buf->capacity);
137
138 /* Make room for an empty record and a record header */
139 size_t empty_record_start = header_length + offset;
140 size_t empty_content_start = empty_record_start + header_length;
141 size_t tail_record_start = empty_content_start;
142 size_t tail_content_start = tail_record_start + header_length;
143 memmove(buf->buffer + tail_content_start,
144 buf->buffer + tail_record_start,
145 buf->content_length - tail_record_start);
146 buf->content_length += 2 * header_length;
147
148 /* Construct headers for the new records based on the existing one */
149 memcpy(buf->buffer + empty_record_start, buf->buffer, header_length);
150 MBEDTLS_PUT_UINT16_BE(0, buf->buffer, empty_content_start - 2);
151 memcpy(buf->buffer + tail_record_start, buf->buffer, header_length);
152 MBEDTLS_PUT_UINT16_BE(record_length - offset,
153 buf->buffer, tail_content_start - 2);
154
155 /* Adjust the length of the first record */
156 MBEDTLS_PUT_UINT16_BE(offset, buf->buffer, header_length - 2);
157
158 return 0;
159
160exit:
161 return -1;
162}
163
Gilles Peskine39bcbb62025-03-07 20:40:50 +0100164/* Coalesce TLS handshake records.
165 * DTLS is not supported.
166 * Encrypted or authenticated handshake records are not supported.
167 * Assume the buffer content is a valid sequence of records.
168 */
169static int recombine_coalesce_handshake_records(mbedtls_test_ssl_buffer *buf,
170 int max)
171{
172 const size_t header_length = 5;
173 TEST_LE_U(header_length, buf->content_length);
174 if (buf->buffer[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
175 return 0;
176 }
177
178 size_t record_length = MBEDTLS_GET_UINT16_BE(buf->buffer, header_length - 2);
179 TEST_LE_U(header_length + record_length, buf->content_length);
180
181 int count;
182 for (count = 1; count < max; count++) {
183 size_t next_start = header_length + record_length;
184 if (next_start >= buf->content_length) {
185 /* We've already reached the last record. */
186 break;
187 }
188
189 TEST_LE_U(next_start + header_length, buf->content_length);
190 if (buf->buffer[next_start] != MBEDTLS_SSL_MSG_HANDSHAKE) {
191 /* There's another record, but it isn't a handshake record. */
192 break;
193 }
194 size_t next_length =
195 MBEDTLS_GET_UINT16_BE(buf->buffer, next_start + header_length - 2);
196 TEST_LE_U(next_start + header_length + next_length, buf->content_length);
197
198 /* Erase the next record header */
199 memmove(buf->buffer + next_start,
200 buf->buffer + next_start + header_length,
201 buf->content_length - next_start);
202 buf->content_length -= header_length;
203 /* Update the first record length */
204 record_length += next_length;
205 TEST_LE_U(record_length, 0xffff);
206 MBEDTLS_PUT_UINT16_BE(record_length, buf->buffer, header_length - 2);
207 }
208
209 return count;
210
211exit:
212 return -1;
213}
214
215static int recombine_records(mbedtls_test_ssl_endpoint *server,
216 recombine_records_instruction_t instruction,
217 int param)
218{
219 mbedtls_test_ssl_buffer *buf = server->socket.output;
220 int ret;
221
222 /* buf is a circular buffer. For simplicity, this code assumes that
223 * the data is located at the beginning. This should be ok since
224 * this function is only meant to be used on the first flight
225 * emitted by a server. */
226 TEST_EQUAL(buf->start, 0);
227
228 switch (instruction) {
229 case RECOMBINE_NOMINAL:
230 break;
231
Gilles Peskinead840442025-03-07 20:48:01 +0100232 case RECOMBINE_SPLIT_FIRST:
233 ret = recombine_split_first_record(buf, param);
234 TEST_LE_S(0, ret);
235 break;
236
237 case RECOMBINE_INSERT_EMPTY:
238 ret = recombine_insert_empty_record(buf, param);
239 TEST_LE_S(0, ret);
240 break;
241
Gilles Peskine39bcbb62025-03-07 20:40:50 +0100242 case RECOMBINE_COALESCE:
243 ret = recombine_coalesce_handshake_records(buf, param);
244 if (param == INT_MAX) {
245 TEST_LE_S(1, ret);
246 } else {
247 TEST_EQUAL(ret, param);
248 }
249 break;
250
Gilles Peskinead840442025-03-07 20:48:01 +0100251 case RECOMBINE_COALESCE_SPLIT_ONCE:
252 ret = recombine_coalesce_handshake_records(buf, INT_MAX);
253 /* Require at least two coalesced records, otherwise this
254 * doesn't lead to a meaningful test (use
255 * RECOMBINE_SPLIT_FIRST instead). */
256 TEST_LE_S(2, ret);
257 ret = recombine_split_first_record(buf, param);
258 TEST_LE_S(0, ret);
259 break;
260
261 case RECOMBINE_COALESCE_SPLIT_ENDS:
262 ret = recombine_coalesce_handshake_records(buf, INT_MAX);
263 /* Accept a single record, which will be split at both ends */
264 TEST_LE_S(1, ret);
265 TEST_LE_S(1, param);
266 ret = recombine_split_first_record(buf, -param);
267 TEST_LE_S(0, ret);
268 ret = recombine_split_first_record(buf, param);
269 TEST_LE_S(0, ret);
270 break;
271
Gilles Peskine39bcbb62025-03-07 20:40:50 +0100272 default:
273 TEST_FAIL("Instructions not understood");
274 }
275
276 return 1;
277
278exit:
279 return 0;
280}
281
Gilles Peskine7cdf5632025-03-07 23:01:42 +0100282#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
283
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +0200284/* END_HEADER */
285
286/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200287 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +0200288 * END_DEPENDENCIES
289 */
290
Janos Follath6264e662019-11-26 11:11:15 +0000291/* BEGIN_CASE */
292void test_callback_buffer_sanity()
293{
294 enum { MSGLEN = 10 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800295 mbedtls_test_ssl_buffer buf;
Gilles Peskine21e46b32023-10-17 16:35:20 +0200296 mbedtls_test_ssl_buffer_init(&buf);
Janos Follath6264e662019-11-26 11:11:15 +0000297 unsigned char input[MSGLEN];
298 unsigned char output[MSGLEN];
299
Valerio Setti285dae82023-04-19 15:10:45 +0200300 USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 memset(input, 0, sizeof(input));
Janos Follath6264e662019-11-26 11:11:15 +0000302
303 /* Make sure calling put and get on NULL buffer results in error. */
Yanray Wangf7b62352022-10-26 11:51:53 +0800304 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, input, sizeof(input))
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 == -1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800306 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, output, sizeof(output))
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 == -1);
Yanray Wangbd296832022-10-26 18:28:11 +0800308 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, sizeof(input))
309 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -0500310
Yanray Wangf7b62352022-10-26 11:51:53 +0800311 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, 0) == -1);
312 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +0000313
314 /* Make sure calling put and get on a buffer that hasn't been set up results
Shaun Case8b0ecbc2021-12-20 21:14:10 -0800315 * in error. */
Yanray Wangbd296832022-10-26 18:28:11 +0800316 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
317 == -1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800318 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, sizeof(output))
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 == -1);
Yanray Wangbd296832022-10-26 18:28:11 +0800320 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
321 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -0500322
Yanray Wangf7b62352022-10-26 11:51:53 +0800323 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == -1);
324 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +0000325
Andrzej Kurekf7774142020-01-22 06:34:59 -0500326 /* Make sure calling put and get on NULL input only results in
327 * error if the length is not zero, and that a NULL output is valid for data
328 * dropping.
329 */
Janos Follath6264e662019-11-26 11:11:15 +0000330
Yanray Wangf7b62352022-10-26 11:51:53 +0800331 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, sizeof(input)) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000332
Yanray Wangbd296832022-10-26 18:28:11 +0800333 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
334 == -1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800335 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, sizeof(output))
Gilles Peskine449bd832023-01-11 14:50:10 +0100336 == 0);
Yanray Wangf7b62352022-10-26 11:51:53 +0800337 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == 0);
338 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000339
Piotr Nowickifb437d72020-01-13 16:59:12 +0100340 /* Make sure calling put several times in the row is safe */
341
Yanray Wangf7b62352022-10-26 11:51:53 +0800342 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
Gilles Peskine449bd832023-01-11 14:50:10 +0100343 == sizeof(input));
Yanray Wangf7b62352022-10-26 11:51:53 +0800344 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, 2) == 2);
345 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 1) == 1);
346 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 1);
347 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 0);
Piotr Nowickifb437d72020-01-13 16:59:12 +0100348
349
Janos Follath6264e662019-11-26 11:11:15 +0000350exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800351 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti285dae82023-04-19 15:10:45 +0200352 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +0000353}
354/* END_CASE */
355
356/*
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800357 * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is
Janos Follath6264e662019-11-26 11:11:15 +0000358 * correct and works as expected.
359 *
360 * That is
361 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
362 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
363 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
364 * bytes.
365 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
366 * - All of the bytes we got match the bytes we put in in a FIFO manner.
367 */
368
369/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100370void test_callback_buffer(int size, int put1, int put1_ret,
371 int get1, int get1_ret, int put2, int put2_ret,
372 int get2, int get2_ret)
Janos Follath6264e662019-11-26 11:11:15 +0000373{
374 enum { ROUNDS = 2 };
375 size_t put[ROUNDS];
376 int put_ret[ROUNDS];
377 size_t get[ROUNDS];
378 int get_ret[ROUNDS];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800379 mbedtls_test_ssl_buffer buf;
Gilles Peskine449bd832023-01-11 14:50:10 +0100380 unsigned char *input = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000381 size_t input_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100382 unsigned char *output = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000383 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +0000384 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +0000385
Yanray Wangf7b62352022-10-26 11:51:53 +0800386 mbedtls_test_ssl_buffer_init(&buf);
Valerio Setti00a256f2023-04-27 17:22:27 +0200387 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800388 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, size) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000389
390 /* Check the sanity of input parameters and initialise local variables. That
391 * is, ensure that the amount of data is not negative and that we are not
392 * expecting more to put or get than we actually asked for. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100393 TEST_ASSERT(put1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000394 put[0] = put1;
395 put_ret[0] = put1_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100396 TEST_ASSERT(put1_ret <= put1);
397 TEST_ASSERT(put2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000398 put[1] = put2;
399 put_ret[1] = put2_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100400 TEST_ASSERT(put2_ret <= put2);
Janos Follath6264e662019-11-26 11:11:15 +0000401
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 TEST_ASSERT(get1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000403 get[0] = get1;
404 get_ret[0] = get1_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100405 TEST_ASSERT(get1_ret <= get1);
406 TEST_ASSERT(get2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000407 get[1] = get2;
408 get_ret[1] = get2_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100409 TEST_ASSERT(get2_ret <= get2);
Janos Follath6264e662019-11-26 11:11:15 +0000410
411 input_len = 0;
412 /* Calculate actual input and output lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +0100413 for (j = 0; j < ROUNDS; j++) {
414 if (put_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000415 input_len += put_ret[j];
416 }
417 }
418 /* In order to always have a valid pointer we always allocate at least 1
419 * byte. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100420 if (input_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000421 input_len = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 }
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100423 TEST_CALLOC(input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000424
425 output_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 for (j = 0; j < ROUNDS; j++) {
427 if (get_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000428 output_len += get_ret[j];
429 }
430 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100431 TEST_ASSERT(output_len <= input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000432 /* In order to always have a valid pointer we always allocate at least 1
433 * byte. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 if (output_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000435 output_len = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100436 }
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100437 TEST_CALLOC(output, output_len);
Janos Follath6264e662019-11-26 11:11:15 +0000438
439 /* Fill up the buffer with structured data so that unwanted changes
440 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100441 for (i = 0; i < input_len; i++) {
Janos Follath6264e662019-11-26 11:11:15 +0000442 input[i] = i & 0xFF;
443 }
444
445 written = read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100446 for (j = 0; j < ROUNDS; j++) {
Yanray Wangf7b62352022-10-26 11:51:53 +0800447 TEST_ASSERT(put_ret[j] == mbedtls_test_ssl_buffer_put(&buf,
448 input + written, put[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000449 written += put_ret[j];
Yanray Wangf7b62352022-10-26 11:51:53 +0800450 TEST_ASSERT(get_ret[j] == mbedtls_test_ssl_buffer_get(&buf,
451 output + read, get[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000452 read += get_ret[j];
Gilles Peskine449bd832023-01-11 14:50:10 +0100453 TEST_ASSERT(read <= written);
454 if (get_ret[j] > 0) {
455 TEST_ASSERT(memcmp(output + read - get_ret[j],
456 input + read - get_ret[j], get_ret[j])
457 == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000458 }
459 }
460
461exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100462 mbedtls_free(input);
463 mbedtls_free(output);
Yanray Wangf7b62352022-10-26 11:51:53 +0800464 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti285dae82023-04-19 15:10:45 +0200465 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +0000466}
467/* END_CASE */
468
Janos Follath031827f2019-11-27 11:12:14 +0000469/*
Yanray Wangbd296832022-10-26 18:28:11 +0800470 * Test if the implementation of `mbedtls_test_mock_socket` related
471 * I/O functions is correct and works as expected on unconnected sockets.
Janos Follathc673c2c2019-12-02 15:47:26 +0000472 */
473
474/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100475void ssl_mock_sanity()
Janos Follathc673c2c2019-12-02 15:47:26 +0000476{
477 enum { MSGLEN = 105 };
Paul Elliott21c8fe52021-11-24 16:54:26 +0000478 unsigned char message[MSGLEN] = { 0 };
479 unsigned char received[MSGLEN] = { 0 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800480 mbedtls_test_mock_socket socket;
Janos Follathc673c2c2019-12-02 15:47:26 +0000481
Yanray Wang5f86a422023-03-15 16:02:29 +0800482 mbedtls_test_mock_socket_init(&socket);
Valerio Setti00a256f2023-04-27 17:22:27 +0200483 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800484 TEST_ASSERT(mbedtls_test_mock_tcp_send_b(&socket, message, MSGLEN) < 0);
485 mbedtls_test_mock_socket_close(&socket);
Yanray Wang5f86a422023-03-15 16:02:29 +0800486 mbedtls_test_mock_socket_init(&socket);
Yanray Wangf7b62352022-10-26 11:51:53 +0800487 TEST_ASSERT(mbedtls_test_mock_tcp_recv_b(&socket, received, MSGLEN) < 0);
488 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000489
Yanray Wang5f86a422023-03-15 16:02:29 +0800490 mbedtls_test_mock_socket_init(&socket);
Yanray Wangf7b62352022-10-26 11:51:53 +0800491 TEST_ASSERT(mbedtls_test_mock_tcp_send_nb(&socket, message, MSGLEN) < 0);
492 mbedtls_test_mock_socket_close(&socket);
Yanray Wang5f86a422023-03-15 16:02:29 +0800493 mbedtls_test_mock_socket_init(&socket);
Yanray Wangf7b62352022-10-26 11:51:53 +0800494 TEST_ASSERT(mbedtls_test_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0);
495 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000496
497exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800498 mbedtls_test_mock_socket_close(&socket);
Valerio Setti285dae82023-04-19 15:10:45 +0200499 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000500}
501/* END_CASE */
502
503/*
Yanray Wangbd296832022-10-26 18:28:11 +0800504 * Test if the implementation of `mbedtls_test_mock_socket` related functions
505 * can send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +0000506 */
507
508/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100509void ssl_mock_tcp(int blocking)
Janos Follath031827f2019-11-27 11:12:14 +0000510{
Janos Follathc673c2c2019-12-02 15:47:26 +0000511 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100512 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +0000513 unsigned char message[MSGLEN];
514 unsigned char received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800515 mbedtls_test_mock_socket client;
516 mbedtls_test_mock_socket server;
Janos Follathc673c2c2019-12-02 15:47:26 +0000517 size_t written, read;
518 int send_ret, recv_ret;
519 mbedtls_ssl_send_t *send;
520 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +0000521 unsigned i;
522
Gilles Peskine449bd832023-01-11 14:50:10 +0100523 if (blocking == 0) {
Yanray Wangf7b62352022-10-26 11:51:53 +0800524 send = mbedtls_test_mock_tcp_send_nb;
525 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine449bd832023-01-11 14:50:10 +0100526 } else {
Yanray Wangf7b62352022-10-26 11:51:53 +0800527 send = mbedtls_test_mock_tcp_send_b;
528 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follathc673c2c2019-12-02 15:47:26 +0000529 }
530
Yanray Wang5f86a422023-03-15 16:02:29 +0800531 mbedtls_test_mock_socket_init(&client);
532 mbedtls_test_mock_socket_init(&server);
Valerio Setti00a256f2023-04-27 17:22:27 +0200533 USE_PSA_INIT();
Janos Follathc673c2c2019-12-02 15:47:26 +0000534
535 /* Fill up the buffer with structured data so that unwanted changes
536 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100537 for (i = 0; i < MSGLEN; i++) {
Janos Follathc673c2c2019-12-02 15:47:26 +0000538 message[i] = i & 0xFF;
539 }
540
541 /* Make sure that sending a message takes a few iterations. */
Yanray Wangbd296832022-10-26 18:28:11 +0800542 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
543 BUFLEN));
Janos Follathc673c2c2019-12-02 15:47:26 +0000544
545 /* Send the message to the server */
546 send_ret = recv_ret = 1;
547 written = read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100548 while (send_ret != 0 || recv_ret != 0) {
549 send_ret = send(&client, message + written, MSGLEN - written);
Janos Follathc673c2c2019-12-02 15:47:26 +0000550
Gilles Peskine449bd832023-01-11 14:50:10 +0100551 TEST_ASSERT(send_ret >= 0);
552 TEST_ASSERT(send_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100553 written += send_ret;
554
555 /* If the buffer is full we can test blocking and non-blocking send */
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 if (send_ret == BUFLEN) {
557 int blocking_ret = send(&client, message, 1);
558 if (blocking) {
559 TEST_ASSERT(blocking_ret == 0);
560 } else {
561 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100562 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000563 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000564
Gilles Peskine449bd832023-01-11 14:50:10 +0100565 recv_ret = recv(&server, received + read, MSGLEN - read);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100566
567 /* The result depends on whether any data was sent */
Gilles Peskine449bd832023-01-11 14:50:10 +0100568 if (send_ret > 0) {
569 TEST_ASSERT(recv_ret > 0);
570 TEST_ASSERT(recv_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100571 read += recv_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 } else if (blocking) {
573 TEST_ASSERT(recv_ret == 0);
574 } else {
575 TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100576 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +0000577 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100578
579 /* If the buffer is empty we can test blocking and non-blocking read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100580 if (recv_ret == BUFLEN) {
581 int blocking_ret = recv(&server, received, 1);
582 if (blocking) {
583 TEST_ASSERT(blocking_ret == 0);
584 } else {
585 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100586 }
587 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000588 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Janos Follathc673c2c2019-12-02 15:47:26 +0000590
591exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800592 mbedtls_test_mock_socket_close(&client);
593 mbedtls_test_mock_socket_close(&server);
Valerio Setti285dae82023-04-19 15:10:45 +0200594 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000595}
596/* END_CASE */
597
598/*
Yanray Wangbd296832022-10-26 18:28:11 +0800599 * Test if the implementation of `mbedtls_test_mock_socket` related functions
600 * can send messages in both direction at the same time (with the I/O calls
Janos Follathc673c2c2019-12-02 15:47:26 +0000601 * interleaving).
602 */
603
604/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100605void ssl_mock_tcp_interleaving(int blocking)
Janos Follathc673c2c2019-12-02 15:47:26 +0000606{
Janos Follath031827f2019-11-27 11:12:14 +0000607 enum { ROUNDS = 2 };
608 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100609 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +0000610 unsigned char message[ROUNDS][MSGLEN];
611 unsigned char received[ROUNDS][MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800612 mbedtls_test_mock_socket client;
613 mbedtls_test_mock_socket server;
Janos Follath031827f2019-11-27 11:12:14 +0000614 size_t written[ROUNDS];
615 size_t read[ROUNDS];
616 int send_ret[ROUNDS];
617 int recv_ret[ROUNDS];
618 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +0000619 mbedtls_ssl_send_t *send;
620 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +0000621
Gilles Peskine449bd832023-01-11 14:50:10 +0100622 if (blocking == 0) {
Yanray Wangf7b62352022-10-26 11:51:53 +0800623 send = mbedtls_test_mock_tcp_send_nb;
624 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 } else {
Yanray Wangf7b62352022-10-26 11:51:53 +0800626 send = mbedtls_test_mock_tcp_send_b;
627 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follath3766ba52019-11-27 13:31:42 +0000628 }
Janos Follath031827f2019-11-27 11:12:14 +0000629
Yanray Wang5f86a422023-03-15 16:02:29 +0800630 mbedtls_test_mock_socket_init(&client);
631 mbedtls_test_mock_socket_init(&server);
Valerio Setti00a256f2023-04-27 17:22:27 +0200632 USE_PSA_INIT();
Janos Follath031827f2019-11-27 11:12:14 +0000633
634 /* Fill up the buffers with structured data so that unwanted changes
635 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 for (i = 0; i < ROUNDS; i++) {
637 for (j = 0; j < MSGLEN; j++) {
638 message[i][j] = (i * MSGLEN + j) & 0xFF;
Janos Follath031827f2019-11-27 11:12:14 +0000639 }
640 }
641
Janos Follath031827f2019-11-27 11:12:14 +0000642 /* Make sure that sending a message takes a few iterations. */
Yanray Wangbd296832022-10-26 18:28:11 +0800643 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
644 BUFLEN));
Janos Follath031827f2019-11-27 11:12:14 +0000645
Janos Follath031827f2019-11-27 11:12:14 +0000646 /* Send the message from both sides, interleaving. */
647 progress = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 for (i = 0; i < ROUNDS; i++) {
Janos Follath031827f2019-11-27 11:12:14 +0000649 written[i] = 0;
650 read[i] = 0;
651 }
652 /* This loop does not stop as long as there was a successful write or read
653 * of at least one byte on either side. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100654 while (progress != 0) {
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800655 mbedtls_test_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +0000656
Gilles Peskine449bd832023-01-11 14:50:10 +0100657 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100658 /* First sending is from the client */
Gilles Peskine449bd832023-01-11 14:50:10 +0100659 socket = (i % 2 == 0) ? (&client) : (&server);
Janos Follath031827f2019-11-27 11:12:14 +0000660
Gilles Peskine449bd832023-01-11 14:50:10 +0100661 send_ret[i] = send(socket, message[i] + written[i],
662 MSGLEN - written[i]);
663 TEST_ASSERT(send_ret[i] >= 0);
664 TEST_ASSERT(send_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100665 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000666
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100667 /* If the buffer is full we can test blocking and non-blocking
668 * send */
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 if (send_ret[i] == BUFLEN) {
670 int blocking_ret = send(socket, message[i], 1);
671 if (blocking) {
672 TEST_ASSERT(blocking_ret == 0);
673 } else {
674 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100675 }
676 }
Janos Follath3766ba52019-11-27 13:31:42 +0000677 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100678
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100680 /* First receiving is from the server */
Gilles Peskine449bd832023-01-11 14:50:10 +0100681 socket = (i % 2 == 0) ? (&server) : (&client);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100682
Gilles Peskine449bd832023-01-11 14:50:10 +0100683 recv_ret[i] = recv(socket, received[i] + read[i],
684 MSGLEN - read[i]);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100685
686 /* The result depends on whether any data was sent */
Gilles Peskine449bd832023-01-11 14:50:10 +0100687 if (send_ret[i] > 0) {
688 TEST_ASSERT(recv_ret[i] > 0);
689 TEST_ASSERT(recv_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100690 read[i] += recv_ret[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100691 } else if (blocking) {
692 TEST_ASSERT(recv_ret[i] == 0);
693 } else {
694 TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100695 recv_ret[i] = 0;
696 }
697
698 /* If the buffer is empty we can test blocking and non-blocking
699 * read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100700 if (recv_ret[i] == BUFLEN) {
701 int blocking_ret = recv(socket, received[i], 1);
702 if (blocking) {
703 TEST_ASSERT(blocking_ret == 0);
704 } else {
705 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100706 }
707 }
Janos Follath3766ba52019-11-27 13:31:42 +0000708 }
Janos Follath031827f2019-11-27 11:12:14 +0000709
710 progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100711 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100712 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000713 }
714 }
715
Gilles Peskine449bd832023-01-11 14:50:10 +0100716 for (i = 0; i < ROUNDS; i++) {
717 TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0);
718 }
Janos Follath031827f2019-11-27 11:12:14 +0000719
720exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800721 mbedtls_test_mock_socket_close(&client);
722 mbedtls_test_mock_socket_close(&server);
Valerio Setti285dae82023-04-19 15:10:45 +0200723 USE_PSA_DONE();
Janos Follath031827f2019-11-27 11:12:14 +0000724}
725/* END_CASE */
726
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500727/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100728void ssl_message_queue_sanity()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500729{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200730 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500731
Valerio Setti285dae82023-04-19 15:10:45 +0200732 USE_PSA_INIT();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500733 /* Trying to push/pull to an empty queue */
Yanray Wangf7b62352022-10-26 11:51:53 +0800734 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(NULL, 1)
Gilles Peskine449bd832023-01-11 14:50:10 +0100735 == MBEDTLS_TEST_ERROR_ARG_NULL);
Yanray Wangf7b62352022-10-26 11:51:53 +0800736 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(NULL, 1)
Gilles Peskine449bd832023-01-11 14:50:10 +0100737 == MBEDTLS_TEST_ERROR_ARG_NULL);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500738
Yanray Wangf7b62352022-10-26 11:51:53 +0800739 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 TEST_ASSERT(queue.capacity == 3);
741 TEST_ASSERT(queue.num == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500742
743exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800744 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200745 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500746}
747/* END_CASE */
748
749/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100750void ssl_message_queue_basic()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500751{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200752 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500753
Valerio Setti285dae82023-04-19 15:10:45 +0200754 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800755 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500756
757 /* Sanity test - 3 pushes and 3 pops with sufficient space */
Yanray Wangf7b62352022-10-26 11:51:53 +0800758 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine449bd832023-01-11 14:50:10 +0100759 TEST_ASSERT(queue.capacity == 3);
760 TEST_ASSERT(queue.num == 1);
Yanray Wangf7b62352022-10-26 11:51:53 +0800761 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine449bd832023-01-11 14:50:10 +0100762 TEST_ASSERT(queue.capacity == 3);
763 TEST_ASSERT(queue.num == 2);
Yanray Wangf7b62352022-10-26 11:51:53 +0800764 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
Gilles Peskine449bd832023-01-11 14:50:10 +0100765 TEST_ASSERT(queue.capacity == 3);
766 TEST_ASSERT(queue.num == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500767
Yanray Wangf7b62352022-10-26 11:51:53 +0800768 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
769 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
770 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500771
772exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800773 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200774 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500775}
776/* END_CASE */
777
778/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100779void ssl_message_queue_overflow_underflow()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500780{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200781 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500782
Valerio Setti285dae82023-04-19 15:10:45 +0200783 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800784 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500785
786 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
Yanray Wangf7b62352022-10-26 11:51:53 +0800787 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
788 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
789 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
790 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3)
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500792
Yanray Wangf7b62352022-10-26 11:51:53 +0800793 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
794 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
795 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500796
Yanray Wangf7b62352022-10-26 11:51:53 +0800797 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1)
Gilles Peskine449bd832023-01-11 14:50:10 +0100798 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500799
800exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800801 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200802 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500803}
804/* END_CASE */
805
806/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100807void ssl_message_queue_interleaved()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500808{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200809 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500810
Valerio Setti285dae82023-04-19 15:10:45 +0200811 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800812 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500813
814 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
815 * (to wrap around the buffer) */
Yanray Wangf7b62352022-10-26 11:51:53 +0800816 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
817 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500818
Yanray Wangf7b62352022-10-26 11:51:53 +0800819 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500820
Yanray Wangf7b62352022-10-26 11:51:53 +0800821 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
822 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500823
Yanray Wangf7b62352022-10-26 11:51:53 +0800824 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
825 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500826
Yanray Wangf7b62352022-10-26 11:51:53 +0800827 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 5) == 5);
828 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500829
Yanray Wangf7b62352022-10-26 11:51:53 +0800830 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500831
Yanray Wangf7b62352022-10-26 11:51:53 +0800832 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 5) == 5);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500833
Yanray Wangf7b62352022-10-26 11:51:53 +0800834 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500835
836exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800837 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200838 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500839}
840/* END_CASE */
841
842/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100843void ssl_message_queue_insufficient_buffer()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500844{
Valerio Setti7c0f91b2023-04-28 12:20:34 +0200845 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500846 size_t message_len = 10;
847 size_t buffer_len = 5;
848
Valerio Setti285dae82023-04-19 15:10:45 +0200849 USE_PSA_INIT();
Yanray Wangf7b62352022-10-26 11:51:53 +0800850 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 1) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500851
852 /* Popping without a sufficient buffer */
Yanray Wangf7b62352022-10-26 11:51:53 +0800853 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, message_len)
Gilles Peskine449bd832023-01-11 14:50:10 +0100854 == (int) message_len);
Yanray Wangf7b62352022-10-26 11:51:53 +0800855 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, buffer_len)
Gilles Peskine449bd832023-01-11 14:50:10 +0100856 == (int) buffer_len);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500857exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800858 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti285dae82023-04-19 15:10:45 +0200859 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500860}
861/* END_CASE */
862
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500863/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100864void ssl_message_mock_uninitialized()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500865{
866 enum { MSGLEN = 10 };
Gilles Peskine449bd832023-01-11 14:50:10 +0100867 unsigned char message[MSGLEN] = { 0 }, received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800868 mbedtls_test_mock_socket client, server;
869 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500870 mbedtls_test_message_socket_context server_context, client_context;
Yanray Wangf7b62352022-10-26 11:51:53 +0800871 mbedtls_test_message_socket_init(&server_context);
872 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500873
Valerio Setti285dae82023-04-19 15:10:45 +0200874 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500875 /* Send with a NULL context */
Yanray Wangf7b62352022-10-26 11:51:53 +0800876 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(NULL, message, MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500878
Yanray Wangf7b62352022-10-26 11:51:53 +0800879 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(NULL, message, MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100880 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500881
Yanray Wangbd296832022-10-26 18:28:11 +0800882 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
883 &client_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800884 &server,
885 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500886
Yanray Wangbd296832022-10-26 18:28:11 +0800887 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
888 &server_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800889 &client,
890 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500891
Yanray Wangbd296832022-10-26 18:28:11 +0800892 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
893 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500895
Yanray Wangbd296832022-10-26 18:28:11 +0800896 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
897 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100898 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500899
900 /* Push directly to a queue to later simulate a disconnected behavior */
Yanray Wangbd296832022-10-26 18:28:11 +0800901 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&server_queue,
902 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500904
905 /* Test if there's an error when trying to read from a disconnected
906 * socket */
Yanray Wangbd296832022-10-26 18:28:11 +0800907 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
908 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100909 == MBEDTLS_TEST_ERROR_RECV_FAILED);
910exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800911 mbedtls_test_message_socket_close(&server_context);
912 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +0200913 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500914}
915/* END_CASE */
916
917/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100918void ssl_message_mock_basic()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500919{
920 enum { MSGLEN = 10 };
921 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800922 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500923 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800924 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500925 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +0200926
Yanray Wangf7b62352022-10-26 11:51:53 +0800927 mbedtls_test_message_socket_init(&server_context);
928 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +0200929 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500930
Yanray Wangbd296832022-10-26 18:28:11 +0800931 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
932 &client_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800933 &server,
934 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500935
Yanray Wangbd296832022-10-26 18:28:11 +0800936 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
937 &server_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +0800938 &client,
939 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500940
941 /* Fill up the buffer with structured data so that unwanted changes
942 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500944 message[i] = i & 0xFF;
945 }
Yanray Wangf7b62352022-10-26 11:51:53 +0800946 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
947 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500948
949 /* Send the message to the server */
Yanray Wangf7b62352022-10-26 11:51:53 +0800950 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
951 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500952
953 /* Read from the server */
Yanray Wangbd296832022-10-26 18:28:11 +0800954 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
955 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500957
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
959 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500960
961 /* Send the message to the client */
Yanray Wangf7b62352022-10-26 11:51:53 +0800962 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +0800963 MSGLEN)
964 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500965
966 /* Read from the client */
Yanray Wangbd296832022-10-26 18:28:11 +0800967 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
968 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 == MSGLEN);
970 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500971
Gilles Peskine449bd832023-01-11 14:50:10 +0100972exit:
Yanray Wangf7b62352022-10-26 11:51:53 +0800973 mbedtls_test_message_socket_close(&server_context);
974 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +0200975 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500976}
977/* END_CASE */
978
979/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100980void ssl_message_mock_queue_overflow_underflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500981{
982 enum { MSGLEN = 10 };
983 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800984 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500985 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +0800986 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500987 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +0200988
Yanray Wangf7b62352022-10-26 11:51:53 +0800989 mbedtls_test_message_socket_init(&server_context);
990 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +0200991 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500992
Yanray Wangbd296832022-10-26 18:28:11 +0800993 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
994 &client_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +0800995 &server,
996 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500997
Yanray Wangbd296832022-10-26 18:28:11 +0800998 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
999 &server_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +08001000 &client,
1001 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001002
1003 /* Fill up the buffer with structured data so that unwanted changes
1004 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001005 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001006 message[i] = i & 0xFF;
1007 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001008 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1009 MSGLEN*2));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001010
1011 /* Send three message to the server, last one with an error */
Yanray Wangf7b62352022-10-26 11:51:53 +08001012 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001013 MSGLEN - 1)
1014 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001015
Yanray Wangf7b62352022-10-26 11:51:53 +08001016 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001017 MSGLEN)
1018 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001019
Yanray Wangf7b62352022-10-26 11:51:53 +08001020 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1021 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001022 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001023
1024 /* Read three messages from the server, last one with an error */
Yanray Wangf7b62352022-10-26 11:51:53 +08001025 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
Yanray Wangbd296832022-10-26 18:28:11 +08001026 MSGLEN - 1)
1027 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001028
Yanray Wangbd296832022-10-26 18:28:11 +08001029 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1030 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001031 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001032
Gilles Peskine449bd832023-01-11 14:50:10 +01001033 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001034
Yanray Wangbd296832022-10-26 18:28:11 +08001035 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1036 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001037 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001038
Gilles Peskine449bd832023-01-11 14:50:10 +01001039exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001040 mbedtls_test_message_socket_close(&server_context);
1041 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001042 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001043}
1044/* END_CASE */
1045
1046/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001047void ssl_message_mock_socket_overflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001048{
1049 enum { MSGLEN = 10 };
1050 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001051 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001052 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001053 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001054 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001055
Yanray Wangf7b62352022-10-26 11:51:53 +08001056 mbedtls_test_message_socket_init(&server_context);
1057 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001058 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001059
Yanray Wangbd296832022-10-26 18:28:11 +08001060 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1061 &client_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +08001062 &server,
1063 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001064
Yanray Wangbd296832022-10-26 18:28:11 +08001065 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1066 &server_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +08001067 &client,
1068 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001069
1070 /* Fill up the buffer with structured data so that unwanted changes
1071 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001072 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001073 message[i] = i & 0xFF;
1074 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001075 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1076 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001077
1078 /* Send two message to the server, second one with an error */
Yanray Wangf7b62352022-10-26 11:51:53 +08001079 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001080 MSGLEN)
1081 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001082
Yanray Wangf7b62352022-10-26 11:51:53 +08001083 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1084 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001086
1087 /* Read the only message from the server */
Yanray Wangbd296832022-10-26 18:28:11 +08001088 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1089 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001091
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001093
Gilles Peskine449bd832023-01-11 14:50:10 +01001094exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001095 mbedtls_test_message_socket_close(&server_context);
1096 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001097 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001098}
1099/* END_CASE */
1100
1101/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001102void ssl_message_mock_truncated()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001103{
1104 enum { MSGLEN = 10 };
1105 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001106 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001107 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001108 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001109 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001110
Yanray Wangf7b62352022-10-26 11:51:53 +08001111 mbedtls_test_message_socket_init(&server_context);
1112 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001113 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001114
Yanray Wangbd296832022-10-26 18:28:11 +08001115 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1116 &client_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +08001117 &server,
1118 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001119
Yanray Wangbd296832022-10-26 18:28:11 +08001120 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1121 &server_queue, 2,
Yanray Wangf7b62352022-10-26 11:51:53 +08001122 &client,
1123 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001124
Gilles Peskine449bd832023-01-11 14:50:10 +01001125 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001126 /* Fill up the buffer with structured data so that unwanted changes
1127 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001128 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001129 message[i] = i & 0xFF;
1130 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001131 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1132 2 * MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001133
1134 /* Send two messages to the server, the second one small enough to fit in the
1135 * receiver's buffer. */
Yanray Wangf7b62352022-10-26 11:51:53 +08001136 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001137 MSGLEN)
1138 == MSGLEN);
Yanray Wangf7b62352022-10-26 11:51:53 +08001139 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001140 MSGLEN / 2)
1141 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001142 /* Read a truncated message from the server */
Yanray Wangbd296832022-10-26 18:28:11 +08001143 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1144 MSGLEN/2)
Gilles Peskine449bd832023-01-11 14:50:10 +01001145 == MSGLEN/2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001146
1147 /* Test that the first half of the message is valid, and second one isn't */
Gilles Peskine449bd832023-01-11 14:50:10 +01001148 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
1149 TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2)
1150 != 0);
1151 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001152
1153 /* Read a full message from the server */
Yanray Wangbd296832022-10-26 18:28:11 +08001154 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1155 MSGLEN/2)
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001157
1158 /* Test that the first half of the message is valid */
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001160
Gilles Peskine449bd832023-01-11 14:50:10 +01001161exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001162 mbedtls_test_message_socket_close(&server_context);
1163 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001164 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001165}
1166/* END_CASE */
1167
1168/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001169void ssl_message_mock_socket_read_error()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001170{
1171 enum { MSGLEN = 10 };
1172 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001173 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001174 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001175 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001176 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001177
Yanray Wangf7b62352022-10-26 11:51:53 +08001178 mbedtls_test_message_socket_init(&server_context);
1179 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001180 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001181
Yanray Wangbd296832022-10-26 18:28:11 +08001182 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1183 &client_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +08001184 &server,
1185 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001186
Yanray Wangbd296832022-10-26 18:28:11 +08001187 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1188 &server_queue, 1,
Yanray Wangf7b62352022-10-26 11:51:53 +08001189 &client,
1190 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001191
1192 /* Fill up the buffer with structured data so that unwanted changes
1193 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001195 message[i] = i & 0xFF;
1196 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001197 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1198 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001199
Yanray Wangf7b62352022-10-26 11:51:53 +08001200 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wangbd296832022-10-26 18:28:11 +08001201 MSGLEN)
1202 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001203
1204 /* Force a read error by disconnecting the socket by hand */
1205 server.status = 0;
Yanray Wangbd296832022-10-26 18:28:11 +08001206 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1207 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001208 == MBEDTLS_TEST_ERROR_RECV_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001209 /* Return to a valid state */
1210 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
1211
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001213
1214 /* Test that even though the server tried to read once disconnected, the
1215 * continuity is preserved */
Yanray Wangbd296832022-10-26 18:28:11 +08001216 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1217 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001218 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001219
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001221
Gilles Peskine449bd832023-01-11 14:50:10 +01001222exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001223 mbedtls_test_message_socket_close(&server_context);
1224 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001225 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001226}
1227/* END_CASE */
1228
1229/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001230void ssl_message_mock_interleaved_one_way()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001231{
1232 enum { MSGLEN = 10 };
1233 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001234 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001235 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001236 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001237 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001238
Yanray Wangf7b62352022-10-26 11:51:53 +08001239 mbedtls_test_message_socket_init(&server_context);
1240 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001241 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001242
Yanray Wangbd296832022-10-26 18:28:11 +08001243 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1244 &client_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001245 &server,
1246 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001247
Yanray Wangbd296832022-10-26 18:28:11 +08001248 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1249 &server_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001250 &client,
1251 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001252
1253 /* Fill up the buffer with structured data so that unwanted changes
1254 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001255 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001256 message[i] = i & 0xFF;
1257 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001258 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1259 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001260
1261 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
1262 * (to wrap around the buffer) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001263 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001264 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1265 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001266
Yanray Wangf7b62352022-10-26 11:51:53 +08001267 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1268 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001269
Yanray Wangf7b62352022-10-26 11:51:53 +08001270 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1271 MSGLEN) == MSGLEN);
Gilles Peskine449bd832023-01-11 14:50:10 +01001272 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1273 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001274 }
1275
Gilles Peskine449bd832023-01-11 14:50:10 +01001276 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001277 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1278 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001279
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001281 }
Yanray Wangbd296832022-10-26 18:28:11 +08001282 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1283 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001284 == MBEDTLS_ERR_SSL_WANT_READ);
1285exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001286 mbedtls_test_message_socket_close(&server_context);
1287 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001288 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001289}
1290/* END_CASE */
1291
1292/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001293void ssl_message_mock_interleaved_two_ways()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001294{
1295 enum { MSGLEN = 10 };
1296 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001297 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001298 unsigned i;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08001299 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001300 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti285dae82023-04-19 15:10:45 +02001301
Yanray Wangf7b62352022-10-26 11:51:53 +08001302 mbedtls_test_message_socket_init(&server_context);
1303 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02001304 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001305
Yanray Wangbd296832022-10-26 18:28:11 +08001306 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1307 &client_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001308 &server,
1309 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001310
Yanray Wangbd296832022-10-26 18:28:11 +08001311 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1312 &server_queue, 3,
Yanray Wangf7b62352022-10-26 11:51:53 +08001313 &client,
1314 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001315
1316 /* Fill up the buffer with structured data so that unwanted changes
1317 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001319 message[i] = i & 0xFF;
1320 }
Yanray Wangf7b62352022-10-26 11:51:53 +08001321 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1322 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001323
1324 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
1325 * (to wrap around the buffer) both ways. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001327 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1328 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001329
Yanray Wangf7b62352022-10-26 11:51:53 +08001330 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1331 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001332
Yanray Wangf7b62352022-10-26 11:51:53 +08001333 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1334 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001335
Yanray Wangf7b62352022-10-26 11:51:53 +08001336 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1337 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001338
Yanray Wangf7b62352022-10-26 11:51:53 +08001339 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1340 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001341
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001343
Gilles Peskine449bd832023-01-11 14:50:10 +01001344 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001345
Yanray Wangf7b62352022-10-26 11:51:53 +08001346 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1347 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001348
Gilles Peskine449bd832023-01-11 14:50:10 +01001349 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001350
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001352 }
1353
Gilles Peskine449bd832023-01-11 14:50:10 +01001354 for (i = 0; i < 2; i++) {
Yanray Wangf7b62352022-10-26 11:51:53 +08001355 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1356 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001357
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1359 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001360
Yanray Wangf7b62352022-10-26 11:51:53 +08001361 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1362 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001363
Gilles Peskine449bd832023-01-11 14:50:10 +01001364 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1365 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001366 }
1367
Yanray Wangbd296832022-10-26 18:28:11 +08001368 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1369 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001370 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001371
Yanray Wangbd296832022-10-26 18:28:11 +08001372 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1373 MSGLEN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001374 == MBEDTLS_ERR_SSL_WANT_READ);
1375exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08001376 mbedtls_test_message_socket_close(&server_context);
1377 mbedtls_test_message_socket_close(&client_context);
Valerio Setti285dae82023-04-19 15:10:45 +02001378 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001379}
1380/* END_CASE */
1381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001382/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Gilles Peskine449bd832023-01-11 14:50:10 +01001383void ssl_dtls_replay(data_t *prevs, data_t *new, int ret)
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001384{
Azim Khand30ca132017-06-09 04:32:58 +01001385 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001386 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001387 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001388
Gilles Peskine449bd832023-01-11 14:50:10 +01001389 mbedtls_ssl_init(&ssl);
1390 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02001391 MD_OR_USE_PSA_INIT();
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02001392
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
1394 MBEDTLS_SSL_IS_CLIENT,
1395 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
1396 MBEDTLS_SSL_PRESET_DEFAULT) == 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01001397 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
1398
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001400
1401 /* Read previous record numbers */
Gilles Peskine449bd832023-01-11 14:50:10 +01001402 for (len = 0; len < prevs->len; len += 6) {
1403 memcpy(ssl.in_ctr + 2, prevs->x + len, 6);
1404 mbedtls_ssl_dtls_replay_update(&ssl);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001405 }
1406
1407 /* Check new number */
Gilles Peskine449bd832023-01-11 14:50:10 +01001408 memcpy(ssl.in_ctr + 2, new->x, 6);
1409 TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001410
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001411exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001412 mbedtls_ssl_free(&ssl);
1413 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001414 MD_OR_USE_PSA_DONE();
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001415}
1416/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001417
Ronald Crone68ab4f2022-10-05 12:46:29 +02001418/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Pengyu Lv9d87a382023-07-11 10:15:16 +08001419void ssl_set_hostname_twice(char *input_hostname0, char *input_hostname1)
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001420{
Pengyu Lv9d87a382023-07-11 10:15:16 +08001421 const char *output_hostname;
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001422 mbedtls_ssl_context ssl;
Valerio Setti285dae82023-04-19 15:10:45 +02001423
Gilles Peskine449bd832023-01-11 14:50:10 +01001424 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02001425 USE_PSA_INIT();
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001426
Pengyu Lv9d87a382023-07-11 10:15:16 +08001427 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, input_hostname0) == 0);
1428 output_hostname = mbedtls_ssl_get_hostname(&ssl);
1429 TEST_ASSERT(strcmp(input_hostname0, output_hostname) == 0);
Pengyu Lv30e08702023-07-10 10:53:11 +08001430
Pengyu Lv9d87a382023-07-11 10:15:16 +08001431 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, input_hostname1) == 0);
1432 output_hostname = mbedtls_ssl_get_hostname(&ssl);
1433 TEST_ASSERT(strcmp(input_hostname1, output_hostname) == 0);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001434
valerio32f2ac92023-04-20 11:59:52 +02001435exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001436 mbedtls_ssl_free(&ssl);
Valerio Setti285dae82023-04-19 15:10:45 +02001437 USE_PSA_DONE();
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001438}
Darryl Green11999bb2018-03-13 15:22:58 +00001439/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00001440
1441/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001442void ssl_crypt_record(int cipher_type, int hash_id,
1443 int etm, int tag_mode, int ver,
1444 int cid0_len, int cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00001445{
1446 /*
1447 * Test several record encryptions and decryptions
1448 * with plenty of space before and after the data
1449 * within the record buffer.
1450 */
1451
1452 int ret;
1453 int num_records = 16;
1454 mbedtls_ssl_context ssl; /* ONLY for debugging */
1455
1456 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001457 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001458 size_t const buflen = 512;
1459 mbedtls_record rec, rec_backup;
1460
Gilles Peskine449bd832023-01-11 14:50:10 +01001461 mbedtls_ssl_init(&ssl);
1462 mbedtls_ssl_transform_init(&t0);
1463 mbedtls_ssl_transform_init(&t1);
valerio32f2ac92023-04-20 11:59:52 +02001464 MD_OR_USE_PSA_INIT();
1465
Yanray Wangf7b62352022-10-26 11:51:53 +08001466 ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1467 etm, tag_mode, ver,
1468 (size_t) cid0_len,
1469 (size_t) cid1_len);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001470
Gilles Peskine449bd832023-01-11 14:50:10 +01001471 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001472
Gilles Peskined681ffd2023-10-17 17:31:50 +02001473 TEST_CALLOC(buf, buflen);
Hanno Beckera18d1322018-01-03 14:27:32 +00001474
Gilles Peskine449bd832023-01-11 14:50:10 +01001475 while (num_records-- > 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001476 mbedtls_ssl_transform *t_dec, *t_enc;
1477 /* Take turns in who's sending and who's receiving. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001478 if (num_records % 3 == 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001479 t_dec = &t0;
1480 t_enc = &t1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001481 } else {
Hanno Beckera18d1322018-01-03 14:27:32 +00001482 t_dec = &t1;
1483 t_enc = &t0;
1484 }
1485
1486 /*
1487 * The record header affects the transformation in two ways:
1488 * 1) It determines the AEAD additional data
1489 * 2) The record counter sometimes determines the IV.
1490 *
1491 * Apart from that, the fields don't have influence.
1492 * In particular, it is currently not the responsibility
1493 * of ssl_encrypt/decrypt_buf to check if the transform
1494 * version matches the record version, or that the
1495 * type is sensible.
1496 */
1497
Gilles Peskine449bd832023-01-11 14:50:10 +01001498 memset(rec.ctr, num_records, sizeof(rec.ctr));
Hanno Beckera18d1322018-01-03 14:27:32 +00001499 rec.type = 42;
1500 rec.ver[0] = num_records;
1501 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001502#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001503 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001504#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00001505
1506 rec.buf = buf;
1507 rec.buf_len = buflen;
1508 rec.data_offset = 16;
1509 /* Make sure to vary the length to exercise different
1510 * paddings. */
1511 rec.data_len = 1 + num_records;
1512
Gilles Peskine449bd832023-01-11 14:50:10 +01001513 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckera18d1322018-01-03 14:27:32 +00001514
1515 /* Make a copy for later comparison */
1516 rec_backup = rec;
1517
1518 /* Encrypt record */
Gilles Peskine449bd832023-01-11 14:50:10 +01001519 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1520 mbedtls_test_rnd_std_rand, NULL);
1521 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1522 if (ret != 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001523 continue;
1524 }
1525
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001526#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001527 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001528 /* DTLS 1.2 + CID hides the real content type and
1529 * uses a special CID content type in the protected
1530 * record. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001531 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001532 }
1533#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1534
Ronald Cron6f135e12021-12-08 16:57:54 +01001535#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01001536 if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001537 /* TLS 1.3 hides the real content type and
1538 * always uses Application Data as the content type
1539 * for protected records. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001540 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001541 }
Ronald Cron6f135e12021-12-08 16:57:54 +01001542#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001543
Hanno Beckera18d1322018-01-03 14:27:32 +00001544 /* Decrypt record with t_dec */
Gilles Peskine449bd832023-01-11 14:50:10 +01001545 ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec);
1546 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001547
1548 /* Compare results */
Gilles Peskine449bd832023-01-11 14:50:10 +01001549 TEST_ASSERT(rec.type == rec_backup.type);
1550 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1551 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1552 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1553 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1554 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1555 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1556 rec_backup.buf + rec_backup.data_offset,
1557 rec.data_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001558 }
1559
Hanno Becker81e16a32019-03-01 11:21:44 +00001560exit:
1561
Hanno Beckera18d1322018-01-03 14:27:32 +00001562 /* Cleanup */
Gilles Peskine449bd832023-01-11 14:50:10 +01001563 mbedtls_ssl_free(&ssl);
1564 mbedtls_ssl_transform_free(&t0);
1565 mbedtls_ssl_transform_free(&t1);
Hanno Beckera18d1322018-01-03 14:27:32 +00001566
Gilles Peskine449bd832023-01-11 14:50:10 +01001567 mbedtls_free(buf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001568 MD_OR_USE_PSA_DONE();
Hanno Beckera18d1322018-01-03 14:27:32 +00001569}
1570/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001571
1572/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001573void ssl_crypt_record_small(int cipher_type, int hash_id,
1574 int etm, int tag_mode, int ver,
1575 int cid0_len, int cid1_len)
Hanno Beckerb3268da2018-01-05 15:20:24 +00001576{
1577 /*
1578 * Test pairs of encryption and decryption with an increasing
1579 * amount of space in the record buffer - in more detail:
1580 * 1) Try to encrypt with 0, 1, 2, ... bytes available
1581 * in front of the plaintext, and expect the encryption
1582 * to succeed starting from some offset. Always keep
1583 * enough space in the end of the buffer.
1584 * 2) Try to encrypt with 0, 1, 2, ... bytes available
1585 * at the end of the plaintext, and expect the encryption
1586 * to succeed starting from some offset. Always keep
1587 * enough space at the beginning of the buffer.
1588 * 3) Try to encrypt with 0, 1, 2, ... bytes available
1589 * both at the front and end of the plaintext,
1590 * and expect the encryption to succeed starting from
1591 * some offset.
1592 *
1593 * If encryption succeeds, check that decryption succeeds
1594 * and yields the original record.
1595 */
1596
1597 mbedtls_ssl_context ssl; /* ONLY for debugging */
1598
1599 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001600 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01001601 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001602 mbedtls_record rec, rec_backup;
1603
1604 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01001605 int mode; /* Mode 1, 2 or 3 as explained above */
1606 size_t offset; /* Available space at beginning/end/both */
1607 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001608
Hanno Beckerd856c822019-04-29 17:30:59 +01001609 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
1610 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001611
1612 int seen_success; /* Indicates if in the current mode we've
1613 * already seen a successful test. */
1614
Gilles Peskine449bd832023-01-11 14:50:10 +01001615 mbedtls_ssl_init(&ssl);
1616 mbedtls_ssl_transform_init(&t0);
1617 mbedtls_ssl_transform_init(&t1);
valerio32f2ac92023-04-20 11:59:52 +02001618 MD_OR_USE_PSA_INIT();
1619
Yanray Wangf7b62352022-10-26 11:51:53 +08001620 ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1621 etm, tag_mode, ver,
1622 (size_t) cid0_len,
1623 (size_t) cid1_len);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001624
Gilles Peskine449bd832023-01-11 14:50:10 +01001625 TEST_ASSERT(ret == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001626
Gilles Peskined681ffd2023-10-17 17:31:50 +02001627 TEST_CALLOC(buf, buflen);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001628
Gilles Peskine449bd832023-01-11 14:50:10 +01001629 for (mode = 1; mode <= 3; mode++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001630 seen_success = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001631 for (offset = 0; offset <= threshold; offset++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001632 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01001633 t_dec = &t0;
1634 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001635
Gilles Peskine449bd832023-01-11 14:50:10 +01001636 memset(rec.ctr, offset, sizeof(rec.ctr));
Hanno Beckerb3268da2018-01-05 15:20:24 +00001637 rec.type = 42;
1638 rec.ver[0] = offset;
1639 rec.ver[1] = offset;
1640 rec.buf = buf;
1641 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001642#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001643 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001644#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001645
Gilles Peskine449bd832023-01-11 14:50:10 +01001646 switch (mode) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001647 case 1: /* Space in the beginning */
1648 rec.data_offset = offset;
1649 rec.data_len = buflen - offset - default_post_padding;
1650 break;
1651
1652 case 2: /* Space in the end */
1653 rec.data_offset = default_pre_padding;
1654 rec.data_len = buflen - default_pre_padding - offset;
1655 break;
1656
1657 case 3: /* Space in the beginning and end */
1658 rec.data_offset = offset;
1659 rec.data_len = buflen - 2 * offset;
1660 break;
1661
1662 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001663 TEST_ASSERT(0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001664 break;
1665 }
1666
Gilles Peskine449bd832023-01-11 14:50:10 +01001667 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001668
1669 /* Make a copy for later comparison */
1670 rec_backup = rec;
1671
1672 /* Encrypt record */
Gilles Peskine449bd832023-01-11 14:50:10 +01001673 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1674 mbedtls_test_rnd_std_rand, NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001675
Gilles Peskine5fd88b72023-07-20 22:18:23 +02001676 if (ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
1677 /* It's ok if the output buffer is too small. We do insist
1678 * on at least one mode succeeding; this is tracked by
1679 * seen_success. */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001680 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001681 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001682
Gilles Peskine5fd88b72023-07-20 22:18:23 +02001683 TEST_EQUAL(ret, 0);
1684 seen_success = 1;
1685
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001686#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001687 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001688 /* DTLS 1.2 + CID hides the real content type and
1689 * uses a special CID content type in the protected
1690 * record. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001691 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001692 }
1693#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1694
Ronald Cron6f135e12021-12-08 16:57:54 +01001695#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01001696 if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001697 /* TLS 1.3 hides the real content type and
1698 * always uses Application Data as the content type
1699 * for protected records. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001700 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001701 }
Ronald Cron6f135e12021-12-08 16:57:54 +01001702#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001703
Hanno Beckerb3268da2018-01-05 15:20:24 +00001704 /* Decrypt record with t_dec */
Gilles Peskine449bd832023-01-11 14:50:10 +01001705 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001706
1707 /* Compare results */
Gilles Peskine449bd832023-01-11 14:50:10 +01001708 TEST_ASSERT(rec.type == rec_backup.type);
1709 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1710 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1711 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1712 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1713 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1714 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1715 rec_backup.buf + rec_backup.data_offset,
1716 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001717 }
1718
Gilles Peskine449bd832023-01-11 14:50:10 +01001719 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001720 }
1721
Hanno Becker81e16a32019-03-01 11:21:44 +00001722exit:
1723
Hanno Beckerb3268da2018-01-05 15:20:24 +00001724 /* Cleanup */
Gilles Peskine449bd832023-01-11 14:50:10 +01001725 mbedtls_ssl_free(&ssl);
1726 mbedtls_ssl_transform_free(&t0);
1727 mbedtls_ssl_transform_free(&t1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001728
Gilles Peskine449bd832023-01-11 14:50:10 +01001729 mbedtls_free(buf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01001730 MD_OR_USE_PSA_DONE();
Hanno Beckerb3268da2018-01-05 15:20:24 +00001731}
1732/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03001733
Ronald Cron6f135e12021-12-08 16:57:54 +01001734/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001735void ssl_tls13_hkdf_expand_label(int hash_alg,
1736 data_t *secret,
1737 int label_idx,
1738 data_t *ctx,
1739 int desired_length,
1740 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01001741{
Gilles Peskine449bd832023-01-11 14:50:10 +01001742 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01001743
Hanno Becker70d7fb02020-09-09 10:11:21 +01001744 unsigned char const *lbl = NULL;
1745 size_t lbl_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001746#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1747 if (label_idx == (int) tls13_label_ ## name) \
Xiaofei Baid25fab62021-12-02 06:36:27 +00001748 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00001749 lbl = mbedtls_ssl_tls13_labels.name; \
Gilles Peskine449bd832023-01-11 14:50:10 +01001750 lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001751 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001753#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine449bd832023-01-11 14:50:10 +01001754 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01001755
1756 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001757 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1758 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001759
Gilles Peskine449bd832023-01-11 14:50:10 +01001760 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001761
Gilles Peskine449bd832023-01-11 14:50:10 +01001762 TEST_ASSERT(mbedtls_ssl_tls13_hkdf_expand_label(
1763 (psa_algorithm_t) hash_alg,
1764 secret->x, secret->len,
1765 lbl, lbl_len,
1766 ctx->x, ctx->len,
1767 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01001768
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001769 TEST_MEMORY_COMPARE(dst, (size_t) desired_length,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001770 expected->x, (size_t) expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001771
valerio32f2ac92023-04-20 11:59:52 +02001772exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 PSA_DONE();
Hanno Becker39ff4922020-08-21 13:36:56 +01001774}
1775/* END_CASE */
1776
Ronald Cron6f135e12021-12-08 16:57:54 +01001777/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001778void ssl_tls13_traffic_key_generation(int hash_alg,
1779 data_t *server_secret,
1780 data_t *client_secret,
1781 int desired_iv_len,
1782 int desired_key_len,
1783 data_t *expected_server_write_key,
1784 data_t *expected_server_write_iv,
1785 data_t *expected_client_write_key,
1786 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01001787{
1788 mbedtls_ssl_key_set keys;
1789
1790 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001791 TEST_ASSERT(client_secret->len == server_secret->len);
Yanray Wangd577a682022-10-27 11:47:54 +08001792 TEST_ASSERT(
1793 expected_client_write_iv->len == expected_server_write_iv->len &&
1794 expected_client_write_iv->len == (size_t) desired_iv_len);
1795 TEST_ASSERT(
1796 expected_client_write_key->len == expected_server_write_key->len &&
1797 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001798
Gilles Peskine449bd832023-01-11 14:50:10 +01001799 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001800
Gilles Peskine449bd832023-01-11 14:50:10 +01001801 TEST_ASSERT(mbedtls_ssl_tls13_make_traffic_keys(
1802 (psa_algorithm_t) hash_alg,
1803 client_secret->x,
1804 server_secret->x,
1805 client_secret->len /* == server_secret->len */,
1806 desired_key_len, desired_iv_len,
1807 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01001808
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001809 TEST_MEMORY_COMPARE(keys.client_write_key,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001810 keys.key_len,
1811 expected_client_write_key->x,
1812 (size_t) desired_key_len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001813 TEST_MEMORY_COMPARE(keys.server_write_key,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001814 keys.key_len,
1815 expected_server_write_key->x,
1816 (size_t) desired_key_len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001817 TEST_MEMORY_COMPARE(keys.client_write_iv,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001818 keys.iv_len,
1819 expected_client_write_iv->x,
1820 (size_t) desired_iv_len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001821 TEST_MEMORY_COMPARE(keys.server_write_iv,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001822 keys.iv_len,
1823 expected_server_write_iv->x,
1824 (size_t) desired_iv_len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001825
valerio32f2ac92023-04-20 11:59:52 +02001826exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001827 PSA_DONE();
Hanno Becker19498f82020-08-21 13:37:08 +01001828}
1829/* END_CASE */
1830
Ronald Cron6f135e12021-12-08 16:57:54 +01001831/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001832void ssl_tls13_derive_secret(int hash_alg,
1833 data_t *secret,
1834 int label_idx,
1835 data_t *ctx,
1836 int desired_length,
1837 int already_hashed,
1838 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01001839{
Gilles Peskine449bd832023-01-11 14:50:10 +01001840 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01001841
Hanno Becker70d7fb02020-09-09 10:11:21 +01001842 unsigned char const *lbl = NULL;
1843 size_t lbl_len;
Michael Schuster31b1cb82024-06-04 02:41:10 +02001844#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1845 if (label_idx == (int) tls13_label_ ## name) \
Xiaofei Baid25fab62021-12-02 06:36:27 +00001846 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00001847 lbl = mbedtls_ssl_tls13_labels.name; \
Michael Schuster31b1cb82024-06-04 02:41:10 +02001848 lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001849 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001850 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001851#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine449bd832023-01-11 14:50:10 +01001852 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01001853
Hanno Beckere4849d12020-08-21 14:14:14 +01001854 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001855 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1856 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01001857
Gilles Peskine449bd832023-01-11 14:50:10 +01001858 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001859
Gilles Peskine449bd832023-01-11 14:50:10 +01001860 TEST_ASSERT(mbedtls_ssl_tls13_derive_secret(
1861 (psa_algorithm_t) hash_alg,
1862 secret->x, secret->len,
1863 lbl, lbl_len,
1864 ctx->x, ctx->len,
1865 already_hashed,
1866 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01001867
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001868 TEST_MEMORY_COMPARE(dst, desired_length,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001869 expected->x, desired_length);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001870
valerio32f2ac92023-04-20 11:59:52 +02001871exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 PSA_DONE();
Hanno Beckere4849d12020-08-21 14:14:14 +01001873}
1874/* END_CASE */
1875
Ronald Cron6f135e12021-12-08 16:57:54 +01001876/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001877void ssl_tls13_derive_early_secrets(int hash_alg,
1878 data_t *secret,
1879 data_t *transcript,
1880 data_t *traffic_expected,
1881 data_t *exporter_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01001882{
Xiaofei Bai746f9482021-11-12 08:53:56 +00001883 mbedtls_ssl_tls13_early_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01001884
1885 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001886 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001887 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001888 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001889 secret->len == hash_len &&
1890 transcript->len == hash_len &&
1891 traffic_expected->len == hash_len &&
1892 exporter_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001893
Gilles Peskine449bd832023-01-11 14:50:10 +01001894 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001895
Gilles Peskine449bd832023-01-11 14:50:10 +01001896 TEST_ASSERT(mbedtls_ssl_tls13_derive_early_secrets(
1897 alg, secret->x, transcript->x, transcript->len,
1898 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001899
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001900 TEST_MEMORY_COMPARE(secrets.client_early_traffic_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001901 traffic_expected->x, traffic_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001902 TEST_MEMORY_COMPARE(secrets.early_exporter_master_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001903 exporter_expected->x, exporter_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001904
valerio32f2ac92023-04-20 11:59:52 +02001905exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001906 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001907}
1908/* END_CASE */
1909
Ronald Cron6f135e12021-12-08 16:57:54 +01001910/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001911void ssl_tls13_derive_handshake_secrets(int hash_alg,
1912 data_t *secret,
1913 data_t *transcript,
1914 data_t *client_expected,
1915 data_t *server_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01001916{
Xiaofei Bai746f9482021-11-12 08:53:56 +00001917 mbedtls_ssl_tls13_handshake_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01001918
1919 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001920 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001921 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001922 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001923 secret->len == hash_len &&
1924 transcript->len == hash_len &&
1925 client_expected->len == hash_len &&
1926 server_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001927
Gilles Peskine449bd832023-01-11 14:50:10 +01001928 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001929
Gilles Peskine449bd832023-01-11 14:50:10 +01001930 TEST_ASSERT(mbedtls_ssl_tls13_derive_handshake_secrets(
1931 alg, secret->x, transcript->x, transcript->len,
1932 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001933
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001934 TEST_MEMORY_COMPARE(secrets.client_handshake_traffic_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001935 client_expected->x, client_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001936 TEST_MEMORY_COMPARE(secrets.server_handshake_traffic_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001937 server_expected->x, server_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001938
valerio32f2ac92023-04-20 11:59:52 +02001939exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001940 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001941}
1942/* END_CASE */
1943
Ronald Cron6f135e12021-12-08 16:57:54 +01001944/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001945void ssl_tls13_derive_application_secrets(int hash_alg,
Xiaofei Bai746f9482021-11-12 08:53:56 +00001946 data_t *secret,
1947 data_t *transcript,
Gilles Peskine449bd832023-01-11 14:50:10 +01001948 data_t *client_expected,
1949 data_t *server_expected,
1950 data_t *exporter_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01001951{
Xiaofei Bai746f9482021-11-12 08:53:56 +00001952 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01001953
1954 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001955 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001956 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001957 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001958 secret->len == hash_len &&
1959 transcript->len == hash_len &&
1960 client_expected->len == hash_len &&
1961 server_expected->len == hash_len &&
1962 exporter_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001963
Gilles Peskine449bd832023-01-11 14:50:10 +01001964 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001965
Gilles Peskine449bd832023-01-11 14:50:10 +01001966 TEST_ASSERT(mbedtls_ssl_tls13_derive_application_secrets(
1967 alg, secret->x, transcript->x, transcript->len,
1968 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01001969
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001970 TEST_MEMORY_COMPARE(secrets.client_application_traffic_secret_N, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001971 client_expected->x, client_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001972 TEST_MEMORY_COMPARE(secrets.server_application_traffic_secret_N, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001973 server_expected->x, server_expected->len);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001974 TEST_MEMORY_COMPARE(secrets.exporter_master_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001975 exporter_expected->x, exporter_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01001976
valerio32f2ac92023-04-20 11:59:52 +02001977exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001978 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01001979}
1980/* END_CASE */
1981
Ronald Cron6f135e12021-12-08 16:57:54 +01001982/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001983void ssl_tls13_derive_resumption_secrets(int hash_alg,
1984 data_t *secret,
1985 data_t *transcript,
1986 data_t *resumption_expected)
Hanno Becker55bc2c52021-05-24 06:53:52 +01001987{
Gilles Peskine449bd832023-01-11 14:50:10 +01001988 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Becker55bc2c52021-05-24 06:53:52 +01001989
1990 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01001991 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001992 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02001993 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001994 secret->len == hash_len &&
1995 transcript->len == hash_len &&
1996 resumption_expected->len == hash_len);
Hanno Becker55bc2c52021-05-24 06:53:52 +01001997
Gilles Peskine449bd832023-01-11 14:50:10 +01001998 PSA_INIT();
Hanno Becker55bc2c52021-05-24 06:53:52 +01001999
Gilles Peskine449bd832023-01-11 14:50:10 +01002000 TEST_ASSERT(mbedtls_ssl_tls13_derive_resumption_master_secret(
2001 alg, secret->x, transcript->x, transcript->len,
2002 &secrets) == 0);
Hanno Becker55bc2c52021-05-24 06:53:52 +01002003
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002004 TEST_MEMORY_COMPARE(secrets.resumption_master_secret, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002005 resumption_expected->x, resumption_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01002006
valerio32f2ac92023-04-20 11:59:52 +02002007exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002008 PSA_DONE();
2009}
2010/* END_CASE */
2011
2012/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
2013void ssl_tls13_create_psk_binder(int hash_alg,
2014 data_t *psk,
2015 int psk_type,
2016 data_t *transcript,
2017 data_t *binder_expected)
2018{
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002019 unsigned char binder[MBEDTLS_MD_MAX_SIZE];
Gilles Peskine449bd832023-01-11 14:50:10 +01002020
2021 /* Double-check that we've passed sane parameters. */
2022 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
2023 size_t const hash_len = PSA_HASH_LENGTH(alg);
Michael Schuster31b1cb82024-06-04 02:41:10 +02002024 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
Gilles Peskine449bd832023-01-11 14:50:10 +01002025 transcript->len == hash_len &&
2026 binder_expected->len == hash_len);
2027
2028 PSA_INIT();
2029
2030 TEST_ASSERT(mbedtls_ssl_tls13_create_psk_binder(
2031 NULL, /* SSL context for debugging only */
2032 alg,
2033 psk->x, psk->len,
2034 psk_type,
2035 transcript->x,
2036 binder) == 0);
2037
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002038 TEST_MEMORY_COMPARE(binder, hash_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002039 binder_expected->x, binder_expected->len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002040
valerio32f2ac92023-04-20 11:59:52 +02002041exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002042 PSA_DONE();
Hanno Becker55bc2c52021-05-24 06:53:52 +01002043}
2044/* END_CASE */
2045
Gilles Peskine9d5952d2023-07-20 20:11:21 +02002046/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002047void ssl_tls13_record_protection(int ciphersuite,
2048 int endpoint,
2049 int ctr,
2050 int padding_used,
2051 data_t *server_write_key,
2052 data_t *server_write_iv,
2053 data_t *client_write_key,
2054 data_t *client_write_iv,
2055 data_t *plaintext,
2056 data_t *ciphertext)
Hanno Beckera77d0052021-03-22 15:16:33 +00002057{
2058 mbedtls_ssl_key_set keys;
2059 mbedtls_ssl_transform transform_send;
Gilles Peskine21e46b32023-10-17 16:35:20 +02002060 mbedtls_ssl_transform_init(&transform_send);
Hanno Beckera77d0052021-03-22 15:16:33 +00002061 mbedtls_ssl_transform transform_recv;
Gilles Peskine21e46b32023-10-17 16:35:20 +02002062 mbedtls_ssl_transform_init(&transform_recv);
Hanno Beckera77d0052021-03-22 15:16:33 +00002063 mbedtls_record rec;
2064 unsigned char *buf = NULL;
Hanno Becker1f918782021-08-01 19:18:28 +01002065 size_t buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00002066 int other_endpoint;
2067
Gilles Peskine449bd832023-01-11 14:50:10 +01002068 TEST_ASSERT(endpoint == MBEDTLS_SSL_IS_CLIENT ||
2069 endpoint == MBEDTLS_SSL_IS_SERVER);
Hanno Beckera77d0052021-03-22 15:16:33 +00002070
Gilles Peskine449bd832023-01-11 14:50:10 +01002071 if (endpoint == MBEDTLS_SSL_IS_SERVER) {
Hanno Beckera77d0052021-03-22 15:16:33 +00002072 other_endpoint = MBEDTLS_SSL_IS_CLIENT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002073 }
2074 if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
Hanno Beckera77d0052021-03-22 15:16:33 +00002075 other_endpoint = MBEDTLS_SSL_IS_SERVER;
Gilles Peskine449bd832023-01-11 14:50:10 +01002076 }
Hanno Beckera77d0052021-03-22 15:16:33 +00002077
Gilles Peskine449bd832023-01-11 14:50:10 +01002078 TEST_ASSERT(server_write_key->len == client_write_key->len);
2079 TEST_ASSERT(server_write_iv->len == client_write_iv->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00002080
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 memcpy(keys.client_write_key,
2082 client_write_key->x, client_write_key->len);
2083 memcpy(keys.client_write_iv,
2084 client_write_iv->x, client_write_iv->len);
2085 memcpy(keys.server_write_key,
2086 server_write_key->x, server_write_key->len);
2087 memcpy(keys.server_write_iv,
2088 server_write_iv->x, server_write_iv->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00002089
2090 keys.key_len = server_write_key->len;
2091 keys.iv_len = server_write_iv->len;
2092
Valerio Setti00a256f2023-04-27 17:22:27 +02002093 MD_OR_USE_PSA_INIT();
Hanno Beckera77d0052021-03-22 15:16:33 +00002094
Gilles Peskine449bd832023-01-11 14:50:10 +01002095 TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
2096 &transform_send, endpoint,
2097 ciphersuite, &keys, NULL) == 0);
2098 TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
2099 &transform_recv, other_endpoint,
2100 ciphersuite, &keys, NULL) == 0);
Hanno Beckera77d0052021-03-22 15:16:33 +00002101
Hanno Becker1f918782021-08-01 19:18:28 +01002102 /* Make sure we have enough space in the buffer even if
2103 * we use more padding than the KAT. */
2104 buf_len = ciphertext->len + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
Tom Cosgrove05b2a872023-07-21 11:31:13 +01002105 TEST_CALLOC(buf, buf_len);
Hanno Beckera77d0052021-03-22 15:16:33 +00002106 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
Hanno Becker41537452021-04-20 05:35:28 +01002107
2108 /* TLS 1.3 uses the version identifier from TLS 1.2 on the wire. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002109 mbedtls_ssl_write_version(rec.ver,
2110 MBEDTLS_SSL_TRANSPORT_STREAM,
2111 MBEDTLS_SSL_VERSION_TLS1_2);
Hanno Beckera77d0052021-03-22 15:16:33 +00002112
2113 /* Copy plaintext into record structure */
2114 rec.buf = buf;
Hanno Becker1f918782021-08-01 19:18:28 +01002115 rec.buf_len = buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00002116 rec.data_offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002117 TEST_ASSERT(plaintext->len <= ciphertext->len);
2118 memcpy(rec.buf + rec.data_offset, plaintext->x, plaintext->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00002119 rec.data_len = plaintext->len;
2120#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2121 rec.cid_len = 0;
2122#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2123
Gilles Peskine449bd832023-01-11 14:50:10 +01002124 memset(&rec.ctr[0], 0, 8);
Hanno Beckera77d0052021-03-22 15:16:33 +00002125 rec.ctr[7] = ctr;
2126
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 TEST_ASSERT(mbedtls_ssl_encrypt_buf(NULL, &transform_send, &rec,
2128 NULL, NULL) == 0);
Hanno Becker1f918782021-08-01 19:18:28 +01002129
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 if (padding_used == MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002131 TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002132 ciphertext->x, ciphertext->len);
Hanno Becker1f918782021-08-01 19:18:28 +01002133 }
Hanno Beckera77d0052021-03-22 15:16:33 +00002134
Gilles Peskine449bd832023-01-11 14:50:10 +01002135 TEST_ASSERT(mbedtls_ssl_decrypt_buf(NULL, &transform_recv, &rec) == 0);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002136 TEST_MEMORY_COMPARE(rec.buf + rec.data_offset, rec.data_len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002137 plaintext->x, plaintext->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00002138
valerio32f2ac92023-04-20 11:59:52 +02002139exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002140 mbedtls_free(buf);
2141 mbedtls_ssl_transform_free(&transform_send);
2142 mbedtls_ssl_transform_free(&transform_recv);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002143 MD_OR_USE_PSA_DONE();
Hanno Beckera77d0052021-03-22 15:16:33 +00002144}
2145/* END_CASE */
2146
Andrzej Kurek658442f2022-10-12 11:28:41 -04002147/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002148void ssl_tls13_key_evolution(int hash_alg,
2149 data_t *secret,
2150 data_t *input,
2151 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002152{
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002153 unsigned char secret_new[MBEDTLS_MD_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002154
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01002155 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01002156
Gilles Peskine449bd832023-01-11 14:50:10 +01002157 TEST_ASSERT(mbedtls_ssl_tls13_evolve_secret(
2158 (psa_algorithm_t) hash_alg,
2159 secret->len ? secret->x : NULL,
2160 input->len ? input->x : NULL, input->len,
2161 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002162
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01002163 TEST_MEMORY_COMPARE(secret_new, (size_t) expected->len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01002164 expected->x, (size_t) expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01002165
valerio32f2ac92023-04-20 11:59:52 +02002166exit:
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01002167 PSA_DONE();
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01002168}
2169/* END_CASE */
2170
Jerry Yu53d23e22022-02-09 16:25:09 +08002171/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002172void ssl_tls_prf(int type, data_t *secret, data_t *random,
2173 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03002174{
2175 unsigned char *output;
2176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 output = mbedtls_calloc(1, result_str->len);
2178 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03002179 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002180 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03002181
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002182 MD_OR_USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03002183
Gilles Peskine449bd832023-01-11 14:50:10 +01002184 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
2185 label, random->x, random->len,
2186 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03002187
Gilles Peskine449bd832023-01-11 14:50:10 +01002188 if (exp_ret == 0) {
2189 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
2190 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03002191 }
2192exit:
2193
Gilles Peskine449bd832023-01-11 14:50:10 +01002194 mbedtls_free(output);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002195 MD_OR_USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03002196}
2197/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002198
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002199/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002200void ssl_serialize_session_save_load(int ticket_len, char *crt_file,
2201 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002202{
2203 mbedtls_ssl_session original, restored;
2204 unsigned char *buf = NULL;
2205 size_t len;
2206
2207 /*
2208 * Test that a save-load pair is the identity
2209 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002210 mbedtls_ssl_session_init(&original);
2211 mbedtls_ssl_session_init(&restored);
valerio32f2ac92023-04-20 11:59:52 +02002212 USE_PSA_INIT();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002213
2214 /* Prepare a dummy session to work on */
Jerry Yuf0926292022-07-15 13:05:57 +08002215 ((void) tls_version);
Jerry Yu28547c42023-10-31 14:42:50 +08002216 ((void) ticket_len);
2217 ((void) crt_file);
Jerry Yuf0926292022-07-15 13:05:57 +08002218#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01002219 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Yanray Wangf7b62352022-10-26 11:51:53 +08002220 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
Gilles Peskine449bd832023-01-11 14:50:10 +01002221 &original, 0, endpoint_type) == 0);
Jerry Yu28547c42023-10-31 14:42:50 +08002222 }
Jerry Yuf0926292022-07-15 13:05:57 +08002223#endif
Jerry Yu28547c42023-10-31 14:42:50 +08002224
2225#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2226 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
Yanray Wangf7b62352022-10-26 11:51:53 +08002227 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002228 &original, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08002229 }
Jerry Yu28547c42023-10-31 14:42:50 +08002230#endif
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002231
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002232 /* Serialize it */
Gilles Peskine449bd832023-01-11 14:50:10 +01002233 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
2234 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002235 TEST_CALLOC(buf, len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002236 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
2237 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002238
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002239 /* Restore session from serialized data */
Gilles Peskine449bd832023-01-11 14:50:10 +01002240 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002241
2242 /*
2243 * Make sure both session structures are identical
2244 */
2245#if defined(MBEDTLS_HAVE_TIME)
Ronald Cronc57f86e2023-11-22 09:50:01 +01002246 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
2247 TEST_ASSERT(original.start == restored.start);
Jerry Yu28547c42023-10-31 14:42:50 +08002248 }
Ronald Cronc57f86e2023-11-22 09:50:01 +01002249#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C)
2250 TEST_ASSERT(original.ticket_creation_time == restored.ticket_creation_time);
Jerry Yu28547c42023-10-31 14:42:50 +08002251#endif
Ronald Cronc57f86e2023-11-22 09:50:01 +01002252#endif /* MBEDTLS_HAVE_TIME */
Jerry Yu28547c42023-10-31 14:42:50 +08002253
Gilles Peskine449bd832023-01-11 14:50:10 +01002254 TEST_ASSERT(original.tls_version == restored.tls_version);
Ronald Cron7b1921a2023-11-23 12:31:56 +01002255 TEST_ASSERT(original.endpoint == restored.endpoint);
Gilles Peskine449bd832023-01-11 14:50:10 +01002256 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
Jerry Yuf0926292022-07-15 13:05:57 +08002257#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskine449bd832023-01-11 14:50:10 +01002258 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
2259 TEST_ASSERT(original.id_len == restored.id_len);
2260 TEST_ASSERT(memcmp(original.id,
2261 restored.id, sizeof(original.id)) == 0);
2262 TEST_ASSERT(memcmp(original.master,
2263 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002264
Ronald Crone68ab4f2022-10-05 12:46:29 +02002265#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002266#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01002267 TEST_ASSERT((original.peer_cert == NULL) ==
2268 (restored.peer_cert == NULL));
2269 if (original.peer_cert != NULL) {
2270 TEST_ASSERT(original.peer_cert->raw.len ==
2271 restored.peer_cert->raw.len);
2272 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
2273 restored.peer_cert->raw.p,
2274 original.peer_cert->raw.len) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08002275 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002276#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002277 TEST_ASSERT(original.peer_cert_digest_type ==
2278 restored.peer_cert_digest_type);
2279 TEST_ASSERT(original.peer_cert_digest_len ==
2280 restored.peer_cert_digest_len);
2281 TEST_ASSERT((original.peer_cert_digest == NULL) ==
2282 (restored.peer_cert_digest == NULL));
2283 if (original.peer_cert_digest != NULL) {
2284 TEST_ASSERT(memcmp(original.peer_cert_digest,
2285 restored.peer_cert_digest,
2286 original.peer_cert_digest_len) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08002287 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002288#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Crone68ab4f2022-10-05 12:46:29 +02002289#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01002290 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002291
Jerry Yuf0926292022-07-15 13:05:57 +08002292#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002293 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Jerry Yuf0926292022-07-15 13:05:57 +08002294#endif
2295
2296#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine449bd832023-01-11 14:50:10 +01002297 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Jerry Yuf0926292022-07-15 13:05:57 +08002298#endif
Jerry Yu6ac7c032022-07-21 23:11:55 +08002299#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002300 TEST_ASSERT(original.ticket_len == restored.ticket_len);
2301 if (original.ticket_len != 0) {
2302 TEST_ASSERT(original.ticket != NULL);
2303 TEST_ASSERT(restored.ticket != NULL);
2304 TEST_ASSERT(memcmp(original.ticket,
2305 restored.ticket, original.ticket_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002306 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002307 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002308#endif
Jerry Yuf0926292022-07-15 13:05:57 +08002309 }
Jerry Yu6ac7c032022-07-21 23:11:55 +08002310#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2311
2312#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01002313 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Ronald Cron81963692024-03-26 10:15:08 +01002314#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002315 TEST_ASSERT(original.ticket_age_add == restored.ticket_age_add);
2316 TEST_ASSERT(original.ticket_flags == restored.ticket_flags);
2317 TEST_ASSERT(original.resumption_key_len == restored.resumption_key_len);
2318 if (original.resumption_key_len != 0) {
2319 TEST_ASSERT(original.resumption_key != NULL);
2320 TEST_ASSERT(restored.resumption_key != NULL);
2321 TEST_ASSERT(memcmp(original.resumption_key,
2322 restored.resumption_key,
2323 original.resumption_key_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002324 }
Ronald Cron81963692024-03-26 10:15:08 +01002325#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu34e95162022-12-12 15:14:56 +08002326
Ronald Cron81963692024-03-26 10:15:08 +01002327#if defined(MBEDTLS_SSL_SRV_C)
Waleed Elmelegy2824a202024-02-23 17:51:47 +00002328 if (endpoint_type == MBEDTLS_SSL_IS_SERVER) {
Ronald Cron81963692024-03-26 10:15:08 +01002329#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2330#if defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_ALPN)
Waleed Elmelegy883f77c2024-03-06 19:09:41 +00002331 TEST_ASSERT(original.ticket_alpn != NULL);
2332 TEST_ASSERT(restored.ticket_alpn != NULL);
2333 TEST_MEMORY_COMPARE(original.ticket_alpn, strlen(original.ticket_alpn),
2334 restored.ticket_alpn, strlen(restored.ticket_alpn));
Ronald Cron81963692024-03-26 10:15:08 +01002335#endif
2336#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Waleed Elmelegy2824a202024-02-23 17:51:47 +00002337 }
Ronald Cron81963692024-03-26 10:15:08 +01002338#endif /* MBEDTLS_SSL_SRV_C */
Jerry Yu34e95162022-12-12 15:14:56 +08002339
Ronald Cron81963692024-03-26 10:15:08 +01002340#if defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002341 if (endpoint_type == MBEDTLS_SSL_IS_CLIENT) {
Ronald Cron81963692024-03-26 10:15:08 +01002342#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yu6ac7c032022-07-21 23:11:55 +08002343#if defined(MBEDTLS_HAVE_TIME)
Jerry Yu342a5552023-11-10 14:23:39 +08002344 TEST_ASSERT(original.ticket_reception_time == restored.ticket_reception_time);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002345#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002346 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
2347 TEST_ASSERT(original.ticket_len == restored.ticket_len);
2348 if (original.ticket_len != 0) {
2349 TEST_ASSERT(original.ticket != NULL);
2350 TEST_ASSERT(restored.ticket != NULL);
2351 TEST_ASSERT(memcmp(original.ticket,
2352 restored.ticket,
2353 original.ticket_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08002354 }
Ronald Cron346b8182024-03-27 09:30:13 +01002355#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2356 TEST_ASSERT(original.hostname != NULL);
2357 TEST_ASSERT(restored.hostname != NULL);
2358 TEST_MEMORY_COMPARE(original.hostname, strlen(original.hostname),
2359 restored.hostname, strlen(restored.hostname));
2360#endif
Ronald Cron81963692024-03-26 10:15:08 +01002361#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu6ac7c032022-07-21 23:11:55 +08002362 }
Ronald Cron81963692024-03-26 10:15:08 +01002363#endif /* MBEDTLS_SSL_CLI_C */
Jerry Yu6ac7c032022-07-21 23:11:55 +08002364 }
2365#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002366
Ronald Cron81963692024-03-26 10:15:08 +01002367#if defined(MBEDTLS_SSL_EARLY_DATA)
2368 TEST_ASSERT(
2369 original.max_early_data_size == restored.max_early_data_size);
2370#endif
2371
Waleed Elmelegy049cd302023-12-20 17:28:31 +00002372#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
2373 TEST_ASSERT(original.record_size_limit == restored.record_size_limit);
2374#endif
2375
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002376exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002377 mbedtls_ssl_session_free(&original);
2378 mbedtls_ssl_session_free(&restored);
2379 mbedtls_free(buf);
Valerio Setti285dae82023-04-19 15:10:45 +02002380 USE_PSA_DONE();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002381}
2382/* END_CASE */
2383
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02002384/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002385void ssl_serialize_session_load_save(int ticket_len, char *crt_file,
2386 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002387{
2388 mbedtls_ssl_session session;
2389 unsigned char *buf1 = NULL, *buf2 = NULL;
2390 size_t len0, len1, len2;
2391
2392 /*
2393 * Test that a load-save pair is the identity
2394 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002395 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002396 USE_PSA_INIT();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002397
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002398 /* Prepare a dummy session to work on */
Jerry Yu28547c42023-10-31 14:42:50 +08002399 ((void) ticket_len);
2400 ((void) crt_file);
Jerry Yuaa5dc242023-11-20 18:07:54 +08002401
2402 switch (tls_version) {
Jerry Yua180f992022-07-15 12:52:54 +08002403#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yuaa5dc242023-11-20 18:07:54 +08002404 case MBEDTLS_SSL_VERSION_TLS1_3:
2405 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2406 &session, 0, endpoint_type) == 0);
2407 break;
Jerry Yua180f992022-07-15 12:52:54 +08002408#endif
Jerry Yu28547c42023-10-31 14:42:50 +08002409
2410#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuaa5dc242023-11-20 18:07:54 +08002411 case MBEDTLS_SSL_VERSION_TLS1_2:
2412 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002413 &session, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yuaa5dc242023-11-20 18:07:54 +08002414 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002415#endif
Jerry Yuaa5dc242023-11-20 18:07:54 +08002416 default:
2417 /* should never happen */
2418 TEST_ASSERT(0);
2419 break;
2420 }
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002421
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002422 /* Get desired buffer size for serializing */
Gilles Peskine449bd832023-01-11 14:50:10 +01002423 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
2424 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002425
2426 /* Allocate first buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002427 buf1 = mbedtls_calloc(1, len0);
2428 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002429
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002430 /* Serialize to buffer and free live session */
Gilles Peskine449bd832023-01-11 14:50:10 +01002431 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
2432 == 0);
2433 TEST_ASSERT(len0 == len1);
2434 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002435
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002436 /* Restore session from serialized data */
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002438
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002439 /* Allocate second buffer and serialize to it */
Gilles Peskine449bd832023-01-11 14:50:10 +01002440 buf2 = mbedtls_calloc(1, len0);
2441 TEST_ASSERT(buf2 != NULL);
2442 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
2443 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002444
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002445 /* Make sure both serialized versions are identical */
Gilles Peskine449bd832023-01-11 14:50:10 +01002446 TEST_ASSERT(len1 == len2);
2447 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002448
2449exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002450 mbedtls_ssl_session_free(&session);
2451 mbedtls_free(buf1);
2452 mbedtls_free(buf2);
Valerio Setti285dae82023-04-19 15:10:45 +02002453 USE_PSA_DONE();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002454}
2455/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002456
2457/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002458void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file,
2459 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002460{
2461 mbedtls_ssl_session session;
2462 unsigned char *buf = NULL;
2463 size_t good_len, bad_len, test_len;
2464
2465 /*
2466 * Test that session_save() fails cleanly on small buffers
2467 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002468 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002469 USE_PSA_INIT();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002470
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002471 /* Prepare dummy session and get serialized size */
Jerry Yu28547c42023-10-31 14:42:50 +08002472 ((void) ticket_len);
2473 ((void) crt_file);
Jerry Yu28547c42023-10-31 14:42:50 +08002474
Jerry Yud84c14f2023-11-16 13:33:57 +08002475 switch (tls_version) {
2476#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2477 case MBEDTLS_SSL_VERSION_TLS1_3:
2478 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2479 &session, 0, endpoint_type) == 0);
2480 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002481#endif
Jerry Yud84c14f2023-11-16 13:33:57 +08002482#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2483 case MBEDTLS_SSL_VERSION_TLS1_2:
2484 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002485 &session, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yud84c14f2023-11-16 13:33:57 +08002486 break;
2487#endif
2488 default:
2489 /* should never happen */
2490 TEST_ASSERT(0);
2491 break;
2492 }
Jerry Yu28547c42023-10-31 14:42:50 +08002493
Gilles Peskine449bd832023-01-11 14:50:10 +01002494 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2495 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002496
2497 /* Try all possible bad lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +01002498 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002499 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 mbedtls_free(buf);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002501 buf = NULL;
2502 TEST_CALLOC(buf, bad_len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002503 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
2504 &test_len)
2505 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2506 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002507 }
2508
2509exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002510 mbedtls_ssl_session_free(&session);
2511 mbedtls_free(buf);
Valerio Setti285dae82023-04-19 15:10:45 +02002512 USE_PSA_DONE();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002513}
2514/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002515
2516/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002517void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file,
2518 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002519{
2520 mbedtls_ssl_session session;
2521 unsigned char *good_buf = NULL, *bad_buf = NULL;
2522 size_t good_len, bad_len;
2523
2524 /*
2525 * Test that session_load() fails cleanly on small buffers
2526 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002527 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002528 USE_PSA_INIT();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002529
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002530 /* Prepare serialized session data */
Jerry Yu28547c42023-10-31 14:42:50 +08002531 ((void) ticket_len);
2532 ((void) crt_file);
Jerry Yu4ac648e2023-11-16 13:58:38 +08002533
2534 switch (tls_version) {
Jerry Yu6e8fec22022-07-15 10:37:02 +08002535#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu4ac648e2023-11-16 13:58:38 +08002536 case MBEDTLS_SSL_VERSION_TLS1_3:
2537 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2538 &session, 0, endpoint_type) == 0);
2539 break;
Jerry Yu6e8fec22022-07-15 10:37:02 +08002540#endif
Jerry Yu28547c42023-10-31 14:42:50 +08002541
2542#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yu4ac648e2023-11-16 13:58:38 +08002543 case MBEDTLS_SSL_VERSION_TLS1_2:
2544 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002545 &session, ticket_len, endpoint_type, crt_file) == 0);
Jerry Yu4ac648e2023-11-16 13:58:38 +08002546 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002547#endif
2548
Jerry Yu4ac648e2023-11-16 13:58:38 +08002549 default:
2550 /* should never happen */
2551 TEST_ASSERT(0);
2552 break;
2553 }
2554
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2556 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002557 TEST_CALLOC(good_buf, good_len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002558 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
2559 &good_len) == 0);
2560 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002561
2562 /* Try all possible bad lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +01002563 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002564 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine449bd832023-01-11 14:50:10 +01002565 mbedtls_free(bad_buf);
Gilles Peskined681ffd2023-10-17 17:31:50 +02002566 bad_buf = NULL;
2567 TEST_CALLOC_NONNULL(bad_buf, bad_len);
Gilles Peskine449bd832023-01-11 14:50:10 +01002568 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002569
Gilles Peskine449bd832023-01-11 14:50:10 +01002570 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
2571 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002572 }
2573
2574exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002575 mbedtls_ssl_session_free(&session);
2576 mbedtls_free(good_buf);
2577 mbedtls_free(bad_buf);
Valerio Setti285dae82023-04-19 15:10:45 +02002578 USE_PSA_DONE();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002579}
2580/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002581
Hanno Becker363b6462019-05-29 12:44:28 +01002582/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002583void ssl_session_serialize_version_check(int corrupt_major,
2584 int corrupt_minor,
2585 int corrupt_patch,
2586 int corrupt_config,
2587 int endpoint_type,
2588 int tls_version)
Hanno Becker861d0bb2019-05-21 16:39:30 +01002589{
Gilles Peskine449bd832023-01-11 14:50:10 +01002590 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01002591 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002592 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002593 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002594 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2595 corrupt_minor == 1,
2596 corrupt_patch == 1,
2597 corrupt_config == 1,
2598 corrupt_config == 1 };
2599
Gilles Peskine449bd832023-01-11 14:50:10 +01002600 mbedtls_ssl_session_init(&session);
valerio32f2ac92023-04-20 11:59:52 +02002601 USE_PSA_INIT();
Jerry Yu534ff402022-07-14 16:43:43 +08002602
Jerry Yud84c14f2023-11-16 13:33:57 +08002603 switch (tls_version) {
2604#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2605 case MBEDTLS_SSL_VERSION_TLS1_3:
2606 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2607 &session, 0, endpoint_type) == 0);
2608 break;
Jerry Yu28547c42023-10-31 14:42:50 +08002609#endif
Jerry Yud84c14f2023-11-16 13:33:57 +08002610#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2611 case MBEDTLS_SSL_VERSION_TLS1_2:
2612 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
Ronald Cron7b1921a2023-11-23 12:31:56 +01002613 &session, 0, endpoint_type, NULL) == 0);
Jerry Yu4ac648e2023-11-16 13:58:38 +08002614
Jerry Yud84c14f2023-11-16 13:33:57 +08002615 break;
2616#endif
2617 default:
2618 /* should never happen */
2619 TEST_ASSERT(0);
2620 break;
2621 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002622
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002623 /* Infer length of serialized session. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002624 TEST_ASSERT(mbedtls_ssl_session_save(&session,
2625 serialized_session,
2626 sizeof(serialized_session),
2627 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002628
Gilles Peskine449bd832023-01-11 14:50:10 +01002629 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002630
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002631 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002632 * de-serialize the session - double-check that. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002633 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2634 serialized_session,
2635 serialized_session_len) == 0);
2636 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002637
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002638 /* Go through the bytes in the serialized session header and
2639 * corrupt them bit-by-bit. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002640 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002641 int cur_bit;
BensonLioubedd2512024-03-13 20:21:26 +08002642 unsigned char *const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002643
Gilles Peskine449bd832023-01-11 14:50:10 +01002644 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002645 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002646 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002647
Gilles Peskine449bd832023-01-11 14:50:10 +01002648 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002649 unsigned char const corrupted_bit = 0x1u << cur_bit;
2650 /* Modify a single bit in the serialized session. */
2651 *byte ^= corrupted_bit;
2652
2653 /* Attempt to deserialize */
Gilles Peskine449bd832023-01-11 14:50:10 +01002654 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2655 serialized_session,
2656 serialized_session_len) ==
2657 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002658
2659 /* Undo the change */
2660 *byte ^= corrupted_bit;
2661 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002662 }
valerio32f2ac92023-04-20 11:59:52 +02002663exit:
Valerio Setti285dae82023-04-19 15:10:45 +02002664 USE_PSA_DONE();
Hanno Becker861d0bb2019-05-21 16:39:30 +01002665}
2666/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002667
Minos Galanakis411cb6c2024-03-04 17:33:52 +00002668/* BEGIN_CASE */
2669void ssl_session_id_accessors_check(int tls_version)
2670{
2671 mbedtls_ssl_session session;
2672 int ciphersuite_id;
2673 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2674
2675 mbedtls_ssl_session_init(&session);
2676 USE_PSA_INIT();
2677
2678 switch (tls_version) {
2679#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2680 case MBEDTLS_SSL_VERSION_TLS1_3:
2681 ciphersuite_id = MBEDTLS_TLS1_3_AES_128_GCM_SHA256;
2682 TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
2683 &session, 0, MBEDTLS_SSL_IS_SERVER) == 0);
2684 break;
2685#endif
2686#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2687 case MBEDTLS_SSL_VERSION_TLS1_2:
2688 ciphersuite_id = MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256;
2689 TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
2690 &session, 0, MBEDTLS_SSL_IS_SERVER, NULL) == 0);
2691
2692 break;
2693#endif
2694 default:
2695 /* should never happen */
2696 TEST_ASSERT(0);
2697 break;
2698 }
2699 TEST_ASSERT(*mbedtls_ssl_session_get_id(&session) == session.id);
2700 TEST_ASSERT(mbedtls_ssl_session_get_id_len(&session) == session.id_len);
2701 /* mbedtls_test_ssl_tls1x_populate_session sets a mock suite-id of 0xabcd */
2702 TEST_ASSERT(mbedtls_ssl_session_get_ciphersuite_id(&session) == 0xabcd);
2703
2704 /* Test setting a reference id for tls1.3 and tls1.2 */
2705 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite_id);
2706 if (ciphersuite_info != NULL) {
2707 TEST_ASSERT(mbedtls_ssl_ciphersuite_get_id(ciphersuite_info) == ciphersuite_id);
2708 }
2709
2710exit:
2711 mbedtls_ssl_session_free(&session);
2712 USE_PSA_DONE();
2713}
2714/* END_CASE */
2715
Valerio Settidb6b4db2023-09-01 09:20:51 +02002716/* 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 +01002717void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002718{
2719 enum { BUFFSIZE = 1024 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002720 mbedtls_test_ssl_endpoint ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002721 int ret = -1;
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 Kurek780dc182022-06-10 08:57:19 -04002724 options.pk_alg = MBEDTLS_PK_RSA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002725
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002726 MD_OR_USE_PSA_INIT();
2727
Yanray Wangf7b62352022-10-26 11:51:53 +08002728 ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, &options,
Ronald Cronfb536472024-01-26 14:55:25 +01002729 NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01002730 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002731
Yanray Wangbd296832022-10-26 18:28:11 +08002732 ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, options.pk_alg,
2733 0, 0, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +01002734 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002735
Yanray Wangf7b62352022-10-26 11:51:53 +08002736 ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, &options,
Ronald Cronfb536472024-01-26 14:55:25 +01002737 NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01002738 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002739
2740exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002741 mbedtls_test_ssl_endpoint_free(&ep, NULL);
2742 mbedtls_test_free_handshake_options(&options);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002743 MD_OR_USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002744}
2745/* END_CASE */
2746
Valerio Settidb6b4db2023-09-01 09:20:51 +02002747/* 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 +01002748void move_handshake_to_state(int endpoint_type, int tls_version, int state, int need_pass)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002749{
2750 enum { BUFFSIZE = 1024 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002751 mbedtls_test_ssl_endpoint base_ep, second_ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002752 int ret = -1;
Ronald Cron43263c02023-03-09 16:48:10 +01002753 (void) tls_version;
2754
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002755 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002756 mbedtls_test_init_handshake_options(&options);
Ronald Cron43263c02023-03-09 16:48:10 +01002757
Andrzej Kurek780dc182022-06-10 08:57:19 -04002758 options.pk_alg = MBEDTLS_PK_RSA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002759
Ronald Cron43263c02023-03-09 16:48:10 +01002760 /*
Ronald Cron097ba142023-03-08 16:18:00 +01002761 * If both TLS 1.2 and 1.3 are enabled and we want to do a TLS 1.2
2762 * handshake, force the TLS 1.2 version on endpoint under test.
Ronald Cron43263c02023-03-09 16:48:10 +01002763 */
2764#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Ronald Cron097ba142023-03-08 16:18:00 +01002765 if (MBEDTLS_SSL_VERSION_TLS1_2 == tls_version) {
2766 if (MBEDTLS_SSL_IS_CLIENT == endpoint_type) {
2767 options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2768 options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2769 } else {
2770 options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2771 options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2772 }
Ronald Cron43263c02023-03-09 16:48:10 +01002773 }
2774#endif
2775
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002776 MD_OR_USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +01002777 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
2778 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Neil Armstrong06baf042022-04-14 16:21:15 +02002779
Yanray Wangf7b62352022-10-26 11:51:53 +08002780 ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type, &options,
Ronald Cronfb536472024-01-26 14:55:25 +01002781 NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01002782 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002783
Yanray Wangbd296832022-10-26 18:28:11 +08002784 ret = mbedtls_test_ssl_endpoint_init(
2785 &second_ep,
2786 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
2787 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01002788 &options, NULL, NULL, NULL);
Andrzej Kurek780dc182022-06-10 08:57:19 -04002789
Gilles Peskine449bd832023-01-11 14:50:10 +01002790 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002791
Yanray Wangf7b62352022-10-26 11:51:53 +08002792 ret = mbedtls_test_mock_socket_connect(&(base_ep.socket),
2793 &(second_ep.socket),
2794 BUFFSIZE);
Gilles Peskine449bd832023-01-11 14:50:10 +01002795 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002796
Yanray Wangf7b62352022-10-26 11:51:53 +08002797 ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl),
2798 &(second_ep.ssl),
2799 state);
Gilles Peskine449bd832023-01-11 14:50:10 +01002800 if (need_pass) {
2801 TEST_ASSERT(ret == 0 ||
2802 ret == MBEDTLS_ERR_SSL_WANT_READ ||
2803 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
2804 TEST_ASSERT(base_ep.ssl.state == state);
2805 } else {
2806 TEST_ASSERT(ret != 0 &&
2807 ret != MBEDTLS_ERR_SSL_WANT_READ &&
2808 ret != MBEDTLS_ERR_SSL_WANT_WRITE);
2809 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002810 }
2811
2812exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002813 mbedtls_test_free_handshake_options(&options);
2814 mbedtls_test_ssl_endpoint_free(&base_ep, NULL);
2815 mbedtls_test_ssl_endpoint_free(&second_ep, NULL);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01002816 MD_OR_USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002817}
2818/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002819
Valerio Settidb6b4db2023-09-01 09:20:51 +02002820/* 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 +01002821void handshake_version(int dtls, int client_min_version, int client_max_version,
2822 int server_min_version, int server_max_version,
2823 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002824{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002825 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002826 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002827
Paul Elliottc8570442020-04-15 17:00:50 +01002828 options.client_min_version = client_min_version;
2829 options.client_max_version = client_max_version;
2830 options.server_min_version = server_min_version;
2831 options.server_max_version = server_max_version;
Paul Elliottc8570442020-04-15 17:00:50 +01002832 options.expected_negotiated_version = expected_negotiated_version;
2833
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002834 options.dtls = dtls;
Yanray Wangf7b62352022-10-26 11:51:53 +08002835 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002836
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002837 /* The goto below is used to avoid an "unused label" warning.*/
2838 goto exit;
Andrzej Kureke11acb22022-06-27 06:11:34 -04002839
2840exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002841 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002842}
2843/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05002844
Manuel Pégourié-Gonnardbef824d2023-03-17 12:50:01 +01002845/* 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 +01002846void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002847{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002848 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002849 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002850
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002851 options.cipher = cipher;
2852 options.dtls = dtls;
2853 options.psk_str = psk_str;
2854 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05002855
Ronald Cron097ba142023-03-08 16:18:00 +01002856 options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2857 options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2858 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
2859
Yanray Wangf7b62352022-10-26 11:51:53 +08002860 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002861
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002862 /* The goto below is used to avoid an "unused label" warning.*/
2863 goto exit;
Andrzej Kureke11acb22022-06-27 06:11:34 -04002864
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04002865exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002866 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002867}
2868/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002869
Manuel Pégourié-Gonnardbef824d2023-03-17 12:50:01 +01002870/* 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 +01002871void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002872{
Gilles Peskine449bd832023-01-11 14:50:10 +01002873 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002874
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002875 /* The goto below is used to avoid an "unused label" warning.*/
2876 goto exit;
2877}
2878/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002879
Manuel Pégourié-Gonnardbef824d2023-03-17 12:50:01 +01002880/* 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 +01002881void handshake_ciphersuite_select(char *cipher, int pk_alg, data_t *psk_str,
2882 int psa_alg, int psa_alg2, int psa_usage,
2883 int expected_handshake_result,
2884 int expected_ciphersuite)
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002885{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002886 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002887 mbedtls_test_init_handshake_options(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002888
2889 options.cipher = cipher;
Neil Armstrongdb134972022-06-30 09:06:28 +02002890 options.psk_str = psk_str;
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002891 options.pk_alg = pk_alg;
2892 options.opaque_alg = psa_alg;
2893 options.opaque_alg2 = psa_alg2;
2894 options.opaque_usage = psa_usage;
2895 options.expected_handshake_result = expected_handshake_result;
2896 options.expected_ciphersuite = expected_ciphersuite;
Ronald Cron097ba142023-03-08 16:18:00 +01002897
2898 options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2899 options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2900 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
2901
Yanray Wangf7b62352022-10-26 11:51:53 +08002902 mbedtls_test_ssl_perform_handshake(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002903
2904 /* The goto below is used to avoid an "unused label" warning.*/
2905 goto exit;
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04002906
2907exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002908 mbedtls_test_free_handshake_options(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002909}
2910/* END_CASE */
2911
Valerio Settidb6b4db2023-09-01 09:20:51 +02002912/* 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 +01002913void app_data(int mfl, int cli_msg_len, int srv_msg_len,
2914 int expected_cli_fragments,
2915 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002916{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002917 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002918 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002919
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002920 options.mfl = mfl;
2921 options.cli_msg_len = cli_msg_len;
2922 options.srv_msg_len = srv_msg_len;
2923 options.expected_cli_fragments = expected_cli_fragments;
2924 options.expected_srv_fragments = expected_srv_fragments;
2925 options.dtls = dtls;
Ronald Cron097ba142023-03-08 16:18:00 +01002926
2927 options.client_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2928 options.client_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2929 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002930
Yanray Wangf7b62352022-10-26 11:51:53 +08002931 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04002932
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002933 /* The goto below is used to avoid an "unused label" warning.*/
2934 goto exit;
Andrzej Kurek780dc182022-06-10 08:57:19 -04002935
2936exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002937 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002938}
2939/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002940
Valerio Settidb6b4db2023-09-01 09:20:51 +02002941/* 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 +01002942void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
2943 int expected_cli_fragments,
2944 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002945{
Gilles Peskine449bd832023-01-11 14:50:10 +01002946 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2947 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002948 /* The goto below is used to avoid an "unused label" warning.*/
2949 goto exit;
2950}
2951/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002952
Valerio Settidb6b4db2023-09-01 09:20:51 +02002953/* 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 +01002954void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
2955 int expected_cli_fragments,
2956 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002957{
Gilles Peskine449bd832023-01-11 14:50:10 +01002958 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2959 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002960 /* The goto below is used to avoid an "unused label" warning.*/
2961 goto exit;
2962}
2963/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002964
Valerio Settidb6b4db2023-09-01 09:20:51 +02002965/* 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 +01002966void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002967{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002968 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08002969 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002970
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002971 options.serialize = 1;
2972 options.dtls = 1;
Ronald Cron097ba142023-03-08 16:18:00 +01002973 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Yanray Wangf7b62352022-10-26 11:51:53 +08002974 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002975 /* The goto below is used to avoid an "unused label" warning.*/
2976 goto exit;
Andrzej Kurek6e518ab2022-06-11 05:08:38 -04002977exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08002978 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002979}
2980/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002981
Valerio Settie94ab3c2025-01-20 11:07:09 +01002982/* 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 +01002983void handshake_fragmentation(int mfl,
2984 int expected_srv_hs_fragmentation,
Valerio Settie94ab3c2025-01-20 11:07:09 +01002985 int expected_cli_hs_fragmentation,
2986 char *ciphersuite)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002987{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08002988 mbedtls_test_handshake_test_options options;
2989 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002990
2991 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
2992 srv_pattern.counter = 0;
2993 cli_pattern.counter = 0;
2994
Yanray Wangf7b62352022-10-26 11:51:53 +08002995 mbedtls_test_init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002996 options.dtls = 1;
Ronald Cron097ba142023-03-08 16:18:00 +01002997 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002998 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00002999 /* Set cipher to one using CBC so that record splitting can be tested */
Valerio Settie94ab3c2025-01-20 11:07:09 +01003000 options.cipher = ciphersuite;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003001 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
3002 options.srv_log_obj = &srv_pattern;
3003 options.cli_log_obj = &cli_pattern;
Yanray Wangf7b62352022-10-26 11:51:53 +08003004 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
3005 options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003006
Yanray Wangf7b62352022-10-26 11:51:53 +08003007 mbedtls_test_ssl_perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003008
3009 /* Test if the server received a fragmented handshake */
Gilles Peskine449bd832023-01-11 14:50:10 +01003010 if (expected_srv_hs_fragmentation) {
3011 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003012 }
3013 /* Test if the client received a fragmented handshake */
Gilles Peskine449bd832023-01-11 14:50:10 +01003014 if (expected_cli_hs_fragmentation) {
3015 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003016 }
Andrzej Kurek780dc182022-06-10 08:57:19 -04003017
3018exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003019 mbedtls_test_free_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003020}
3021/* END_CASE */
3022
Gilles Peskine7cdf5632025-03-07 23:01:42 +01003023/* This test case doesn't actually depend on certificates,
3024 * but our helper code for mbedtls_test_ssl_endpoint does. */
3025/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Gilles Peskine39bcbb62025-03-07 20:40:50 +01003026void recombine_server_first_flight(int version,
3027 int instruction, int param,
3028 char *client_log, char *server_log,
3029 int goal_state, int expected_ret)
3030{
3031 enum { BUFFSIZE = 17000 };
Gilles Peskineaa9b4552025-03-07 22:26:36 +01003032 mbedtls_test_ssl_endpoint client;
3033 memset(&client, 0, sizeof(client));
3034 mbedtls_test_ssl_endpoint server;
3035 memset(&server, 0, sizeof(server));
Gilles Peskine39bcbb62025-03-07 20:40:50 +01003036 mbedtls_test_handshake_test_options client_options;
3037 mbedtls_test_init_handshake_options(&client_options);
3038 mbedtls_test_handshake_test_options server_options;
3039 mbedtls_test_init_handshake_options(&server_options);
3040#if defined(MBEDTLS_DEBUG_C)
3041 mbedtls_test_ssl_log_pattern cli_pattern = { .pattern = client_log };
3042 mbedtls_test_ssl_log_pattern srv_pattern = { .pattern = server_log };
3043#endif
3044 int ret = 0;
3045
3046 MD_OR_USE_PSA_INIT();
3047#if defined(MBEDTLS_DEBUG_C)
3048 mbedtls_debug_set_threshold(3);
3049#endif
3050
3051 client_options.client_min_version = version;
3052 client_options.client_max_version = version;
3053#if defined(MBEDTLS_DEBUG_C)
3054 client_options.cli_log_obj = &cli_pattern;
3055 client_options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
3056#else
3057 (void) cli_pattern;
3058#endif
3059 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
3060 &client_options, NULL, NULL,
3061 NULL), 0);
3062#if defined(MBEDTLS_DEBUG_C)
3063 mbedtls_ssl_conf_dbg(&client.conf, client_options.cli_log_fun,
3064 client_options.cli_log_obj);
3065#endif
3066
3067 server_options.server_min_version = version;
3068 server_options.server_max_version = version;
3069#if defined(MBEDTLS_DEBUG_C)
3070 server_options.srv_log_obj = &srv_pattern;
3071 server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
3072#else
3073 (void) srv_pattern;
3074#endif
3075 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
3076 &server_options, NULL, NULL,
3077 NULL), 0);
3078#if defined(MBEDTLS_DEBUG_C)
3079 mbedtls_ssl_conf_dbg(&server.conf, server_options.srv_log_fun,
3080 server_options.srv_log_obj);
3081#endif
3082
3083 TEST_EQUAL(mbedtls_test_mock_socket_connect(&client.socket,
3084 &server.socket,
3085 BUFFSIZE), 0);
3086
3087 /* Client: emit the first flight from the client */
3088 while (ret == 0) {
3089 mbedtls_test_set_step(client.ssl.state);
3090 ret = mbedtls_ssl_handshake_step(&client.ssl);
3091 }
3092 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
3093 ret = 0;
3094 TEST_EQUAL(client.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
3095
3096 /* Server: parse the first flight from the client
3097 * and emit the first flight from the server */
3098 while (ret == 0) {
3099 mbedtls_test_set_step(1000 + server.ssl.state);
3100 ret = mbedtls_ssl_handshake_step(&server.ssl);
3101 }
3102 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
3103 ret = 0;
3104 TEST_EQUAL(server.ssl.state, MBEDTLS_SSL_SERVER_HELLO_DONE + 1);
3105
3106 /* Recombine the first flight from the server */
3107 TEST_ASSERT(recombine_records(&server, instruction, param));
3108
3109 /* Client: parse the first flight from the server
3110 * and emit the second flight from the client */
3111 while (ret == 0 && !mbedtls_ssl_is_handshake_over(&client.ssl)) {
3112 mbedtls_test_set_step(client.ssl.state);
3113 ret = mbedtls_ssl_handshake_step(&client.ssl);
3114 if (client.ssl.state == goal_state && ret != 0) {
3115 TEST_EQUAL(ret, expected_ret);
3116 goto goal_reached;
3117 }
3118 }
3119#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3120 if (version >= MBEDTLS_SSL_VERSION_TLS1_3 &&
3121 goal_state >= MBEDTLS_SSL_HANDSHAKE_OVER) {
3122 TEST_EQUAL(ret, 0);
3123 } else
3124#endif
3125 {
3126 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
3127 }
3128 ret = 0;
3129
3130 /* Server: parse the first flight from the client
3131 * and emit the second flight from the server */
3132 while (ret == 0 && !mbedtls_ssl_is_handshake_over(&server.ssl)) {
3133 mbedtls_test_set_step(1000 + server.ssl.state);
3134 ret = mbedtls_ssl_handshake_step(&server.ssl);
3135 }
3136 TEST_EQUAL(ret, 0);
3137
3138 /* Client: parse the second flight from the server */
3139 while (ret == 0 && !mbedtls_ssl_is_handshake_over(&client.ssl)) {
3140 mbedtls_test_set_step(client.ssl.state);
3141 ret = mbedtls_ssl_handshake_step(&client.ssl);
3142 }
3143 if (client.ssl.state == goal_state) {
3144 TEST_EQUAL(ret, expected_ret);
3145 } else {
3146 TEST_EQUAL(ret, 0);
3147 }
3148
3149goal_reached:
3150#if defined(MBEDTLS_DEBUG_C)
3151 TEST_ASSERT(cli_pattern.counter >= 1);
3152 TEST_ASSERT(srv_pattern.counter >= 1);
3153#endif
3154
3155exit:
3156 mbedtls_test_ssl_endpoint_free(&client, NULL);
3157 mbedtls_test_ssl_endpoint_free(&server, NULL);
3158 mbedtls_test_free_handshake_options(&client_options);
3159 mbedtls_test_free_handshake_options(&server_options);
3160 MD_OR_USE_PSA_DONE();
3161#if defined(MBEDTLS_DEBUG_C)
3162 mbedtls_debug_set_threshold(0);
3163#endif
3164}
3165/* END_CASE */
3166
Valerio Settidb6b4db2023-09-01 09:20:51 +02003167/* 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 +01003168void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003169{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003170 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08003171 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003172
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003173 options.renegotiate = 1;
3174 options.legacy_renegotiation = legacy_renegotiation;
3175 options.dtls = 1;
Ronald Cron097ba142023-03-08 16:18:00 +01003176 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003177
Yanray Wangf7b62352022-10-26 11:51:53 +08003178 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04003179
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003180 /* The goto below is used to avoid an "unused label" warning.*/
3181 goto exit;
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04003182exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003183 mbedtls_test_free_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003184}
3185/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003186
Valerio Settidb6b4db2023-09-01 09:20:51 +02003187/* 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 +01003188void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
3189 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003190{
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003191 mbedtls_test_handshake_test_options options;
Yanray Wangf7b62352022-10-26 11:51:53 +08003192 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003193
3194 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003195 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003196 options.renegotiate = renegotiation;
3197 options.legacy_renegotiation = legacy_renegotiation;
3198 options.serialize = serialize;
3199 options.dtls = dtls;
Ronald Cron097ba142023-03-08 16:18:00 +01003200 if (dtls) {
3201 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
3202 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003203 options.resize_buffers = 1;
3204
Yanray Wangf7b62352022-10-26 11:51:53 +08003205 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04003206
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003207 /* The goto below is used to avoid an "unused label" warning.*/
3208 goto exit;
Andrzej Kurek780dc182022-06-10 08:57:19 -04003209exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003210 mbedtls_test_free_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003211}
3212/* END_CASE */
3213
Valerio Settidb6b4db2023-09-01 09:20:51 +02003214/* 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 +01003215void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003216{
Gilles Peskine449bd832023-01-11 14:50:10 +01003217 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
3218 (char *) "");
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003219 /* The goto below is used to avoid an "unused label" warning.*/
3220 goto exit;
3221}
3222/* END_CASE */
3223
Valerio Settidb6b4db2023-09-01 09:20:51 +02003224/* 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 +01003225void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
3226 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003227{
Gilles Peskine449bd832023-01-11 14:50:10 +01003228 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003229 /* The goto below is used to avoid an "unused label" warning.*/
3230 goto exit;
3231}
3232/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02003233
Ronald Cron73fe8df2022-10-05 14:31:43 +02003234/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
Hanno Becker6667ffd2021-04-19 21:59:22 +01003235void test_multiple_psks()
3236{
3237 unsigned char psk0[10] = { 0 };
3238 unsigned char psk0_identity[] = { 'f', 'o', 'o' };
3239
3240 unsigned char psk1[10] = { 0 };
3241 unsigned char psk1_identity[] = { 'b', 'a', 'r' };
3242
3243 mbedtls_ssl_config conf;
3244
Gilles Peskine449bd832023-01-11 14:50:10 +01003245 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003246 MD_OR_USE_PSA_INIT();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003247
Gilles Peskine449bd832023-01-11 14:50:10 +01003248 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3249 psk0, sizeof(psk0),
3250 psk0_identity, sizeof(psk0_identity)) == 0);
3251 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3252 psk1, sizeof(psk1),
3253 psk1_identity, sizeof(psk1_identity)) ==
3254 MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003255
3256exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003257 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003258 MD_OR_USE_PSA_DONE();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003259}
3260/* END_CASE */
3261
Ronald Cron73fe8df2022-10-05 14:31:43 +02003262/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED:MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003263void test_multiple_psks_opaque(int mode)
Hanno Becker6667ffd2021-04-19 21:59:22 +01003264{
3265 /*
3266 * Mode 0: Raw PSK, then opaque PSK
3267 * Mode 1: Opaque PSK, then raw PSK
3268 * Mode 2: 2x opaque PSK
3269 */
3270
3271 unsigned char psk0_raw[10] = { 0 };
3272 unsigned char psk0_raw_identity[] = { 'f', 'o', 'o' };
3273
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 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 +01003275
Hanno Becker6667ffd2021-04-19 21:59:22 +01003276 unsigned char psk0_opaque_identity[] = { 'f', 'o', 'o' };
3277
3278 unsigned char psk1_raw[10] = { 0 };
3279 unsigned char psk1_raw_identity[] = { 'b', 'a', 'r' };
3280
Gilles Peskine449bd832023-01-11 14:50:10 +01003281 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 +01003282
Hanno Becker6667ffd2021-04-19 21:59:22 +01003283 unsigned char psk1_opaque_identity[] = { 'b', 'a', 'r' };
3284
3285 mbedtls_ssl_config conf;
3286
Gilles Peskine449bd832023-01-11 14:50:10 +01003287 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003288 MD_OR_USE_PSA_INIT();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003289
Gilles Peskine449bd832023-01-11 14:50:10 +01003290 switch (mode) {
Hanno Becker6667ffd2021-04-19 21:59:22 +01003291 case 0:
3292
Gilles Peskine449bd832023-01-11 14:50:10 +01003293 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3294 psk0_raw, sizeof(psk0_raw),
3295 psk0_raw_identity, sizeof(psk0_raw_identity))
3296 == 0);
3297 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3298 psk1_opaque,
3299 psk1_opaque_identity,
3300 sizeof(psk1_opaque_identity))
3301 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003302 break;
3303
3304 case 1:
3305
Gilles Peskine449bd832023-01-11 14:50:10 +01003306 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3307 psk0_opaque,
3308 psk0_opaque_identity,
3309 sizeof(psk0_opaque_identity))
3310 == 0);
3311 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
3312 psk1_raw, sizeof(psk1_raw),
3313 psk1_raw_identity, sizeof(psk1_raw_identity))
3314 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003315
3316 break;
3317
3318 case 2:
3319
Gilles Peskine449bd832023-01-11 14:50:10 +01003320 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3321 psk0_opaque,
3322 psk0_opaque_identity,
3323 sizeof(psk0_opaque_identity))
3324 == 0);
3325 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
3326 psk1_opaque,
3327 psk1_opaque_identity,
3328 sizeof(psk1_opaque_identity))
3329 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003330
3331 break;
3332
3333 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003334 TEST_ASSERT(0);
Hanno Becker6667ffd2021-04-19 21:59:22 +01003335 break;
3336 }
3337
3338exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003339 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003340 MD_OR_USE_PSA_DONE();
Hanno Becker6667ffd2021-04-19 21:59:22 +01003341
3342}
3343/* END_CASE */
Brett Warren7f813d52021-10-20 23:08:38 +01003344
Ronald Cron37bdaab2022-03-30 16:45:51 +02003345/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003346void conf_version(int endpoint, int transport,
3347 int min_tls_version, int max_tls_version,
3348 int expected_ssl_setup_result)
Ronald Cron37bdaab2022-03-30 16:45:51 +02003349{
3350 mbedtls_ssl_config conf;
3351 mbedtls_ssl_context ssl;
3352
Gilles Peskine449bd832023-01-11 14:50:10 +01003353 mbedtls_ssl_config_init(&conf);
3354 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003355 MD_OR_USE_PSA_INIT();
Ronald Cron37bdaab2022-03-30 16:45:51 +02003356
Gilles Peskine449bd832023-01-11 14:50:10 +01003357 mbedtls_ssl_conf_endpoint(&conf, endpoint);
3358 mbedtls_ssl_conf_transport(&conf, transport);
3359 mbedtls_ssl_conf_min_tls_version(&conf, min_tls_version);
3360 mbedtls_ssl_conf_max_tls_version(&conf, max_tls_version);
Ronald Cron10b040f2024-02-05 09:38:09 +01003361 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Ronald Cron37bdaab2022-03-30 16:45:51 +02003362
Gilles Peskine449bd832023-01-11 14:50:10 +01003363 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == expected_ssl_setup_result);
Pengyu Lvdb614332023-07-10 10:56:54 +08003364 TEST_EQUAL(mbedtls_ssl_conf_get_endpoint(
3365 mbedtls_ssl_context_get_config(&ssl)), endpoint);
Ronald Cron37bdaab2022-03-30 16:45:51 +02003366
Gilles Peskine449bd832023-01-11 14:50:10 +01003367 mbedtls_ssl_free(&ssl);
3368 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003369
3370exit:
3371 MD_OR_USE_PSA_DONE();
Ronald Cron37bdaab2022-03-30 16:45:51 +02003372}
3373/* END_CASE */
3374
Manuel Pégourié-Gonnardf07ce3b2023-09-22 11:53:41 +02003375/* 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 +01003376void conf_curve()
3377{
3378
3379 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP192R1,
3380 MBEDTLS_ECP_DP_SECP224R1,
3381 MBEDTLS_ECP_DP_SECP256R1,
3382 MBEDTLS_ECP_DP_NONE };
Tom Cosgrovea327b522022-08-03 08:33:06 +01003383 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
3384 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
3385 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
3386 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Brett Warren7f813d52021-10-20 23:08:38 +01003387
3388 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01003389 mbedtls_ssl_config_init(&conf);
Jerry Yubaa49342022-02-15 10:26:40 +08003390#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskine449bd832023-01-11 14:50:10 +01003391 mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
3392 mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
Jerry Yubaa49342022-02-15 10:26:40 +08003393#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003394 mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
3395 mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
Jerry Yubaa49342022-02-15 10:26:40 +08003396#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003397 mbedtls_ssl_conf_curves(&conf, curve_list);
Brett Warren7f813d52021-10-20 23:08:38 +01003398
3399 mbedtls_ssl_context ssl;
Gilles Peskine449bd832023-01-11 14:50:10 +01003400 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003401 MD_OR_USE_PSA_INIT();
3402
Ronald Cron10b040f2024-02-05 09:38:09 +01003403 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Yanray Wangd6128e92023-12-01 17:08:56 +08003404
Gilles Peskine449bd832023-01-11 14:50:10 +01003405 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Brett Warren7f813d52021-10-20 23:08:38 +01003406
Gilles Peskine449bd832023-01-11 14:50:10 +01003407 TEST_ASSERT(ssl.handshake != NULL && ssl.handshake->group_list != NULL);
3408 TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list == NULL);
Brett Warren7f813d52021-10-20 23:08:38 +01003409
Yanray Wangd577a682022-10-27 11:47:54 +08003410 TEST_EQUAL(ssl.handshake->
3411 group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
Gilles Peskine449bd832023-01-11 14:50:10 +01003412 MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
Brett Warren7f813d52021-10-20 23:08:38 +01003413
Gilles Peskine449bd832023-01-11 14:50:10 +01003414 for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
3415 TEST_EQUAL(iana_tls_group_list[i], ssl.handshake->group_list[i]);
3416 }
Brett Warren7f813d52021-10-20 23:08:38 +01003417
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003418exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003419 mbedtls_ssl_free(&ssl);
3420 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003421 MD_OR_USE_PSA_DONE();
Brett Warren7f813d52021-10-20 23:08:38 +01003422}
3423/* END_CASE */
3424
Manuel Pégourié-Gonnard632667e2025-01-14 12:25:52 +01003425/* BEGIN_CASE */
Brett Warren7f813d52021-10-20 23:08:38 +01003426void conf_group()
3427{
3428 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
Gilles Peskine449bd832023-01-11 14:50:10 +01003429 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
3430 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
3431 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Brett Warren7f813d52021-10-20 23:08:38 +01003432
3433 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01003434 mbedtls_ssl_config_init(&conf);
Brett Warren7f813d52021-10-20 23:08:38 +01003435
Ronald Cron10b040f2024-02-05 09:38:09 +01003436 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Manuel Pégourié-Gonnardea18c7e2025-01-22 10:04:43 +01003437 mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,
3438 MBEDTLS_SSL_TRANSPORT_STREAM,
3439 MBEDTLS_SSL_PRESET_DEFAULT);
Brett Warren7f813d52021-10-20 23:08:38 +01003440
Gilles Peskine449bd832023-01-11 14:50:10 +01003441 mbedtls_ssl_conf_groups(&conf, iana_tls_group_list);
Brett Warren7f813d52021-10-20 23:08:38 +01003442
3443 mbedtls_ssl_context ssl;
Gilles Peskine449bd832023-01-11 14:50:10 +01003444 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003445 MD_OR_USE_PSA_INIT();
3446
Gilles Peskine449bd832023-01-11 14:50:10 +01003447 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Brett Warren7f813d52021-10-20 23:08:38 +01003448
Gilles Peskine449bd832023-01-11 14:50:10 +01003449 TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list != NULL);
Brett Warren7f813d52021-10-20 23:08:38 +01003450
Yanray Wangd577a682022-10-27 11:47:54 +08003451 TEST_EQUAL(ssl.conf->
3452 group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
Gilles Peskine449bd832023-01-11 14:50:10 +01003453 MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
Brett Warren7f813d52021-10-20 23:08:38 +01003454
Gilles Peskine449bd832023-01-11 14:50:10 +01003455 for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
3456 TEST_EQUAL(iana_tls_group_list[i], ssl.conf->group_list[i]);
3457 }
Brett Warren7f813d52021-10-20 23:08:38 +01003458
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003459exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003460 mbedtls_ssl_free(&ssl);
3461 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003462 MD_OR_USE_PSA_DONE();
Brett Warren7f813d52021-10-20 23:08:38 +01003463}
3464/* END_CASE */
Paul Elliottb9af2db2022-03-09 15:34:37 +00003465
Valerio Settidb6b4db2023-09-01 09:20:51 +02003466/* 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 +01003467void force_bad_session_id_len()
Andrzej Kurek514683a2022-06-10 10:33:05 -04003468{
3469 enum { BUFFSIZE = 1024 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003470 mbedtls_test_handshake_test_options options;
3471 mbedtls_test_ssl_endpoint client, server;
3472 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Andrzej Kurek514683a2022-06-10 10:33:05 -04003473 mbedtls_test_message_socket_context server_context, client_context;
3474
3475 srv_pattern.pattern = cli_pattern.pattern = "cache did not store session";
3476 srv_pattern.counter = 0;
Yanray Wangf7b62352022-10-26 11:51:53 +08003477 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003478
3479 options.srv_log_obj = &srv_pattern;
Yanray Wangf7b62352022-10-26 11:51:53 +08003480 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
Andrzej Kurek514683a2022-06-10 10:33:05 -04003481
Gilles Peskine449bd832023-01-11 14:50:10 +01003482 mbedtls_platform_zeroize(&client, sizeof(client));
3483 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurek514683a2022-06-10 10:33:05 -04003484
Yanray Wangf7b62352022-10-26 11:51:53 +08003485 mbedtls_test_message_socket_init(&server_context);
3486 mbedtls_test_message_socket_init(&client_context);
Valerio Setti00a256f2023-04-27 17:22:27 +02003487 MD_OR_USE_PSA_INIT();
Andrzej Kurek514683a2022-06-10 10:33:05 -04003488
Yanray Wangf7b62352022-10-26 11:51:53 +08003489 TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
3490 &options, NULL, NULL,
Ronald Cronfb536472024-01-26 14:55:25 +01003491 NULL) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003492
Yanray Wangf7b62352022-10-26 11:51:53 +08003493 TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01003494 &options, NULL, NULL, NULL) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003495
Gilles Peskine449bd832023-01-11 14:50:10 +01003496 mbedtls_debug_set_threshold(1);
3497 mbedtls_ssl_conf_dbg(&server.conf, options.srv_log_fun,
3498 options.srv_log_obj);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003499
Yanray Wangf7b62352022-10-26 11:51:53 +08003500 TEST_ASSERT(mbedtls_test_mock_socket_connect(&(client.socket),
3501 &(server.socket),
3502 BUFFSIZE) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003503
Yanray Wangbd296832022-10-26 18:28:11 +08003504 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
3505 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_WRAPUP)
Gilles Peskine449bd832023-01-11 14:50:10 +01003506 == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003507 /* Force a bad session_id_len that will be read by the server in
3508 * mbedtls_ssl_cache_set. */
3509 server.ssl.session_negotiate->id_len = 33;
Gilles Peskine449bd832023-01-11 14:50:10 +01003510 if (options.cli_msg_len != 0 || options.srv_msg_len != 0) {
Andrzej Kurek514683a2022-06-10 10:33:05 -04003511 /* Start data exchanging test */
Yanray Wangb088bfc2023-03-16 12:15:49 +08003512 TEST_ASSERT(mbedtls_test_ssl_exchange_data(
3513 &(client.ssl), options.cli_msg_len,
3514 options.expected_cli_fragments,
3515 &(server.ssl), options.srv_msg_len,
3516 options.expected_srv_fragments)
Gilles Peskine449bd832023-01-11 14:50:10 +01003517 == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003518 }
Andrzej Kurek514683a2022-06-10 10:33:05 -04003519
3520 /* Make sure that the cache did not store the session */
Gilles Peskine449bd832023-01-11 14:50:10 +01003521 TEST_EQUAL(srv_pattern.counter, 1);
Andrzej Kurek514683a2022-06-10 10:33:05 -04003522exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003523 mbedtls_test_ssl_endpoint_free(&client, NULL);
3524 mbedtls_test_ssl_endpoint_free(&server, NULL);
3525 mbedtls_test_free_handshake_options(&options);
Gilles Peskine449bd832023-01-11 14:50:10 +01003526 mbedtls_debug_set_threshold(0);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003527 MD_OR_USE_PSA_DONE();
Andrzej Kurek514683a2022-06-10 10:33:05 -04003528}
3529/* END_CASE */
3530
Andrzej Kureked4d2172022-06-08 11:57:57 -04003531/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine449bd832023-01-11 14:50:10 +01003532void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003533{
3534 mbedtls_ssl_context ssl;
3535 mbedtls_ssl_config conf;
3536 size_t len;
3537
Gilles Peskine449bd832023-01-11 14:50:10 +01003538 mbedtls_ssl_init(&ssl);
3539 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003540 USE_PSA_INIT();
3541
Gilles Peskine449bd832023-01-11 14:50:10 +01003542 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
3543 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
3544 MBEDTLS_SSL_PRESET_DEFAULT),
3545 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01003546 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003547
Gilles Peskine449bd832023-01-11 14:50:10 +01003548 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
3549 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
3550 ssl.cli_id_len,
3551 cookie->x, cookie->len,
3552 ssl.out_buf,
3553 MBEDTLS_SSL_OUT_CONTENT_LEN,
3554 &len),
3555 exp_ret);
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003556
valerio32f2ac92023-04-20 11:59:52 +02003557exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003558 mbedtls_ssl_free(&ssl);
3559 mbedtls_ssl_config_free(&conf);
Valerio Setti285dae82023-04-19 15:10:45 +02003560 USE_PSA_DONE();
Andrzej Kurekcfb01942022-06-06 13:08:23 -04003561}
3562/* END_CASE */
3563
Paul Elliottb9af2db2022-03-09 15:34:37 +00003564/* BEGIN_CASE depends_on:MBEDTLS_TIMING_C:MBEDTLS_HAVE_TIME */
Gilles Peskine449bd832023-01-11 14:50:10 +01003565void timing_final_delay_accessor()
Paul Elliottb9af2db2022-03-09 15:34:37 +00003566{
3567 mbedtls_timing_delay_context delay_context;
3568
Valerio Setti285dae82023-04-19 15:10:45 +02003569 USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +01003570 mbedtls_timing_set_delay(&delay_context, 50, 100);
Paul Elliottb9af2db2022-03-09 15:34:37 +00003571
Gilles Peskine449bd832023-01-11 14:50:10 +01003572 TEST_ASSERT(mbedtls_timing_get_final_delay(&delay_context) == 100);
valerio32f2ac92023-04-20 11:59:52 +02003573
3574exit:
Valerio Setti285dae82023-04-19 15:10:45 +02003575 USE_PSA_DONE();
Paul Elliottb9af2db2022-03-09 15:34:37 +00003576}
3577/* END_CASE */
Paul Elliott02758a52022-03-16 14:32:33 +00003578
3579/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_CONNECTION_ID */
Gilles Peskine449bd832023-01-11 14:50:10 +01003580void cid_sanity()
Paul Elliott02758a52022-03-16 14:32:33 +00003581{
3582 mbedtls_ssl_context ssl;
3583 mbedtls_ssl_config conf;
3584
3585 unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
3586 unsigned char test_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
3587 int cid_enabled;
3588 size_t own_cid_len;
3589
Gilles Peskine449bd832023-01-11 14:50:10 +01003590 mbedtls_test_rnd_std_rand(NULL, own_cid, sizeof(own_cid));
Paul Elliott02758a52022-03-16 14:32:33 +00003591
Gilles Peskine449bd832023-01-11 14:50:10 +01003592 mbedtls_ssl_init(&ssl);
3593 mbedtls_ssl_config_init(&conf);
valerio32f2ac92023-04-20 11:59:52 +02003594 MD_OR_USE_PSA_INIT();
Paul Elliott02758a52022-03-16 14:32:33 +00003595
Gilles Peskine449bd832023-01-11 14:50:10 +01003596 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
3597 MBEDTLS_SSL_IS_CLIENT,
3598 MBEDTLS_SSL_TRANSPORT_STREAM,
3599 MBEDTLS_SSL_PRESET_DEFAULT)
3600 == 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01003601 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Paul Elliott02758a52022-03-16 14:32:33 +00003602
Gilles Peskine449bd832023-01-11 14:50:10 +01003603 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003604
3605 /* Can't use CID functions with stream transport. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003606 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
3607 sizeof(own_cid))
3608 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003609
Gilles Peskine449bd832023-01-11 14:50:10 +01003610 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
3611 &own_cid_len)
3612 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003613
Gilles Peskine449bd832023-01-11 14:50:10 +01003614 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
3615 MBEDTLS_SSL_IS_CLIENT,
3616 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
3617 MBEDTLS_SSL_PRESET_DEFAULT)
3618 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003619
3620 /* Attempt to set config cid size too big. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003621 TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, MBEDTLS_SSL_CID_IN_LEN_MAX + 1,
3622 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
3623 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003624
Gilles Peskine449bd832023-01-11 14:50:10 +01003625 TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, sizeof(own_cid),
3626 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
3627 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003628
3629 /* Attempt to set CID length not matching config. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003630 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
3631 MBEDTLS_SSL_CID_IN_LEN_MAX - 1)
3632 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00003633
Gilles Peskine449bd832023-01-11 14:50:10 +01003634 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
3635 sizeof(own_cid))
3636 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003637
3638 /* Test we get back what we put in. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003639 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
3640 &own_cid_len)
3641 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003642
Gilles Peskine449bd832023-01-11 14:50:10 +01003643 TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_ENABLED);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01003644 TEST_MEMORY_COMPARE(own_cid, own_cid_len, test_cid, own_cid_len);
Paul Elliott02758a52022-03-16 14:32:33 +00003645
3646 /* Test disabling works. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003647 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_DISABLED, NULL,
3648 0)
3649 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003650
Gilles Peskine449bd832023-01-11 14:50:10 +01003651 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
3652 &own_cid_len)
3653 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00003654
Gilles Peskine449bd832023-01-11 14:50:10 +01003655 TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_DISABLED);
Paul Elliott02758a52022-03-16 14:32:33 +00003656
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003657exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003658 mbedtls_ssl_free(&ssl);
3659 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003660 MD_OR_USE_PSA_DONE();
Paul Elliott02758a52022-03-16 14:32:33 +00003661}
3662/* END_CASE */
3663
Elena Uziunaite47a9b3d2024-09-16 14:25:38 +01003664/* 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 +01003665void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb3427822022-03-08 06:55:42 -05003666{
3667 enum { BUFFSIZE = 17000 };
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003668 mbedtls_test_ssl_endpoint client, server;
Andrzej Kurekb3427822022-03-08 06:55:42 -05003669 mbedtls_psa_stats_t stats;
Andrzej Kurek39d88d42022-03-31 06:30:54 -04003670 size_t free_slots_before = -1;
Ronald Cronfb536472024-01-26 14:55:25 +01003671 mbedtls_test_handshake_test_options client_options, server_options;
3672 mbedtls_test_init_handshake_options(&client_options);
3673 mbedtls_test_init_handshake_options(&server_options);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003674
Andrzej Kurekcc28e9a2022-03-08 18:36:35 -05003675 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
3676 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003677 MD_OR_USE_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +01003678 mbedtls_platform_zeroize(&client, sizeof(client));
3679 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb3427822022-03-08 06:55:42 -05003680
3681 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek83e60ee2022-04-14 08:51:41 -04003682 * the raw key agreement. Flipping the first byte makes the
3683 * required 0x04 identifier invalid. */
Ronald Cronfb536472024-01-26 14:55:25 +01003684 client_options.pk_alg = MBEDTLS_PK_ECDSA;
3685 client_options.group_list = iana_tls_group_list;
Yanray Wangf7b62352022-10-26 11:51:53 +08003686 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01003687 &client_options, NULL, NULL,
3688 NULL), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003689
3690 /* Server side */
Ronald Cronfb536472024-01-26 14:55:25 +01003691 server_options.pk_alg = MBEDTLS_PK_ECDSA;
3692 server_options.server_min_version = MBEDTLS_SSL_VERSION_TLS1_2;
3693 server_options.server_max_version = MBEDTLS_SSL_VERSION_TLS1_2;
Yanray Wangf7b62352022-10-26 11:51:53 +08003694 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01003695 &server_options, NULL, NULL,
3696 NULL), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003697
Yanray Wangf7b62352022-10-26 11:51:53 +08003698 TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket),
3699 &(server.socket),
3700 BUFFSIZE), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003701
Yanray Wangbd296832022-10-26 18:28:11 +08003702 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
3703 &(client.ssl), &(server.ssl),
3704 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003705
Gilles Peskine449bd832023-01-11 14:50:10 +01003706 mbedtls_psa_get_stats(&stats);
Andrzej Kurek39d88d42022-03-31 06:30:54 -04003707 /* Save the number of slots in use up to this point.
3708 * With PSA, one can be used for the ECDH private key. */
3709 free_slots_before = stats.empty_slots;
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04003710
Gilles Peskine449bd832023-01-11 14:50:10 +01003711 if (bad_server_ecdhe_key) {
Gilles Peskineb4f874d2022-04-08 16:48:09 -04003712 /* Force a simulated bitflip in the server key. to make the
3713 * raw key agreement in ssl_write_client_key_exchange fail. */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003714 (client.ssl).handshake->xxdh_psa_peerkey[0] ^= 0x02;
Gilles Peskineb4f874d2022-04-08 16:48:09 -04003715 }
Andrzej Kurekb3427822022-03-08 06:55:42 -05003716
Yanray Wangbd296832022-10-26 18:28:11 +08003717 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
3718 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER),
Gilles Peskine449bd832023-01-11 14:50:10 +01003719 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003720
Gilles Peskine449bd832023-01-11 14:50:10 +01003721 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb3427822022-03-08 06:55:42 -05003722
Gilles Peskineb4f874d2022-04-08 16:48:09 -04003723 /* Make sure that the key slot is already destroyed in case of failure,
3724 * without waiting to close the connection. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003725 if (bad_server_ecdhe_key) {
3726 TEST_EQUAL(free_slots_before, stats.empty_slots);
3727 }
Andrzej Kurekb3427822022-03-08 06:55:42 -05003728
3729exit:
Yanray Wangf7b62352022-10-26 11:51:53 +08003730 mbedtls_test_ssl_endpoint_free(&client, NULL);
3731 mbedtls_test_ssl_endpoint_free(&server, NULL);
Ronald Cronfb536472024-01-26 14:55:25 +01003732 mbedtls_test_free_handshake_options(&client_options);
3733 mbedtls_test_free_handshake_options(&server_options);
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04003734
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003735 MD_OR_USE_PSA_DONE();
Andrzej Kurekb3427822022-03-08 06:55:42 -05003736}
3737/* END_CASE */
Valerio Settidb6b4db2023-09-01 09:20:51 +02003738/* 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 +01003739void tls13_server_certificate_msg_invalid_vector_len()
Ronald Crone3dac4a2022-06-10 17:21:51 +02003740{
3741 int ret = -1;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003742 mbedtls_test_ssl_endpoint client_ep, server_ep;
Ronald Crone3dac4a2022-06-10 17:21:51 +02003743 unsigned char *buf, *end;
3744 size_t buf_len;
3745 int step = 0;
3746 int expected_result;
Ronald Crone7b9b6b2022-06-10 17:24:31 +02003747 mbedtls_ssl_chk_buf_ptr_args expected_chk_buf_ptr_args;
Yanray Wang9ef0dce2022-10-25 16:44:13 +08003748 mbedtls_test_handshake_test_options client_options;
3749 mbedtls_test_handshake_test_options server_options;
Ronald Crone3dac4a2022-06-10 17:21:51 +02003750
3751 /*
3752 * Test set-up
3753 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003754 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
3755 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
Ronald Crone3dac4a2022-06-10 17:21:51 +02003756
Yanray Wangf7b62352022-10-26 11:51:53 +08003757 mbedtls_test_init_handshake_options(&client_options);
valerio32f2ac92023-04-20 11:59:52 +02003758 MD_OR_USE_PSA_INIT();
3759
Paul Elliott9a8d7842022-07-10 12:48:57 +01003760 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Yanray Wangf7b62352022-10-26 11:51:53 +08003761 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01003762 &client_options, NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01003763 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003764
Yanray Wangf7b62352022-10-26 11:51:53 +08003765 mbedtls_test_init_handshake_options(&server_options);
Paul Elliott9a8d7842022-07-10 12:48:57 +01003766 server_options.pk_alg = MBEDTLS_PK_ECDSA;
Yanray Wangf7b62352022-10-26 11:51:53 +08003767 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01003768 &server_options, NULL, NULL, NULL);
Gilles Peskine449bd832023-01-11 14:50:10 +01003769 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003770
Yanray Wangf7b62352022-10-26 11:51:53 +08003771 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
3772 &(server_ep.socket), 1024);
Gilles Peskine449bd832023-01-11 14:50:10 +01003773 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003774
Gilles Peskine449bd832023-01-11 14:50:10 +01003775 while (1) {
3776 mbedtls_test_set_step(++step);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003777
Yanray Wangbd296832022-10-26 18:28:11 +08003778 ret = mbedtls_test_move_handshake_to_state(
3779 &(server_ep.ssl), &(client_ep.ssl),
3780 MBEDTLS_SSL_CERTIFICATE_VERIFY);
Gilles Peskine449bd832023-01-11 14:50:10 +01003781 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003782
Gilles Peskine449bd832023-01-11 14:50:10 +01003783 ret = mbedtls_ssl_flush_output(&(server_ep.ssl));
3784 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003785
Yanray Wangbd296832022-10-26 18:28:11 +08003786 ret = mbedtls_test_move_handshake_to_state(
3787 &(client_ep.ssl), &(server_ep.ssl),
3788 MBEDTLS_SSL_SERVER_CERTIFICATE);
Gilles Peskine449bd832023-01-11 14:50:10 +01003789 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003790
Gilles Peskine449bd832023-01-11 14:50:10 +01003791 ret = mbedtls_ssl_tls13_fetch_handshake_msg(&(client_ep.ssl),
3792 MBEDTLS_SSL_HS_CERTIFICATE,
3793 &buf, &buf_len);
3794 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003795
3796 end = buf + buf_len;
3797
3798 /*
3799 * Tweak server Certificate message and parse it.
3800 */
3801
Yanray Wangf56181a2023-03-16 12:21:33 +08003802 ret = mbedtls_test_tweak_tls13_certificate_msg_vector_len(
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 buf, &end, step, &expected_result, &expected_chk_buf_ptr_args);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003804
Gilles Peskine449bd832023-01-11 14:50:10 +01003805 if (ret != 0) {
Ronald Crone3dac4a2022-06-10 17:21:51 +02003806 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01003807 }
Ronald Crone3dac4a2022-06-10 17:21:51 +02003808
Gilles Peskine449bd832023-01-11 14:50:10 +01003809 ret = mbedtls_ssl_tls13_parse_certificate(&(client_ep.ssl), buf, end);
3810 TEST_EQUAL(ret, expected_result);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003811
Gilles Peskine449bd832023-01-11 14:50:10 +01003812 TEST_ASSERT(mbedtls_ssl_cmp_chk_buf_ptr_fail_args(
3813 &expected_chk_buf_ptr_args) == 0);
Ronald Crone7b9b6b2022-06-10 17:24:31 +02003814
Gilles Peskine449bd832023-01-11 14:50:10 +01003815 mbedtls_ssl_reset_chk_buf_ptr_fail_args();
Ronald Crone7b9b6b2022-06-10 17:24:31 +02003816
Gilles Peskine449bd832023-01-11 14:50:10 +01003817 ret = mbedtls_ssl_session_reset(&(client_ep.ssl));
3818 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003819
Gilles Peskine449bd832023-01-11 14:50:10 +01003820 ret = mbedtls_ssl_session_reset(&(server_ep.ssl));
3821 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02003822 }
3823
3824exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 mbedtls_ssl_reset_chk_buf_ptr_fail_args();
Yanray Wangf7b62352022-10-26 11:51:53 +08003826 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
3827 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
3828 mbedtls_test_free_handshake_options(&client_options);
3829 mbedtls_test_free_handshake_options(&server_options);
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003830 MD_OR_USE_PSA_DONE();
Ronald Crone3dac4a2022-06-10 17:21:51 +02003831}
3832/* END_CASE */
Valerio Setti4452e982022-12-01 15:08:35 +01003833
3834/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01003835void ssl_ecjpake_set_password(int use_opaque_arg)
Valerio Setti4452e982022-12-01 15:08:35 +01003836{
3837 mbedtls_ssl_context ssl;
3838 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01003839#if defined(MBEDTLS_USE_PSA_CRYPTO)
Valerio Setti4452e982022-12-01 15:08:35 +01003840 mbedtls_svc_key_id_t pwd_slot = MBEDTLS_SVC_KEY_ID_INIT;
3841#else /* MBEDTLS_USE_PSA_CRYPTO */
3842 (void) use_opaque_arg;
3843#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003844 unsigned char pwd_string[sizeof(ECJPAKE_TEST_PWD)] = "";
Valerio Setti4452e982022-12-01 15:08:35 +01003845 size_t pwd_len = 0;
Valerio Setti4452e982022-12-01 15:08:35 +01003846 int ret;
3847
Gilles Peskine449bd832023-01-11 14:50:10 +01003848 mbedtls_ssl_init(&ssl);
valerio32f2ac92023-04-20 11:59:52 +02003849 MD_OR_USE_PSA_INIT();
Valerio Setti4452e982022-12-01 15:08:35 +01003850
Valerio Settie7518ba2022-12-02 12:09:43 +01003851 /* test with uninitalized SSL context */
Gilles Peskine449bd832023-01-11 14:50:10 +01003852 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Valerio Setti4452e982022-12-01 15:08:35 +01003853
Gilles Peskine449bd832023-01-11 14:50:10 +01003854 mbedtls_ssl_config_init(&conf);
Valerio Setti4452e982022-12-01 15:08:35 +01003855
Gilles Peskine449bd832023-01-11 14:50:10 +01003856 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf,
3857 MBEDTLS_SSL_IS_CLIENT,
3858 MBEDTLS_SSL_TRANSPORT_STREAM,
3859 MBEDTLS_SSL_PRESET_DEFAULT), 0);
Ronald Cronaab4a542024-02-23 18:51:11 +01003860 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL);
Valerio Setti4452e982022-12-01 15:08:35 +01003861
Gilles Peskine449bd832023-01-11 14:50:10 +01003862 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
Valerio Setti4452e982022-12-01 15:08:35 +01003863
Valerio Settiba22c9c2022-12-06 11:42:33 +01003864 /* test with empty password or unitialized password key (depending on use_opaque_arg) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003865 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Valerio Setti4452e982022-12-01 15:08:35 +01003866
Gilles Peskine449bd832023-01-11 14:50:10 +01003867 pwd_len = strlen(ECJPAKE_TEST_PWD);
3868 memcpy(pwd_string, ECJPAKE_TEST_PWD, pwd_len);
Valerio Setti4452e982022-12-01 15:08:35 +01003869
Gilles Peskine449bd832023-01-11 14:50:10 +01003870#if defined(MBEDTLS_USE_PSA_CRYPTO)
3871 if (use_opaque_arg) {
Valerio Setti4452e982022-12-01 15:08:35 +01003872 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti785116a2022-12-12 11:59:25 +01003873 psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti4452e982022-12-01 15:08:35 +01003874
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003875 /* First try with an invalid usage */
Gilles Peskine449bd832023-01-11 14:50:10 +01003876 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
3877 psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE);
3878 psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD);
Valerio Setti4452e982022-12-01 15:08:35 +01003879
Gilles Peskine449bd832023-01-11 14:50:10 +01003880 PSA_ASSERT(psa_import_key(&attributes, pwd_string,
3881 pwd_len, &pwd_slot));
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003882
Gilles Peskine449bd832023-01-11 14:50:10 +01003883 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003884
Valerio Setti9d313df2022-12-09 11:38:59 +01003885 /* check that the opaque key is still valid after failure */
Gilles Peskine449bd832023-01-11 14:50:10 +01003886 TEST_EQUAL(psa_get_key_attributes(pwd_slot, &check_attributes),
3887 PSA_SUCCESS);
Valerio Setti9d313df2022-12-09 11:38:59 +01003888
Gilles Peskine449bd832023-01-11 14:50:10 +01003889 psa_destroy_key(pwd_slot);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003890
3891 /* Then set the correct usage */
Gilles Peskine449bd832023-01-11 14:50:10 +01003892 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01003893
Gilles Peskine449bd832023-01-11 14:50:10 +01003894 PSA_ASSERT(psa_import_key(&attributes, pwd_string,
3895 pwd_len, &pwd_slot));
Valerio Setti4452e982022-12-01 15:08:35 +01003896 }
3897#endif /* MBEDTLS_USE_PSA_CRYPTO */
3898
Valerio Settie7518ba2022-12-02 12:09:43 +01003899 /* final check which should work without errors */
Gilles Peskine449bd832023-01-11 14:50:10 +01003900 ECJPAKE_TEST_SET_PASSWORD(0);
Valerio Setti4452e982022-12-01 15:08:35 +01003901
Gilles Peskine449bd832023-01-11 14:50:10 +01003902#if defined(MBEDTLS_USE_PSA_CRYPTO)
3903 if (use_opaque_arg) {
3904 psa_destroy_key(pwd_slot);
Valerio Setti31e99bb2022-12-09 14:35:10 +01003905 }
Valerio Settie7518ba2022-12-02 12:09:43 +01003906#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003907 mbedtls_ssl_free(&ssl);
3908 mbedtls_ssl_config_free(&conf);
Valerio Setti4452e982022-12-01 15:08:35 +01003909
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003910 MD_OR_USE_PSA_DONE();
Valerio Setti4452e982022-12-01 15:08:35 +01003911}
3912/* END_CASE */
Valerio Setti73260b62023-01-03 12:53:28 +01003913
Valerio Setti2c121852023-01-09 18:00:39 +01003914/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003915void elliptic_curve_get_properties()
Valerio Setti73260b62023-01-03 12:53:28 +01003916{
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02003917 psa_key_type_t psa_type = PSA_KEY_TYPE_NONE;
Valerio Setti73260b62023-01-03 12:53:28 +01003918 size_t psa_bits;
3919
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003920 MD_OR_USE_PSA_INIT();
Valerio Setti73260b62023-01-03 12:53:28 +01003921
Valerio Settidb6b4db2023-09-01 09:20:51 +02003922#if defined(MBEDTLS_ECP_HAVE_SECP521R1) || defined(PSA_WANT_ECC_SECP_R1_521)
Gilles Peskine449bd832023-01-11 14:50:10 +01003923 TEST_AVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
Valerio Setti73260b62023-01-03 12:53:28 +01003924#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003925 TEST_UNAVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
Valerio Setti73260b62023-01-03 12:53:28 +01003926#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003927#if defined(MBEDTLS_ECP_HAVE_BP512R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
Gilles Peskine449bd832023-01-11 14:50:10 +01003928 TEST_AVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
Valerio Setti73260b62023-01-03 12:53:28 +01003929#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003930 TEST_UNAVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
Valerio Setti73260b62023-01-03 12:53:28 +01003931#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003932#if defined(MBEDTLS_ECP_HAVE_SECP384R1) || defined(PSA_WANT_ECC_SECP_R1_384)
Gilles Peskine449bd832023-01-11 14:50:10 +01003933 TEST_AVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003934#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003935 TEST_UNAVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003936#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003937#if defined(MBEDTLS_ECP_HAVE_BP384R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
Gilles Peskine449bd832023-01-11 14:50:10 +01003938 TEST_AVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003939#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003940 TEST_UNAVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01003941#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003942#if defined(MBEDTLS_ECP_HAVE_SECP256R1) || defined(PSA_WANT_ECC_SECP_R1_256)
Gilles Peskine449bd832023-01-11 14:50:10 +01003943 TEST_AVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003944#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003945 TEST_UNAVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003946#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003947#if defined(MBEDTLS_ECP_HAVE_SECP256K1) || defined(PSA_WANT_ECC_SECP_K1_256)
Gilles Peskine449bd832023-01-11 14:50:10 +01003948 TEST_AVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003949#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003950 TEST_UNAVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003951#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003952#if defined(MBEDTLS_ECP_HAVE_BP256R1) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
Gilles Peskine449bd832023-01-11 14:50:10 +01003953 TEST_AVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003954#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003955 TEST_UNAVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01003956#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003957#if defined(MBEDTLS_ECP_HAVE_SECP224R1) || defined(PSA_WANT_ECC_SECP_R1_224)
Gilles Peskine449bd832023-01-11 14:50:10 +01003958 TEST_AVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003959#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003960 TEST_UNAVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003961#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003962#if defined(MBEDTLS_ECP_HAVE_SECP224K1) || defined(PSA_WANT_ECC_SECP_K1_224)
Gilles Peskine449bd832023-01-11 14:50:10 +01003963 TEST_AVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003964#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003965 TEST_UNAVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01003966#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003967#if defined(MBEDTLS_ECP_HAVE_SECP192R1) || defined(PSA_WANT_ECC_SECP_R1_192)
Gilles Peskine449bd832023-01-11 14:50:10 +01003968 TEST_AVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003969#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003970 TEST_UNAVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003971#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003972#if defined(MBEDTLS_ECP_HAVE_SECP192K1) || defined(PSA_WANT_ECC_SECP_K1_192)
Gilles Peskine449bd832023-01-11 14:50:10 +01003973 TEST_AVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003974#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003975 TEST_UNAVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01003976#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003977#if defined(MBEDTLS_ECP_HAVE_CURVE25519) || defined(PSA_WANT_ECC_MONTGOMERY_255)
Gilles Peskine449bd832023-01-11 14:50:10 +01003978 TEST_AVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
Valerio Setti73260b62023-01-03 12:53:28 +01003979#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 TEST_UNAVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
Valerio Setti73260b62023-01-03 12:53:28 +01003981#endif
Valerio Settidb6b4db2023-09-01 09:20:51 +02003982#if defined(MBEDTLS_ECP_HAVE_CURVE448) || defined(PSA_WANT_ECC_MONTGOMERY_448)
Gilles Peskine449bd832023-01-11 14:50:10 +01003983 TEST_AVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
Valerio Setti73260b62023-01-03 12:53:28 +01003984#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003985 TEST_UNAVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
Valerio Setti73260b62023-01-03 12:53:28 +01003986#endif
valerio32f2ac92023-04-20 11:59:52 +02003987 goto exit;
3988exit:
Manuel Pégourié-Gonnard23fc4372023-03-17 13:34:11 +01003989 MD_OR_USE_PSA_DONE();
Valerio Setti73260b62023-01-03 12:53:28 +01003990}
3991/* END_CASE */
Ronald Crond903a862024-01-15 15:57:17 +01003992
3993/* 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 */
3994void tls13_resume_session_with_ticket()
3995{
3996 int ret = -1;
Ronald Crond903a862024-01-15 15:57:17 +01003997 mbedtls_test_ssl_endpoint client_ep, server_ep;
3998 mbedtls_test_handshake_test_options client_options;
3999 mbedtls_test_handshake_test_options server_options;
4000 mbedtls_ssl_session saved_session;
4001
Ronald Crond903a862024-01-15 15:57:17 +01004002 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
4003 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
4004 mbedtls_test_init_handshake_options(&client_options);
4005 mbedtls_test_init_handshake_options(&server_options);
4006 mbedtls_ssl_session_init(&saved_session);
4007
Ronald Cron095a3a52024-01-31 14:34:22 +01004008 PSA_INIT();
Ronald Crond903a862024-01-15 15:57:17 +01004009
Ronald Cron1f6e4e42024-01-26 16:31:33 +01004010 /*
4011 * Run first handshake to get a ticket from the server.
4012 */
Ronald Crond903a862024-01-15 15:57:17 +01004013 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cron1f6e4e42024-01-26 16:31:33 +01004014 server_options.pk_alg = MBEDTLS_PK_ECDSA;
4015
4016 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
4017 &saved_session);
4018 TEST_EQUAL(ret, 0);
4019
4020 /*
4021 * Prepare for handshake with the ticket.
4022 */
Ronald Crond903a862024-01-15 15:57:17 +01004023 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01004024 &client_options, NULL, NULL, NULL);
Ronald Crond903a862024-01-15 15:57:17 +01004025 TEST_EQUAL(ret, 0);
4026
Ronald Crond903a862024-01-15 15:57:17 +01004027 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01004028 &server_options, NULL, NULL, NULL);
Ronald Cron1f6e4e42024-01-26 16:31:33 +01004029 TEST_EQUAL(ret, 0);
4030
Ronald Crond903a862024-01-15 15:57:17 +01004031 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4032 mbedtls_test_ticket_write,
4033 mbedtls_test_ticket_parse,
4034 NULL);
4035 TEST_EQUAL(ret, 0);
4036
4037 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4038 &(server_ep.socket), 1024);
4039 TEST_EQUAL(ret, 0);
4040
Ronald Crond903a862024-01-15 15:57:17 +01004041 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4042 TEST_EQUAL(ret, 0);
4043
Ronald Cron5de9c6f2024-01-31 14:45:16 +01004044 /*
Ronald Cron1f6e4e42024-01-26 16:31:33 +01004045 * Handshake with ticket.
4046 *
Ronald Cron5de9c6f2024-01-31 14:45:16 +01004047 * Run the handshake up to MBEDTLS_SSL_HANDSHAKE_WRAPUP and not
4048 * MBEDTLS_SSL_HANDSHAKE_OVER to preserve handshake data for the checks
4049 * below.
4050 */
Ronald Croneb845342024-01-31 14:48:23 +01004051 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4052 &(server_ep.ssl), &(client_ep.ssl),
4053 MBEDTLS_SSL_HANDSHAKE_WRAPUP), 0);
Ronald Crond903a862024-01-15 15:57:17 +01004054
4055 TEST_EQUAL(server_ep.ssl.handshake->resume, 1);
4056 TEST_EQUAL(server_ep.ssl.handshake->new_session_tickets_count, 1);
4057 TEST_EQUAL(server_ep.ssl.handshake->key_exchange_mode,
4058 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL);
4059
4060exit:
4061 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
4062 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
4063 mbedtls_test_free_handshake_options(&client_options);
4064 mbedtls_test_free_handshake_options(&server_options);
4065 mbedtls_ssl_session_free(&saved_session);
Ronald Cron095a3a52024-01-31 14:34:22 +01004066 PSA_DONE();
Ronald Crond903a862024-01-15 15:57:17 +01004067}
4068/* END_CASE */
Ronald Crona8dd81b2024-01-16 17:50:52 +01004069
Ronald Cronae2d81c2024-01-22 09:13:41 +01004070/*
Ronald Cron86d288c2024-02-22 11:28:29 +01004071 * The !MBEDTLS_SSL_PROTO_TLS1_2 dependency of tls13_read_early_data() below is
Ronald Cronae2d81c2024-01-22 09:13:41 +01004072 * a temporary workaround to not run the test in Windows-2013 where there is
4073 * an issue with mbedtls_vsnprintf().
4074 */
4075/* 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 +01004076void tls13_read_early_data(int scenario)
Ronald Crona8dd81b2024-01-16 17:50:52 +01004077{
4078 int ret = -1;
4079 unsigned char buf[64];
4080 const char *early_data = "This is early data.";
4081 size_t early_data_len = strlen(early_data);
4082 mbedtls_test_ssl_endpoint client_ep, server_ep;
4083 mbedtls_test_handshake_test_options client_options;
4084 mbedtls_test_handshake_test_options server_options;
4085 mbedtls_ssl_session saved_session;
Ronald Cron2995d352024-01-18 16:59:39 +01004086 mbedtls_test_ssl_log_pattern server_pattern = { NULL, 0 };
Jerry Yuf57d14b2023-11-15 16:40:09 +08004087 uint16_t group_list[3] = {
4088 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
4089 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
4090 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
4091 };
Ronald Cron2995d352024-01-18 16:59:39 +01004092
Ronald Crona8dd81b2024-01-16 17:50:52 +01004093 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
4094 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
4095 mbedtls_test_init_handshake_options(&client_options);
4096 mbedtls_test_init_handshake_options(&server_options);
4097 mbedtls_ssl_session_init(&saved_session);
4098
Ronald Cron095a3a52024-01-31 14:34:22 +01004099 PSA_INIT();
Ronald Crona8dd81b2024-01-16 17:50:52 +01004100
Ronald Cronbfcdc062024-01-26 16:57:25 +01004101 /*
4102 * Run first handshake to get a ticket from the server.
4103 */
4104
Ronald Crona8dd81b2024-01-16 17:50:52 +01004105 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cronfb536472024-01-26 14:55:25 +01004106 client_options.group_list = group_list;
Ronald Cronced99be2024-01-26 15:49:12 +01004107 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
Ronald Cronbfcdc062024-01-26 16:57:25 +01004108 server_options.pk_alg = MBEDTLS_PK_ECDSA;
4109 server_options.group_list = group_list;
4110 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
4111
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00004112#if defined(MBEDTLS_SSL_ALPN)
4113 switch (scenario) {
4114 case TEST_EARLY_DATA_SAME_ALPN:
4115 case TEST_EARLY_DATA_DIFF_ALPN:
4116 case TEST_EARLY_DATA_NO_LATER_ALPN:
4117 client_options.alpn_list[0] = "ALPNExample";
4118 client_options.alpn_list[1] = NULL;
4119 server_options.alpn_list[0] = "ALPNExample";
4120 server_options.alpn_list[1] = NULL;
4121 break;
4122 }
4123#endif
4124
Ronald Cronbfcdc062024-01-26 16:57:25 +01004125 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
4126 &saved_session);
4127 TEST_EQUAL(ret, 0);
4128
4129 /*
4130 * Prepare for handshake with the ticket.
4131 */
4132 switch (scenario) {
Ronald Cron5c208d72024-01-24 10:13:30 +01004133 case TEST_EARLY_DATA_ACCEPTED:
Ronald Cronbfcdc062024-01-26 16:57:25 +01004134 break;
4135
Ronald Cron110303f2024-02-22 11:35:21 +01004136 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4137 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4138 break;
4139
Ronald Crond6dba672024-01-24 12:22:24 +01004140 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cronbfcdc062024-01-26 16:57:25 +01004141 mbedtls_debug_set_threshold(3);
4142 server_pattern.pattern =
4143 "EarlyData: deprotect and discard app data records.";
4144 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4145 break;
4146
Ronald Cron2261ab22024-01-24 13:38:31 +01004147 case TEST_EARLY_DATA_HRR:
Ronald Cronbfcdc062024-01-26 16:57:25 +01004148 mbedtls_debug_set_threshold(3);
4149 server_pattern.pattern =
4150 "EarlyData: Ignore application message before 2nd ClientHello";
4151 server_options.group_list = group_list + 1;
4152 break;
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00004153#if defined(MBEDTLS_SSL_ALPN)
4154 case TEST_EARLY_DATA_SAME_ALPN:
4155 client_options.alpn_list[0] = "ALPNExample";
4156 client_options.alpn_list[1] = NULL;
4157 server_options.alpn_list[0] = "ALPNExample";
4158 server_options.alpn_list[1] = NULL;
4159 break;
4160 case TEST_EARLY_DATA_DIFF_ALPN:
4161 case TEST_EARLY_DATA_NO_INITIAL_ALPN:
4162 client_options.alpn_list[0] = "ALPNExample2";
4163 client_options.alpn_list[1] = NULL;
4164 server_options.alpn_list[0] = "ALPNExample2";
4165 server_options.alpn_list[1] = NULL;
4166 mbedtls_debug_set_threshold(3);
4167 server_pattern.pattern =
4168 "EarlyData: rejected, the selected ALPN is different "
4169 "from the one associated with the pre-shared key.";
4170 break;
4171 case TEST_EARLY_DATA_NO_LATER_ALPN:
4172 client_options.alpn_list[0] = NULL;
4173 server_options.alpn_list[0] = NULL;
4174 mbedtls_debug_set_threshold(3);
4175 server_pattern.pattern =
4176 "EarlyData: rejected, the selected ALPN is different "
4177 "from the one associated with the pre-shared key.";
4178 break;
4179#endif
Ronald Cronbfcdc062024-01-26 16:57:25 +01004180
4181 default:
4182 TEST_FAIL("Unknown scenario.");
4183 }
4184
Ronald Crona8dd81b2024-01-16 17:50:52 +01004185 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
Ronald Cronfb536472024-01-26 14:55:25 +01004186 &client_options, NULL, NULL, NULL);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004187 TEST_EQUAL(ret, 0);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004188
Ronald Cron2995d352024-01-18 16:59:39 +01004189 server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
4190 server_options.srv_log_obj = &server_pattern;
Ronald Crona8dd81b2024-01-16 17:50:52 +01004191 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
Ronald Cronfb536472024-01-26 14:55:25 +01004192 &server_options, NULL, NULL, NULL);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004193 TEST_EQUAL(ret, 0);
Ronald Cronfb536472024-01-26 14:55:25 +01004194
Ronald Crona8dd81b2024-01-16 17:50:52 +01004195 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4196 mbedtls_test_ticket_write,
4197 mbedtls_test_ticket_parse,
4198 NULL);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004199
4200 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4201 &(server_ep.socket), 1024);
4202 TEST_EQUAL(ret, 0);
4203
Ronald Crona8dd81b2024-01-16 17:50:52 +01004204 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4205 TEST_EQUAL(ret, 0);
4206
Ronald Cronbfcdc062024-01-26 16:57:25 +01004207 /*
4208 * Handshake with ticket and send early data.
4209 */
Ronald Croneb845342024-01-31 14:48:23 +01004210 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4211 &(client_ep.ssl), &(server_ep.ssl),
4212 MBEDTLS_SSL_SERVER_HELLO), 0);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004213
Ronald Cron7d158f42024-02-22 11:39:39 +01004214 ret = mbedtls_ssl_write_early_data(&(client_ep.ssl),
4215 (unsigned char *) early_data,
4216 early_data_len);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004217
Ronald Crond2884662024-03-03 15:03:22 +01004218 if (client_ep.ssl.early_data_state !=
Ronald Cron3c5a6832024-03-03 15:46:57 +01004219 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT) {
Ronald Cron110303f2024-02-22 11:35:21 +01004220 TEST_EQUAL(ret, early_data_len);
Ronald Cron7d158f42024-02-22 11:39:39 +01004221 } else {
4222 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
Ronald Cron110303f2024-02-22 11:35:21 +01004223 }
Ronald Crona8dd81b2024-01-16 17:50:52 +01004224
Ronald Cron2995d352024-01-18 16:59:39 +01004225 ret = mbedtls_test_move_handshake_to_state(
4226 &(server_ep.ssl), &(client_ep.ssl),
4227 MBEDTLS_SSL_HANDSHAKE_WRAPUP);
Ronald Crona8dd81b2024-01-16 17:50:52 +01004228
Ronald Cron2995d352024-01-18 16:59:39 +01004229 switch (scenario) {
Ronald Cron5c208d72024-01-24 10:13:30 +01004230 case TEST_EARLY_DATA_ACCEPTED:
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00004231#if defined(MBEDTLS_SSL_ALPN)
4232 case TEST_EARLY_DATA_SAME_ALPN:
4233#endif
Ronald Cron2995d352024-01-18 16:59:39 +01004234 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
4235 TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 1);
4236 TEST_EQUAL(mbedtls_ssl_read_early_data(&(server_ep.ssl),
4237 buf, sizeof(buf)), early_data_len);
4238 TEST_MEMORY_COMPARE(buf, early_data_len, early_data, early_data_len);
Ronald Cron2995d352024-01-18 16:59:39 +01004239 break;
4240
Ronald Cron110303f2024-02-22 11:35:21 +01004241 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4242 TEST_EQUAL(ret, 0);
4243 TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 0);
4244 break;
4245
Ronald Crond6dba672024-01-24 12:22:24 +01004246 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
Ronald Cron2261ab22024-01-24 13:38:31 +01004247 case TEST_EARLY_DATA_HRR:
Waleed Elmelegy4dfb0e72024-03-14 01:48:40 +00004248#if defined(MBEDTLS_SSL_ALPN)
4249 case TEST_EARLY_DATA_DIFF_ALPN:
4250 case TEST_EARLY_DATA_NO_INITIAL_ALPN:
4251 case TEST_EARLY_DATA_NO_LATER_ALPN:
4252#endif
Ronald Cron2995d352024-01-18 16:59:39 +01004253 TEST_EQUAL(ret, 0);
4254 TEST_EQUAL(server_ep.ssl.handshake->early_data_accepted, 0);
4255 TEST_EQUAL(server_pattern.counter, 1);
4256 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004257
4258 default:
4259 TEST_FAIL("Unknown scenario.");
Ronald Cron2995d352024-01-18 16:59:39 +01004260 }
Ronald Crona8dd81b2024-01-16 17:50:52 +01004261
Ronald Crond0a77272024-02-05 17:57:05 +01004262 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4263 &(server_ep.ssl), &(client_ep.ssl),
4264 MBEDTLS_SSL_HANDSHAKE_OVER), 0);
4265
Ronald Crona8dd81b2024-01-16 17:50:52 +01004266exit:
4267 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
4268 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
4269 mbedtls_test_free_handshake_options(&client_options);
4270 mbedtls_test_free_handshake_options(&server_options);
4271 mbedtls_ssl_session_free(&saved_session);
Ronald Cron2995d352024-01-18 16:59:39 +01004272 mbedtls_debug_set_threshold(0);
Ronald Cron095a3a52024-01-31 14:34:22 +01004273 PSA_DONE();
Ronald Crona8dd81b2024-01-16 17:50:52 +01004274}
4275/* END_CASE */
Ronald Crona7f94e42024-01-24 09:40:46 +01004276
4277/* 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 +01004278void tls13_cli_early_data_state(int scenario)
Ronald Crona7f94e42024-01-24 09:40:46 +01004279{
4280 int ret = -1;
4281 mbedtls_test_ssl_endpoint client_ep, server_ep;
4282 mbedtls_test_handshake_test_options client_options;
4283 mbedtls_test_handshake_test_options server_options;
4284 mbedtls_ssl_session saved_session;
Ronald Cron2261ab22024-01-24 13:38:31 +01004285 uint16_t group_list[3] = {
4286 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
4287 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
4288 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
4289 };
BensonLiou41bed382024-02-16 16:07:53 +08004290 uint8_t client_random[MBEDTLS_CLIENT_HELLO_RANDOM_LEN];
Ronald Crona7f94e42024-01-24 09:40:46 +01004291
4292 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
4293 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
4294 mbedtls_test_init_handshake_options(&client_options);
4295 mbedtls_test_init_handshake_options(&server_options);
4296 mbedtls_ssl_session_init(&saved_session);
4297
4298 PSA_INIT();
4299
4300 /*
4301 * Run first handshake to get a ticket from the server.
4302 */
4303 client_options.pk_alg = MBEDTLS_PK_ECDSA;
4304 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
4305 server_options.pk_alg = MBEDTLS_PK_ECDSA;
4306 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
Ronald Cron2261ab22024-01-24 13:38:31 +01004307 if (scenario == TEST_EARLY_DATA_HRR) {
4308 client_options.group_list = group_list;
4309 server_options.group_list = group_list;
4310 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004311
4312 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
4313 &saved_session);
4314 TEST_EQUAL(ret, 0);
4315
4316 /*
4317 * Prepare for handshake with the ticket.
4318 */
Ronald Cron5c208d72024-01-24 10:13:30 +01004319 switch (scenario) {
4320 case TEST_EARLY_DATA_ACCEPTED:
4321 break;
4322
Ronald Cron265273e2024-01-24 11:13:19 +01004323 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4324 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4325 break;
4326
Ronald Crond6dba672024-01-24 12:22:24 +01004327 case TEST_EARLY_DATA_SERVER_REJECTS:
4328 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4329 break;
4330
Ronald Cron2261ab22024-01-24 13:38:31 +01004331 case TEST_EARLY_DATA_HRR:
4332 server_options.group_list = group_list + 1;
4333 break;
4334
Ronald Cron5c208d72024-01-24 10:13:30 +01004335 default:
4336 TEST_FAIL("Unknown scenario.");
4337 }
4338
Ronald Crona7f94e42024-01-24 09:40:46 +01004339 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
4340 &client_options, NULL, NULL, NULL);
4341 TEST_EQUAL(ret, 0);
4342
4343 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
4344 &server_options, NULL, NULL, NULL);
4345 TEST_EQUAL(ret, 0);
4346
4347 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4348 mbedtls_test_ticket_write,
4349 mbedtls_test_ticket_parse,
4350 NULL);
4351
4352 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4353 &(server_ep.socket), 1024);
4354 TEST_EQUAL(ret, 0);
4355
4356 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4357 TEST_EQUAL(ret, 0);
4358
4359 /*
4360 * Go through the handshake sequence, state by state, checking the early
4361 * data status each time.
4362 */
4363 do {
4364 int state = client_ep.ssl.state;
4365
4366 /* Progress the handshake from at least one state */
4367 while (client_ep.ssl.state == state) {
4368 ret = mbedtls_ssl_handshake_step(&(client_ep.ssl));
4369 TEST_ASSERT((ret == 0) ||
4370 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4371 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4372 if (client_ep.ssl.state != state) {
4373 break;
4374 }
4375 ret = mbedtls_ssl_handshake_step(&(server_ep.ssl));
4376 TEST_ASSERT((ret == 0) ||
4377 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4378 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4379 }
4380
Ronald Cron9f2c3c02024-02-21 17:03:22 +01004381 if (client_ep.ssl.state != MBEDTLS_SSL_HANDSHAKE_OVER) {
4382 TEST_EQUAL(mbedtls_ssl_get_early_data_status(&(client_ep.ssl)),
4383 MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
4384 }
4385
Ronald Crona7f94e42024-01-24 09:40:46 +01004386 switch (client_ep.ssl.state) {
4387 case MBEDTLS_SSL_CLIENT_HELLO:
Ronald Cron5c208d72024-01-24 10:13:30 +01004388 switch (scenario) {
Ronald Cron265273e2024-01-24 11:13:19 +01004389 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Crond6dba672024-01-24 12:22:24 +01004390 case TEST_EARLY_DATA_NO_INDICATION_SENT: /* Intentional fallthrough */
4391 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Crond2884662024-03-03 15:03:22 +01004392 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron05d7cfb2024-03-03 15:39:30 +01004393 MBEDTLS_SSL_EARLY_DATA_STATE_IDLE);
Ronald Cron5c208d72024-01-24 10:13:30 +01004394 break;
Ronald Cron2261ab22024-01-24 13:38:31 +01004395
4396 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004397 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Crond2884662024-03-03 15:03:22 +01004398 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron05d7cfb2024-03-03 15:39:30 +01004399 MBEDTLS_SSL_EARLY_DATA_STATE_IDLE);
Ronald Cron2261ab22024-01-24 13:38:31 +01004400 } else {
Ronald Crond2884662024-03-03 15:03:22 +01004401 TEST_EQUAL(client_ep.ssl.early_data_state,
4402 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Cron2261ab22024-01-24 13:38:31 +01004403 }
4404 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004405
4406 default:
4407 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004408 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004409 break;
4410
4411 case MBEDTLS_SSL_SERVER_HELLO:
Ronald Cron5c208d72024-01-24 10:13:30 +01004412 switch (scenario) {
Ronald Crond6dba672024-01-24 12:22:24 +01004413 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4414 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Crond2884662024-03-03 15:03:22 +01004415 TEST_EQUAL(client_ep.ssl.early_data_state,
4416 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
Ronald Cron5c208d72024-01-24 10:13:30 +01004417 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004418
4419 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004420 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004421 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004422 break;
Ronald Cron2261ab22024-01-24 13:38:31 +01004423
4424 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004425 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Crond2884662024-03-03 15:03:22 +01004426 TEST_EQUAL(client_ep.ssl.early_data_state,
4427 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
BensonLioubedd2512024-03-13 20:21:26 +08004428 memcpy(client_random,
4429 client_ep.ssl.handshake->randbytes,
4430 MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
Ronald Cron2261ab22024-01-24 13:38:31 +01004431 } else {
Ronald Crond2884662024-03-03 15:03:22 +01004432 TEST_EQUAL(client_ep.ssl.early_data_state,
4433 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
BensonLioubedd2512024-03-13 20:21:26 +08004434 TEST_MEMORY_COMPARE(client_random,
4435 MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
4436 client_ep.ssl.handshake->randbytes,
4437 MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
Ronald Cron2261ab22024-01-24 13:38:31 +01004438 }
4439 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004440
4441 default:
4442 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004443 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004444 break;
4445
4446 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Ronald Cron5c208d72024-01-24 10:13:30 +01004447 switch (scenario) {
Ronald Crond6dba672024-01-24 12:22:24 +01004448 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4449 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Crond2884662024-03-03 15:03:22 +01004450 TEST_EQUAL(client_ep.ssl.early_data_state,
4451 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
Ronald Cron5c208d72024-01-24 10:13:30 +01004452 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004453
4454 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004455 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004456 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004457 break;
Ronald Cron2261ab22024-01-24 13:38:31 +01004458
4459 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004460 TEST_EQUAL(client_ep.ssl.early_data_state,
4461 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Cron2261ab22024-01-24 13:38:31 +01004462 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004463
4464 default:
4465 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004466 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004467 break;
4468
4469 case MBEDTLS_SSL_SERVER_FINISHED:
Ronald Cron5c208d72024-01-24 10:13:30 +01004470 switch (scenario) {
4471 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004472 TEST_EQUAL(client_ep.ssl.early_data_state,
4473 MBEDTLS_SSL_EARLY_DATA_STATE_ACCEPTED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004474 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004475
4476 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004477 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004478 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004479 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004480
Ronald Cron2261ab22024-01-24 13:38:31 +01004481 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4482 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004483 TEST_EQUAL(client_ep.ssl.early_data_state,
4484 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004485 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004486
4487 default:
4488 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004489 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004490 break;
4491
4492 case MBEDTLS_SSL_END_OF_EARLY_DATA:
Ronald Cron265273e2024-01-24 11:13:19 +01004493 TEST_EQUAL(scenario, TEST_EARLY_DATA_ACCEPTED);
Ronald Crond2884662024-03-03 15:03:22 +01004494 TEST_EQUAL(client_ep.ssl.early_data_state,
4495 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Crona7f94e42024-01-24 09:40:46 +01004496 break;
4497
4498 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Ronald Cron5c208d72024-01-24 10:13:30 +01004499 switch (scenario) {
4500 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004501 TEST_EQUAL(client_ep.ssl.early_data_state,
4502 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004503 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004504
4505 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004506 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004507 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004508 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004509
Ronald Cron2261ab22024-01-24 13:38:31 +01004510 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4511 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004512 TEST_EQUAL(client_ep.ssl.early_data_state,
4513 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004514 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004515
4516 default:
4517 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004518 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004519 break;
4520
4521 case MBEDTLS_SSL_CLIENT_FINISHED:
Ronald Cron5c208d72024-01-24 10:13:30 +01004522 switch (scenario) {
4523 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004524 TEST_EQUAL(client_ep.ssl.early_data_state,
4525 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004526 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004527
4528 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004529 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004530 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004531 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004532
Ronald Cron2261ab22024-01-24 13:38:31 +01004533 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4534 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004535 TEST_EQUAL(client_ep.ssl.early_data_state,
4536 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004537 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004538
4539 default:
4540 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004541 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004542 break;
4543
4544#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
4545 case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO:
Ronald Cron5c208d72024-01-24 10:13:30 +01004546 switch (scenario) {
Ronald Crond6dba672024-01-24 12:22:24 +01004547 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Cron2261ab22024-01-24 13:38:31 +01004548 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4549 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004550 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3641df22024-03-03 16:10:58 +01004551 MBEDTLS_SSL_EARLY_DATA_STATE_IND_SENT);
Ronald Cron5c208d72024-01-24 10:13:30 +01004552 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004553
4554 default:
4555 TEST_FAIL("Unexpected or unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004556 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004557 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004558
Ronald Cron2261ab22024-01-24 13:38:31 +01004559 case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO:
4560 TEST_ASSERT(scenario == TEST_EARLY_DATA_HRR);
Ronald Crond2884662024-03-03 15:03:22 +01004561 TEST_EQUAL(client_ep.ssl.early_data_state,
4562 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Cron2261ab22024-01-24 13:38:31 +01004563 break;
4564
Ronald Cron265273e2024-01-24 11:13:19 +01004565 case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED:
Ronald Crond6dba672024-01-24 12:22:24 +01004566 switch (scenario) {
4567 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004568 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004569 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Crond6dba672024-01-24 12:22:24 +01004570 break;
4571
Ronald Cron2261ab22024-01-24 13:38:31 +01004572 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4573 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004574 TEST_EQUAL(client_ep.ssl.early_data_state,
4575 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004576 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004577
4578 default:
4579 TEST_FAIL("Unexpected or unknown scenario.");
Ronald Crond6dba672024-01-24 12:22:24 +01004580 }
Ronald Cron265273e2024-01-24 11:13:19 +01004581 break;
Ronald Crona7f94e42024-01-24 09:40:46 +01004582#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
4583
4584 case MBEDTLS_SSL_FLUSH_BUFFERS: /* Intentional fallthrough */
4585 case MBEDTLS_SSL_HANDSHAKE_WRAPUP: /* Intentional fallthrough */
4586 case MBEDTLS_SSL_HANDSHAKE_OVER:
Ronald Cron5c208d72024-01-24 10:13:30 +01004587 switch (scenario) {
4588 case TEST_EARLY_DATA_ACCEPTED:
Ronald Crond2884662024-03-03 15:03:22 +01004589 TEST_EQUAL(client_ep.ssl.early_data_state,
4590 MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED);
Ronald Cron5c208d72024-01-24 10:13:30 +01004591 break;
Ronald Cron265273e2024-01-24 11:13:19 +01004592
4593 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Crond2884662024-03-03 15:03:22 +01004594 TEST_EQUAL(client_ep.ssl.early_data_state,
Ronald Cron3c5a6832024-03-03 15:46:57 +01004595 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron265273e2024-01-24 11:13:19 +01004596 break;
Ronald Crond6dba672024-01-24 12:22:24 +01004597
Ronald Cron2261ab22024-01-24 13:38:31 +01004598 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4599 case TEST_EARLY_DATA_HRR:
Ronald Crond2884662024-03-03 15:03:22 +01004600 TEST_EQUAL(client_ep.ssl.early_data_state,
4601 MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED);
Ronald Crond6dba672024-01-24 12:22:24 +01004602 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004603
4604 default:
4605 TEST_FAIL("Unknown scenario.");
Ronald Cron5c208d72024-01-24 10:13:30 +01004606 }
Ronald Crona7f94e42024-01-24 09:40:46 +01004607 break;
4608
4609 default:
4610 TEST_FAIL("Unexpected state.");
4611 }
4612 } while (client_ep.ssl.state != MBEDTLS_SSL_HANDSHAKE_OVER);
4613
Ronald Cron9f2c3c02024-02-21 17:03:22 +01004614 ret = mbedtls_ssl_get_early_data_status(&(client_ep.ssl));
4615 switch (scenario) {
4616 case TEST_EARLY_DATA_ACCEPTED:
4617 TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED);
4618 break;
4619
4620 case TEST_EARLY_DATA_NO_INDICATION_SENT:
Ronald Cron840de7f2024-03-11 17:49:35 +01004621 TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_INDICATED);
Ronald Cron9f2c3c02024-02-21 17:03:22 +01004622 break;
4623
4624 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4625 case TEST_EARLY_DATA_HRR:
4626 TEST_EQUAL(ret, MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED);
4627 break;
4628
4629 default:
4630 TEST_FAIL("Unknown scenario.");
4631 }
4632
Ronald Crondcb09ca2024-02-22 12:12:45 +01004633 ret = mbedtls_ssl_get_early_data_status(&(server_ep.ssl));
4634 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
4635
Ronald Crona7f94e42024-01-24 09:40:46 +01004636#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Ronald Cron5fbd2702024-02-14 10:03:36 +01004637 TEST_EQUAL(client_ep.ssl.handshake->ccs_sent, 1);
Ronald Crona7f94e42024-01-24 09:40:46 +01004638#endif
4639
4640exit:
4641 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
4642 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
4643 mbedtls_test_free_handshake_options(&client_options);
4644 mbedtls_test_free_handshake_options(&server_options);
4645 mbedtls_ssl_session_free(&saved_session);
4646 PSA_DONE();
4647}
4648/* END_CASE */
Ronald Cron2fbbba92024-01-26 20:13:42 +01004649
4650/* 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 */
4651void tls13_write_early_data(int scenario)
4652{
4653 int ret = -1;
4654 mbedtls_test_ssl_endpoint client_ep, server_ep;
4655 mbedtls_test_handshake_test_options client_options;
4656 mbedtls_test_handshake_test_options server_options;
4657 mbedtls_ssl_session saved_session;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004658 uint16_t group_list[3] = {
4659 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
4660 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
4661 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
4662 };
Ronald Cron00046002024-02-21 16:00:12 +01004663 int beyond_first_hello = 0;
Ronald Cron2fbbba92024-01-26 20:13:42 +01004664
4665 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
4666 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
4667 mbedtls_test_init_handshake_options(&client_options);
4668 mbedtls_test_init_handshake_options(&server_options);
4669 mbedtls_ssl_session_init(&saved_session);
4670
4671 PSA_INIT();
4672
4673 /*
4674 * Run first handshake to get a ticket from the server.
4675 */
4676 client_options.pk_alg = MBEDTLS_PK_ECDSA;
4677 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
4678 server_options.pk_alg = MBEDTLS_PK_ECDSA;
4679 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004680 if (scenario == TEST_EARLY_DATA_HRR) {
4681 client_options.group_list = group_list;
4682 server_options.group_list = group_list;
4683 }
Ronald Cron2fbbba92024-01-26 20:13:42 +01004684
4685 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
4686 &saved_session);
4687 TEST_EQUAL(ret, 0);
4688
Ronald Cron2fbbba92024-01-26 20:13:42 +01004689 /*
4690 * Prepare for handshake with the ticket.
4691 */
4692 switch (scenario) {
4693 case TEST_EARLY_DATA_ACCEPTED:
4694 break;
4695
Ronald Cron8fe2b012024-01-26 20:25:00 +01004696 case TEST_EARLY_DATA_NO_INDICATION_SENT:
4697 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4698 break;
4699
Ronald Cron05600e22024-01-26 10:23:31 +01004700 case TEST_EARLY_DATA_SERVER_REJECTS:
4701 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
4702 break;
4703
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004704 case TEST_EARLY_DATA_HRR:
Ronald Cron52472102024-03-08 11:29:28 +01004705 /*
4706 * Remove server support for the group negotiated in
Ronald Crone1295fa2024-03-08 17:03:16 +01004707 * mbedtls_test_get_tls13_ticket() forcing a HelloRetryRequest.
Ronald Cron52472102024-03-08 11:29:28 +01004708 */
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004709 server_options.group_list = group_list + 1;
4710 break;
4711
Ronald Cron2fbbba92024-01-26 20:13:42 +01004712 default:
4713 TEST_FAIL("Unknown scenario.");
4714 }
4715
4716 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
4717 &client_options, NULL, NULL, NULL);
4718 TEST_EQUAL(ret, 0);
4719
4720 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
4721 &server_options, NULL, NULL, NULL);
4722 TEST_EQUAL(ret, 0);
4723
4724 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
4725 mbedtls_test_ticket_write,
4726 mbedtls_test_ticket_parse,
4727 NULL);
4728
4729 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4730 &(server_ep.socket), 1024);
4731 TEST_EQUAL(ret, 0);
4732
4733 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4734 TEST_EQUAL(ret, 0);
4735
4736 /*
Ronald Crond4069242024-02-21 13:45:52 +01004737 * Run handshakes going one state further in the handshake sequence at each
4738 * loop up to the point where we reach the MBEDTLS_SSL_HANDSHAKE_OVER
4739 * state. For each reached handshake state, check the result of the call
Ronald Cronbf5e9092024-02-21 15:31:36 +01004740 * to mbedtls_ssl_write_early_data(), make sure we can complete the
4741 * handshake successfully and then reset the connection to restart the
4742 * handshake from scratch.
Ronald Cron2fbbba92024-01-26 20:13:42 +01004743 */
Ronald Cron00046002024-02-21 16:00:12 +01004744 do {
4745 int client_state = client_ep.ssl.state;
4746 int previous_client_state;
4747 const char *early_data_string = "This is early data.";
4748 const unsigned char *early_data = (const unsigned char *) early_data_string;
4749 size_t early_data_len = strlen(early_data_string);
4750 int write_early_data_ret, read_early_data_ret;
4751 unsigned char read_buf[64];
Ronald Cron2fbbba92024-01-26 20:13:42 +01004752
Ronald Cron2fbbba92024-01-26 20:13:42 +01004753 write_early_data_ret = mbedtls_ssl_write_early_data(&(client_ep.ssl),
4754 early_data,
4755 early_data_len);
4756
Ronald Cron8fe2b012024-01-26 20:25:00 +01004757 if (scenario == TEST_EARLY_DATA_NO_INDICATION_SENT) {
4758 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4759 TEST_EQUAL(client_ep.ssl.state, client_state);
Ronald Cronbf5e9092024-02-21 15:31:36 +01004760 goto complete_handshake;
Ronald Cron8fe2b012024-01-26 20:25:00 +01004761 }
4762
Ronald Cron2fbbba92024-01-26 20:13:42 +01004763 switch (client_state) {
Ronald Cron00046002024-02-21 16:00:12 +01004764 case MBEDTLS_SSL_HELLO_REQUEST: /* Intentional fallthrough */
Ronald Cron2fbbba92024-01-26 20:13:42 +01004765 case MBEDTLS_SSL_CLIENT_HELLO:
4766 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004767 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4768 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004769 TEST_EQUAL(write_early_data_ret, early_data_len);
4770 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4771 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004772
4773 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004774 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004775 TEST_EQUAL(write_early_data_ret, early_data_len);
4776 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4777 } else {
4778 beyond_first_hello = 1;
4779 TEST_EQUAL(write_early_data_ret,
4780 MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4781 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_CLIENT_HELLO);
4782 }
4783 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004784
4785 default:
4786 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004787 }
4788 break;
4789
4790 case MBEDTLS_SSL_SERVER_HELLO:
4791 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004792 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4793 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004794 TEST_EQUAL(write_early_data_ret, early_data_len);
4795 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4796 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004797
4798 case TEST_EARLY_DATA_HRR:
Ronald Cron5fbd2702024-02-14 10:03:36 +01004799 if (!client_ep.ssl.handshake->hello_retry_request_flag) {
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004800 TEST_EQUAL(write_early_data_ret, early_data_len);
4801 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4802 } else {
4803 TEST_EQUAL(write_early_data_ret,
4804 MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4805 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4806 }
4807 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004808
4809 default:
4810 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004811 }
4812 break;
4813
4814 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
4815 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004816 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
4817 case TEST_EARLY_DATA_SERVER_REJECTS:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004818 TEST_EQUAL(write_early_data_ret, early_data_len);
4819 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
4820 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004821
4822 case TEST_EARLY_DATA_HRR:
4823 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4824 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
4825 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004826
4827 default:
4828 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004829 }
4830 break;
4831
4832 case MBEDTLS_SSL_SERVER_FINISHED:
4833 switch (scenario) {
4834 case TEST_EARLY_DATA_ACCEPTED:
4835 TEST_EQUAL(write_early_data_ret, early_data_len);
4836 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED);
4837 break;
Ronald Cron05600e22024-01-26 10:23:31 +01004838
4839 case TEST_EARLY_DATA_SERVER_REJECTS:
4840 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4841 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED);
4842 break;
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004843
4844 case TEST_EARLY_DATA_HRR:
4845 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4846 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_FINISHED);
4847 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004848
4849 default:
4850 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004851 }
4852 break;
4853
4854 case MBEDTLS_SSL_END_OF_EARLY_DATA:
4855 TEST_EQUAL(scenario, TEST_EARLY_DATA_ACCEPTED);
4856 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4857 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_END_OF_EARLY_DATA);
4858 break;
4859
4860#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
4861 case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO:
4862 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004863 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004864 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4865 case TEST_EARLY_DATA_HRR:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004866 TEST_EQUAL(write_early_data_ret, early_data_len);
4867 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_SERVER_HELLO);
4868 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004869 default:
4870 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004871 }
4872 break;
4873
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004874 case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO:
4875 TEST_EQUAL(scenario, TEST_EARLY_DATA_HRR);
4876 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4877 TEST_EQUAL(client_ep.ssl.state, MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO);
4878 break;
4879
Ronald Cron05600e22024-01-26 10:23:31 +01004880 case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED:
Ronald Cron05600e22024-01-26 10:23:31 +01004881 switch (scenario) {
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004882 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4883 case TEST_EARLY_DATA_HRR:
4884 TEST_EQUAL(write_early_data_ret,
4885 MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4886 TEST_EQUAL(client_ep.ssl.state,
4887 MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED);
Ronald Cron05600e22024-01-26 10:23:31 +01004888 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004889 default:
4890 TEST_FAIL("Unexpected or unknown scenario.");
Ronald Cron05600e22024-01-26 10:23:31 +01004891 }
4892 break;
Ronald Cron2fbbba92024-01-26 20:13:42 +01004893#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
4894
4895 case MBEDTLS_SSL_CLIENT_CERTIFICATE: /* Intentional fallthrough */
4896 case MBEDTLS_SSL_CLIENT_FINISHED: /* Intentional fallthrough */
4897 case MBEDTLS_SSL_FLUSH_BUFFERS: /* Intentional fallthrough */
4898 case MBEDTLS_SSL_HANDSHAKE_WRAPUP: /* Intentional fallthrough */
4899 case MBEDTLS_SSL_HANDSHAKE_OVER:
4900 switch (scenario) {
Ronald Cron05600e22024-01-26 10:23:31 +01004901 case TEST_EARLY_DATA_ACCEPTED: /* Intentional fallthrough */
Ronald Cronb3d42fd2024-01-26 11:54:06 +01004902 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
4903 case TEST_EARLY_DATA_HRR:
Ronald Cron2fbbba92024-01-26 20:13:42 +01004904 TEST_EQUAL(write_early_data_ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
4905 TEST_EQUAL(client_ep.ssl.state, client_state);
4906 break;
Ronald Cron24da9912024-02-15 16:13:44 +01004907 default:
4908 TEST_FAIL("Unknown scenario.");
Ronald Cron2fbbba92024-01-26 20:13:42 +01004909 }
4910 break;
4911
4912 default:
4913 TEST_FAIL("Unexpected state.");
4914 }
4915
Ronald Cronbf5e9092024-02-21 15:31:36 +01004916complete_handshake:
4917 do {
4918 ret = mbedtls_test_move_handshake_to_state(
4919 &(server_ep.ssl), &(client_ep.ssl),
4920 MBEDTLS_SSL_HANDSHAKE_OVER);
4921
4922 if (ret == MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA) {
4923 read_early_data_ret = mbedtls_ssl_read_early_data(
4924 &(server_ep.ssl), read_buf, sizeof(read_buf));
4925
4926 TEST_EQUAL(read_early_data_ret, early_data_len);
4927 }
4928 } while (ret == MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
4929
4930 TEST_EQUAL(ret, 0);
4931 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4932 &(client_ep.ssl), &(server_ep.ssl),
4933 MBEDTLS_SSL_HANDSHAKE_OVER), 0);
4934
Ronald Cron2fbbba92024-01-26 20:13:42 +01004935 mbedtls_test_mock_socket_close(&(client_ep.socket));
4936 mbedtls_test_mock_socket_close(&(server_ep.socket));
4937
4938 ret = mbedtls_ssl_session_reset(&(client_ep.ssl));
4939 TEST_EQUAL(ret, 0);
4940
4941 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
4942 TEST_EQUAL(ret, 0);
4943
4944 ret = mbedtls_ssl_session_reset(&(server_ep.ssl));
4945 TEST_EQUAL(ret, 0);
4946
4947 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
4948 &(server_ep.socket), 1024);
4949 TEST_EQUAL(ret, 0);
4950
4951 previous_client_state = client_state;
Ronald Cron00046002024-02-21 16:00:12 +01004952 if (previous_client_state == MBEDTLS_SSL_HANDSHAKE_OVER) {
4953 break;
4954 }
4955
4956 /* In case of HRR scenario, once we have been through it, move over
4957 * the first ClientHello and ServerHello otherwise we just keep playing
4958 * this first part of the handshake with HRR.
4959 */
4960 if ((scenario == TEST_EARLY_DATA_HRR) && (beyond_first_hello)) {
4961 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
4962 &(client_ep.ssl), &(server_ep.ssl),
4963 MBEDTLS_SSL_SERVER_HELLO) == 0);
4964 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
4965 &(client_ep.ssl), &(server_ep.ssl),
4966 MBEDTLS_SSL_CLIENT_HELLO) == 0);
4967 }
4968
4969 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
4970 &(client_ep.ssl), &(server_ep.ssl),
4971 previous_client_state), 0);
4972
4973 /* Progress the handshake from at least one state */
4974 while (client_ep.ssl.state == previous_client_state) {
4975 ret = mbedtls_ssl_handshake_step(&(client_ep.ssl));
4976 TEST_ASSERT((ret == 0) ||
4977 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4978 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4979 if (client_ep.ssl.state != previous_client_state) {
4980 break;
4981 }
4982 ret = mbedtls_ssl_handshake_step(&(server_ep.ssl));
4983 TEST_ASSERT((ret == 0) ||
4984 (ret == MBEDTLS_ERR_SSL_WANT_READ) ||
4985 (ret == MBEDTLS_ERR_SSL_WANT_WRITE));
4986 }
4987 } while (1);
Ronald Cron2fbbba92024-01-26 20:13:42 +01004988
4989exit:
4990 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
4991 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
4992 mbedtls_test_free_handshake_options(&client_options);
4993 mbedtls_test_free_handshake_options(&server_options);
4994 mbedtls_ssl_session_free(&saved_session);
4995 PSA_DONE();
4996}
4997/* END_CASE */
Ronald Cronaad85232024-02-07 08:04:07 +01004998
4999/* 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 */
5000void tls13_cli_max_early_data_size(int max_early_data_size_arg)
5001{
5002 int ret = -1;
5003 mbedtls_test_ssl_endpoint client_ep, server_ep;
5004 mbedtls_test_handshake_test_options client_options;
5005 mbedtls_test_handshake_test_options server_options;
5006 mbedtls_ssl_session saved_session;
Ronald Cronae6f9a52024-03-01 16:05:59 +01005007 unsigned char *buf = NULL;
5008 uint32_t buf_size = 64;
Ronald Cronaad85232024-02-07 08:04:07 +01005009 uint32_t max_early_data_size;
5010 uint32_t written_early_data_size = 0;
5011 uint32_t read_early_data_size = 0;
5012
5013 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
5014 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
5015 mbedtls_test_init_handshake_options(&client_options);
5016 mbedtls_test_init_handshake_options(&server_options);
5017 mbedtls_ssl_session_init(&saved_session);
5018
5019 PSA_INIT();
Ronald Cronae6f9a52024-03-01 16:05:59 +01005020 TEST_CALLOC(buf, buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01005021
5022 /*
5023 * Run first handshake to get a ticket from the server.
5024 */
5025
5026 client_options.pk_alg = MBEDTLS_PK_ECDSA;
5027 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
5028 server_options.pk_alg = MBEDTLS_PK_ECDSA;
5029 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
5030 server_options.max_early_data_size = max_early_data_size_arg;
5031
5032 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
5033 &saved_session);
5034 TEST_EQUAL(ret, 0);
5035
5036 /*
5037 * Prepare for handshake with the ticket.
5038 */
5039 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
5040 &client_options, NULL, NULL, NULL);
5041 TEST_EQUAL(ret, 0);
5042
5043 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
5044 &server_options, NULL, NULL, NULL);
5045 TEST_EQUAL(ret, 0);
5046
5047 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
5048 mbedtls_test_ticket_write,
5049 mbedtls_test_ticket_parse,
5050 NULL);
5051
5052 max_early_data_size = saved_session.max_early_data_size;
5053 /*
5054 * (max_early_data_size + 1024) for the size of the socket buffers for the
5055 * server one to be able to contain the maximum number of early data bytes
Ronald Cron7c07aab2024-03-01 16:01:27 +01005056 * plus the first flight of client messages. Needed because we cannot
5057 * initiate the handshake on server side before doing all the calls to
Ronald Cronaad85232024-02-07 08:04:07 +01005058 * mbedtls_ssl_write_early_data() we want to test. See below for more
5059 * information.
5060 */
5061 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
5062 &(server_ep.socket),
5063 max_early_data_size + 1024);
5064 TEST_EQUAL(ret, 0);
5065
5066 /* If our server is configured with max_early_data_size equal to zero, it
5067 * does not set the MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA flag for
5068 * the tickets it creates. To be able to test early data with a ticket
5069 * allowing early data in its flags but with max_early_data_size equal to
5070 * zero (case supported by our client) tweak the ticket flags here.
5071 */
5072 if (max_early_data_size == 0) {
5073 saved_session.ticket_flags |= MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA;
5074 }
5075
5076 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
5077 TEST_EQUAL(ret, 0);
5078
5079 while (written_early_data_size < max_early_data_size) {
Ronald Cronaad85232024-02-07 08:04:07 +01005080 uint32_t remaining = max_early_data_size - written_early_data_size;
5081
Ronald Cronae6f9a52024-03-01 16:05:59 +01005082 for (size_t i = 0; i < buf_size; i++) {
Ronald Cronaad85232024-02-07 08:04:07 +01005083 buf[i] = (unsigned char) (written_early_data_size + i);
5084 }
5085
5086 ret = mbedtls_ssl_write_early_data(&(client_ep.ssl),
5087 buf,
Ronald Cronae6f9a52024-03-01 16:05:59 +01005088 buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01005089
Ronald Cronae6f9a52024-03-01 16:05:59 +01005090 if (buf_size <= remaining) {
5091 TEST_EQUAL(ret, buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01005092 } else {
5093 TEST_EQUAL(ret, remaining);
5094 }
Ronald Cronae6f9a52024-03-01 16:05:59 +01005095 written_early_data_size += buf_size;
Ronald Cronaad85232024-02-07 08:04:07 +01005096 }
Ronald Cron7c07aab2024-03-01 16:01:27 +01005097 TEST_EQUAL(client_ep.ssl.total_early_data_size, max_early_data_size);
Ronald Cronaad85232024-02-07 08:04:07 +01005098
Ronald Cronaad85232024-02-07 08:04:07 +01005099 ret = mbedtls_ssl_write_early_data(&(client_ep.ssl), buf, 1);
5100 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA);
Ronald Cronde9b03d2024-03-01 15:14:17 +01005101 TEST_EQUAL(client_ep.ssl.total_early_data_size, max_early_data_size);
Ronald Crond2884662024-03-03 15:03:22 +01005102 TEST_EQUAL(client_ep.ssl.early_data_state,
5103 MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE);
Ronald Cronaad85232024-02-07 08:04:07 +01005104
5105 /*
5106 * Now, check data on server side. It is not done in the previous loop as
5107 * in the first call to mbedtls_ssl_handshake(), the server ends up sending
5108 * its Finished message and then in the following call to
5109 * mbedtls_ssl_write_early_data() we go past the early data writing window
5110 * and we cannot test multiple calls to the API is this writing window.
5111 */
5112 while (read_early_data_size < max_early_data_size) {
5113 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5114 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
5115
5116 ret = mbedtls_ssl_read_early_data(&(server_ep.ssl),
5117 buf,
Ronald Cronae6f9a52024-03-01 16:05:59 +01005118 buf_size);
Ronald Cronaad85232024-02-07 08:04:07 +01005119 TEST_ASSERT(ret > 0);
5120
5121 for (size_t i = 0; i < (size_t) ret; i++) {
5122 TEST_EQUAL(buf[i], (unsigned char) (read_early_data_size + i));
5123 }
5124
5125 read_early_data_size += ret;
5126 }
5127 TEST_EQUAL(read_early_data_size, max_early_data_size);
5128
5129 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5130 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
5131
Ronald Cron7c07aab2024-03-01 16:01:27 +01005132 TEST_ASSERT(mbedtls_test_move_handshake_to_state(
5133 &(client_ep.ssl), &(server_ep.ssl), MBEDTLS_SSL_HANDSHAKE_OVER)
5134 == 0);
Ronald Cronaad85232024-02-07 08:04:07 +01005135
5136exit:
5137 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
5138 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
5139 mbedtls_test_free_handshake_options(&client_options);
5140 mbedtls_test_free_handshake_options(&server_options);
5141 mbedtls_ssl_session_free(&saved_session);
Ronald Cronae6f9a52024-03-01 16:05:59 +01005142 mbedtls_free(buf);
Ronald Cronaad85232024-02-07 08:04:07 +01005143 PSA_DONE();
5144}
5145/* END_CASE */
Ronald Cron61fd13c2024-03-10 18:09:47 +01005146
Ronald Cron2160bfe2024-02-07 08:04:07 +01005147/*
5148 * The !MBEDTLS_SSL_PROTO_TLS1_2 dependency of tls13_early_data() below is
5149 * a temporary workaround to not run the test in Windows-2013 where there is
5150 * an issue with mbedtls_vsnprintf().
5151 */
5152/* 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 +01005153void 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 +01005154{
5155 int ret = -1;
5156 mbedtls_test_ssl_endpoint client_ep, server_ep;
5157 mbedtls_test_handshake_test_options client_options;
5158 mbedtls_test_handshake_test_options server_options;
5159 mbedtls_ssl_session saved_session;
5160 mbedtls_test_ssl_log_pattern server_pattern = { NULL, 0 };
Ronald Cron01d273d2024-02-09 16:17:10 +01005161 uint16_t group_list[3] = {
5162 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5163 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
5164 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
5165 };
Ronald Cron2160bfe2024-02-07 08:04:07 +01005166 char pattern[128];
Ronald Cron25ad10a2024-02-29 00:39:23 +01005167 unsigned char *buf_write = NULL;
5168 uint32_t write_size = (uint32_t) write_size_arg;
5169 unsigned char *buf_read = NULL;
5170 uint32_t read_size;
Ronald Cron4facb0a2024-03-08 11:40:07 +01005171 uint32_t expanded_early_data_chunk_size = 0;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005172 uint32_t written_early_data_size = 0;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005173 uint32_t max_early_data_size;
5174
5175 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
5176 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
5177 mbedtls_test_init_handshake_options(&client_options);
5178 mbedtls_test_init_handshake_options(&server_options);
5179 mbedtls_ssl_session_init(&saved_session);
Ronald Crone93cd1b2024-03-01 19:30:00 +01005180 PSA_INIT();
5181
Ronald Cron25ad10a2024-02-29 00:39:23 +01005182 TEST_CALLOC(buf_write, write_size);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005183
5184 /*
Ronald Cron25ad10a2024-02-29 00:39:23 +01005185 * Allocate a smaller buffer for early data reading to exercise the reading
5186 * of data in one record in multiple calls.
Ronald Crondc81b732024-02-26 15:02:26 +01005187 */
Ronald Cron25ad10a2024-02-29 00:39:23 +01005188 read_size = (write_size / 2) + 1;
5189 TEST_CALLOC(buf_read, read_size);
5190
Ronald Crondc81b732024-02-26 15:02:26 +01005191 /*
Ronald Cron2160bfe2024-02-07 08:04:07 +01005192 * Run first handshake to get a ticket from the server.
5193 */
5194
5195 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cron01d273d2024-02-09 16:17:10 +01005196 client_options.group_list = group_list;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005197 client_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
5198 server_options.pk_alg = MBEDTLS_PK_ECDSA;
Ronald Cron01d273d2024-02-09 16:17:10 +01005199 server_options.group_list = group_list;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005200 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
5201 server_options.max_early_data_size = max_early_data_size_arg;
5202
5203 ret = mbedtls_test_get_tls13_ticket(&client_options, &server_options,
5204 &saved_session);
5205 TEST_EQUAL(ret, 0);
5206
5207 /*
5208 * Prepare for handshake with the ticket.
5209 */
5210 server_options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
5211 server_options.srv_log_obj = &server_pattern;
5212 server_pattern.pattern = pattern;
5213
5214 switch (scenario) {
5215 case TEST_EARLY_DATA_ACCEPTED:
5216 break;
5217
Ronald Cron919e5962024-02-08 15:48:29 +01005218 case TEST_EARLY_DATA_SERVER_REJECTS:
5219 server_options.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
5220 ret = mbedtls_snprintf(pattern, sizeof(pattern),
5221 "EarlyData: deprotect and discard app data records.");
5222 TEST_ASSERT(ret < (int) sizeof(pattern));
5223 mbedtls_debug_set_threshold(3);
5224 break;
5225
Ronald Cron01d273d2024-02-09 16:17:10 +01005226 case TEST_EARLY_DATA_HRR:
Ronald Cron52472102024-03-08 11:29:28 +01005227 /*
5228 * Remove server support for the group negotiated in
5229 * mbedtls_test_get_tls13_ticket() forcing an HelloRetryRequest.
5230 */
Ronald Cron01d273d2024-02-09 16:17:10 +01005231 server_options.group_list = group_list + 1;
5232 ret = mbedtls_snprintf(
5233 pattern, sizeof(pattern),
5234 "EarlyData: Ignore application message before 2nd ClientHello");
5235 TEST_ASSERT(ret < (int) sizeof(pattern));
5236 mbedtls_debug_set_threshold(3);
5237 break;
5238
Ronald Cron2160bfe2024-02-07 08:04:07 +01005239 default:
5240 TEST_FAIL("Unknown scenario.");
5241 }
5242
5243 ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
5244 &client_options, NULL, NULL, NULL);
5245 TEST_EQUAL(ret, 0);
5246
5247 ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
5248 &server_options, NULL, NULL, NULL);
5249 TEST_EQUAL(ret, 0);
5250
5251 mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
5252 mbedtls_test_ticket_write,
5253 mbedtls_test_ticket_parse,
5254 NULL);
5255
5256 ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
5257 &(server_ep.socket), 1024);
5258 TEST_EQUAL(ret, 0);
5259
5260 max_early_data_size = saved_session.max_early_data_size;
5261
5262 ret = mbedtls_ssl_set_session(&(client_ep.ssl), &saved_session);
5263 TEST_EQUAL(ret, 0);
5264
5265 /*
5266 * Start an handshake based on the ticket up to the point where early data
5267 * can be sent from client side. Then send in a loop as much early data as
5268 * possible without going over the maximum permitted size for the ticket.
5269 * Finally, do a last writting to go past that maximum permitted size and
5270 * check that we detect it.
5271 */
5272 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
5273 &(client_ep.ssl), &(server_ep.ssl),
5274 MBEDTLS_SSL_SERVER_HELLO), 0);
5275
Ronald Crond2884662024-03-03 15:03:22 +01005276 TEST_ASSERT(client_ep.ssl.early_data_state !=
Ronald Cron3c5a6832024-03-03 15:46:57 +01005277 MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005278
5279 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5280 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
5281
Ronald Cron25ad10a2024-02-29 00:39:23 +01005282 /*
5283 * Write and if possible read as much as possible chunks of write_size
5284 * bytes data without getting over the max_early_data_size limit.
5285 */
5286 do {
Ronald Cron2160bfe2024-02-07 08:04:07 +01005287 uint32_t read_early_data_size = 0;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005288
Ronald Cron52472102024-03-08 11:29:28 +01005289 /*
5290 * The contents of the early data are not very important, write a
5291 * pattern that varies byte-by-byte and is different for every chunk of
5292 * early data.
5293 */
Ronald Cron25ad10a2024-02-29 00:39:23 +01005294 if ((written_early_data_size + write_size) > max_early_data_size) {
5295 break;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005296 }
5297
Ronald Cron25ad10a2024-02-29 00:39:23 +01005298 /*
5299 * If the server rejected early data, base the determination of when
Ronald Cron4facb0a2024-03-08 11:40:07 +01005300 * to stop the loop on the expanded size (padding and encryption
Ronald Cron25ad10a2024-02-29 00:39:23 +01005301 * expansion) of early data on server side and the number of early data
Ronald Cron4facb0a2024-03-08 11:40:07 +01005302 * received so far by the server (multiple of the expanded size).
Ronald Cron25ad10a2024-02-29 00:39:23 +01005303 */
Ronald Cron4facb0a2024-03-08 11:40:07 +01005304 if ((expanded_early_data_chunk_size != 0) &&
Ronald Cron25ad10a2024-02-29 00:39:23 +01005305 ((server_ep.ssl.total_early_data_size +
Ronald Cron4facb0a2024-03-08 11:40:07 +01005306 expanded_early_data_chunk_size) > max_early_data_size)) {
Ronald Cron25ad10a2024-02-29 00:39:23 +01005307 break;
5308 }
5309
5310 for (size_t i = 0; i < write_size; i++) {
Ronald Cron2160bfe2024-02-07 08:04:07 +01005311 buf_write[i] = (unsigned char) (written_early_data_size + i);
5312 }
5313
Ronald Cron25ad10a2024-02-29 00:39:23 +01005314 ret = write_early_data(&(client_ep.ssl), buf_write, write_size);
5315 TEST_EQUAL(ret, write_size);
5316 written_early_data_size += write_size;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005317
5318 switch (scenario) {
5319 case TEST_EARLY_DATA_ACCEPTED:
Ronald Cron25ad10a2024-02-29 00:39:23 +01005320 while (read_early_data_size < write_size) {
Ronald Cron2160bfe2024-02-07 08:04:07 +01005321 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5322 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA);
5323
5324 ret = mbedtls_ssl_read_early_data(&(server_ep.ssl),
Ronald Cron25ad10a2024-02-29 00:39:23 +01005325 buf_read, read_size);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005326 TEST_ASSERT(ret > 0);
5327
5328 TEST_MEMORY_COMPARE(buf_read, ret,
5329 buf_write + read_early_data_size, ret);
5330 read_early_data_size += ret;
5331
Ronald Cron19bfe0a2024-02-26 16:43:01 +01005332 TEST_EQUAL(server_ep.ssl.total_early_data_size,
Ronald Cron2160bfe2024-02-07 08:04:07 +01005333 written_early_data_size);
5334 }
5335 break;
Ronald Cron919e5962024-02-08 15:48:29 +01005336
Ronald Cron01d273d2024-02-09 16:17:10 +01005337 case TEST_EARLY_DATA_SERVER_REJECTS: /* Intentional fallthrough */
5338 case TEST_EARLY_DATA_HRR:
Ronald Cron919e5962024-02-08 15:48:29 +01005339 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5340 /*
Ronald Cron1a13e2f2024-03-08 14:44:35 +01005341 * In this write loop we try to always stay below the
5342 * max_early_data_size limit but if max_early_data_size is very
5343 * small we may exceed the max_early_data_size limit on the
5344 * first write. In TEST_EARLY_DATA_SERVER_REJECTS/
5345 * TEST_EARLY_DATA_HRR scenario, this is for sure the case if
5346 * max_early_data_size is smaller than the smallest possible
5347 * inner content/protected record. Take into account this
5348 * possibility here but only for max_early_data_size values
Ronald Crone1295fa2024-03-08 17:03:16 +01005349 * that are close to write_size. Below, '1' is for the inner
5350 * type byte and '16' is to take into account some AEAD
5351 * expansion (tag, ...).
Ronald Cron919e5962024-02-08 15:48:29 +01005352 */
5353 if (ret == MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE) {
Ronald Cron1a13e2f2024-03-08 14:44:35 +01005354 if (scenario == TEST_EARLY_DATA_SERVER_REJECTS) {
5355 TEST_LE_U(max_early_data_size,
5356 write_size + 1 +
5357 MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY);
5358 } else {
5359 TEST_LE_U(max_early_data_size,
5360 write_size + 1 + 16 +
5361 MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY);
5362 }
Ronald Cron919e5962024-02-08 15:48:29 +01005363 goto exit;
5364 }
5365
5366 TEST_ASSERT(ret == MBEDTLS_ERR_SSL_WANT_READ);
5367
5368 TEST_EQUAL(server_pattern.counter, 1);
5369 server_pattern.counter = 0;
Ronald Cron4facb0a2024-03-08 11:40:07 +01005370 if (expanded_early_data_chunk_size == 0) {
5371 expanded_early_data_chunk_size = server_ep.ssl.total_early_data_size;
Ronald Cron919e5962024-02-08 15:48:29 +01005372 }
Ronald Cron919e5962024-02-08 15:48:29 +01005373 break;
Ronald Cron2160bfe2024-02-07 08:04:07 +01005374 }
Ronald Cron4facb0a2024-03-08 11:40:07 +01005375 TEST_LE_U(server_ep.ssl.total_early_data_size, max_early_data_size);
Ronald Cron25ad10a2024-02-29 00:39:23 +01005376 } while (1);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005377
5378 mbedtls_debug_set_threshold(3);
Ronald Cron25ad10a2024-02-29 00:39:23 +01005379 ret = write_early_data(&(client_ep.ssl), buf_write, write_size);
5380 TEST_EQUAL(ret, write_size);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005381
5382 ret = mbedtls_snprintf(pattern, sizeof(pattern),
Ronald Cron70eab452024-02-26 15:50:15 +01005383 "EarlyData: Too much early data received");
Ronald Cron2160bfe2024-02-07 08:04:07 +01005384 TEST_ASSERT(ret < (int) sizeof(pattern));
5385
5386 ret = mbedtls_ssl_handshake(&(server_ep.ssl));
5387 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
5388 TEST_EQUAL(server_pattern.counter, 1);
5389
5390exit:
5391 mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
5392 mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
5393 mbedtls_test_free_handshake_options(&client_options);
5394 mbedtls_test_free_handshake_options(&server_options);
5395 mbedtls_ssl_session_free(&saved_session);
Ronald Crone93cd1b2024-03-01 19:30:00 +01005396 mbedtls_free(buf_write);
5397 mbedtls_free(buf_read);
Ronald Cron2160bfe2024-02-07 08:04:07 +01005398 mbedtls_debug_set_threshold(0);
5399 PSA_DONE();
5400}
5401/* END_CASE */
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005402
Manuel Pégourié-Gonnard428ce0a2025-02-25 10:32:20 +01005403/* BEGIN_CASE depends_on:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnardf83bc792025-02-12 12:36:28 +01005404void inject_client_content_on_the_wire(int pk_alg,
5405 int state, data_t *data,
5406 char *log_pattern, int expected_ret)
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005407{
5408 /* This function allows us to inject content at a specific state
5409 * in the handshake, or when it's completed. The content is injected
5410 * on the mock TCP socket, as if we were an active network attacker.
5411 *
5412 * This function is suitable to inject:
5413 * - crafted records, at any point;
5414 * - valid records that contain crafted handshake messages, but only
5415 * when the traffic is still unprotected (for TLS 1.2 that's most of the
5416 * handshake, for TLS 1.3 that's only the Hello messages);
5417 * - handshake messages that are fragmented in a specific way,
5418 * under the same conditions as above.
5419 */
5420 enum { BUFFSIZE = 16384 };
5421 mbedtls_test_ssl_endpoint server, client;
5422 mbedtls_platform_zeroize(&server, sizeof(server));
5423 mbedtls_platform_zeroize(&client, sizeof(client));
5424 mbedtls_test_handshake_test_options options;
5425 mbedtls_test_init_handshake_options(&options);
5426 mbedtls_test_ssl_log_pattern srv_pattern;
5427 memset(&srv_pattern, 0, sizeof(srv_pattern));
5428 int ret = -1;
5429
5430 PSA_INIT();
5431
5432 srv_pattern.pattern = log_pattern;
5433 options.srv_log_obj = &srv_pattern;
5434 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
Manuel Pégourié-Gonnard43a04e72025-03-11 12:12:51 +01005435 mbedtls_debug_set_threshold(3);
Manuel Pégourié-Gonnardf83bc792025-02-12 12:36:28 +01005436
5437 options.pk_alg = pk_alg;
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005438
5439 ret = mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
5440 &options, NULL, NULL, NULL);
5441 TEST_EQUAL(ret, 0);
5442
5443 ret = mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
5444 &options, NULL, NULL, NULL);
5445 TEST_EQUAL(ret, 0);
5446
5447 ret = mbedtls_test_mock_socket_connect(&server.socket, &client.socket,
5448 BUFFSIZE);
5449 TEST_EQUAL(ret, 0);
5450
5451 /* Make the server move to the required state */
5452 ret = mbedtls_test_move_handshake_to_state(&client.ssl, &server.ssl, state);
5453 TEST_EQUAL(ret, 0);
5454
5455 /* Send the crafted message */
Manuel Pégourié-Gonnardf83bc792025-02-12 12:36:28 +01005456 ret = mbedtls_test_mock_tcp_send_b(&client.socket, data->x, data->len);
Manuel Pégourié-Gonnard8476c382025-03-11 10:27:49 +01005457 TEST_EQUAL(ret, (int) data->len);
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005458
5459 /* Have the server process it.
5460 * Need the loop because a server that support 1.3 and 1.2
5461 * will process a 1.2 ClientHello in two steps.
5462 */
5463 do {
5464 ret = mbedtls_ssl_handshake_step(&server.ssl);
5465 } while (ret == 0 && server.ssl.state == state);
5466 TEST_EQUAL(ret, expected_ret);
Manuel Pégourié-Gonnard43a04e72025-03-11 12:12:51 +01005467 TEST_ASSERT(srv_pattern.counter >= 1);
Manuel Pégourié-Gonnard00ad6f62025-02-11 13:19:45 +01005468
5469exit:
5470 mbedtls_test_free_handshake_options(&options);
5471 mbedtls_test_ssl_endpoint_free(&server, NULL);
5472 mbedtls_test_ssl_endpoint_free(&client, NULL);
5473 mbedtls_debug_set_threshold(0);
5474 PSA_DONE();
5475}
5476/* END_CASE */
Manuel Pégourié-Gonnard6b25c502025-02-26 13:01:10 +01005477
Manuel Pégourié-Gonnard996c4c02025-03-04 10:12:25 +01005478/* 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 +01005479void send_large_fragmented_hello(int hs_len_int, int first_frag_content_len_int,
5480 char *log_pattern, int expected_ret)
5481{
5482 /* This function sends a long message (claiming to be a ClientHello)
5483 * fragmented in 1-byte fragments (except the initial fragment).
5484 * The purpose is to test how the stack reacts when receiving:
5485 * - a message larger than our buffer;
5486 * - a message smaller than our buffer, but where the intermediate size of
5487 * holding all the fragments (including overhead) is larger than our
5488 * buffer.
5489 */
5490 enum { BUFFSIZE = 16384 };
5491 mbedtls_test_ssl_endpoint server, client;
5492 mbedtls_platform_zeroize(&server, sizeof(server));
5493 mbedtls_platform_zeroize(&client, sizeof(client));
5494
5495 mbedtls_test_handshake_test_options options;
5496 mbedtls_test_init_handshake_options(&options);
5497
5498 mbedtls_test_ssl_log_pattern srv_pattern;
5499 memset(&srv_pattern, 0, sizeof(srv_pattern));
5500
5501 unsigned char *first_frag = NULL;
5502 int ret = -1;
5503
5504 size_t hs_len = (size_t) hs_len_int;
5505 size_t first_frag_content_len = (size_t) first_frag_content_len_int;
5506
5507 PSA_INIT();
5508
5509 srv_pattern.pattern = log_pattern;
5510 options.srv_log_obj = &srv_pattern;
5511 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
Manuel Pégourié-Gonnard051b1e22025-03-05 11:53:09 +01005512 mbedtls_debug_set_threshold(1);
Manuel Pégourié-Gonnard6b25c502025-02-26 13:01:10 +01005513
Manuel Pégourié-Gonnard996c4c02025-03-04 10:12:25 +01005514 // Does't really matter but we want to know to declare dependencies.
5515 options.pk_alg = MBEDTLS_PK_ECDSA;
5516
Manuel Pégourié-Gonnard6b25c502025-02-26 13:01:10 +01005517 ret = mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
5518 &options, NULL, NULL, NULL);
5519 TEST_EQUAL(ret, 0);
5520
5521 ret = mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
5522 &options, NULL, NULL, NULL);
5523 TEST_EQUAL(ret, 0);
5524
5525 ret = mbedtls_test_mock_socket_connect(&server.socket, &client.socket,
5526 BUFFSIZE);
5527 TEST_EQUAL(ret, 0);
5528
5529 /* Make the server move past the initial dummy state */
5530 ret = mbedtls_test_move_handshake_to_state(&client.ssl, &server.ssl,
5531 MBEDTLS_SSL_CLIENT_HELLO);
5532 TEST_EQUAL(ret, 0);
5533
5534 /* Prepare initial fragment */
5535 const size_t first_len = 5 // record header, see below
5536 + 4 // handshake header, see balow
5537 + first_frag_content_len;
5538 TEST_CALLOC(first_frag, first_len);
5539 unsigned char *p = first_frag;
5540 // record header
5541 // record type: handshake
5542 *p++ = 0x16,
5543 // record version (actually common to TLS 1.2 and TLS 1.3)
5544 *p++ = 0x03,
5545 *p++ = 0x03,
5546 // record length: two bytes
5547 *p++ = (unsigned char) (((4 + first_frag_content_len) >> 8) & 0xff);
5548 *p++ = (unsigned char) (((4 + first_frag_content_len) >> 0) & 0xff);
5549 // handshake header
5550 // handshake type: ClientHello
5551 *p++ = 0x01,
5552 // handshake length: three bytes
5553 *p++ = (unsigned char) ((hs_len >> 16) & 0xff);
5554 *p++ = (unsigned char) ((hs_len >> 8) & 0xff);
5555 *p++ = (unsigned char) ((hs_len >> 0) & 0xff);
5556 // handshake content: dummy value
5557 memset(p, 0x2a, first_frag_content_len);
5558
5559 /* Send initial fragment and have the server process it. */
5560 ret = mbedtls_test_mock_tcp_send_b(&client.socket, first_frag, first_len);
5561 TEST_ASSERT(ret >= 0 && (size_t) ret == first_len);
5562
5563 ret = mbedtls_ssl_handshake_step(&server.ssl);
5564 TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
5565
5566 /* Dummy 1-byte fragment to repeatedly send next */
5567 const unsigned char next[] = {
5568 0x16, 0x03, 0x03, 0x00, 0x01, // record header (see above)
5569 0x2a, // Dummy handshake message content
5570 };
5571 for (size_t left = hs_len - first_frag_content_len; left != 0; left--) {
5572 ret = mbedtls_test_mock_tcp_send_b(&client.socket, next, sizeof(next));
5573 TEST_ASSERT(ret >= 0 && (size_t) ret == sizeof(next));
5574
5575 ret = mbedtls_ssl_handshake_step(&server.ssl);
5576 if (ret != MBEDTLS_ERR_SSL_WANT_READ) {
5577 break;
5578 }
5579 }
5580 TEST_EQUAL(ret, expected_ret);
5581 TEST_EQUAL(srv_pattern.counter, 1);
5582
5583exit:
5584 mbedtls_test_free_handshake_options(&options);
5585 mbedtls_test_ssl_endpoint_free(&server, NULL);
5586 mbedtls_test_ssl_endpoint_free(&client, NULL);
5587 mbedtls_debug_set_threshold(0);
5588 mbedtls_free(first_frag);
5589 PSA_DONE();
5590}
5591/* END_CASE */