blob: 29a065b2635c7db00c020c9be45a35e0dece2294 [file] [log] [blame]
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include <mbedtls/ssl.h>
Chris Jones84a773f2021-03-05 18:38:47 +00003#include <ssl_misc.h>
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004#include <mbedtls/ctr_drbg.h>
5#include <mbedtls/entropy.h>
Andrzej Kurek941962e2020-02-07 09:20:32 -05006#include <mbedtls/timing.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +01007#include <mbedtls/debug.h>
Hanno Becker73c825a2020-09-08 10:52:58 +01008#include <ssl_tls13_keys.h>
Gabor Mezeib35759d2022-02-09 16:59:11 +01009#include <ssl_tls13_invasive.h>
Mateusz Starzyk1aec6462021-02-08 15:34:42 +010010#include "test/certs.h"
Piotr Nowickibde7ee82020-02-21 10:59:50 +010011
Hanno Becker6667ffd2021-04-19 21:59:22 +010012#include <psa/crypto.h>
13
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020014#include <constant_time_internal.h>
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +020015
Manuel Pégourié-Gonnard9670a592020-07-10 10:21:46 +020016#include <test/constant_flow.h>
17
Hanno Becker1413bd82020-09-09 12:46:09 +010018enum
19{
20#define MBEDTLS_SSL_TLS1_3_LABEL( name, string ) \
Xiaofei Baid25fab62021-12-02 06:36:27 +000021 tls13_label_ ## name,
Hanno Becker70d7fb02020-09-09 10:11:21 +010022MBEDTLS_SSL_TLS1_3_LABEL_LIST
23#undef MBEDTLS_SSL_TLS1_3_LABEL
Hanno Becker1413bd82020-09-09 12:46:09 +010024};
Hanno Becker70d7fb02020-09-09 10:11:21 +010025
Piotr Nowickibde7ee82020-02-21 10:59:50 +010026typedef struct log_pattern
27{
28 const char *pattern;
29 size_t counter;
30} log_pattern;
31
Piotr Nowicki438bf3b2020-03-10 12:59:10 +010032/*
33 * This function can be passed to mbedtls to receive output logs from it. In
Piotr Nowickibde7ee82020-02-21 10:59:50 +010034 * this case, it will count the instances of a log_pattern in the received
35 * logged messages.
36 */
37void log_analyzer( void *ctx, int level,
38 const char *file, int line,
39 const char *str )
40{
41 log_pattern *p = (log_pattern *) ctx;
42
43 (void) level;
44 (void) line;
45 (void) file;
46
47 if( NULL != p &&
48 NULL != p->pattern &&
49 NULL != strstr( str, p->pattern ) )
50 {
51 p->counter++;
52 }
53}
Janos Follath6264e662019-11-26 11:11:15 +000054
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050055typedef struct handshake_test_options
56{
57 const char *cipher;
Glenn Strauss39e624c2022-04-11 13:33:16 -040058 mbedtls_ssl_protocol_version client_min_version;
59 mbedtls_ssl_protocol_version client_max_version;
60 mbedtls_ssl_protocol_version server_min_version;
61 mbedtls_ssl_protocol_version server_max_version;
62 mbedtls_ssl_protocol_version expected_negotiated_version;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050063 int pk_alg;
64 data_t *psk_str;
65 int dtls;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010066 int srv_auth_mode;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050067 int serialize;
68 int mfl;
69 int cli_msg_len;
70 int srv_msg_len;
71 int expected_cli_fragments;
72 int expected_srv_fragments;
73 int renegotiate;
74 int legacy_renegotiation;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010075 void *srv_log_obj;
76 void *cli_log_obj;
77 void (*srv_log_fun)(void *, int, const char *, int, const char *);
78 void (*cli_log_fun)(void *, int, const char *, int, const char *);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -050079 int resize_buffers;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050080} handshake_test_options;
81
82void init_handshake_options( handshake_test_options *opts )
83{
84 opts->cipher = "";
Glenn Strauss39e624c2022-04-11 13:33:16 -040085 opts->client_min_version = MBEDTLS_SSL_VERSION_UNKNOWN;
86 opts->client_max_version = MBEDTLS_SSL_VERSION_UNKNOWN;
87 opts->server_min_version = MBEDTLS_SSL_VERSION_UNKNOWN;
88 opts->server_max_version = MBEDTLS_SSL_VERSION_UNKNOWN;
Glenn Strausse3af4cb2022-03-15 03:23:42 -040089 opts->expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050090 opts->pk_alg = MBEDTLS_PK_RSA;
91 opts->psk_str = NULL;
92 opts->dtls = 0;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010093 opts->srv_auth_mode = MBEDTLS_SSL_VERIFY_NONE;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050094 opts->serialize = 0;
95 opts->mfl = MBEDTLS_SSL_MAX_FRAG_LEN_NONE;
96 opts->cli_msg_len = 100;
97 opts->srv_msg_len = 100;
98 opts->expected_cli_fragments = 1;
99 opts->expected_srv_fragments = 1;
100 opts->renegotiate = 0;
101 opts->legacy_renegotiation = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION;
Piotr Nowickibde7ee82020-02-21 10:59:50 +0100102 opts->srv_log_obj = NULL;
103 opts->srv_log_obj = NULL;
104 opts->srv_log_fun = NULL;
105 opts->cli_log_fun = NULL;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500106 opts->resize_buffers = 1;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -0500107}
Ronald Crone3dac4a2022-06-10 17:21:51 +0200108
Janos Follath6264e662019-11-26 11:11:15 +0000109/*
110 * Buffer structure for custom I/O callbacks.
111 */
112
113typedef struct mbedtls_test_buffer
114{
115 size_t start;
116 size_t content_length;
117 size_t capacity;
118 unsigned char *buffer;
119} mbedtls_test_buffer;
120
121/*
122 * Initialises \p buf. After calling this function it is safe to call
123 * `mbedtls_test_buffer_free()` on \p buf.
124 */
125void mbedtls_test_buffer_init( mbedtls_test_buffer *buf )
126{
127 memset( buf, 0, sizeof( *buf ) );
128}
129
130/*
131 * Sets up \p buf. After calling this function it is safe to call
132 * `mbedtls_test_buffer_put()` and `mbedtls_test_buffer_get()` on \p buf.
133 */
134int mbedtls_test_buffer_setup( mbedtls_test_buffer *buf, size_t capacity )
135{
136 buf->buffer = (unsigned char*) mbedtls_calloc( capacity,
137 sizeof(unsigned char) );
138 if( NULL == buf->buffer )
139 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
140 buf->capacity = capacity;
141
142 return 0;
143}
144
145void mbedtls_test_buffer_free( mbedtls_test_buffer *buf )
146{
147 if( buf->buffer != NULL )
148 mbedtls_free( buf->buffer );
149
150 memset( buf, 0, sizeof( *buf ) );
151}
152
153/*
154 * Puts \p input_len bytes from the \p input buffer into the ring buffer \p buf.
155 *
156 * \p buf must have been initialized and set up by calling
157 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
158 *
159 * \retval \p input_len, if the data fits.
160 * \retval 0 <= value < \p input_len, if the data does not fit.
161 * \retval -1, if \p buf is NULL, it hasn't been set up or \p input_len is not
162 * zero and \p input is NULL.
163 */
164int mbedtls_test_buffer_put( mbedtls_test_buffer *buf,
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100165 const unsigned char *input, size_t input_len )
Janos Follath6264e662019-11-26 11:11:15 +0000166{
167 size_t overflow = 0;
168
169 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
170 return -1;
171
172 /* Reduce input_len to a number that fits in the buffer. */
173 if ( ( buf->content_length + input_len ) > buf->capacity )
174 {
175 input_len = buf->capacity - buf->content_length;
176 }
177
178 if( input == NULL )
179 {
180 return ( input_len == 0 ) ? 0 : -1;
181 }
182
Piotr Nowickifb437d72020-01-13 16:59:12 +0100183 /* Check if the buffer has not come full circle and free space is not in
184 * the middle */
185 if( buf->start + buf->content_length < buf->capacity )
Janos Follath6264e662019-11-26 11:11:15 +0000186 {
Piotr Nowickifb437d72020-01-13 16:59:12 +0100187
188 /* Calculate the number of bytes that need to be placed at lower memory
189 * address */
190 if( buf->start + buf->content_length + input_len
191 > buf->capacity )
192 {
193 overflow = ( buf->start + buf->content_length + input_len )
194 % buf->capacity;
195 }
196
197 memcpy( buf->buffer + buf->start + buf->content_length, input,
198 input_len - overflow );
199 memcpy( buf->buffer, input + input_len - overflow, overflow );
200
201 }
202 else
203 {
204 /* The buffer has come full circle and free space is in the middle */
205 memcpy( buf->buffer + buf->start + buf->content_length - buf->capacity,
206 input, input_len );
Janos Follath6264e662019-11-26 11:11:15 +0000207 }
208
Janos Follath6264e662019-11-26 11:11:15 +0000209 buf->content_length += input_len;
Janos Follath6264e662019-11-26 11:11:15 +0000210 return input_len;
211}
212
213/*
Andrzej Kurekf7774142020-01-22 06:34:59 -0500214 * Gets \p output_len bytes from the ring buffer \p buf into the
215 * \p output buffer. The output buffer can be NULL, in this case a part of the
216 * ring buffer will be dropped, if the requested length is available.
Janos Follath6264e662019-11-26 11:11:15 +0000217 *
218 * \p buf must have been initialized and set up by calling
219 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
220 *
221 * \retval \p output_len, if the data is available.
222 * \retval 0 <= value < \p output_len, if the data is not available.
Andrzej Kurekf7774142020-01-22 06:34:59 -0500223 * \retval -1, if \buf is NULL or it hasn't been set up.
Janos Follath6264e662019-11-26 11:11:15 +0000224 */
225int mbedtls_test_buffer_get( mbedtls_test_buffer *buf,
226 unsigned char* output, size_t output_len )
227{
228 size_t overflow = 0;
229
230 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
231 return -1;
232
Andrzej Kurekf7774142020-01-22 06:34:59 -0500233 if( output == NULL && output_len == 0 )
234 return 0;
Janos Follath6264e662019-11-26 11:11:15 +0000235
236 if( buf->content_length < output_len )
237 output_len = buf->content_length;
238
239 /* Calculate the number of bytes that need to be drawn from lower memory
240 * address */
241 if( buf->start + output_len > buf->capacity )
242 {
243 overflow = ( buf->start + output_len ) % buf->capacity;
244 }
245
Andrzej Kurekf7774142020-01-22 06:34:59 -0500246 if( output != NULL )
247 {
248 memcpy( output, buf->buffer + buf->start, output_len - overflow );
249 memcpy( output + output_len - overflow, buf->buffer, overflow );
250 }
251
Janos Follath6264e662019-11-26 11:11:15 +0000252 buf->content_length -= output_len;
253 buf->start = ( buf->start + output_len ) % buf->capacity;
254
255 return output_len;
256}
257
Hanno Beckera18d1322018-01-03 14:27:32 +0000258/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500259 * Errors used in the message transport mock tests
260 */
261 #define MBEDTLS_TEST_ERROR_ARG_NULL -11
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500262 #define MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED -44
263
264/*
265 * Context for a message metadata queue (fifo) that is on top of the ring buffer.
266 */
267typedef struct mbedtls_test_message_queue
268{
269 size_t *messages;
270 int pos;
271 int num;
272 int capacity;
273} mbedtls_test_message_queue;
274
275/*
276 * Setup and free functions for the message metadata queue.
277 *
278 * \p capacity describes the number of message metadata chunks that can be held
279 * within the queue.
280 *
281 * \retval 0, if a metadata queue of a given length can be allocated.
282 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation failed.
283 */
284int mbedtls_test_message_queue_setup( mbedtls_test_message_queue *queue,
285 size_t capacity )
286{
287 queue->messages = (size_t*) mbedtls_calloc( capacity, sizeof(size_t) );
288 if( NULL == queue->messages )
289 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
290
291 queue->capacity = capacity;
292 queue->pos = 0;
293 queue->num = 0;
294
295 return 0;
296}
297
298void mbedtls_test_message_queue_free( mbedtls_test_message_queue *queue )
299{
300 if( queue == NULL )
301 return;
302
303 if( queue->messages != NULL )
304 mbedtls_free( queue->messages );
305
306 memset( queue, 0, sizeof( *queue ) );
307}
308
309/*
310 * Push message length information onto the message metadata queue.
311 * This will become the last element to leave it (fifo).
312 *
313 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500314 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the queue is full.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500315 * \retval \p len, if the push was successful.
316 */
317int mbedtls_test_message_queue_push_info( mbedtls_test_message_queue *queue,
318 size_t len )
319{
320 int place;
321 if( queue == NULL )
322 return MBEDTLS_TEST_ERROR_ARG_NULL;
323
324 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500325 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500326
327 place = ( queue->pos + queue->num ) % queue->capacity;
328 queue->messages[place] = len;
329 queue->num++;
330 return len;
331}
332
333/*
334 * Pop information about the next message length from the queue. This will be
335 * the oldest inserted message length(fifo). \p msg_len can be null, in which
336 * case the data will be popped from the queue but not copied anywhere.
337 *
338 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500339 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500340 * \retval message length, if the pop was successful, up to the given
341 \p buf_len.
342 */
343int mbedtls_test_message_queue_pop_info( mbedtls_test_message_queue *queue,
344 size_t buf_len )
345{
346 size_t message_length;
347 if( queue == NULL )
348 return MBEDTLS_TEST_ERROR_ARG_NULL;
349 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500350 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500351
352 message_length = queue->messages[queue->pos];
353 queue->messages[queue->pos] = 0;
354 queue->num--;
355 queue->pos++;
356 queue->pos %= queue->capacity;
357 if( queue->pos < 0 )
358 queue->pos += queue->capacity;
359
360 return ( message_length > buf_len ) ? buf_len : message_length;
361}
362
363/*
364 * Take a peek on the info about the next message length from the queue.
365 * This will be the oldest inserted message length(fifo).
366 *
367 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500368 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500369 * \retval 0, if the peek was successful.
370 * \retval MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
371 * too small to fit the message. In this case the \p msg_len will be
372 * set to the full message length so that the
373 * caller knows what portion of the message can be dropped.
374 */
375int mbedtls_test_message_queue_peek_info( mbedtls_test_message_queue *queue,
376 size_t buf_len, size_t* msg_len )
377{
378 if( queue == NULL || msg_len == NULL )
379 return MBEDTLS_TEST_ERROR_ARG_NULL;
380 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500381 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500382
383 *msg_len = queue->messages[queue->pos];
384 return ( *msg_len > buf_len ) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
385}
386/*
Janos Follath031827f2019-11-27 11:12:14 +0000387 * Context for the I/O callbacks simulating network connection.
388 */
389
390#define MBEDTLS_MOCK_SOCKET_CONNECTED 1
391
392typedef struct mbedtls_mock_socket
393{
394 int status;
395 mbedtls_test_buffer *input;
396 mbedtls_test_buffer *output;
397 struct mbedtls_mock_socket *peer;
398} mbedtls_mock_socket;
399
400/*
401 * Setup and teardown functions for mock sockets.
402 */
403void mbedtls_mock_socket_init( mbedtls_mock_socket *socket )
404{
405 memset( socket, 0, sizeof( *socket ) );
406}
407
408/*
409 * Closes the socket \p socket.
410 *
411 * \p socket must have been previously initialized by calling
412 * mbedtls_mock_socket_init().
413 *
414 * This function frees all allocated resources and both sockets are aware of the
415 * new connection state.
416 *
417 * That is, this function does not simulate half-open TCP connections and the
418 * phenomenon that when closing a UDP connection the peer is not aware of the
419 * connection having been closed.
420 */
421void mbedtls_mock_socket_close( mbedtls_mock_socket* socket )
422{
423 if( socket == NULL )
424 return;
425
426 if( socket->input != NULL )
427 {
428 mbedtls_test_buffer_free( socket->input );
429 mbedtls_free( socket->input );
430 }
431
432 if( socket->output != NULL )
433 {
434 mbedtls_test_buffer_free( socket->output );
435 mbedtls_free( socket->output );
436 }
437
438 if( socket->peer != NULL )
439 memset( socket->peer, 0, sizeof( *socket->peer ) );
440
441 memset( socket, 0, sizeof( *socket ) );
442}
443
444/*
445 * Establishes a connection between \p peer1 and \p peer2.
446 *
447 * \p peer1 and \p peer2 must have been previously initialized by calling
448 * mbedtls_mock_socket_init().
449 *
450 * The capacites of the internal buffers are set to \p bufsize. Setting this to
451 * the correct value allows for simulation of MTU, sanity testing the mock
452 * implementation and mocking TCP connections with lower memory cost.
453 */
454int mbedtls_mock_socket_connect( mbedtls_mock_socket* peer1,
455 mbedtls_mock_socket* peer2,
456 size_t bufsize )
457{
458 int ret = -1;
459
Piotr Nowickid796e192020-01-28 12:09:47 +0100460 peer1->output =
Janos Follath031827f2019-11-27 11:12:14 +0000461 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
462 if( peer1->output == NULL )
463 {
464 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
465 goto exit;
466 }
467 mbedtls_test_buffer_init( peer1->output );
468 if( 0 != ( ret = mbedtls_test_buffer_setup( peer1->output, bufsize ) ) )
469 {
470 goto exit;
471 }
472
Piotr Nowickid796e192020-01-28 12:09:47 +0100473 peer2->output =
474 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
475 if( peer2->output == NULL )
476 {
477 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
478 goto exit;
479 }
480 mbedtls_test_buffer_init( peer2->output );
481 if( 0 != ( ret = mbedtls_test_buffer_setup( peer2->output, bufsize ) ) )
482 {
483 goto exit;
484 }
485
Janos Follath031827f2019-11-27 11:12:14 +0000486 peer1->peer = peer2;
487 peer2->peer = peer1;
Piotr Nowickid796e192020-01-28 12:09:47 +0100488 peer1->input = peer2->output;
489 peer2->input = peer1->output;
Janos Follath031827f2019-11-27 11:12:14 +0000490
491 peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
492 ret = 0;
493
494exit:
495
496 if( ret != 0 )
497 {
498 mbedtls_mock_socket_close( peer1 );
499 mbedtls_mock_socket_close( peer2 );
500 }
501
502 return ret;
503}
504
505/*
506 * Callbacks for simulating blocking I/O over connection-oriented transport.
507 */
508
509int mbedtls_mock_tcp_send_b( void *ctx, const unsigned char *buf, size_t len )
510{
511 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
512
513 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
514 return -1;
515
516 return mbedtls_test_buffer_put( socket->output, buf, len );
517}
518
519int mbedtls_mock_tcp_recv_b( void *ctx, unsigned char *buf, size_t len )
520{
521 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
522
523 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
524 return -1;
525
526 return mbedtls_test_buffer_get( socket->input, buf, len );
527}
528
529/*
Janos Follath3766ba52019-11-27 13:31:42 +0000530 * Callbacks for simulating non-blocking I/O over connection-oriented transport.
531 */
532
533int mbedtls_mock_tcp_send_nb( void *ctx, const unsigned char *buf, size_t len )
534{
535 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
536
537 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
538 return -1;
539
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100540 if( socket->output->capacity == socket->output->content_length )
Janos Follath3766ba52019-11-27 13:31:42 +0000541 {
Janos Follath3766ba52019-11-27 13:31:42 +0000542 return MBEDTLS_ERR_SSL_WANT_WRITE;
543 }
544
Janos Follath3766ba52019-11-27 13:31:42 +0000545 return mbedtls_test_buffer_put( socket->output, buf, len );
546}
547
548int mbedtls_mock_tcp_recv_nb( void *ctx, unsigned char *buf, size_t len )
549{
550 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
551
552 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
553 return -1;
554
Andrzej Kurekf40daa32020-02-04 09:00:01 -0500555 if( socket->input->content_length == 0 )
Janos Follath3766ba52019-11-27 13:31:42 +0000556 {
Janos Follath3766ba52019-11-27 13:31:42 +0000557 return MBEDTLS_ERR_SSL_WANT_READ;
558 }
559
Janos Follath3766ba52019-11-27 13:31:42 +0000560 return mbedtls_test_buffer_get( socket->input, buf, len );
561}
562
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500563/* Errors used in the message socket mocks */
564
565#define MBEDTLS_TEST_ERROR_CONTEXT_ERROR -55
566#define MBEDTLS_TEST_ERROR_SEND_FAILED -66
567#define MBEDTLS_TEST_ERROR_RECV_FAILED -77
568
569/*
570 * Structure used as an addon, or a wrapper, around the mocked sockets.
571 * Contains an input queue, to which the other socket pushes metadata,
572 * and an output queue, to which this one pushes metadata. This context is
573 * considered as an owner of the input queue only, which is initialized and
574 * freed in the respective setup and free calls.
575 */
576typedef struct mbedtls_test_message_socket_context
577{
578 mbedtls_test_message_queue* queue_input;
579 mbedtls_test_message_queue* queue_output;
580 mbedtls_mock_socket* socket;
581} mbedtls_test_message_socket_context;
582
Andrzej Kurek45916ba2020-03-05 14:46:22 -0500583void mbedtls_message_socket_init( mbedtls_test_message_socket_context *ctx )
584{
585 ctx->queue_input = NULL;
586 ctx->queue_output = NULL;
587 ctx->socket = NULL;
588}
589
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500590/*
591 * Setup a given mesasge socket context including initialization of
592 * input/output queues to a chosen capacity of messages. Also set the
593 * corresponding mock socket.
594 *
595 * \retval 0, if everything succeeds.
596 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation of a message
597 * queue failed.
598 */
599int mbedtls_message_socket_setup( mbedtls_test_message_queue* queue_input,
600 mbedtls_test_message_queue* queue_output,
601 size_t queue_capacity,
602 mbedtls_mock_socket* socket,
603 mbedtls_test_message_socket_context* ctx )
604{
605 int ret = mbedtls_test_message_queue_setup( queue_input, queue_capacity );
606 if( ret != 0 )
607 return ret;
608 ctx->queue_input = queue_input;
609 ctx->queue_output = queue_output;
610 ctx->socket = socket;
611 mbedtls_mock_socket_init( socket );
612
613 return 0;
614}
615
616/*
617 * Close a given message socket context, along with the socket itself. Free the
618 * memory allocated by the input queue.
619 */
620void mbedtls_message_socket_close( mbedtls_test_message_socket_context* ctx )
621{
622 if( ctx == NULL )
623 return;
624
625 mbedtls_test_message_queue_free( ctx->queue_input );
626 mbedtls_mock_socket_close( ctx->socket );
627 memset( ctx, 0, sizeof( *ctx ) );
628}
629
630/*
631 * Send one message through a given message socket context.
632 *
633 * \retval \p len, if everything succeeds.
634 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
635 * elements or the context itself is null.
636 * \retval MBEDTLS_TEST_ERROR_SEND_FAILED if mbedtls_mock_tcp_send_b failed.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500637 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the output queue is full.
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500638 *
639 * This function will also return any error from
640 * mbedtls_test_message_queue_push_info.
641 */
642int mbedtls_mock_tcp_send_msg( void *ctx, const unsigned char *buf, size_t len )
643{
644 mbedtls_test_message_queue* queue;
645 mbedtls_mock_socket* socket;
646 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
647
648 if( context == NULL || context->socket == NULL
649 || context->queue_output == NULL )
650 {
651 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
652 }
653
654 queue = context->queue_output;
655 socket = context->socket;
656
657 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500658 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500659
660 if( mbedtls_mock_tcp_send_b( socket, buf, len ) != (int) len )
661 return MBEDTLS_TEST_ERROR_SEND_FAILED;
662
663 return mbedtls_test_message_queue_push_info( queue, len );
664}
665
666/*
667 * Receive one message from a given message socket context and return message
668 * length or an error.
669 *
670 * \retval message length, if everything succeeds.
671 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
672 * elements or the context itself is null.
673 * \retval MBEDTLS_TEST_ERROR_RECV_FAILED if mbedtls_mock_tcp_recv_b failed.
674 *
675 * This function will also return any error other than
676 * MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED from mbedtls_test_message_queue_peek_info.
677 */
678int mbedtls_mock_tcp_recv_msg( void *ctx, unsigned char *buf, size_t buf_len )
679{
680 mbedtls_test_message_queue* queue;
681 mbedtls_mock_socket* socket;
682 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
Gilles Peskine19e841e2020-03-09 20:43:51 +0100683 size_t drop_len = 0;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500684 size_t msg_len;
685 int ret;
686
687 if( context == NULL || context->socket == NULL
688 || context->queue_input == NULL )
689 {
690 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
691 }
692
693 queue = context->queue_input;
694 socket = context->socket;
695
696 /* Peek first, so that in case of a socket error the data remains in
697 * the queue. */
698 ret = mbedtls_test_message_queue_peek_info( queue, buf_len, &msg_len );
699 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
700 {
701 /* Calculate how much to drop */
702 drop_len = msg_len - buf_len;
703
704 /* Set the requested message len to be buffer length */
705 msg_len = buf_len;
706 } else if( ret != 0 )
707 {
708 return ret;
709 }
710
711 if( mbedtls_mock_tcp_recv_b( socket, buf, msg_len ) != (int) msg_len )
712 return MBEDTLS_TEST_ERROR_RECV_FAILED;
713
714 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
715 {
716 /* Drop the remaining part of the message */
717 if( mbedtls_mock_tcp_recv_b( socket, NULL, drop_len ) != (int) drop_len )
718 {
719 /* Inconsistent state - part of the message was read,
720 * and a part couldn't. Not much we can do here, but it should not
721 * happen in test environment, unless forced manually. */
722 }
723 }
724 mbedtls_test_message_queue_pop_info( queue, buf_len );
725
726 return msg_len;
727}
728
Manuel Pégourié-Gonnardd12402f2020-05-20 10:34:25 +0200729#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
730 defined(MBEDTLS_ENTROPY_C) && \
731 defined(MBEDTLS_CTR_DRBG_C)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100732
733/*
734 * Structure with endpoint's certificates for SSL communication tests.
735 */
736typedef struct mbedtls_endpoint_certificate
737{
738 mbedtls_x509_crt ca_cert;
739 mbedtls_x509_crt cert;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100740 mbedtls_pk_context pkey;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100741} mbedtls_endpoint_certificate;
742
743/*
744 * Endpoint structure for SSL communication tests.
745 */
746typedef struct mbedtls_endpoint
747{
748 const char *name;
749 mbedtls_ssl_context ssl;
750 mbedtls_ssl_config conf;
751 mbedtls_ctr_drbg_context ctr_drbg;
752 mbedtls_entropy_context entropy;
753 mbedtls_mock_socket socket;
754 mbedtls_endpoint_certificate cert;
755} mbedtls_endpoint;
756
757/*
758 * Initializes \p ep_cert structure and assigns it to endpoint
759 * represented by \p ep.
760 *
761 * \retval 0 on success, otherwise error code.
762 */
Andrzej Kurekb2980742020-02-02 19:25:26 -0500763int mbedtls_endpoint_certificate_init( mbedtls_endpoint *ep, int pk_alg )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100764{
765 int i = 0;
766 int ret = -1;
767 mbedtls_endpoint_certificate *cert;
768
769 if( ep == NULL )
770 {
771 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
772 }
773
774 cert = &( ep->cert );
775 mbedtls_x509_crt_init( &( cert->ca_cert ) );
776 mbedtls_x509_crt_init( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100777 mbedtls_pk_init( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100778
779 /* Load the trusted CA */
780
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100781 for( i = 0; mbedtls_test_cas_der[i] != NULL; i++ )
782 {
783 ret = mbedtls_x509_crt_parse_der( &( cert->ca_cert ),
784 (const unsigned char *) mbedtls_test_cas_der[i],
785 mbedtls_test_cas_der_len[i] );
786 TEST_ASSERT( ret == 0 );
787 }
788
789 /* Load own certificate and private key */
790
791 if( ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER )
792 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500793 if( pk_alg == MBEDTLS_PK_RSA )
794 {
795 ret = mbedtls_x509_crt_parse( &( cert->cert ),
796 (const unsigned char*) mbedtls_test_srv_crt_rsa_sha256_der,
797 mbedtls_test_srv_crt_rsa_sha256_der_len );
798 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100799
Andrzej Kurekb2980742020-02-02 19:25:26 -0500800 ret = mbedtls_pk_parse_key( &( cert->pkey ),
801 (const unsigned char*) mbedtls_test_srv_key_rsa_der,
Manuel Pégourié-Gonnard84dea012021-06-15 11:29:26 +0200802 mbedtls_test_srv_key_rsa_der_len, NULL, 0,
803 mbedtls_test_rnd_std_rand, NULL );
Andrzej Kurekb2980742020-02-02 19:25:26 -0500804 TEST_ASSERT( ret == 0 );
805 }
806 else
807 {
808 ret = mbedtls_x509_crt_parse( &( cert->cert ),
809 (const unsigned char*) mbedtls_test_srv_crt_ec_der,
810 mbedtls_test_srv_crt_ec_der_len );
811 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100812
Andrzej Kurekb2980742020-02-02 19:25:26 -0500813 ret = mbedtls_pk_parse_key( &( cert->pkey ),
814 (const unsigned char*) mbedtls_test_srv_key_ec_der,
Manuel Pégourié-Gonnard84dea012021-06-15 11:29:26 +0200815 mbedtls_test_srv_key_ec_der_len, NULL, 0,
816 mbedtls_test_rnd_std_rand, NULL );
Andrzej Kurekb2980742020-02-02 19:25:26 -0500817 TEST_ASSERT( ret == 0 );
818 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100819 }
820 else
821 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500822 if( pk_alg == MBEDTLS_PK_RSA )
823 {
824 ret = mbedtls_x509_crt_parse( &( cert->cert ),
825 (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
826 mbedtls_test_cli_crt_rsa_der_len );
827 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100828
Andrzej Kurekb2980742020-02-02 19:25:26 -0500829 ret = mbedtls_pk_parse_key( &( cert->pkey ),
830 (const unsigned char *) mbedtls_test_cli_key_rsa_der,
Manuel Pégourié-Gonnard84dea012021-06-15 11:29:26 +0200831 mbedtls_test_cli_key_rsa_der_len, NULL, 0,
832 mbedtls_test_rnd_std_rand, NULL );
Andrzej Kurekb2980742020-02-02 19:25:26 -0500833 TEST_ASSERT( ret == 0 );
834 }
835 else
836 {
837 ret = mbedtls_x509_crt_parse( &( cert->cert ),
838 (const unsigned char *) mbedtls_test_cli_crt_ec_der,
839 mbedtls_test_cli_crt_ec_len );
840 TEST_ASSERT( ret == 0 );
841
842 ret = mbedtls_pk_parse_key( &( cert->pkey ),
843 (const unsigned char *) mbedtls_test_cli_key_ec_der,
Manuel Pégourié-Gonnard84dea012021-06-15 11:29:26 +0200844 mbedtls_test_cli_key_ec_der_len, NULL, 0,
845 mbedtls_test_rnd_std_rand, NULL );
Andrzej Kurekb2980742020-02-02 19:25:26 -0500846 TEST_ASSERT( ret == 0 );
847 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100848 }
849
850 mbedtls_ssl_conf_ca_chain( &( ep->conf ), &( cert->ca_cert ), NULL );
851
Andrzej Kurekb2980742020-02-02 19:25:26 -0500852 ret = mbedtls_ssl_conf_own_cert( &( ep->conf ), &( cert->cert ),
853 &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100854 TEST_ASSERT( ret == 0 );
Glenn Strauss36872db2022-01-22 05:06:31 -0500855 TEST_ASSERT( ep->conf.key_cert != NULL );
856
857 ret = mbedtls_ssl_conf_own_cert( &( ep->conf ), NULL, NULL );
858 TEST_ASSERT( ret == 0 );
859 TEST_ASSERT( ep->conf.key_cert == NULL );
860
861 ret = mbedtls_ssl_conf_own_cert( &( ep->conf ), &( cert->cert ),
862 &( cert->pkey ) );
863 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100864
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100865exit:
866 if( ret != 0 )
867 {
868 mbedtls_x509_crt_free( &( cert->ca_cert ) );
869 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100870 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100871 }
872
873 return ret;
874}
875
876/*
877 * Initializes \p ep structure. It is important to call `mbedtls_endpoint_free()`
878 * after calling this function even if it fails.
879 *
880 * \p endpoint_type must be set as MBEDTLS_SSL_IS_SERVER or
881 * MBEDTLS_SSL_IS_CLIENT.
Andrzej Kurek15daf502020-02-12 09:17:52 -0500882 * \p pk_alg the algorithm to use, currently only MBEDTLS_PK_RSA and
883 * MBEDTLS_PK_ECDSA are supported.
884 * \p dtls_context - in case of DTLS - this is the context handling metadata.
885 * \p input_queue - used only in case of DTLS.
886 * \p output_queue - used only in case of DTLS.
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100887 *
888 * \retval 0 on success, otherwise error code.
889 */
Jerry Yud8c57fe2022-04-30 15:15:34 +0800890
Andrzej Kurek15daf502020-02-12 09:17:52 -0500891int mbedtls_endpoint_init( mbedtls_endpoint *ep, int endpoint_type, int pk_alg,
892 mbedtls_test_message_socket_context *dtls_context,
893 mbedtls_test_message_queue *input_queue,
Andrzej Kurek74394a52022-03-08 06:50:12 -0500894 mbedtls_test_message_queue *output_queue,
895 uint16_t* group_list )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100896{
897 int ret = -1;
Gilles Peskine80dae042022-01-21 23:50:39 +0100898 uintptr_t user_data_n;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100899
Andrzej Kurek15daf502020-02-12 09:17:52 -0500900 if( dtls_context != NULL && ( input_queue == NULL || output_queue == NULL ) )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100901 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Andrzej Kurek15daf502020-02-12 09:17:52 -0500902
903 if( ep == NULL )
904 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100905
906 memset( ep, 0, sizeof( *ep ) );
907
908 ep->name = ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ? "Server" : "Client";
909
910 mbedtls_ssl_init( &( ep->ssl ) );
911 mbedtls_ssl_config_init( &( ep->conf ) );
912 mbedtls_ctr_drbg_init( &( ep->ctr_drbg ) );
913 mbedtls_ssl_conf_rng( &( ep->conf ),
914 mbedtls_ctr_drbg_random,
915 &( ep->ctr_drbg ) );
916 mbedtls_entropy_init( &( ep->entropy ) );
Gilles Peskine80dae042022-01-21 23:50:39 +0100917
918 TEST_ASSERT( mbedtls_ssl_conf_get_user_data_p( &ep->conf ) == NULL );
919 TEST_EQUAL( mbedtls_ssl_conf_get_user_data_n( &ep->conf ), 0 );
920 TEST_ASSERT( mbedtls_ssl_get_user_data_p( &ep->ssl ) == NULL );
921 TEST_EQUAL( mbedtls_ssl_get_user_data_n( &ep->ssl ), 0 );
922
923 (void) mbedtls_test_rnd_std_rand( NULL,
924 (void*) &user_data_n,
925 sizeof( user_data_n ) );
926 mbedtls_ssl_conf_set_user_data_n( &ep->conf, user_data_n );
927 mbedtls_ssl_set_user_data_n( &ep->ssl, user_data_n );
928
Andrzej Kurek15daf502020-02-12 09:17:52 -0500929 if( dtls_context != NULL )
930 {
931 TEST_ASSERT( mbedtls_message_socket_setup( input_queue, output_queue,
932 100, &( ep->socket ),
933 dtls_context ) == 0 );
934 }
935 else
936 {
937 mbedtls_mock_socket_init( &( ep->socket ) );
938 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100939
940 ret = mbedtls_ctr_drbg_seed( &( ep->ctr_drbg ), mbedtls_entropy_func,
941 &( ep->entropy ), (const unsigned char *) ( ep->name ),
942 strlen( ep->name ) );
943 TEST_ASSERT( ret == 0 );
944
945 /* Non-blocking callbacks without timeout */
Andrzej Kurek15daf502020-02-12 09:17:52 -0500946 if( dtls_context != NULL )
947 {
948 mbedtls_ssl_set_bio( &( ep->ssl ), dtls_context,
949 mbedtls_mock_tcp_send_msg,
950 mbedtls_mock_tcp_recv_msg,
951 NULL );
952 }
953 else
954 {
955 mbedtls_ssl_set_bio( &( ep->ssl ), &( ep->socket ),
956 mbedtls_mock_tcp_send_nb,
957 mbedtls_mock_tcp_recv_nb,
958 NULL );
959 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100960
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100961 ret = mbedtls_ssl_config_defaults( &( ep->conf ), endpoint_type,
Andrzej Kurek15daf502020-02-12 09:17:52 -0500962 ( dtls_context != NULL ) ?
963 MBEDTLS_SSL_TRANSPORT_DATAGRAM :
964 MBEDTLS_SSL_TRANSPORT_STREAM,
965 MBEDTLS_SSL_PRESET_DEFAULT );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100966 TEST_ASSERT( ret == 0 );
967
Andrzej Kurek74394a52022-03-08 06:50:12 -0500968 if( group_list != NULL )
969 mbedtls_ssl_conf_groups( &(ep->conf), group_list );
970
Ronald Cronbdddaef2022-06-07 10:34:59 +0200971 mbedtls_ssl_conf_authmode( &( ep->conf ), MBEDTLS_SSL_VERIFY_REQUIRED );
972
Andrzej Kurek1a44a152020-02-07 08:21:32 -0500973 ret = mbedtls_ssl_setup( &( ep->ssl ), &( ep->conf ) );
974 TEST_ASSERT( ret == 0 );
Andrzej Kurek15daf502020-02-12 09:17:52 -0500975
976#if defined(MBEDTLS_SSL_PROTO_DTLS) && defined(MBEDTLS_SSL_SRV_C)
977 if( endpoint_type == MBEDTLS_SSL_IS_SERVER && dtls_context != NULL )
978 mbedtls_ssl_conf_dtls_cookies( &( ep->conf ), NULL, NULL, NULL );
979#endif
980
Andrzej Kurekb2980742020-02-02 19:25:26 -0500981 ret = mbedtls_endpoint_certificate_init( ep, pk_alg );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100982 TEST_ASSERT( ret == 0 );
983
Gilles Peskine80dae042022-01-21 23:50:39 +0100984 TEST_EQUAL( mbedtls_ssl_conf_get_user_data_n( &ep->conf ), user_data_n );
985 mbedtls_ssl_conf_set_user_data_p( &ep->conf, ep );
986 TEST_EQUAL( mbedtls_ssl_get_user_data_n( &ep->ssl ), user_data_n );
987 mbedtls_ssl_set_user_data_p( &ep->ssl, ep );
988
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100989exit:
990 return ret;
991}
992
993/*
994 * Deinitializes certificates from endpoint represented by \p ep.
995 */
996void mbedtls_endpoint_certificate_free( mbedtls_endpoint *ep )
997{
998 mbedtls_endpoint_certificate *cert = &( ep->cert );
999 mbedtls_x509_crt_free( &( cert->ca_cert ) );
1000 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001001 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001002}
1003
1004/*
1005 * Deinitializes endpoint represented by \p ep.
1006 */
Andrzej Kurek15daf502020-02-12 09:17:52 -05001007void mbedtls_endpoint_free( mbedtls_endpoint *ep,
1008 mbedtls_test_message_socket_context *context )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001009{
1010 mbedtls_endpoint_certificate_free( ep );
1011
1012 mbedtls_ssl_free( &( ep->ssl ) );
1013 mbedtls_ssl_config_free( &( ep->conf ) );
1014 mbedtls_ctr_drbg_free( &( ep->ctr_drbg ) );
1015 mbedtls_entropy_free( &( ep->entropy ) );
Andrzej Kurek15daf502020-02-12 09:17:52 -05001016
1017 if( context != NULL )
1018 {
1019 mbedtls_message_socket_close( context );
1020 }
1021 else
1022 {
1023 mbedtls_mock_socket_close( &( ep->socket ) );
1024 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001025}
1026
1027/*
1028 * This function moves ssl handshake from \p ssl to prescribed \p state.
1029 * /p second_ssl is used as second endpoint and their sockets have to be
1030 * connected before calling this function.
1031 *
1032 * \retval 0 on success, otherwise error code.
1033 */
1034int mbedtls_move_handshake_to_state( mbedtls_ssl_context *ssl,
1035 mbedtls_ssl_context *second_ssl,
1036 int state )
1037{
1038 enum { BUFFSIZE = 1024 };
1039 int max_steps = 1000;
1040 int ret = 0;
1041
1042 if( ssl == NULL || second_ssl == NULL )
1043 {
1044 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
1045 }
1046
1047 /* Perform communication via connected sockets */
1048 while( ( ssl->state != state ) && ( --max_steps >= 0 ) )
1049 {
1050 /* If /p second_ssl ends the handshake procedure before /p ssl then
1051 * there is no need to call the next step */
Paul Elliott27b0d942022-03-18 21:55:32 +00001052 if( !mbedtls_ssl_is_handshake_over( second_ssl ) )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001053 {
1054 ret = mbedtls_ssl_handshake_step( second_ssl );
1055 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
1056 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
1057 {
1058 return ret;
1059 }
1060 }
1061
1062 /* We only care about the \p ssl state and returns, so we call it last,
1063 * to leave the iteration as soon as the state is as expected. */
1064 ret = mbedtls_ssl_handshake_step( ssl );
1065 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
1066 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
1067 {
1068 return ret;
1069 }
1070 }
1071
1072 return ( max_steps >= 0 ) ? ret : -1;
1073}
1074
Manuel Pégourié-Gonnardd12402f2020-05-20 10:34:25 +02001075#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001076
Janos Follath3766ba52019-11-27 13:31:42 +00001077/*
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001078 * Write application data. Increase write counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001079 */
1080int mbedtls_ssl_write_fragment( mbedtls_ssl_context *ssl, unsigned char *buf,
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001081 int buf_len, int *written,
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001082 const int expected_fragments )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001083{
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001084 int ret = mbedtls_ssl_write( ssl, buf + *written, buf_len - *written );
1085 if( ret > 0 )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001086 {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001087 *written += ret;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001088 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001089
1090 if( expected_fragments == 0 )
1091 {
1092 /* Used for DTLS and the message size larger than MFL. In that case
1093 * the message can not be fragmented and the library should return
1094 * MBEDTLS_ERR_SSL_BAD_INPUT_DATA error. This error must be returned
1095 * to prevent a dead loop inside mbedtls_exchange_data(). */
1096 return ret;
1097 }
1098 else if( expected_fragments == 1 )
1099 {
1100 /* Used for TLS/DTLS and the message size lower than MFL */
1101 TEST_ASSERT( ret == buf_len ||
1102 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1103 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1104 }
1105 else
1106 {
1107 /* Used for TLS and the message size larger than MFL */
1108 TEST_ASSERT( expected_fragments > 1 );
1109 TEST_ASSERT( ( ret >= 0 && ret <= buf_len ) ||
1110 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1111 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1112 }
1113
1114 return 0;
1115
1116exit:
1117 /* Some of the tests failed */
1118 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001119}
1120
1121/*
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001122 * Read application data and increase read counter and fragments counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001123 */
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001124int mbedtls_ssl_read_fragment( mbedtls_ssl_context *ssl, unsigned char *buf,
1125 int buf_len, int *read,
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001126 int *fragments, const int expected_fragments )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001127{
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001128 int ret = mbedtls_ssl_read( ssl, buf + *read, buf_len - *read );
1129 if( ret > 0 )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001130 {
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001131 ( *fragments )++;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001132 *read += ret;
1133 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001134
1135 if( expected_fragments == 0 )
1136 {
1137 TEST_ASSERT( ret == 0 );
1138 }
1139 else if( expected_fragments == 1 )
1140 {
1141 TEST_ASSERT( ret == buf_len ||
1142 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1143 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1144 }
1145 else
1146 {
1147 TEST_ASSERT( expected_fragments > 1 );
1148 TEST_ASSERT( ( ret >= 0 && ret <= buf_len ) ||
1149 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1150 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1151 }
1152
1153 return 0;
1154
1155exit:
1156 /* Some of the tests failed */
1157 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001158}
1159
1160/*
Hanno Beckera18d1322018-01-03 14:27:32 +00001161 * Helper function setting up inverse record transformations
1162 * using given cipher, hash, EtM mode, authentication tag length,
1163 * and version.
1164 */
1165
1166#define CHK( x ) \
1167 do \
1168 { \
1169 if( !( x ) ) \
Hanno Becker81e16a32019-03-01 11:21:44 +00001170 { \
Hanno Beckera5780f12019-04-05 09:55:37 +01001171 ret = -1; \
Hanno Becker81e16a32019-03-01 11:21:44 +00001172 goto cleanup; \
1173 } \
Hanno Beckera18d1322018-01-03 14:27:32 +00001174 } while( 0 )
1175
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001176void set_ciphersuite( mbedtls_ssl_config *conf, const char *cipher,
1177 int* forced_ciphersuite )
1178{
1179 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
1180 forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( cipher );
1181 forced_ciphersuite[1] = 0;
1182
1183 ciphersuite_info =
1184 mbedtls_ssl_ciphersuite_from_id( forced_ciphersuite[0] );
1185
1186 TEST_ASSERT( ciphersuite_info != NULL );
Glenn Strauss60bfe602022-03-14 19:04:24 -04001187 TEST_ASSERT( ciphersuite_info->min_tls_version <= conf->max_tls_version );
1188 TEST_ASSERT( ciphersuite_info->max_tls_version >= conf->min_tls_version );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001189
Glenn Strauss60bfe602022-03-14 19:04:24 -04001190 if( conf->max_tls_version > ciphersuite_info->max_tls_version )
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001191 {
Glenn Strauss60bfe602022-03-14 19:04:24 -04001192 conf->max_tls_version = ciphersuite_info->max_tls_version;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001193 }
Glenn Strauss60bfe602022-03-14 19:04:24 -04001194 if( conf->min_tls_version < ciphersuite_info->min_tls_version )
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001195 {
Glenn Strauss60bfe602022-03-14 19:04:24 -04001196 conf->min_tls_version = ciphersuite_info->min_tls_version;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001197 }
1198
1199 mbedtls_ssl_conf_ciphersuites( conf, forced_ciphersuite );
1200
1201exit:
1202 return;
1203}
1204
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05001205int psk_dummy_callback( void *p_info, mbedtls_ssl_context *ssl,
1206 const unsigned char *name, size_t name_len )
1207{
1208 (void) p_info;
1209 (void) ssl;
1210 (void) name;
1211 (void) name_len;
1212
1213 return ( 0 );
1214}
1215
Hanno Beckerd856c822019-04-29 17:30:59 +01001216#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
1217#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
1218#else
1219#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
1220#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001221
Gilles Peskine9c656ec2022-02-26 19:55:58 +01001222#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1223 defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_AES_C)
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001224static int psa_cipher_encrypt_helper( mbedtls_ssl_transform *transform,
1225 const unsigned char *iv, size_t iv_len,
1226 const unsigned char *input, size_t ilen,
1227 unsigned char *output, size_t *olen )
1228{
Przemyslaw Stekiel5648d572022-02-03 14:09:02 +01001229#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemyslaw Stekield66387f2022-02-03 08:55:33 +01001230 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001231 psa_cipher_operation_t cipher_op = PSA_CIPHER_OPERATION_INIT;
1232 size_t part_len;
1233
1234 status = psa_cipher_encrypt_setup( &cipher_op,
1235 transform->psa_key_enc, transform->psa_alg );
1236
1237 if( status != PSA_SUCCESS )
1238 return( psa_ssl_status_to_mbedtls( status ) );
1239
1240 status = psa_cipher_set_iv( &cipher_op, iv, iv_len );
1241
1242 if( status != PSA_SUCCESS )
1243 return( psa_ssl_status_to_mbedtls( status ) );
1244
1245 status = psa_cipher_update( &cipher_op,
1246 input, ilen, output, ilen, olen );
1247
1248 if( status != PSA_SUCCESS )
1249 return( psa_ssl_status_to_mbedtls( status ) );
1250
1251 status = psa_cipher_finish( &cipher_op,
1252 output + *olen, ilen - *olen, &part_len );
1253
1254 if( status != PSA_SUCCESS )
1255 return( psa_ssl_status_to_mbedtls( status ) );
1256
1257 *olen += part_len;
1258 return( 0 );
Przemyslaw Stekiel5648d572022-02-03 14:09:02 +01001259#else
1260 return mbedtls_cipher_crypt( &transform->cipher_ctx_enc,
1261 iv, iv_len, input, ilen, output, olen );
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001262#endif /* MBEDTLS_USE_PSA_CRYPTO */
Przemyslaw Stekiel5648d572022-02-03 14:09:02 +01001263}
Gilles Peskine9c656ec2022-02-26 19:55:58 +01001264#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_AES_C */
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001265
Hanno Beckera18d1322018-01-03 14:27:32 +00001266static int build_transforms( mbedtls_ssl_transform *t_in,
1267 mbedtls_ssl_transform *t_out,
1268 int cipher_type, int hash_id,
Glenn Strauss07c64162022-03-14 12:34:51 -04001269 int etm, int tag_mode,
1270 mbedtls_ssl_protocol_version tls_version,
Hanno Beckerd856c822019-04-29 17:30:59 +01001271 size_t cid0_len,
1272 size_t cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00001273{
1274 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +01001275 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +00001276
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001277#if defined(MBEDTLS_USE_PSA_CRYPTO)
1278 psa_key_type_t key_type;
1279 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1280 psa_algorithm_t alg;
1281 size_t key_bits;
Przemyslaw Stekield66387f2022-02-03 08:55:33 +01001282 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001283#endif
1284
Hanno Beckera18d1322018-01-03 14:27:32 +00001285 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +00001286 unsigned char *key0 = NULL, *key1 = NULL;
Paul Elliott6f1eda72020-06-11 20:22:00 +01001287 unsigned char *md0 = NULL, *md1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001288 unsigned char iv_enc[16], iv_dec[16];
1289
Hanno Beckera0e20d02019-05-15 14:03:01 +01001290#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001291 unsigned char cid0[ SSL_CID_LEN_MIN ];
1292 unsigned char cid1[ SSL_CID_LEN_MIN ];
1293
Ronald Cron351f0ee2020-06-10 12:12:18 +02001294 mbedtls_test_rnd_std_rand( NULL, cid0, sizeof( cid0 ) );
1295 mbedtls_test_rnd_std_rand( NULL, cid1, sizeof( cid1 ) );
Hanno Becker43c24b82019-05-01 09:45:57 +01001296#else
1297 ((void) cid0_len);
1298 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +01001299#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001300
Hanno Beckera18d1322018-01-03 14:27:32 +00001301 maclen = 0;
1302
1303 /* Pick cipher */
1304 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
1305 CHK( cipher_info != NULL );
1306 CHK( cipher_info->iv_size <= 16 );
1307 CHK( cipher_info->key_bitlen % 8 == 0 );
1308
1309 /* Pick keys */
1310 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +01001311 /* Allocate `keylen + 1` bytes to ensure that we get
1312 * a non-NULL pointers from `mbedtls_calloc` even if
1313 * `keylen == 0` in the case of the NULL cipher. */
1314 CHK( ( key0 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
1315 CHK( ( key1 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001316 memset( key0, 0x1, keylen );
1317 memset( key1, 0x2, keylen );
1318
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001319#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckera18d1322018-01-03 14:27:32 +00001320 /* Setup cipher contexts */
1321 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_enc, cipher_info ) == 0 );
1322 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_dec, cipher_info ) == 0 );
1323 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_enc, cipher_info ) == 0 );
1324 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_dec, cipher_info ) == 0 );
1325
1326#if defined(MBEDTLS_CIPHER_MODE_CBC)
1327 if( cipher_info->mode == MBEDTLS_MODE_CBC )
1328 {
1329 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_enc,
1330 MBEDTLS_PADDING_NONE ) == 0 );
1331 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_dec,
1332 MBEDTLS_PADDING_NONE ) == 0 );
1333 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_enc,
1334 MBEDTLS_PADDING_NONE ) == 0 );
1335 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_dec,
1336 MBEDTLS_PADDING_NONE ) == 0 );
1337 }
1338#endif /* MBEDTLS_CIPHER_MODE_CBC */
1339
1340 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_enc, key0,
1341 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1342 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_dec, key1,
1343 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
1344 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_enc, key1,
1345 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1346 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_dec, key0,
1347 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001348#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001349
1350 /* Setup MAC contexts */
Hanno Beckerfd86ca82020-11-30 08:54:23 +00001351#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001352 if( cipher_info->mode == MBEDTLS_MODE_CBC ||
1353 cipher_info->mode == MBEDTLS_MODE_STREAM )
1354 {
1355 mbedtls_md_info_t const *md_info;
Hanno Beckera18d1322018-01-03 14:27:32 +00001356
1357 /* Pick hash */
1358 md_info = mbedtls_md_info_from_type( hash_id );
1359 CHK( md_info != NULL );
1360
1361 /* Pick hash keys */
1362 maclen = mbedtls_md_get_size( md_info );
Hanno Becker3ee54212019-04-04 16:31:26 +01001363 CHK( ( md0 = mbedtls_calloc( 1, maclen ) ) != NULL );
1364 CHK( ( md1 = mbedtls_calloc( 1, maclen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001365 memset( md0, 0x5, maclen );
1366 memset( md1, 0x6, maclen );
1367
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001368#if defined(MBEDTLS_USE_PSA_CRYPTO)
1369 alg = mbedtls_psa_translate_md( mbedtls_md_get_type( md_info ) );
1370
1371 CHK( alg != 0 );
1372
1373 t_out->psa_mac_alg = PSA_ALG_HMAC( alg );
1374 t_in->psa_mac_alg = PSA_ALG_HMAC( alg );
1375 t_in->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
1376 t_out->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
1377 t_in->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
1378 t_out->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
1379
1380 psa_reset_key_attributes( &attributes );
1381 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
1382 psa_set_key_algorithm( &attributes, PSA_ALG_HMAC( alg ) );
1383 psa_set_key_type( &attributes, PSA_KEY_TYPE_HMAC );
1384
1385 CHK( psa_import_key( &attributes,
1386 md0, maclen,
1387 &t_in->psa_mac_enc ) == PSA_SUCCESS );
1388
1389 CHK( psa_import_key( &attributes,
1390 md1, maclen,
1391 &t_out->psa_mac_enc ) == PSA_SUCCESS );
1392
Neil Armstrong8f92bf32022-03-18 09:56:57 +01001393 if( cipher_info->mode == MBEDTLS_MODE_STREAM ||
1394 etm == MBEDTLS_SSL_ETM_DISABLED )
1395 /* mbedtls_ct_hmac() requires the key to be exportable */
1396 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT |
1397 PSA_KEY_USAGE_VERIFY_HASH );
1398 else
1399 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001400
1401 CHK( psa_import_key( &attributes,
1402 md1, maclen,
1403 &t_in->psa_mac_dec ) == PSA_SUCCESS );
1404
1405 CHK( psa_import_key( &attributes,
1406 md0, maclen,
1407 &t_out->psa_mac_dec ) == PSA_SUCCESS );
Neil Armstrongcf8841a2022-02-24 11:17:45 +01001408#else
Hanno Beckera18d1322018-01-03 14:27:32 +00001409 CHK( mbedtls_md_setup( &t_out->md_ctx_enc, md_info, 1 ) == 0 );
1410 CHK( mbedtls_md_setup( &t_out->md_ctx_dec, md_info, 1 ) == 0 );
1411 CHK( mbedtls_md_setup( &t_in->md_ctx_enc, md_info, 1 ) == 0 );
1412 CHK( mbedtls_md_setup( &t_in->md_ctx_dec, md_info, 1 ) == 0 );
1413
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01001414 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_enc,
1415 md0, maclen ) == 0 );
1416 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_dec,
1417 md1, maclen ) == 0 );
1418 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_enc,
1419 md1, maclen ) == 0 );
1420 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_dec,
1421 md0, maclen ) == 0 );
Neil Armstrongcf8841a2022-02-24 11:17:45 +01001422#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001423 }
1424#else
1425 ((void) hash_id);
Hanno Beckerfd86ca82020-11-30 08:54:23 +00001426#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Hanno Beckera18d1322018-01-03 14:27:32 +00001427
1428
1429 /* Pick IV's (regardless of whether they
1430 * are being used by the transform). */
1431 ivlen = cipher_info->iv_size;
1432 memset( iv_enc, 0x3, sizeof( iv_enc ) );
1433 memset( iv_dec, 0x4, sizeof( iv_dec ) );
1434
1435 /*
1436 * Setup transforms
1437 */
1438
Jaeden Amero2de07f12019-06-05 13:32:08 +01001439#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
Hanno Beckerfd86ca82020-11-30 08:54:23 +00001440 defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001441 t_out->encrypt_then_mac = etm;
1442 t_in->encrypt_then_mac = etm;
1443#else
1444 ((void) etm);
1445#endif
1446
Glenn Strauss07c64162022-03-14 12:34:51 -04001447 t_out->tls_version = tls_version;
1448 t_in->tls_version = tls_version;
Hanno Beckera18d1322018-01-03 14:27:32 +00001449 t_out->ivlen = ivlen;
1450 t_in->ivlen = ivlen;
1451
1452 switch( cipher_info->mode )
1453 {
1454 case MBEDTLS_MODE_GCM:
1455 case MBEDTLS_MODE_CCM:
Ronald Cron6f135e12021-12-08 16:57:54 +01001456#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Glenn Strauss07c64162022-03-14 12:34:51 -04001457 if( tls_version == MBEDTLS_SSL_VERSION_TLS1_3 )
Hanno Beckere6832872020-05-28 08:29:58 +01001458 {
1459 t_out->fixed_ivlen = 12;
1460 t_in->fixed_ivlen = 12;
1461 }
1462 else
Ronald Cron6f135e12021-12-08 16:57:54 +01001463#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckere6832872020-05-28 08:29:58 +01001464 {
1465 t_out->fixed_ivlen = 4;
1466 t_in->fixed_ivlen = 4;
1467 }
Hanno Beckera18d1322018-01-03 14:27:32 +00001468 t_out->maclen = 0;
1469 t_in->maclen = 0;
1470 switch( tag_mode )
1471 {
1472 case 0: /* Full tag */
1473 t_out->taglen = 16;
1474 t_in->taglen = 16;
1475 break;
1476 case 1: /* Partial tag */
1477 t_out->taglen = 8;
1478 t_in->taglen = 8;
1479 break;
1480 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001481 ret = 1;
1482 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001483 }
1484 break;
1485
1486 case MBEDTLS_MODE_CHACHAPOLY:
1487 t_out->fixed_ivlen = 12;
1488 t_in->fixed_ivlen = 12;
1489 t_out->maclen = 0;
1490 t_in->maclen = 0;
1491 switch( tag_mode )
1492 {
1493 case 0: /* Full tag */
1494 t_out->taglen = 16;
1495 t_in->taglen = 16;
1496 break;
1497 case 1: /* Partial tag */
1498 t_out->taglen = 8;
1499 t_in->taglen = 8;
1500 break;
1501 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001502 ret = 1;
1503 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001504 }
1505 break;
1506
1507 case MBEDTLS_MODE_STREAM:
1508 case MBEDTLS_MODE_CBC:
1509 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1510 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1511 t_out->taglen = 0;
1512 t_in->taglen = 0;
1513 switch( tag_mode )
1514 {
1515 case 0: /* Full tag */
1516 t_out->maclen = maclen;
1517 t_in->maclen = maclen;
1518 break;
Hanno Beckera18d1322018-01-03 14:27:32 +00001519 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001520 ret = 1;
1521 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001522 }
1523 break;
1524 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001525 ret = 1;
1526 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001527 break;
1528 }
1529
1530 /* Setup IV's */
1531
1532 memcpy( &t_in->iv_dec, iv_dec, sizeof( iv_dec ) );
1533 memcpy( &t_in->iv_enc, iv_enc, sizeof( iv_enc ) );
1534 memcpy( &t_out->iv_dec, iv_enc, sizeof( iv_enc ) );
1535 memcpy( &t_out->iv_enc, iv_dec, sizeof( iv_dec ) );
1536
Hanno Beckera0e20d02019-05-15 14:03:01 +01001537#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001538 /* Add CID */
1539 memcpy( &t_in->in_cid, cid0, cid0_len );
1540 memcpy( &t_in->out_cid, cid1, cid1_len );
1541 t_in->in_cid_len = cid0_len;
1542 t_in->out_cid_len = cid1_len;
1543 memcpy( &t_out->in_cid, cid1, cid1_len );
1544 memcpy( &t_out->out_cid, cid0, cid0_len );
1545 t_out->in_cid_len = cid1_len;
1546 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001547#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001548
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001549#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemyslaw Stekielf57b4562022-01-25 00:04:18 +01001550 status = mbedtls_ssl_cipher_to_psa( cipher_type,
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001551 t_in->taglen,
1552 &alg,
1553 &key_type,
1554 &key_bits );
1555
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01001556 if ( status != PSA_SUCCESS )
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001557 {
Przemyslaw Stekiel77aec8d2022-01-31 20:22:53 +01001558 ret = psa_ssl_status_to_mbedtls( status );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001559 goto cleanup;
1560 }
1561
1562 t_in->psa_alg = alg;
1563 t_out->psa_alg = alg;
1564
1565 if ( alg != MBEDTLS_SSL_NULL_CIPHER )
1566 {
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001567 psa_reset_key_attributes( &attributes );
Przemyslaw Stekielf4ca3f02022-01-25 00:25:59 +01001568 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001569 psa_set_key_algorithm( &attributes, alg );
1570 psa_set_key_type( &attributes, key_type );
1571
1572 status = psa_import_key( &attributes,
1573 key0,
1574 PSA_BITS_TO_BYTES( key_bits ),
1575 &t_in->psa_key_enc );
1576
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01001577 if ( status != PSA_SUCCESS )
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001578 {
Przemyslaw Stekiel77aec8d2022-01-31 20:22:53 +01001579 ret = psa_ssl_status_to_mbedtls( status );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001580 goto cleanup;
1581 }
1582
1583 status = psa_import_key( &attributes,
1584 key1,
1585 PSA_BITS_TO_BYTES( key_bits ),
Przemyslaw Stekielf4ca3f02022-01-25 00:25:59 +01001586 &t_out->psa_key_enc );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001587
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01001588 if ( status != PSA_SUCCESS )
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001589 {
Przemyslaw Stekiel77aec8d2022-01-31 20:22:53 +01001590 ret = psa_ssl_status_to_mbedtls( status );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001591 goto cleanup;
1592 }
1593
Przemyslaw Stekielf4ca3f02022-01-25 00:25:59 +01001594 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
1595
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001596 status = psa_import_key( &attributes,
1597 key1,
1598 PSA_BITS_TO_BYTES( key_bits ),
Przemyslaw Stekielf4ca3f02022-01-25 00:25:59 +01001599 &t_in->psa_key_dec );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001600
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01001601 if ( status != PSA_SUCCESS )
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001602 {
Przemyslaw Stekiel77aec8d2022-01-31 20:22:53 +01001603 ret = psa_ssl_status_to_mbedtls( status );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001604 goto cleanup;
1605 }
1606
1607 status = psa_import_key( &attributes,
1608 key0,
1609 PSA_BITS_TO_BYTES( key_bits ),
1610 &t_out->psa_key_dec );
1611
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01001612 if ( status != PSA_SUCCESS )
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001613 {
Przemyslaw Stekiel77aec8d2022-01-31 20:22:53 +01001614 ret = psa_ssl_status_to_mbedtls( status );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001615 goto cleanup;
1616 }
1617 }
1618#endif /* MBEDTLS_USE_PSA_CRYPTO */
1619
Hanno Becker81e16a32019-03-01 11:21:44 +00001620cleanup:
1621
Hanno Becker3ee54212019-04-04 16:31:26 +01001622 mbedtls_free( key0 );
1623 mbedtls_free( key1 );
Hanno Becker81e16a32019-03-01 11:21:44 +00001624
Paul Elliott6f1eda72020-06-11 20:22:00 +01001625 mbedtls_free( md0 );
1626 mbedtls_free( md1 );
1627
Hanno Beckera5780f12019-04-05 09:55:37 +01001628 return( ret );
Hanno Beckera18d1322018-01-03 14:27:32 +00001629}
1630
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001631/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001632 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001633 * Choose dummy values, mostly non-0 to distinguish from the init default.
1634 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01001635static int ssl_populate_session_tls12( mbedtls_ssl_session *session,
1636 int ticket_len,
1637 const char *crt_file )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001638{
1639#if defined(MBEDTLS_HAVE_TIME)
1640 session->start = mbedtls_time( NULL ) - 42;
1641#endif
Glenn Straussda7851c2022-03-14 13:29:48 -04001642 session->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001643 session->ciphersuite = 0xabcd;
1644 session->compression = 1;
1645 session->id_len = sizeof( session->id );
1646 memset( session->id, 66, session->id_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001647 memset( session->master, 17, sizeof( session->master ) );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001648
Manuel Pégourié-Gonnard1f6033a2019-05-24 10:17:52 +02001649#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_FS_IO)
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01001650 if( crt_file != NULL && strlen( crt_file ) != 0 )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001651 {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001652 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001653 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001654
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001655 mbedtls_x509_crt_init( &tmp_crt );
1656 ret = mbedtls_x509_crt_parse_file( &tmp_crt, crt_file );
1657 if( ret != 0 )
1658 return( ret );
1659
1660#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1661 /* Move temporary CRT. */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001662 session->peer_cert = mbedtls_calloc( 1, sizeof( *session->peer_cert ) );
1663 if( session->peer_cert == NULL )
1664 return( -1 );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001665 *session->peer_cert = tmp_crt;
1666 memset( &tmp_crt, 0, sizeof( tmp_crt ) );
1667#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1668 /* Calculate digest of temporary CRT. */
1669 session->peer_cert_digest =
1670 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
1671 if( session->peer_cert_digest == NULL )
1672 return( -1 );
1673 ret = mbedtls_md( mbedtls_md_info_from_type(
1674 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
1675 tmp_crt.raw.p, tmp_crt.raw.len,
1676 session->peer_cert_digest );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001677 if( ret != 0 )
1678 return( ret );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001679 session->peer_cert_digest_type =
1680 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1681 session->peer_cert_digest_len =
1682 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1683#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1684
1685 mbedtls_x509_crt_free( &tmp_crt );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001686 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001687#else /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001688 (void) crt_file;
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001689#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001690 session->verify_result = 0xdeadbeef;
1691
1692#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
1693 if( ticket_len != 0 )
1694 {
1695 session->ticket = mbedtls_calloc( 1, ticket_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001696 if( session->ticket == NULL )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001697 return( -1 );
1698 memset( session->ticket, 33, ticket_len );
1699 }
1700 session->ticket_len = ticket_len;
1701 session->ticket_lifetime = 86401;
1702#else
1703 (void) ticket_len;
1704#endif
1705
1706#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1707 session->mfl_code = 1;
1708#endif
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001709#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1710 session->encrypt_then_mac = 1;
1711#endif
1712
1713 return( 0 );
1714}
1715
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001716/*
1717 * Perform data exchanging between \p ssl_1 and \p ssl_2 and check if the
1718 * message was sent in the correct number of fragments.
1719 *
1720 * /p ssl_1 and /p ssl_2 Endpoints represented by mbedtls_ssl_context. Both
1721 * of them must be initialized and connected beforehand.
1722 * /p msg_len_1 and /p msg_len_2 specify the size of the message to send.
1723 * /p expected_fragments_1 and /p expected_fragments_2 determine in how many
1724 * fragments the message should be sent.
1725 * expected_fragments is 0: can be used for DTLS testing while the message
1726 * size is larger than MFL. In that case the message
1727 * cannot be fragmented and sent to the second endpoint.
1728 * This value can be used for negative tests.
1729 * expected_fragments is 1: can be used for TLS/DTLS testing while the
1730 * message size is below MFL
1731 * expected_fragments > 1: can be used for TLS testing while the message
1732 * size is larger than MFL
1733 *
1734 * \retval 0 on success, otherwise error code.
1735 */
1736int mbedtls_exchange_data( mbedtls_ssl_context *ssl_1,
1737 int msg_len_1, const int expected_fragments_1,
1738 mbedtls_ssl_context *ssl_2,
1739 int msg_len_2, const int expected_fragments_2 )
1740{
1741 unsigned char *msg_buf_1 = malloc( msg_len_1 );
1742 unsigned char *msg_buf_2 = malloc( msg_len_2 );
1743 unsigned char *in_buf_1 = malloc( msg_len_2 );
1744 unsigned char *in_buf_2 = malloc( msg_len_1 );
1745 int msg_type, ret = -1;
1746
1747 /* Perform this test with two message types. At first use a message
1748 * consisting of only 0x00 for the client and only 0xFF for the server.
1749 * At the second time use message with generated data */
1750 for( msg_type = 0; msg_type < 2; msg_type++ )
1751 {
1752 int written_1 = 0;
1753 int written_2 = 0;
1754 int read_1 = 0;
1755 int read_2 = 0;
1756 int fragments_1 = 0;
1757 int fragments_2 = 0;
1758
1759 if( msg_type == 0 )
1760 {
1761 memset( msg_buf_1, 0x00, msg_len_1 );
1762 memset( msg_buf_2, 0xff, msg_len_2 );
1763 }
1764 else
1765 {
1766 int i, j = 0;
1767 for( i = 0; i < msg_len_1; i++ )
1768 {
1769 msg_buf_1[i] = j++ & 0xFF;
1770 }
1771 for( i = 0; i < msg_len_2; i++ )
1772 {
1773 msg_buf_2[i] = ( j -= 5 ) & 0xFF;
1774 }
1775 }
1776
1777 while( read_1 < msg_len_2 || read_2 < msg_len_1 )
1778 {
1779 /* ssl_1 sending */
1780 if( msg_len_1 > written_1 )
1781 {
1782 ret = mbedtls_ssl_write_fragment( ssl_1, msg_buf_1,
1783 msg_len_1, &written_1,
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001784 expected_fragments_1 );
1785 if( expected_fragments_1 == 0 )
1786 {
1787 /* This error is expected when the message is too large and
1788 * cannot be fragmented */
1789 TEST_ASSERT( ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1790 msg_len_1 = 0;
1791 }
1792 else
1793 {
1794 TEST_ASSERT( ret == 0 );
1795 }
1796 }
1797
1798 /* ssl_2 sending */
1799 if( msg_len_2 > written_2 )
1800 {
1801 ret = mbedtls_ssl_write_fragment( ssl_2, msg_buf_2,
1802 msg_len_2, &written_2,
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001803 expected_fragments_2 );
1804 if( expected_fragments_2 == 0 )
1805 {
1806 /* This error is expected when the message is too large and
1807 * cannot be fragmented */
1808 TEST_ASSERT( ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1809 msg_len_2 = 0;
1810 }
1811 else
1812 {
1813 TEST_ASSERT( ret == 0 );
1814 }
1815 }
1816
1817 /* ssl_1 reading */
1818 if( read_1 < msg_len_2 )
1819 {
1820 ret = mbedtls_ssl_read_fragment( ssl_1, in_buf_1,
1821 msg_len_2, &read_1,
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001822 &fragments_2,
1823 expected_fragments_2 );
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001824 TEST_ASSERT( ret == 0 );
1825 }
1826
1827 /* ssl_2 reading */
1828 if( read_2 < msg_len_1 )
1829 {
1830 ret = mbedtls_ssl_read_fragment( ssl_2, in_buf_2,
1831 msg_len_1, &read_2,
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001832 &fragments_1,
1833 expected_fragments_1 );
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001834 TEST_ASSERT( ret == 0 );
1835 }
1836 }
1837
1838 ret = -1;
1839 TEST_ASSERT( 0 == memcmp( msg_buf_1, in_buf_2, msg_len_1 ) );
1840 TEST_ASSERT( 0 == memcmp( msg_buf_2, in_buf_1, msg_len_2 ) );
1841 TEST_ASSERT( fragments_1 == expected_fragments_1 );
1842 TEST_ASSERT( fragments_2 == expected_fragments_2 );
1843 }
1844
1845 ret = 0;
1846
1847exit:
1848 free( msg_buf_1 );
1849 free( in_buf_1 );
1850 free( msg_buf_2 );
1851 free( in_buf_2 );
1852
1853 return ret;
1854}
1855
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001856/*
1857 * Perform data exchanging between \p ssl_1 and \p ssl_2. Both of endpoints
1858 * must be initialized and connected beforehand.
1859 *
1860 * \retval 0 on success, otherwise error code.
1861 */
1862int exchange_data( mbedtls_ssl_context *ssl_1,
1863 mbedtls_ssl_context *ssl_2 )
1864{
1865 return mbedtls_exchange_data( ssl_1, 256, 1,
1866 ssl_2, 256, 1 );
1867}
1868
Glenn Strauss39e624c2022-04-11 13:33:16 -04001869#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
1870 defined(MBEDTLS_ENTROPY_C) && \
1871 defined(MBEDTLS_CTR_DRBG_C)
1872static int check_ssl_version( mbedtls_ssl_protocol_version expected_negotiated_version,
1873 const mbedtls_ssl_context *ssl )
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001874{
1875 const char *version_string = mbedtls_ssl_get_version( ssl );
1876 mbedtls_ssl_protocol_version version_number =
1877 mbedtls_ssl_get_version_number( ssl );
1878
Glenn Strausse3af4cb2022-03-15 03:23:42 -04001879 TEST_EQUAL( ssl->tls_version, expected_negotiated_version );
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001880
1881 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
1882 {
1883 TEST_EQUAL( version_string[0], 'D' );
1884 ++version_string;
1885 }
1886
1887 switch( expected_negotiated_version )
1888 {
Glenn Strausse3af4cb2022-03-15 03:23:42 -04001889 case MBEDTLS_SSL_VERSION_TLS1_2:
Glenn Straussdff84622022-03-14 11:12:57 -04001890 TEST_EQUAL( version_number, MBEDTLS_SSL_VERSION_TLS1_2 );
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001891 TEST_ASSERT( strcmp( version_string, "TLSv1.2" ) == 0 );
1892 break;
1893
Glenn Strausse3af4cb2022-03-15 03:23:42 -04001894 case MBEDTLS_SSL_VERSION_TLS1_3:
Glenn Straussdff84622022-03-14 11:12:57 -04001895 TEST_EQUAL( version_number, MBEDTLS_SSL_VERSION_TLS1_3 );
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001896 TEST_ASSERT( strcmp( version_string, "TLSv1.3" ) == 0 );
1897 break;
1898
1899 default:
1900 TEST_ASSERT( ! "Version check not implemented for this protocol version" );
1901 }
1902
1903 return( 1 );
1904
1905exit:
1906 return( 0 );
1907}
Glenn Strauss39e624c2022-04-11 13:33:16 -04001908#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001909
1910
Manuel Pégourié-Gonnardd12402f2020-05-20 10:34:25 +02001911#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
1912 defined(MBEDTLS_ENTROPY_C) && \
1913 defined(MBEDTLS_CTR_DRBG_C)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001914void perform_handshake( handshake_test_options* options )
1915{
1916 /* forced_ciphersuite needs to last until the end of the handshake */
1917 int forced_ciphersuite[2];
1918 enum { BUFFSIZE = 17000 };
1919 mbedtls_endpoint client, server;
Gilles Peskineeccd8882020-03-10 12:19:08 +01001920#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001921 const char *psk_identity = "foo";
1922#endif
1923#if defined(MBEDTLS_TIMING_C)
1924 mbedtls_timing_delay_context timer_client, timer_server;
1925#endif
1926#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1927 unsigned char *context_buf = NULL;
1928 size_t context_buf_len;
1929#endif
1930#if defined(MBEDTLS_SSL_RENEGOTIATION)
1931 int ret = -1;
1932#endif
Paul Elliottc8570442020-04-15 17:00:50 +01001933 int expected_handshake_result = 0;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001934
Neil Armstrong46a17602022-02-23 15:11:16 +01001935 USE_PSA_INIT( );
1936
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001937 mbedtls_test_message_queue server_queue, client_queue;
1938 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05001939 mbedtls_message_socket_init( &server_context );
1940 mbedtls_message_socket_init( &client_context );
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001941
1942 /* Client side */
1943 if( options->dtls != 0 )
1944 {
1945 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
1946 options->pk_alg, &client_context,
1947 &client_queue,
Andrzej Kurek74394a52022-03-08 06:50:12 -05001948 &server_queue, NULL ) == 0 );
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001949#if defined(MBEDTLS_TIMING_C)
1950 mbedtls_ssl_set_timer_cb( &client.ssl, &timer_client,
1951 mbedtls_timing_set_delay,
1952 mbedtls_timing_get_delay );
1953#endif
1954 }
1955 else
1956 {
1957 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
1958 options->pk_alg, NULL, NULL,
Andrzej Kurek74394a52022-03-08 06:50:12 -05001959 NULL, NULL ) == 0 );
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001960 }
Paul Elliottc8570442020-04-15 17:00:50 +01001961
Glenn Strauss39e624c2022-04-11 13:33:16 -04001962 if( options->client_min_version != MBEDTLS_SSL_VERSION_UNKNOWN )
Paul Elliottc8570442020-04-15 17:00:50 +01001963 {
Glenn Strausse3af4cb2022-03-15 03:23:42 -04001964 mbedtls_ssl_conf_min_tls_version( &client.conf,
Paul Elliottc8570442020-04-15 17:00:50 +01001965 options->client_min_version );
1966 }
1967
Glenn Strauss39e624c2022-04-11 13:33:16 -04001968 if( options->client_max_version != MBEDTLS_SSL_VERSION_UNKNOWN )
Paul Elliottc8570442020-04-15 17:00:50 +01001969 {
Glenn Strausse3af4cb2022-03-15 03:23:42 -04001970 mbedtls_ssl_conf_max_tls_version( &client.conf,
Paul Elliottc8570442020-04-15 17:00:50 +01001971 options->client_max_version );
1972 }
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001973
1974 if( strlen( options->cipher ) > 0 )
1975 {
1976 set_ciphersuite( &client.conf, options->cipher, forced_ciphersuite );
1977 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001978
1979#if defined (MBEDTLS_DEBUG_C)
1980 if( options->cli_log_fun )
1981 {
1982 mbedtls_debug_set_threshold( 4 );
1983 mbedtls_ssl_conf_dbg( &client.conf, options->cli_log_fun,
1984 options->cli_log_obj );
1985 }
1986#endif
1987
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001988 /* Server side */
1989 if( options->dtls != 0 )
1990 {
1991 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
1992 options->pk_alg, &server_context,
1993 &server_queue,
Andrzej Kurek74394a52022-03-08 06:50:12 -05001994 &client_queue, NULL ) == 0 );
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001995#if defined(MBEDTLS_TIMING_C)
1996 mbedtls_ssl_set_timer_cb( &server.ssl, &timer_server,
1997 mbedtls_timing_set_delay,
1998 mbedtls_timing_get_delay );
1999#endif
2000 }
2001 else
2002 {
2003 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
Andrzej Kurek74394a52022-03-08 06:50:12 -05002004 options->pk_alg, NULL, NULL,
2005 NULL, NULL ) == 0 );
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002006 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002007
2008 mbedtls_ssl_conf_authmode( &server.conf, options->srv_auth_mode );
2009
Glenn Strauss39e624c2022-04-11 13:33:16 -04002010 if( options->server_min_version != MBEDTLS_SSL_VERSION_UNKNOWN )
Paul Elliottc8570442020-04-15 17:00:50 +01002011 {
Glenn Strausse3af4cb2022-03-15 03:23:42 -04002012 mbedtls_ssl_conf_min_tls_version( &server.conf,
Paul Elliottc8570442020-04-15 17:00:50 +01002013 options->server_min_version );
2014 }
2015
Glenn Strauss39e624c2022-04-11 13:33:16 -04002016 if( options->server_max_version != MBEDTLS_SSL_VERSION_UNKNOWN )
Paul Elliottc8570442020-04-15 17:00:50 +01002017 {
Glenn Strausse3af4cb2022-03-15 03:23:42 -04002018 mbedtls_ssl_conf_max_tls_version( &server.conf,
Paul Elliottc8570442020-04-15 17:00:50 +01002019 options->server_max_version );
2020 }
2021
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002022#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2023 TEST_ASSERT( mbedtls_ssl_conf_max_frag_len( &(server.conf),
2024 (unsigned char) options->mfl ) == 0 );
2025 TEST_ASSERT( mbedtls_ssl_conf_max_frag_len( &(client.conf),
2026 (unsigned char) options->mfl ) == 0 );
2027#else
2028 TEST_ASSERT( MBEDTLS_SSL_MAX_FRAG_LEN_NONE == options->mfl );
2029#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2030
Gilles Peskineeccd8882020-03-10 12:19:08 +01002031#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002032 if( options->psk_str != NULL && options->psk_str->len > 0 )
2033 {
2034 TEST_ASSERT( mbedtls_ssl_conf_psk( &client.conf, options->psk_str->x,
2035 options->psk_str->len,
2036 (const unsigned char *) psk_identity,
2037 strlen( psk_identity ) ) == 0 );
2038
2039 TEST_ASSERT( mbedtls_ssl_conf_psk( &server.conf, options->psk_str->x,
2040 options->psk_str->len,
2041 (const unsigned char *) psk_identity,
2042 strlen( psk_identity ) ) == 0 );
2043
2044 mbedtls_ssl_conf_psk_cb( &server.conf, psk_dummy_callback, NULL );
2045 }
2046#endif
2047#if defined(MBEDTLS_SSL_RENEGOTIATION)
2048 if( options->renegotiate )
2049 {
2050 mbedtls_ssl_conf_renegotiation( &(server.conf),
2051 MBEDTLS_SSL_RENEGOTIATION_ENABLED );
2052 mbedtls_ssl_conf_renegotiation( &(client.conf),
2053 MBEDTLS_SSL_RENEGOTIATION_ENABLED );
2054
2055 mbedtls_ssl_conf_legacy_renegotiation( &(server.conf),
2056 options->legacy_renegotiation );
2057 mbedtls_ssl_conf_legacy_renegotiation( &(client.conf),
2058 options->legacy_renegotiation );
2059 }
2060#endif /* MBEDTLS_SSL_RENEGOTIATION */
2061
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002062#if defined (MBEDTLS_DEBUG_C)
2063 if( options->srv_log_fun )
2064 {
2065 mbedtls_debug_set_threshold( 4 );
2066 mbedtls_ssl_conf_dbg( &server.conf, options->srv_log_fun,
2067 options->srv_log_obj );
2068 }
2069#endif
2070
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002071 TEST_ASSERT( mbedtls_mock_socket_connect( &(client.socket),
2072 &(server.socket),
2073 BUFFSIZE ) == 0 );
2074
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002075#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2076 if( options->resize_buffers != 0 )
2077 {
2078 /* Ensure that the buffer sizes are appropriate before resizes */
2079 TEST_ASSERT( client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN );
2080 TEST_ASSERT( client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN );
2081 TEST_ASSERT( server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN );
2082 TEST_ASSERT( server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN );
2083 }
2084#endif
2085
Glenn Strauss39e624c2022-04-11 13:33:16 -04002086 if( options->expected_negotiated_version == MBEDTLS_SSL_VERSION_UNKNOWN )
Paul Elliottc8570442020-04-15 17:00:50 +01002087 {
Hanno Beckerbc000442021-06-24 09:18:19 +01002088 expected_handshake_result = MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Elliottc8570442020-04-15 17:00:50 +01002089 }
2090
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002091 TEST_ASSERT( mbedtls_move_handshake_to_state( &(client.ssl),
2092 &(server.ssl),
2093 MBEDTLS_SSL_HANDSHAKE_OVER )
Paul Elliottc8570442020-04-15 17:00:50 +01002094 == expected_handshake_result );
2095
2096 if( expected_handshake_result != 0 )
2097 {
2098 /* Connection will have failed by this point, skip to cleanup */
2099 goto exit;
2100 }
2101
Paul Elliott27b0d942022-03-18 21:55:32 +00002102 TEST_ASSERT( mbedtls_ssl_is_handshake_over( &client.ssl ) == 1 );
Jerry Yudf0a71a2022-05-26 10:43:30 +08002103
Jerry Yu66adf312022-05-31 15:23:29 +08002104 /* Make sure server state is moved to HANDSHAKE_OVER also. */
Jerry Yudf0a71a2022-05-26 10:43:30 +08002105 TEST_ASSERT( mbedtls_move_handshake_to_state( &(server.ssl),
2106 &(client.ssl),
2107 MBEDTLS_SSL_HANDSHAKE_OVER )
2108 == expected_handshake_result );
2109 if( expected_handshake_result != 0 )
2110 {
2111 goto exit;
2112 }
2113
Paul Elliott27b0d942022-03-18 21:55:32 +00002114 TEST_ASSERT( mbedtls_ssl_is_handshake_over( &server.ssl ) == 1 );
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002115
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002116 /* Check that both sides have negotiated the expected version. */
2117 mbedtls_test_set_step( 0 );
2118 if( ! check_ssl_version( options->expected_negotiated_version,
2119 &client.ssl ) )
2120 goto exit;
Paul Elliottc8570442020-04-15 17:00:50 +01002121
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002122 mbedtls_test_set_step( 1 );
2123 if( ! check_ssl_version( options->expected_negotiated_version,
2124 &server.ssl ) )
2125 goto exit;
Paul Elliottc8570442020-04-15 17:00:50 +01002126
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002127#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2128 if( options->resize_buffers != 0 )
2129 {
TRodziewicz2abf03c2021-06-25 14:40:09 +02002130 /* A server, when using DTLS, might delay a buffer resize to happen
2131 * after it receives a message, so we force it. */
2132 TEST_ASSERT( exchange_data( &(client.ssl), &(server.ssl) ) == 0 );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002133
TRodziewicz2abf03c2021-06-25 14:40:09 +02002134 TEST_ASSERT( client.ssl.out_buf_len ==
2135 mbedtls_ssl_get_output_buflen( &client.ssl ) );
2136 TEST_ASSERT( client.ssl.in_buf_len ==
2137 mbedtls_ssl_get_input_buflen( &client.ssl ) );
2138 TEST_ASSERT( server.ssl.out_buf_len ==
2139 mbedtls_ssl_get_output_buflen( &server.ssl ) );
2140 TEST_ASSERT( server.ssl.in_buf_len ==
2141 mbedtls_ssl_get_input_buflen( &server.ssl ) );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002142 }
2143#endif
2144
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002145 if( options->cli_msg_len != 0 || options->srv_msg_len != 0 )
2146 {
2147 /* Start data exchanging test */
2148 TEST_ASSERT( mbedtls_exchange_data( &(client.ssl), options->cli_msg_len,
2149 options->expected_cli_fragments,
2150 &(server.ssl), options->srv_msg_len,
2151 options->expected_srv_fragments )
2152 == 0 );
2153 }
2154#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
2155 if( options->serialize == 1 )
2156 {
2157 TEST_ASSERT( options->dtls == 1 );
2158
2159 TEST_ASSERT( mbedtls_ssl_context_save( &(server.ssl), NULL,
2160 0, &context_buf_len )
2161 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2162
2163 context_buf = mbedtls_calloc( 1, context_buf_len );
2164 TEST_ASSERT( context_buf != NULL );
2165
2166 TEST_ASSERT( mbedtls_ssl_context_save( &(server.ssl), context_buf,
2167 context_buf_len,
2168 &context_buf_len ) == 0 );
2169
2170 mbedtls_ssl_free( &(server.ssl) );
2171 mbedtls_ssl_init( &(server.ssl) );
2172
2173 TEST_ASSERT( mbedtls_ssl_setup( &(server.ssl), &(server.conf) ) == 0 );
2174
2175 mbedtls_ssl_set_bio( &( server.ssl ), &server_context,
2176 mbedtls_mock_tcp_send_msg,
2177 mbedtls_mock_tcp_recv_msg,
2178 NULL );
2179
Gilles Peskine49d7ddf2022-01-27 23:25:51 +01002180 mbedtls_ssl_set_user_data_p( &server.ssl, &server );
2181
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002182#if defined(MBEDTLS_TIMING_C)
2183 mbedtls_ssl_set_timer_cb( &server.ssl, &timer_server,
2184 mbedtls_timing_set_delay,
2185 mbedtls_timing_get_delay );
2186#endif
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002187#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2188 if( options->resize_buffers != 0 )
2189 {
2190 /* Ensure that the buffer sizes are appropriate before resizes */
2191 TEST_ASSERT( server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN );
2192 TEST_ASSERT( server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN );
2193 }
2194#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002195 TEST_ASSERT( mbedtls_ssl_context_load( &( server.ssl ), context_buf,
2196 context_buf_len ) == 0 );
2197
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002198#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2199 /* Validate buffer sizes after context deserialization */
2200 if( options->resize_buffers != 0 )
2201 {
2202 TEST_ASSERT( server.ssl.out_buf_len ==
2203 mbedtls_ssl_get_output_buflen( &server.ssl ) );
2204 TEST_ASSERT( server.ssl.in_buf_len ==
2205 mbedtls_ssl_get_input_buflen( &server.ssl ) );
2206 }
2207#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002208 /* Retest writing/reading */
2209 if( options->cli_msg_len != 0 || options->srv_msg_len != 0 )
2210 {
2211 TEST_ASSERT( mbedtls_exchange_data( &(client.ssl),
2212 options->cli_msg_len,
2213 options->expected_cli_fragments,
2214 &(server.ssl),
2215 options->srv_msg_len,
2216 options->expected_srv_fragments )
2217 == 0 );
2218 }
2219 }
2220#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002221
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002222#if defined(MBEDTLS_SSL_RENEGOTIATION)
2223 if( options->renegotiate )
2224 {
2225 /* Start test with renegotiation */
2226 TEST_ASSERT( server.ssl.renego_status ==
2227 MBEDTLS_SSL_INITIAL_HANDSHAKE );
2228 TEST_ASSERT( client.ssl.renego_status ==
2229 MBEDTLS_SSL_INITIAL_HANDSHAKE );
2230
2231 /* After calling this function for the server, it only sends a handshake
2232 * request. All renegotiation should happen during data exchanging */
2233 TEST_ASSERT( mbedtls_ssl_renegotiate( &(server.ssl) ) == 0 );
2234 TEST_ASSERT( server.ssl.renego_status ==
2235 MBEDTLS_SSL_RENEGOTIATION_PENDING );
2236 TEST_ASSERT( client.ssl.renego_status ==
2237 MBEDTLS_SSL_INITIAL_HANDSHAKE );
2238
2239 TEST_ASSERT( exchange_data( &(client.ssl), &(server.ssl) ) == 0 );
2240 TEST_ASSERT( server.ssl.renego_status ==
2241 MBEDTLS_SSL_RENEGOTIATION_DONE );
2242 TEST_ASSERT( client.ssl.renego_status ==
2243 MBEDTLS_SSL_RENEGOTIATION_DONE );
2244
2245 /* After calling mbedtls_ssl_renegotiate for the client all renegotiation
2246 * should happen inside this function. However in this test, we cannot
Shaun Case8b0ecbc2021-12-20 21:14:10 -08002247 * perform simultaneous communication between client and server so this
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002248 * function will return waiting error on the socket. All rest of
2249 * renegotiation should happen during data exchanging */
2250 ret = mbedtls_ssl_renegotiate( &(client.ssl) );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002251#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2252 if( options->resize_buffers != 0 )
2253 {
2254 /* Ensure that the buffer sizes are appropriate before resizes */
2255 TEST_ASSERT( client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN );
2256 TEST_ASSERT( client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN );
2257 }
2258#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002259 TEST_ASSERT( ret == 0 ||
2260 ret == MBEDTLS_ERR_SSL_WANT_READ ||
2261 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
2262 TEST_ASSERT( server.ssl.renego_status ==
2263 MBEDTLS_SSL_RENEGOTIATION_DONE );
2264 TEST_ASSERT( client.ssl.renego_status ==
2265 MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS );
2266
2267 TEST_ASSERT( exchange_data( &(client.ssl), &(server.ssl) ) == 0 );
2268 TEST_ASSERT( server.ssl.renego_status ==
2269 MBEDTLS_SSL_RENEGOTIATION_DONE );
2270 TEST_ASSERT( client.ssl.renego_status ==
2271 MBEDTLS_SSL_RENEGOTIATION_DONE );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002272#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2273 /* Validate buffer sizes after renegotiation */
2274 if( options->resize_buffers != 0 )
2275 {
2276 TEST_ASSERT( client.ssl.out_buf_len ==
2277 mbedtls_ssl_get_output_buflen( &client.ssl ) );
2278 TEST_ASSERT( client.ssl.in_buf_len ==
2279 mbedtls_ssl_get_input_buflen( &client.ssl ) );
2280 TEST_ASSERT( server.ssl.out_buf_len ==
2281 mbedtls_ssl_get_output_buflen( &server.ssl ) );
2282 TEST_ASSERT( server.ssl.in_buf_len ==
2283 mbedtls_ssl_get_input_buflen( &server.ssl ) );
2284 }
2285#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002286 }
2287#endif /* MBEDTLS_SSL_RENEGOTIATION */
2288
Gilles Peskine80dae042022-01-21 23:50:39 +01002289 TEST_ASSERT( mbedtls_ssl_conf_get_user_data_p( &client.conf ) == &client );
2290 TEST_ASSERT( mbedtls_ssl_get_user_data_p( &client.ssl ) == &client );
2291 TEST_ASSERT( mbedtls_ssl_conf_get_user_data_p( &server.conf ) == &server );
2292 TEST_ASSERT( mbedtls_ssl_get_user_data_p( &server.ssl ) == &server );
2293
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002294exit:
2295 mbedtls_endpoint_free( &client, options->dtls != 0 ? &client_context : NULL );
2296 mbedtls_endpoint_free( &server, options->dtls != 0 ? &server_context : NULL );
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002297#if defined (MBEDTLS_DEBUG_C)
2298 if( options->cli_log_fun || options->srv_log_fun )
2299 {
2300 mbedtls_debug_set_threshold( 0 );
2301 }
2302#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002303#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
2304 if( context_buf != NULL )
2305 mbedtls_free( context_buf );
2306#endif
Neil Armstrong46a17602022-02-23 15:11:16 +01002307 USE_PSA_DONE( );
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002308}
Manuel Pégourié-Gonnardd12402f2020-05-20 10:34:25 +02002309#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002310
Ronald Crone3dac4a2022-06-10 17:21:51 +02002311/*
2312 * Tweak vector lengths in a TLS 1.3 Certificate message
2313 *
2314 * /param[in] buf Buffer containing the Certificate message to tweak
2315 * /param[in]]out] end End of the buffer to parse
2316 * /param tweak Tweak identifier (from 1 to the number of tweaks).
2317 * /param[out] expected_result Error code expected from the parsing function
2318 * /param[out] args Arguments of the MBEDTLS_SSL_CHK_BUF_READ_PTR call that
2319 * is expected to fail. All zeroes if no
2320 * MBEDTLS_SSL_CHK_BUF_READ_PTR failure is expected.
2321 */
2322int tweak_tls13_certificate_msg_vector_len(
2323 unsigned char *buf, unsigned char **end, int tweak, int *expected_result )
2324{
2325/*
2326 * The definition of the tweaks assume that the certificate list contains only
2327 * one certificate.
2328 */
2329
2330/*
2331 * struct {
2332 * opaque cert_data<1..2^24-1>;
2333 * Extension extensions<0..2^16-1>;
2334 * } CertificateEntry;
2335 *
2336 * struct {
2337 * opaque certificate_request_context<0..2^8-1>;
2338 * CertificateEntry certificate_list<0..2^24-1>;
2339 * } Certificate;
2340 */
2341 unsigned char *p_certificate_request_context_len = buf;
2342 size_t certificate_request_context_len = buf[0];
2343
2344 unsigned char *p_certificate_list_len = buf + 1 + certificate_request_context_len;
2345 unsigned char *certificate_list = p_certificate_list_len + 3;
2346 size_t certificate_list_len = MBEDTLS_GET_UINT24_BE( p_certificate_list_len, 0 );
2347
2348 unsigned char *p_cert_data_len = certificate_list;
2349 unsigned char *cert_data = p_cert_data_len + 3;
2350 size_t cert_data_len = MBEDTLS_GET_UINT24_BE( p_cert_data_len, 0 );
2351
2352 unsigned char *p_extensions_len = cert_data + cert_data_len;
2353 unsigned char *extensions = p_extensions_len + 2;
2354 size_t extensions_len = MBEDTLS_GET_UINT16_BE( p_extensions_len, 0 );
2355
2356 *expected_result = MBEDTLS_ERR_SSL_DECODE_ERROR;
2357
2358 switch( tweak )
2359 {
2360 case 1:
2361 /* Failure when checking if the certificate request context length and
2362 * certificate list length can be read
2363 */
2364 *end = buf + 3;
2365 break;
2366
2367 case 2:
2368 /* Invalid certificate request context length.
2369 */
2370 *p_certificate_request_context_len =
2371 certificate_request_context_len + 1;
2372 break;
2373
2374 case 3:
2375 /* Failure when checking if certificate_list data can be read. */
2376 MBEDTLS_PUT_UINT24_BE( certificate_list_len + 1,
2377 p_certificate_list_len, 0 );
2378 break;
2379
2380 case 4:
2381 /* Failure when checking if the cert_data length can be read. */
2382 MBEDTLS_PUT_UINT24_BE( 2, p_certificate_list_len, 0 );
2383 break;
2384
2385 case 5:
2386 /* Failure when checking if cert_data data can be read. */
2387 MBEDTLS_PUT_UINT24_BE( certificate_list_len - 3 + 1,
2388 p_cert_data_len, 0 );
2389 break;
2390
2391 case 6:
2392 /* Failure when checking if the extensions length can be read. */
2393 MBEDTLS_PUT_UINT24_BE( certificate_list_len - extensions_len - 1,
2394 p_certificate_list_len, 0 );
2395 break;
2396
2397 case 7:
2398 /* Failure when checking if extensions data can be read. */
2399 MBEDTLS_PUT_UINT16_BE( extensions_len + 1, p_extensions_len, 0 );
2400 break;
2401
2402 default:
2403 return( -1 );
2404 }
2405
2406 return( 0 );
2407}
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002408/* END_HEADER */
2409
2410/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002411 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002412 * END_DEPENDENCIES
2413 */
2414
Janos Follath6264e662019-11-26 11:11:15 +00002415/* BEGIN_CASE */
2416void test_callback_buffer_sanity()
2417{
2418 enum { MSGLEN = 10 };
2419 mbedtls_test_buffer buf;
2420 unsigned char input[MSGLEN];
2421 unsigned char output[MSGLEN];
2422
2423 memset( input, 0, sizeof(input) );
2424
2425 /* Make sure calling put and get on NULL buffer results in error. */
2426 TEST_ASSERT( mbedtls_test_buffer_put( NULL, input, sizeof( input ) )
2427 == -1 );
2428 TEST_ASSERT( mbedtls_test_buffer_get( NULL, output, sizeof( output ) )
2429 == -1 );
2430 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05002431
Janos Follath6264e662019-11-26 11:11:15 +00002432 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, 0 ) == -1 );
2433 TEST_ASSERT( mbedtls_test_buffer_get( NULL, NULL, 0 ) == -1 );
2434
2435 /* Make sure calling put and get on a buffer that hasn't been set up results
Shaun Case8b0ecbc2021-12-20 21:14:10 -08002436 * in error. */
Janos Follath6264e662019-11-26 11:11:15 +00002437 mbedtls_test_buffer_init( &buf );
2438
2439 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) ) == -1 );
2440 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, sizeof( output ) )
2441 == -1 );
2442 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05002443
Janos Follath6264e662019-11-26 11:11:15 +00002444 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == -1 );
2445 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == -1 );
2446
Andrzej Kurekf7774142020-01-22 06:34:59 -05002447 /* Make sure calling put and get on NULL input only results in
2448 * error if the length is not zero, and that a NULL output is valid for data
2449 * dropping.
2450 */
Janos Follath6264e662019-11-26 11:11:15 +00002451
2452 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, sizeof( input ) ) == 0 );
2453
2454 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
2455 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, sizeof( output ) )
Andrzej Kurekf7774142020-01-22 06:34:59 -05002456 == 0 );
Janos Follath6264e662019-11-26 11:11:15 +00002457 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == 0 );
2458 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == 0 );
2459
Piotr Nowickifb437d72020-01-13 16:59:12 +01002460 /* Make sure calling put several times in the row is safe */
2461
2462 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) )
2463 == sizeof( input ) );
2464 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, 2 ) == 2 );
2465 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 1 ) == 1 );
2466 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 1 );
2467 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 0 );
2468
2469
Janos Follath6264e662019-11-26 11:11:15 +00002470exit:
2471
2472 mbedtls_test_buffer_free( &buf );
2473}
2474/* END_CASE */
2475
2476/*
2477 * Test if the implementation of `mbedtls_test_buffer` related functions is
2478 * correct and works as expected.
2479 *
2480 * That is
2481 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
2482 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
2483 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
2484 * bytes.
2485 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
2486 * - All of the bytes we got match the bytes we put in in a FIFO manner.
2487 */
2488
2489/* BEGIN_CASE */
2490void test_callback_buffer( int size, int put1, int put1_ret,
2491 int get1, int get1_ret, int put2, int put2_ret,
2492 int get2, int get2_ret )
2493{
2494 enum { ROUNDS = 2 };
2495 size_t put[ROUNDS];
2496 int put_ret[ROUNDS];
2497 size_t get[ROUNDS];
2498 int get_ret[ROUNDS];
2499 mbedtls_test_buffer buf;
2500 unsigned char* input = NULL;
2501 size_t input_len;
2502 unsigned char* output = NULL;
2503 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00002504 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00002505
2506 mbedtls_test_buffer_init( &buf );
2507 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, size ) == 0 );
2508
2509 /* Check the sanity of input parameters and initialise local variables. That
2510 * is, ensure that the amount of data is not negative and that we are not
2511 * expecting more to put or get than we actually asked for. */
2512 TEST_ASSERT( put1 >= 0 );
2513 put[0] = put1;
2514 put_ret[0] = put1_ret;
2515 TEST_ASSERT( put1_ret <= put1 );
2516 TEST_ASSERT( put2 >= 0 );
2517 put[1] = put2;
2518 put_ret[1] = put2_ret;
2519 TEST_ASSERT( put2_ret <= put2 );
2520
2521 TEST_ASSERT( get1 >= 0 );
2522 get[0] = get1;
2523 get_ret[0] = get1_ret;
2524 TEST_ASSERT( get1_ret <= get1 );
2525 TEST_ASSERT( get2 >= 0 );
2526 get[1] = get2;
2527 get_ret[1] = get2_ret;
2528 TEST_ASSERT( get2_ret <= get2 );
2529
2530 input_len = 0;
2531 /* Calculate actual input and output lengths */
2532 for( j = 0; j < ROUNDS; j++ )
2533 {
2534 if( put_ret[j] > 0 )
2535 {
2536 input_len += put_ret[j];
2537 }
2538 }
2539 /* In order to always have a valid pointer we always allocate at least 1
2540 * byte. */
2541 if( input_len == 0 )
2542 input_len = 1;
2543 ASSERT_ALLOC( input, input_len );
2544
2545 output_len = 0;
2546 for( j = 0; j < ROUNDS; j++ )
2547 {
2548 if( get_ret[j] > 0 )
2549 {
2550 output_len += get_ret[j];
2551 }
2552 }
2553 TEST_ASSERT( output_len <= input_len );
2554 /* In order to always have a valid pointer we always allocate at least 1
2555 * byte. */
2556 if( output_len == 0 )
2557 output_len = 1;
2558 ASSERT_ALLOC( output, output_len );
2559
2560 /* Fill up the buffer with structured data so that unwanted changes
2561 * can be detected */
2562 for( i = 0; i < input_len; i++ )
2563 {
2564 input[i] = i & 0xFF;
2565 }
2566
2567 written = read = 0;
2568 for( j = 0; j < ROUNDS; j++ )
2569 {
2570 TEST_ASSERT( put_ret[j] == mbedtls_test_buffer_put( &buf,
2571 input + written, put[j] ) );
2572 written += put_ret[j];
2573 TEST_ASSERT( get_ret[j] == mbedtls_test_buffer_get( &buf,
2574 output + read, get[j] ) );
2575 read += get_ret[j];
2576 TEST_ASSERT( read <= written );
2577 if( get_ret[j] > 0 )
2578 {
2579 TEST_ASSERT( memcmp( output + read - get_ret[j],
2580 input + read - get_ret[j], get_ret[j] )
2581 == 0 );
2582 }
2583 }
2584
2585exit:
2586
2587 mbedtls_free( input );
2588 mbedtls_free( output );
2589 mbedtls_test_buffer_free( &buf );
2590}
2591/* END_CASE */
2592
Janos Follath031827f2019-11-27 11:12:14 +00002593/*
Janos Follathc673c2c2019-12-02 15:47:26 +00002594 * Test if the implementation of `mbedtls_mock_socket` related I/O functions is
2595 * correct and works as expected on unconnected sockets.
2596 */
2597
2598/* BEGIN_CASE */
2599void ssl_mock_sanity( )
2600{
2601 enum { MSGLEN = 105 };
Paul Elliott21c8fe52021-11-24 16:54:26 +00002602 unsigned char message[MSGLEN] = { 0 };
2603 unsigned char received[MSGLEN] = { 0 };
Janos Follathc673c2c2019-12-02 15:47:26 +00002604 mbedtls_mock_socket socket;
2605
2606 mbedtls_mock_socket_init( &socket );
2607 TEST_ASSERT( mbedtls_mock_tcp_send_b( &socket, message, MSGLEN ) < 0 );
2608 mbedtls_mock_socket_close( &socket );
2609 mbedtls_mock_socket_init( &socket );
2610 TEST_ASSERT( mbedtls_mock_tcp_recv_b( &socket, received, MSGLEN ) < 0 );
2611 mbedtls_mock_socket_close( &socket );
2612
2613 mbedtls_mock_socket_init( &socket );
2614 TEST_ASSERT( mbedtls_mock_tcp_send_nb( &socket, message, MSGLEN ) < 0 );
2615 mbedtls_mock_socket_close( &socket );
2616 mbedtls_mock_socket_init( &socket );
2617 TEST_ASSERT( mbedtls_mock_tcp_recv_nb( &socket, received, MSGLEN ) < 0 );
2618 mbedtls_mock_socket_close( &socket );
2619
2620exit:
2621
2622 mbedtls_mock_socket_close( &socket );
2623}
2624/* END_CASE */
2625
2626/*
2627 * Test if the implementation of `mbedtls_mock_socket` related functions can
2628 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00002629 */
2630
2631/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002632void ssl_mock_tcp( int blocking )
Janos Follath031827f2019-11-27 11:12:14 +00002633{
Janos Follathc673c2c2019-12-02 15:47:26 +00002634 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002635 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00002636 unsigned char message[MSGLEN];
2637 unsigned char received[MSGLEN];
2638 mbedtls_mock_socket client;
2639 mbedtls_mock_socket server;
2640 size_t written, read;
2641 int send_ret, recv_ret;
2642 mbedtls_ssl_send_t *send;
2643 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00002644 unsigned i;
2645
2646 if( blocking == 0 )
2647 {
2648 send = mbedtls_mock_tcp_send_nb;
2649 recv = mbedtls_mock_tcp_recv_nb;
2650 }
2651 else
2652 {
2653 send = mbedtls_mock_tcp_send_b;
2654 recv = mbedtls_mock_tcp_recv_b;
2655 }
2656
2657 mbedtls_mock_socket_init( &client );
2658 mbedtls_mock_socket_init( &server );
2659
2660 /* Fill up the buffer with structured data so that unwanted changes
2661 * can be detected */
2662 for( i = 0; i < MSGLEN; i++ )
2663 {
2664 message[i] = i & 0xFF;
2665 }
2666
2667 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002668 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follathc673c2c2019-12-02 15:47:26 +00002669
2670 /* Send the message to the server */
2671 send_ret = recv_ret = 1;
2672 written = read = 0;
2673 while( send_ret != 0 || recv_ret != 0 )
2674 {
2675 send_ret = send( &client, message + written, MSGLEN - written );
2676
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002677 TEST_ASSERT( send_ret >= 0 );
2678 TEST_ASSERT( send_ret <= BUFLEN );
2679 written += send_ret;
2680
2681 /* If the buffer is full we can test blocking and non-blocking send */
2682 if ( send_ret == BUFLEN )
Janos Follathc673c2c2019-12-02 15:47:26 +00002683 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002684 int blocking_ret = send( &client, message , 1 );
2685 if ( blocking )
2686 {
2687 TEST_ASSERT( blocking_ret == 0 );
2688 }
2689 else
2690 {
2691 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
2692 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002693 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002694
2695 recv_ret = recv( &server, received + read, MSGLEN - read );
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002696
2697 /* The result depends on whether any data was sent */
2698 if ( send_ret > 0 )
Janos Follathc673c2c2019-12-02 15:47:26 +00002699 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002700 TEST_ASSERT( recv_ret > 0 );
2701 TEST_ASSERT( recv_ret <= BUFLEN );
2702 read += recv_ret;
2703 }
2704 else if( blocking )
2705 {
2706 TEST_ASSERT( recv_ret == 0 );
Janos Follathc673c2c2019-12-02 15:47:26 +00002707 }
2708 else
2709 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002710 TEST_ASSERT( recv_ret == MBEDTLS_ERR_SSL_WANT_READ );
2711 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00002712 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002713
2714 /* If the buffer is empty we can test blocking and non-blocking read */
2715 if ( recv_ret == BUFLEN )
2716 {
2717 int blocking_ret = recv( &server, received, 1 );
2718 if ( blocking )
2719 {
2720 TEST_ASSERT( blocking_ret == 0 );
2721 }
2722 else
2723 {
2724 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
2725 }
2726 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002727 }
2728 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2729
2730exit:
2731
2732 mbedtls_mock_socket_close( &client );
2733 mbedtls_mock_socket_close( &server );
2734}
2735/* END_CASE */
2736
2737/*
2738 * Test if the implementation of `mbedtls_mock_socket` related functions can
2739 * send messages in both direction at the same time (with the I/O calls
2740 * interleaving).
2741 */
2742
2743/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002744void ssl_mock_tcp_interleaving( int blocking )
Janos Follathc673c2c2019-12-02 15:47:26 +00002745{
Janos Follath031827f2019-11-27 11:12:14 +00002746 enum { ROUNDS = 2 };
2747 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002748 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00002749 unsigned char message[ROUNDS][MSGLEN];
2750 unsigned char received[ROUNDS][MSGLEN];
2751 mbedtls_mock_socket client;
2752 mbedtls_mock_socket server;
2753 size_t written[ROUNDS];
2754 size_t read[ROUNDS];
2755 int send_ret[ROUNDS];
2756 int recv_ret[ROUNDS];
2757 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00002758 mbedtls_ssl_send_t *send;
2759 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00002760
2761 if( blocking == 0 )
2762 {
2763 send = mbedtls_mock_tcp_send_nb;
2764 recv = mbedtls_mock_tcp_recv_nb;
2765 }
2766 else
2767 {
2768 send = mbedtls_mock_tcp_send_b;
2769 recv = mbedtls_mock_tcp_recv_b;
2770 }
Janos Follath031827f2019-11-27 11:12:14 +00002771
2772 mbedtls_mock_socket_init( &client );
2773 mbedtls_mock_socket_init( &server );
2774
2775 /* Fill up the buffers with structured data so that unwanted changes
2776 * can be detected */
2777 for( i = 0; i < ROUNDS; i++ )
2778 {
2779 for( j = 0; j < MSGLEN; j++ )
2780 {
2781 message[i][j] = ( i * MSGLEN + j ) & 0xFF;
2782 }
2783 }
2784
Janos Follath031827f2019-11-27 11:12:14 +00002785 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002786 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follath031827f2019-11-27 11:12:14 +00002787
Janos Follath031827f2019-11-27 11:12:14 +00002788 /* Send the message from both sides, interleaving. */
2789 progress = 1;
2790 for( i = 0; i < ROUNDS; i++ )
2791 {
2792 written[i] = 0;
2793 read[i] = 0;
2794 }
2795 /* This loop does not stop as long as there was a successful write or read
2796 * of at least one byte on either side. */
2797 while( progress != 0 )
2798 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002799 mbedtls_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00002800
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002801 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00002802 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002803 /* First sending is from the client */
2804 socket = ( i % 2 == 0 ) ? ( &client ) : ( &server );
Janos Follath031827f2019-11-27 11:12:14 +00002805
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002806 send_ret[i] = send( socket, message[i] + written[i],
2807 MSGLEN - written[i] );
2808 TEST_ASSERT( send_ret[i] >= 0 );
2809 TEST_ASSERT( send_ret[i] <= BUFLEN );
2810 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002811
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002812 /* If the buffer is full we can test blocking and non-blocking
2813 * send */
2814 if ( send_ret[i] == BUFLEN )
2815 {
2816 int blocking_ret = send( socket, message[i] , 1 );
2817 if ( blocking )
2818 {
2819 TEST_ASSERT( blocking_ret == 0 );
2820 }
2821 else
2822 {
2823 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
2824 }
2825 }
Janos Follath3766ba52019-11-27 13:31:42 +00002826 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002827
2828 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00002829 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002830 /* First receiving is from the server */
2831 socket = ( i % 2 == 0 ) ? ( &server ) : ( &client );
2832
2833 recv_ret[i] = recv( socket, received[i] + read[i],
2834 MSGLEN - read[i] );
2835
2836 /* The result depends on whether any data was sent */
2837 if ( send_ret[i] > 0 )
2838 {
2839 TEST_ASSERT( recv_ret[i] > 0 );
2840 TEST_ASSERT( recv_ret[i] <= BUFLEN );
2841 read[i] += recv_ret[i];
2842 }
2843 else if( blocking )
2844 {
2845 TEST_ASSERT( recv_ret[i] == 0 );
2846 }
2847 else
2848 {
2849 TEST_ASSERT( recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ );
2850 recv_ret[i] = 0;
2851 }
2852
2853 /* If the buffer is empty we can test blocking and non-blocking
2854 * read */
2855 if ( recv_ret[i] == BUFLEN )
2856 {
2857 int blocking_ret = recv( socket, received[i], 1 );
2858 if ( blocking )
2859 {
2860 TEST_ASSERT( blocking_ret == 0 );
2861 }
2862 else
2863 {
2864 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
2865 }
2866 }
Janos Follath3766ba52019-11-27 13:31:42 +00002867 }
Janos Follath031827f2019-11-27 11:12:14 +00002868
2869 progress = 0;
2870 for( i = 0; i < ROUNDS; i++ )
2871 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002872 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002873 }
2874 }
2875
2876 for( i = 0; i < ROUNDS; i++ )
2877 TEST_ASSERT( memcmp( message[i], received[i], MSGLEN ) == 0 );
2878
2879exit:
2880
2881 mbedtls_mock_socket_close( &client );
2882 mbedtls_mock_socket_close( &server );
2883}
2884/* END_CASE */
2885
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002886/* BEGIN_CASE */
2887void ssl_message_queue_sanity( )
2888{
2889 mbedtls_test_message_queue queue;
2890
2891 /* Trying to push/pull to an empty queue */
2892 TEST_ASSERT( mbedtls_test_message_queue_push_info( NULL, 1 )
2893 == MBEDTLS_TEST_ERROR_ARG_NULL );
2894 TEST_ASSERT( mbedtls_test_message_queue_pop_info( NULL, 1 )
2895 == MBEDTLS_TEST_ERROR_ARG_NULL );
2896
Andrzej Kurek89bdc582020-03-09 06:29:43 -04002897 TEST_ASSERT( mbedtls_test_message_queue_setup( &queue, 3 ) == 0 );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002898 TEST_ASSERT( queue.capacity == 3 );
2899 TEST_ASSERT( queue.num == 0 );
2900
2901exit:
2902 mbedtls_test_message_queue_free( &queue );
2903}
2904/* END_CASE */
2905
2906/* BEGIN_CASE */
2907void ssl_message_queue_basic( )
2908{
2909 mbedtls_test_message_queue queue;
2910
Andrzej Kurek89bdc582020-03-09 06:29:43 -04002911 TEST_ASSERT( mbedtls_test_message_queue_setup( &queue, 3 ) == 0 );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002912
2913 /* Sanity test - 3 pushes and 3 pops with sufficient space */
2914 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2915 TEST_ASSERT( queue.capacity == 3 );
2916 TEST_ASSERT( queue.num == 1 );
2917 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2918 TEST_ASSERT( queue.capacity == 3 );
2919 TEST_ASSERT( queue.num == 2 );
2920 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2921 TEST_ASSERT( queue.capacity == 3 );
2922 TEST_ASSERT( queue.num == 3 );
2923
2924 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2925 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2926 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2927
2928exit:
2929 mbedtls_test_message_queue_free( &queue );
2930}
2931/* END_CASE */
2932
2933/* BEGIN_CASE */
2934void ssl_message_queue_overflow_underflow( )
2935{
2936 mbedtls_test_message_queue queue;
2937
Andrzej Kurek89bdc582020-03-09 06:29:43 -04002938 TEST_ASSERT( mbedtls_test_message_queue_setup( &queue, 3 ) == 0 );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002939
2940 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
2941 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2942 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2943 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2944 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002945 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002946
2947 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2948 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2949 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2950
2951 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002952 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002953
2954exit:
2955 mbedtls_test_message_queue_free( &queue );
2956}
2957/* END_CASE */
2958
2959/* BEGIN_CASE */
2960void ssl_message_queue_interleaved( )
2961{
2962 mbedtls_test_message_queue queue;
2963
Andrzej Kurek89bdc582020-03-09 06:29:43 -04002964 TEST_ASSERT( mbedtls_test_message_queue_setup( &queue, 3 ) == 0 );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002965
2966 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
2967 * (to wrap around the buffer) */
2968 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2969 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2970
2971 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2972
2973 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2974 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 ) == 3 );
2975
2976 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2977 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2978
2979 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 5 ) == 5 );
2980 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 8 ) == 8 );
2981
2982 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 3 ) == 3 );
2983
2984 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 5 ) == 5 );
2985
2986 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 8 ) == 8 );
2987
2988exit:
2989 mbedtls_test_message_queue_free( &queue );
2990}
2991/* END_CASE */
2992
2993/* BEGIN_CASE */
2994void ssl_message_queue_insufficient_buffer( )
2995{
2996 mbedtls_test_message_queue queue;
2997 size_t message_len = 10;
2998 size_t buffer_len = 5;
2999
Andrzej Kurek89bdc582020-03-09 06:29:43 -04003000 TEST_ASSERT( mbedtls_test_message_queue_setup( &queue, 1 ) == 0 );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003001
3002 /* Popping without a sufficient buffer */
3003 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, message_len )
3004 == (int) message_len );
3005 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, buffer_len )
3006 == (int) buffer_len );
3007exit:
3008 mbedtls_test_message_queue_free( &queue );
3009}
3010/* END_CASE */
3011
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003012/* BEGIN_CASE */
3013void ssl_message_mock_uninitialized( )
3014{
3015 enum { MSGLEN = 10 };
Shawn Carey03092f52021-05-13 10:38:32 -04003016 unsigned char message[MSGLEN] = {0}, received[MSGLEN];
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003017 mbedtls_mock_socket client, server;
3018 mbedtls_test_message_queue server_queue, client_queue;
3019 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003020 mbedtls_message_socket_init( &server_context );
3021 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003022
3023 /* Send with a NULL context */
3024 TEST_ASSERT( mbedtls_mock_tcp_send_msg( NULL, message, MSGLEN )
3025 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
3026
3027 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( NULL, message, MSGLEN )
3028 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
3029
3030 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
3031 &server,
3032 &server_context ) == 0 );
3033
3034 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
3035 &client,
3036 &client_context ) == 0 );
3037
3038 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message, MSGLEN )
3039 == MBEDTLS_TEST_ERROR_SEND_FAILED );
3040
3041 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05003042 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003043
3044 /* Push directly to a queue to later simulate a disconnected behavior */
3045 TEST_ASSERT( mbedtls_test_message_queue_push_info( &server_queue, MSGLEN )
3046 == MSGLEN );
3047
3048 /* Test if there's an error when trying to read from a disconnected
3049 * socket */
3050 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
3051 == MBEDTLS_TEST_ERROR_RECV_FAILED );
3052 exit:
3053 mbedtls_message_socket_close( &server_context );
3054 mbedtls_message_socket_close( &client_context );
3055}
3056/* END_CASE */
3057
3058/* BEGIN_CASE */
3059void ssl_message_mock_basic( )
3060{
3061 enum { MSGLEN = 10 };
3062 unsigned char message[MSGLEN], received[MSGLEN];
3063 mbedtls_mock_socket client, server;
3064 unsigned i;
3065 mbedtls_test_message_queue server_queue, client_queue;
3066 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003067 mbedtls_message_socket_init( &server_context );
3068 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003069
3070 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
3071 &server,
3072 &server_context ) == 0 );
3073
3074 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
3075 &client,
3076 &client_context ) == 0 );
3077
3078 /* Fill up the buffer with structured data so that unwanted changes
3079 * can be detected */
3080 for( i = 0; i < MSGLEN; i++ )
3081 {
3082 message[i] = i & 0xFF;
3083 }
3084 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
3085 MSGLEN ) );
3086
3087 /* Send the message to the server */
3088 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3089 MSGLEN ) == MSGLEN );
3090
3091 /* Read from the server */
3092 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
3093 == MSGLEN );
3094
3095 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3096 memset( received, 0, MSGLEN );
3097
3098 /* Send the message to the client */
3099 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
3100 MSGLEN ) == MSGLEN );
3101
3102 /* Read from the client */
3103 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
3104 == MSGLEN );
3105 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3106
3107 exit:
3108 mbedtls_message_socket_close( &server_context );
3109 mbedtls_message_socket_close( &client_context );
3110}
3111/* END_CASE */
3112
3113/* BEGIN_CASE */
3114void ssl_message_mock_queue_overflow_underflow( )
3115{
3116 enum { MSGLEN = 10 };
3117 unsigned char message[MSGLEN], received[MSGLEN];
3118 mbedtls_mock_socket client, server;
3119 unsigned i;
3120 mbedtls_test_message_queue server_queue, client_queue;
3121 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003122 mbedtls_message_socket_init( &server_context );
3123 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003124
3125 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
3126 &server,
3127 &server_context ) == 0 );
3128
3129 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
3130 &client,
3131 &client_context ) == 0 );
3132
3133 /* Fill up the buffer with structured data so that unwanted changes
3134 * can be detected */
3135 for( i = 0; i < MSGLEN; i++ )
3136 {
3137 message[i] = i & 0xFF;
3138 }
3139 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
3140 MSGLEN*2 ) );
3141
3142 /* Send three message to the server, last one with an error */
3143 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3144 MSGLEN - 1 ) == MSGLEN - 1 );
3145
3146 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3147 MSGLEN ) == MSGLEN );
3148
3149 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3150 MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05003151 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003152
3153 /* Read three messages from the server, last one with an error */
3154 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
3155 MSGLEN - 1 ) == MSGLEN - 1 );
3156
3157 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
3158 == MSGLEN );
3159
3160 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3161
3162 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05003163 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003164
3165 exit:
3166 mbedtls_message_socket_close( &server_context );
3167 mbedtls_message_socket_close( &client_context );
3168}
3169/* END_CASE */
3170
3171/* BEGIN_CASE */
3172void ssl_message_mock_socket_overflow( )
3173{
3174 enum { MSGLEN = 10 };
3175 unsigned char message[MSGLEN], received[MSGLEN];
3176 mbedtls_mock_socket client, server;
3177 unsigned i;
3178 mbedtls_test_message_queue server_queue, client_queue;
3179 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003180 mbedtls_message_socket_init( &server_context );
3181 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003182
3183 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
3184 &server,
3185 &server_context ) == 0 );
3186
3187 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
3188 &client,
3189 &client_context ) == 0 );
3190
3191 /* Fill up the buffer with structured data so that unwanted changes
3192 * can be detected */
3193 for( i = 0; i < MSGLEN; i++ )
3194 {
3195 message[i] = i & 0xFF;
3196 }
3197 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
3198 MSGLEN ) );
3199
3200 /* Send two message to the server, second one with an error */
3201 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3202 MSGLEN ) == MSGLEN );
3203
3204 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3205 MSGLEN )
3206 == MBEDTLS_TEST_ERROR_SEND_FAILED );
3207
3208 /* Read the only message from the server */
3209 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
3210 == MSGLEN );
3211
3212 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3213
3214 exit:
3215 mbedtls_message_socket_close( &server_context );
3216 mbedtls_message_socket_close( &client_context );
3217}
3218/* END_CASE */
3219
3220/* BEGIN_CASE */
3221void ssl_message_mock_truncated( )
3222{
3223 enum { MSGLEN = 10 };
3224 unsigned char message[MSGLEN], received[MSGLEN];
3225 mbedtls_mock_socket client, server;
3226 unsigned i;
3227 mbedtls_test_message_queue server_queue, client_queue;
3228 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003229 mbedtls_message_socket_init( &server_context );
3230 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003231
3232 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
3233 &server,
3234 &server_context ) == 0 );
3235
3236 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
3237 &client,
3238 &client_context ) == 0 );
3239
3240 memset( received, 0, MSGLEN );
3241 /* Fill up the buffer with structured data so that unwanted changes
3242 * can be detected */
3243 for( i = 0; i < MSGLEN; i++ )
3244 {
3245 message[i] = i & 0xFF;
3246 }
3247 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
3248 2 * MSGLEN ) );
3249
3250 /* Send two messages to the server, the second one small enough to fit in the
3251 * receiver's buffer. */
3252 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3253 MSGLEN ) == MSGLEN );
3254 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3255 MSGLEN / 2 ) == MSGLEN / 2 );
3256 /* Read a truncated message from the server */
3257 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
3258 == MSGLEN/2 );
3259
3260 /* Test that the first half of the message is valid, and second one isn't */
3261 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
3262 TEST_ASSERT( memcmp( message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2 )
3263 != 0 );
3264 memset( received, 0, MSGLEN );
3265
3266 /* Read a full message from the server */
3267 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
3268 == MSGLEN / 2 );
3269
3270 /* Test that the first half of the message is valid */
3271 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
3272
3273 exit:
3274 mbedtls_message_socket_close( &server_context );
3275 mbedtls_message_socket_close( &client_context );
3276}
3277/* END_CASE */
3278
3279/* BEGIN_CASE */
3280void ssl_message_mock_socket_read_error( )
3281{
3282 enum { MSGLEN = 10 };
3283 unsigned char message[MSGLEN], received[MSGLEN];
3284 mbedtls_mock_socket client, server;
3285 unsigned i;
3286 mbedtls_test_message_queue server_queue, client_queue;
3287 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003288 mbedtls_message_socket_init( &server_context );
3289 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003290
3291 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
3292 &server,
3293 &server_context ) == 0 );
3294
3295 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
3296 &client,
3297 &client_context ) == 0 );
3298
3299 /* Fill up the buffer with structured data so that unwanted changes
3300 * can be detected */
3301 for( i = 0; i < MSGLEN; i++ )
3302 {
3303 message[i] = i & 0xFF;
3304 }
3305 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
3306 MSGLEN ) );
3307
3308 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3309 MSGLEN ) == MSGLEN );
3310
3311 /* Force a read error by disconnecting the socket by hand */
3312 server.status = 0;
3313 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
3314 == MBEDTLS_TEST_ERROR_RECV_FAILED );
3315 /* Return to a valid state */
3316 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
3317
3318 memset( received, 0, sizeof( received ) );
3319
3320 /* Test that even though the server tried to read once disconnected, the
3321 * continuity is preserved */
3322 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
3323 == MSGLEN );
3324
3325 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3326
3327 exit:
3328 mbedtls_message_socket_close( &server_context );
3329 mbedtls_message_socket_close( &client_context );
3330}
3331/* END_CASE */
3332
3333/* BEGIN_CASE */
3334void ssl_message_mock_interleaved_one_way( )
3335{
3336 enum { MSGLEN = 10 };
3337 unsigned char message[MSGLEN], received[MSGLEN];
3338 mbedtls_mock_socket client, server;
3339 unsigned i;
3340 mbedtls_test_message_queue server_queue, client_queue;
3341 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003342 mbedtls_message_socket_init( &server_context );
3343 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003344
3345 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
3346 &server,
3347 &server_context ) == 0 );
3348
3349 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
3350 &client,
3351 &client_context ) == 0 );
3352
3353 /* Fill up the buffer with structured data so that unwanted changes
3354 * can be detected */
3355 for( i = 0; i < MSGLEN; i++ )
3356 {
3357 message[i] = i & 0xFF;
3358 }
3359 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
3360 MSGLEN*3 ) );
3361
3362 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
3363 * (to wrap around the buffer) */
3364 for( i = 0; i < 2; i++ )
3365 {
3366 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3367 MSGLEN ) == MSGLEN );
3368
3369 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3370 MSGLEN ) == MSGLEN );
3371
3372 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
3373 MSGLEN ) == MSGLEN );
3374 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3375 memset( received, 0, sizeof( received ) );
3376 }
3377
3378 for( i = 0; i < 2; i++ )
3379 {
3380 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
3381 MSGLEN ) == MSGLEN );
3382
3383 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3384 }
3385 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05003386 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003387 exit:
3388 mbedtls_message_socket_close( &server_context );
3389 mbedtls_message_socket_close( &client_context );
3390}
3391/* END_CASE */
3392
3393/* BEGIN_CASE */
3394void ssl_message_mock_interleaved_two_ways( )
3395{
3396 enum { MSGLEN = 10 };
3397 unsigned char message[MSGLEN], received[MSGLEN];
3398 mbedtls_mock_socket client, server;
3399 unsigned i;
3400 mbedtls_test_message_queue server_queue, client_queue;
3401 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek45916ba2020-03-05 14:46:22 -05003402 mbedtls_message_socket_init( &server_context );
3403 mbedtls_message_socket_init( &client_context );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003404
3405 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
3406 &server,
3407 &server_context ) == 0 );
3408
3409 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
3410 &client,
3411 &client_context ) == 0 );
3412
3413 /* Fill up the buffer with structured data so that unwanted changes
3414 * can be detected */
3415 for( i = 0; i < MSGLEN; i++ )
3416 {
3417 message[i] = i & 0xFF;
3418 }
3419 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
3420 MSGLEN*3 ) );
3421
3422 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
3423 * (to wrap around the buffer) both ways. */
3424 for( i = 0; i < 2; i++ )
3425 {
3426 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3427 MSGLEN ) == MSGLEN );
3428
3429 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
3430 MSGLEN ) == MSGLEN );
3431
3432 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
3433 MSGLEN ) == MSGLEN );
3434
3435 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
3436 MSGLEN ) == MSGLEN );
3437
3438 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
3439 MSGLEN ) == MSGLEN );
3440
3441 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3442
3443 memset( received, 0, sizeof( received ) );
3444
3445 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
3446 MSGLEN ) == MSGLEN );
3447
3448 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3449
3450 memset( received, 0, sizeof( received ) );
3451 }
3452
3453 for( i = 0; i < 2; i++ )
3454 {
3455 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
3456 MSGLEN ) == MSGLEN );
3457
3458 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3459 memset( received, 0, sizeof( received ) );
3460
3461 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
3462 MSGLEN ) == MSGLEN );
3463
3464 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
3465 memset( received, 0, sizeof( received ) );
3466 }
3467
3468 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05003469 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003470
3471 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05003472 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003473 exit:
3474 mbedtls_message_socket_close( &server_context );
3475 mbedtls_message_socket_close( &client_context );
3476}
3477/* END_CASE */
3478
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003479/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Azim Khan5fcca462018-06-29 11:05:32 +01003480void ssl_dtls_replay( data_t * prevs, data_t * new, int ret )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003481{
Azim Khand30ca132017-06-09 04:32:58 +01003482 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003483 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003484 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003485
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02003486 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003487 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02003488
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02003489 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
3490 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02003491 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
3492 MBEDTLS_SSL_PRESET_DEFAULT ) == 0 );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003493 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003494
3495 /* Read previous record numbers */
Azim Khand30ca132017-06-09 04:32:58 +01003496 for( len = 0; len < prevs->len; len += 6 )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003497 {
Azim Khand30ca132017-06-09 04:32:58 +01003498 memcpy( ssl.in_ctr + 2, prevs->x + len, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003499 mbedtls_ssl_dtls_replay_update( &ssl );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003500 }
3501
3502 /* Check new number */
Azim Khand30ca132017-06-09 04:32:58 +01003503 memcpy( ssl.in_ctr + 2, new->x, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003504 TEST_ASSERT( mbedtls_ssl_dtls_replay_check( &ssl ) == ret );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003505
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003506 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003507 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003508}
3509/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01003510
3511/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
3512void ssl_set_hostname_twice( char *hostname0, char *hostname1 )
3513{
3514 mbedtls_ssl_context ssl;
3515 mbedtls_ssl_init( &ssl );
3516
3517 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname0 ) == 0 );
3518 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname1 ) == 0 );
3519
3520 mbedtls_ssl_free( &ssl );
3521}
Darryl Green11999bb2018-03-13 15:22:58 +00003522/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00003523
3524/* BEGIN_CASE */
3525void ssl_crypt_record( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01003526 int etm, int tag_mode, int ver,
3527 int cid0_len, int cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00003528{
3529 /*
3530 * Test several record encryptions and decryptions
3531 * with plenty of space before and after the data
3532 * within the record buffer.
3533 */
3534
3535 int ret;
3536 int num_records = 16;
3537 mbedtls_ssl_context ssl; /* ONLY for debugging */
3538
3539 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00003540 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00003541 size_t const buflen = 512;
3542 mbedtls_record rec, rec_backup;
3543
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003544 USE_PSA_INIT( );
3545
Hanno Beckera18d1322018-01-03 14:27:32 +00003546 mbedtls_ssl_init( &ssl );
3547 mbedtls_ssl_transform_init( &t0 );
3548 mbedtls_ssl_transform_init( &t1 );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003549 ret = build_transforms( &t0, &t1, cipher_type, hash_id,
3550 etm, tag_mode, ver,
3551 (size_t) cid0_len,
3552 (size_t) cid1_len );
3553
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01003554 TEST_ASSERT( ret == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00003555
Hanno Becker3ee54212019-04-04 16:31:26 +01003556 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00003557
3558 while( num_records-- > 0 )
3559 {
3560 mbedtls_ssl_transform *t_dec, *t_enc;
3561 /* Take turns in who's sending and who's receiving. */
3562 if( num_records % 3 == 0 )
3563 {
3564 t_dec = &t0;
3565 t_enc = &t1;
3566 }
3567 else
3568 {
3569 t_dec = &t1;
3570 t_enc = &t0;
3571 }
3572
3573 /*
3574 * The record header affects the transformation in two ways:
3575 * 1) It determines the AEAD additional data
3576 * 2) The record counter sometimes determines the IV.
3577 *
3578 * Apart from that, the fields don't have influence.
3579 * In particular, it is currently not the responsibility
3580 * of ssl_encrypt/decrypt_buf to check if the transform
3581 * version matches the record version, or that the
3582 * type is sensible.
3583 */
3584
3585 memset( rec.ctr, num_records, sizeof( rec.ctr ) );
3586 rec.type = 42;
3587 rec.ver[0] = num_records;
3588 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003589#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003590 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003591#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00003592
3593 rec.buf = buf;
3594 rec.buf_len = buflen;
3595 rec.data_offset = 16;
3596 /* Make sure to vary the length to exercise different
3597 * paddings. */
3598 rec.data_len = 1 + num_records;
3599
3600 memset( rec.buf + rec.data_offset, 42, rec.data_len );
3601
3602 /* Make a copy for later comparison */
3603 rec_backup = rec;
3604
3605 /* Encrypt record */
3606 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec,
Ronald Cron351f0ee2020-06-10 12:12:18 +02003607 mbedtls_test_rnd_std_rand, NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00003608 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3609 if( ret != 0 )
3610 {
3611 continue;
3612 }
3613
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003614#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3615 if( rec.cid_len != 0 )
3616 {
3617 /* DTLS 1.2 + CID hides the real content type and
3618 * uses a special CID content type in the protected
3619 * record. Double-check this. */
3620 TEST_ASSERT( rec.type == MBEDTLS_SSL_MSG_CID );
3621 }
3622#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3623
Ronald Cron6f135e12021-12-08 16:57:54 +01003624#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Glenn Strauss07c64162022-03-14 12:34:51 -04003625 if( t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 )
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003626 {
3627 /* TLS 1.3 hides the real content type and
3628 * always uses Application Data as the content type
3629 * for protected records. Double-check this. */
3630 TEST_ASSERT( rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA );
3631 }
Ronald Cron6f135e12021-12-08 16:57:54 +01003632#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003633
Hanno Beckera18d1322018-01-03 14:27:32 +00003634 /* Decrypt record with t_dec */
Hanno Beckerd856c822019-04-29 17:30:59 +01003635 ret = mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec );
3636 TEST_ASSERT( ret == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00003637
3638 /* Compare results */
3639 TEST_ASSERT( rec.type == rec_backup.type );
3640 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
3641 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
3642 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
3643 TEST_ASSERT( rec.data_len == rec_backup.data_len );
3644 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
3645 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
3646 rec_backup.buf + rec_backup.data_offset,
3647 rec.data_len ) == 0 );
3648 }
3649
Hanno Becker81e16a32019-03-01 11:21:44 +00003650exit:
3651
Hanno Beckera18d1322018-01-03 14:27:32 +00003652 /* Cleanup */
3653 mbedtls_ssl_free( &ssl );
3654 mbedtls_ssl_transform_free( &t0 );
3655 mbedtls_ssl_transform_free( &t1 );
3656
Hanno Becker3ee54212019-04-04 16:31:26 +01003657 mbedtls_free( buf );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003658 USE_PSA_DONE( );
Hanno Beckera18d1322018-01-03 14:27:32 +00003659}
3660/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003661
3662/* BEGIN_CASE */
3663void ssl_crypt_record_small( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01003664 int etm, int tag_mode, int ver,
3665 int cid0_len, int cid1_len )
Hanno Beckerb3268da2018-01-05 15:20:24 +00003666{
3667 /*
3668 * Test pairs of encryption and decryption with an increasing
3669 * amount of space in the record buffer - in more detail:
3670 * 1) Try to encrypt with 0, 1, 2, ... bytes available
3671 * in front of the plaintext, and expect the encryption
3672 * to succeed starting from some offset. Always keep
3673 * enough space in the end of the buffer.
3674 * 2) Try to encrypt with 0, 1, 2, ... bytes available
3675 * at the end of the plaintext, and expect the encryption
3676 * to succeed starting from some offset. Always keep
3677 * enough space at the beginning of the buffer.
3678 * 3) Try to encrypt with 0, 1, 2, ... bytes available
3679 * both at the front and end of the plaintext,
3680 * and expect the encryption to succeed starting from
3681 * some offset.
3682 *
3683 * If encryption succeeds, check that decryption succeeds
3684 * and yields the original record.
3685 */
3686
3687 mbedtls_ssl_context ssl; /* ONLY for debugging */
3688
3689 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00003690 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01003691 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003692 mbedtls_record rec, rec_backup;
3693
3694 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01003695 int mode; /* Mode 1, 2 or 3 as explained above */
3696 size_t offset; /* Available space at beginning/end/both */
3697 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003698
Hanno Beckerd856c822019-04-29 17:30:59 +01003699 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
3700 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003701
3702 int seen_success; /* Indicates if in the current mode we've
3703 * already seen a successful test. */
3704
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003705 USE_PSA_INIT( );
3706
Hanno Beckerb3268da2018-01-05 15:20:24 +00003707 mbedtls_ssl_init( &ssl );
3708 mbedtls_ssl_transform_init( &t0 );
3709 mbedtls_ssl_transform_init( &t1 );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003710 ret = build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01003711 etm, tag_mode, ver,
3712 (size_t) cid0_len,
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003713 (size_t) cid1_len );
3714
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01003715 TEST_ASSERT( ret == 0 );
Hanno Beckerb3268da2018-01-05 15:20:24 +00003716
Hanno Becker3ee54212019-04-04 16:31:26 +01003717 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckerb3268da2018-01-05 15:20:24 +00003718
3719 for( mode=1; mode <= 3; mode++ )
3720 {
3721 seen_success = 0;
3722 for( offset=0; offset <= threshold; offset++ )
3723 {
3724 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01003725 t_dec = &t0;
3726 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003727
3728 memset( rec.ctr, offset, sizeof( rec.ctr ) );
3729 rec.type = 42;
3730 rec.ver[0] = offset;
3731 rec.ver[1] = offset;
3732 rec.buf = buf;
3733 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003734#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003735 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003736#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003737
3738 switch( mode )
3739 {
3740 case 1: /* Space in the beginning */
3741 rec.data_offset = offset;
3742 rec.data_len = buflen - offset - default_post_padding;
3743 break;
3744
3745 case 2: /* Space in the end */
3746 rec.data_offset = default_pre_padding;
3747 rec.data_len = buflen - default_pre_padding - offset;
3748 break;
3749
3750 case 3: /* Space in the beginning and end */
3751 rec.data_offset = offset;
3752 rec.data_len = buflen - 2 * offset;
3753 break;
3754
3755 default:
3756 TEST_ASSERT( 0 );
3757 break;
3758 }
3759
3760 memset( rec.buf + rec.data_offset, 42, rec.data_len );
3761
3762 /* Make a copy for later comparison */
3763 rec_backup = rec;
3764
3765 /* Encrypt record */
Ronald Cron6c5bd7f2020-06-10 14:08:26 +02003766 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec,
3767 mbedtls_test_rnd_std_rand, NULL );
Hanno Beckerb3268da2018-01-05 15:20:24 +00003768
3769 if( ( mode == 1 || mode == 2 ) && seen_success )
3770 {
3771 TEST_ASSERT( ret == 0 );
3772 }
3773 else
3774 {
3775 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3776 if( ret == 0 )
3777 seen_success = 1;
3778 }
3779
3780 if( ret != 0 )
3781 continue;
3782
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003783#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3784 if( rec.cid_len != 0 )
3785 {
3786 /* DTLS 1.2 + CID hides the real content type and
3787 * uses a special CID content type in the protected
3788 * record. Double-check this. */
3789 TEST_ASSERT( rec.type == MBEDTLS_SSL_MSG_CID );
3790 }
3791#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3792
Ronald Cron6f135e12021-12-08 16:57:54 +01003793#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Glenn Strauss07c64162022-03-14 12:34:51 -04003794 if( t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 )
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003795 {
3796 /* TLS 1.3 hides the real content type and
3797 * always uses Application Data as the content type
3798 * for protected records. Double-check this. */
3799 TEST_ASSERT( rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA );
3800 }
Ronald Cron6f135e12021-12-08 16:57:54 +01003801#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003802
Hanno Beckerb3268da2018-01-05 15:20:24 +00003803 /* Decrypt record with t_dec */
3804 TEST_ASSERT( mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec ) == 0 );
3805
3806 /* Compare results */
3807 TEST_ASSERT( rec.type == rec_backup.type );
3808 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
3809 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
3810 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
3811 TEST_ASSERT( rec.data_len == rec_backup.data_len );
3812 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
3813 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
3814 rec_backup.buf + rec_backup.data_offset,
3815 rec.data_len ) == 0 );
3816 }
3817
3818 TEST_ASSERT( seen_success == 1 );
3819 }
3820
Hanno Becker81e16a32019-03-01 11:21:44 +00003821exit:
3822
Hanno Beckerb3268da2018-01-05 15:20:24 +00003823 /* Cleanup */
3824 mbedtls_ssl_free( &ssl );
3825 mbedtls_ssl_transform_free( &t0 );
3826 mbedtls_ssl_transform_free( &t1 );
3827
Hanno Becker3ee54212019-04-04 16:31:26 +01003828 mbedtls_free( buf );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003829 USE_PSA_DONE( );
Hanno Beckerb3268da2018-01-05 15:20:24 +00003830}
3831/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03003832
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01003833/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_AES_C:MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003834void ssl_decrypt_non_etm_cbc( int cipher_type, int hash_id, int trunc_hmac,
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003835 int length_selector )
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003836{
3837 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003838 * Test record decryption for CBC without EtM, focused on the verification
3839 * of padding and MAC.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003840 *
TRodziewicz299510e2021-07-09 16:55:11 +02003841 * Actually depends on TLS 1.2 and either AES, ARIA or Camellia, but since
3842 * the test framework doesn't support alternation in dependency statements,
3843 * just depend on AES.
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003844 *
3845 * The length_selector argument is interpreted as follows:
3846 * - if it's -1, the plaintext length is 0 and minimal padding is applied
3847 * - if it's -2, the plaintext length is 0 and maximal padding is applied
3848 * - otherwise it must be in [0, 255] and is padding_length from RFC 5246:
3849 * it's the length of the rest of the padding, that is, excluding the
3850 * byte that encodes the length. The minimal non-zero plaintext length
3851 * that gives this padding_length is automatically selected.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003852 */
3853 mbedtls_ssl_context ssl; /* ONLY for debugging */
3854 mbedtls_ssl_transform t0, t1;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003855 mbedtls_record rec, rec_save;
3856 unsigned char *buf = NULL, *buf_save = NULL;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003857 size_t buflen, olen = 0;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003858 size_t plaintext_len, block_size, i;
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003859 unsigned char padlen; /* excluding the padding_length byte */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003860 unsigned char add_data[13];
3861 unsigned char mac[MBEDTLS_MD_MAX_SIZE];
Neil Armstrongcf8841a2022-02-24 11:17:45 +01003862#if defined(MBEDTLS_USE_PSA_CRYPTO)
3863 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
3864 size_t sign_mac_length = 0;
3865#endif
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003866 int exp_ret;
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003867 int ret;
Manuel Pégourié-Gonnard4adc04a2020-07-16 10:00:48 +02003868 const unsigned char pad_max_len = 255; /* Per the standard */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003869
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003870 USE_PSA_INIT( );
3871
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003872 mbedtls_ssl_init( &ssl );
3873 mbedtls_ssl_transform_init( &t0 );
3874 mbedtls_ssl_transform_init( &t1 );
3875
3876 /* Set up transforms with dummy keys */
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003877 ret = build_transforms( &t0, &t1, cipher_type, hash_id,
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003878 0, trunc_hmac,
Glenn Strauss07c64162022-03-14 12:34:51 -04003879 MBEDTLS_SSL_VERSION_TLS1_2,
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003880 0 , 0 );
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003881
Przemyslaw Stekiel4a36dd32022-01-25 00:43:58 +01003882 TEST_ASSERT( ret == 0 );
3883
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003884 /* Determine padding/plaintext length */
3885 TEST_ASSERT( length_selector >= -2 && length_selector <= 255 );
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003886 block_size = t0.ivlen;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003887 if( length_selector < 0 )
3888 {
3889 plaintext_len = 0;
3890
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003891 /* Minimal padding
3892 * The +1 is for the padding_length byte, not counted in padlen. */
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003893 padlen = block_size - ( t0.maclen + 1 ) % block_size;
3894
3895 /* Maximal padding? */
3896 if( length_selector == -2 )
3897 padlen += block_size * ( ( pad_max_len - padlen ) / block_size );
3898 }
3899 else
3900 {
3901 padlen = length_selector;
3902
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003903 /* Minimal non-zero plaintext_length giving desired padding.
3904 * The +1 is for the padding_length byte, not counted in padlen. */
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003905 plaintext_len = block_size - ( padlen + t0.maclen + 1 ) % block_size;
3906 }
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003907
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003908 /* Prepare a buffer for record data */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003909 buflen = block_size
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003910 + plaintext_len
3911 + t0.maclen
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003912 + padlen + 1;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003913 ASSERT_ALLOC( buf, buflen );
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003914 ASSERT_ALLOC( buf_save, buflen );
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003915
3916 /* Prepare a dummy record header */
3917 memset( rec.ctr, 0, sizeof( rec.ctr ) );
3918 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
Glenn Strausse3af4cb2022-03-15 03:23:42 -04003919 mbedtls_ssl_write_version( rec.ver, MBEDTLS_SSL_TRANSPORT_STREAM,
3920 MBEDTLS_SSL_VERSION_TLS1_2 );
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003921#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3922 rec.cid_len = 0;
3923#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3924
3925 /* Prepare dummy record content */
3926 rec.buf = buf;
3927 rec.buf_len = buflen;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003928 rec.data_offset = block_size;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003929 rec.data_len = plaintext_len;
3930 memset( rec.buf + rec.data_offset, 42, rec.data_len );
3931
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003932 /* Serialized version of record header for MAC purposes */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003933 memcpy( add_data, rec.ctr, 8 );
3934 add_data[8] = rec.type;
3935 add_data[9] = rec.ver[0];
3936 add_data[10] = rec.ver[1];
3937 add_data[11] = ( rec.data_len >> 8 ) & 0xff;
3938 add_data[12] = ( rec.data_len >> 0 ) & 0xff;
3939
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003940 /* Set dummy IV */
3941 memset( t0.iv_enc, 0x55, t0.ivlen );
3942 memcpy( rec.buf, t0.iv_enc, t0.ivlen );
3943
3944 /*
3945 * Prepare a pre-encryption record (with MAC and padding), and save it.
3946 */
3947
3948 /* MAC with additional data */
Neil Armstrongcf8841a2022-02-24 11:17:45 +01003949#if defined(MBEDTLS_USE_PSA_CRYPTO)
3950 TEST_EQUAL( PSA_SUCCESS, psa_mac_sign_setup( &operation,
3951 t0.psa_mac_enc,
3952 t0.psa_mac_alg ) );
3953 TEST_EQUAL( PSA_SUCCESS, psa_mac_update( &operation, add_data, 13 ) );
3954 TEST_EQUAL( PSA_SUCCESS, psa_mac_update( &operation,
3955 rec.buf + rec.data_offset,
3956 rec.data_len ) );
3957 TEST_EQUAL( PSA_SUCCESS, psa_mac_sign_finish( &operation,
3958 mac, MBEDTLS_MD_MAX_SIZE,
3959 &sign_mac_length ) );
3960#else
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003961 TEST_EQUAL( 0, mbedtls_md_hmac_update( &t0.md_ctx_enc, add_data, 13 ) );
3962 TEST_EQUAL( 0, mbedtls_md_hmac_update( &t0.md_ctx_enc,
3963 rec.buf + rec.data_offset,
3964 rec.data_len ) );
3965 TEST_EQUAL( 0, mbedtls_md_hmac_finish( &t0.md_ctx_enc, mac ) );
Neil Armstrongcf8841a2022-02-24 11:17:45 +01003966#endif
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003967
3968 memcpy( rec.buf + rec.data_offset + rec.data_len, mac, t0.maclen );
3969 rec.data_len += t0.maclen;
3970
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003971 /* Pad */
3972 memset( rec.buf + rec.data_offset + rec.data_len, padlen, padlen + 1 );
3973 rec.data_len += padlen + 1;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003974
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003975 /* Save correct pre-encryption record */
3976 rec_save = rec;
3977 rec_save.buf = buf_save;
3978 memcpy( buf_save, buf, buflen );
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003979
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003980 /*
3981 * Encrypt and decrypt the correct record, expecting success
3982 */
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01003983 TEST_EQUAL( 0, psa_cipher_encrypt_helper(&t0, t0.iv_enc, t0.ivlen,
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01003984 rec.buf + rec.data_offset, rec.data_len,
3985 rec.buf + rec.data_offset, &olen ) );
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003986 rec.data_offset -= t0.ivlen;
3987 rec.data_len += t0.ivlen;
3988
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003989 TEST_EQUAL( 0, mbedtls_ssl_decrypt_buf( &ssl, &t1, &rec ) );
3990
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003991 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003992 * Modify each byte of the pre-encryption record before encrypting and
3993 * decrypting it, expecting failure every time.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003994 */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003995 for( i = block_size; i < buflen; i++ )
3996 {
Chris Jones9634bb12021-01-20 15:56:42 +00003997 mbedtls_test_set_step( i );
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003998
3999 /* Restore correct pre-encryption record */
4000 rec = rec_save;
4001 rec.buf = buf;
4002 memcpy( buf, buf_save, buflen );
4003
Manuel Pégourié-Gonnardb51f0442020-07-21 10:40:25 +02004004 /* Corrupt one byte of the data (could be plaintext, MAC or padding) */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004005 rec.buf[i] ^= 0x01;
4006
4007 /* Encrypt */
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01004008 TEST_EQUAL( 0, psa_cipher_encrypt_helper(&t0, t0.iv_enc, t0.ivlen,
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01004009 rec.buf + rec.data_offset, rec.data_len,
4010 rec.buf + rec.data_offset, &olen ) );
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004011 rec.data_offset -= t0.ivlen;
4012 rec.data_len += t0.ivlen;
4013
4014 /* Decrypt and expect failure */
4015 TEST_EQUAL( MBEDTLS_ERR_SSL_INVALID_MAC,
4016 mbedtls_ssl_decrypt_buf( &ssl, &t1, &rec ) );
4017 }
4018
4019 /*
4020 * Use larger values of the padding bytes - with small buffers, this tests
4021 * the case where the announced padlen would be larger than the buffer
4022 * (and before that, than the buffer minus the size of the MAC), to make
4023 * sure our padding checking code does not perform any out-of-bounds reads
4024 * in this case. (With larger buffers, ie when the plaintext is long or
4025 * maximal length padding is used, this is less relevant but still doesn't
4026 * hurt to test.)
4027 *
4028 * (Start the loop with correct padding, just to double-check that record
4029 * saving did work, and that we're overwriting the correct bytes.)
4030 */
Manuel Pégourié-Gonnard4adc04a2020-07-16 10:00:48 +02004031 for( i = padlen; i <= pad_max_len; i++ )
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004032 {
Chris Jones9634bb12021-01-20 15:56:42 +00004033 mbedtls_test_set_step( i );
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004034
4035 /* Restore correct pre-encryption record */
4036 rec = rec_save;
4037 rec.buf = buf;
4038 memcpy( buf, buf_save, buflen );
4039
4040 /* Set padding bytes to new value */
4041 memset( buf + buflen - padlen - 1, i, padlen + 1 );
4042
4043 /* Encrypt */
Przemyslaw Stekiel8c010eb2022-02-03 10:44:02 +01004044 TEST_EQUAL( 0, psa_cipher_encrypt_helper(&t0, t0.iv_enc, t0.ivlen,
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01004045 rec.buf + rec.data_offset, rec.data_len,
4046 rec.buf + rec.data_offset, &olen ) );
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004047 rec.data_offset -= t0.ivlen;
4048 rec.data_len += t0.ivlen;
4049
4050 /* Decrypt and expect failure except the first time */
4051 exp_ret = ( i == padlen ) ? 0 : MBEDTLS_ERR_SSL_INVALID_MAC;
4052 TEST_EQUAL( exp_ret, mbedtls_ssl_decrypt_buf( &ssl, &t1, &rec ) );
4053 }
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004054
4055exit:
4056 mbedtls_ssl_free( &ssl );
4057 mbedtls_ssl_transform_free( &t0 );
4058 mbedtls_ssl_transform_free( &t1 );
4059 mbedtls_free( buf );
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004060 mbedtls_free( buf_save );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01004061 USE_PSA_DONE( );
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004062}
4063/* END_CASE */
4064
Gabor Mezeib35759d2022-02-09 16:59:11 +01004065/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_SSL_PROTO_TLS1_3 */
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004066void psa_hkdf_extract( int alg,
4067 data_t *ikm,
4068 data_t *salt,
4069 data_t *prk )
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004070{
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004071 unsigned char *output_prk = NULL;
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004072 size_t output_prk_size, output_prk_len;
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004073
Gabor Mezei4fded132022-02-15 16:35:23 +01004074 PSA_INIT( );
4075
Gabor Mezei62bf0242022-02-07 18:12:07 +01004076 output_prk_size = PSA_HASH_LENGTH( alg );
Gabor Mezei298a2d62022-02-07 18:21:39 +01004077 ASSERT_ALLOC( output_prk, output_prk_size );
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004078
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004079 PSA_ASSERT( mbedtls_psa_hkdf_extract( alg, salt->x, salt->len,
4080 ikm->x, ikm->len,
Gabor Mezei62bf0242022-02-07 18:12:07 +01004081 output_prk, output_prk_size,
4082 &output_prk_len ) );
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004083
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004084 ASSERT_COMPARE( output_prk, output_prk_len, prk->x, prk->len );
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004085
4086exit:
Gabor Mezeiebc93682022-02-07 18:06:35 +01004087 mbedtls_free( output_prk );
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004088
4089 PSA_DONE( );
4090}
4091/* END_CASE */
4092
4093/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_SSL_PROTO_TLS1_3 */
Gabor Mezei5d7d2012022-02-07 18:23:18 +01004094void psa_hkdf_extract_ret( int alg, int ret )
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004095{
4096 int output_ret;
4097 unsigned char *salt = NULL;
4098 unsigned char *ikm = NULL;
4099 unsigned char *prk = NULL;
Gabor Mezei62bf0242022-02-07 18:12:07 +01004100 size_t salt_len, ikm_len, prk_len;
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004101
Gabor Mezei4fded132022-02-15 16:35:23 +01004102 PSA_INIT( );
4103
Gabor Mezei298a2d62022-02-07 18:21:39 +01004104 ASSERT_ALLOC( prk, PSA_MAC_MAX_SIZE);
Gabor Mezei5d7d2012022-02-07 18:23:18 +01004105 salt_len = 0;
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004106 ikm_len = 0;
Gabor Mezei62bf0242022-02-07 18:12:07 +01004107 prk_len = 0;
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004108
Gabor Mezei5d7d2012022-02-07 18:23:18 +01004109 output_ret = mbedtls_psa_hkdf_extract( alg, salt, salt_len,
Gabor Mezei62bf0242022-02-07 18:12:07 +01004110 ikm, ikm_len,
4111 prk, PSA_MAC_MAX_SIZE, &prk_len );
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004112 TEST_ASSERT( output_ret == ret );
Gabor Mezei62bf0242022-02-07 18:12:07 +01004113 TEST_ASSERT( prk_len == 0 );
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004114
4115exit:
Gabor Mezeiebc93682022-02-07 18:06:35 +01004116 mbedtls_free( prk );
Gabor Mezei73cb6f52022-01-31 16:35:50 +01004117
4118 PSA_DONE( );
4119}
4120/* END_CASE */
4121
4122/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_SSL_PROTO_TLS1_3 */
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004123void psa_hkdf_expand( int alg,
4124 data_t *info,
4125 data_t *prk,
4126 data_t *okm )
Gabor Mezeib35759d2022-02-09 16:59:11 +01004127{
4128 enum { OKM_LEN = 1024 };
Gabor Mezeib35759d2022-02-09 16:59:11 +01004129 unsigned char *output_okm = NULL;
Gabor Mezeib35759d2022-02-09 16:59:11 +01004130
Gabor Mezei73812422022-02-15 16:24:58 +01004131 PSA_INIT( );
4132
Gabor Mezeib35759d2022-02-09 16:59:11 +01004133 ASSERT_ALLOC( output_okm, OKM_LEN );
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004134 TEST_ASSERT( prk->len == PSA_HASH_LENGTH( alg ) );
4135 TEST_ASSERT( okm->len < OKM_LEN );
Gabor Mezeib35759d2022-02-09 16:59:11 +01004136
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004137 PSA_ASSERT( mbedtls_psa_hkdf_expand( alg, prk->x, prk->len,
4138 info->x, info->len,
Gabor Mezeib35759d2022-02-09 16:59:11 +01004139 output_okm, OKM_LEN ) );
4140
Gabor Mezei88f3b2e2022-03-16 16:53:23 +01004141 ASSERT_COMPARE( output_okm, okm->len, okm->x, okm->len );
Gabor Mezeib35759d2022-02-09 16:59:11 +01004142
4143exit:
Gabor Mezeid9170812022-02-15 16:25:27 +01004144 mbedtls_free( output_okm );
Gabor Mezeib35759d2022-02-09 16:59:11 +01004145
4146 PSA_DONE( );
4147}
4148/* END_CASE */
4149
4150/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_SSL_PROTO_TLS1_3 */
4151void psa_hkdf_expand_ret( int alg, int prk_len, int okm_len, int ret )
4152{
4153 int output_ret;
4154 unsigned char *info = NULL;
4155 unsigned char *prk = NULL;
4156 unsigned char *okm = NULL;
4157 size_t info_len;
Gabor Mezeicbe5ba52022-02-17 11:52:12 +01004158 size_t i;
4159 mbedtls_svc_key_id_t *keys = NULL;
Gabor Mezeib35759d2022-02-09 16:59:11 +01004160
Gabor Mezei73812422022-02-15 16:24:58 +01004161 PSA_INIT( );
4162
Gabor Mezeib35759d2022-02-09 16:59:11 +01004163 info_len = 0;
4164
Gabor Mezei8e360252022-02-17 11:50:02 +01004165 if( prk_len > 0 )
Gabor Mezeib35759d2022-02-09 16:59:11 +01004166 ASSERT_ALLOC( prk, prk_len );
4167
Gabor Mezei8e360252022-02-17 11:50:02 +01004168 if( okm_len > 0 )
Gabor Mezeib35759d2022-02-09 16:59:11 +01004169 ASSERT_ALLOC( okm, okm_len );
4170
Gabor Mezeicbe5ba52022-02-17 11:52:12 +01004171 if( ret == PSA_ERROR_INSUFFICIENT_MEMORY )
4172 {
4173 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4174
4175 /* Reserve all key slot to make the key import fail. */
4176 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
4177 psa_set_key_algorithm( &attributes, alg );
4178 psa_set_key_type( &attributes, PSA_KEY_TYPE_HMAC );
4179
4180 ASSERT_ALLOC( keys, MBEDTLS_PSA_KEY_SLOT_COUNT );
4181
4182 for( i = 0; i < MBEDTLS_PSA_KEY_SLOT_COUNT; i++ )
4183 {
4184 /* Do not use the 0 value because it will be passed to
4185 mbedtls_psa_hkdf_expand */
4186 prk[0] = i + 1;
4187 keys[i] = MBEDTLS_SVC_KEY_ID_INIT;
4188 psa_import_key( &attributes, prk, prk_len, &keys[i] );
4189 }
4190
4191 /* reset prk buffer */
4192 prk[0] = 0;
4193 }
4194
Gabor Mezeib35759d2022-02-09 16:59:11 +01004195 output_ret = mbedtls_psa_hkdf_expand( alg, prk, prk_len,
4196 info, info_len,
4197 okm, okm_len );
4198 TEST_ASSERT( output_ret == ret );
4199
4200exit:
Gabor Mezeid9170812022-02-15 16:25:27 +01004201 mbedtls_free( prk );
4202 mbedtls_free( okm );
Gabor Mezeib35759d2022-02-09 16:59:11 +01004203
Gabor Mezeicbe5ba52022-02-17 11:52:12 +01004204 if( ret == PSA_ERROR_INSUFFICIENT_MEMORY )
4205 {
4206 for( i = 0; i < MBEDTLS_PSA_KEY_SLOT_COUNT; i++ )
4207 psa_destroy_key( keys[i] );
4208
4209 mbedtls_free( keys );
4210 }
4211
Gabor Mezeib35759d2022-02-09 16:59:11 +01004212 PSA_DONE( );
4213}
4214/* END_CASE */
4215
Ronald Cron6f135e12021-12-08 16:57:54 +01004216/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004217void ssl_tls13_hkdf_expand_label( int hash_alg,
4218 data_t *secret,
4219 int label_idx,
4220 data_t *ctx,
4221 int desired_length,
4222 data_t *expected )
Hanno Becker39ff4922020-08-21 13:36:56 +01004223{
4224 unsigned char dst[ 100 ];
4225
Hanno Becker70d7fb02020-09-09 10:11:21 +01004226 unsigned char const *lbl = NULL;
4227 size_t lbl_len;
Xiaofei Baid25fab62021-12-02 06:36:27 +00004228#define MBEDTLS_SSL_TLS1_3_LABEL( name, string ) \
4229 if( label_idx == (int) tls13_label_ ## name ) \
4230 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00004231 lbl = mbedtls_ssl_tls13_labels.name; \
4232 lbl_len = sizeof( mbedtls_ssl_tls13_labels.name ); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01004233 }
4234MBEDTLS_SSL_TLS1_3_LABEL_LIST
4235#undef MBEDTLS_SSL_TLS1_3_LABEL
4236 TEST_ASSERT( lbl != NULL );
Hanno Becker39ff4922020-08-21 13:36:56 +01004237
4238 /* Check sanity of test parameters. */
4239 TEST_ASSERT( (size_t) desired_length <= sizeof(dst) );
4240 TEST_ASSERT( (size_t) desired_length == expected->len );
4241
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004242 PSA_INIT( );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004243
Xiaofei Bai746f9482021-11-12 08:53:56 +00004244 TEST_ASSERT( mbedtls_ssl_tls13_hkdf_expand_label(
Gabor Mezei07732f72022-03-26 17:04:19 +01004245 (psa_algorithm_t) hash_alg,
Hanno Becker39ff4922020-08-21 13:36:56 +01004246 secret->x, secret->len,
Hanno Becker70d7fb02020-09-09 10:11:21 +01004247 lbl, lbl_len,
Hanno Becker39ff4922020-08-21 13:36:56 +01004248 ctx->x, ctx->len,
4249 dst, desired_length ) == 0 );
4250
Hanno Beckerfb080962020-09-08 10:58:42 +01004251 ASSERT_COMPARE( dst, (size_t) desired_length,
4252 expected->x, (size_t) expected->len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004253
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004254 PSA_DONE( );
Hanno Becker39ff4922020-08-21 13:36:56 +01004255}
4256/* END_CASE */
4257
Ronald Cron6f135e12021-12-08 16:57:54 +01004258/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004259void ssl_tls13_traffic_key_generation( int hash_alg,
4260 data_t *server_secret,
4261 data_t *client_secret,
4262 int desired_iv_len,
4263 int desired_key_len,
4264 data_t *expected_server_write_key,
4265 data_t *expected_server_write_iv,
4266 data_t *expected_client_write_key,
4267 data_t *expected_client_write_iv )
Hanno Becker19498f82020-08-21 13:37:08 +01004268{
4269 mbedtls_ssl_key_set keys;
4270
4271 /* Check sanity of test parameters. */
4272 TEST_ASSERT( client_secret->len == server_secret->len );
4273 TEST_ASSERT( expected_client_write_iv->len == expected_server_write_iv->len &&
4274 expected_client_write_iv->len == (size_t) desired_iv_len );
4275 TEST_ASSERT( expected_client_write_key->len == expected_server_write_key->len &&
4276 expected_client_write_key->len == (size_t) desired_key_len );
4277
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004278 PSA_INIT( );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004279
Xiaofei Bai746f9482021-11-12 08:53:56 +00004280 TEST_ASSERT( mbedtls_ssl_tls13_make_traffic_keys(
Gabor Mezei07732f72022-03-26 17:04:19 +01004281 (psa_algorithm_t) hash_alg,
Hanno Becker19498f82020-08-21 13:37:08 +01004282 client_secret->x,
4283 server_secret->x,
4284 client_secret->len /* == server_secret->len */,
4285 desired_key_len, desired_iv_len,
4286 &keys ) == 0 );
4287
Hanno Beckerfb080962020-09-08 10:58:42 +01004288 ASSERT_COMPARE( keys.client_write_key,
Hanno Becker493ea7f2020-09-08 11:01:00 +01004289 keys.key_len,
Hanno Beckerfb080962020-09-08 10:58:42 +01004290 expected_client_write_key->x,
4291 (size_t) desired_key_len );
4292 ASSERT_COMPARE( keys.server_write_key,
Hanno Becker493ea7f2020-09-08 11:01:00 +01004293 keys.key_len,
Hanno Beckerfb080962020-09-08 10:58:42 +01004294 expected_server_write_key->x,
4295 (size_t) desired_key_len );
4296 ASSERT_COMPARE( keys.client_write_iv,
Hanno Becker493ea7f2020-09-08 11:01:00 +01004297 keys.iv_len,
Hanno Beckerfb080962020-09-08 10:58:42 +01004298 expected_client_write_iv->x,
4299 (size_t) desired_iv_len );
4300 ASSERT_COMPARE( keys.server_write_iv,
Hanno Becker493ea7f2020-09-08 11:01:00 +01004301 keys.iv_len,
Hanno Beckerfb080962020-09-08 10:58:42 +01004302 expected_server_write_iv->x,
4303 (size_t) desired_iv_len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004304
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004305 PSA_DONE( );
Hanno Becker19498f82020-08-21 13:37:08 +01004306}
4307/* END_CASE */
4308
Ronald Cron6f135e12021-12-08 16:57:54 +01004309/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004310void ssl_tls13_derive_secret( int hash_alg,
4311 data_t *secret,
4312 int label_idx,
4313 data_t *ctx,
4314 int desired_length,
4315 int already_hashed,
4316 data_t *expected )
Hanno Beckere4849d12020-08-21 14:14:14 +01004317{
4318 unsigned char dst[ 100 ];
4319
Hanno Becker70d7fb02020-09-09 10:11:21 +01004320 unsigned char const *lbl = NULL;
4321 size_t lbl_len;
Xiaofei Baid25fab62021-12-02 06:36:27 +00004322#define MBEDTLS_SSL_TLS1_3_LABEL( name, string ) \
4323 if( label_idx == (int) tls13_label_ ## name ) \
4324 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00004325 lbl = mbedtls_ssl_tls13_labels.name; \
4326 lbl_len = sizeof( mbedtls_ssl_tls13_labels.name ); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01004327 }
4328MBEDTLS_SSL_TLS1_3_LABEL_LIST
4329#undef MBEDTLS_SSL_TLS1_3_LABEL
4330 TEST_ASSERT( lbl != NULL );
4331
Hanno Beckere4849d12020-08-21 14:14:14 +01004332 /* Check sanity of test parameters. */
4333 TEST_ASSERT( (size_t) desired_length <= sizeof(dst) );
4334 TEST_ASSERT( (size_t) desired_length == expected->len );
4335
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004336 PSA_INIT( );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004337
Xiaofei Bai746f9482021-11-12 08:53:56 +00004338 TEST_ASSERT( mbedtls_ssl_tls13_derive_secret(
Gabor Mezei07732f72022-03-26 17:04:19 +01004339 (psa_algorithm_t) hash_alg,
Hanno Beckere4849d12020-08-21 14:14:14 +01004340 secret->x, secret->len,
Hanno Becker70d7fb02020-09-09 10:11:21 +01004341 lbl, lbl_len,
Hanno Beckere4849d12020-08-21 14:14:14 +01004342 ctx->x, ctx->len,
4343 already_hashed,
4344 dst, desired_length ) == 0 );
4345
Hanno Beckerfb080962020-09-08 10:58:42 +01004346 ASSERT_COMPARE( dst, desired_length,
4347 expected->x, desired_length );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004348
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004349 PSA_DONE( );
Hanno Beckere4849d12020-08-21 14:14:14 +01004350}
4351/* END_CASE */
4352
Ronald Cron6f135e12021-12-08 16:57:54 +01004353/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004354void ssl_tls13_derive_early_secrets( int hash_alg,
4355 data_t *secret,
4356 data_t *transcript,
4357 data_t *traffic_expected,
4358 data_t *exporter_expected )
Hanno Beckera4f40a02021-05-24 06:42:11 +01004359{
Xiaofei Bai746f9482021-11-12 08:53:56 +00004360 mbedtls_ssl_tls13_early_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01004361
4362 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004363 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
4364 size_t const hash_len = PSA_HASH_LENGTH( alg );
4365 TEST_ASSERT( PSA_ALG_IS_HASH( alg ) &&
4366 secret->len == hash_len &&
4367 transcript->len == hash_len &&
4368 traffic_expected->len == hash_len &&
4369 exporter_expected->len == hash_len );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004370
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004371 PSA_INIT( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004372
Xiaofei Bai746f9482021-11-12 08:53:56 +00004373 TEST_ASSERT( mbedtls_ssl_tls13_derive_early_secrets(
Gabor Mezei07732f72022-03-26 17:04:19 +01004374 alg, secret->x, transcript->x, transcript->len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004375 &secrets ) == 0 );
4376
Gabor Mezei07732f72022-03-26 17:04:19 +01004377 ASSERT_COMPARE( secrets.client_early_traffic_secret, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004378 traffic_expected->x, traffic_expected->len );
Gabor Mezei07732f72022-03-26 17:04:19 +01004379 ASSERT_COMPARE( secrets.early_exporter_master_secret, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004380 exporter_expected->x, exporter_expected->len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004381
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004382 PSA_DONE( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004383}
4384/* END_CASE */
4385
Ronald Cron6f135e12021-12-08 16:57:54 +01004386/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004387void ssl_tls13_derive_handshake_secrets( int hash_alg,
4388 data_t *secret,
4389 data_t *transcript,
4390 data_t *client_expected,
4391 data_t *server_expected )
Hanno Beckera4f40a02021-05-24 06:42:11 +01004392{
Xiaofei Bai746f9482021-11-12 08:53:56 +00004393 mbedtls_ssl_tls13_handshake_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01004394
4395 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004396 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
4397 size_t const hash_len = PSA_HASH_LENGTH( alg );
4398 TEST_ASSERT( PSA_ALG_IS_HASH( alg ) &&
4399 secret->len == hash_len &&
4400 transcript->len == hash_len &&
4401 client_expected->len == hash_len &&
4402 server_expected->len == hash_len );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004403
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004404 PSA_INIT( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004405
Xiaofei Bai746f9482021-11-12 08:53:56 +00004406 TEST_ASSERT( mbedtls_ssl_tls13_derive_handshake_secrets(
Gabor Mezei07732f72022-03-26 17:04:19 +01004407 alg, secret->x, transcript->x, transcript->len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004408 &secrets ) == 0 );
4409
Gabor Mezei07732f72022-03-26 17:04:19 +01004410 ASSERT_COMPARE( secrets.client_handshake_traffic_secret, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004411 client_expected->x, client_expected->len );
Gabor Mezei07732f72022-03-26 17:04:19 +01004412 ASSERT_COMPARE( secrets.server_handshake_traffic_secret, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004413 server_expected->x, server_expected->len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004414
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004415 PSA_DONE( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004416}
4417/* END_CASE */
4418
Ronald Cron6f135e12021-12-08 16:57:54 +01004419/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004420void ssl_tls13_derive_application_secrets( int hash_alg,
4421 data_t *secret,
4422 data_t *transcript,
4423 data_t *client_expected,
4424 data_t *server_expected,
4425 data_t *exporter_expected )
Hanno Beckera4f40a02021-05-24 06:42:11 +01004426{
Xiaofei Bai746f9482021-11-12 08:53:56 +00004427 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01004428
4429 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004430 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
4431 size_t const hash_len = PSA_HASH_LENGTH( alg );
4432 TEST_ASSERT( PSA_ALG_IS_HASH( alg ) &&
4433 secret->len == hash_len &&
4434 transcript->len == hash_len &&
4435 client_expected->len == hash_len &&
4436 server_expected->len == hash_len &&
4437 exporter_expected->len == hash_len );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004438
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004439 PSA_INIT( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004440
Xiaofei Bai746f9482021-11-12 08:53:56 +00004441 TEST_ASSERT( mbedtls_ssl_tls13_derive_application_secrets(
Gabor Mezei07732f72022-03-26 17:04:19 +01004442 alg, secret->x, transcript->x, transcript->len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004443 &secrets ) == 0 );
4444
Gabor Mezei07732f72022-03-26 17:04:19 +01004445 ASSERT_COMPARE( secrets.client_application_traffic_secret_N, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004446 client_expected->x, client_expected->len );
Gabor Mezei07732f72022-03-26 17:04:19 +01004447 ASSERT_COMPARE( secrets.server_application_traffic_secret_N, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004448 server_expected->x, server_expected->len );
Gabor Mezei07732f72022-03-26 17:04:19 +01004449 ASSERT_COMPARE( secrets.exporter_master_secret, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004450 exporter_expected->x, exporter_expected->len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004451
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004452 PSA_DONE( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004453}
4454/* END_CASE */
4455
Ronald Cron6f135e12021-12-08 16:57:54 +01004456/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004457void ssl_tls13_derive_resumption_secrets( int hash_alg,
4458 data_t *secret,
4459 data_t *transcript,
4460 data_t *resumption_expected )
Hanno Beckera4f40a02021-05-24 06:42:11 +01004461{
Xiaofei Bai746f9482021-11-12 08:53:56 +00004462 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01004463
4464 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004465 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
4466 size_t const hash_len = PSA_HASH_LENGTH( alg );
4467 TEST_ASSERT( PSA_ALG_IS_HASH( alg ) &&
4468 secret->len == hash_len &&
4469 transcript->len == hash_len &&
4470 resumption_expected->len == hash_len );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004471
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004472 PSA_INIT( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004473
Xiaofei Bai746f9482021-11-12 08:53:56 +00004474 TEST_ASSERT( mbedtls_ssl_tls13_derive_resumption_master_secret(
Gabor Mezei07732f72022-03-26 17:04:19 +01004475 alg, secret->x, transcript->x, transcript->len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004476 &secrets ) == 0 );
4477
Gabor Mezei07732f72022-03-26 17:04:19 +01004478 ASSERT_COMPARE( secrets.resumption_master_secret, hash_len,
Hanno Beckera4f40a02021-05-24 06:42:11 +01004479 resumption_expected->x, resumption_expected->len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004480
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004481 PSA_DONE( );
Hanno Beckera4f40a02021-05-24 06:42:11 +01004482}
4483/* END_CASE */
4484
Ronald Cron6f135e12021-12-08 16:57:54 +01004485/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004486void ssl_tls13_create_psk_binder( int hash_alg,
4487 data_t *psk,
4488 int psk_type,
4489 data_t *transcript,
4490 data_t *binder_expected )
Hanno Becker55bc2c52021-05-24 06:53:52 +01004491{
4492 unsigned char binder[ MBEDTLS_MD_MAX_SIZE ];
4493
4494 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004495 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
4496 size_t const hash_len = PSA_HASH_LENGTH( alg );
4497 TEST_ASSERT( PSA_ALG_IS_HASH( alg ) &&
4498 transcript->len == hash_len &&
4499 binder_expected->len == hash_len );
Hanno Becker55bc2c52021-05-24 06:53:52 +01004500
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004501 PSA_INIT( );
Hanno Becker55bc2c52021-05-24 06:53:52 +01004502
Xiaofei Bai746f9482021-11-12 08:53:56 +00004503 TEST_ASSERT( mbedtls_ssl_tls13_create_psk_binder(
Hanno Becker55bc2c52021-05-24 06:53:52 +01004504 NULL, /* SSL context for debugging only */
Gabor Mezei07732f72022-03-26 17:04:19 +01004505 alg,
Hanno Becker55bc2c52021-05-24 06:53:52 +01004506 psk->x, psk->len,
4507 psk_type,
4508 transcript->x,
4509 binder ) == 0 );
4510
Gabor Mezei07732f72022-03-26 17:04:19 +01004511 ASSERT_COMPARE( binder, hash_len,
Hanno Becker55bc2c52021-05-24 06:53:52 +01004512 binder_expected->x, binder_expected->len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004513
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004514 PSA_DONE( );
Hanno Becker55bc2c52021-05-24 06:53:52 +01004515}
4516/* END_CASE */
4517
Ronald Cron6f135e12021-12-08 16:57:54 +01004518/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004519void ssl_tls13_record_protection( int ciphersuite,
4520 int endpoint,
4521 int ctr,
4522 int padding_used,
4523 data_t *server_write_key,
4524 data_t *server_write_iv,
4525 data_t *client_write_key,
4526 data_t *client_write_iv,
4527 data_t *plaintext,
4528 data_t *ciphertext )
Hanno Beckera77d0052021-03-22 15:16:33 +00004529{
4530 mbedtls_ssl_key_set keys;
4531 mbedtls_ssl_transform transform_send;
4532 mbedtls_ssl_transform transform_recv;
4533 mbedtls_record rec;
4534 unsigned char *buf = NULL;
Hanno Becker1f918782021-08-01 19:18:28 +01004535 size_t buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00004536 int other_endpoint;
4537
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01004538 USE_PSA_INIT( );
4539
Hanno Beckera77d0052021-03-22 15:16:33 +00004540 TEST_ASSERT( endpoint == MBEDTLS_SSL_IS_CLIENT ||
4541 endpoint == MBEDTLS_SSL_IS_SERVER );
4542
4543 if( endpoint == MBEDTLS_SSL_IS_SERVER )
4544 other_endpoint = MBEDTLS_SSL_IS_CLIENT;
4545 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
4546 other_endpoint = MBEDTLS_SSL_IS_SERVER;
4547
4548 TEST_ASSERT( server_write_key->len == client_write_key->len );
4549 TEST_ASSERT( server_write_iv->len == client_write_iv->len );
4550
4551 memcpy( keys.client_write_key,
4552 client_write_key->x, client_write_key->len );
4553 memcpy( keys.client_write_iv,
4554 client_write_iv->x, client_write_iv->len );
4555 memcpy( keys.server_write_key,
4556 server_write_key->x, server_write_key->len );
4557 memcpy( keys.server_write_iv,
4558 server_write_iv->x, server_write_iv->len );
4559
4560 keys.key_len = server_write_key->len;
4561 keys.iv_len = server_write_iv->len;
4562
4563 mbedtls_ssl_transform_init( &transform_recv );
4564 mbedtls_ssl_transform_init( &transform_send );
4565
4566 TEST_ASSERT( mbedtls_ssl_tls13_populate_transform(
4567 &transform_send, endpoint,
4568 ciphersuite, &keys, NULL ) == 0 );
4569 TEST_ASSERT( mbedtls_ssl_tls13_populate_transform(
4570 &transform_recv, other_endpoint,
4571 ciphersuite, &keys, NULL ) == 0 );
4572
Hanno Becker1f918782021-08-01 19:18:28 +01004573 /* Make sure we have enough space in the buffer even if
4574 * we use more padding than the KAT. */
4575 buf_len = ciphertext->len + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
4576 ASSERT_ALLOC( buf, buf_len );
Hanno Beckera77d0052021-03-22 15:16:33 +00004577 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
Hanno Becker41537452021-04-20 05:35:28 +01004578
4579 /* TLS 1.3 uses the version identifier from TLS 1.2 on the wire. */
Glenn Strausse3af4cb2022-03-15 03:23:42 -04004580 mbedtls_ssl_write_version( rec.ver,
Hanno Beckera77d0052021-03-22 15:16:33 +00004581 MBEDTLS_SSL_TRANSPORT_STREAM,
Glenn Strausse3af4cb2022-03-15 03:23:42 -04004582 MBEDTLS_SSL_VERSION_TLS1_2 );
Hanno Beckera77d0052021-03-22 15:16:33 +00004583
4584 /* Copy plaintext into record structure */
4585 rec.buf = buf;
Hanno Becker1f918782021-08-01 19:18:28 +01004586 rec.buf_len = buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00004587 rec.data_offset = 0;
4588 TEST_ASSERT( plaintext->len <= ciphertext->len );
4589 memcpy( rec.buf + rec.data_offset, plaintext->x, plaintext->len );
4590 rec.data_len = plaintext->len;
4591#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4592 rec.cid_len = 0;
4593#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4594
4595 memset( &rec.ctr[0], 0, 8 );
4596 rec.ctr[7] = ctr;
4597
4598 TEST_ASSERT( mbedtls_ssl_encrypt_buf( NULL, &transform_send, &rec,
4599 NULL, NULL ) == 0 );
Hanno Becker1f918782021-08-01 19:18:28 +01004600
4601 if( padding_used == MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY )
4602 {
4603 ASSERT_COMPARE( rec.buf + rec.data_offset, rec.data_len,
4604 ciphertext->x, ciphertext->len );
4605 }
Hanno Beckera77d0052021-03-22 15:16:33 +00004606
4607 TEST_ASSERT( mbedtls_ssl_decrypt_buf( NULL, &transform_recv, &rec ) == 0 );
4608 ASSERT_COMPARE( rec.buf + rec.data_offset, rec.data_len,
4609 plaintext->x, plaintext->len );
4610
Hanno Becker80e760e2021-03-23 06:00:21 +00004611 mbedtls_free( buf );
Hanno Beckera77d0052021-03-22 15:16:33 +00004612 mbedtls_ssl_transform_free( &transform_send );
4613 mbedtls_ssl_transform_free( &transform_recv );
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01004614 USE_PSA_DONE( );
Hanno Beckera77d0052021-03-22 15:16:33 +00004615}
4616/* END_CASE */
4617
Ronald Cron6f135e12021-12-08 16:57:54 +01004618/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004619void ssl_tls13_key_evolution( int hash_alg,
4620 data_t *secret,
4621 data_t *input,
4622 data_t *expected )
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01004623{
4624 unsigned char secret_new[ MBEDTLS_MD_MAX_SIZE ];
4625
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004626 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004627
Xiaofei Bai746f9482021-11-12 08:53:56 +00004628 TEST_ASSERT( mbedtls_ssl_tls13_evolve_secret(
Gabor Mezei07732f72022-03-26 17:04:19 +01004629 (psa_algorithm_t) hash_alg,
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01004630 secret->len ? secret->x : NULL,
4631 input->len ? input->x : NULL, input->len,
4632 secret_new ) == 0 );
4633
Hanno Beckerfb080962020-09-08 10:58:42 +01004634 ASSERT_COMPARE( secret_new, (size_t) expected->len,
4635 expected->x, (size_t) expected->len );
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004636
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004637 PSA_DONE();
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01004638}
4639/* END_CASE */
4640
Jerry Yu53d23e22022-02-09 16:25:09 +08004641/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2 */
Ron Eldor824ad7b2019-05-13 14:09:00 +03004642void ssl_tls_prf( int type, data_t * secret, data_t * random,
Ronald Cronac6ae352020-06-26 14:33:03 +02004643 char *label, data_t *result_str, int exp_ret )
Ron Eldor824ad7b2019-05-13 14:09:00 +03004644{
4645 unsigned char *output;
4646
Ronald Cronac6ae352020-06-26 14:33:03 +02004647 output = mbedtls_calloc( 1, result_str->len );
Ron Eldor824ad7b2019-05-13 14:09:00 +03004648 if( output == NULL )
4649 goto exit;
4650
Gilles Peskine9de97e22021-02-02 21:00:11 +01004651 USE_PSA_INIT( );
Ron Eldor6b9b1b82019-05-15 17:04:33 +03004652
Ron Eldor824ad7b2019-05-13 14:09:00 +03004653 TEST_ASSERT( mbedtls_ssl_tls_prf( type, secret->x, secret->len,
4654 label, random->x, random->len,
Ronald Cronac6ae352020-06-26 14:33:03 +02004655 output, result_str->len ) == exp_ret );
Ron Eldor824ad7b2019-05-13 14:09:00 +03004656
4657 if( exp_ret == 0 )
4658 {
Ronald Cronac6ae352020-06-26 14:33:03 +02004659 TEST_ASSERT( mbedtls_test_hexcmp( output, result_str->x,
4660 result_str->len, result_str->len ) == 0 );
Ron Eldor824ad7b2019-05-13 14:09:00 +03004661 }
4662exit:
4663
4664 mbedtls_free( output );
Gilles Peskine1f186ff2021-02-02 21:04:06 +01004665 USE_PSA_DONE( );
Ron Eldor824ad7b2019-05-13 14:09:00 +03004666}
4667/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004668
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004669/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004670void ssl_serialize_session_save_load( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004671{
4672 mbedtls_ssl_session original, restored;
4673 unsigned char *buf = NULL;
4674 size_t len;
4675
4676 /*
4677 * Test that a save-load pair is the identity
4678 */
4679
4680 mbedtls_ssl_session_init( &original );
4681 mbedtls_ssl_session_init( &restored );
4682
4683 /* Prepare a dummy session to work on */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004684 TEST_ASSERT( ssl_populate_session_tls12( &original, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004685
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004686 /* Serialize it */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004687 TEST_ASSERT( mbedtls_ssl_session_save( &original, NULL, 0, &len )
4688 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
4689 TEST_ASSERT( ( buf = mbedtls_calloc( 1, len ) ) != NULL );
4690 TEST_ASSERT( mbedtls_ssl_session_save( &original, buf, len, &len )
4691 == 0 );
4692
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004693 /* Restore session from serialized data */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004694 TEST_ASSERT( mbedtls_ssl_session_load( &restored, buf, len) == 0 );
4695
4696 /*
4697 * Make sure both session structures are identical
4698 */
4699#if defined(MBEDTLS_HAVE_TIME)
4700 TEST_ASSERT( original.start == restored.start );
4701#endif
Glenn Straussda7851c2022-03-14 13:29:48 -04004702 TEST_ASSERT( original.tls_version == restored.tls_version );
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004703 TEST_ASSERT( original.ciphersuite == restored.ciphersuite );
4704 TEST_ASSERT( original.compression == restored.compression );
4705 TEST_ASSERT( original.id_len == restored.id_len );
4706 TEST_ASSERT( memcmp( original.id,
4707 restored.id, sizeof( original.id ) ) == 0 );
4708 TEST_ASSERT( memcmp( original.master,
4709 restored.master, sizeof( original.master ) ) == 0 );
4710
4711#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02004712#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004713 TEST_ASSERT( ( original.peer_cert == NULL ) ==
4714 ( restored.peer_cert == NULL ) );
4715 if( original.peer_cert != NULL )
4716 {
4717 TEST_ASSERT( original.peer_cert->raw.len ==
4718 restored.peer_cert->raw.len );
4719 TEST_ASSERT( memcmp( original.peer_cert->raw.p,
4720 restored.peer_cert->raw.p,
4721 original.peer_cert->raw.len ) == 0 );
4722 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02004723#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4724 TEST_ASSERT( original.peer_cert_digest_type ==
4725 restored.peer_cert_digest_type );
4726 TEST_ASSERT( original.peer_cert_digest_len ==
4727 restored.peer_cert_digest_len );
4728 TEST_ASSERT( ( original.peer_cert_digest == NULL ) ==
4729 ( restored.peer_cert_digest == NULL ) );
4730 if( original.peer_cert_digest != NULL )
4731 {
4732 TEST_ASSERT( memcmp( original.peer_cert_digest,
4733 restored.peer_cert_digest,
4734 original.peer_cert_digest_len ) == 0 );
4735 }
4736#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4737#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004738 TEST_ASSERT( original.verify_result == restored.verify_result );
4739
4740#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
4741 TEST_ASSERT( original.ticket_len == restored.ticket_len );
4742 if( original.ticket_len != 0 )
4743 {
4744 TEST_ASSERT( original.ticket != NULL );
4745 TEST_ASSERT( restored.ticket != NULL );
4746 TEST_ASSERT( memcmp( original.ticket,
4747 restored.ticket, original.ticket_len ) == 0 );
4748 }
4749 TEST_ASSERT( original.ticket_lifetime == restored.ticket_lifetime );
4750#endif
4751
4752#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
4753 TEST_ASSERT( original.mfl_code == restored.mfl_code );
4754#endif
4755
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004756#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
4757 TEST_ASSERT( original.encrypt_then_mac == restored.encrypt_then_mac );
4758#endif
4759
4760exit:
4761 mbedtls_ssl_session_free( &original );
4762 mbedtls_ssl_session_free( &restored );
4763 mbedtls_free( buf );
4764}
4765/* END_CASE */
4766
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02004767/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004768void ssl_serialize_session_load_save( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004769{
4770 mbedtls_ssl_session session;
4771 unsigned char *buf1 = NULL, *buf2 = NULL;
4772 size_t len0, len1, len2;
4773
4774 /*
4775 * Test that a load-save pair is the identity
4776 */
4777
4778 mbedtls_ssl_session_init( &session );
4779
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02004780 /* Prepare a dummy session to work on */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004781 TEST_ASSERT( ssl_populate_session_tls12( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02004782
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004783 /* Get desired buffer size for serializing */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004784 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &len0 )
4785 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
4786
4787 /* Allocate first buffer */
4788 buf1 = mbedtls_calloc( 1, len0 );
4789 TEST_ASSERT( buf1 != NULL );
4790
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004791 /* Serialize to buffer and free live session */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004792 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf1, len0, &len1 )
4793 == 0 );
4794 TEST_ASSERT( len0 == len1 );
4795 mbedtls_ssl_session_free( &session );
4796
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004797 /* Restore session from serialized data */
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02004798 TEST_ASSERT( mbedtls_ssl_session_load( &session, buf1, len1 ) == 0 );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004799
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004800 /* Allocate second buffer and serialize to it */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004801 buf2 = mbedtls_calloc( 1, len0 );
Manuel Pégourié-Gonnardb4079902019-05-24 09:52:10 +02004802 TEST_ASSERT( buf2 != NULL );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004803 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf2, len0, &len2 )
4804 == 0 );
4805
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004806 /* Make sure both serialized versions are identical */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004807 TEST_ASSERT( len1 == len2 );
4808 TEST_ASSERT( memcmp( buf1, buf2, len1 ) == 0 );
4809
4810exit:
4811 mbedtls_ssl_session_free( &session );
4812 mbedtls_free( buf1 );
4813 mbedtls_free( buf2 );
4814}
4815/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004816
4817/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004818void ssl_serialize_session_save_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004819{
4820 mbedtls_ssl_session session;
4821 unsigned char *buf = NULL;
4822 size_t good_len, bad_len, test_len;
4823
4824 /*
4825 * Test that session_save() fails cleanly on small buffers
4826 */
4827
4828 mbedtls_ssl_session_init( &session );
4829
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004830 /* Prepare dummy session and get serialized size */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004831 TEST_ASSERT( ssl_populate_session_tls12( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004832 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
4833 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
4834
4835 /* Try all possible bad lengths */
4836 for( bad_len = 1; bad_len < good_len; bad_len++ )
4837 {
4838 /* Allocate exact size so that asan/valgrind can detect any overwrite */
4839 mbedtls_free( buf );
4840 TEST_ASSERT( ( buf = mbedtls_calloc( 1, bad_len ) ) != NULL );
4841 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf, bad_len,
4842 &test_len )
4843 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
4844 TEST_ASSERT( test_len == good_len );
4845 }
4846
4847exit:
4848 mbedtls_ssl_session_free( &session );
4849 mbedtls_free( buf );
4850}
4851/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004852
4853/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004854void ssl_serialize_session_load_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004855{
4856 mbedtls_ssl_session session;
4857 unsigned char *good_buf = NULL, *bad_buf = NULL;
4858 size_t good_len, bad_len;
4859
4860 /*
4861 * Test that session_load() fails cleanly on small buffers
4862 */
4863
4864 mbedtls_ssl_session_init( &session );
4865
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004866 /* Prepare serialized session data */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004867 TEST_ASSERT( ssl_populate_session_tls12( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004868 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
4869 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
4870 TEST_ASSERT( ( good_buf = mbedtls_calloc( 1, good_len ) ) != NULL );
4871 TEST_ASSERT( mbedtls_ssl_session_save( &session, good_buf, good_len,
4872 &good_len ) == 0 );
4873 mbedtls_ssl_session_free( &session );
4874
4875 /* Try all possible bad lengths */
4876 for( bad_len = 0; bad_len < good_len; bad_len++ )
4877 {
4878 /* Allocate exact size so that asan/valgrind can detect any overread */
4879 mbedtls_free( bad_buf );
4880 bad_buf = mbedtls_calloc( 1, bad_len ? bad_len : 1 );
4881 TEST_ASSERT( bad_buf != NULL );
4882 memcpy( bad_buf, good_buf, bad_len );
4883
4884 TEST_ASSERT( mbedtls_ssl_session_load( &session, bad_buf, bad_len )
4885 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4886 }
4887
4888exit:
4889 mbedtls_ssl_session_free( &session );
4890 mbedtls_free( good_buf );
4891 mbedtls_free( bad_buf );
4892}
4893/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01004894
Hanno Becker363b6462019-05-29 12:44:28 +01004895/* BEGIN_CASE */
4896void ssl_session_serialize_version_check( int corrupt_major,
Hanno Becker861d0bb2019-05-21 16:39:30 +01004897 int corrupt_minor,
4898 int corrupt_patch,
4899 int corrupt_config )
4900{
Hanno Becker363b6462019-05-29 12:44:28 +01004901 unsigned char serialized_session[ 2048 ];
4902 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004903 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01004904 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004905 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
4906 corrupt_minor == 1,
4907 corrupt_patch == 1,
4908 corrupt_config == 1,
4909 corrupt_config == 1 };
4910
Hanno Becker861d0bb2019-05-21 16:39:30 +01004911 mbedtls_ssl_session_init( &session );
Paul Elliott46a6c202021-12-09 18:16:13 +00004912 TEST_ASSERT( ssl_populate_session_tls12( &session, 0, NULL ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01004913
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004914 /* Infer length of serialized session. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01004915 TEST_ASSERT( mbedtls_ssl_session_save( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01004916 serialized_session,
4917 sizeof( serialized_session ),
4918 &serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01004919
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004920 mbedtls_ssl_session_free( &session );
Hanno Becker861d0bb2019-05-21 16:39:30 +01004921
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004922 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01004923 * de-serialize the session - double-check that. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01004924 TEST_ASSERT( mbedtls_ssl_session_load( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01004925 serialized_session,
4926 serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01004927 mbedtls_ssl_session_free( &session );
4928
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004929 /* Go through the bytes in the serialized session header and
4930 * corrupt them bit-by-bit. */
4931 for( cur_byte = 0; cur_byte < sizeof( should_corrupt_byte ); cur_byte++ )
Hanno Becker861d0bb2019-05-21 16:39:30 +01004932 {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004933 int cur_bit;
4934 unsigned char * const byte = &serialized_session[ cur_byte ];
4935
4936 if( should_corrupt_byte[ cur_byte ] == 0 )
4937 continue;
4938
4939 for( cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++ )
4940 {
4941 unsigned char const corrupted_bit = 0x1u << cur_bit;
4942 /* Modify a single bit in the serialized session. */
4943 *byte ^= corrupted_bit;
4944
4945 /* Attempt to deserialize */
4946 TEST_ASSERT( mbedtls_ssl_session_load( &session,
4947 serialized_session,
4948 serialized_session_len ) ==
Hanno Beckerf9b33032019-06-03 12:58:39 +01004949 MBEDTLS_ERR_SSL_VERSION_MISMATCH );
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004950
4951 /* Undo the change */
4952 *byte ^= corrupted_bit;
4953 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01004954 }
4955
Hanno Becker861d0bb2019-05-21 16:39:30 +01004956}
4957/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004958
Neil Armstrong07393362022-04-14 15:36:17 +02004959/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004960void mbedtls_endpoint_sanity( int endpoint_type )
4961{
4962 enum { BUFFSIZE = 1024 };
4963 mbedtls_endpoint ep;
4964 int ret = -1;
4965
Andrzej Kurek15daf502020-02-12 09:17:52 -05004966 ret = mbedtls_endpoint_init( NULL, endpoint_type, MBEDTLS_PK_RSA,
Andrzej Kurek74394a52022-03-08 06:50:12 -05004967 NULL, NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004968 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
4969
Andrzej Kurekb2980742020-02-02 19:25:26 -05004970 ret = mbedtls_endpoint_certificate_init( NULL, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004971 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
4972
Andrzej Kurek15daf502020-02-12 09:17:52 -05004973 ret = mbedtls_endpoint_init( &ep, endpoint_type, MBEDTLS_PK_RSA,
Andrzej Kurek74394a52022-03-08 06:50:12 -05004974 NULL, NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004975 TEST_ASSERT( ret == 0 );
4976
4977exit:
Andrzej Kurek15daf502020-02-12 09:17:52 -05004978 mbedtls_endpoint_free( &ep, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004979}
4980/* END_CASE */
4981
Jerry Yu023ff7a2022-04-29 17:00:19 +08004982/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004983void move_handshake_to_state(int endpoint_type, int state, int need_pass)
4984{
4985 enum { BUFFSIZE = 1024 };
4986 mbedtls_endpoint base_ep, second_ep;
4987 int ret = -1;
4988
Neil Armstrong06baf042022-04-14 16:21:15 +02004989 USE_PSA_INIT( );
4990
Andrzej Kurek15daf502020-02-12 09:17:52 -05004991 ret = mbedtls_endpoint_init( &base_ep, endpoint_type, MBEDTLS_PK_RSA,
Andrzej Kurek74394a52022-03-08 06:50:12 -05004992 NULL, NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004993 TEST_ASSERT( ret == 0 );
4994
4995 ret = mbedtls_endpoint_init( &second_ep,
4996 ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ?
Andrzej Kurekb2980742020-02-02 19:25:26 -05004997 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
Andrzej Kurek74394a52022-03-08 06:50:12 -05004998 MBEDTLS_PK_RSA, NULL, NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004999 TEST_ASSERT( ret == 0 );
5000
5001 ret = mbedtls_mock_socket_connect( &(base_ep.socket),
5002 &(second_ep.socket),
5003 BUFFSIZE );
5004 TEST_ASSERT( ret == 0 );
5005
5006 ret = mbedtls_move_handshake_to_state( &(base_ep.ssl),
5007 &(second_ep.ssl),
5008 state );
5009 if( need_pass )
5010 {
Jerry Yu14435372022-06-01 15:53:31 +08005011 TEST_ASSERT( ret == 0 ||
5012 ret == MBEDTLS_ERR_SSL_WANT_READ ||
5013 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005014 TEST_ASSERT( base_ep.ssl.state == state );
5015 }
5016 else
5017 {
Jerry Yu14435372022-06-01 15:53:31 +08005018 TEST_ASSERT( ret != 0 &&
5019 ret != MBEDTLS_ERR_SSL_WANT_READ &&
5020 ret != MBEDTLS_ERR_SSL_WANT_WRITE );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005021 TEST_ASSERT( base_ep.ssl.state != state );
5022 }
5023
5024exit:
Andrzej Kurek15daf502020-02-12 09:17:52 -05005025 mbedtls_endpoint_free( &base_ep, NULL );
5026 mbedtls_endpoint_free( &second_ep, NULL );
Neil Armstrong06baf042022-04-14 16:21:15 +02005027 USE_PSA_DONE( );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005028}
5029/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005030
Neil Armstrong46a17602022-02-23 15:11:16 +01005031/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Paul Elliottc8570442020-04-15 17:00:50 +01005032void handshake_version( int dtls, int client_min_version, int client_max_version,
5033 int server_min_version, int server_max_version,
5034 int expected_negotiated_version )
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005035{
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005036 handshake_test_options options;
5037 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005038
Paul Elliottc8570442020-04-15 17:00:50 +01005039 options.client_min_version = client_min_version;
5040 options.client_max_version = client_max_version;
5041 options.server_min_version = server_min_version;
5042 options.server_max_version = server_max_version;
Paul Elliottc8570442020-04-15 17:00:50 +01005043 options.expected_negotiated_version = expected_negotiated_version;
5044
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005045 options.dtls = dtls;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005046 perform_handshake( &options );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005047
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005048 /* The goto below is used to avoid an "unused label" warning.*/
5049 goto exit;
5050}
5051/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05005052
Neil Armstrong46a17602022-02-23 15:11:16 +01005053/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005054void handshake_psk_cipher( char* cipher, int pk_alg, data_t *psk_str, int dtls )
5055{
5056 handshake_test_options options;
5057 init_handshake_options( &options );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005058
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005059 options.cipher = cipher;
5060 options.dtls = dtls;
5061 options.psk_str = psk_str;
5062 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05005063
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005064 perform_handshake( &options );
Andrzej Kurek316da1f2020-02-26 09:03:47 -05005065
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005066 /* The goto below is used to avoid an "unused label" warning.*/
5067 goto exit;
5068}
5069/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05005070
Neil Armstrong46a17602022-02-23 15:11:16 +01005071/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005072void handshake_cipher( char* cipher, int pk_alg, int dtls )
5073{
5074 test_handshake_psk_cipher( cipher, pk_alg, NULL, dtls );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005075
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005076 /* The goto below is used to avoid an "unused label" warning.*/
5077 goto exit;
5078}
5079/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005080
Neil Armstrong46a17602022-02-23 15:11:16 +01005081/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005082void app_data( int mfl, int cli_msg_len, int srv_msg_len,
5083 int expected_cli_fragments,
5084 int expected_srv_fragments, int dtls )
5085{
5086 handshake_test_options options;
5087 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005088
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005089 options.mfl = mfl;
5090 options.cli_msg_len = cli_msg_len;
5091 options.srv_msg_len = srv_msg_len;
5092 options.expected_cli_fragments = expected_cli_fragments;
5093 options.expected_srv_fragments = expected_srv_fragments;
5094 options.dtls = dtls;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005095
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005096 perform_handshake( &options );
5097 /* The goto below is used to avoid an "unused label" warning.*/
5098 goto exit;
5099}
5100/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005101
Neil Armstrong993eea32022-04-14 15:37:23 +02005102/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005103void app_data_tls( int mfl, int cli_msg_len, int srv_msg_len,
5104 int expected_cli_fragments,
5105 int expected_srv_fragments )
5106{
5107 test_app_data( mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
5108 expected_srv_fragments, 0 );
5109 /* The goto below is used to avoid an "unused label" warning.*/
5110 goto exit;
5111}
5112/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005113
Neil Armstrong993eea32022-04-14 15:37:23 +02005114/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005115void app_data_dtls( int mfl, int cli_msg_len, int srv_msg_len,
5116 int expected_cli_fragments,
5117 int expected_srv_fragments )
5118{
5119 test_app_data( mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
5120 expected_srv_fragments, 1 );
5121 /* The goto below is used to avoid an "unused label" warning.*/
5122 goto exit;
5123}
5124/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005125
Neil Armstrong181fe692022-04-14 15:38:01 +02005126/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005127void handshake_serialization( )
5128{
5129 handshake_test_options options;
5130 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005131
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005132 options.serialize = 1;
5133 options.dtls = 1;
5134 perform_handshake( &options );
5135 /* The goto below is used to avoid an "unused label" warning.*/
5136 goto exit;
5137}
5138/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005139
Neil Armstrong181fe692022-04-14 15:38:01 +02005140/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005141void handshake_fragmentation( int mfl, int expected_srv_hs_fragmentation, int expected_cli_hs_fragmentation)
5142{
5143 handshake_test_options options;
5144 log_pattern srv_pattern, cli_pattern;
5145
5146 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
5147 srv_pattern.counter = 0;
5148 cli_pattern.counter = 0;
5149
5150 init_handshake_options( &options );
5151 options.dtls = 1;
5152 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00005153 /* Set cipher to one using CBC so that record splitting can be tested */
5154 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005155 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
5156 options.srv_log_obj = &srv_pattern;
5157 options.cli_log_obj = &cli_pattern;
5158 options.srv_log_fun = log_analyzer;
5159 options.cli_log_fun = log_analyzer;
5160
5161 perform_handshake( &options );
5162
5163 /* Test if the server received a fragmented handshake */
5164 if( expected_srv_hs_fragmentation )
5165 {
5166 TEST_ASSERT( srv_pattern.counter >= 1 );
5167 }
5168 /* Test if the client received a fragmented handshake */
5169 if( expected_cli_hs_fragmentation )
5170 {
5171 TEST_ASSERT( cli_pattern.counter >= 1 );
5172 }
5173}
5174/* END_CASE */
5175
Neil Armstrong537e9152022-04-14 15:40:26 +02005176/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005177void renegotiation( int legacy_renegotiation )
5178{
5179 handshake_test_options options;
5180 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005181
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005182 options.renegotiate = 1;
5183 options.legacy_renegotiation = legacy_renegotiation;
5184 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05005185
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005186 perform_handshake( &options );
5187 /* The goto below is used to avoid an "unused label" warning.*/
5188 goto exit;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005189}
5190/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005191
Neil Armstrong537e9152022-04-14 15:40:26 +02005192/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005193void resize_buffers( int mfl, int renegotiation, int legacy_renegotiation,
Andrzej Kurek8ea68722020-04-03 06:40:47 -04005194 int serialize, int dtls, char *cipher )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005195{
5196 handshake_test_options options;
5197 init_handshake_options( &options );
5198
5199 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04005200 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005201 options.renegotiate = renegotiation;
5202 options.legacy_renegotiation = legacy_renegotiation;
5203 options.serialize = serialize;
5204 options.dtls = dtls;
5205 options.resize_buffers = 1;
5206
5207 perform_handshake( &options );
5208 /* The goto below is used to avoid an "unused label" warning.*/
5209 goto exit;
5210}
5211/* END_CASE */
5212
Neil Armstrong537e9152022-04-14 15:40:26 +02005213/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!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_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005214void resize_buffers_serialize_mfl( int mfl )
5215{
Andrzej Kurek8ea68722020-04-03 06:40:47 -04005216 test_resize_buffers( mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
5217 (char *) "" );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005218
5219 /* The goto below is used to avoid an "unused label" warning.*/
5220 goto exit;
5221}
5222/* END_CASE */
5223
Neil Armstrong537e9152022-04-14 15:40:26 +02005224/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!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_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8ea68722020-04-03 06:40:47 -04005225void resize_buffers_renegotiate_mfl( int mfl, int legacy_renegotiation,
5226 char *cipher )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005227{
Andrzej Kurek8ea68722020-04-03 06:40:47 -04005228 test_resize_buffers( mfl, 1, legacy_renegotiation, 0, 1, cipher );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005229
5230 /* The goto below is used to avoid an "unused label" warning.*/
5231 goto exit;
5232}
5233/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005234
Manuel Pégourié-Gonnarded0e8642020-07-21 11:20:30 +02005235/* BEGIN_CASE depends_on:MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC:MBEDTLS_TEST_HOOKS */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005236void ssl_cf_hmac( int hash )
5237{
5238 /*
Gabor Mezei90437e32021-10-20 11:59:27 +02005239 * Test the function mbedtls_ct_hmac() against a reference
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005240 * implementation.
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005241 */
Neil Armstrong2968d302022-02-25 15:09:36 +01005242#if defined(MBEDTLS_USE_PSA_CRYPTO)
5243 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5244 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5245 psa_algorithm_t alg;
5246 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
5247#else
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005248 mbedtls_md_context_t ctx, ref_ctx;
5249 const mbedtls_md_info_t *md_info;
Neil Armstrong2968d302022-02-25 15:09:36 +01005250#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005251 size_t out_len, block_size;
5252 size_t min_in_len, in_len, max_in_len, i;
5253 /* TLS additional data is 13 bytes (hence the "lucky 13" name) */
5254 unsigned char add_data[13];
5255 unsigned char ref_out[MBEDTLS_MD_MAX_SIZE];
5256 unsigned char *data = NULL;
5257 unsigned char *out = NULL;
5258 unsigned char rec_num = 0;
5259
Neil Armstrong2968d302022-02-25 15:09:36 +01005260 USE_PSA_INIT( );
5261
5262#if defined(MBEDTLS_USE_PSA_CRYPTO)
5263 alg = PSA_ALG_HMAC( mbedtls_psa_translate_md( hash ) );
5264
5265 out_len = PSA_HASH_LENGTH( alg );
5266 block_size = PSA_HASH_BLOCK_LENGTH( alg );
5267
5268 /* mbedtls_ct_hmac() requires the key to be exportable */
5269 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT |
5270 PSA_KEY_USAGE_VERIFY_HASH );
5271 psa_set_key_algorithm( &attributes, PSA_ALG_HMAC( alg ) );
5272 psa_set_key_type( &attributes, PSA_KEY_TYPE_HMAC );
5273#else
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005274 mbedtls_md_init( &ctx );
5275 mbedtls_md_init( &ref_ctx );
5276
5277 md_info = mbedtls_md_info_from_type( hash );
5278 TEST_ASSERT( md_info != NULL );
5279 out_len = mbedtls_md_get_size( md_info );
5280 TEST_ASSERT( out_len != 0 );
5281 block_size = hash == MBEDTLS_MD_SHA384 ? 128 : 64;
Neil Armstrong2968d302022-02-25 15:09:36 +01005282#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005283
5284 /* Use allocated out buffer to catch overwrites */
5285 ASSERT_ALLOC( out, out_len );
5286
Neil Armstrong2968d302022-02-25 15:09:36 +01005287#if defined(MBEDTLS_USE_PSA_CRYPTO)
5288 /* Set up dummy key */
5289 memset( ref_out, 42, sizeof( ref_out ) );
5290 TEST_EQUAL( PSA_SUCCESS, psa_import_key( &attributes,
5291 ref_out, out_len,
5292 &key ) );
5293#else
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005294 /* Set up contexts with the given hash and a dummy key */
5295 TEST_EQUAL( 0, mbedtls_md_setup( &ctx, md_info, 1 ) );
5296 TEST_EQUAL( 0, mbedtls_md_setup( &ref_ctx, md_info, 1 ) );
5297 memset( ref_out, 42, sizeof( ref_out ) );
5298 TEST_EQUAL( 0, mbedtls_md_hmac_starts( &ctx, ref_out, out_len ) );
5299 TEST_EQUAL( 0, mbedtls_md_hmac_starts( &ref_ctx, ref_out, out_len ) );
5300 memset( ref_out, 0, sizeof( ref_out ) );
Neil Armstrong2968d302022-02-25 15:09:36 +01005301#endif
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005302
5303 /*
5304 * Test all possible lengths up to a point. The difference between
5305 * max_in_len and min_in_len is at most 255, and make sure they both vary
5306 * by at least one block size.
5307 */
5308 for( max_in_len = 0; max_in_len <= 255 + block_size; max_in_len++ )
5309 {
Chris Jones9634bb12021-01-20 15:56:42 +00005310 mbedtls_test_set_step( max_in_len * 10000 );
Manuel Pégourié-Gonnardca8287c2020-07-22 10:29:39 +02005311
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005312 /* Use allocated in buffer to catch overreads */
Manuel Pégourié-Gonnardc3219002020-07-22 10:32:52 +02005313 ASSERT_ALLOC( data, max_in_len );
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005314
5315 min_in_len = max_in_len > 255 ? max_in_len - 255 : 0;
5316 for( in_len = min_in_len; in_len <= max_in_len; in_len++ )
5317 {
Chris Jones9634bb12021-01-20 15:56:42 +00005318 mbedtls_test_set_step( max_in_len * 10000 + in_len );
Manuel Pégourié-Gonnardca8287c2020-07-22 10:29:39 +02005319
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005320 /* Set up dummy data and add_data */
5321 rec_num++;
5322 memset( add_data, rec_num, sizeof( add_data ) );
5323 for( i = 0; i < in_len; i++ )
5324 data[i] = ( i & 0xff ) ^ rec_num;
5325
5326 /* Get the function's result */
Manuel Pégourié-Gonnard9670a592020-07-10 10:21:46 +02005327 TEST_CF_SECRET( &in_len, sizeof( in_len ) );
Neil Armstrong2968d302022-02-25 15:09:36 +01005328#if defined(MBEDTLS_USE_PSA_CRYPTO)
5329 TEST_EQUAL( 0, mbedtls_ct_hmac( key, PSA_ALG_HMAC( alg ),
5330 add_data, sizeof( add_data ),
5331 data, in_len,
5332 min_in_len, max_in_len,
5333 out ) );
5334#else
Gabor Mezei90437e32021-10-20 11:59:27 +02005335 TEST_EQUAL( 0, mbedtls_ct_hmac( &ctx, add_data, sizeof( add_data ),
gabor-mezei-arm9fa43ce2021-09-28 16:14:47 +02005336 data, in_len,
5337 min_in_len, max_in_len,
5338 out ) );
Neil Armstrong2968d302022-02-25 15:09:36 +01005339#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard9670a592020-07-10 10:21:46 +02005340 TEST_CF_PUBLIC( &in_len, sizeof( in_len ) );
5341 TEST_CF_PUBLIC( out, out_len );
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005342
Neil Armstrong2968d302022-02-25 15:09:36 +01005343#if defined(MBEDTLS_USE_PSA_CRYPTO)
5344 TEST_EQUAL( PSA_SUCCESS, psa_mac_verify_setup( &operation,
5345 key, alg ) );
5346 TEST_EQUAL( PSA_SUCCESS, psa_mac_update( &operation, add_data,
5347 sizeof( add_data ) ) );
5348 TEST_EQUAL( PSA_SUCCESS, psa_mac_update( &operation,
5349 data, in_len ) );
5350 TEST_EQUAL( PSA_SUCCESS, psa_mac_verify_finish( &operation,
5351 out, out_len ) );
5352#else
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005353 /* Compute the reference result */
5354 TEST_EQUAL( 0, mbedtls_md_hmac_update( &ref_ctx, add_data,
5355 sizeof( add_data ) ) );
5356 TEST_EQUAL( 0, mbedtls_md_hmac_update( &ref_ctx, data, in_len ) );
5357 TEST_EQUAL( 0, mbedtls_md_hmac_finish( &ref_ctx, ref_out ) );
5358 TEST_EQUAL( 0, mbedtls_md_hmac_reset( &ref_ctx ) );
5359
5360 /* Compare */
5361 ASSERT_COMPARE( out, out_len, ref_out, out_len );
Neil Armstrong2968d302022-02-25 15:09:36 +01005362#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005363 }
5364
5365 mbedtls_free( data );
5366 data = NULL;
5367 }
5368
5369exit:
Neil Armstrong2968d302022-02-25 15:09:36 +01005370#if defined(MBEDTLS_USE_PSA_CRYPTO)
5371 psa_mac_abort( &operation );
5372 psa_destroy_key( key );
5373#else
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005374 mbedtls_md_free( &ref_ctx );
5375 mbedtls_md_free( &ctx );
Neil Armstrong2968d302022-02-25 15:09:36 +01005376#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005377
5378 mbedtls_free( data );
5379 mbedtls_free( out );
Neil Armstrong2968d302022-02-25 15:09:36 +01005380
5381 USE_PSA_DONE( );
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005382}
5383/* END_CASE */
Manuel Pégourié-Gonnard7fe2c5f2020-08-18 12:02:54 +02005384
5385/* BEGIN_CASE depends_on:MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC:MBEDTLS_TEST_HOOKS */
5386void ssl_cf_memcpy_offset( int offset_min, int offset_max, int len )
5387{
5388 unsigned char *dst = NULL;
5389 unsigned char *src = NULL;
5390 size_t src_len = offset_max + len;
5391 size_t secret;
5392
5393 ASSERT_ALLOC( dst, len );
5394 ASSERT_ALLOC( src, src_len );
5395
5396 /* Fill src in a way that we can detect if we copied the right bytes */
5397 mbedtls_test_rnd_std_rand( NULL, src, src_len );
5398
5399 for( secret = offset_min; secret <= (size_t) offset_max; secret++ )
5400 {
Chris Jones9634bb12021-01-20 15:56:42 +00005401 mbedtls_test_set_step( (int) secret );
Manuel Pégourié-Gonnard7fe2c5f2020-08-18 12:02:54 +02005402
5403 TEST_CF_SECRET( &secret, sizeof( secret ) );
Gabor Mezei90437e32021-10-20 11:59:27 +02005404 mbedtls_ct_memcpy_offset( dst, src, secret,
gabor-mezei-arm9fa43ce2021-09-28 16:14:47 +02005405 offset_min, offset_max, len );
Manuel Pégourié-Gonnard7fe2c5f2020-08-18 12:02:54 +02005406 TEST_CF_PUBLIC( &secret, sizeof( secret ) );
5407 TEST_CF_PUBLIC( dst, len );
5408
5409 ASSERT_COMPARE( dst, len, src + secret, len );
5410 }
5411
5412exit:
5413 mbedtls_free( dst );
5414 mbedtls_free( src );
5415}
5416/* END_CASE */
Hanno Becker6667ffd2021-04-19 21:59:22 +01005417
5418/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
5419void test_multiple_psks()
5420{
5421 unsigned char psk0[10] = { 0 };
5422 unsigned char psk0_identity[] = { 'f', 'o', 'o' };
5423
5424 unsigned char psk1[10] = { 0 };
5425 unsigned char psk1_identity[] = { 'b', 'a', 'r' };
5426
5427 mbedtls_ssl_config conf;
5428
Neil Armstrong4c3b4e02022-05-03 09:24:26 +02005429 USE_PSA_INIT( );
Hanno Becker6667ffd2021-04-19 21:59:22 +01005430 mbedtls_ssl_config_init( &conf );
5431
5432 TEST_ASSERT( mbedtls_ssl_conf_psk( &conf,
5433 psk0, sizeof( psk0 ),
5434 psk0_identity, sizeof( psk0_identity ) ) == 0 );
5435 TEST_ASSERT( mbedtls_ssl_conf_psk( &conf,
5436 psk1, sizeof( psk1 ),
5437 psk1_identity, sizeof( psk1_identity ) ) ==
5438 MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
5439
5440exit:
5441
5442 mbedtls_ssl_config_free( &conf );
Neil Armstrong4c3b4e02022-05-03 09:24:26 +02005443
5444 USE_PSA_DONE( );
Hanno Becker6667ffd2021-04-19 21:59:22 +01005445}
5446/* END_CASE */
5447
5448/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED:MBEDTLS_USE_PSA_CRYPTO */
5449void test_multiple_psks_opaque( int mode )
5450{
5451 /*
5452 * Mode 0: Raw PSK, then opaque PSK
5453 * Mode 1: Opaque PSK, then raw PSK
5454 * Mode 2: 2x opaque PSK
5455 */
5456
5457 unsigned char psk0_raw[10] = { 0 };
5458 unsigned char psk0_raw_identity[] = { 'f', 'o', 'o' };
5459
Andrzej Kurek03e01462022-01-03 12:53:24 +01005460 mbedtls_svc_key_id_t psk0_opaque = mbedtls_svc_key_id_make( 0x1, (psa_key_id_t) 1 );
5461
Hanno Becker6667ffd2021-04-19 21:59:22 +01005462 unsigned char psk0_opaque_identity[] = { 'f', 'o', 'o' };
5463
5464 unsigned char psk1_raw[10] = { 0 };
5465 unsigned char psk1_raw_identity[] = { 'b', 'a', 'r' };
5466
Andrzej Kurek03e01462022-01-03 12:53:24 +01005467 mbedtls_svc_key_id_t psk1_opaque = mbedtls_svc_key_id_make( 0x1, (psa_key_id_t) 2 );
5468
Hanno Becker6667ffd2021-04-19 21:59:22 +01005469 unsigned char psk1_opaque_identity[] = { 'b', 'a', 'r' };
5470
5471 mbedtls_ssl_config conf;
5472
5473 USE_PSA_INIT( );
5474 mbedtls_ssl_config_init( &conf );
5475
5476 switch( mode )
5477 {
5478 case 0:
5479
5480 TEST_ASSERT( mbedtls_ssl_conf_psk( &conf,
5481 psk0_raw, sizeof( psk0_raw ),
5482 psk0_raw_identity, sizeof( psk0_raw_identity ) )
5483 == 0 );
5484 TEST_ASSERT( mbedtls_ssl_conf_psk_opaque( &conf,
5485 psk1_opaque,
5486 psk1_opaque_identity, sizeof( psk1_opaque_identity ) )
5487 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
5488 break;
5489
5490 case 1:
5491
5492 TEST_ASSERT( mbedtls_ssl_conf_psk_opaque( &conf,
5493 psk0_opaque,
5494 psk0_opaque_identity, sizeof( psk0_opaque_identity ) )
5495 == 0 );
5496 TEST_ASSERT( mbedtls_ssl_conf_psk( &conf,
5497 psk1_raw, sizeof( psk1_raw ),
5498 psk1_raw_identity, sizeof( psk1_raw_identity ) )
5499 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
5500
5501 break;
5502
5503 case 2:
5504
5505 TEST_ASSERT( mbedtls_ssl_conf_psk_opaque( &conf,
5506 psk0_opaque,
5507 psk0_opaque_identity, sizeof( psk0_opaque_identity ) )
5508 == 0 );
5509 TEST_ASSERT( mbedtls_ssl_conf_psk_opaque( &conf,
5510 psk1_opaque,
5511 psk1_opaque_identity, sizeof( psk1_opaque_identity ) )
5512 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
5513
5514 break;
5515
5516 default:
5517 TEST_ASSERT( 0 );
5518 break;
5519 }
5520
5521exit:
5522
5523 mbedtls_ssl_config_free( &conf );
5524 USE_PSA_DONE( );
5525
5526}
5527/* END_CASE */
Brett Warren7f813d52021-10-20 23:08:38 +01005528
Ronald Cron37bdaab2022-03-30 16:45:51 +02005529/* BEGIN_CASE */
5530void conf_version( int endpoint, int transport,
Glenn Strauss59b0d542022-04-12 07:10:06 -04005531 int min_tls_version, int max_tls_version,
Ronald Cron37bdaab2022-03-30 16:45:51 +02005532 int expected_ssl_setup_result )
5533{
5534 mbedtls_ssl_config conf;
5535 mbedtls_ssl_context ssl;
5536
5537 mbedtls_ssl_config_init( &conf );
5538 mbedtls_ssl_init( &ssl );
5539
5540 mbedtls_ssl_conf_endpoint( &conf, endpoint );
5541 mbedtls_ssl_conf_transport( &conf, transport );
Glenn Strauss59b0d542022-04-12 07:10:06 -04005542 mbedtls_ssl_conf_min_tls_version( &conf, min_tls_version );
5543 mbedtls_ssl_conf_max_tls_version( &conf, max_tls_version );
Ronald Cron37bdaab2022-03-30 16:45:51 +02005544
5545 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == expected_ssl_setup_result );
5546
5547 mbedtls_ssl_free( &ssl );
5548 mbedtls_ssl_config_free( &conf );
5549}
5550/* END_CASE */
5551
Brett Warren7f813d52021-10-20 23:08:38 +01005552/* BEGIN_CASE depends_on:MBEDTLS_ECP_C:!MBEDTLS_DEPRECATED_REMOVED:!MBEDTLS_DEPRECATED_WARNING:MBEDTLS_ECP_DP_SECP192R1_ENABLED:MBEDTLS_ECP_DP_SECP224R1_ENABLED:MBEDTLS_ECP_DP_SECP256R1_ENABLED */
5553void conf_curve()
5554{
5555
5556 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP192R1,
5557 MBEDTLS_ECP_DP_SECP224R1,
5558 MBEDTLS_ECP_DP_SECP256R1,
5559 MBEDTLS_ECP_DP_NONE };
5560 mbedtls_ecp_group_id iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
5561 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
5562 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5563 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
5564
5565 mbedtls_ssl_config conf;
5566 mbedtls_ssl_config_init( &conf );
Jerry Yubaa49342022-02-15 10:26:40 +08005567#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Glenn Strausse3af4cb2022-03-15 03:23:42 -04005568 mbedtls_ssl_conf_max_tls_version( &conf, MBEDTLS_SSL_VERSION_TLS1_2 );
5569 mbedtls_ssl_conf_min_tls_version( &conf, MBEDTLS_SSL_VERSION_TLS1_2 );
Jerry Yubaa49342022-02-15 10:26:40 +08005570#else
Glenn Strausse3af4cb2022-03-15 03:23:42 -04005571 mbedtls_ssl_conf_max_tls_version( &conf, MBEDTLS_SSL_VERSION_TLS1_3 );
5572 mbedtls_ssl_conf_min_tls_version( &conf, MBEDTLS_SSL_VERSION_TLS1_3 );
Jerry Yubaa49342022-02-15 10:26:40 +08005573#endif
Brett Warren7f813d52021-10-20 23:08:38 +01005574 mbedtls_ssl_conf_curves( &conf, curve_list );
5575
5576 mbedtls_ssl_context ssl;
5577 mbedtls_ssl_init( &ssl );
Paul Elliott46a6c202021-12-09 18:16:13 +00005578 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Brett Warren7f813d52021-10-20 23:08:38 +01005579
5580 TEST_ASSERT( ssl.handshake != NULL && ssl.handshake->group_list != NULL );
5581 TEST_ASSERT( ssl.conf != NULL && ssl.conf->group_list == NULL );
5582
5583 TEST_EQUAL( ssl.handshake->group_list[ARRAY_LENGTH( iana_tls_group_list ) - 1], MBEDTLS_SSL_IANA_TLS_GROUP_NONE );
5584
5585 for( size_t i = 0; i < ARRAY_LENGTH( iana_tls_group_list ); i++ )
5586 TEST_EQUAL( iana_tls_group_list[i], ssl.handshake->group_list[i] );
5587
5588 mbedtls_ssl_free( &ssl );
5589 mbedtls_ssl_config_free( &conf );
5590}
5591/* END_CASE */
5592
5593/* BEGIN_CASE depends_on:MBEDTLS_DEPRECATED_REMOVED */
5594void conf_group()
5595{
5596 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
5597 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
5598 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5599 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
5600
5601 mbedtls_ssl_config conf;
5602 mbedtls_ssl_config_init( &conf );
5603
Glenn Strausse3af4cb2022-03-15 03:23:42 -04005604 mbedtls_ssl_conf_max_tls_version( &conf, MBEDTLS_SSL_VERSION_TLS1_2 );
5605 mbedtls_ssl_conf_min_tls_version( &conf, MBEDTLS_SSL_VERSION_TLS1_2 );
Brett Warren7f813d52021-10-20 23:08:38 +01005606
5607 mbedtls_ssl_conf_groups( &conf, iana_tls_group_list );
5608
5609 mbedtls_ssl_context ssl;
5610 mbedtls_ssl_init( &ssl );
Paul Elliott46a6c202021-12-09 18:16:13 +00005611 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Brett Warren7f813d52021-10-20 23:08:38 +01005612
5613 TEST_ASSERT( ssl.conf != NULL && ssl.conf->group_list != NULL );
5614
5615 TEST_EQUAL( ssl.conf->group_list[ARRAY_LENGTH( iana_tls_group_list ) - 1], MBEDTLS_SSL_IANA_TLS_GROUP_NONE );
5616
5617 for( size_t i = 0; i < ARRAY_LENGTH( iana_tls_group_list ); i++ )
5618 TEST_EQUAL( iana_tls_group_list[i], ssl.conf->group_list[i] );
5619
5620 mbedtls_ssl_free( &ssl );
5621 mbedtls_ssl_config_free( &conf );
5622}
5623/* END_CASE */
Paul Elliottb9af2db2022-03-09 15:34:37 +00005624
Andrzej Kureked4d2172022-06-08 11:57:57 -04005625/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Andrzej Kurekcfb01942022-06-06 13:08:23 -04005626void cookie_parsing( data_t *cookie, int exp_ret )
5627{
5628 mbedtls_ssl_context ssl;
5629 mbedtls_ssl_config conf;
5630 size_t len;
5631
5632 mbedtls_ssl_init( &ssl );
5633 mbedtls_ssl_config_init( &conf );
5634 TEST_EQUAL( mbedtls_ssl_config_defaults( &conf, MBEDTLS_SSL_IS_SERVER,
5635 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
5636 MBEDTLS_SSL_PRESET_DEFAULT ),
5637 0 );
5638
5639 TEST_EQUAL( mbedtls_ssl_setup( &ssl, &conf ), 0 );
Andrzej Kurek078e9bc2022-06-08 11:47:33 -04005640 TEST_EQUAL( mbedtls_ssl_check_dtls_clihlo_cookie( &ssl, ssl.cli_id,
5641 ssl.cli_id_len,
5642 cookie->x, cookie->len,
5643 ssl.out_buf,
5644 MBEDTLS_SSL_OUT_CONTENT_LEN,
5645 &len ),
Andrzej Kurekcfb01942022-06-06 13:08:23 -04005646 exp_ret );
5647
5648 mbedtls_ssl_free( &ssl );
5649 mbedtls_ssl_config_free( &conf );
5650}
5651/* END_CASE */
5652
Paul Elliottb9af2db2022-03-09 15:34:37 +00005653/* BEGIN_CASE depends_on:MBEDTLS_TIMING_C:MBEDTLS_HAVE_TIME */
Paul Elliott42d5e512022-03-24 19:41:28 +00005654void timing_final_delay_accessor( )
Paul Elliottb9af2db2022-03-09 15:34:37 +00005655{
5656 mbedtls_timing_delay_context delay_context;
5657
5658 mbedtls_timing_set_delay( &delay_context, 50, 100 );
5659
5660 TEST_ASSERT( mbedtls_timing_get_final_delay( &delay_context ) == 100 );
5661}
5662/* END_CASE */
Paul Elliott02758a52022-03-16 14:32:33 +00005663
5664/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_CONNECTION_ID */
5665void cid_sanity( )
5666{
5667 mbedtls_ssl_context ssl;
5668 mbedtls_ssl_config conf;
5669
5670 unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
5671 unsigned char test_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
5672 int cid_enabled;
5673 size_t own_cid_len;
5674
5675 mbedtls_test_rnd_std_rand( NULL, own_cid, sizeof( own_cid ) );
5676
5677 mbedtls_ssl_init( &ssl );
5678 mbedtls_ssl_config_init( &conf );
5679
5680 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
5681 MBEDTLS_SSL_IS_CLIENT,
5682 MBEDTLS_SSL_TRANSPORT_STREAM,
5683 MBEDTLS_SSL_PRESET_DEFAULT )
5684 == 0 );
5685
5686 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
5687
5688 /* Can't use CID functions with stream transport. */
5689 TEST_ASSERT( mbedtls_ssl_set_cid( &ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
5690 sizeof( own_cid ) )
5691 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5692
5693 TEST_ASSERT( mbedtls_ssl_get_own_cid( &ssl, &cid_enabled, test_cid,
5694 &own_cid_len )
5695 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5696
5697 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
5698 MBEDTLS_SSL_IS_CLIENT,
5699 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
5700 MBEDTLS_SSL_PRESET_DEFAULT )
5701 == 0 );
5702
5703 /* Attempt to set config cid size too big. */
5704 TEST_ASSERT( mbedtls_ssl_conf_cid( &conf, MBEDTLS_SSL_CID_IN_LEN_MAX + 1,
5705 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
5706 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5707
5708 TEST_ASSERT( mbedtls_ssl_conf_cid( &conf, sizeof( own_cid ),
5709 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
5710 == 0 );
5711
5712 /* Attempt to set CID length not matching config. */
5713 TEST_ASSERT( mbedtls_ssl_set_cid( &ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
5714 MBEDTLS_SSL_CID_IN_LEN_MAX - 1 )
5715 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5716
5717 TEST_ASSERT( mbedtls_ssl_set_cid( &ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
5718 sizeof( own_cid ) )
5719 == 0 );
5720
5721 /* Test we get back what we put in. */
5722 TEST_ASSERT( mbedtls_ssl_get_own_cid( &ssl, &cid_enabled, test_cid,
5723 &own_cid_len )
5724 == 0 );
5725
5726 TEST_EQUAL( cid_enabled, MBEDTLS_SSL_CID_ENABLED );
5727 ASSERT_COMPARE( own_cid, own_cid_len, test_cid, own_cid_len );
5728
5729 /* Test disabling works. */
5730 TEST_ASSERT( mbedtls_ssl_set_cid( &ssl, MBEDTLS_SSL_CID_DISABLED, NULL,
5731 0 )
5732 == 0 );
5733
5734 TEST_ASSERT( mbedtls_ssl_get_own_cid( &ssl, &cid_enabled, test_cid,
5735 &own_cid_len )
5736 == 0 );
5737
5738 TEST_EQUAL( cid_enabled, MBEDTLS_SSL_CID_DISABLED );
5739
5740 mbedtls_ssl_free( &ssl );
5741 mbedtls_ssl_config_free( &conf );
5742}
5743/* END_CASE */
5744
Andrzej Kurek28f883e2022-04-08 07:55:27 -04005745/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_ECDSA_C */
Gilles Peskineb4f874d2022-04-08 16:48:09 -04005746void raw_key_agreement_fail( int bad_server_ecdhe_key )
Andrzej Kurekb3427822022-03-08 06:55:42 -05005747{
5748 enum { BUFFSIZE = 17000 };
5749 mbedtls_endpoint client, server;
5750 mbedtls_psa_stats_t stats;
Andrzej Kurek39d88d42022-03-31 06:30:54 -04005751 size_t free_slots_before = -1;
Andrzej Kurekb3427822022-03-08 06:55:42 -05005752
Andrzej Kurekcc28e9a2022-03-08 18:36:35 -05005753 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5754 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Andrzej Kurekb3427822022-03-08 06:55:42 -05005755 USE_PSA_INIT( );
5756
5757 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek83e60ee2022-04-14 08:51:41 -04005758 * the raw key agreement. Flipping the first byte makes the
5759 * required 0x04 identifier invalid. */
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005760 TEST_EQUAL( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
Andrzej Kurek28f883e2022-04-08 07:55:27 -04005761 MBEDTLS_PK_ECDSA, NULL, NULL,
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005762 NULL, iana_tls_group_list ), 0 );
Andrzej Kurekb3427822022-03-08 06:55:42 -05005763
5764 /* Server side */
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005765 TEST_EQUAL( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
Andrzej Kurek28f883e2022-04-08 07:55:27 -04005766 MBEDTLS_PK_ECDSA, NULL, NULL,
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005767 NULL, NULL ), 0 );
Andrzej Kurekb3427822022-03-08 06:55:42 -05005768
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005769 TEST_EQUAL( mbedtls_mock_socket_connect( &(client.socket),
Andrzej Kurekb3427822022-03-08 06:55:42 -05005770 &(server.socket),
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005771 BUFFSIZE ), 0 );
Andrzej Kurekb3427822022-03-08 06:55:42 -05005772
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005773 TEST_EQUAL( mbedtls_move_handshake_to_state( &(client.ssl),
Andrzej Kurekb3427822022-03-08 06:55:42 -05005774 &(server.ssl),
5775 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE )
Andrzej Kurek57f58b02022-04-08 08:10:53 -04005776 , 0 );
Andrzej Kurekb3427822022-03-08 06:55:42 -05005777
Andrzej Kurek39d88d42022-03-31 06:30:54 -04005778 mbedtls_psa_get_stats( &stats );
5779 /* Save the number of slots in use up to this point.
5780 * With PSA, one can be used for the ECDH private key. */
5781 free_slots_before = stats.empty_slots;
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04005782
Gilles Peskineb4f874d2022-04-08 16:48:09 -04005783 if( bad_server_ecdhe_key )
5784 {
5785 /* Force a simulated bitflip in the server key. to make the
5786 * raw key agreement in ssl_write_client_key_exchange fail. */
5787 (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
5788 }
Andrzej Kurekb3427822022-03-08 06:55:42 -05005789
Gilles Peskineb4f874d2022-04-08 16:48:09 -04005790 TEST_EQUAL( mbedtls_move_handshake_to_state( &(client.ssl),
5791 &(server.ssl),
5792 MBEDTLS_SSL_HANDSHAKE_OVER ),
5793 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0 );
Andrzej Kurekb3427822022-03-08 06:55:42 -05005794
5795 mbedtls_psa_get_stats( &stats );
5796
Gilles Peskineb4f874d2022-04-08 16:48:09 -04005797 /* Make sure that the key slot is already destroyed in case of failure,
5798 * without waiting to close the connection. */
5799 if( bad_server_ecdhe_key )
5800 TEST_EQUAL( free_slots_before, stats.empty_slots );
Andrzej Kurekb3427822022-03-08 06:55:42 -05005801
5802exit:
Andrzej Kurek28f883e2022-04-08 07:55:27 -04005803 mbedtls_endpoint_free( &client, NULL );
5804 mbedtls_endpoint_free( &server, NULL );
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04005805
Andrzej Kurekb3427822022-03-08 06:55:42 -05005806 USE_PSA_DONE( );
5807}
5808/* END_CASE */
Ronald Crone3dac4a2022-06-10 17:21:51 +02005809/* 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_X509_CRT_PARSE_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED */
5810void tls13_server_certificate_msg_invalid_vector_len( )
5811{
5812 int ret = -1;
5813 mbedtls_endpoint client_ep, server_ep;
5814 unsigned char *buf, *end;
5815 size_t buf_len;
5816 int step = 0;
5817 int expected_result;
5818
5819 /*
5820 * Test set-up
5821 */
5822 USE_PSA_INIT( );
5823
5824 ret = mbedtls_endpoint_init( &client_ep, MBEDTLS_SSL_IS_CLIENT,
5825 MBEDTLS_PK_ECDSA, NULL, NULL, NULL, NULL );
5826 TEST_EQUAL( ret, 0 );
5827
5828 ret = mbedtls_endpoint_init( &server_ep, MBEDTLS_SSL_IS_SERVER,
5829 MBEDTLS_PK_ECDSA, NULL, NULL, NULL, NULL );
5830 TEST_EQUAL( ret, 0 );
5831
5832 ret = mbedtls_mock_socket_connect( &(client_ep.socket),
5833 &(server_ep.socket), 1024 );
5834 TEST_EQUAL( ret, 0 );
5835
5836 while( 1 )
5837 {
5838 mbedtls_test_set_step( ++step );
5839
5840 ret = mbedtls_move_handshake_to_state( &(server_ep.ssl),
5841 &(client_ep.ssl),
5842 MBEDTLS_SSL_CERTIFICATE_VERIFY );
5843 TEST_EQUAL( ret, 0 );
5844
5845 ret = mbedtls_ssl_flush_output( &(server_ep.ssl) );
5846 TEST_EQUAL( ret, 0 );
5847
5848 ret = mbedtls_move_handshake_to_state( &(client_ep.ssl),
5849 &(server_ep.ssl),
5850 MBEDTLS_SSL_SERVER_CERTIFICATE );
5851 TEST_EQUAL( ret, 0 );
5852
5853 ret = mbedtls_ssl_tls13_fetch_handshake_msg( &(client_ep.ssl),
5854 MBEDTLS_SSL_HS_CERTIFICATE,
5855 &buf, &buf_len );
5856 TEST_EQUAL( ret, 0 );
5857
5858 end = buf + buf_len;
5859
5860 /*
5861 * Tweak server Certificate message and parse it.
5862 */
5863
5864 ret = tweak_tls13_certificate_msg_vector_len(
5865 buf, &end, step, &expected_result );
5866
5867 if( ret != 0 )
5868 break;
5869
5870 ret = mbedtls_ssl_tls13_parse_certificate( &(client_ep.ssl), buf, end );
5871 TEST_EQUAL( ret, expected_result );
5872
5873 ret = mbedtls_ssl_session_reset( &(client_ep.ssl) );
5874 TEST_EQUAL( ret, 0 );
5875
5876 ret = mbedtls_ssl_session_reset( &(server_ep.ssl) );
5877 TEST_EQUAL( ret, 0 );
5878 }
5879
5880exit:
5881 mbedtls_endpoint_free( &client_ep, NULL );
5882 mbedtls_endpoint_free( &server_ep, NULL );
5883 USE_PSA_DONE( );
5884}
5885/* END_CASE */