blob: 5485d9e680e7bbca7bbaf7bb45690a5b2d86dfc7 [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>
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +02003#include <mbedtls/ssl_internal.h>
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004#include <mbedtls/ctr_drbg.h>
5#include <mbedtls/entropy.h>
6#include <mbedtls/certs.h>
Andrzej Kurek941962e2020-02-07 09:20:32 -05007#include <mbedtls/timing.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +01008#include <mbedtls/debug.h>
9
10typedef struct log_pattern
11{
12 const char *pattern;
13 size_t counter;
14} log_pattern;
15
16/* This function can be passed to mbedtls to receive output logs from it. In
17 * this case, it will count the instances of a log_pattern in the received
18 * logged messages.
19 */
20void log_analyzer( void *ctx, int level,
21 const char *file, int line,
22 const char *str )
23{
24 log_pattern *p = (log_pattern *) ctx;
25
26 (void) level;
27 (void) line;
28 (void) file;
29
30 if( NULL != p &&
31 NULL != p->pattern &&
32 NULL != strstr( str, p->pattern ) )
33 {
34 p->counter++;
35 }
36}
Janos Follath6264e662019-11-26 11:11:15 +000037
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050038typedef struct handshake_test_options
39{
40 const char *cipher;
41 int version;
42 int pk_alg;
43 data_t *psk_str;
44 int dtls;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010045 int srv_auth_mode;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050046 int serialize;
47 int mfl;
48 int cli_msg_len;
49 int srv_msg_len;
50 int expected_cli_fragments;
51 int expected_srv_fragments;
52 int renegotiate;
53 int legacy_renegotiation;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010054 void *srv_log_obj;
55 void *cli_log_obj;
56 void (*srv_log_fun)(void *, int, const char *, int, const char *);
57 void (*cli_log_fun)(void *, int, const char *, int, const char *);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050058} handshake_test_options;
59
60void init_handshake_options( handshake_test_options *opts )
61{
62 opts->cipher = "";
63 opts->version = MBEDTLS_SSL_MINOR_VERSION_3;
64 opts->pk_alg = MBEDTLS_PK_RSA;
65 opts->psk_str = NULL;
66 opts->dtls = 0;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010067 opts->srv_auth_mode = MBEDTLS_SSL_VERIFY_NONE;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050068 opts->serialize = 0;
69 opts->mfl = MBEDTLS_SSL_MAX_FRAG_LEN_NONE;
70 opts->cli_msg_len = 100;
71 opts->srv_msg_len = 100;
72 opts->expected_cli_fragments = 1;
73 opts->expected_srv_fragments = 1;
74 opts->renegotiate = 0;
75 opts->legacy_renegotiation = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010076 opts->srv_log_obj = NULL;
77 opts->srv_log_obj = NULL;
78 opts->srv_log_fun = NULL;
79 opts->cli_log_fun = NULL;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050080}
Janos Follath6264e662019-11-26 11:11:15 +000081/*
82 * Buffer structure for custom I/O callbacks.
83 */
84
85typedef struct mbedtls_test_buffer
86{
87 size_t start;
88 size_t content_length;
89 size_t capacity;
90 unsigned char *buffer;
91} mbedtls_test_buffer;
92
93/*
94 * Initialises \p buf. After calling this function it is safe to call
95 * `mbedtls_test_buffer_free()` on \p buf.
96 */
97void mbedtls_test_buffer_init( mbedtls_test_buffer *buf )
98{
99 memset( buf, 0, sizeof( *buf ) );
100}
101
102/*
103 * Sets up \p buf. After calling this function it is safe to call
104 * `mbedtls_test_buffer_put()` and `mbedtls_test_buffer_get()` on \p buf.
105 */
106int mbedtls_test_buffer_setup( mbedtls_test_buffer *buf, size_t capacity )
107{
108 buf->buffer = (unsigned char*) mbedtls_calloc( capacity,
109 sizeof(unsigned char) );
110 if( NULL == buf->buffer )
111 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
112 buf->capacity = capacity;
113
114 return 0;
115}
116
117void mbedtls_test_buffer_free( mbedtls_test_buffer *buf )
118{
119 if( buf->buffer != NULL )
120 mbedtls_free( buf->buffer );
121
122 memset( buf, 0, sizeof( *buf ) );
123}
124
125/*
126 * Puts \p input_len bytes from the \p input buffer into the ring buffer \p buf.
127 *
128 * \p buf must have been initialized and set up by calling
129 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
130 *
131 * \retval \p input_len, if the data fits.
132 * \retval 0 <= value < \p input_len, if the data does not fit.
133 * \retval -1, if \p buf is NULL, it hasn't been set up or \p input_len is not
134 * zero and \p input is NULL.
135 */
136int mbedtls_test_buffer_put( mbedtls_test_buffer *buf,
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100137 const unsigned char *input, size_t input_len )
Janos Follath6264e662019-11-26 11:11:15 +0000138{
139 size_t overflow = 0;
140
141 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
142 return -1;
143
144 /* Reduce input_len to a number that fits in the buffer. */
145 if ( ( buf->content_length + input_len ) > buf->capacity )
146 {
147 input_len = buf->capacity - buf->content_length;
148 }
149
150 if( input == NULL )
151 {
152 return ( input_len == 0 ) ? 0 : -1;
153 }
154
Piotr Nowickifb437d72020-01-13 16:59:12 +0100155 /* Check if the buffer has not come full circle and free space is not in
156 * the middle */
157 if( buf->start + buf->content_length < buf->capacity )
Janos Follath6264e662019-11-26 11:11:15 +0000158 {
Piotr Nowickifb437d72020-01-13 16:59:12 +0100159
160 /* Calculate the number of bytes that need to be placed at lower memory
161 * address */
162 if( buf->start + buf->content_length + input_len
163 > buf->capacity )
164 {
165 overflow = ( buf->start + buf->content_length + input_len )
166 % buf->capacity;
167 }
168
169 memcpy( buf->buffer + buf->start + buf->content_length, input,
170 input_len - overflow );
171 memcpy( buf->buffer, input + input_len - overflow, overflow );
172
173 }
174 else
175 {
176 /* The buffer has come full circle and free space is in the middle */
177 memcpy( buf->buffer + buf->start + buf->content_length - buf->capacity,
178 input, input_len );
Janos Follath6264e662019-11-26 11:11:15 +0000179 }
180
Janos Follath6264e662019-11-26 11:11:15 +0000181 buf->content_length += input_len;
Janos Follath6264e662019-11-26 11:11:15 +0000182 return input_len;
183}
184
185/*
Andrzej Kurekf7774142020-01-22 06:34:59 -0500186 * Gets \p output_len bytes from the ring buffer \p buf into the
187 * \p output buffer. The output buffer can be NULL, in this case a part of the
188 * ring buffer will be dropped, if the requested length is available.
Janos Follath6264e662019-11-26 11:11:15 +0000189 *
190 * \p buf must have been initialized and set up by calling
191 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
192 *
193 * \retval \p output_len, if the data is available.
194 * \retval 0 <= value < \p output_len, if the data is not available.
Andrzej Kurekf7774142020-01-22 06:34:59 -0500195 * \retval -1, if \buf is NULL or it hasn't been set up.
Janos Follath6264e662019-11-26 11:11:15 +0000196 */
197int mbedtls_test_buffer_get( mbedtls_test_buffer *buf,
198 unsigned char* output, size_t output_len )
199{
200 size_t overflow = 0;
201
202 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
203 return -1;
204
Andrzej Kurekf7774142020-01-22 06:34:59 -0500205 if( output == NULL && output_len == 0 )
206 return 0;
Janos Follath6264e662019-11-26 11:11:15 +0000207
208 if( buf->content_length < output_len )
209 output_len = buf->content_length;
210
211 /* Calculate the number of bytes that need to be drawn from lower memory
212 * address */
213 if( buf->start + output_len > buf->capacity )
214 {
215 overflow = ( buf->start + output_len ) % buf->capacity;
216 }
217
Andrzej Kurekf7774142020-01-22 06:34:59 -0500218 if( output != NULL )
219 {
220 memcpy( output, buf->buffer + buf->start, output_len - overflow );
221 memcpy( output + output_len - overflow, buf->buffer, overflow );
222 }
223
Janos Follath6264e662019-11-26 11:11:15 +0000224 buf->content_length -= output_len;
225 buf->start = ( buf->start + output_len ) % buf->capacity;
226
227 return output_len;
228}
229
Hanno Beckera18d1322018-01-03 14:27:32 +0000230/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500231 * Errors used in the message transport mock tests
232 */
233 #define MBEDTLS_TEST_ERROR_ARG_NULL -11
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500234 #define MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED -44
235
236/*
237 * Context for a message metadata queue (fifo) that is on top of the ring buffer.
238 */
239typedef struct mbedtls_test_message_queue
240{
241 size_t *messages;
242 int pos;
243 int num;
244 int capacity;
245} mbedtls_test_message_queue;
246
247/*
248 * Setup and free functions for the message metadata queue.
249 *
250 * \p capacity describes the number of message metadata chunks that can be held
251 * within the queue.
252 *
253 * \retval 0, if a metadata queue of a given length can be allocated.
254 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation failed.
255 */
256int mbedtls_test_message_queue_setup( mbedtls_test_message_queue *queue,
257 size_t capacity )
258{
259 queue->messages = (size_t*) mbedtls_calloc( capacity, sizeof(size_t) );
260 if( NULL == queue->messages )
261 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
262
263 queue->capacity = capacity;
264 queue->pos = 0;
265 queue->num = 0;
266
267 return 0;
268}
269
270void mbedtls_test_message_queue_free( mbedtls_test_message_queue *queue )
271{
272 if( queue == NULL )
273 return;
274
275 if( queue->messages != NULL )
276 mbedtls_free( queue->messages );
277
278 memset( queue, 0, sizeof( *queue ) );
279}
280
281/*
282 * Push message length information onto the message metadata queue.
283 * This will become the last element to leave it (fifo).
284 *
285 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500286 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the queue is full.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500287 * \retval \p len, if the push was successful.
288 */
289int mbedtls_test_message_queue_push_info( mbedtls_test_message_queue *queue,
290 size_t len )
291{
292 int place;
293 if( queue == NULL )
294 return MBEDTLS_TEST_ERROR_ARG_NULL;
295
296 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500297 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500298
299 place = ( queue->pos + queue->num ) % queue->capacity;
300 queue->messages[place] = len;
301 queue->num++;
302 return len;
303}
304
305/*
306 * Pop information about the next message length from the queue. This will be
307 * the oldest inserted message length(fifo). \p msg_len can be null, in which
308 * case the data will be popped from the queue but not copied anywhere.
309 *
310 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500311 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500312 * \retval message length, if the pop was successful, up to the given
313 \p buf_len.
314 */
315int mbedtls_test_message_queue_pop_info( mbedtls_test_message_queue *queue,
316 size_t buf_len )
317{
318 size_t message_length;
319 if( queue == NULL )
320 return MBEDTLS_TEST_ERROR_ARG_NULL;
321 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500322 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500323
324 message_length = queue->messages[queue->pos];
325 queue->messages[queue->pos] = 0;
326 queue->num--;
327 queue->pos++;
328 queue->pos %= queue->capacity;
329 if( queue->pos < 0 )
330 queue->pos += queue->capacity;
331
332 return ( message_length > buf_len ) ? buf_len : message_length;
333}
334
335/*
336 * Take a peek on the info about the next message length from the queue.
337 * This will be the oldest inserted message length(fifo).
338 *
339 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500340 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500341 * \retval 0, if the peek was successful.
342 * \retval MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
343 * too small to fit the message. In this case the \p msg_len will be
344 * set to the full message length so that the
345 * caller knows what portion of the message can be dropped.
346 */
347int mbedtls_test_message_queue_peek_info( mbedtls_test_message_queue *queue,
348 size_t buf_len, size_t* msg_len )
349{
350 if( queue == NULL || msg_len == NULL )
351 return MBEDTLS_TEST_ERROR_ARG_NULL;
352 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500353 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500354
355 *msg_len = queue->messages[queue->pos];
356 return ( *msg_len > buf_len ) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
357}
358/*
Janos Follath031827f2019-11-27 11:12:14 +0000359 * Context for the I/O callbacks simulating network connection.
360 */
361
362#define MBEDTLS_MOCK_SOCKET_CONNECTED 1
363
364typedef struct mbedtls_mock_socket
365{
366 int status;
367 mbedtls_test_buffer *input;
368 mbedtls_test_buffer *output;
369 struct mbedtls_mock_socket *peer;
370} mbedtls_mock_socket;
371
372/*
373 * Setup and teardown functions for mock sockets.
374 */
375void mbedtls_mock_socket_init( mbedtls_mock_socket *socket )
376{
377 memset( socket, 0, sizeof( *socket ) );
378}
379
380/*
381 * Closes the socket \p socket.
382 *
383 * \p socket must have been previously initialized by calling
384 * mbedtls_mock_socket_init().
385 *
386 * This function frees all allocated resources and both sockets are aware of the
387 * new connection state.
388 *
389 * That is, this function does not simulate half-open TCP connections and the
390 * phenomenon that when closing a UDP connection the peer is not aware of the
391 * connection having been closed.
392 */
393void mbedtls_mock_socket_close( mbedtls_mock_socket* socket )
394{
395 if( socket == NULL )
396 return;
397
398 if( socket->input != NULL )
399 {
400 mbedtls_test_buffer_free( socket->input );
401 mbedtls_free( socket->input );
402 }
403
404 if( socket->output != NULL )
405 {
406 mbedtls_test_buffer_free( socket->output );
407 mbedtls_free( socket->output );
408 }
409
410 if( socket->peer != NULL )
411 memset( socket->peer, 0, sizeof( *socket->peer ) );
412
413 memset( socket, 0, sizeof( *socket ) );
414}
415
416/*
417 * Establishes a connection between \p peer1 and \p peer2.
418 *
419 * \p peer1 and \p peer2 must have been previously initialized by calling
420 * mbedtls_mock_socket_init().
421 *
422 * The capacites of the internal buffers are set to \p bufsize. Setting this to
423 * the correct value allows for simulation of MTU, sanity testing the mock
424 * implementation and mocking TCP connections with lower memory cost.
425 */
426int mbedtls_mock_socket_connect( mbedtls_mock_socket* peer1,
427 mbedtls_mock_socket* peer2,
428 size_t bufsize )
429{
430 int ret = -1;
431
Piotr Nowickid796e192020-01-28 12:09:47 +0100432 peer1->output =
Janos Follath031827f2019-11-27 11:12:14 +0000433 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
434 if( peer1->output == NULL )
435 {
436 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
437 goto exit;
438 }
439 mbedtls_test_buffer_init( peer1->output );
440 if( 0 != ( ret = mbedtls_test_buffer_setup( peer1->output, bufsize ) ) )
441 {
442 goto exit;
443 }
444
Piotr Nowickid796e192020-01-28 12:09:47 +0100445 peer2->output =
446 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
447 if( peer2->output == NULL )
448 {
449 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
450 goto exit;
451 }
452 mbedtls_test_buffer_init( peer2->output );
453 if( 0 != ( ret = mbedtls_test_buffer_setup( peer2->output, bufsize ) ) )
454 {
455 goto exit;
456 }
457
Janos Follath031827f2019-11-27 11:12:14 +0000458 peer1->peer = peer2;
459 peer2->peer = peer1;
Piotr Nowickid796e192020-01-28 12:09:47 +0100460 peer1->input = peer2->output;
461 peer2->input = peer1->output;
Janos Follath031827f2019-11-27 11:12:14 +0000462
463 peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
464 ret = 0;
465
466exit:
467
468 if( ret != 0 )
469 {
470 mbedtls_mock_socket_close( peer1 );
471 mbedtls_mock_socket_close( peer2 );
472 }
473
474 return ret;
475}
476
477/*
478 * Callbacks for simulating blocking I/O over connection-oriented transport.
479 */
480
481int mbedtls_mock_tcp_send_b( void *ctx, const unsigned char *buf, size_t len )
482{
483 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
484
485 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
486 return -1;
487
488 return mbedtls_test_buffer_put( socket->output, buf, len );
489}
490
491int mbedtls_mock_tcp_recv_b( void *ctx, unsigned char *buf, size_t len )
492{
493 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
494
495 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
496 return -1;
497
498 return mbedtls_test_buffer_get( socket->input, buf, len );
499}
500
501/*
Janos Follath3766ba52019-11-27 13:31:42 +0000502 * Callbacks for simulating non-blocking I/O over connection-oriented transport.
503 */
504
505int mbedtls_mock_tcp_send_nb( void *ctx, const unsigned char *buf, size_t len )
506{
507 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
508
509 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
510 return -1;
511
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100512 if( socket->output->capacity == socket->output->content_length )
Janos Follath3766ba52019-11-27 13:31:42 +0000513 {
Janos Follath3766ba52019-11-27 13:31:42 +0000514 return MBEDTLS_ERR_SSL_WANT_WRITE;
515 }
516
Janos Follath3766ba52019-11-27 13:31:42 +0000517 return mbedtls_test_buffer_put( socket->output, buf, len );
518}
519
520int mbedtls_mock_tcp_recv_nb( void *ctx, unsigned char *buf, size_t len )
521{
522 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
523
524 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
525 return -1;
526
Andrzej Kurekf40daa32020-02-04 09:00:01 -0500527 if( socket->input->content_length == 0 )
Janos Follath3766ba52019-11-27 13:31:42 +0000528 {
Janos Follath3766ba52019-11-27 13:31:42 +0000529 return MBEDTLS_ERR_SSL_WANT_READ;
530 }
531
Janos Follath3766ba52019-11-27 13:31:42 +0000532 return mbedtls_test_buffer_get( socket->input, buf, len );
533}
534
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500535/* Errors used in the message socket mocks */
536
537#define MBEDTLS_TEST_ERROR_CONTEXT_ERROR -55
538#define MBEDTLS_TEST_ERROR_SEND_FAILED -66
539#define MBEDTLS_TEST_ERROR_RECV_FAILED -77
540
541/*
542 * Structure used as an addon, or a wrapper, around the mocked sockets.
543 * Contains an input queue, to which the other socket pushes metadata,
544 * and an output queue, to which this one pushes metadata. This context is
545 * considered as an owner of the input queue only, which is initialized and
546 * freed in the respective setup and free calls.
547 */
548typedef struct mbedtls_test_message_socket_context
549{
550 mbedtls_test_message_queue* queue_input;
551 mbedtls_test_message_queue* queue_output;
552 mbedtls_mock_socket* socket;
553} mbedtls_test_message_socket_context;
554
555/*
556 * Setup a given mesasge socket context including initialization of
557 * input/output queues to a chosen capacity of messages. Also set the
558 * corresponding mock socket.
559 *
560 * \retval 0, if everything succeeds.
561 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation of a message
562 * queue failed.
563 */
564int mbedtls_message_socket_setup( mbedtls_test_message_queue* queue_input,
565 mbedtls_test_message_queue* queue_output,
566 size_t queue_capacity,
567 mbedtls_mock_socket* socket,
568 mbedtls_test_message_socket_context* ctx )
569{
570 int ret = mbedtls_test_message_queue_setup( queue_input, queue_capacity );
571 if( ret != 0 )
572 return ret;
573 ctx->queue_input = queue_input;
574 ctx->queue_output = queue_output;
575 ctx->socket = socket;
576 mbedtls_mock_socket_init( socket );
577
578 return 0;
579}
580
581/*
582 * Close a given message socket context, along with the socket itself. Free the
583 * memory allocated by the input queue.
584 */
585void mbedtls_message_socket_close( mbedtls_test_message_socket_context* ctx )
586{
587 if( ctx == NULL )
588 return;
589
590 mbedtls_test_message_queue_free( ctx->queue_input );
591 mbedtls_mock_socket_close( ctx->socket );
592 memset( ctx, 0, sizeof( *ctx ) );
593}
594
595/*
596 * Send one message through a given message socket context.
597 *
598 * \retval \p len, if everything succeeds.
599 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
600 * elements or the context itself is null.
601 * \retval MBEDTLS_TEST_ERROR_SEND_FAILED if mbedtls_mock_tcp_send_b failed.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500602 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the output queue is full.
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500603 *
604 * This function will also return any error from
605 * mbedtls_test_message_queue_push_info.
606 */
607int mbedtls_mock_tcp_send_msg( void *ctx, const unsigned char *buf, size_t len )
608{
609 mbedtls_test_message_queue* queue;
610 mbedtls_mock_socket* socket;
611 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
612
613 if( context == NULL || context->socket == NULL
614 || context->queue_output == NULL )
615 {
616 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
617 }
618
619 queue = context->queue_output;
620 socket = context->socket;
621
622 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500623 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500624
625 if( mbedtls_mock_tcp_send_b( socket, buf, len ) != (int) len )
626 return MBEDTLS_TEST_ERROR_SEND_FAILED;
627
628 return mbedtls_test_message_queue_push_info( queue, len );
629}
630
631/*
632 * Receive one message from a given message socket context and return message
633 * length or an error.
634 *
635 * \retval message length, if everything succeeds.
636 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
637 * elements or the context itself is null.
638 * \retval MBEDTLS_TEST_ERROR_RECV_FAILED if mbedtls_mock_tcp_recv_b failed.
639 *
640 * This function will also return any error other than
641 * MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED from mbedtls_test_message_queue_peek_info.
642 */
643int mbedtls_mock_tcp_recv_msg( void *ctx, unsigned char *buf, size_t buf_len )
644{
645 mbedtls_test_message_queue* queue;
646 mbedtls_mock_socket* socket;
647 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
648 size_t drop_len;
649 size_t msg_len;
650 int ret;
651
652 if( context == NULL || context->socket == NULL
653 || context->queue_input == NULL )
654 {
655 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
656 }
657
658 queue = context->queue_input;
659 socket = context->socket;
660
661 /* Peek first, so that in case of a socket error the data remains in
662 * the queue. */
663 ret = mbedtls_test_message_queue_peek_info( queue, buf_len, &msg_len );
664 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
665 {
666 /* Calculate how much to drop */
667 drop_len = msg_len - buf_len;
668
669 /* Set the requested message len to be buffer length */
670 msg_len = buf_len;
671 } else if( ret != 0 )
672 {
673 return ret;
674 }
675
676 if( mbedtls_mock_tcp_recv_b( socket, buf, msg_len ) != (int) msg_len )
677 return MBEDTLS_TEST_ERROR_RECV_FAILED;
678
679 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
680 {
681 /* Drop the remaining part of the message */
682 if( mbedtls_mock_tcp_recv_b( socket, NULL, drop_len ) != (int) drop_len )
683 {
684 /* Inconsistent state - part of the message was read,
685 * and a part couldn't. Not much we can do here, but it should not
686 * happen in test environment, unless forced manually. */
687 }
688 }
689 mbedtls_test_message_queue_pop_info( queue, buf_len );
690
691 return msg_len;
692}
693
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100694#if defined(MBEDTLS_X509_CRT_PARSE_C)
695
696/*
697 * Structure with endpoint's certificates for SSL communication tests.
698 */
699typedef struct mbedtls_endpoint_certificate
700{
701 mbedtls_x509_crt ca_cert;
702 mbedtls_x509_crt cert;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100703 mbedtls_pk_context pkey;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100704} mbedtls_endpoint_certificate;
705
706/*
707 * Endpoint structure for SSL communication tests.
708 */
709typedef struct mbedtls_endpoint
710{
711 const char *name;
712 mbedtls_ssl_context ssl;
713 mbedtls_ssl_config conf;
714 mbedtls_ctr_drbg_context ctr_drbg;
715 mbedtls_entropy_context entropy;
716 mbedtls_mock_socket socket;
717 mbedtls_endpoint_certificate cert;
718} mbedtls_endpoint;
719
720/*
721 * Initializes \p ep_cert structure and assigns it to endpoint
722 * represented by \p ep.
723 *
724 * \retval 0 on success, otherwise error code.
725 */
Andrzej Kurekb2980742020-02-02 19:25:26 -0500726int mbedtls_endpoint_certificate_init( mbedtls_endpoint *ep, int pk_alg )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100727{
728 int i = 0;
729 int ret = -1;
730 mbedtls_endpoint_certificate *cert;
731
732 if( ep == NULL )
733 {
734 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
735 }
736
737 cert = &( ep->cert );
738 mbedtls_x509_crt_init( &( cert->ca_cert ) );
739 mbedtls_x509_crt_init( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100740 mbedtls_pk_init( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100741
742 /* Load the trusted CA */
743
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100744 for( i = 0; mbedtls_test_cas_der[i] != NULL; i++ )
745 {
746 ret = mbedtls_x509_crt_parse_der( &( cert->ca_cert ),
747 (const unsigned char *) mbedtls_test_cas_der[i],
748 mbedtls_test_cas_der_len[i] );
749 TEST_ASSERT( ret == 0 );
750 }
751
752 /* Load own certificate and private key */
753
754 if( ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER )
755 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500756 if( pk_alg == MBEDTLS_PK_RSA )
757 {
758 ret = mbedtls_x509_crt_parse( &( cert->cert ),
759 (const unsigned char*) mbedtls_test_srv_crt_rsa_sha256_der,
760 mbedtls_test_srv_crt_rsa_sha256_der_len );
761 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100762
Andrzej Kurekb2980742020-02-02 19:25:26 -0500763 ret = mbedtls_pk_parse_key( &( cert->pkey ),
764 (const unsigned char*) mbedtls_test_srv_key_rsa_der,
765 mbedtls_test_srv_key_rsa_der_len, NULL, 0 );
766 TEST_ASSERT( ret == 0 );
767 }
768 else
769 {
770 ret = mbedtls_x509_crt_parse( &( cert->cert ),
771 (const unsigned char*) mbedtls_test_srv_crt_ec_der,
772 mbedtls_test_srv_crt_ec_der_len );
773 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100774
Andrzej Kurekb2980742020-02-02 19:25:26 -0500775 ret = mbedtls_pk_parse_key( &( cert->pkey ),
776 (const unsigned char*) mbedtls_test_srv_key_ec_der,
777 mbedtls_test_srv_key_ec_der_len, NULL, 0 );
778 TEST_ASSERT( ret == 0 );
779 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100780 }
781 else
782 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500783 if( pk_alg == MBEDTLS_PK_RSA )
784 {
785 ret = mbedtls_x509_crt_parse( &( cert->cert ),
786 (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
787 mbedtls_test_cli_crt_rsa_der_len );
788 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100789
Andrzej Kurekb2980742020-02-02 19:25:26 -0500790 ret = mbedtls_pk_parse_key( &( cert->pkey ),
791 (const unsigned char *) mbedtls_test_cli_key_rsa_der,
792 mbedtls_test_cli_key_rsa_der_len, NULL, 0 );
793 TEST_ASSERT( ret == 0 );
794 }
795 else
796 {
797 ret = mbedtls_x509_crt_parse( &( cert->cert ),
798 (const unsigned char *) mbedtls_test_cli_crt_ec_der,
799 mbedtls_test_cli_crt_ec_len );
800 TEST_ASSERT( ret == 0 );
801
802 ret = mbedtls_pk_parse_key( &( cert->pkey ),
803 (const unsigned char *) mbedtls_test_cli_key_ec_der,
804 mbedtls_test_cli_key_ec_der_len, NULL, 0 );
805 TEST_ASSERT( ret == 0 );
806 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100807 }
808
809 mbedtls_ssl_conf_ca_chain( &( ep->conf ), &( cert->ca_cert ), NULL );
810
Andrzej Kurekb2980742020-02-02 19:25:26 -0500811 ret = mbedtls_ssl_conf_own_cert( &( ep->conf ), &( cert->cert ),
812 &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100813 TEST_ASSERT( ret == 0 );
814
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100815exit:
816 if( ret != 0 )
817 {
818 mbedtls_x509_crt_free( &( cert->ca_cert ) );
819 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100820 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100821 }
822
823 return ret;
824}
825
826/*
827 * Initializes \p ep structure. It is important to call `mbedtls_endpoint_free()`
828 * after calling this function even if it fails.
829 *
830 * \p endpoint_type must be set as MBEDTLS_SSL_IS_SERVER or
831 * MBEDTLS_SSL_IS_CLIENT.
Andrzej Kurek15daf502020-02-12 09:17:52 -0500832 * \p pk_alg the algorithm to use, currently only MBEDTLS_PK_RSA and
833 * MBEDTLS_PK_ECDSA are supported.
834 * \p dtls_context - in case of DTLS - this is the context handling metadata.
835 * \p input_queue - used only in case of DTLS.
836 * \p output_queue - used only in case of DTLS.
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100837 *
838 * \retval 0 on success, otherwise error code.
839 */
Andrzej Kurek15daf502020-02-12 09:17:52 -0500840int mbedtls_endpoint_init( mbedtls_endpoint *ep, int endpoint_type, int pk_alg,
841 mbedtls_test_message_socket_context *dtls_context,
842 mbedtls_test_message_queue *input_queue,
843 mbedtls_test_message_queue *output_queue )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100844{
845 int ret = -1;
846
Andrzej Kurek15daf502020-02-12 09:17:52 -0500847 if( dtls_context != NULL && ( input_queue == NULL || output_queue == NULL ) )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100848 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Andrzej Kurek15daf502020-02-12 09:17:52 -0500849
850 if( ep == NULL )
851 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100852
853 memset( ep, 0, sizeof( *ep ) );
854
855 ep->name = ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ? "Server" : "Client";
856
857 mbedtls_ssl_init( &( ep->ssl ) );
858 mbedtls_ssl_config_init( &( ep->conf ) );
859 mbedtls_ctr_drbg_init( &( ep->ctr_drbg ) );
860 mbedtls_ssl_conf_rng( &( ep->conf ),
861 mbedtls_ctr_drbg_random,
862 &( ep->ctr_drbg ) );
863 mbedtls_entropy_init( &( ep->entropy ) );
Andrzej Kurek15daf502020-02-12 09:17:52 -0500864 if( dtls_context != NULL )
865 {
866 TEST_ASSERT( mbedtls_message_socket_setup( input_queue, output_queue,
867 100, &( ep->socket ),
868 dtls_context ) == 0 );
869 }
870 else
871 {
872 mbedtls_mock_socket_init( &( ep->socket ) );
873 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100874
875 ret = mbedtls_ctr_drbg_seed( &( ep->ctr_drbg ), mbedtls_entropy_func,
876 &( ep->entropy ), (const unsigned char *) ( ep->name ),
877 strlen( ep->name ) );
878 TEST_ASSERT( ret == 0 );
879
880 /* Non-blocking callbacks without timeout */
Andrzej Kurek15daf502020-02-12 09:17:52 -0500881 if( dtls_context != NULL )
882 {
883 mbedtls_ssl_set_bio( &( ep->ssl ), dtls_context,
884 mbedtls_mock_tcp_send_msg,
885 mbedtls_mock_tcp_recv_msg,
886 NULL );
887 }
888 else
889 {
890 mbedtls_ssl_set_bio( &( ep->ssl ), &( ep->socket ),
891 mbedtls_mock_tcp_send_nb,
892 mbedtls_mock_tcp_recv_nb,
893 NULL );
894 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100895
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100896 ret = mbedtls_ssl_config_defaults( &( ep->conf ), endpoint_type,
Andrzej Kurek15daf502020-02-12 09:17:52 -0500897 ( dtls_context != NULL ) ?
898 MBEDTLS_SSL_TRANSPORT_DATAGRAM :
899 MBEDTLS_SSL_TRANSPORT_STREAM,
900 MBEDTLS_SSL_PRESET_DEFAULT );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100901 TEST_ASSERT( ret == 0 );
902
Andrzej Kurek1a44a152020-02-07 08:21:32 -0500903 ret = mbedtls_ssl_setup( &( ep->ssl ), &( ep->conf ) );
904 TEST_ASSERT( ret == 0 );
Andrzej Kurek15daf502020-02-12 09:17:52 -0500905
906#if defined(MBEDTLS_SSL_PROTO_DTLS) && defined(MBEDTLS_SSL_SRV_C)
907 if( endpoint_type == MBEDTLS_SSL_IS_SERVER && dtls_context != NULL )
908 mbedtls_ssl_conf_dtls_cookies( &( ep->conf ), NULL, NULL, NULL );
909#endif
910
Andrzej Kurekb2980742020-02-02 19:25:26 -0500911 ret = mbedtls_endpoint_certificate_init( ep, pk_alg );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100912 TEST_ASSERT( ret == 0 );
913
914exit:
915 return ret;
916}
917
918/*
919 * Deinitializes certificates from endpoint represented by \p ep.
920 */
921void mbedtls_endpoint_certificate_free( mbedtls_endpoint *ep )
922{
923 mbedtls_endpoint_certificate *cert = &( ep->cert );
924 mbedtls_x509_crt_free( &( cert->ca_cert ) );
925 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100926 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100927}
928
929/*
930 * Deinitializes endpoint represented by \p ep.
931 */
Andrzej Kurek15daf502020-02-12 09:17:52 -0500932void mbedtls_endpoint_free( mbedtls_endpoint *ep,
933 mbedtls_test_message_socket_context *context )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100934{
935 mbedtls_endpoint_certificate_free( ep );
936
937 mbedtls_ssl_free( &( ep->ssl ) );
938 mbedtls_ssl_config_free( &( ep->conf ) );
939 mbedtls_ctr_drbg_free( &( ep->ctr_drbg ) );
940 mbedtls_entropy_free( &( ep->entropy ) );
Andrzej Kurek15daf502020-02-12 09:17:52 -0500941
942 if( context != NULL )
943 {
944 mbedtls_message_socket_close( context );
945 }
946 else
947 {
948 mbedtls_mock_socket_close( &( ep->socket ) );
949 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100950}
951
952/*
953 * This function moves ssl handshake from \p ssl to prescribed \p state.
954 * /p second_ssl is used as second endpoint and their sockets have to be
955 * connected before calling this function.
956 *
957 * \retval 0 on success, otherwise error code.
958 */
959int mbedtls_move_handshake_to_state( mbedtls_ssl_context *ssl,
960 mbedtls_ssl_context *second_ssl,
961 int state )
962{
963 enum { BUFFSIZE = 1024 };
964 int max_steps = 1000;
965 int ret = 0;
966
967 if( ssl == NULL || second_ssl == NULL )
968 {
969 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
970 }
971
972 /* Perform communication via connected sockets */
973 while( ( ssl->state != state ) && ( --max_steps >= 0 ) )
974 {
975 /* If /p second_ssl ends the handshake procedure before /p ssl then
976 * there is no need to call the next step */
977 if( second_ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
978 {
979 ret = mbedtls_ssl_handshake_step( second_ssl );
980 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
981 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
982 {
983 return ret;
984 }
985 }
986
987 /* We only care about the \p ssl state and returns, so we call it last,
988 * to leave the iteration as soon as the state is as expected. */
989 ret = mbedtls_ssl_handshake_step( ssl );
990 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
991 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
992 {
993 return ret;
994 }
995 }
996
997 return ( max_steps >= 0 ) ? ret : -1;
998}
999
1000#endif /* MBEDTLS_X509_CRT_PARSE_C */
1001
Janos Follath3766ba52019-11-27 13:31:42 +00001002/*
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001003 * Write application data. Increase write counter and fragments counter if
1004 * necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001005 */
1006int mbedtls_ssl_write_fragment( mbedtls_ssl_context *ssl, unsigned char *buf,
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001007 int buf_len, int *written,
1008 int *fragments, const int expected_fragments )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001009{
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001010 int ret = mbedtls_ssl_write( ssl, buf + *written, buf_len - *written );
1011 if( ret > 0 )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001012 {
1013 (*fragments)++;
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001014 *written += ret;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001015 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001016
1017 if( expected_fragments == 0 )
1018 {
1019 /* Used for DTLS and the message size larger than MFL. In that case
1020 * the message can not be fragmented and the library should return
1021 * MBEDTLS_ERR_SSL_BAD_INPUT_DATA error. This error must be returned
1022 * to prevent a dead loop inside mbedtls_exchange_data(). */
1023 return ret;
1024 }
1025 else if( expected_fragments == 1 )
1026 {
1027 /* Used for TLS/DTLS and the message size lower than MFL */
1028 TEST_ASSERT( ret == buf_len ||
1029 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1030 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1031 }
1032 else
1033 {
1034 /* Used for TLS and the message size larger than MFL */
1035 TEST_ASSERT( expected_fragments > 1 );
1036 TEST_ASSERT( ( ret >= 0 && ret <= buf_len ) ||
1037 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1038 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1039 }
1040
1041 return 0;
1042
1043exit:
1044 /* Some of the tests failed */
1045 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001046}
1047
1048/*
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001049 * Read application data and increase read counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001050 */
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001051int mbedtls_ssl_read_fragment( mbedtls_ssl_context *ssl, unsigned char *buf,
1052 int buf_len, int *read,
1053 const int expected_fragments )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001054{
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001055 int ret = mbedtls_ssl_read( ssl, buf + *read, buf_len - *read );
1056 if( ret > 0 )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001057 {
1058 *read += ret;
1059 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001060
1061 if( expected_fragments == 0 )
1062 {
1063 TEST_ASSERT( ret == 0 );
1064 }
1065 else if( expected_fragments == 1 )
1066 {
1067 TEST_ASSERT( ret == buf_len ||
1068 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1069 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1070 }
1071 else
1072 {
1073 TEST_ASSERT( expected_fragments > 1 );
1074 TEST_ASSERT( ( ret >= 0 && ret <= buf_len ) ||
1075 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1076 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1077 }
1078
1079 return 0;
1080
1081exit:
1082 /* Some of the tests failed */
1083 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001084}
1085
1086/*
Hanno Beckera18d1322018-01-03 14:27:32 +00001087 * Helper function setting up inverse record transformations
1088 * using given cipher, hash, EtM mode, authentication tag length,
1089 * and version.
1090 */
1091
1092#define CHK( x ) \
1093 do \
1094 { \
1095 if( !( x ) ) \
Hanno Becker81e16a32019-03-01 11:21:44 +00001096 { \
Hanno Beckera5780f12019-04-05 09:55:37 +01001097 ret = -1; \
Hanno Becker81e16a32019-03-01 11:21:44 +00001098 goto cleanup; \
1099 } \
Hanno Beckera18d1322018-01-03 14:27:32 +00001100 } while( 0 )
1101
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001102void set_ciphersuite( mbedtls_ssl_config *conf, const char *cipher,
1103 int* forced_ciphersuite )
1104{
1105 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
1106 forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( cipher );
1107 forced_ciphersuite[1] = 0;
1108
1109 ciphersuite_info =
1110 mbedtls_ssl_ciphersuite_from_id( forced_ciphersuite[0] );
1111
1112 TEST_ASSERT( ciphersuite_info != NULL );
1113 TEST_ASSERT( ciphersuite_info->min_minor_ver <= conf->max_minor_ver );
1114 TEST_ASSERT( ciphersuite_info->max_minor_ver >= conf->min_minor_ver );
1115
1116 if( conf->max_minor_ver > ciphersuite_info->max_minor_ver )
1117 {
1118 conf->max_minor_ver = ciphersuite_info->max_minor_ver;
1119 }
1120 if( conf->min_minor_ver < ciphersuite_info->min_minor_ver )
1121 {
1122 conf->min_minor_ver = ciphersuite_info->min_minor_ver;
1123 }
1124
1125 mbedtls_ssl_conf_ciphersuites( conf, forced_ciphersuite );
1126
1127exit:
1128 return;
1129}
1130
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05001131int psk_dummy_callback( void *p_info, mbedtls_ssl_context *ssl,
1132 const unsigned char *name, size_t name_len )
1133{
1134 (void) p_info;
1135 (void) ssl;
1136 (void) name;
1137 (void) name_len;
1138
1139 return ( 0 );
1140}
1141
Hanno Beckerd856c822019-04-29 17:30:59 +01001142#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
1143#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
1144#else
1145#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
1146#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001147
1148static int build_transforms( mbedtls_ssl_transform *t_in,
1149 mbedtls_ssl_transform *t_out,
1150 int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01001151 int etm, int tag_mode, int ver,
1152 size_t cid0_len,
1153 size_t cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00001154{
1155 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +01001156 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +00001157
1158 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +00001159 unsigned char *key0 = NULL, *key1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001160 unsigned char iv_enc[16], iv_dec[16];
1161
Hanno Beckera0e20d02019-05-15 14:03:01 +01001162#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001163 unsigned char cid0[ SSL_CID_LEN_MIN ];
1164 unsigned char cid1[ SSL_CID_LEN_MIN ];
1165
1166 rnd_std_rand( NULL, cid0, sizeof( cid0 ) );
1167 rnd_std_rand( NULL, cid1, sizeof( cid1 ) );
Hanno Becker43c24b82019-05-01 09:45:57 +01001168#else
1169 ((void) cid0_len);
1170 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +01001171#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001172
Hanno Beckera18d1322018-01-03 14:27:32 +00001173 maclen = 0;
1174
1175 /* Pick cipher */
1176 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
1177 CHK( cipher_info != NULL );
1178 CHK( cipher_info->iv_size <= 16 );
1179 CHK( cipher_info->key_bitlen % 8 == 0 );
1180
1181 /* Pick keys */
1182 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +01001183 /* Allocate `keylen + 1` bytes to ensure that we get
1184 * a non-NULL pointers from `mbedtls_calloc` even if
1185 * `keylen == 0` in the case of the NULL cipher. */
1186 CHK( ( key0 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
1187 CHK( ( key1 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001188 memset( key0, 0x1, keylen );
1189 memset( key1, 0x2, keylen );
1190
1191 /* Setup cipher contexts */
1192 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_enc, cipher_info ) == 0 );
1193 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_dec, cipher_info ) == 0 );
1194 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_enc, cipher_info ) == 0 );
1195 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_dec, cipher_info ) == 0 );
1196
1197#if defined(MBEDTLS_CIPHER_MODE_CBC)
1198 if( cipher_info->mode == MBEDTLS_MODE_CBC )
1199 {
1200 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_enc,
1201 MBEDTLS_PADDING_NONE ) == 0 );
1202 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_dec,
1203 MBEDTLS_PADDING_NONE ) == 0 );
1204 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_enc,
1205 MBEDTLS_PADDING_NONE ) == 0 );
1206 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_dec,
1207 MBEDTLS_PADDING_NONE ) == 0 );
1208 }
1209#endif /* MBEDTLS_CIPHER_MODE_CBC */
1210
1211 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_enc, key0,
1212 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1213 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_dec, key1,
1214 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
1215 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_enc, key1,
1216 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1217 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_dec, key0,
1218 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001219
1220 /* Setup MAC contexts */
1221#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1222 if( cipher_info->mode == MBEDTLS_MODE_CBC ||
1223 cipher_info->mode == MBEDTLS_MODE_STREAM )
1224 {
1225 mbedtls_md_info_t const *md_info;
1226 unsigned char *md0, *md1;
1227
1228 /* Pick hash */
1229 md_info = mbedtls_md_info_from_type( hash_id );
1230 CHK( md_info != NULL );
1231
1232 /* Pick hash keys */
1233 maclen = mbedtls_md_get_size( md_info );
Hanno Becker3ee54212019-04-04 16:31:26 +01001234 CHK( ( md0 = mbedtls_calloc( 1, maclen ) ) != NULL );
1235 CHK( ( md1 = mbedtls_calloc( 1, maclen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001236 memset( md0, 0x5, maclen );
1237 memset( md1, 0x6, maclen );
1238
1239 CHK( mbedtls_md_setup( &t_out->md_ctx_enc, md_info, 1 ) == 0 );
1240 CHK( mbedtls_md_setup( &t_out->md_ctx_dec, md_info, 1 ) == 0 );
1241 CHK( mbedtls_md_setup( &t_in->md_ctx_enc, md_info, 1 ) == 0 );
1242 CHK( mbedtls_md_setup( &t_in->md_ctx_dec, md_info, 1 ) == 0 );
1243
1244 if( ver > MBEDTLS_SSL_MINOR_VERSION_0 )
1245 {
1246 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_enc,
1247 md0, maclen ) == 0 );
1248 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_dec,
1249 md1, maclen ) == 0 );
1250 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_enc,
1251 md1, maclen ) == 0 );
1252 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_dec,
1253 md0, maclen ) == 0 );
1254 }
1255#if defined(MBEDTLS_SSL_PROTO_SSL3)
1256 else
1257 {
1258 memcpy( &t_in->mac_enc, md0, maclen );
1259 memcpy( &t_in->mac_dec, md1, maclen );
1260 memcpy( &t_out->mac_enc, md1, maclen );
1261 memcpy( &t_out->mac_dec, md0, maclen );
1262 }
1263#endif
1264
Hanno Becker3ee54212019-04-04 16:31:26 +01001265 mbedtls_free( md0 );
1266 mbedtls_free( md1 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001267 }
1268#else
1269 ((void) hash_id);
1270#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1271
1272
1273 /* Pick IV's (regardless of whether they
1274 * are being used by the transform). */
1275 ivlen = cipher_info->iv_size;
1276 memset( iv_enc, 0x3, sizeof( iv_enc ) );
1277 memset( iv_dec, 0x4, sizeof( iv_dec ) );
1278
1279 /*
1280 * Setup transforms
1281 */
1282
Jaeden Amero2de07f12019-06-05 13:32:08 +01001283#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1284 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001285 t_out->encrypt_then_mac = etm;
1286 t_in->encrypt_then_mac = etm;
1287#else
1288 ((void) etm);
1289#endif
1290
1291 t_out->minor_ver = ver;
1292 t_in->minor_ver = ver;
1293 t_out->ivlen = ivlen;
1294 t_in->ivlen = ivlen;
1295
1296 switch( cipher_info->mode )
1297 {
1298 case MBEDTLS_MODE_GCM:
1299 case MBEDTLS_MODE_CCM:
1300 t_out->fixed_ivlen = 4;
1301 t_in->fixed_ivlen = 4;
1302 t_out->maclen = 0;
1303 t_in->maclen = 0;
1304 switch( tag_mode )
1305 {
1306 case 0: /* Full tag */
1307 t_out->taglen = 16;
1308 t_in->taglen = 16;
1309 break;
1310 case 1: /* Partial tag */
1311 t_out->taglen = 8;
1312 t_in->taglen = 8;
1313 break;
1314 default:
1315 return( 1 );
1316 }
1317 break;
1318
1319 case MBEDTLS_MODE_CHACHAPOLY:
1320 t_out->fixed_ivlen = 12;
1321 t_in->fixed_ivlen = 12;
1322 t_out->maclen = 0;
1323 t_in->maclen = 0;
1324 switch( tag_mode )
1325 {
1326 case 0: /* Full tag */
1327 t_out->taglen = 16;
1328 t_in->taglen = 16;
1329 break;
1330 case 1: /* Partial tag */
1331 t_out->taglen = 8;
1332 t_in->taglen = 8;
1333 break;
1334 default:
1335 return( 1 );
1336 }
1337 break;
1338
1339 case MBEDTLS_MODE_STREAM:
1340 case MBEDTLS_MODE_CBC:
1341 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1342 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1343 t_out->taglen = 0;
1344 t_in->taglen = 0;
1345 switch( tag_mode )
1346 {
1347 case 0: /* Full tag */
1348 t_out->maclen = maclen;
1349 t_in->maclen = maclen;
1350 break;
1351 case 1: /* Partial tag */
1352 t_out->maclen = 10;
1353 t_in->maclen = 10;
1354 break;
1355 default:
1356 return( 1 );
1357 }
1358 break;
1359 default:
1360 return( 1 );
1361 break;
1362 }
1363
1364 /* Setup IV's */
1365
1366 memcpy( &t_in->iv_dec, iv_dec, sizeof( iv_dec ) );
1367 memcpy( &t_in->iv_enc, iv_enc, sizeof( iv_enc ) );
1368 memcpy( &t_out->iv_dec, iv_enc, sizeof( iv_enc ) );
1369 memcpy( &t_out->iv_enc, iv_dec, sizeof( iv_dec ) );
1370
Hanno Beckera0e20d02019-05-15 14:03:01 +01001371#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001372 /* Add CID */
1373 memcpy( &t_in->in_cid, cid0, cid0_len );
1374 memcpy( &t_in->out_cid, cid1, cid1_len );
1375 t_in->in_cid_len = cid0_len;
1376 t_in->out_cid_len = cid1_len;
1377 memcpy( &t_out->in_cid, cid1, cid1_len );
1378 memcpy( &t_out->out_cid, cid0, cid0_len );
1379 t_out->in_cid_len = cid1_len;
1380 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001381#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001382
Hanno Becker81e16a32019-03-01 11:21:44 +00001383cleanup:
1384
Hanno Becker3ee54212019-04-04 16:31:26 +01001385 mbedtls_free( key0 );
1386 mbedtls_free( key1 );
Hanno Becker81e16a32019-03-01 11:21:44 +00001387
Hanno Beckera5780f12019-04-05 09:55:37 +01001388 return( ret );
Hanno Beckera18d1322018-01-03 14:27:32 +00001389}
1390
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001391/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001392 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001393 * Choose dummy values, mostly non-0 to distinguish from the init default.
1394 */
1395static int ssl_populate_session( mbedtls_ssl_session *session,
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001396 int ticket_len,
1397 const char *crt_file )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001398{
1399#if defined(MBEDTLS_HAVE_TIME)
1400 session->start = mbedtls_time( NULL ) - 42;
1401#endif
1402 session->ciphersuite = 0xabcd;
1403 session->compression = 1;
1404 session->id_len = sizeof( session->id );
1405 memset( session->id, 66, session->id_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001406 memset( session->master, 17, sizeof( session->master ) );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001407
Manuel Pégourié-Gonnard1f6033a2019-05-24 10:17:52 +02001408#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001409 if( strlen( crt_file ) != 0 )
1410 {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001411 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001412 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001413
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001414 mbedtls_x509_crt_init( &tmp_crt );
1415 ret = mbedtls_x509_crt_parse_file( &tmp_crt, crt_file );
1416 if( ret != 0 )
1417 return( ret );
1418
1419#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1420 /* Move temporary CRT. */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001421 session->peer_cert = mbedtls_calloc( 1, sizeof( *session->peer_cert ) );
1422 if( session->peer_cert == NULL )
1423 return( -1 );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001424 *session->peer_cert = tmp_crt;
1425 memset( &tmp_crt, 0, sizeof( tmp_crt ) );
1426#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1427 /* Calculate digest of temporary CRT. */
1428 session->peer_cert_digest =
1429 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
1430 if( session->peer_cert_digest == NULL )
1431 return( -1 );
1432 ret = mbedtls_md( mbedtls_md_info_from_type(
1433 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
1434 tmp_crt.raw.p, tmp_crt.raw.len,
1435 session->peer_cert_digest );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001436 if( ret != 0 )
1437 return( ret );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001438 session->peer_cert_digest_type =
1439 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1440 session->peer_cert_digest_len =
1441 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1442#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1443
1444 mbedtls_x509_crt_free( &tmp_crt );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001445 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001446#else /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001447 (void) crt_file;
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001448#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001449 session->verify_result = 0xdeadbeef;
1450
1451#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
1452 if( ticket_len != 0 )
1453 {
1454 session->ticket = mbedtls_calloc( 1, ticket_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001455 if( session->ticket == NULL )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001456 return( -1 );
1457 memset( session->ticket, 33, ticket_len );
1458 }
1459 session->ticket_len = ticket_len;
1460 session->ticket_lifetime = 86401;
1461#else
1462 (void) ticket_len;
1463#endif
1464
1465#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1466 session->mfl_code = 1;
1467#endif
1468#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1469 session->trunc_hmac = 1;
1470#endif
1471#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1472 session->encrypt_then_mac = 1;
1473#endif
1474
1475 return( 0 );
1476}
1477
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001478/*
1479 * Perform data exchanging between \p ssl_1 and \p ssl_2 and check if the
1480 * message was sent in the correct number of fragments.
1481 *
1482 * /p ssl_1 and /p ssl_2 Endpoints represented by mbedtls_ssl_context. Both
1483 * of them must be initialized and connected beforehand.
1484 * /p msg_len_1 and /p msg_len_2 specify the size of the message to send.
1485 * /p expected_fragments_1 and /p expected_fragments_2 determine in how many
1486 * fragments the message should be sent.
1487 * expected_fragments is 0: can be used for DTLS testing while the message
1488 * size is larger than MFL. In that case the message
1489 * cannot be fragmented and sent to the second endpoint.
1490 * This value can be used for negative tests.
1491 * expected_fragments is 1: can be used for TLS/DTLS testing while the
1492 * message size is below MFL
1493 * expected_fragments > 1: can be used for TLS testing while the message
1494 * size is larger than MFL
1495 *
1496 * \retval 0 on success, otherwise error code.
1497 */
1498int mbedtls_exchange_data( mbedtls_ssl_context *ssl_1,
1499 int msg_len_1, const int expected_fragments_1,
1500 mbedtls_ssl_context *ssl_2,
1501 int msg_len_2, const int expected_fragments_2 )
1502{
1503 unsigned char *msg_buf_1 = malloc( msg_len_1 );
1504 unsigned char *msg_buf_2 = malloc( msg_len_2 );
1505 unsigned char *in_buf_1 = malloc( msg_len_2 );
1506 unsigned char *in_buf_2 = malloc( msg_len_1 );
1507 int msg_type, ret = -1;
1508
1509 /* Perform this test with two message types. At first use a message
1510 * consisting of only 0x00 for the client and only 0xFF for the server.
1511 * At the second time use message with generated data */
1512 for( msg_type = 0; msg_type < 2; msg_type++ )
1513 {
1514 int written_1 = 0;
1515 int written_2 = 0;
1516 int read_1 = 0;
1517 int read_2 = 0;
1518 int fragments_1 = 0;
1519 int fragments_2 = 0;
1520
1521 if( msg_type == 0 )
1522 {
1523 memset( msg_buf_1, 0x00, msg_len_1 );
1524 memset( msg_buf_2, 0xff, msg_len_2 );
1525 }
1526 else
1527 {
1528 int i, j = 0;
1529 for( i = 0; i < msg_len_1; i++ )
1530 {
1531 msg_buf_1[i] = j++ & 0xFF;
1532 }
1533 for( i = 0; i < msg_len_2; i++ )
1534 {
1535 msg_buf_2[i] = ( j -= 5 ) & 0xFF;
1536 }
1537 }
1538
1539 while( read_1 < msg_len_2 || read_2 < msg_len_1 )
1540 {
1541 /* ssl_1 sending */
1542 if( msg_len_1 > written_1 )
1543 {
1544 ret = mbedtls_ssl_write_fragment( ssl_1, msg_buf_1,
1545 msg_len_1, &written_1,
1546 &fragments_1,
1547 expected_fragments_1 );
1548 if( expected_fragments_1 == 0 )
1549 {
1550 /* This error is expected when the message is too large and
1551 * cannot be fragmented */
1552 TEST_ASSERT( ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1553 msg_len_1 = 0;
1554 }
1555 else
1556 {
1557 TEST_ASSERT( ret == 0 );
1558 }
1559 }
1560
1561 /* ssl_2 sending */
1562 if( msg_len_2 > written_2 )
1563 {
1564 ret = mbedtls_ssl_write_fragment( ssl_2, msg_buf_2,
1565 msg_len_2, &written_2,
1566 &fragments_2,
1567 expected_fragments_2 );
1568 if( expected_fragments_2 == 0 )
1569 {
1570 /* This error is expected when the message is too large and
1571 * cannot be fragmented */
1572 TEST_ASSERT( ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1573 msg_len_2 = 0;
1574 }
1575 else
1576 {
1577 TEST_ASSERT( ret == 0 );
1578 }
1579 }
1580
1581 /* ssl_1 reading */
1582 if( read_1 < msg_len_2 )
1583 {
1584 ret = mbedtls_ssl_read_fragment( ssl_1, in_buf_1,
1585 msg_len_2, &read_1,
1586 expected_fragments_1 );
1587 TEST_ASSERT( ret == 0 );
1588 }
1589
1590 /* ssl_2 reading */
1591 if( read_2 < msg_len_1 )
1592 {
1593 ret = mbedtls_ssl_read_fragment( ssl_2, in_buf_2,
1594 msg_len_1, &read_2,
1595 expected_fragments_2 );
1596 TEST_ASSERT( ret == 0 );
1597 }
1598 }
1599
1600 ret = -1;
1601 TEST_ASSERT( 0 == memcmp( msg_buf_1, in_buf_2, msg_len_1 ) );
1602 TEST_ASSERT( 0 == memcmp( msg_buf_2, in_buf_1, msg_len_2 ) );
1603 TEST_ASSERT( fragments_1 == expected_fragments_1 );
1604 TEST_ASSERT( fragments_2 == expected_fragments_2 );
1605 }
1606
1607 ret = 0;
1608
1609exit:
1610 free( msg_buf_1 );
1611 free( in_buf_1 );
1612 free( msg_buf_2 );
1613 free( in_buf_2 );
1614
1615 return ret;
1616}
1617
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001618/*
1619 * Perform data exchanging between \p ssl_1 and \p ssl_2. Both of endpoints
1620 * must be initialized and connected beforehand.
1621 *
1622 * \retval 0 on success, otherwise error code.
1623 */
1624int exchange_data( mbedtls_ssl_context *ssl_1,
1625 mbedtls_ssl_context *ssl_2 )
1626{
1627 return mbedtls_exchange_data( ssl_1, 256, 1,
1628 ssl_2, 256, 1 );
1629}
1630
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001631#if defined(MBEDTLS_X509_CRT_PARSE_C)
1632void perform_handshake( handshake_test_options* options )
1633{
1634 /* forced_ciphersuite needs to last until the end of the handshake */
1635 int forced_ciphersuite[2];
1636 enum { BUFFSIZE = 17000 };
1637 mbedtls_endpoint client, server;
1638#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
1639 const char *psk_identity = "foo";
1640#endif
1641#if defined(MBEDTLS_TIMING_C)
1642 mbedtls_timing_delay_context timer_client, timer_server;
1643#endif
1644#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1645 unsigned char *context_buf = NULL;
1646 size_t context_buf_len;
1647#endif
1648#if defined(MBEDTLS_SSL_RENEGOTIATION)
1649 int ret = -1;
1650#endif
1651
1652
1653 mbedtls_test_message_queue server_queue, client_queue;
1654 mbedtls_test_message_socket_context server_context, client_context;
1655
1656 /* Client side */
1657 if( options->dtls != 0 )
1658 {
1659 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
1660 options->pk_alg, &client_context,
1661 &client_queue,
1662 &server_queue ) == 0 );
1663#if defined(MBEDTLS_TIMING_C)
1664 mbedtls_ssl_set_timer_cb( &client.ssl, &timer_client,
1665 mbedtls_timing_set_delay,
1666 mbedtls_timing_get_delay );
1667#endif
1668 }
1669 else
1670 {
1671 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
1672 options->pk_alg, NULL, NULL,
1673 NULL ) == 0 );
1674 }
1675 mbedtls_ssl_conf_min_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
1676 options->version );
1677 mbedtls_ssl_conf_max_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
1678 options->version );
1679
1680 if( strlen( options->cipher ) > 0 )
1681 {
1682 set_ciphersuite( &client.conf, options->cipher, forced_ciphersuite );
1683 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001684
1685#if defined (MBEDTLS_DEBUG_C)
1686 if( options->cli_log_fun )
1687 {
1688 mbedtls_debug_set_threshold( 4 );
1689 mbedtls_ssl_conf_dbg( &client.conf, options->cli_log_fun,
1690 options->cli_log_obj );
1691 }
1692#endif
1693
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001694 /* Server side */
1695 if( options->dtls != 0 )
1696 {
1697 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
1698 options->pk_alg, &server_context,
1699 &server_queue,
1700 &client_queue) == 0 );
1701#if defined(MBEDTLS_TIMING_C)
1702 mbedtls_ssl_set_timer_cb( &server.ssl, &timer_server,
1703 mbedtls_timing_set_delay,
1704 mbedtls_timing_get_delay );
1705#endif
1706 }
1707 else
1708 {
1709 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
1710 options->pk_alg, NULL, NULL, NULL ) == 0 );
1711 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001712
1713 mbedtls_ssl_conf_authmode( &server.conf, options->srv_auth_mode );
1714
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001715 mbedtls_ssl_conf_min_version( &server.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
1716 options->version );
1717#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1718 TEST_ASSERT( mbedtls_ssl_conf_max_frag_len( &(server.conf),
1719 (unsigned char) options->mfl ) == 0 );
1720 TEST_ASSERT( mbedtls_ssl_conf_max_frag_len( &(client.conf),
1721 (unsigned char) options->mfl ) == 0 );
1722#else
1723 TEST_ASSERT( MBEDTLS_SSL_MAX_FRAG_LEN_NONE == options->mfl );
1724#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
1725
1726#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
1727 if( options->psk_str != NULL && options->psk_str->len > 0 )
1728 {
1729 TEST_ASSERT( mbedtls_ssl_conf_psk( &client.conf, options->psk_str->x,
1730 options->psk_str->len,
1731 (const unsigned char *) psk_identity,
1732 strlen( psk_identity ) ) == 0 );
1733
1734 TEST_ASSERT( mbedtls_ssl_conf_psk( &server.conf, options->psk_str->x,
1735 options->psk_str->len,
1736 (const unsigned char *) psk_identity,
1737 strlen( psk_identity ) ) == 0 );
1738
1739 mbedtls_ssl_conf_psk_cb( &server.conf, psk_dummy_callback, NULL );
1740 }
1741#endif
1742#if defined(MBEDTLS_SSL_RENEGOTIATION)
1743 if( options->renegotiate )
1744 {
1745 mbedtls_ssl_conf_renegotiation( &(server.conf),
1746 MBEDTLS_SSL_RENEGOTIATION_ENABLED );
1747 mbedtls_ssl_conf_renegotiation( &(client.conf),
1748 MBEDTLS_SSL_RENEGOTIATION_ENABLED );
1749
1750 mbedtls_ssl_conf_legacy_renegotiation( &(server.conf),
1751 options->legacy_renegotiation );
1752 mbedtls_ssl_conf_legacy_renegotiation( &(client.conf),
1753 options->legacy_renegotiation );
1754 }
1755#endif /* MBEDTLS_SSL_RENEGOTIATION */
1756
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001757#if defined (MBEDTLS_DEBUG_C)
1758 if( options->srv_log_fun )
1759 {
1760 mbedtls_debug_set_threshold( 4 );
1761 mbedtls_ssl_conf_dbg( &server.conf, options->srv_log_fun,
1762 options->srv_log_obj );
1763 }
1764#endif
1765
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001766 TEST_ASSERT( mbedtls_mock_socket_connect( &(client.socket),
1767 &(server.socket),
1768 BUFFSIZE ) == 0 );
1769
1770 TEST_ASSERT( mbedtls_move_handshake_to_state( &(client.ssl),
1771 &(server.ssl),
1772 MBEDTLS_SSL_HANDSHAKE_OVER )
1773 == 0 );
1774 TEST_ASSERT( client.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
1775 TEST_ASSERT( server.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
1776
1777 if( options->cli_msg_len != 0 || options->srv_msg_len != 0 )
1778 {
1779 /* Start data exchanging test */
1780 TEST_ASSERT( mbedtls_exchange_data( &(client.ssl), options->cli_msg_len,
1781 options->expected_cli_fragments,
1782 &(server.ssl), options->srv_msg_len,
1783 options->expected_srv_fragments )
1784 == 0 );
1785 }
1786#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1787 if( options->serialize == 1 )
1788 {
1789 TEST_ASSERT( options->dtls == 1 );
1790
1791 TEST_ASSERT( mbedtls_ssl_context_save( &(server.ssl), NULL,
1792 0, &context_buf_len )
1793 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
1794
1795 context_buf = mbedtls_calloc( 1, context_buf_len );
1796 TEST_ASSERT( context_buf != NULL );
1797
1798 TEST_ASSERT( mbedtls_ssl_context_save( &(server.ssl), context_buf,
1799 context_buf_len,
1800 &context_buf_len ) == 0 );
1801
1802 mbedtls_ssl_free( &(server.ssl) );
1803 mbedtls_ssl_init( &(server.ssl) );
1804
1805 TEST_ASSERT( mbedtls_ssl_setup( &(server.ssl), &(server.conf) ) == 0 );
1806
1807 mbedtls_ssl_set_bio( &( server.ssl ), &server_context,
1808 mbedtls_mock_tcp_send_msg,
1809 mbedtls_mock_tcp_recv_msg,
1810 NULL );
1811
1812#if defined(MBEDTLS_TIMING_C)
1813 mbedtls_ssl_set_timer_cb( &server.ssl, &timer_server,
1814 mbedtls_timing_set_delay,
1815 mbedtls_timing_get_delay );
1816#endif
1817 TEST_ASSERT( mbedtls_ssl_context_load( &( server.ssl ), context_buf,
1818 context_buf_len ) == 0 );
1819
1820 /* Retest writing/reading */
1821 if( options->cli_msg_len != 0 || options->srv_msg_len != 0 )
1822 {
1823 TEST_ASSERT( mbedtls_exchange_data( &(client.ssl),
1824 options->cli_msg_len,
1825 options->expected_cli_fragments,
1826 &(server.ssl),
1827 options->srv_msg_len,
1828 options->expected_srv_fragments )
1829 == 0 );
1830 }
1831 }
1832#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
1833#if defined(MBEDTLS_SSL_RENEGOTIATION)
1834 if( options->renegotiate )
1835 {
1836 /* Start test with renegotiation */
1837 TEST_ASSERT( server.ssl.renego_status ==
1838 MBEDTLS_SSL_INITIAL_HANDSHAKE );
1839 TEST_ASSERT( client.ssl.renego_status ==
1840 MBEDTLS_SSL_INITIAL_HANDSHAKE );
1841
1842 /* After calling this function for the server, it only sends a handshake
1843 * request. All renegotiation should happen during data exchanging */
1844 TEST_ASSERT( mbedtls_ssl_renegotiate( &(server.ssl) ) == 0 );
1845 TEST_ASSERT( server.ssl.renego_status ==
1846 MBEDTLS_SSL_RENEGOTIATION_PENDING );
1847 TEST_ASSERT( client.ssl.renego_status ==
1848 MBEDTLS_SSL_INITIAL_HANDSHAKE );
1849
1850 TEST_ASSERT( exchange_data( &(client.ssl), &(server.ssl) ) == 0 );
1851 TEST_ASSERT( server.ssl.renego_status ==
1852 MBEDTLS_SSL_RENEGOTIATION_DONE );
1853 TEST_ASSERT( client.ssl.renego_status ==
1854 MBEDTLS_SSL_RENEGOTIATION_DONE );
1855
1856 /* After calling mbedtls_ssl_renegotiate for the client all renegotiation
1857 * should happen inside this function. However in this test, we cannot
1858 * perform simultaneous communication betwen client and server so this
1859 * function will return waiting error on the socket. All rest of
1860 * renegotiation should happen during data exchanging */
1861 ret = mbedtls_ssl_renegotiate( &(client.ssl) );
1862 TEST_ASSERT( ret == 0 ||
1863 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1864 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1865 TEST_ASSERT( server.ssl.renego_status ==
1866 MBEDTLS_SSL_RENEGOTIATION_DONE );
1867 TEST_ASSERT( client.ssl.renego_status ==
1868 MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS );
1869
1870 TEST_ASSERT( exchange_data( &(client.ssl), &(server.ssl) ) == 0 );
1871 TEST_ASSERT( server.ssl.renego_status ==
1872 MBEDTLS_SSL_RENEGOTIATION_DONE );
1873 TEST_ASSERT( client.ssl.renego_status ==
1874 MBEDTLS_SSL_RENEGOTIATION_DONE );
1875 }
1876#endif /* MBEDTLS_SSL_RENEGOTIATION */
1877
1878exit:
1879 mbedtls_endpoint_free( &client, options->dtls != 0 ? &client_context : NULL );
1880 mbedtls_endpoint_free( &server, options->dtls != 0 ? &server_context : NULL );
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001881#if defined (MBEDTLS_DEBUG_C)
1882 if( options->cli_log_fun || options->srv_log_fun )
1883 {
1884 mbedtls_debug_set_threshold( 0 );
1885 }
1886#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001887#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1888 if( context_buf != NULL )
1889 mbedtls_free( context_buf );
1890#endif
1891}
1892#endif /* MBEDTLS_X509_CRT_PARSE_C */
1893
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001894/* END_HEADER */
1895
1896/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001897 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001898 * END_DEPENDENCIES
1899 */
1900
Janos Follath6264e662019-11-26 11:11:15 +00001901/* BEGIN_CASE */
1902void test_callback_buffer_sanity()
1903{
1904 enum { MSGLEN = 10 };
1905 mbedtls_test_buffer buf;
1906 unsigned char input[MSGLEN];
1907 unsigned char output[MSGLEN];
1908
1909 memset( input, 0, sizeof(input) );
1910
1911 /* Make sure calling put and get on NULL buffer results in error. */
1912 TEST_ASSERT( mbedtls_test_buffer_put( NULL, input, sizeof( input ) )
1913 == -1 );
1914 TEST_ASSERT( mbedtls_test_buffer_get( NULL, output, sizeof( output ) )
1915 == -1 );
1916 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001917
Janos Follath6264e662019-11-26 11:11:15 +00001918 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, 0 ) == -1 );
1919 TEST_ASSERT( mbedtls_test_buffer_get( NULL, NULL, 0 ) == -1 );
1920
1921 /* Make sure calling put and get on a buffer that hasn't been set up results
1922 * in eror. */
1923 mbedtls_test_buffer_init( &buf );
1924
1925 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) ) == -1 );
1926 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, sizeof( output ) )
1927 == -1 );
1928 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001929
Janos Follath6264e662019-11-26 11:11:15 +00001930 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == -1 );
1931 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == -1 );
1932
Andrzej Kurekf7774142020-01-22 06:34:59 -05001933 /* Make sure calling put and get on NULL input only results in
1934 * error if the length is not zero, and that a NULL output is valid for data
1935 * dropping.
1936 */
Janos Follath6264e662019-11-26 11:11:15 +00001937
1938 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, sizeof( input ) ) == 0 );
1939
1940 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
1941 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, sizeof( output ) )
Andrzej Kurekf7774142020-01-22 06:34:59 -05001942 == 0 );
Janos Follath6264e662019-11-26 11:11:15 +00001943 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == 0 );
1944 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == 0 );
1945
Piotr Nowickifb437d72020-01-13 16:59:12 +01001946 /* Make sure calling put several times in the row is safe */
1947
1948 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) )
1949 == sizeof( input ) );
1950 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, 2 ) == 2 );
1951 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 1 ) == 1 );
1952 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 1 );
1953 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 0 );
1954
1955
Janos Follath6264e662019-11-26 11:11:15 +00001956exit:
1957
1958 mbedtls_test_buffer_free( &buf );
1959}
1960/* END_CASE */
1961
1962/*
1963 * Test if the implementation of `mbedtls_test_buffer` related functions is
1964 * correct and works as expected.
1965 *
1966 * That is
1967 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
1968 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1969 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
1970 * bytes.
1971 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1972 * - All of the bytes we got match the bytes we put in in a FIFO manner.
1973 */
1974
1975/* BEGIN_CASE */
1976void test_callback_buffer( int size, int put1, int put1_ret,
1977 int get1, int get1_ret, int put2, int put2_ret,
1978 int get2, int get2_ret )
1979{
1980 enum { ROUNDS = 2 };
1981 size_t put[ROUNDS];
1982 int put_ret[ROUNDS];
1983 size_t get[ROUNDS];
1984 int get_ret[ROUNDS];
1985 mbedtls_test_buffer buf;
1986 unsigned char* input = NULL;
1987 size_t input_len;
1988 unsigned char* output = NULL;
1989 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00001990 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00001991
1992 mbedtls_test_buffer_init( &buf );
1993 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, size ) == 0 );
1994
1995 /* Check the sanity of input parameters and initialise local variables. That
1996 * is, ensure that the amount of data is not negative and that we are not
1997 * expecting more to put or get than we actually asked for. */
1998 TEST_ASSERT( put1 >= 0 );
1999 put[0] = put1;
2000 put_ret[0] = put1_ret;
2001 TEST_ASSERT( put1_ret <= put1 );
2002 TEST_ASSERT( put2 >= 0 );
2003 put[1] = put2;
2004 put_ret[1] = put2_ret;
2005 TEST_ASSERT( put2_ret <= put2 );
2006
2007 TEST_ASSERT( get1 >= 0 );
2008 get[0] = get1;
2009 get_ret[0] = get1_ret;
2010 TEST_ASSERT( get1_ret <= get1 );
2011 TEST_ASSERT( get2 >= 0 );
2012 get[1] = get2;
2013 get_ret[1] = get2_ret;
2014 TEST_ASSERT( get2_ret <= get2 );
2015
2016 input_len = 0;
2017 /* Calculate actual input and output lengths */
2018 for( j = 0; j < ROUNDS; j++ )
2019 {
2020 if( put_ret[j] > 0 )
2021 {
2022 input_len += put_ret[j];
2023 }
2024 }
2025 /* In order to always have a valid pointer we always allocate at least 1
2026 * byte. */
2027 if( input_len == 0 )
2028 input_len = 1;
2029 ASSERT_ALLOC( input, input_len );
2030
2031 output_len = 0;
2032 for( j = 0; j < ROUNDS; j++ )
2033 {
2034 if( get_ret[j] > 0 )
2035 {
2036 output_len += get_ret[j];
2037 }
2038 }
2039 TEST_ASSERT( output_len <= input_len );
2040 /* In order to always have a valid pointer we always allocate at least 1
2041 * byte. */
2042 if( output_len == 0 )
2043 output_len = 1;
2044 ASSERT_ALLOC( output, output_len );
2045
2046 /* Fill up the buffer with structured data so that unwanted changes
2047 * can be detected */
2048 for( i = 0; i < input_len; i++ )
2049 {
2050 input[i] = i & 0xFF;
2051 }
2052
2053 written = read = 0;
2054 for( j = 0; j < ROUNDS; j++ )
2055 {
2056 TEST_ASSERT( put_ret[j] == mbedtls_test_buffer_put( &buf,
2057 input + written, put[j] ) );
2058 written += put_ret[j];
2059 TEST_ASSERT( get_ret[j] == mbedtls_test_buffer_get( &buf,
2060 output + read, get[j] ) );
2061 read += get_ret[j];
2062 TEST_ASSERT( read <= written );
2063 if( get_ret[j] > 0 )
2064 {
2065 TEST_ASSERT( memcmp( output + read - get_ret[j],
2066 input + read - get_ret[j], get_ret[j] )
2067 == 0 );
2068 }
2069 }
2070
2071exit:
2072
2073 mbedtls_free( input );
2074 mbedtls_free( output );
2075 mbedtls_test_buffer_free( &buf );
2076}
2077/* END_CASE */
2078
Janos Follath031827f2019-11-27 11:12:14 +00002079/*
Janos Follathc673c2c2019-12-02 15:47:26 +00002080 * Test if the implementation of `mbedtls_mock_socket` related I/O functions is
2081 * correct and works as expected on unconnected sockets.
2082 */
2083
2084/* BEGIN_CASE */
2085void ssl_mock_sanity( )
2086{
2087 enum { MSGLEN = 105 };
2088 unsigned char message[MSGLEN];
2089 unsigned char received[MSGLEN];
2090 mbedtls_mock_socket socket;
2091
2092 mbedtls_mock_socket_init( &socket );
2093 TEST_ASSERT( mbedtls_mock_tcp_send_b( &socket, message, MSGLEN ) < 0 );
2094 mbedtls_mock_socket_close( &socket );
2095 mbedtls_mock_socket_init( &socket );
2096 TEST_ASSERT( mbedtls_mock_tcp_recv_b( &socket, received, MSGLEN ) < 0 );
2097 mbedtls_mock_socket_close( &socket );
2098
2099 mbedtls_mock_socket_init( &socket );
2100 TEST_ASSERT( mbedtls_mock_tcp_send_nb( &socket, message, MSGLEN ) < 0 );
2101 mbedtls_mock_socket_close( &socket );
2102 mbedtls_mock_socket_init( &socket );
2103 TEST_ASSERT( mbedtls_mock_tcp_recv_nb( &socket, received, MSGLEN ) < 0 );
2104 mbedtls_mock_socket_close( &socket );
2105
2106exit:
2107
2108 mbedtls_mock_socket_close( &socket );
2109}
2110/* END_CASE */
2111
2112/*
2113 * Test if the implementation of `mbedtls_mock_socket` related functions can
2114 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00002115 */
2116
2117/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002118void ssl_mock_tcp( int blocking )
Janos Follath031827f2019-11-27 11:12:14 +00002119{
Janos Follathc673c2c2019-12-02 15:47:26 +00002120 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002121 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00002122 unsigned char message[MSGLEN];
2123 unsigned char received[MSGLEN];
2124 mbedtls_mock_socket client;
2125 mbedtls_mock_socket server;
2126 size_t written, read;
2127 int send_ret, recv_ret;
2128 mbedtls_ssl_send_t *send;
2129 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00002130 unsigned i;
2131
2132 if( blocking == 0 )
2133 {
2134 send = mbedtls_mock_tcp_send_nb;
2135 recv = mbedtls_mock_tcp_recv_nb;
2136 }
2137 else
2138 {
2139 send = mbedtls_mock_tcp_send_b;
2140 recv = mbedtls_mock_tcp_recv_b;
2141 }
2142
2143 mbedtls_mock_socket_init( &client );
2144 mbedtls_mock_socket_init( &server );
2145
2146 /* Fill up the buffer with structured data so that unwanted changes
2147 * can be detected */
2148 for( i = 0; i < MSGLEN; i++ )
2149 {
2150 message[i] = i & 0xFF;
2151 }
2152
2153 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002154 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follathc673c2c2019-12-02 15:47:26 +00002155
2156 /* Send the message to the server */
2157 send_ret = recv_ret = 1;
2158 written = read = 0;
2159 while( send_ret != 0 || recv_ret != 0 )
2160 {
2161 send_ret = send( &client, message + written, MSGLEN - written );
2162
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002163 TEST_ASSERT( send_ret >= 0 );
2164 TEST_ASSERT( send_ret <= BUFLEN );
2165 written += send_ret;
2166
2167 /* If the buffer is full we can test blocking and non-blocking send */
2168 if ( send_ret == BUFLEN )
Janos Follathc673c2c2019-12-02 15:47:26 +00002169 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002170 int blocking_ret = send( &client, message , 1 );
2171 if ( blocking )
2172 {
2173 TEST_ASSERT( blocking_ret == 0 );
2174 }
2175 else
2176 {
2177 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
2178 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002179 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002180
2181 recv_ret = recv( &server, received + read, MSGLEN - read );
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002182
2183 /* The result depends on whether any data was sent */
2184 if ( send_ret > 0 )
Janos Follathc673c2c2019-12-02 15:47:26 +00002185 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002186 TEST_ASSERT( recv_ret > 0 );
2187 TEST_ASSERT( recv_ret <= BUFLEN );
2188 read += recv_ret;
2189 }
2190 else if( blocking )
2191 {
2192 TEST_ASSERT( recv_ret == 0 );
Janos Follathc673c2c2019-12-02 15:47:26 +00002193 }
2194 else
2195 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002196 TEST_ASSERT( recv_ret == MBEDTLS_ERR_SSL_WANT_READ );
2197 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00002198 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002199
2200 /* If the buffer is empty we can test blocking and non-blocking read */
2201 if ( recv_ret == BUFLEN )
2202 {
2203 int blocking_ret = recv( &server, received, 1 );
2204 if ( blocking )
2205 {
2206 TEST_ASSERT( blocking_ret == 0 );
2207 }
2208 else
2209 {
2210 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
2211 }
2212 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002213 }
2214 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2215
2216exit:
2217
2218 mbedtls_mock_socket_close( &client );
2219 mbedtls_mock_socket_close( &server );
2220}
2221/* END_CASE */
2222
2223/*
2224 * Test if the implementation of `mbedtls_mock_socket` related functions can
2225 * send messages in both direction at the same time (with the I/O calls
2226 * interleaving).
2227 */
2228
2229/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002230void ssl_mock_tcp_interleaving( int blocking )
Janos Follathc673c2c2019-12-02 15:47:26 +00002231{
Janos Follath031827f2019-11-27 11:12:14 +00002232 enum { ROUNDS = 2 };
2233 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002234 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00002235 unsigned char message[ROUNDS][MSGLEN];
2236 unsigned char received[ROUNDS][MSGLEN];
2237 mbedtls_mock_socket client;
2238 mbedtls_mock_socket server;
2239 size_t written[ROUNDS];
2240 size_t read[ROUNDS];
2241 int send_ret[ROUNDS];
2242 int recv_ret[ROUNDS];
2243 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00002244 mbedtls_ssl_send_t *send;
2245 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00002246
2247 if( blocking == 0 )
2248 {
2249 send = mbedtls_mock_tcp_send_nb;
2250 recv = mbedtls_mock_tcp_recv_nb;
2251 }
2252 else
2253 {
2254 send = mbedtls_mock_tcp_send_b;
2255 recv = mbedtls_mock_tcp_recv_b;
2256 }
Janos Follath031827f2019-11-27 11:12:14 +00002257
2258 mbedtls_mock_socket_init( &client );
2259 mbedtls_mock_socket_init( &server );
2260
2261 /* Fill up the buffers with structured data so that unwanted changes
2262 * can be detected */
2263 for( i = 0; i < ROUNDS; i++ )
2264 {
2265 for( j = 0; j < MSGLEN; j++ )
2266 {
2267 message[i][j] = ( i * MSGLEN + j ) & 0xFF;
2268 }
2269 }
2270
Janos Follath031827f2019-11-27 11:12:14 +00002271 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002272 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follath031827f2019-11-27 11:12:14 +00002273
Janos Follath031827f2019-11-27 11:12:14 +00002274 /* Send the message from both sides, interleaving. */
2275 progress = 1;
2276 for( i = 0; i < ROUNDS; i++ )
2277 {
2278 written[i] = 0;
2279 read[i] = 0;
2280 }
2281 /* This loop does not stop as long as there was a successful write or read
2282 * of at least one byte on either side. */
2283 while( progress != 0 )
2284 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002285 mbedtls_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00002286
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002287 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00002288 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002289 /* First sending is from the client */
2290 socket = ( i % 2 == 0 ) ? ( &client ) : ( &server );
Janos Follath031827f2019-11-27 11:12:14 +00002291
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002292 send_ret[i] = send( socket, message[i] + written[i],
2293 MSGLEN - written[i] );
2294 TEST_ASSERT( send_ret[i] >= 0 );
2295 TEST_ASSERT( send_ret[i] <= BUFLEN );
2296 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002297
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002298 /* If the buffer is full we can test blocking and non-blocking
2299 * send */
2300 if ( send_ret[i] == BUFLEN )
2301 {
2302 int blocking_ret = send( socket, message[i] , 1 );
2303 if ( blocking )
2304 {
2305 TEST_ASSERT( blocking_ret == 0 );
2306 }
2307 else
2308 {
2309 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
2310 }
2311 }
Janos Follath3766ba52019-11-27 13:31:42 +00002312 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002313
2314 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00002315 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002316 /* First receiving is from the server */
2317 socket = ( i % 2 == 0 ) ? ( &server ) : ( &client );
2318
2319 recv_ret[i] = recv( socket, received[i] + read[i],
2320 MSGLEN - read[i] );
2321
2322 /* The result depends on whether any data was sent */
2323 if ( send_ret[i] > 0 )
2324 {
2325 TEST_ASSERT( recv_ret[i] > 0 );
2326 TEST_ASSERT( recv_ret[i] <= BUFLEN );
2327 read[i] += recv_ret[i];
2328 }
2329 else if( blocking )
2330 {
2331 TEST_ASSERT( recv_ret[i] == 0 );
2332 }
2333 else
2334 {
2335 TEST_ASSERT( recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ );
2336 recv_ret[i] = 0;
2337 }
2338
2339 /* If the buffer is empty we can test blocking and non-blocking
2340 * read */
2341 if ( recv_ret[i] == BUFLEN )
2342 {
2343 int blocking_ret = recv( socket, received[i], 1 );
2344 if ( blocking )
2345 {
2346 TEST_ASSERT( blocking_ret == 0 );
2347 }
2348 else
2349 {
2350 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
2351 }
2352 }
Janos Follath3766ba52019-11-27 13:31:42 +00002353 }
Janos Follath031827f2019-11-27 11:12:14 +00002354
2355 progress = 0;
2356 for( i = 0; i < ROUNDS; i++ )
2357 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002358 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002359 }
2360 }
2361
2362 for( i = 0; i < ROUNDS; i++ )
2363 TEST_ASSERT( memcmp( message[i], received[i], MSGLEN ) == 0 );
2364
2365exit:
2366
2367 mbedtls_mock_socket_close( &client );
2368 mbedtls_mock_socket_close( &server );
2369}
2370/* END_CASE */
2371
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002372/* BEGIN_CASE */
2373void ssl_message_queue_sanity( )
2374{
2375 mbedtls_test_message_queue queue;
2376
2377 /* Trying to push/pull to an empty queue */
2378 TEST_ASSERT( mbedtls_test_message_queue_push_info( NULL, 1 )
2379 == MBEDTLS_TEST_ERROR_ARG_NULL );
2380 TEST_ASSERT( mbedtls_test_message_queue_pop_info( NULL, 1 )
2381 == MBEDTLS_TEST_ERROR_ARG_NULL );
2382
2383 mbedtls_test_message_queue_setup( &queue, 3 );
2384 TEST_ASSERT( queue.capacity == 3 );
2385 TEST_ASSERT( queue.num == 0 );
2386
2387exit:
2388 mbedtls_test_message_queue_free( &queue );
2389}
2390/* END_CASE */
2391
2392/* BEGIN_CASE */
2393void ssl_message_queue_basic( )
2394{
2395 mbedtls_test_message_queue queue;
2396
2397 mbedtls_test_message_queue_setup( &queue, 3 );
2398
2399 /* Sanity test - 3 pushes and 3 pops with sufficient space */
2400 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2401 TEST_ASSERT( queue.capacity == 3 );
2402 TEST_ASSERT( queue.num == 1 );
2403 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2404 TEST_ASSERT( queue.capacity == 3 );
2405 TEST_ASSERT( queue.num == 2 );
2406 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2407 TEST_ASSERT( queue.capacity == 3 );
2408 TEST_ASSERT( queue.num == 3 );
2409
2410 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2411 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2412 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2413
2414exit:
2415 mbedtls_test_message_queue_free( &queue );
2416}
2417/* END_CASE */
2418
2419/* BEGIN_CASE */
2420void ssl_message_queue_overflow_underflow( )
2421{
2422 mbedtls_test_message_queue queue;
2423
2424 mbedtls_test_message_queue_setup( &queue, 3 );
2425
2426 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
2427 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2428 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2429 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2430 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002431 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002432
2433 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2434 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2435 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2436
2437 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002438 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002439
2440exit:
2441 mbedtls_test_message_queue_free( &queue );
2442}
2443/* END_CASE */
2444
2445/* BEGIN_CASE */
2446void ssl_message_queue_interleaved( )
2447{
2448 mbedtls_test_message_queue queue;
2449
2450 mbedtls_test_message_queue_setup( &queue, 3 );
2451
2452 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
2453 * (to wrap around the buffer) */
2454 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2455 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2456
2457 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2458
2459 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2460 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 ) == 3 );
2461
2462 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2463 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2464
2465 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 5 ) == 5 );
2466 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 8 ) == 8 );
2467
2468 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 3 ) == 3 );
2469
2470 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 5 ) == 5 );
2471
2472 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 8 ) == 8 );
2473
2474exit:
2475 mbedtls_test_message_queue_free( &queue );
2476}
2477/* END_CASE */
2478
2479/* BEGIN_CASE */
2480void ssl_message_queue_insufficient_buffer( )
2481{
2482 mbedtls_test_message_queue queue;
2483 size_t message_len = 10;
2484 size_t buffer_len = 5;
2485
2486 mbedtls_test_message_queue_setup( &queue, 1 );
2487
2488 /* Popping without a sufficient buffer */
2489 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, message_len )
2490 == (int) message_len );
2491 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, buffer_len )
2492 == (int) buffer_len );
2493exit:
2494 mbedtls_test_message_queue_free( &queue );
2495}
2496/* END_CASE */
2497
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002498/* BEGIN_CASE */
2499void ssl_message_mock_uninitialized( )
2500{
2501 enum { MSGLEN = 10 };
2502 unsigned char message[MSGLEN], received[MSGLEN];
2503 mbedtls_mock_socket client, server;
2504 mbedtls_test_message_queue server_queue, client_queue;
2505 mbedtls_test_message_socket_context server_context, client_context;
2506
2507 /* Send with a NULL context */
2508 TEST_ASSERT( mbedtls_mock_tcp_send_msg( NULL, message, MSGLEN )
2509 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
2510
2511 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( NULL, message, MSGLEN )
2512 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
2513
2514 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2515 &server,
2516 &server_context ) == 0 );
2517
2518 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2519 &client,
2520 &client_context ) == 0 );
2521
2522 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message, MSGLEN )
2523 == MBEDTLS_TEST_ERROR_SEND_FAILED );
2524
2525 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002526 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002527
2528 /* Push directly to a queue to later simulate a disconnected behavior */
2529 TEST_ASSERT( mbedtls_test_message_queue_push_info( &server_queue, MSGLEN )
2530 == MSGLEN );
2531
2532 /* Test if there's an error when trying to read from a disconnected
2533 * socket */
2534 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2535 == MBEDTLS_TEST_ERROR_RECV_FAILED );
2536 exit:
2537 mbedtls_message_socket_close( &server_context );
2538 mbedtls_message_socket_close( &client_context );
2539}
2540/* END_CASE */
2541
2542/* BEGIN_CASE */
2543void ssl_message_mock_basic( )
2544{
2545 enum { MSGLEN = 10 };
2546 unsigned char message[MSGLEN], received[MSGLEN];
2547 mbedtls_mock_socket client, server;
2548 unsigned i;
2549 mbedtls_test_message_queue server_queue, client_queue;
2550 mbedtls_test_message_socket_context server_context, client_context;
2551
2552 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2553 &server,
2554 &server_context ) == 0 );
2555
2556 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2557 &client,
2558 &client_context ) == 0 );
2559
2560 /* Fill up the buffer with structured data so that unwanted changes
2561 * can be detected */
2562 for( i = 0; i < MSGLEN; i++ )
2563 {
2564 message[i] = i & 0xFF;
2565 }
2566 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2567 MSGLEN ) );
2568
2569 /* Send the message to the server */
2570 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2571 MSGLEN ) == MSGLEN );
2572
2573 /* Read from the server */
2574 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2575 == MSGLEN );
2576
2577 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2578 memset( received, 0, MSGLEN );
2579
2580 /* Send the message to the client */
2581 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2582 MSGLEN ) == MSGLEN );
2583
2584 /* Read from the client */
2585 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
2586 == MSGLEN );
2587 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2588
2589 exit:
2590 mbedtls_message_socket_close( &server_context );
2591 mbedtls_message_socket_close( &client_context );
2592}
2593/* END_CASE */
2594
2595/* BEGIN_CASE */
2596void ssl_message_mock_queue_overflow_underflow( )
2597{
2598 enum { MSGLEN = 10 };
2599 unsigned char message[MSGLEN], received[MSGLEN];
2600 mbedtls_mock_socket client, server;
2601 unsigned i;
2602 mbedtls_test_message_queue server_queue, client_queue;
2603 mbedtls_test_message_socket_context server_context, client_context;
2604
2605 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2606 &server,
2607 &server_context ) == 0 );
2608
2609 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2610 &client,
2611 &client_context ) == 0 );
2612
2613 /* Fill up the buffer with structured data so that unwanted changes
2614 * can be detected */
2615 for( i = 0; i < MSGLEN; i++ )
2616 {
2617 message[i] = i & 0xFF;
2618 }
2619 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2620 MSGLEN*2 ) );
2621
2622 /* Send three message to the server, last one with an error */
2623 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2624 MSGLEN - 1 ) == MSGLEN - 1 );
2625
2626 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2627 MSGLEN ) == MSGLEN );
2628
2629 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2630 MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002631 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002632
2633 /* Read three messages from the server, last one with an error */
2634 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2635 MSGLEN - 1 ) == MSGLEN - 1 );
2636
2637 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2638 == MSGLEN );
2639
2640 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2641
2642 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002643 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002644
2645 exit:
2646 mbedtls_message_socket_close( &server_context );
2647 mbedtls_message_socket_close( &client_context );
2648}
2649/* END_CASE */
2650
2651/* BEGIN_CASE */
2652void ssl_message_mock_socket_overflow( )
2653{
2654 enum { MSGLEN = 10 };
2655 unsigned char message[MSGLEN], received[MSGLEN];
2656 mbedtls_mock_socket client, server;
2657 unsigned i;
2658 mbedtls_test_message_queue server_queue, client_queue;
2659 mbedtls_test_message_socket_context server_context, client_context;
2660
2661 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2662 &server,
2663 &server_context ) == 0 );
2664
2665 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2666 &client,
2667 &client_context ) == 0 );
2668
2669 /* Fill up the buffer with structured data so that unwanted changes
2670 * can be detected */
2671 for( i = 0; i < MSGLEN; i++ )
2672 {
2673 message[i] = i & 0xFF;
2674 }
2675 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2676 MSGLEN ) );
2677
2678 /* Send two message to the server, second one with an error */
2679 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2680 MSGLEN ) == MSGLEN );
2681
2682 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2683 MSGLEN )
2684 == MBEDTLS_TEST_ERROR_SEND_FAILED );
2685
2686 /* Read the only message from the server */
2687 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2688 == MSGLEN );
2689
2690 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2691
2692 exit:
2693 mbedtls_message_socket_close( &server_context );
2694 mbedtls_message_socket_close( &client_context );
2695}
2696/* END_CASE */
2697
2698/* BEGIN_CASE */
2699void ssl_message_mock_truncated( )
2700{
2701 enum { MSGLEN = 10 };
2702 unsigned char message[MSGLEN], received[MSGLEN];
2703 mbedtls_mock_socket client, server;
2704 unsigned i;
2705 mbedtls_test_message_queue server_queue, client_queue;
2706 mbedtls_test_message_socket_context server_context, client_context;
2707
2708 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2709 &server,
2710 &server_context ) == 0 );
2711
2712 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2713 &client,
2714 &client_context ) == 0 );
2715
2716 memset( received, 0, MSGLEN );
2717 /* Fill up the buffer with structured data so that unwanted changes
2718 * can be detected */
2719 for( i = 0; i < MSGLEN; i++ )
2720 {
2721 message[i] = i & 0xFF;
2722 }
2723 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2724 2 * MSGLEN ) );
2725
2726 /* Send two messages to the server, the second one small enough to fit in the
2727 * receiver's buffer. */
2728 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2729 MSGLEN ) == MSGLEN );
2730 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2731 MSGLEN / 2 ) == MSGLEN / 2 );
2732 /* Read a truncated message from the server */
2733 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2734 == MSGLEN/2 );
2735
2736 /* Test that the first half of the message is valid, and second one isn't */
2737 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2738 TEST_ASSERT( memcmp( message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2 )
2739 != 0 );
2740 memset( received, 0, MSGLEN );
2741
2742 /* Read a full message from the server */
2743 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2744 == MSGLEN / 2 );
2745
2746 /* Test that the first half of the message is valid */
2747 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2748
2749 exit:
2750 mbedtls_message_socket_close( &server_context );
2751 mbedtls_message_socket_close( &client_context );
2752}
2753/* END_CASE */
2754
2755/* BEGIN_CASE */
2756void ssl_message_mock_socket_read_error( )
2757{
2758 enum { MSGLEN = 10 };
2759 unsigned char message[MSGLEN], received[MSGLEN];
2760 mbedtls_mock_socket client, server;
2761 unsigned i;
2762 mbedtls_test_message_queue server_queue, client_queue;
2763 mbedtls_test_message_socket_context server_context, client_context;
2764
2765 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2766 &server,
2767 &server_context ) == 0 );
2768
2769 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2770 &client,
2771 &client_context ) == 0 );
2772
2773 /* Fill up the buffer with structured data so that unwanted changes
2774 * can be detected */
2775 for( i = 0; i < MSGLEN; i++ )
2776 {
2777 message[i] = i & 0xFF;
2778 }
2779 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2780 MSGLEN ) );
2781
2782 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2783 MSGLEN ) == MSGLEN );
2784
2785 /* Force a read error by disconnecting the socket by hand */
2786 server.status = 0;
2787 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2788 == MBEDTLS_TEST_ERROR_RECV_FAILED );
2789 /* Return to a valid state */
2790 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
2791
2792 memset( received, 0, sizeof( received ) );
2793
2794 /* Test that even though the server tried to read once disconnected, the
2795 * continuity is preserved */
2796 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2797 == MSGLEN );
2798
2799 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2800
2801 exit:
2802 mbedtls_message_socket_close( &server_context );
2803 mbedtls_message_socket_close( &client_context );
2804}
2805/* END_CASE */
2806
2807/* BEGIN_CASE */
2808void ssl_message_mock_interleaved_one_way( )
2809{
2810 enum { MSGLEN = 10 };
2811 unsigned char message[MSGLEN], received[MSGLEN];
2812 mbedtls_mock_socket client, server;
2813 unsigned i;
2814 mbedtls_test_message_queue server_queue, client_queue;
2815 mbedtls_test_message_socket_context server_context, client_context;
2816
2817 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2818 &server,
2819 &server_context ) == 0 );
2820
2821 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2822 &client,
2823 &client_context ) == 0 );
2824
2825 /* Fill up the buffer with structured data so that unwanted changes
2826 * can be detected */
2827 for( i = 0; i < MSGLEN; i++ )
2828 {
2829 message[i] = i & 0xFF;
2830 }
2831 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2832 MSGLEN*3 ) );
2833
2834 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
2835 * (to wrap around the buffer) */
2836 for( i = 0; i < 2; i++ )
2837 {
2838 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2839 MSGLEN ) == MSGLEN );
2840
2841 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2842 MSGLEN ) == MSGLEN );
2843
2844 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2845 MSGLEN ) == MSGLEN );
2846 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2847 memset( received, 0, sizeof( received ) );
2848 }
2849
2850 for( i = 0; i < 2; i++ )
2851 {
2852 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2853 MSGLEN ) == MSGLEN );
2854
2855 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2856 }
2857 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002858 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002859 exit:
2860 mbedtls_message_socket_close( &server_context );
2861 mbedtls_message_socket_close( &client_context );
2862}
2863/* END_CASE */
2864
2865/* BEGIN_CASE */
2866void ssl_message_mock_interleaved_two_ways( )
2867{
2868 enum { MSGLEN = 10 };
2869 unsigned char message[MSGLEN], received[MSGLEN];
2870 mbedtls_mock_socket client, server;
2871 unsigned i;
2872 mbedtls_test_message_queue server_queue, client_queue;
2873 mbedtls_test_message_socket_context server_context, client_context;
2874
2875 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2876 &server,
2877 &server_context ) == 0 );
2878
2879 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2880 &client,
2881 &client_context ) == 0 );
2882
2883 /* Fill up the buffer with structured data so that unwanted changes
2884 * can be detected */
2885 for( i = 0; i < MSGLEN; i++ )
2886 {
2887 message[i] = i & 0xFF;
2888 }
2889 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2890 MSGLEN*3 ) );
2891
2892 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
2893 * (to wrap around the buffer) both ways. */
2894 for( i = 0; i < 2; i++ )
2895 {
2896 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2897 MSGLEN ) == MSGLEN );
2898
2899 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2900 MSGLEN ) == MSGLEN );
2901
2902 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2903 MSGLEN ) == MSGLEN );
2904
2905 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2906 MSGLEN ) == MSGLEN );
2907
2908 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2909 MSGLEN ) == MSGLEN );
2910
2911 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2912
2913 memset( received, 0, sizeof( received ) );
2914
2915 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2916 MSGLEN ) == MSGLEN );
2917
2918 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2919
2920 memset( received, 0, sizeof( received ) );
2921 }
2922
2923 for( i = 0; i < 2; i++ )
2924 {
2925 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2926 MSGLEN ) == MSGLEN );
2927
2928 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2929 memset( received, 0, sizeof( received ) );
2930
2931 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2932 MSGLEN ) == MSGLEN );
2933
2934 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2935 memset( received, 0, sizeof( received ) );
2936 }
2937
2938 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002939 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002940
2941 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002942 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002943 exit:
2944 mbedtls_message_socket_close( &server_context );
2945 mbedtls_message_socket_close( &client_context );
2946}
2947/* END_CASE */
2948
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002949/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Azim Khan5fcca462018-06-29 11:05:32 +01002950void ssl_dtls_replay( data_t * prevs, data_t * new, int ret )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002951{
Azim Khand30ca132017-06-09 04:32:58 +01002952 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002953 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002954 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002955
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002956 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002957 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002958
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02002959 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
2960 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02002961 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2962 MBEDTLS_SSL_PRESET_DEFAULT ) == 0 );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002963 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002964
2965 /* Read previous record numbers */
Azim Khand30ca132017-06-09 04:32:58 +01002966 for( len = 0; len < prevs->len; len += 6 )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002967 {
Azim Khand30ca132017-06-09 04:32:58 +01002968 memcpy( ssl.in_ctr + 2, prevs->x + len, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002969 mbedtls_ssl_dtls_replay_update( &ssl );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002970 }
2971
2972 /* Check new number */
Azim Khand30ca132017-06-09 04:32:58 +01002973 memcpy( ssl.in_ctr + 2, new->x, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002974 TEST_ASSERT( mbedtls_ssl_dtls_replay_check( &ssl ) == ret );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002976 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002977 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002978}
2979/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002980
2981/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
2982void ssl_set_hostname_twice( char *hostname0, char *hostname1 )
2983{
2984 mbedtls_ssl_context ssl;
2985 mbedtls_ssl_init( &ssl );
2986
2987 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname0 ) == 0 );
2988 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname1 ) == 0 );
2989
2990 mbedtls_ssl_free( &ssl );
2991}
Darryl Green11999bb2018-03-13 15:22:58 +00002992/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00002993
2994/* BEGIN_CASE */
2995void ssl_crypt_record( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002996 int etm, int tag_mode, int ver,
2997 int cid0_len, int cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00002998{
2999 /*
3000 * Test several record encryptions and decryptions
3001 * with plenty of space before and after the data
3002 * within the record buffer.
3003 */
3004
3005 int ret;
3006 int num_records = 16;
3007 mbedtls_ssl_context ssl; /* ONLY for debugging */
3008
3009 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00003010 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00003011 size_t const buflen = 512;
3012 mbedtls_record rec, rec_backup;
3013
3014 mbedtls_ssl_init( &ssl );
3015 mbedtls_ssl_transform_init( &t0 );
3016 mbedtls_ssl_transform_init( &t1 );
3017 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01003018 etm, tag_mode, ver,
3019 (size_t) cid0_len,
3020 (size_t) cid1_len ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00003021
Hanno Becker3ee54212019-04-04 16:31:26 +01003022 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00003023
3024 while( num_records-- > 0 )
3025 {
3026 mbedtls_ssl_transform *t_dec, *t_enc;
3027 /* Take turns in who's sending and who's receiving. */
3028 if( num_records % 3 == 0 )
3029 {
3030 t_dec = &t0;
3031 t_enc = &t1;
3032 }
3033 else
3034 {
3035 t_dec = &t1;
3036 t_enc = &t0;
3037 }
3038
3039 /*
3040 * The record header affects the transformation in two ways:
3041 * 1) It determines the AEAD additional data
3042 * 2) The record counter sometimes determines the IV.
3043 *
3044 * Apart from that, the fields don't have influence.
3045 * In particular, it is currently not the responsibility
3046 * of ssl_encrypt/decrypt_buf to check if the transform
3047 * version matches the record version, or that the
3048 * type is sensible.
3049 */
3050
3051 memset( rec.ctr, num_records, sizeof( rec.ctr ) );
3052 rec.type = 42;
3053 rec.ver[0] = num_records;
3054 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003055#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003056 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003057#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00003058
3059 rec.buf = buf;
3060 rec.buf_len = buflen;
3061 rec.data_offset = 16;
3062 /* Make sure to vary the length to exercise different
3063 * paddings. */
3064 rec.data_len = 1 + num_records;
3065
3066 memset( rec.buf + rec.data_offset, 42, rec.data_len );
3067
3068 /* Make a copy for later comparison */
3069 rec_backup = rec;
3070
3071 /* Encrypt record */
3072 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec,
3073 rnd_std_rand, NULL );
3074 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3075 if( ret != 0 )
3076 {
3077 continue;
3078 }
3079
3080 /* Decrypt record with t_dec */
Hanno Beckerd856c822019-04-29 17:30:59 +01003081 ret = mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec );
3082 TEST_ASSERT( ret == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00003083
3084 /* Compare results */
3085 TEST_ASSERT( rec.type == rec_backup.type );
3086 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
3087 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
3088 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
3089 TEST_ASSERT( rec.data_len == rec_backup.data_len );
3090 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
3091 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
3092 rec_backup.buf + rec_backup.data_offset,
3093 rec.data_len ) == 0 );
3094 }
3095
Hanno Becker81e16a32019-03-01 11:21:44 +00003096exit:
3097
Hanno Beckera18d1322018-01-03 14:27:32 +00003098 /* Cleanup */
3099 mbedtls_ssl_free( &ssl );
3100 mbedtls_ssl_transform_free( &t0 );
3101 mbedtls_ssl_transform_free( &t1 );
3102
Hanno Becker3ee54212019-04-04 16:31:26 +01003103 mbedtls_free( buf );
Hanno Beckera18d1322018-01-03 14:27:32 +00003104}
3105/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003106
3107/* BEGIN_CASE */
3108void ssl_crypt_record_small( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01003109 int etm, int tag_mode, int ver,
3110 int cid0_len, int cid1_len )
Hanno Beckerb3268da2018-01-05 15:20:24 +00003111{
3112 /*
3113 * Test pairs of encryption and decryption with an increasing
3114 * amount of space in the record buffer - in more detail:
3115 * 1) Try to encrypt with 0, 1, 2, ... bytes available
3116 * in front of the plaintext, and expect the encryption
3117 * to succeed starting from some offset. Always keep
3118 * enough space in the end of the buffer.
3119 * 2) Try to encrypt with 0, 1, 2, ... bytes available
3120 * at the end of the plaintext, and expect the encryption
3121 * to succeed starting from some offset. Always keep
3122 * enough space at the beginning of the buffer.
3123 * 3) Try to encrypt with 0, 1, 2, ... bytes available
3124 * both at the front and end of the plaintext,
3125 * and expect the encryption to succeed starting from
3126 * some offset.
3127 *
3128 * If encryption succeeds, check that decryption succeeds
3129 * and yields the original record.
3130 */
3131
3132 mbedtls_ssl_context ssl; /* ONLY for debugging */
3133
3134 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00003135 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01003136 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003137 mbedtls_record rec, rec_backup;
3138
3139 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01003140 int mode; /* Mode 1, 2 or 3 as explained above */
3141 size_t offset; /* Available space at beginning/end/both */
3142 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003143
Hanno Beckerd856c822019-04-29 17:30:59 +01003144 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
3145 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003146
3147 int seen_success; /* Indicates if in the current mode we've
3148 * already seen a successful test. */
3149
3150 mbedtls_ssl_init( &ssl );
3151 mbedtls_ssl_transform_init( &t0 );
3152 mbedtls_ssl_transform_init( &t1 );
3153 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01003154 etm, tag_mode, ver,
3155 (size_t) cid0_len,
3156 (size_t) cid1_len ) == 0 );
Hanno Beckerb3268da2018-01-05 15:20:24 +00003157
Hanno Becker3ee54212019-04-04 16:31:26 +01003158 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckerb3268da2018-01-05 15:20:24 +00003159
3160 for( mode=1; mode <= 3; mode++ )
3161 {
3162 seen_success = 0;
3163 for( offset=0; offset <= threshold; offset++ )
3164 {
3165 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01003166 t_dec = &t0;
3167 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003168
3169 memset( rec.ctr, offset, sizeof( rec.ctr ) );
3170 rec.type = 42;
3171 rec.ver[0] = offset;
3172 rec.ver[1] = offset;
3173 rec.buf = buf;
3174 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003175#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003176 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003177#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003178
3179 switch( mode )
3180 {
3181 case 1: /* Space in the beginning */
3182 rec.data_offset = offset;
3183 rec.data_len = buflen - offset - default_post_padding;
3184 break;
3185
3186 case 2: /* Space in the end */
3187 rec.data_offset = default_pre_padding;
3188 rec.data_len = buflen - default_pre_padding - offset;
3189 break;
3190
3191 case 3: /* Space in the beginning and end */
3192 rec.data_offset = offset;
3193 rec.data_len = buflen - 2 * offset;
3194 break;
3195
3196 default:
3197 TEST_ASSERT( 0 );
3198 break;
3199 }
3200
3201 memset( rec.buf + rec.data_offset, 42, rec.data_len );
3202
3203 /* Make a copy for later comparison */
3204 rec_backup = rec;
3205
3206 /* Encrypt record */
3207 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec, rnd_std_rand, NULL );
3208
3209 if( ( mode == 1 || mode == 2 ) && seen_success )
3210 {
3211 TEST_ASSERT( ret == 0 );
3212 }
3213 else
3214 {
3215 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3216 if( ret == 0 )
3217 seen_success = 1;
3218 }
3219
3220 if( ret != 0 )
3221 continue;
3222
3223 /* Decrypt record with t_dec */
3224 TEST_ASSERT( mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec ) == 0 );
3225
3226 /* Compare results */
3227 TEST_ASSERT( rec.type == rec_backup.type );
3228 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
3229 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
3230 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
3231 TEST_ASSERT( rec.data_len == rec_backup.data_len );
3232 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
3233 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
3234 rec_backup.buf + rec_backup.data_offset,
3235 rec.data_len ) == 0 );
3236 }
3237
3238 TEST_ASSERT( seen_success == 1 );
3239 }
3240
Hanno Becker81e16a32019-03-01 11:21:44 +00003241exit:
3242
Hanno Beckerb3268da2018-01-05 15:20:24 +00003243 /* Cleanup */
3244 mbedtls_ssl_free( &ssl );
3245 mbedtls_ssl_transform_free( &t0 );
3246 mbedtls_ssl_transform_free( &t1 );
3247
Hanno Becker3ee54212019-04-04 16:31:26 +01003248 mbedtls_free( buf );
Hanno Beckerb3268da2018-01-05 15:20:24 +00003249}
3250/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03003251
3252/* BEGIN_CASE */
3253void ssl_tls_prf( int type, data_t * secret, data_t * random,
3254 char *label, data_t *result_hex_str, int exp_ret )
3255{
3256 unsigned char *output;
3257
3258 output = mbedtls_calloc( 1, result_hex_str->len );
3259 if( output == NULL )
3260 goto exit;
3261
Ron Eldor6b9b1b82019-05-15 17:04:33 +03003262#if defined(MBEDTLS_USE_PSA_CRYPTO)
3263 TEST_ASSERT( psa_crypto_init() == 0 );
3264#endif
3265
Ron Eldor824ad7b2019-05-13 14:09:00 +03003266 TEST_ASSERT( mbedtls_ssl_tls_prf( type, secret->x, secret->len,
3267 label, random->x, random->len,
3268 output, result_hex_str->len ) == exp_ret );
3269
3270 if( exp_ret == 0 )
3271 {
3272 TEST_ASSERT( hexcmp( output, result_hex_str->x,
3273 result_hex_str->len, result_hex_str->len ) == 0 );
3274 }
3275exit:
3276
3277 mbedtls_free( output );
3278}
3279/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003280
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003281/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003282void ssl_serialize_session_save_load( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003283{
3284 mbedtls_ssl_session original, restored;
3285 unsigned char *buf = NULL;
3286 size_t len;
3287
3288 /*
3289 * Test that a save-load pair is the identity
3290 */
3291
3292 mbedtls_ssl_session_init( &original );
3293 mbedtls_ssl_session_init( &restored );
3294
3295 /* Prepare a dummy session to work on */
3296 TEST_ASSERT( ssl_populate_session( &original, ticket_len, crt_file ) == 0 );
3297
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003298 /* Serialize it */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003299 TEST_ASSERT( mbedtls_ssl_session_save( &original, NULL, 0, &len )
3300 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3301 TEST_ASSERT( ( buf = mbedtls_calloc( 1, len ) ) != NULL );
3302 TEST_ASSERT( mbedtls_ssl_session_save( &original, buf, len, &len )
3303 == 0 );
3304
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003305 /* Restore session from serialized data */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003306 TEST_ASSERT( mbedtls_ssl_session_load( &restored, buf, len) == 0 );
3307
3308 /*
3309 * Make sure both session structures are identical
3310 */
3311#if defined(MBEDTLS_HAVE_TIME)
3312 TEST_ASSERT( original.start == restored.start );
3313#endif
3314 TEST_ASSERT( original.ciphersuite == restored.ciphersuite );
3315 TEST_ASSERT( original.compression == restored.compression );
3316 TEST_ASSERT( original.id_len == restored.id_len );
3317 TEST_ASSERT( memcmp( original.id,
3318 restored.id, sizeof( original.id ) ) == 0 );
3319 TEST_ASSERT( memcmp( original.master,
3320 restored.master, sizeof( original.master ) ) == 0 );
3321
3322#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02003323#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003324 TEST_ASSERT( ( original.peer_cert == NULL ) ==
3325 ( restored.peer_cert == NULL ) );
3326 if( original.peer_cert != NULL )
3327 {
3328 TEST_ASSERT( original.peer_cert->raw.len ==
3329 restored.peer_cert->raw.len );
3330 TEST_ASSERT( memcmp( original.peer_cert->raw.p,
3331 restored.peer_cert->raw.p,
3332 original.peer_cert->raw.len ) == 0 );
3333 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02003334#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3335 TEST_ASSERT( original.peer_cert_digest_type ==
3336 restored.peer_cert_digest_type );
3337 TEST_ASSERT( original.peer_cert_digest_len ==
3338 restored.peer_cert_digest_len );
3339 TEST_ASSERT( ( original.peer_cert_digest == NULL ) ==
3340 ( restored.peer_cert_digest == NULL ) );
3341 if( original.peer_cert_digest != NULL )
3342 {
3343 TEST_ASSERT( memcmp( original.peer_cert_digest,
3344 restored.peer_cert_digest,
3345 original.peer_cert_digest_len ) == 0 );
3346 }
3347#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3348#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003349 TEST_ASSERT( original.verify_result == restored.verify_result );
3350
3351#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
3352 TEST_ASSERT( original.ticket_len == restored.ticket_len );
3353 if( original.ticket_len != 0 )
3354 {
3355 TEST_ASSERT( original.ticket != NULL );
3356 TEST_ASSERT( restored.ticket != NULL );
3357 TEST_ASSERT( memcmp( original.ticket,
3358 restored.ticket, original.ticket_len ) == 0 );
3359 }
3360 TEST_ASSERT( original.ticket_lifetime == restored.ticket_lifetime );
3361#endif
3362
3363#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3364 TEST_ASSERT( original.mfl_code == restored.mfl_code );
3365#endif
3366
3367#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
3368 TEST_ASSERT( original.trunc_hmac == restored.trunc_hmac );
3369#endif
3370
3371#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
3372 TEST_ASSERT( original.encrypt_then_mac == restored.encrypt_then_mac );
3373#endif
3374
3375exit:
3376 mbedtls_ssl_session_free( &original );
3377 mbedtls_ssl_session_free( &restored );
3378 mbedtls_free( buf );
3379}
3380/* END_CASE */
3381
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02003382/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003383void ssl_serialize_session_load_save( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003384{
3385 mbedtls_ssl_session session;
3386 unsigned char *buf1 = NULL, *buf2 = NULL;
3387 size_t len0, len1, len2;
3388
3389 /*
3390 * Test that a load-save pair is the identity
3391 */
3392
3393 mbedtls_ssl_session_init( &session );
3394
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02003395 /* Prepare a dummy session to work on */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02003396 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02003397
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003398 /* Get desired buffer size for serializing */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003399 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &len0 )
3400 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3401
3402 /* Allocate first buffer */
3403 buf1 = mbedtls_calloc( 1, len0 );
3404 TEST_ASSERT( buf1 != NULL );
3405
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003406 /* Serialize to buffer and free live session */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003407 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf1, len0, &len1 )
3408 == 0 );
3409 TEST_ASSERT( len0 == len1 );
3410 mbedtls_ssl_session_free( &session );
3411
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003412 /* Restore session from serialized data */
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02003413 TEST_ASSERT( mbedtls_ssl_session_load( &session, buf1, len1 ) == 0 );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003414
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003415 /* Allocate second buffer and serialize to it */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003416 buf2 = mbedtls_calloc( 1, len0 );
Manuel Pégourié-Gonnardb4079902019-05-24 09:52:10 +02003417 TEST_ASSERT( buf2 != NULL );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003418 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf2, len0, &len2 )
3419 == 0 );
3420
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003421 /* Make sure both serialized versions are identical */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003422 TEST_ASSERT( len1 == len2 );
3423 TEST_ASSERT( memcmp( buf1, buf2, len1 ) == 0 );
3424
3425exit:
3426 mbedtls_ssl_session_free( &session );
3427 mbedtls_free( buf1 );
3428 mbedtls_free( buf2 );
3429}
3430/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003431
3432/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003433void ssl_serialize_session_save_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003434{
3435 mbedtls_ssl_session session;
3436 unsigned char *buf = NULL;
3437 size_t good_len, bad_len, test_len;
3438
3439 /*
3440 * Test that session_save() fails cleanly on small buffers
3441 */
3442
3443 mbedtls_ssl_session_init( &session );
3444
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003445 /* Prepare dummy session and get serialized size */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02003446 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003447 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
3448 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3449
3450 /* Try all possible bad lengths */
3451 for( bad_len = 1; bad_len < good_len; bad_len++ )
3452 {
3453 /* Allocate exact size so that asan/valgrind can detect any overwrite */
3454 mbedtls_free( buf );
3455 TEST_ASSERT( ( buf = mbedtls_calloc( 1, bad_len ) ) != NULL );
3456 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf, bad_len,
3457 &test_len )
3458 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3459 TEST_ASSERT( test_len == good_len );
3460 }
3461
3462exit:
3463 mbedtls_ssl_session_free( &session );
3464 mbedtls_free( buf );
3465}
3466/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003467
3468/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003469void ssl_serialize_session_load_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003470{
3471 mbedtls_ssl_session session;
3472 unsigned char *good_buf = NULL, *bad_buf = NULL;
3473 size_t good_len, bad_len;
3474
3475 /*
3476 * Test that session_load() fails cleanly on small buffers
3477 */
3478
3479 mbedtls_ssl_session_init( &session );
3480
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003481 /* Prepare serialized session data */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02003482 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003483 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
3484 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3485 TEST_ASSERT( ( good_buf = mbedtls_calloc( 1, good_len ) ) != NULL );
3486 TEST_ASSERT( mbedtls_ssl_session_save( &session, good_buf, good_len,
3487 &good_len ) == 0 );
3488 mbedtls_ssl_session_free( &session );
3489
3490 /* Try all possible bad lengths */
3491 for( bad_len = 0; bad_len < good_len; bad_len++ )
3492 {
3493 /* Allocate exact size so that asan/valgrind can detect any overread */
3494 mbedtls_free( bad_buf );
3495 bad_buf = mbedtls_calloc( 1, bad_len ? bad_len : 1 );
3496 TEST_ASSERT( bad_buf != NULL );
3497 memcpy( bad_buf, good_buf, bad_len );
3498
3499 TEST_ASSERT( mbedtls_ssl_session_load( &session, bad_buf, bad_len )
3500 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3501 }
3502
3503exit:
3504 mbedtls_ssl_session_free( &session );
3505 mbedtls_free( good_buf );
3506 mbedtls_free( bad_buf );
3507}
3508/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01003509
Hanno Becker363b6462019-05-29 12:44:28 +01003510/* BEGIN_CASE */
3511void ssl_session_serialize_version_check( int corrupt_major,
Hanno Becker861d0bb2019-05-21 16:39:30 +01003512 int corrupt_minor,
3513 int corrupt_patch,
3514 int corrupt_config )
3515{
Hanno Becker363b6462019-05-29 12:44:28 +01003516 unsigned char serialized_session[ 2048 ];
3517 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003518 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01003519 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003520 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
3521 corrupt_minor == 1,
3522 corrupt_patch == 1,
3523 corrupt_config == 1,
3524 corrupt_config == 1 };
3525
Hanno Becker861d0bb2019-05-21 16:39:30 +01003526 mbedtls_ssl_session_init( &session );
3527
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003528 /* Infer length of serialized session. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01003529 TEST_ASSERT( mbedtls_ssl_session_save( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01003530 serialized_session,
3531 sizeof( serialized_session ),
3532 &serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01003533
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003534 mbedtls_ssl_session_free( &session );
Hanno Becker861d0bb2019-05-21 16:39:30 +01003535
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003536 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01003537 * de-serialize the session - double-check that. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01003538 TEST_ASSERT( mbedtls_ssl_session_load( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01003539 serialized_session,
3540 serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01003541 mbedtls_ssl_session_free( &session );
3542
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003543 /* Go through the bytes in the serialized session header and
3544 * corrupt them bit-by-bit. */
3545 for( cur_byte = 0; cur_byte < sizeof( should_corrupt_byte ); cur_byte++ )
Hanno Becker861d0bb2019-05-21 16:39:30 +01003546 {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003547 int cur_bit;
3548 unsigned char * const byte = &serialized_session[ cur_byte ];
3549
3550 if( should_corrupt_byte[ cur_byte ] == 0 )
3551 continue;
3552
3553 for( cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++ )
3554 {
3555 unsigned char const corrupted_bit = 0x1u << cur_bit;
3556 /* Modify a single bit in the serialized session. */
3557 *byte ^= corrupted_bit;
3558
3559 /* Attempt to deserialize */
3560 TEST_ASSERT( mbedtls_ssl_session_load( &session,
3561 serialized_session,
3562 serialized_session_len ) ==
Hanno Beckerf9b33032019-06-03 12:58:39 +01003563 MBEDTLS_ERR_SSL_VERSION_MISMATCH );
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003564
3565 /* Undo the change */
3566 *byte ^= corrupted_bit;
3567 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01003568 }
3569
Hanno Becker861d0bb2019-05-21 16:39:30 +01003570}
3571/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003572
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01003573/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15 */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003574void mbedtls_endpoint_sanity( int endpoint_type )
3575{
3576 enum { BUFFSIZE = 1024 };
3577 mbedtls_endpoint ep;
3578 int ret = -1;
3579
Andrzej Kurek15daf502020-02-12 09:17:52 -05003580 ret = mbedtls_endpoint_init( NULL, endpoint_type, MBEDTLS_PK_RSA,
3581 NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003582 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
3583
Andrzej Kurekb2980742020-02-02 19:25:26 -05003584 ret = mbedtls_endpoint_certificate_init( NULL, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003585 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
3586
Andrzej Kurek15daf502020-02-12 09:17:52 -05003587 ret = mbedtls_endpoint_init( &ep, endpoint_type, MBEDTLS_PK_RSA,
3588 NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003589 TEST_ASSERT( ret == 0 );
3590
3591exit:
Andrzej Kurek15daf502020-02-12 09:17:52 -05003592 mbedtls_endpoint_free( &ep, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003593}
3594/* END_CASE */
3595
Andrzej Kurekb2980742020-02-02 19:25:26 -05003596/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15 */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003597void move_handshake_to_state(int endpoint_type, int state, int need_pass)
3598{
3599 enum { BUFFSIZE = 1024 };
3600 mbedtls_endpoint base_ep, second_ep;
3601 int ret = -1;
3602
Andrzej Kurek15daf502020-02-12 09:17:52 -05003603 ret = mbedtls_endpoint_init( &base_ep, endpoint_type, MBEDTLS_PK_RSA,
3604 NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003605 TEST_ASSERT( ret == 0 );
3606
3607 ret = mbedtls_endpoint_init( &second_ep,
3608 ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ?
Andrzej Kurekb2980742020-02-02 19:25:26 -05003609 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
Andrzej Kurek15daf502020-02-12 09:17:52 -05003610 MBEDTLS_PK_RSA, NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003611 TEST_ASSERT( ret == 0 );
3612
3613 ret = mbedtls_mock_socket_connect( &(base_ep.socket),
3614 &(second_ep.socket),
3615 BUFFSIZE );
3616 TEST_ASSERT( ret == 0 );
3617
3618 ret = mbedtls_move_handshake_to_state( &(base_ep.ssl),
3619 &(second_ep.ssl),
3620 state );
3621 if( need_pass )
3622 {
3623 TEST_ASSERT( ret == 0 );
3624 TEST_ASSERT( base_ep.ssl.state == state );
3625 }
3626 else
3627 {
3628 TEST_ASSERT( ret != 0 );
3629 TEST_ASSERT( base_ep.ssl.state != state );
3630 }
3631
3632exit:
Andrzej Kurek15daf502020-02-12 09:17:52 -05003633 mbedtls_endpoint_free( &base_ep, NULL );
3634 mbedtls_endpoint_free( &second_ep, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003635}
3636/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003637
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003638/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED */
3639void handshake_version( int version, int dtls )
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003640{
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003641 handshake_test_options options;
3642 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003643
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003644 options.version = version;
3645 options.dtls = dtls;
3646 /* Note - the case below will have to updated, since the test sends no data
3647 * due to a 1n-1 split against BEAST, that was not expected when preparing
3648 * the fragment counting code. */
3649 if( version == MBEDTLS_SSL_MINOR_VERSION_0 ||
3650 version == MBEDTLS_SSL_MINOR_VERSION_1 )
Andrzej Kurek941962e2020-02-07 09:20:32 -05003651 {
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003652 options.cli_msg_len = 0;
3653 options.srv_msg_len = 0;
Andrzej Kurek941962e2020-02-07 09:20:32 -05003654 }
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003655 perform_handshake( &options );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003656
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003657 /* The goto below is used to avoid an "unused label" warning.*/
3658 goto exit;
3659}
3660/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05003661
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003662/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2 */
3663void handshake_psk_cipher( char* cipher, int pk_alg, data_t *psk_str, int dtls )
3664{
3665 handshake_test_options options;
3666 init_handshake_options( &options );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003667
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003668 options.cipher = cipher;
3669 options.dtls = dtls;
3670 options.psk_str = psk_str;
3671 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003672
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003673 perform_handshake( &options );
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003674
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003675 /* The goto below is used to avoid an "unused label" warning.*/
3676 goto exit;
3677}
3678/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003679
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003680/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2 */
3681void handshake_cipher( char* cipher, int pk_alg, int dtls )
3682{
3683 test_handshake_psk_cipher( cipher, pk_alg, NULL, dtls );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003684
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003685 /* The goto below is used to avoid an "unused label" warning.*/
3686 goto exit;
3687}
3688/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003689
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003690/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED */
3691void app_data( int mfl, int cli_msg_len, int srv_msg_len,
3692 int expected_cli_fragments,
3693 int expected_srv_fragments, int dtls )
3694{
3695 handshake_test_options options;
3696 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003697
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003698 options.mfl = mfl;
3699 options.cli_msg_len = cli_msg_len;
3700 options.srv_msg_len = srv_msg_len;
3701 options.expected_cli_fragments = expected_cli_fragments;
3702 options.expected_srv_fragments = expected_srv_fragments;
3703 options.dtls = dtls;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003704
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003705 perform_handshake( &options );
3706 /* The goto below is used to avoid an "unused label" warning.*/
3707 goto exit;
3708}
3709/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003710
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003711/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED */
3712void app_data_tls( int mfl, int cli_msg_len, int srv_msg_len,
3713 int expected_cli_fragments,
3714 int expected_srv_fragments )
3715{
3716 test_app_data( mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
3717 expected_srv_fragments, 0 );
3718 /* The goto below is used to avoid an "unused label" warning.*/
3719 goto exit;
3720}
3721/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003722
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003723/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS */
3724void app_data_dtls( int mfl, int cli_msg_len, int srv_msg_len,
3725 int expected_cli_fragments,
3726 int expected_srv_fragments )
3727{
3728 test_app_data( mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
3729 expected_srv_fragments, 1 );
3730 /* The goto below is used to avoid an "unused label" warning.*/
3731 goto exit;
3732}
3733/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003734
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003735/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO: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 */
3736void handshake_serialization( )
3737{
3738 handshake_test_options options;
3739 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003740
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003741 options.serialize = 1;
3742 options.dtls = 1;
3743 perform_handshake( &options );
3744 /* The goto below is used to avoid an "unused label" warning.*/
3745 goto exit;
3746}
3747/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003748
Darryl Greenaad82f92019-12-02 10:53:11 +00003749/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC */
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003750void handshake_fragmentation( int mfl, int expected_srv_hs_fragmentation, int expected_cli_hs_fragmentation)
3751{
3752 handshake_test_options options;
3753 log_pattern srv_pattern, cli_pattern;
3754
3755 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
3756 srv_pattern.counter = 0;
3757 cli_pattern.counter = 0;
3758
3759 init_handshake_options( &options );
3760 options.dtls = 1;
3761 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00003762 /* Set cipher to one using CBC so that record splitting can be tested */
3763 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003764 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
3765 options.srv_log_obj = &srv_pattern;
3766 options.cli_log_obj = &cli_pattern;
3767 options.srv_log_fun = log_analyzer;
3768 options.cli_log_fun = log_analyzer;
3769
3770 perform_handshake( &options );
3771
3772 /* Test if the server received a fragmented handshake */
3773 if( expected_srv_hs_fragmentation )
3774 {
3775 TEST_ASSERT( srv_pattern.counter >= 1 );
3776 }
3777 /* Test if the client received a fragmented handshake */
3778 if( expected_cli_hs_fragmentation )
3779 {
3780 TEST_ASSERT( cli_pattern.counter >= 1 );
3781 }
3782}
3783/* END_CASE */
3784
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003785/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION */
3786void renegotiation( int legacy_renegotiation )
3787{
3788 handshake_test_options options;
3789 init_handshake_options( &options );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003790
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003791 options.renegotiate = 1;
3792 options.legacy_renegotiation = legacy_renegotiation;
3793 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003794
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05003795 perform_handshake( &options );
3796 /* The goto below is used to avoid an "unused label" warning.*/
3797 goto exit;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003798}
3799/* END_CASE */