blob: dc34eced3a0fe8ec17cfeb7334af4ab82ebcd42f [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>
Janos Follath6264e662019-11-26 11:11:15 +00007
8/*
9 * Buffer structure for custom I/O callbacks.
10 */
11
12typedef struct mbedtls_test_buffer
13{
14 size_t start;
15 size_t content_length;
16 size_t capacity;
17 unsigned char *buffer;
18} mbedtls_test_buffer;
19
20/*
21 * Initialises \p buf. After calling this function it is safe to call
22 * `mbedtls_test_buffer_free()` on \p buf.
23 */
24void mbedtls_test_buffer_init( mbedtls_test_buffer *buf )
25{
26 memset( buf, 0, sizeof( *buf ) );
27}
28
29/*
30 * Sets up \p buf. After calling this function it is safe to call
31 * `mbedtls_test_buffer_put()` and `mbedtls_test_buffer_get()` on \p buf.
32 */
33int mbedtls_test_buffer_setup( mbedtls_test_buffer *buf, size_t capacity )
34{
35 buf->buffer = (unsigned char*) mbedtls_calloc( capacity,
36 sizeof(unsigned char) );
37 if( NULL == buf->buffer )
38 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
39 buf->capacity = capacity;
40
41 return 0;
42}
43
44void mbedtls_test_buffer_free( mbedtls_test_buffer *buf )
45{
46 if( buf->buffer != NULL )
47 mbedtls_free( buf->buffer );
48
49 memset( buf, 0, sizeof( *buf ) );
50}
51
52/*
53 * Puts \p input_len bytes from the \p input buffer into the ring buffer \p buf.
54 *
55 * \p buf must have been initialized and set up by calling
56 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
57 *
58 * \retval \p input_len, if the data fits.
59 * \retval 0 <= value < \p input_len, if the data does not fit.
60 * \retval -1, if \p buf is NULL, it hasn't been set up or \p input_len is not
61 * zero and \p input is NULL.
62 */
63int mbedtls_test_buffer_put( mbedtls_test_buffer *buf,
Piotr Nowicki2a1f1782020-01-13 09:42:10 +010064 const unsigned char *input, size_t input_len )
Janos Follath6264e662019-11-26 11:11:15 +000065{
66 size_t overflow = 0;
67
68 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
69 return -1;
70
71 /* Reduce input_len to a number that fits in the buffer. */
72 if ( ( buf->content_length + input_len ) > buf->capacity )
73 {
74 input_len = buf->capacity - buf->content_length;
75 }
76
77 if( input == NULL )
78 {
79 return ( input_len == 0 ) ? 0 : -1;
80 }
81
Piotr Nowickifb437d72020-01-13 16:59:12 +010082 /* Check if the buffer has not come full circle and free space is not in
83 * the middle */
84 if( buf->start + buf->content_length < buf->capacity )
Janos Follath6264e662019-11-26 11:11:15 +000085 {
Piotr Nowickifb437d72020-01-13 16:59:12 +010086
87 /* Calculate the number of bytes that need to be placed at lower memory
88 * address */
89 if( buf->start + buf->content_length + input_len
90 > buf->capacity )
91 {
92 overflow = ( buf->start + buf->content_length + input_len )
93 % buf->capacity;
94 }
95
96 memcpy( buf->buffer + buf->start + buf->content_length, input,
97 input_len - overflow );
98 memcpy( buf->buffer, input + input_len - overflow, overflow );
99
100 }
101 else
102 {
103 /* The buffer has come full circle and free space is in the middle */
104 memcpy( buf->buffer + buf->start + buf->content_length - buf->capacity,
105 input, input_len );
Janos Follath6264e662019-11-26 11:11:15 +0000106 }
107
Janos Follath6264e662019-11-26 11:11:15 +0000108 buf->content_length += input_len;
Janos Follath6264e662019-11-26 11:11:15 +0000109 return input_len;
110}
111
112/*
Andrzej Kurekf7774142020-01-22 06:34:59 -0500113 * Gets \p output_len bytes from the ring buffer \p buf into the
114 * \p output buffer. The output buffer can be NULL, in this case a part of the
115 * ring buffer will be dropped, if the requested length is available.
Janos Follath6264e662019-11-26 11:11:15 +0000116 *
117 * \p buf must have been initialized and set up by calling
118 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
119 *
120 * \retval \p output_len, if the data is available.
121 * \retval 0 <= value < \p output_len, if the data is not available.
Andrzej Kurekf7774142020-01-22 06:34:59 -0500122 * \retval -1, if \buf is NULL or it hasn't been set up.
Janos Follath6264e662019-11-26 11:11:15 +0000123 */
124int mbedtls_test_buffer_get( mbedtls_test_buffer *buf,
125 unsigned char* output, size_t output_len )
126{
127 size_t overflow = 0;
128
129 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
130 return -1;
131
Andrzej Kurekf7774142020-01-22 06:34:59 -0500132 if( output == NULL && output_len == 0 )
133 return 0;
Janos Follath6264e662019-11-26 11:11:15 +0000134
135 if( buf->content_length < output_len )
136 output_len = buf->content_length;
137
138 /* Calculate the number of bytes that need to be drawn from lower memory
139 * address */
140 if( buf->start + output_len > buf->capacity )
141 {
142 overflow = ( buf->start + output_len ) % buf->capacity;
143 }
144
Andrzej Kurekf7774142020-01-22 06:34:59 -0500145 if( output != NULL )
146 {
147 memcpy( output, buf->buffer + buf->start, output_len - overflow );
148 memcpy( output + output_len - overflow, buf->buffer, overflow );
149 }
150
Janos Follath6264e662019-11-26 11:11:15 +0000151 buf->content_length -= output_len;
152 buf->start = ( buf->start + output_len ) % buf->capacity;
153
154 return output_len;
155}
156
Hanno Beckera18d1322018-01-03 14:27:32 +0000157/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500158 * Errors used in the message transport mock tests
159 */
160 #define MBEDTLS_TEST_ERROR_ARG_NULL -11
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500161 #define MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED -44
162
163/*
164 * Context for a message metadata queue (fifo) that is on top of the ring buffer.
165 */
166typedef struct mbedtls_test_message_queue
167{
168 size_t *messages;
169 int pos;
170 int num;
171 int capacity;
172} mbedtls_test_message_queue;
173
174/*
175 * Setup and free functions for the message metadata queue.
176 *
177 * \p capacity describes the number of message metadata chunks that can be held
178 * within the queue.
179 *
180 * \retval 0, if a metadata queue of a given length can be allocated.
181 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation failed.
182 */
183int mbedtls_test_message_queue_setup( mbedtls_test_message_queue *queue,
184 size_t capacity )
185{
186 queue->messages = (size_t*) mbedtls_calloc( capacity, sizeof(size_t) );
187 if( NULL == queue->messages )
188 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
189
190 queue->capacity = capacity;
191 queue->pos = 0;
192 queue->num = 0;
193
194 return 0;
195}
196
197void mbedtls_test_message_queue_free( mbedtls_test_message_queue *queue )
198{
199 if( queue == NULL )
200 return;
201
202 if( queue->messages != NULL )
203 mbedtls_free( queue->messages );
204
205 memset( queue, 0, sizeof( *queue ) );
206}
207
208/*
209 * Push message length information onto the message metadata queue.
210 * This will become the last element to leave it (fifo).
211 *
212 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500213 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the queue is full.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500214 * \retval \p len, if the push was successful.
215 */
216int mbedtls_test_message_queue_push_info( mbedtls_test_message_queue *queue,
217 size_t len )
218{
219 int place;
220 if( queue == NULL )
221 return MBEDTLS_TEST_ERROR_ARG_NULL;
222
223 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500224 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500225
226 place = ( queue->pos + queue->num ) % queue->capacity;
227 queue->messages[place] = len;
228 queue->num++;
229 return len;
230}
231
232/*
233 * Pop information about the next message length from the queue. This will be
234 * the oldest inserted message length(fifo). \p msg_len can be null, in which
235 * case the data will be popped from the queue but not copied anywhere.
236 *
237 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500238 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500239 * \retval message length, if the pop was successful, up to the given
240 \p buf_len.
241 */
242int mbedtls_test_message_queue_pop_info( mbedtls_test_message_queue *queue,
243 size_t buf_len )
244{
245 size_t message_length;
246 if( queue == NULL )
247 return MBEDTLS_TEST_ERROR_ARG_NULL;
248 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500249 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500250
251 message_length = queue->messages[queue->pos];
252 queue->messages[queue->pos] = 0;
253 queue->num--;
254 queue->pos++;
255 queue->pos %= queue->capacity;
256 if( queue->pos < 0 )
257 queue->pos += queue->capacity;
258
259 return ( message_length > buf_len ) ? buf_len : message_length;
260}
261
262/*
263 * Take a peek on the info about the next message length from the queue.
264 * This will be the oldest inserted message length(fifo).
265 *
266 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500267 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500268 * \retval 0, if the peek was successful.
269 * \retval MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
270 * too small to fit the message. In this case the \p msg_len will be
271 * set to the full message length so that the
272 * caller knows what portion of the message can be dropped.
273 */
274int mbedtls_test_message_queue_peek_info( mbedtls_test_message_queue *queue,
275 size_t buf_len, size_t* msg_len )
276{
277 if( queue == NULL || msg_len == NULL )
278 return MBEDTLS_TEST_ERROR_ARG_NULL;
279 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500280 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500281
282 *msg_len = queue->messages[queue->pos];
283 return ( *msg_len > buf_len ) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
284}
285/*
Janos Follath031827f2019-11-27 11:12:14 +0000286 * Context for the I/O callbacks simulating network connection.
287 */
288
289#define MBEDTLS_MOCK_SOCKET_CONNECTED 1
290
291typedef struct mbedtls_mock_socket
292{
293 int status;
294 mbedtls_test_buffer *input;
295 mbedtls_test_buffer *output;
296 struct mbedtls_mock_socket *peer;
297} mbedtls_mock_socket;
298
299/*
300 * Setup and teardown functions for mock sockets.
301 */
302void mbedtls_mock_socket_init( mbedtls_mock_socket *socket )
303{
304 memset( socket, 0, sizeof( *socket ) );
305}
306
307/*
308 * Closes the socket \p socket.
309 *
310 * \p socket must have been previously initialized by calling
311 * mbedtls_mock_socket_init().
312 *
313 * This function frees all allocated resources and both sockets are aware of the
314 * new connection state.
315 *
316 * That is, this function does not simulate half-open TCP connections and the
317 * phenomenon that when closing a UDP connection the peer is not aware of the
318 * connection having been closed.
319 */
320void mbedtls_mock_socket_close( mbedtls_mock_socket* socket )
321{
322 if( socket == NULL )
323 return;
324
325 if( socket->input != NULL )
326 {
327 mbedtls_test_buffer_free( socket->input );
328 mbedtls_free( socket->input );
329 }
330
331 if( socket->output != NULL )
332 {
333 mbedtls_test_buffer_free( socket->output );
334 mbedtls_free( socket->output );
335 }
336
337 if( socket->peer != NULL )
338 memset( socket->peer, 0, sizeof( *socket->peer ) );
339
340 memset( socket, 0, sizeof( *socket ) );
341}
342
343/*
344 * Establishes a connection between \p peer1 and \p peer2.
345 *
346 * \p peer1 and \p peer2 must have been previously initialized by calling
347 * mbedtls_mock_socket_init().
348 *
349 * The capacites of the internal buffers are set to \p bufsize. Setting this to
350 * the correct value allows for simulation of MTU, sanity testing the mock
351 * implementation and mocking TCP connections with lower memory cost.
352 */
353int mbedtls_mock_socket_connect( mbedtls_mock_socket* peer1,
354 mbedtls_mock_socket* peer2,
355 size_t bufsize )
356{
357 int ret = -1;
358
Piotr Nowickid796e192020-01-28 12:09:47 +0100359 peer1->output =
Janos Follath031827f2019-11-27 11:12:14 +0000360 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
361 if( peer1->output == NULL )
362 {
363 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
364 goto exit;
365 }
366 mbedtls_test_buffer_init( peer1->output );
367 if( 0 != ( ret = mbedtls_test_buffer_setup( peer1->output, bufsize ) ) )
368 {
369 goto exit;
370 }
371
Piotr Nowickid796e192020-01-28 12:09:47 +0100372 peer2->output =
373 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
374 if( peer2->output == NULL )
375 {
376 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
377 goto exit;
378 }
379 mbedtls_test_buffer_init( peer2->output );
380 if( 0 != ( ret = mbedtls_test_buffer_setup( peer2->output, bufsize ) ) )
381 {
382 goto exit;
383 }
384
Janos Follath031827f2019-11-27 11:12:14 +0000385 peer1->peer = peer2;
386 peer2->peer = peer1;
Piotr Nowickid796e192020-01-28 12:09:47 +0100387 peer1->input = peer2->output;
388 peer2->input = peer1->output;
Janos Follath031827f2019-11-27 11:12:14 +0000389
390 peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
391 ret = 0;
392
393exit:
394
395 if( ret != 0 )
396 {
397 mbedtls_mock_socket_close( peer1 );
398 mbedtls_mock_socket_close( peer2 );
399 }
400
401 return ret;
402}
403
404/*
405 * Callbacks for simulating blocking I/O over connection-oriented transport.
406 */
407
408int mbedtls_mock_tcp_send_b( void *ctx, const unsigned char *buf, size_t len )
409{
410 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
411
412 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
413 return -1;
414
415 return mbedtls_test_buffer_put( socket->output, buf, len );
416}
417
418int mbedtls_mock_tcp_recv_b( void *ctx, unsigned char *buf, size_t len )
419{
420 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
421
422 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
423 return -1;
424
425 return mbedtls_test_buffer_get( socket->input, buf, len );
426}
427
428/*
Janos Follath3766ba52019-11-27 13:31:42 +0000429 * Callbacks for simulating non-blocking I/O over connection-oriented transport.
430 */
431
432int mbedtls_mock_tcp_send_nb( void *ctx, const unsigned char *buf, size_t len )
433{
434 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
435
436 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
437 return -1;
438
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100439 if( socket->output->capacity == socket->output->content_length )
Janos Follath3766ba52019-11-27 13:31:42 +0000440 {
Janos Follath3766ba52019-11-27 13:31:42 +0000441 return MBEDTLS_ERR_SSL_WANT_WRITE;
442 }
443
Janos Follath3766ba52019-11-27 13:31:42 +0000444 return mbedtls_test_buffer_put( socket->output, buf, len );
445}
446
447int mbedtls_mock_tcp_recv_nb( void *ctx, unsigned char *buf, size_t len )
448{
449 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
450
451 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
452 return -1;
453
Andrzej Kurekf40daa32020-02-04 09:00:01 -0500454 if( socket->input->content_length == 0 )
Janos Follath3766ba52019-11-27 13:31:42 +0000455 {
Janos Follath3766ba52019-11-27 13:31:42 +0000456 return MBEDTLS_ERR_SSL_WANT_READ;
457 }
458
Janos Follath3766ba52019-11-27 13:31:42 +0000459 return mbedtls_test_buffer_get( socket->input, buf, len );
460}
461
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500462/* Errors used in the message socket mocks */
463
464#define MBEDTLS_TEST_ERROR_CONTEXT_ERROR -55
465#define MBEDTLS_TEST_ERROR_SEND_FAILED -66
466#define MBEDTLS_TEST_ERROR_RECV_FAILED -77
467
468/*
469 * Structure used as an addon, or a wrapper, around the mocked sockets.
470 * Contains an input queue, to which the other socket pushes metadata,
471 * and an output queue, to which this one pushes metadata. This context is
472 * considered as an owner of the input queue only, which is initialized and
473 * freed in the respective setup and free calls.
474 */
475typedef struct mbedtls_test_message_socket_context
476{
477 mbedtls_test_message_queue* queue_input;
478 mbedtls_test_message_queue* queue_output;
479 mbedtls_mock_socket* socket;
480} mbedtls_test_message_socket_context;
481
482/*
483 * Setup a given mesasge socket context including initialization of
484 * input/output queues to a chosen capacity of messages. Also set the
485 * corresponding mock socket.
486 *
487 * \retval 0, if everything succeeds.
488 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation of a message
489 * queue failed.
490 */
491int mbedtls_message_socket_setup( mbedtls_test_message_queue* queue_input,
492 mbedtls_test_message_queue* queue_output,
493 size_t queue_capacity,
494 mbedtls_mock_socket* socket,
495 mbedtls_test_message_socket_context* ctx )
496{
497 int ret = mbedtls_test_message_queue_setup( queue_input, queue_capacity );
498 if( ret != 0 )
499 return ret;
500 ctx->queue_input = queue_input;
501 ctx->queue_output = queue_output;
502 ctx->socket = socket;
503 mbedtls_mock_socket_init( socket );
504
505 return 0;
506}
507
508/*
509 * Close a given message socket context, along with the socket itself. Free the
510 * memory allocated by the input queue.
511 */
512void mbedtls_message_socket_close( mbedtls_test_message_socket_context* ctx )
513{
514 if( ctx == NULL )
515 return;
516
517 mbedtls_test_message_queue_free( ctx->queue_input );
518 mbedtls_mock_socket_close( ctx->socket );
519 memset( ctx, 0, sizeof( *ctx ) );
520}
521
522/*
523 * Send one message through a given message socket context.
524 *
525 * \retval \p len, if everything succeeds.
526 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
527 * elements or the context itself is null.
528 * \retval MBEDTLS_TEST_ERROR_SEND_FAILED if mbedtls_mock_tcp_send_b failed.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500529 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the output queue is full.
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500530 *
531 * This function will also return any error from
532 * mbedtls_test_message_queue_push_info.
533 */
534int mbedtls_mock_tcp_send_msg( void *ctx, const unsigned char *buf, size_t len )
535{
536 mbedtls_test_message_queue* queue;
537 mbedtls_mock_socket* socket;
538 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
539
540 if( context == NULL || context->socket == NULL
541 || context->queue_output == NULL )
542 {
543 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
544 }
545
546 queue = context->queue_output;
547 socket = context->socket;
548
549 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500550 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500551
552 if( mbedtls_mock_tcp_send_b( socket, buf, len ) != (int) len )
553 return MBEDTLS_TEST_ERROR_SEND_FAILED;
554
555 return mbedtls_test_message_queue_push_info( queue, len );
556}
557
558/*
559 * Receive one message from a given message socket context and return message
560 * length or an error.
561 *
562 * \retval message length, if everything succeeds.
563 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
564 * elements or the context itself is null.
565 * \retval MBEDTLS_TEST_ERROR_RECV_FAILED if mbedtls_mock_tcp_recv_b failed.
566 *
567 * This function will also return any error other than
568 * MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED from mbedtls_test_message_queue_peek_info.
569 */
570int mbedtls_mock_tcp_recv_msg( void *ctx, unsigned char *buf, size_t buf_len )
571{
572 mbedtls_test_message_queue* queue;
573 mbedtls_mock_socket* socket;
574 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
575 size_t drop_len;
576 size_t msg_len;
577 int ret;
578
579 if( context == NULL || context->socket == NULL
580 || context->queue_input == NULL )
581 {
582 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
583 }
584
585 queue = context->queue_input;
586 socket = context->socket;
587
588 /* Peek first, so that in case of a socket error the data remains in
589 * the queue. */
590 ret = mbedtls_test_message_queue_peek_info( queue, buf_len, &msg_len );
591 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
592 {
593 /* Calculate how much to drop */
594 drop_len = msg_len - buf_len;
595
596 /* Set the requested message len to be buffer length */
597 msg_len = buf_len;
598 } else if( ret != 0 )
599 {
600 return ret;
601 }
602
603 if( mbedtls_mock_tcp_recv_b( socket, buf, msg_len ) != (int) msg_len )
604 return MBEDTLS_TEST_ERROR_RECV_FAILED;
605
606 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
607 {
608 /* Drop the remaining part of the message */
609 if( mbedtls_mock_tcp_recv_b( socket, NULL, drop_len ) != (int) drop_len )
610 {
611 /* Inconsistent state - part of the message was read,
612 * and a part couldn't. Not much we can do here, but it should not
613 * happen in test environment, unless forced manually. */
614 }
615 }
616 mbedtls_test_message_queue_pop_info( queue, buf_len );
617
618 return msg_len;
619}
620
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100621#if defined(MBEDTLS_X509_CRT_PARSE_C)
622
623/*
624 * Structure with endpoint's certificates for SSL communication tests.
625 */
626typedef struct mbedtls_endpoint_certificate
627{
628 mbedtls_x509_crt ca_cert;
629 mbedtls_x509_crt cert;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100630 mbedtls_pk_context pkey;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100631} mbedtls_endpoint_certificate;
632
633/*
634 * Endpoint structure for SSL communication tests.
635 */
636typedef struct mbedtls_endpoint
637{
638 const char *name;
639 mbedtls_ssl_context ssl;
640 mbedtls_ssl_config conf;
641 mbedtls_ctr_drbg_context ctr_drbg;
642 mbedtls_entropy_context entropy;
643 mbedtls_mock_socket socket;
644 mbedtls_endpoint_certificate cert;
645} mbedtls_endpoint;
646
647/*
648 * Initializes \p ep_cert structure and assigns it to endpoint
649 * represented by \p ep.
650 *
651 * \retval 0 on success, otherwise error code.
652 */
Andrzej Kurekb2980742020-02-02 19:25:26 -0500653int mbedtls_endpoint_certificate_init( mbedtls_endpoint *ep, int pk_alg )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100654{
655 int i = 0;
656 int ret = -1;
657 mbedtls_endpoint_certificate *cert;
658
659 if( ep == NULL )
660 {
661 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
662 }
663
664 cert = &( ep->cert );
665 mbedtls_x509_crt_init( &( cert->ca_cert ) );
666 mbedtls_x509_crt_init( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100667 mbedtls_pk_init( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100668
669 /* Load the trusted CA */
670
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100671 for( i = 0; mbedtls_test_cas_der[i] != NULL; i++ )
672 {
673 ret = mbedtls_x509_crt_parse_der( &( cert->ca_cert ),
674 (const unsigned char *) mbedtls_test_cas_der[i],
675 mbedtls_test_cas_der_len[i] );
676 TEST_ASSERT( ret == 0 );
677 }
678
679 /* Load own certificate and private key */
680
681 if( ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER )
682 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500683 if( pk_alg == MBEDTLS_PK_RSA )
684 {
685 ret = mbedtls_x509_crt_parse( &( cert->cert ),
686 (const unsigned char*) mbedtls_test_srv_crt_rsa_sha256_der,
687 mbedtls_test_srv_crt_rsa_sha256_der_len );
688 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100689
Andrzej Kurekb2980742020-02-02 19:25:26 -0500690 ret = mbedtls_pk_parse_key( &( cert->pkey ),
691 (const unsigned char*) mbedtls_test_srv_key_rsa_der,
692 mbedtls_test_srv_key_rsa_der_len, NULL, 0 );
693 TEST_ASSERT( ret == 0 );
694 }
695 else
696 {
697 ret = mbedtls_x509_crt_parse( &( cert->cert ),
698 (const unsigned char*) mbedtls_test_srv_crt_ec_der,
699 mbedtls_test_srv_crt_ec_der_len );
700 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100701
Andrzej Kurekb2980742020-02-02 19:25:26 -0500702 ret = mbedtls_pk_parse_key( &( cert->pkey ),
703 (const unsigned char*) mbedtls_test_srv_key_ec_der,
704 mbedtls_test_srv_key_ec_der_len, NULL, 0 );
705 TEST_ASSERT( ret == 0 );
706 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100707 }
708 else
709 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500710 if( pk_alg == MBEDTLS_PK_RSA )
711 {
712 ret = mbedtls_x509_crt_parse( &( cert->cert ),
713 (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
714 mbedtls_test_cli_crt_rsa_der_len );
715 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100716
Andrzej Kurekb2980742020-02-02 19:25:26 -0500717 ret = mbedtls_pk_parse_key( &( cert->pkey ),
718 (const unsigned char *) mbedtls_test_cli_key_rsa_der,
719 mbedtls_test_cli_key_rsa_der_len, NULL, 0 );
720 TEST_ASSERT( ret == 0 );
721 }
722 else
723 {
724 ret = mbedtls_x509_crt_parse( &( cert->cert ),
725 (const unsigned char *) mbedtls_test_cli_crt_ec_der,
726 mbedtls_test_cli_crt_ec_len );
727 TEST_ASSERT( ret == 0 );
728
729 ret = mbedtls_pk_parse_key( &( cert->pkey ),
730 (const unsigned char *) mbedtls_test_cli_key_ec_der,
731 mbedtls_test_cli_key_ec_der_len, NULL, 0 );
732 TEST_ASSERT( ret == 0 );
733 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100734 }
735
736 mbedtls_ssl_conf_ca_chain( &( ep->conf ), &( cert->ca_cert ), NULL );
737
Andrzej Kurekb2980742020-02-02 19:25:26 -0500738 ret = mbedtls_ssl_conf_own_cert( &( ep->conf ), &( cert->cert ),
739 &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100740 TEST_ASSERT( ret == 0 );
741
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100742exit:
743 if( ret != 0 )
744 {
745 mbedtls_x509_crt_free( &( cert->ca_cert ) );
746 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100747 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100748 }
749
750 return ret;
751}
752
753/*
754 * Initializes \p ep structure. It is important to call `mbedtls_endpoint_free()`
755 * after calling this function even if it fails.
756 *
757 * \p endpoint_type must be set as MBEDTLS_SSL_IS_SERVER or
758 * MBEDTLS_SSL_IS_CLIENT.
759 *
760 * \retval 0 on success, otherwise error code.
761 */
Andrzej Kurekb2980742020-02-02 19:25:26 -0500762int mbedtls_endpoint_init( mbedtls_endpoint *ep, int endpoint_type, int pk_alg )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100763{
764 int ret = -1;
765
766 if( ep == NULL )
767 {
768 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
769 }
770
771 memset( ep, 0, sizeof( *ep ) );
772
773 ep->name = ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ? "Server" : "Client";
774
775 mbedtls_ssl_init( &( ep->ssl ) );
776 mbedtls_ssl_config_init( &( ep->conf ) );
777 mbedtls_ctr_drbg_init( &( ep->ctr_drbg ) );
778 mbedtls_ssl_conf_rng( &( ep->conf ),
779 mbedtls_ctr_drbg_random,
780 &( ep->ctr_drbg ) );
781 mbedtls_entropy_init( &( ep->entropy ) );
782 mbedtls_mock_socket_init( &( ep->socket ) );
783
784 ret = mbedtls_ctr_drbg_seed( &( ep->ctr_drbg ), mbedtls_entropy_func,
785 &( ep->entropy ), (const unsigned char *) ( ep->name ),
786 strlen( ep->name ) );
787 TEST_ASSERT( ret == 0 );
788
789 /* Non-blocking callbacks without timeout */
790 mbedtls_ssl_set_bio( &( ep->ssl ), &( ep->socket ),
791 mbedtls_mock_tcp_send_nb,
792 mbedtls_mock_tcp_recv_nb,
793 NULL );
794
795 ret = mbedtls_ssl_setup( &( ep->ssl ), &( ep->conf ) );
796 TEST_ASSERT( ret == 0 );
797
798 ret = mbedtls_ssl_config_defaults( &( ep->conf ), endpoint_type,
799 MBEDTLS_SSL_TRANSPORT_STREAM,
800 MBEDTLS_SSL_PRESET_DEFAULT );
801 TEST_ASSERT( ret == 0 );
802
Andrzej Kurekb2980742020-02-02 19:25:26 -0500803 ret = mbedtls_endpoint_certificate_init( ep, pk_alg );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100804 TEST_ASSERT( ret == 0 );
805
806exit:
807 return ret;
808}
809
810/*
811 * Deinitializes certificates from endpoint represented by \p ep.
812 */
813void mbedtls_endpoint_certificate_free( mbedtls_endpoint *ep )
814{
815 mbedtls_endpoint_certificate *cert = &( ep->cert );
816 mbedtls_x509_crt_free( &( cert->ca_cert ) );
817 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100818 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100819}
820
821/*
822 * Deinitializes endpoint represented by \p ep.
823 */
824void mbedtls_endpoint_free( mbedtls_endpoint *ep )
825{
826 mbedtls_endpoint_certificate_free( ep );
827
828 mbedtls_ssl_free( &( ep->ssl ) );
829 mbedtls_ssl_config_free( &( ep->conf ) );
830 mbedtls_ctr_drbg_free( &( ep->ctr_drbg ) );
831 mbedtls_entropy_free( &( ep->entropy ) );
832 mbedtls_mock_socket_close( &( ep->socket ) );
833}
834
835/*
836 * This function moves ssl handshake from \p ssl to prescribed \p state.
837 * /p second_ssl is used as second endpoint and their sockets have to be
838 * connected before calling this function.
839 *
840 * \retval 0 on success, otherwise error code.
841 */
842int mbedtls_move_handshake_to_state( mbedtls_ssl_context *ssl,
843 mbedtls_ssl_context *second_ssl,
844 int state )
845{
846 enum { BUFFSIZE = 1024 };
847 int max_steps = 1000;
848 int ret = 0;
849
850 if( ssl == NULL || second_ssl == NULL )
851 {
852 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
853 }
854
855 /* Perform communication via connected sockets */
856 while( ( ssl->state != state ) && ( --max_steps >= 0 ) )
857 {
858 /* If /p second_ssl ends the handshake procedure before /p ssl then
859 * there is no need to call the next step */
860 if( second_ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
861 {
862 ret = mbedtls_ssl_handshake_step( second_ssl );
863 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
864 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
865 {
866 return ret;
867 }
868 }
869
870 /* We only care about the \p ssl state and returns, so we call it last,
871 * to leave the iteration as soon as the state is as expected. */
872 ret = mbedtls_ssl_handshake_step( ssl );
873 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
874 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
875 {
876 return ret;
877 }
878 }
879
880 return ( max_steps >= 0 ) ? ret : -1;
881}
882
883#endif /* MBEDTLS_X509_CRT_PARSE_C */
884
Janos Follath3766ba52019-11-27 13:31:42 +0000885/*
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100886 * Write application data. Then increase write and fragments counter
887 */
888int mbedtls_ssl_write_fragment( mbedtls_ssl_context *ssl, unsigned char *buf,
889 int ln, int *writen, int *fragments )
890{
891 int ret = mbedtls_ssl_write( ssl, buf + *writen, ln - *writen );
892 if( ret >= 0 )
893 {
894 (*fragments)++;
895 *writen += ret;
896 }
897 return ret;
898}
899
900/*
901 * Read application data and increase read counter
902 */
903int mbedtls_ssl_read_fragment( mbedtls_ssl_context *ssl, unsigned char *buf, int ln, int *read )
904{
905 int ret = mbedtls_ssl_read( ssl, buf + *read, ln - *read );
906 if( ret >= 0 )
907 {
908 *read += ret;
909 }
910 return ret;
911}
912
913/*
Hanno Beckera18d1322018-01-03 14:27:32 +0000914 * Helper function setting up inverse record transformations
915 * using given cipher, hash, EtM mode, authentication tag length,
916 * and version.
917 */
918
919#define CHK( x ) \
920 do \
921 { \
922 if( !( x ) ) \
Hanno Becker81e16a32019-03-01 11:21:44 +0000923 { \
Hanno Beckera5780f12019-04-05 09:55:37 +0100924 ret = -1; \
Hanno Becker81e16a32019-03-01 11:21:44 +0000925 goto cleanup; \
926 } \
Hanno Beckera18d1322018-01-03 14:27:32 +0000927 } while( 0 )
928
Andrzej Kurekf40daa32020-02-04 09:00:01 -0500929void set_ciphersuite( mbedtls_ssl_config *conf, const char *cipher,
930 int* forced_ciphersuite )
931{
932 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
933 forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( cipher );
934 forced_ciphersuite[1] = 0;
935
936 ciphersuite_info =
937 mbedtls_ssl_ciphersuite_from_id( forced_ciphersuite[0] );
938
939 TEST_ASSERT( ciphersuite_info != NULL );
940 TEST_ASSERT( ciphersuite_info->min_minor_ver <= conf->max_minor_ver );
941 TEST_ASSERT( ciphersuite_info->max_minor_ver >= conf->min_minor_ver );
942
943 if( conf->max_minor_ver > ciphersuite_info->max_minor_ver )
944 {
945 conf->max_minor_ver = ciphersuite_info->max_minor_ver;
946 }
947 if( conf->min_minor_ver < ciphersuite_info->min_minor_ver )
948 {
949 conf->min_minor_ver = ciphersuite_info->min_minor_ver;
950 }
951
952 mbedtls_ssl_conf_ciphersuites( conf, forced_ciphersuite );
953
954exit:
955 return;
956}
957
Andrzej Kurekcc5169c2020-02-04 09:04:56 -0500958int psk_dummy_callback( void *p_info, mbedtls_ssl_context *ssl,
959 const unsigned char *name, size_t name_len )
960{
961 (void) p_info;
962 (void) ssl;
963 (void) name;
964 (void) name_len;
965
966 return ( 0 );
967}
968
Hanno Beckerd856c822019-04-29 17:30:59 +0100969#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
970#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
971#else
972#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
973#endif
Hanno Beckera18d1322018-01-03 14:27:32 +0000974
975static int build_transforms( mbedtls_ssl_transform *t_in,
976 mbedtls_ssl_transform *t_out,
977 int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +0100978 int etm, int tag_mode, int ver,
979 size_t cid0_len,
980 size_t cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +0000981{
982 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +0100983 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +0000984
985 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +0000986 unsigned char *key0 = NULL, *key1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +0000987 unsigned char iv_enc[16], iv_dec[16];
988
Hanno Beckera0e20d02019-05-15 14:03:01 +0100989#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +0100990 unsigned char cid0[ SSL_CID_LEN_MIN ];
991 unsigned char cid1[ SSL_CID_LEN_MIN ];
992
993 rnd_std_rand( NULL, cid0, sizeof( cid0 ) );
994 rnd_std_rand( NULL, cid1, sizeof( cid1 ) );
Hanno Becker43c24b82019-05-01 09:45:57 +0100995#else
996 ((void) cid0_len);
997 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +0100998#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +0100999
Hanno Beckera18d1322018-01-03 14:27:32 +00001000 maclen = 0;
1001
1002 /* Pick cipher */
1003 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
1004 CHK( cipher_info != NULL );
1005 CHK( cipher_info->iv_size <= 16 );
1006 CHK( cipher_info->key_bitlen % 8 == 0 );
1007
1008 /* Pick keys */
1009 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +01001010 /* Allocate `keylen + 1` bytes to ensure that we get
1011 * a non-NULL pointers from `mbedtls_calloc` even if
1012 * `keylen == 0` in the case of the NULL cipher. */
1013 CHK( ( key0 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
1014 CHK( ( key1 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001015 memset( key0, 0x1, keylen );
1016 memset( key1, 0x2, keylen );
1017
1018 /* Setup cipher contexts */
1019 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_enc, cipher_info ) == 0 );
1020 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_dec, cipher_info ) == 0 );
1021 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_enc, cipher_info ) == 0 );
1022 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_dec, cipher_info ) == 0 );
1023
1024#if defined(MBEDTLS_CIPHER_MODE_CBC)
1025 if( cipher_info->mode == MBEDTLS_MODE_CBC )
1026 {
1027 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_enc,
1028 MBEDTLS_PADDING_NONE ) == 0 );
1029 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_dec,
1030 MBEDTLS_PADDING_NONE ) == 0 );
1031 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_enc,
1032 MBEDTLS_PADDING_NONE ) == 0 );
1033 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_dec,
1034 MBEDTLS_PADDING_NONE ) == 0 );
1035 }
1036#endif /* MBEDTLS_CIPHER_MODE_CBC */
1037
1038 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_enc, key0,
1039 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1040 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_dec, key1,
1041 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
1042 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_enc, key1,
1043 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1044 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_dec, key0,
1045 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001046
1047 /* Setup MAC contexts */
1048#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1049 if( cipher_info->mode == MBEDTLS_MODE_CBC ||
1050 cipher_info->mode == MBEDTLS_MODE_STREAM )
1051 {
1052 mbedtls_md_info_t const *md_info;
1053 unsigned char *md0, *md1;
1054
1055 /* Pick hash */
1056 md_info = mbedtls_md_info_from_type( hash_id );
1057 CHK( md_info != NULL );
1058
1059 /* Pick hash keys */
1060 maclen = mbedtls_md_get_size( md_info );
Hanno Becker3ee54212019-04-04 16:31:26 +01001061 CHK( ( md0 = mbedtls_calloc( 1, maclen ) ) != NULL );
1062 CHK( ( md1 = mbedtls_calloc( 1, maclen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001063 memset( md0, 0x5, maclen );
1064 memset( md1, 0x6, maclen );
1065
1066 CHK( mbedtls_md_setup( &t_out->md_ctx_enc, md_info, 1 ) == 0 );
1067 CHK( mbedtls_md_setup( &t_out->md_ctx_dec, md_info, 1 ) == 0 );
1068 CHK( mbedtls_md_setup( &t_in->md_ctx_enc, md_info, 1 ) == 0 );
1069 CHK( mbedtls_md_setup( &t_in->md_ctx_dec, md_info, 1 ) == 0 );
1070
1071 if( ver > MBEDTLS_SSL_MINOR_VERSION_0 )
1072 {
1073 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_enc,
1074 md0, maclen ) == 0 );
1075 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_dec,
1076 md1, maclen ) == 0 );
1077 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_enc,
1078 md1, maclen ) == 0 );
1079 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_dec,
1080 md0, maclen ) == 0 );
1081 }
1082#if defined(MBEDTLS_SSL_PROTO_SSL3)
1083 else
1084 {
1085 memcpy( &t_in->mac_enc, md0, maclen );
1086 memcpy( &t_in->mac_dec, md1, maclen );
1087 memcpy( &t_out->mac_enc, md1, maclen );
1088 memcpy( &t_out->mac_dec, md0, maclen );
1089 }
1090#endif
1091
Hanno Becker3ee54212019-04-04 16:31:26 +01001092 mbedtls_free( md0 );
1093 mbedtls_free( md1 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001094 }
1095#else
1096 ((void) hash_id);
1097#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1098
1099
1100 /* Pick IV's (regardless of whether they
1101 * are being used by the transform). */
1102 ivlen = cipher_info->iv_size;
1103 memset( iv_enc, 0x3, sizeof( iv_enc ) );
1104 memset( iv_dec, 0x4, sizeof( iv_dec ) );
1105
1106 /*
1107 * Setup transforms
1108 */
1109
Jaeden Amero2de07f12019-06-05 13:32:08 +01001110#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1111 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001112 t_out->encrypt_then_mac = etm;
1113 t_in->encrypt_then_mac = etm;
1114#else
1115 ((void) etm);
1116#endif
1117
1118 t_out->minor_ver = ver;
1119 t_in->minor_ver = ver;
1120 t_out->ivlen = ivlen;
1121 t_in->ivlen = ivlen;
1122
1123 switch( cipher_info->mode )
1124 {
1125 case MBEDTLS_MODE_GCM:
1126 case MBEDTLS_MODE_CCM:
1127 t_out->fixed_ivlen = 4;
1128 t_in->fixed_ivlen = 4;
1129 t_out->maclen = 0;
1130 t_in->maclen = 0;
1131 switch( tag_mode )
1132 {
1133 case 0: /* Full tag */
1134 t_out->taglen = 16;
1135 t_in->taglen = 16;
1136 break;
1137 case 1: /* Partial tag */
1138 t_out->taglen = 8;
1139 t_in->taglen = 8;
1140 break;
1141 default:
1142 return( 1 );
1143 }
1144 break;
1145
1146 case MBEDTLS_MODE_CHACHAPOLY:
1147 t_out->fixed_ivlen = 12;
1148 t_in->fixed_ivlen = 12;
1149 t_out->maclen = 0;
1150 t_in->maclen = 0;
1151 switch( tag_mode )
1152 {
1153 case 0: /* Full tag */
1154 t_out->taglen = 16;
1155 t_in->taglen = 16;
1156 break;
1157 case 1: /* Partial tag */
1158 t_out->taglen = 8;
1159 t_in->taglen = 8;
1160 break;
1161 default:
1162 return( 1 );
1163 }
1164 break;
1165
1166 case MBEDTLS_MODE_STREAM:
1167 case MBEDTLS_MODE_CBC:
1168 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1169 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1170 t_out->taglen = 0;
1171 t_in->taglen = 0;
1172 switch( tag_mode )
1173 {
1174 case 0: /* Full tag */
1175 t_out->maclen = maclen;
1176 t_in->maclen = maclen;
1177 break;
1178 case 1: /* Partial tag */
1179 t_out->maclen = 10;
1180 t_in->maclen = 10;
1181 break;
1182 default:
1183 return( 1 );
1184 }
1185 break;
1186 default:
1187 return( 1 );
1188 break;
1189 }
1190
1191 /* Setup IV's */
1192
1193 memcpy( &t_in->iv_dec, iv_dec, sizeof( iv_dec ) );
1194 memcpy( &t_in->iv_enc, iv_enc, sizeof( iv_enc ) );
1195 memcpy( &t_out->iv_dec, iv_enc, sizeof( iv_enc ) );
1196 memcpy( &t_out->iv_enc, iv_dec, sizeof( iv_dec ) );
1197
Hanno Beckera0e20d02019-05-15 14:03:01 +01001198#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001199 /* Add CID */
1200 memcpy( &t_in->in_cid, cid0, cid0_len );
1201 memcpy( &t_in->out_cid, cid1, cid1_len );
1202 t_in->in_cid_len = cid0_len;
1203 t_in->out_cid_len = cid1_len;
1204 memcpy( &t_out->in_cid, cid1, cid1_len );
1205 memcpy( &t_out->out_cid, cid0, cid0_len );
1206 t_out->in_cid_len = cid1_len;
1207 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001208#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001209
Hanno Becker81e16a32019-03-01 11:21:44 +00001210cleanup:
1211
Hanno Becker3ee54212019-04-04 16:31:26 +01001212 mbedtls_free( key0 );
1213 mbedtls_free( key1 );
Hanno Becker81e16a32019-03-01 11:21:44 +00001214
Hanno Beckera5780f12019-04-05 09:55:37 +01001215 return( ret );
Hanno Beckera18d1322018-01-03 14:27:32 +00001216}
1217
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001218/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001219 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001220 * Choose dummy values, mostly non-0 to distinguish from the init default.
1221 */
1222static int ssl_populate_session( mbedtls_ssl_session *session,
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001223 int ticket_len,
1224 const char *crt_file )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001225{
1226#if defined(MBEDTLS_HAVE_TIME)
1227 session->start = mbedtls_time( NULL ) - 42;
1228#endif
1229 session->ciphersuite = 0xabcd;
1230 session->compression = 1;
1231 session->id_len = sizeof( session->id );
1232 memset( session->id, 66, session->id_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001233 memset( session->master, 17, sizeof( session->master ) );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001234
Manuel Pégourié-Gonnard1f6033a2019-05-24 10:17:52 +02001235#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001236 if( strlen( crt_file ) != 0 )
1237 {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001238 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001239 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001240
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001241 mbedtls_x509_crt_init( &tmp_crt );
1242 ret = mbedtls_x509_crt_parse_file( &tmp_crt, crt_file );
1243 if( ret != 0 )
1244 return( ret );
1245
1246#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1247 /* Move temporary CRT. */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001248 session->peer_cert = mbedtls_calloc( 1, sizeof( *session->peer_cert ) );
1249 if( session->peer_cert == NULL )
1250 return( -1 );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001251 *session->peer_cert = tmp_crt;
1252 memset( &tmp_crt, 0, sizeof( tmp_crt ) );
1253#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1254 /* Calculate digest of temporary CRT. */
1255 session->peer_cert_digest =
1256 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
1257 if( session->peer_cert_digest == NULL )
1258 return( -1 );
1259 ret = mbedtls_md( mbedtls_md_info_from_type(
1260 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
1261 tmp_crt.raw.p, tmp_crt.raw.len,
1262 session->peer_cert_digest );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001263 if( ret != 0 )
1264 return( ret );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001265 session->peer_cert_digest_type =
1266 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1267 session->peer_cert_digest_len =
1268 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1269#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1270
1271 mbedtls_x509_crt_free( &tmp_crt );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001272 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001273#else /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001274 (void) crt_file;
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001275#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001276 session->verify_result = 0xdeadbeef;
1277
1278#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
1279 if( ticket_len != 0 )
1280 {
1281 session->ticket = mbedtls_calloc( 1, ticket_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001282 if( session->ticket == NULL )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001283 return( -1 );
1284 memset( session->ticket, 33, ticket_len );
1285 }
1286 session->ticket_len = ticket_len;
1287 session->ticket_lifetime = 86401;
1288#else
1289 (void) ticket_len;
1290#endif
1291
1292#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1293 session->mfl_code = 1;
1294#endif
1295#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1296 session->trunc_hmac = 1;
1297#endif
1298#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1299 session->encrypt_then_mac = 1;
1300#endif
1301
1302 return( 0 );
1303}
1304
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001305/* END_HEADER */
1306
1307/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001308 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001309 * END_DEPENDENCIES
1310 */
1311
Janos Follath6264e662019-11-26 11:11:15 +00001312/* BEGIN_CASE */
1313void test_callback_buffer_sanity()
1314{
1315 enum { MSGLEN = 10 };
1316 mbedtls_test_buffer buf;
1317 unsigned char input[MSGLEN];
1318 unsigned char output[MSGLEN];
1319
1320 memset( input, 0, sizeof(input) );
1321
1322 /* Make sure calling put and get on NULL buffer results in error. */
1323 TEST_ASSERT( mbedtls_test_buffer_put( NULL, input, sizeof( input ) )
1324 == -1 );
1325 TEST_ASSERT( mbedtls_test_buffer_get( NULL, output, sizeof( output ) )
1326 == -1 );
1327 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001328
Janos Follath6264e662019-11-26 11:11:15 +00001329 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, 0 ) == -1 );
1330 TEST_ASSERT( mbedtls_test_buffer_get( NULL, NULL, 0 ) == -1 );
1331
1332 /* Make sure calling put and get on a buffer that hasn't been set up results
1333 * in eror. */
1334 mbedtls_test_buffer_init( &buf );
1335
1336 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) ) == -1 );
1337 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, sizeof( output ) )
1338 == -1 );
1339 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001340
Janos Follath6264e662019-11-26 11:11:15 +00001341 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == -1 );
1342 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == -1 );
1343
Andrzej Kurekf7774142020-01-22 06:34:59 -05001344 /* Make sure calling put and get on NULL input only results in
1345 * error if the length is not zero, and that a NULL output is valid for data
1346 * dropping.
1347 */
Janos Follath6264e662019-11-26 11:11:15 +00001348
1349 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, sizeof( input ) ) == 0 );
1350
1351 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
1352 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, sizeof( output ) )
Andrzej Kurekf7774142020-01-22 06:34:59 -05001353 == 0 );
Janos Follath6264e662019-11-26 11:11:15 +00001354 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == 0 );
1355 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == 0 );
1356
Piotr Nowickifb437d72020-01-13 16:59:12 +01001357 /* Make sure calling put several times in the row is safe */
1358
1359 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) )
1360 == sizeof( input ) );
1361 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, 2 ) == 2 );
1362 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 1 ) == 1 );
1363 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 1 );
1364 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 0 );
1365
1366
Janos Follath6264e662019-11-26 11:11:15 +00001367exit:
1368
1369 mbedtls_test_buffer_free( &buf );
1370}
1371/* END_CASE */
1372
1373/*
1374 * Test if the implementation of `mbedtls_test_buffer` related functions is
1375 * correct and works as expected.
1376 *
1377 * That is
1378 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
1379 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1380 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
1381 * bytes.
1382 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1383 * - All of the bytes we got match the bytes we put in in a FIFO manner.
1384 */
1385
1386/* BEGIN_CASE */
1387void test_callback_buffer( int size, int put1, int put1_ret,
1388 int get1, int get1_ret, int put2, int put2_ret,
1389 int get2, int get2_ret )
1390{
1391 enum { ROUNDS = 2 };
1392 size_t put[ROUNDS];
1393 int put_ret[ROUNDS];
1394 size_t get[ROUNDS];
1395 int get_ret[ROUNDS];
1396 mbedtls_test_buffer buf;
1397 unsigned char* input = NULL;
1398 size_t input_len;
1399 unsigned char* output = NULL;
1400 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00001401 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00001402
1403 mbedtls_test_buffer_init( &buf );
1404 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, size ) == 0 );
1405
1406 /* Check the sanity of input parameters and initialise local variables. That
1407 * is, ensure that the amount of data is not negative and that we are not
1408 * expecting more to put or get than we actually asked for. */
1409 TEST_ASSERT( put1 >= 0 );
1410 put[0] = put1;
1411 put_ret[0] = put1_ret;
1412 TEST_ASSERT( put1_ret <= put1 );
1413 TEST_ASSERT( put2 >= 0 );
1414 put[1] = put2;
1415 put_ret[1] = put2_ret;
1416 TEST_ASSERT( put2_ret <= put2 );
1417
1418 TEST_ASSERT( get1 >= 0 );
1419 get[0] = get1;
1420 get_ret[0] = get1_ret;
1421 TEST_ASSERT( get1_ret <= get1 );
1422 TEST_ASSERT( get2 >= 0 );
1423 get[1] = get2;
1424 get_ret[1] = get2_ret;
1425 TEST_ASSERT( get2_ret <= get2 );
1426
1427 input_len = 0;
1428 /* Calculate actual input and output lengths */
1429 for( j = 0; j < ROUNDS; j++ )
1430 {
1431 if( put_ret[j] > 0 )
1432 {
1433 input_len += put_ret[j];
1434 }
1435 }
1436 /* In order to always have a valid pointer we always allocate at least 1
1437 * byte. */
1438 if( input_len == 0 )
1439 input_len = 1;
1440 ASSERT_ALLOC( input, input_len );
1441
1442 output_len = 0;
1443 for( j = 0; j < ROUNDS; j++ )
1444 {
1445 if( get_ret[j] > 0 )
1446 {
1447 output_len += get_ret[j];
1448 }
1449 }
1450 TEST_ASSERT( output_len <= input_len );
1451 /* In order to always have a valid pointer we always allocate at least 1
1452 * byte. */
1453 if( output_len == 0 )
1454 output_len = 1;
1455 ASSERT_ALLOC( output, output_len );
1456
1457 /* Fill up the buffer with structured data so that unwanted changes
1458 * can be detected */
1459 for( i = 0; i < input_len; i++ )
1460 {
1461 input[i] = i & 0xFF;
1462 }
1463
1464 written = read = 0;
1465 for( j = 0; j < ROUNDS; j++ )
1466 {
1467 TEST_ASSERT( put_ret[j] == mbedtls_test_buffer_put( &buf,
1468 input + written, put[j] ) );
1469 written += put_ret[j];
1470 TEST_ASSERT( get_ret[j] == mbedtls_test_buffer_get( &buf,
1471 output + read, get[j] ) );
1472 read += get_ret[j];
1473 TEST_ASSERT( read <= written );
1474 if( get_ret[j] > 0 )
1475 {
1476 TEST_ASSERT( memcmp( output + read - get_ret[j],
1477 input + read - get_ret[j], get_ret[j] )
1478 == 0 );
1479 }
1480 }
1481
1482exit:
1483
1484 mbedtls_free( input );
1485 mbedtls_free( output );
1486 mbedtls_test_buffer_free( &buf );
1487}
1488/* END_CASE */
1489
Janos Follath031827f2019-11-27 11:12:14 +00001490/*
Janos Follathc673c2c2019-12-02 15:47:26 +00001491 * Test if the implementation of `mbedtls_mock_socket` related I/O functions is
1492 * correct and works as expected on unconnected sockets.
1493 */
1494
1495/* BEGIN_CASE */
1496void ssl_mock_sanity( )
1497{
1498 enum { MSGLEN = 105 };
1499 unsigned char message[MSGLEN];
1500 unsigned char received[MSGLEN];
1501 mbedtls_mock_socket socket;
1502
1503 mbedtls_mock_socket_init( &socket );
1504 TEST_ASSERT( mbedtls_mock_tcp_send_b( &socket, message, MSGLEN ) < 0 );
1505 mbedtls_mock_socket_close( &socket );
1506 mbedtls_mock_socket_init( &socket );
1507 TEST_ASSERT( mbedtls_mock_tcp_recv_b( &socket, received, MSGLEN ) < 0 );
1508 mbedtls_mock_socket_close( &socket );
1509
1510 mbedtls_mock_socket_init( &socket );
1511 TEST_ASSERT( mbedtls_mock_tcp_send_nb( &socket, message, MSGLEN ) < 0 );
1512 mbedtls_mock_socket_close( &socket );
1513 mbedtls_mock_socket_init( &socket );
1514 TEST_ASSERT( mbedtls_mock_tcp_recv_nb( &socket, received, MSGLEN ) < 0 );
1515 mbedtls_mock_socket_close( &socket );
1516
1517exit:
1518
1519 mbedtls_mock_socket_close( &socket );
1520}
1521/* END_CASE */
1522
1523/*
1524 * Test if the implementation of `mbedtls_mock_socket` related functions can
1525 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00001526 */
1527
1528/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001529void ssl_mock_tcp( int blocking )
Janos Follath031827f2019-11-27 11:12:14 +00001530{
Janos Follathc673c2c2019-12-02 15:47:26 +00001531 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001532 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00001533 unsigned char message[MSGLEN];
1534 unsigned char received[MSGLEN];
1535 mbedtls_mock_socket client;
1536 mbedtls_mock_socket server;
1537 size_t written, read;
1538 int send_ret, recv_ret;
1539 mbedtls_ssl_send_t *send;
1540 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00001541 unsigned i;
1542
1543 if( blocking == 0 )
1544 {
1545 send = mbedtls_mock_tcp_send_nb;
1546 recv = mbedtls_mock_tcp_recv_nb;
1547 }
1548 else
1549 {
1550 send = mbedtls_mock_tcp_send_b;
1551 recv = mbedtls_mock_tcp_recv_b;
1552 }
1553
1554 mbedtls_mock_socket_init( &client );
1555 mbedtls_mock_socket_init( &server );
1556
1557 /* Fill up the buffer with structured data so that unwanted changes
1558 * can be detected */
1559 for( i = 0; i < MSGLEN; i++ )
1560 {
1561 message[i] = i & 0xFF;
1562 }
1563
1564 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001565 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follathc673c2c2019-12-02 15:47:26 +00001566
1567 /* Send the message to the server */
1568 send_ret = recv_ret = 1;
1569 written = read = 0;
1570 while( send_ret != 0 || recv_ret != 0 )
1571 {
1572 send_ret = send( &client, message + written, MSGLEN - written );
1573
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001574 TEST_ASSERT( send_ret >= 0 );
1575 TEST_ASSERT( send_ret <= BUFLEN );
1576 written += send_ret;
1577
1578 /* If the buffer is full we can test blocking and non-blocking send */
1579 if ( send_ret == BUFLEN )
Janos Follathc673c2c2019-12-02 15:47:26 +00001580 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001581 int blocking_ret = send( &client, message , 1 );
1582 if ( blocking )
1583 {
1584 TEST_ASSERT( blocking_ret == 0 );
1585 }
1586 else
1587 {
1588 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1589 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001590 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001591
1592 recv_ret = recv( &server, received + read, MSGLEN - read );
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001593
1594 /* The result depends on whether any data was sent */
1595 if ( send_ret > 0 )
Janos Follathc673c2c2019-12-02 15:47:26 +00001596 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001597 TEST_ASSERT( recv_ret > 0 );
1598 TEST_ASSERT( recv_ret <= BUFLEN );
1599 read += recv_ret;
1600 }
1601 else if( blocking )
1602 {
1603 TEST_ASSERT( recv_ret == 0 );
Janos Follathc673c2c2019-12-02 15:47:26 +00001604 }
1605 else
1606 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001607 TEST_ASSERT( recv_ret == MBEDTLS_ERR_SSL_WANT_READ );
1608 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00001609 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001610
1611 /* If the buffer is empty we can test blocking and non-blocking read */
1612 if ( recv_ret == BUFLEN )
1613 {
1614 int blocking_ret = recv( &server, received, 1 );
1615 if ( blocking )
1616 {
1617 TEST_ASSERT( blocking_ret == 0 );
1618 }
1619 else
1620 {
1621 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
1622 }
1623 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001624 }
1625 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1626
1627exit:
1628
1629 mbedtls_mock_socket_close( &client );
1630 mbedtls_mock_socket_close( &server );
1631}
1632/* END_CASE */
1633
1634/*
1635 * Test if the implementation of `mbedtls_mock_socket` related functions can
1636 * send messages in both direction at the same time (with the I/O calls
1637 * interleaving).
1638 */
1639
1640/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001641void ssl_mock_tcp_interleaving( int blocking )
Janos Follathc673c2c2019-12-02 15:47:26 +00001642{
Janos Follath031827f2019-11-27 11:12:14 +00001643 enum { ROUNDS = 2 };
1644 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001645 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00001646 unsigned char message[ROUNDS][MSGLEN];
1647 unsigned char received[ROUNDS][MSGLEN];
1648 mbedtls_mock_socket client;
1649 mbedtls_mock_socket server;
1650 size_t written[ROUNDS];
1651 size_t read[ROUNDS];
1652 int send_ret[ROUNDS];
1653 int recv_ret[ROUNDS];
1654 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00001655 mbedtls_ssl_send_t *send;
1656 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00001657
1658 if( blocking == 0 )
1659 {
1660 send = mbedtls_mock_tcp_send_nb;
1661 recv = mbedtls_mock_tcp_recv_nb;
1662 }
1663 else
1664 {
1665 send = mbedtls_mock_tcp_send_b;
1666 recv = mbedtls_mock_tcp_recv_b;
1667 }
Janos Follath031827f2019-11-27 11:12:14 +00001668
1669 mbedtls_mock_socket_init( &client );
1670 mbedtls_mock_socket_init( &server );
1671
1672 /* Fill up the buffers with structured data so that unwanted changes
1673 * can be detected */
1674 for( i = 0; i < ROUNDS; i++ )
1675 {
1676 for( j = 0; j < MSGLEN; j++ )
1677 {
1678 message[i][j] = ( i * MSGLEN + j ) & 0xFF;
1679 }
1680 }
1681
Janos Follath031827f2019-11-27 11:12:14 +00001682 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001683 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follath031827f2019-11-27 11:12:14 +00001684
Janos Follath031827f2019-11-27 11:12:14 +00001685 /* Send the message from both sides, interleaving. */
1686 progress = 1;
1687 for( i = 0; i < ROUNDS; i++ )
1688 {
1689 written[i] = 0;
1690 read[i] = 0;
1691 }
1692 /* This loop does not stop as long as there was a successful write or read
1693 * of at least one byte on either side. */
1694 while( progress != 0 )
1695 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001696 mbedtls_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00001697
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001698 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001699 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001700 /* First sending is from the client */
1701 socket = ( i % 2 == 0 ) ? ( &client ) : ( &server );
Janos Follath031827f2019-11-27 11:12:14 +00001702
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001703 send_ret[i] = send( socket, message[i] + written[i],
1704 MSGLEN - written[i] );
1705 TEST_ASSERT( send_ret[i] >= 0 );
1706 TEST_ASSERT( send_ret[i] <= BUFLEN );
1707 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00001708
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001709 /* If the buffer is full we can test blocking and non-blocking
1710 * send */
1711 if ( send_ret[i] == BUFLEN )
1712 {
1713 int blocking_ret = send( socket, message[i] , 1 );
1714 if ( blocking )
1715 {
1716 TEST_ASSERT( blocking_ret == 0 );
1717 }
1718 else
1719 {
1720 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1721 }
1722 }
Janos Follath3766ba52019-11-27 13:31:42 +00001723 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001724
1725 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001726 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001727 /* First receiving is from the server */
1728 socket = ( i % 2 == 0 ) ? ( &server ) : ( &client );
1729
1730 recv_ret[i] = recv( socket, received[i] + read[i],
1731 MSGLEN - read[i] );
1732
1733 /* The result depends on whether any data was sent */
1734 if ( send_ret[i] > 0 )
1735 {
1736 TEST_ASSERT( recv_ret[i] > 0 );
1737 TEST_ASSERT( recv_ret[i] <= BUFLEN );
1738 read[i] += recv_ret[i];
1739 }
1740 else if( blocking )
1741 {
1742 TEST_ASSERT( recv_ret[i] == 0 );
1743 }
1744 else
1745 {
1746 TEST_ASSERT( recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ );
1747 recv_ret[i] = 0;
1748 }
1749
1750 /* If the buffer is empty we can test blocking and non-blocking
1751 * read */
1752 if ( recv_ret[i] == BUFLEN )
1753 {
1754 int blocking_ret = recv( socket, received[i], 1 );
1755 if ( blocking )
1756 {
1757 TEST_ASSERT( blocking_ret == 0 );
1758 }
1759 else
1760 {
1761 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
1762 }
1763 }
Janos Follath3766ba52019-11-27 13:31:42 +00001764 }
Janos Follath031827f2019-11-27 11:12:14 +00001765
1766 progress = 0;
1767 for( i = 0; i < ROUNDS; i++ )
1768 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001769 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00001770 }
1771 }
1772
1773 for( i = 0; i < ROUNDS; i++ )
1774 TEST_ASSERT( memcmp( message[i], received[i], MSGLEN ) == 0 );
1775
1776exit:
1777
1778 mbedtls_mock_socket_close( &client );
1779 mbedtls_mock_socket_close( &server );
1780}
1781/* END_CASE */
1782
Andrzej Kurek13719cd2020-01-22 06:36:39 -05001783/* BEGIN_CASE */
1784void ssl_message_queue_sanity( )
1785{
1786 mbedtls_test_message_queue queue;
1787
1788 /* Trying to push/pull to an empty queue */
1789 TEST_ASSERT( mbedtls_test_message_queue_push_info( NULL, 1 )
1790 == MBEDTLS_TEST_ERROR_ARG_NULL );
1791 TEST_ASSERT( mbedtls_test_message_queue_pop_info( NULL, 1 )
1792 == MBEDTLS_TEST_ERROR_ARG_NULL );
1793
1794 mbedtls_test_message_queue_setup( &queue, 3 );
1795 TEST_ASSERT( queue.capacity == 3 );
1796 TEST_ASSERT( queue.num == 0 );
1797
1798exit:
1799 mbedtls_test_message_queue_free( &queue );
1800}
1801/* END_CASE */
1802
1803/* BEGIN_CASE */
1804void ssl_message_queue_basic( )
1805{
1806 mbedtls_test_message_queue queue;
1807
1808 mbedtls_test_message_queue_setup( &queue, 3 );
1809
1810 /* Sanity test - 3 pushes and 3 pops with sufficient space */
1811 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1812 TEST_ASSERT( queue.capacity == 3 );
1813 TEST_ASSERT( queue.num == 1 );
1814 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1815 TEST_ASSERT( queue.capacity == 3 );
1816 TEST_ASSERT( queue.num == 2 );
1817 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1818 TEST_ASSERT( queue.capacity == 3 );
1819 TEST_ASSERT( queue.num == 3 );
1820
1821 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1822 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1823 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1824
1825exit:
1826 mbedtls_test_message_queue_free( &queue );
1827}
1828/* END_CASE */
1829
1830/* BEGIN_CASE */
1831void ssl_message_queue_overflow_underflow( )
1832{
1833 mbedtls_test_message_queue queue;
1834
1835 mbedtls_test_message_queue_setup( &queue, 3 );
1836
1837 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
1838 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1839 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1840 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1841 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05001842 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05001843
1844 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1845 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1846 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1847
1848 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05001849 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05001850
1851exit:
1852 mbedtls_test_message_queue_free( &queue );
1853}
1854/* END_CASE */
1855
1856/* BEGIN_CASE */
1857void ssl_message_queue_interleaved( )
1858{
1859 mbedtls_test_message_queue queue;
1860
1861 mbedtls_test_message_queue_setup( &queue, 3 );
1862
1863 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
1864 * (to wrap around the buffer) */
1865 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1866 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1867
1868 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1869
1870 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1871 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 ) == 3 );
1872
1873 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1874 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1875
1876 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 5 ) == 5 );
1877 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 8 ) == 8 );
1878
1879 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 3 ) == 3 );
1880
1881 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 5 ) == 5 );
1882
1883 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 8 ) == 8 );
1884
1885exit:
1886 mbedtls_test_message_queue_free( &queue );
1887}
1888/* END_CASE */
1889
1890/* BEGIN_CASE */
1891void ssl_message_queue_insufficient_buffer( )
1892{
1893 mbedtls_test_message_queue queue;
1894 size_t message_len = 10;
1895 size_t buffer_len = 5;
1896
1897 mbedtls_test_message_queue_setup( &queue, 1 );
1898
1899 /* Popping without a sufficient buffer */
1900 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, message_len )
1901 == (int) message_len );
1902 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, buffer_len )
1903 == (int) buffer_len );
1904exit:
1905 mbedtls_test_message_queue_free( &queue );
1906}
1907/* END_CASE */
1908
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001909/* BEGIN_CASE */
1910void ssl_message_mock_uninitialized( )
1911{
1912 enum { MSGLEN = 10 };
1913 unsigned char message[MSGLEN], received[MSGLEN];
1914 mbedtls_mock_socket client, server;
1915 mbedtls_test_message_queue server_queue, client_queue;
1916 mbedtls_test_message_socket_context server_context, client_context;
1917
1918 /* Send with a NULL context */
1919 TEST_ASSERT( mbedtls_mock_tcp_send_msg( NULL, message, MSGLEN )
1920 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
1921
1922 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( NULL, message, MSGLEN )
1923 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
1924
1925 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
1926 &server,
1927 &server_context ) == 0 );
1928
1929 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
1930 &client,
1931 &client_context ) == 0 );
1932
1933 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message, MSGLEN )
1934 == MBEDTLS_TEST_ERROR_SEND_FAILED );
1935
1936 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05001937 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001938
1939 /* Push directly to a queue to later simulate a disconnected behavior */
1940 TEST_ASSERT( mbedtls_test_message_queue_push_info( &server_queue, MSGLEN )
1941 == MSGLEN );
1942
1943 /* Test if there's an error when trying to read from a disconnected
1944 * socket */
1945 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1946 == MBEDTLS_TEST_ERROR_RECV_FAILED );
1947 exit:
1948 mbedtls_message_socket_close( &server_context );
1949 mbedtls_message_socket_close( &client_context );
1950}
1951/* END_CASE */
1952
1953/* BEGIN_CASE */
1954void ssl_message_mock_basic( )
1955{
1956 enum { MSGLEN = 10 };
1957 unsigned char message[MSGLEN], received[MSGLEN];
1958 mbedtls_mock_socket client, server;
1959 unsigned i;
1960 mbedtls_test_message_queue server_queue, client_queue;
1961 mbedtls_test_message_socket_context server_context, client_context;
1962
1963 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
1964 &server,
1965 &server_context ) == 0 );
1966
1967 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
1968 &client,
1969 &client_context ) == 0 );
1970
1971 /* Fill up the buffer with structured data so that unwanted changes
1972 * can be detected */
1973 for( i = 0; i < MSGLEN; i++ )
1974 {
1975 message[i] = i & 0xFF;
1976 }
1977 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
1978 MSGLEN ) );
1979
1980 /* Send the message to the server */
1981 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
1982 MSGLEN ) == MSGLEN );
1983
1984 /* Read from the server */
1985 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1986 == MSGLEN );
1987
1988 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1989 memset( received, 0, MSGLEN );
1990
1991 /* Send the message to the client */
1992 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
1993 MSGLEN ) == MSGLEN );
1994
1995 /* Read from the client */
1996 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
1997 == MSGLEN );
1998 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1999
2000 exit:
2001 mbedtls_message_socket_close( &server_context );
2002 mbedtls_message_socket_close( &client_context );
2003}
2004/* END_CASE */
2005
2006/* BEGIN_CASE */
2007void ssl_message_mock_queue_overflow_underflow( )
2008{
2009 enum { MSGLEN = 10 };
2010 unsigned char message[MSGLEN], received[MSGLEN];
2011 mbedtls_mock_socket client, server;
2012 unsigned i;
2013 mbedtls_test_message_queue server_queue, client_queue;
2014 mbedtls_test_message_socket_context server_context, client_context;
2015
2016 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2017 &server,
2018 &server_context ) == 0 );
2019
2020 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2021 &client,
2022 &client_context ) == 0 );
2023
2024 /* Fill up the buffer with structured data so that unwanted changes
2025 * can be detected */
2026 for( i = 0; i < MSGLEN; i++ )
2027 {
2028 message[i] = i & 0xFF;
2029 }
2030 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2031 MSGLEN*2 ) );
2032
2033 /* Send three message to the server, last one with an error */
2034 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2035 MSGLEN - 1 ) == MSGLEN - 1 );
2036
2037 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2038 MSGLEN ) == MSGLEN );
2039
2040 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2041 MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002042 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002043
2044 /* Read three messages from the server, last one with an error */
2045 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2046 MSGLEN - 1 ) == MSGLEN - 1 );
2047
2048 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2049 == MSGLEN );
2050
2051 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2052
2053 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002054 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002055
2056 exit:
2057 mbedtls_message_socket_close( &server_context );
2058 mbedtls_message_socket_close( &client_context );
2059}
2060/* END_CASE */
2061
2062/* BEGIN_CASE */
2063void ssl_message_mock_socket_overflow( )
2064{
2065 enum { MSGLEN = 10 };
2066 unsigned char message[MSGLEN], received[MSGLEN];
2067 mbedtls_mock_socket client, server;
2068 unsigned i;
2069 mbedtls_test_message_queue server_queue, client_queue;
2070 mbedtls_test_message_socket_context server_context, client_context;
2071
2072 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2073 &server,
2074 &server_context ) == 0 );
2075
2076 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2077 &client,
2078 &client_context ) == 0 );
2079
2080 /* Fill up the buffer with structured data so that unwanted changes
2081 * can be detected */
2082 for( i = 0; i < MSGLEN; i++ )
2083 {
2084 message[i] = i & 0xFF;
2085 }
2086 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2087 MSGLEN ) );
2088
2089 /* Send two message to the server, second one with an error */
2090 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2091 MSGLEN ) == MSGLEN );
2092
2093 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2094 MSGLEN )
2095 == MBEDTLS_TEST_ERROR_SEND_FAILED );
2096
2097 /* Read the only message from the server */
2098 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2099 == MSGLEN );
2100
2101 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2102
2103 exit:
2104 mbedtls_message_socket_close( &server_context );
2105 mbedtls_message_socket_close( &client_context );
2106}
2107/* END_CASE */
2108
2109/* BEGIN_CASE */
2110void ssl_message_mock_truncated( )
2111{
2112 enum { MSGLEN = 10 };
2113 unsigned char message[MSGLEN], received[MSGLEN];
2114 mbedtls_mock_socket client, server;
2115 unsigned i;
2116 mbedtls_test_message_queue server_queue, client_queue;
2117 mbedtls_test_message_socket_context server_context, client_context;
2118
2119 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2120 &server,
2121 &server_context ) == 0 );
2122
2123 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2124 &client,
2125 &client_context ) == 0 );
2126
2127 memset( received, 0, MSGLEN );
2128 /* Fill up the buffer with structured data so that unwanted changes
2129 * can be detected */
2130 for( i = 0; i < MSGLEN; i++ )
2131 {
2132 message[i] = i & 0xFF;
2133 }
2134 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2135 2 * MSGLEN ) );
2136
2137 /* Send two messages to the server, the second one small enough to fit in the
2138 * receiver's buffer. */
2139 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2140 MSGLEN ) == MSGLEN );
2141 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2142 MSGLEN / 2 ) == MSGLEN / 2 );
2143 /* Read a truncated message from the server */
2144 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2145 == MSGLEN/2 );
2146
2147 /* Test that the first half of the message is valid, and second one isn't */
2148 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2149 TEST_ASSERT( memcmp( message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2 )
2150 != 0 );
2151 memset( received, 0, MSGLEN );
2152
2153 /* Read a full message from the server */
2154 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2155 == MSGLEN / 2 );
2156
2157 /* Test that the first half of the message is valid */
2158 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2159
2160 exit:
2161 mbedtls_message_socket_close( &server_context );
2162 mbedtls_message_socket_close( &client_context );
2163}
2164/* END_CASE */
2165
2166/* BEGIN_CASE */
2167void ssl_message_mock_socket_read_error( )
2168{
2169 enum { MSGLEN = 10 };
2170 unsigned char message[MSGLEN], received[MSGLEN];
2171 mbedtls_mock_socket client, server;
2172 unsigned i;
2173 mbedtls_test_message_queue server_queue, client_queue;
2174 mbedtls_test_message_socket_context server_context, client_context;
2175
2176 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2177 &server,
2178 &server_context ) == 0 );
2179
2180 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2181 &client,
2182 &client_context ) == 0 );
2183
2184 /* Fill up the buffer with structured data so that unwanted changes
2185 * can be detected */
2186 for( i = 0; i < MSGLEN; i++ )
2187 {
2188 message[i] = i & 0xFF;
2189 }
2190 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2191 MSGLEN ) );
2192
2193 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2194 MSGLEN ) == MSGLEN );
2195
2196 /* Force a read error by disconnecting the socket by hand */
2197 server.status = 0;
2198 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2199 == MBEDTLS_TEST_ERROR_RECV_FAILED );
2200 /* Return to a valid state */
2201 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
2202
2203 memset( received, 0, sizeof( received ) );
2204
2205 /* Test that even though the server tried to read once disconnected, the
2206 * continuity is preserved */
2207 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2208 == MSGLEN );
2209
2210 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2211
2212 exit:
2213 mbedtls_message_socket_close( &server_context );
2214 mbedtls_message_socket_close( &client_context );
2215}
2216/* END_CASE */
2217
2218/* BEGIN_CASE */
2219void ssl_message_mock_interleaved_one_way( )
2220{
2221 enum { MSGLEN = 10 };
2222 unsigned char message[MSGLEN], received[MSGLEN];
2223 mbedtls_mock_socket client, server;
2224 unsigned i;
2225 mbedtls_test_message_queue server_queue, client_queue;
2226 mbedtls_test_message_socket_context server_context, client_context;
2227
2228 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2229 &server,
2230 &server_context ) == 0 );
2231
2232 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2233 &client,
2234 &client_context ) == 0 );
2235
2236 /* Fill up the buffer with structured data so that unwanted changes
2237 * can be detected */
2238 for( i = 0; i < MSGLEN; i++ )
2239 {
2240 message[i] = i & 0xFF;
2241 }
2242 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2243 MSGLEN*3 ) );
2244
2245 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
2246 * (to wrap around the buffer) */
2247 for( i = 0; i < 2; i++ )
2248 {
2249 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2250 MSGLEN ) == MSGLEN );
2251
2252 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2253 MSGLEN ) == MSGLEN );
2254
2255 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2256 MSGLEN ) == MSGLEN );
2257 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2258 memset( received, 0, sizeof( received ) );
2259 }
2260
2261 for( i = 0; i < 2; i++ )
2262 {
2263 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2264 MSGLEN ) == MSGLEN );
2265
2266 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2267 }
2268 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002269 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002270 exit:
2271 mbedtls_message_socket_close( &server_context );
2272 mbedtls_message_socket_close( &client_context );
2273}
2274/* END_CASE */
2275
2276/* BEGIN_CASE */
2277void ssl_message_mock_interleaved_two_ways( )
2278{
2279 enum { MSGLEN = 10 };
2280 unsigned char message[MSGLEN], received[MSGLEN];
2281 mbedtls_mock_socket client, server;
2282 unsigned i;
2283 mbedtls_test_message_queue server_queue, client_queue;
2284 mbedtls_test_message_socket_context server_context, client_context;
2285
2286 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2287 &server,
2288 &server_context ) == 0 );
2289
2290 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2291 &client,
2292 &client_context ) == 0 );
2293
2294 /* Fill up the buffer with structured data so that unwanted changes
2295 * can be detected */
2296 for( i = 0; i < MSGLEN; i++ )
2297 {
2298 message[i] = i & 0xFF;
2299 }
2300 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2301 MSGLEN*3 ) );
2302
2303 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
2304 * (to wrap around the buffer) both ways. */
2305 for( i = 0; i < 2; i++ )
2306 {
2307 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2308 MSGLEN ) == MSGLEN );
2309
2310 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2311 MSGLEN ) == MSGLEN );
2312
2313 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2314 MSGLEN ) == MSGLEN );
2315
2316 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2317 MSGLEN ) == MSGLEN );
2318
2319 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2320 MSGLEN ) == MSGLEN );
2321
2322 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2323
2324 memset( received, 0, sizeof( received ) );
2325
2326 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2327 MSGLEN ) == MSGLEN );
2328
2329 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2330
2331 memset( received, 0, sizeof( received ) );
2332 }
2333
2334 for( i = 0; i < 2; i++ )
2335 {
2336 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2337 MSGLEN ) == MSGLEN );
2338
2339 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2340 memset( received, 0, sizeof( received ) );
2341
2342 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2343 MSGLEN ) == MSGLEN );
2344
2345 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2346 memset( received, 0, sizeof( received ) );
2347 }
2348
2349 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002350 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002351
2352 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002353 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002354 exit:
2355 mbedtls_message_socket_close( &server_context );
2356 mbedtls_message_socket_close( &client_context );
2357}
2358/* END_CASE */
2359
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002360/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Azim Khan5fcca462018-06-29 11:05:32 +01002361void ssl_dtls_replay( data_t * prevs, data_t * new, int ret )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002362{
Azim Khand30ca132017-06-09 04:32:58 +01002363 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002364 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002365 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002366
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002367 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002368 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002369
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02002370 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
2371 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02002372 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2373 MBEDTLS_SSL_PRESET_DEFAULT ) == 0 );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002374 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002375
2376 /* Read previous record numbers */
Azim Khand30ca132017-06-09 04:32:58 +01002377 for( len = 0; len < prevs->len; len += 6 )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002378 {
Azim Khand30ca132017-06-09 04:32:58 +01002379 memcpy( ssl.in_ctr + 2, prevs->x + len, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002380 mbedtls_ssl_dtls_replay_update( &ssl );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002381 }
2382
2383 /* Check new number */
Azim Khand30ca132017-06-09 04:32:58 +01002384 memcpy( ssl.in_ctr + 2, new->x, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002385 TEST_ASSERT( mbedtls_ssl_dtls_replay_check( &ssl ) == ret );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002387 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002388 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002389}
2390/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002391
2392/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
2393void ssl_set_hostname_twice( char *hostname0, char *hostname1 )
2394{
2395 mbedtls_ssl_context ssl;
2396 mbedtls_ssl_init( &ssl );
2397
2398 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname0 ) == 0 );
2399 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname1 ) == 0 );
2400
2401 mbedtls_ssl_free( &ssl );
2402}
Darryl Green11999bb2018-03-13 15:22:58 +00002403/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00002404
2405/* BEGIN_CASE */
2406void ssl_crypt_record( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002407 int etm, int tag_mode, int ver,
2408 int cid0_len, int cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00002409{
2410 /*
2411 * Test several record encryptions and decryptions
2412 * with plenty of space before and after the data
2413 * within the record buffer.
2414 */
2415
2416 int ret;
2417 int num_records = 16;
2418 mbedtls_ssl_context ssl; /* ONLY for debugging */
2419
2420 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002421 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00002422 size_t const buflen = 512;
2423 mbedtls_record rec, rec_backup;
2424
2425 mbedtls_ssl_init( &ssl );
2426 mbedtls_ssl_transform_init( &t0 );
2427 mbedtls_ssl_transform_init( &t1 );
2428 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002429 etm, tag_mode, ver,
2430 (size_t) cid0_len,
2431 (size_t) cid1_len ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002432
Hanno Becker3ee54212019-04-04 16:31:26 +01002433 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00002434
2435 while( num_records-- > 0 )
2436 {
2437 mbedtls_ssl_transform *t_dec, *t_enc;
2438 /* Take turns in who's sending and who's receiving. */
2439 if( num_records % 3 == 0 )
2440 {
2441 t_dec = &t0;
2442 t_enc = &t1;
2443 }
2444 else
2445 {
2446 t_dec = &t1;
2447 t_enc = &t0;
2448 }
2449
2450 /*
2451 * The record header affects the transformation in two ways:
2452 * 1) It determines the AEAD additional data
2453 * 2) The record counter sometimes determines the IV.
2454 *
2455 * Apart from that, the fields don't have influence.
2456 * In particular, it is currently not the responsibility
2457 * of ssl_encrypt/decrypt_buf to check if the transform
2458 * version matches the record version, or that the
2459 * type is sensible.
2460 */
2461
2462 memset( rec.ctr, num_records, sizeof( rec.ctr ) );
2463 rec.type = 42;
2464 rec.ver[0] = num_records;
2465 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002466#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002467 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002468#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00002469
2470 rec.buf = buf;
2471 rec.buf_len = buflen;
2472 rec.data_offset = 16;
2473 /* Make sure to vary the length to exercise different
2474 * paddings. */
2475 rec.data_len = 1 + num_records;
2476
2477 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2478
2479 /* Make a copy for later comparison */
2480 rec_backup = rec;
2481
2482 /* Encrypt record */
2483 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec,
2484 rnd_std_rand, NULL );
2485 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2486 if( ret != 0 )
2487 {
2488 continue;
2489 }
2490
2491 /* Decrypt record with t_dec */
Hanno Beckerd856c822019-04-29 17:30:59 +01002492 ret = mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec );
2493 TEST_ASSERT( ret == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002494
2495 /* Compare results */
2496 TEST_ASSERT( rec.type == rec_backup.type );
2497 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2498 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2499 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2500 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2501 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2502 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2503 rec_backup.buf + rec_backup.data_offset,
2504 rec.data_len ) == 0 );
2505 }
2506
Hanno Becker81e16a32019-03-01 11:21:44 +00002507exit:
2508
Hanno Beckera18d1322018-01-03 14:27:32 +00002509 /* Cleanup */
2510 mbedtls_ssl_free( &ssl );
2511 mbedtls_ssl_transform_free( &t0 );
2512 mbedtls_ssl_transform_free( &t1 );
2513
Hanno Becker3ee54212019-04-04 16:31:26 +01002514 mbedtls_free( buf );
Hanno Beckera18d1322018-01-03 14:27:32 +00002515}
2516/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002517
2518/* BEGIN_CASE */
2519void ssl_crypt_record_small( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002520 int etm, int tag_mode, int ver,
2521 int cid0_len, int cid1_len )
Hanno Beckerb3268da2018-01-05 15:20:24 +00002522{
2523 /*
2524 * Test pairs of encryption and decryption with an increasing
2525 * amount of space in the record buffer - in more detail:
2526 * 1) Try to encrypt with 0, 1, 2, ... bytes available
2527 * in front of the plaintext, and expect the encryption
2528 * to succeed starting from some offset. Always keep
2529 * enough space in the end of the buffer.
2530 * 2) Try to encrypt with 0, 1, 2, ... bytes available
2531 * at the end of the plaintext, and expect the encryption
2532 * to succeed starting from some offset. Always keep
2533 * enough space at the beginning of the buffer.
2534 * 3) Try to encrypt with 0, 1, 2, ... bytes available
2535 * both at the front and end of the plaintext,
2536 * and expect the encryption to succeed starting from
2537 * some offset.
2538 *
2539 * If encryption succeeds, check that decryption succeeds
2540 * and yields the original record.
2541 */
2542
2543 mbedtls_ssl_context ssl; /* ONLY for debugging */
2544
2545 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002546 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01002547 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002548 mbedtls_record rec, rec_backup;
2549
2550 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01002551 int mode; /* Mode 1, 2 or 3 as explained above */
2552 size_t offset; /* Available space at beginning/end/both */
2553 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002554
Hanno Beckerd856c822019-04-29 17:30:59 +01002555 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
2556 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002557
2558 int seen_success; /* Indicates if in the current mode we've
2559 * already seen a successful test. */
2560
2561 mbedtls_ssl_init( &ssl );
2562 mbedtls_ssl_transform_init( &t0 );
2563 mbedtls_ssl_transform_init( &t1 );
2564 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002565 etm, tag_mode, ver,
2566 (size_t) cid0_len,
2567 (size_t) cid1_len ) == 0 );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002568
Hanno Becker3ee54212019-04-04 16:31:26 +01002569 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002570
2571 for( mode=1; mode <= 3; mode++ )
2572 {
2573 seen_success = 0;
2574 for( offset=0; offset <= threshold; offset++ )
2575 {
2576 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01002577 t_dec = &t0;
2578 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002579
2580 memset( rec.ctr, offset, sizeof( rec.ctr ) );
2581 rec.type = 42;
2582 rec.ver[0] = offset;
2583 rec.ver[1] = offset;
2584 rec.buf = buf;
2585 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002586#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002587 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002588#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002589
2590 switch( mode )
2591 {
2592 case 1: /* Space in the beginning */
2593 rec.data_offset = offset;
2594 rec.data_len = buflen - offset - default_post_padding;
2595 break;
2596
2597 case 2: /* Space in the end */
2598 rec.data_offset = default_pre_padding;
2599 rec.data_len = buflen - default_pre_padding - offset;
2600 break;
2601
2602 case 3: /* Space in the beginning and end */
2603 rec.data_offset = offset;
2604 rec.data_len = buflen - 2 * offset;
2605 break;
2606
2607 default:
2608 TEST_ASSERT( 0 );
2609 break;
2610 }
2611
2612 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2613
2614 /* Make a copy for later comparison */
2615 rec_backup = rec;
2616
2617 /* Encrypt record */
2618 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec, rnd_std_rand, NULL );
2619
2620 if( ( mode == 1 || mode == 2 ) && seen_success )
2621 {
2622 TEST_ASSERT( ret == 0 );
2623 }
2624 else
2625 {
2626 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2627 if( ret == 0 )
2628 seen_success = 1;
2629 }
2630
2631 if( ret != 0 )
2632 continue;
2633
2634 /* Decrypt record with t_dec */
2635 TEST_ASSERT( mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec ) == 0 );
2636
2637 /* Compare results */
2638 TEST_ASSERT( rec.type == rec_backup.type );
2639 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2640 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2641 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2642 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2643 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2644 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2645 rec_backup.buf + rec_backup.data_offset,
2646 rec.data_len ) == 0 );
2647 }
2648
2649 TEST_ASSERT( seen_success == 1 );
2650 }
2651
Hanno Becker81e16a32019-03-01 11:21:44 +00002652exit:
2653
Hanno Beckerb3268da2018-01-05 15:20:24 +00002654 /* Cleanup */
2655 mbedtls_ssl_free( &ssl );
2656 mbedtls_ssl_transform_free( &t0 );
2657 mbedtls_ssl_transform_free( &t1 );
2658
Hanno Becker3ee54212019-04-04 16:31:26 +01002659 mbedtls_free( buf );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002660}
2661/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03002662
2663/* BEGIN_CASE */
2664void ssl_tls_prf( int type, data_t * secret, data_t * random,
2665 char *label, data_t *result_hex_str, int exp_ret )
2666{
2667 unsigned char *output;
2668
2669 output = mbedtls_calloc( 1, result_hex_str->len );
2670 if( output == NULL )
2671 goto exit;
2672
Ron Eldor6b9b1b82019-05-15 17:04:33 +03002673#if defined(MBEDTLS_USE_PSA_CRYPTO)
2674 TEST_ASSERT( psa_crypto_init() == 0 );
2675#endif
2676
Ron Eldor824ad7b2019-05-13 14:09:00 +03002677 TEST_ASSERT( mbedtls_ssl_tls_prf( type, secret->x, secret->len,
2678 label, random->x, random->len,
2679 output, result_hex_str->len ) == exp_ret );
2680
2681 if( exp_ret == 0 )
2682 {
2683 TEST_ASSERT( hexcmp( output, result_hex_str->x,
2684 result_hex_str->len, result_hex_str->len ) == 0 );
2685 }
2686exit:
2687
2688 mbedtls_free( output );
2689}
2690/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002691
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002692/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002693void ssl_serialize_session_save_load( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002694{
2695 mbedtls_ssl_session original, restored;
2696 unsigned char *buf = NULL;
2697 size_t len;
2698
2699 /*
2700 * Test that a save-load pair is the identity
2701 */
2702
2703 mbedtls_ssl_session_init( &original );
2704 mbedtls_ssl_session_init( &restored );
2705
2706 /* Prepare a dummy session to work on */
2707 TEST_ASSERT( ssl_populate_session( &original, ticket_len, crt_file ) == 0 );
2708
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002709 /* Serialize it */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002710 TEST_ASSERT( mbedtls_ssl_session_save( &original, NULL, 0, &len )
2711 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2712 TEST_ASSERT( ( buf = mbedtls_calloc( 1, len ) ) != NULL );
2713 TEST_ASSERT( mbedtls_ssl_session_save( &original, buf, len, &len )
2714 == 0 );
2715
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002716 /* Restore session from serialized data */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002717 TEST_ASSERT( mbedtls_ssl_session_load( &restored, buf, len) == 0 );
2718
2719 /*
2720 * Make sure both session structures are identical
2721 */
2722#if defined(MBEDTLS_HAVE_TIME)
2723 TEST_ASSERT( original.start == restored.start );
2724#endif
2725 TEST_ASSERT( original.ciphersuite == restored.ciphersuite );
2726 TEST_ASSERT( original.compression == restored.compression );
2727 TEST_ASSERT( original.id_len == restored.id_len );
2728 TEST_ASSERT( memcmp( original.id,
2729 restored.id, sizeof( original.id ) ) == 0 );
2730 TEST_ASSERT( memcmp( original.master,
2731 restored.master, sizeof( original.master ) ) == 0 );
2732
2733#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002734#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002735 TEST_ASSERT( ( original.peer_cert == NULL ) ==
2736 ( restored.peer_cert == NULL ) );
2737 if( original.peer_cert != NULL )
2738 {
2739 TEST_ASSERT( original.peer_cert->raw.len ==
2740 restored.peer_cert->raw.len );
2741 TEST_ASSERT( memcmp( original.peer_cert->raw.p,
2742 restored.peer_cert->raw.p,
2743 original.peer_cert->raw.len ) == 0 );
2744 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002745#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2746 TEST_ASSERT( original.peer_cert_digest_type ==
2747 restored.peer_cert_digest_type );
2748 TEST_ASSERT( original.peer_cert_digest_len ==
2749 restored.peer_cert_digest_len );
2750 TEST_ASSERT( ( original.peer_cert_digest == NULL ) ==
2751 ( restored.peer_cert_digest == NULL ) );
2752 if( original.peer_cert_digest != NULL )
2753 {
2754 TEST_ASSERT( memcmp( original.peer_cert_digest,
2755 restored.peer_cert_digest,
2756 original.peer_cert_digest_len ) == 0 );
2757 }
2758#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2759#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002760 TEST_ASSERT( original.verify_result == restored.verify_result );
2761
2762#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
2763 TEST_ASSERT( original.ticket_len == restored.ticket_len );
2764 if( original.ticket_len != 0 )
2765 {
2766 TEST_ASSERT( original.ticket != NULL );
2767 TEST_ASSERT( restored.ticket != NULL );
2768 TEST_ASSERT( memcmp( original.ticket,
2769 restored.ticket, original.ticket_len ) == 0 );
2770 }
2771 TEST_ASSERT( original.ticket_lifetime == restored.ticket_lifetime );
2772#endif
2773
2774#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2775 TEST_ASSERT( original.mfl_code == restored.mfl_code );
2776#endif
2777
2778#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2779 TEST_ASSERT( original.trunc_hmac == restored.trunc_hmac );
2780#endif
2781
2782#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2783 TEST_ASSERT( original.encrypt_then_mac == restored.encrypt_then_mac );
2784#endif
2785
2786exit:
2787 mbedtls_ssl_session_free( &original );
2788 mbedtls_ssl_session_free( &restored );
2789 mbedtls_free( buf );
2790}
2791/* END_CASE */
2792
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02002793/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002794void ssl_serialize_session_load_save( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002795{
2796 mbedtls_ssl_session session;
2797 unsigned char *buf1 = NULL, *buf2 = NULL;
2798 size_t len0, len1, len2;
2799
2800 /*
2801 * Test that a load-save pair is the identity
2802 */
2803
2804 mbedtls_ssl_session_init( &session );
2805
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002806 /* Prepare a dummy session to work on */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002807 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002808
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002809 /* Get desired buffer size for serializing */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002810 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &len0 )
2811 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2812
2813 /* Allocate first buffer */
2814 buf1 = mbedtls_calloc( 1, len0 );
2815 TEST_ASSERT( buf1 != NULL );
2816
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002817 /* Serialize to buffer and free live session */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002818 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf1, len0, &len1 )
2819 == 0 );
2820 TEST_ASSERT( len0 == len1 );
2821 mbedtls_ssl_session_free( &session );
2822
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002823 /* Restore session from serialized data */
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02002824 TEST_ASSERT( mbedtls_ssl_session_load( &session, buf1, len1 ) == 0 );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002825
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002826 /* Allocate second buffer and serialize to it */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002827 buf2 = mbedtls_calloc( 1, len0 );
Manuel Pégourié-Gonnardb4079902019-05-24 09:52:10 +02002828 TEST_ASSERT( buf2 != NULL );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002829 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf2, len0, &len2 )
2830 == 0 );
2831
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002832 /* Make sure both serialized versions are identical */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002833 TEST_ASSERT( len1 == len2 );
2834 TEST_ASSERT( memcmp( buf1, buf2, len1 ) == 0 );
2835
2836exit:
2837 mbedtls_ssl_session_free( &session );
2838 mbedtls_free( buf1 );
2839 mbedtls_free( buf2 );
2840}
2841/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002842
2843/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002844void ssl_serialize_session_save_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002845{
2846 mbedtls_ssl_session session;
2847 unsigned char *buf = NULL;
2848 size_t good_len, bad_len, test_len;
2849
2850 /*
2851 * Test that session_save() fails cleanly on small buffers
2852 */
2853
2854 mbedtls_ssl_session_init( &session );
2855
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002856 /* Prepare dummy session and get serialized size */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002857 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002858 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
2859 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2860
2861 /* Try all possible bad lengths */
2862 for( bad_len = 1; bad_len < good_len; bad_len++ )
2863 {
2864 /* Allocate exact size so that asan/valgrind can detect any overwrite */
2865 mbedtls_free( buf );
2866 TEST_ASSERT( ( buf = mbedtls_calloc( 1, bad_len ) ) != NULL );
2867 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf, bad_len,
2868 &test_len )
2869 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2870 TEST_ASSERT( test_len == good_len );
2871 }
2872
2873exit:
2874 mbedtls_ssl_session_free( &session );
2875 mbedtls_free( buf );
2876}
2877/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002878
2879/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002880void ssl_serialize_session_load_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002881{
2882 mbedtls_ssl_session session;
2883 unsigned char *good_buf = NULL, *bad_buf = NULL;
2884 size_t good_len, bad_len;
2885
2886 /*
2887 * Test that session_load() fails cleanly on small buffers
2888 */
2889
2890 mbedtls_ssl_session_init( &session );
2891
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002892 /* Prepare serialized session data */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002893 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002894 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
2895 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2896 TEST_ASSERT( ( good_buf = mbedtls_calloc( 1, good_len ) ) != NULL );
2897 TEST_ASSERT( mbedtls_ssl_session_save( &session, good_buf, good_len,
2898 &good_len ) == 0 );
2899 mbedtls_ssl_session_free( &session );
2900
2901 /* Try all possible bad lengths */
2902 for( bad_len = 0; bad_len < good_len; bad_len++ )
2903 {
2904 /* Allocate exact size so that asan/valgrind can detect any overread */
2905 mbedtls_free( bad_buf );
2906 bad_buf = mbedtls_calloc( 1, bad_len ? bad_len : 1 );
2907 TEST_ASSERT( bad_buf != NULL );
2908 memcpy( bad_buf, good_buf, bad_len );
2909
2910 TEST_ASSERT( mbedtls_ssl_session_load( &session, bad_buf, bad_len )
2911 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2912 }
2913
2914exit:
2915 mbedtls_ssl_session_free( &session );
2916 mbedtls_free( good_buf );
2917 mbedtls_free( bad_buf );
2918}
2919/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002920
Hanno Becker363b6462019-05-29 12:44:28 +01002921/* BEGIN_CASE */
2922void ssl_session_serialize_version_check( int corrupt_major,
Hanno Becker861d0bb2019-05-21 16:39:30 +01002923 int corrupt_minor,
2924 int corrupt_patch,
2925 int corrupt_config )
2926{
Hanno Becker363b6462019-05-29 12:44:28 +01002927 unsigned char serialized_session[ 2048 ];
2928 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002929 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002930 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002931 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2932 corrupt_minor == 1,
2933 corrupt_patch == 1,
2934 corrupt_config == 1,
2935 corrupt_config == 1 };
2936
Hanno Becker861d0bb2019-05-21 16:39:30 +01002937 mbedtls_ssl_session_init( &session );
2938
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002939 /* Infer length of serialized session. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002940 TEST_ASSERT( mbedtls_ssl_session_save( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01002941 serialized_session,
2942 sizeof( serialized_session ),
2943 &serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002944
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002945 mbedtls_ssl_session_free( &session );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002946
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002947 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002948 * de-serialize the session - double-check that. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002949 TEST_ASSERT( mbedtls_ssl_session_load( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01002950 serialized_session,
2951 serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002952 mbedtls_ssl_session_free( &session );
2953
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002954 /* Go through the bytes in the serialized session header and
2955 * corrupt them bit-by-bit. */
2956 for( cur_byte = 0; cur_byte < sizeof( should_corrupt_byte ); cur_byte++ )
Hanno Becker861d0bb2019-05-21 16:39:30 +01002957 {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002958 int cur_bit;
2959 unsigned char * const byte = &serialized_session[ cur_byte ];
2960
2961 if( should_corrupt_byte[ cur_byte ] == 0 )
2962 continue;
2963
2964 for( cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++ )
2965 {
2966 unsigned char const corrupted_bit = 0x1u << cur_bit;
2967 /* Modify a single bit in the serialized session. */
2968 *byte ^= corrupted_bit;
2969
2970 /* Attempt to deserialize */
2971 TEST_ASSERT( mbedtls_ssl_session_load( &session,
2972 serialized_session,
2973 serialized_session_len ) ==
Hanno Beckerf9b33032019-06-03 12:58:39 +01002974 MBEDTLS_ERR_SSL_VERSION_MISMATCH );
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002975
2976 /* Undo the change */
2977 *byte ^= corrupted_bit;
2978 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002979 }
2980
Hanno Becker861d0bb2019-05-21 16:39:30 +01002981}
2982/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002983
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01002984/* 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 +01002985void mbedtls_endpoint_sanity( int endpoint_type )
2986{
2987 enum { BUFFSIZE = 1024 };
2988 mbedtls_endpoint ep;
2989 int ret = -1;
2990
Andrzej Kurekb2980742020-02-02 19:25:26 -05002991 ret = mbedtls_endpoint_init( NULL, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002992 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
2993
Andrzej Kurekb2980742020-02-02 19:25:26 -05002994 ret = mbedtls_endpoint_certificate_init( NULL, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002995 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
2996
Andrzej Kurekb2980742020-02-02 19:25:26 -05002997 ret = mbedtls_endpoint_init( &ep, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002998 TEST_ASSERT( ret == 0 );
2999
3000exit:
3001 mbedtls_endpoint_free( &ep );
3002}
3003/* END_CASE */
3004
Andrzej Kurekb2980742020-02-02 19:25:26 -05003005/* 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 +01003006void move_handshake_to_state(int endpoint_type, int state, int need_pass)
3007{
3008 enum { BUFFSIZE = 1024 };
3009 mbedtls_endpoint base_ep, second_ep;
3010 int ret = -1;
3011
Andrzej Kurekb2980742020-02-02 19:25:26 -05003012 ret = mbedtls_endpoint_init( &base_ep, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003013 TEST_ASSERT( ret == 0 );
3014
3015 ret = mbedtls_endpoint_init( &second_ep,
3016 ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ?
Andrzej Kurekb2980742020-02-02 19:25:26 -05003017 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
3018 MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003019 TEST_ASSERT( ret == 0 );
3020
3021 ret = mbedtls_mock_socket_connect( &(base_ep.socket),
3022 &(second_ep.socket),
3023 BUFFSIZE );
3024 TEST_ASSERT( ret == 0 );
3025
3026 ret = mbedtls_move_handshake_to_state( &(base_ep.ssl),
3027 &(second_ep.ssl),
3028 state );
3029 if( need_pass )
3030 {
3031 TEST_ASSERT( ret == 0 );
3032 TEST_ASSERT( base_ep.ssl.state == state );
3033 }
3034 else
3035 {
3036 TEST_ASSERT( ret != 0 );
3037 TEST_ASSERT( base_ep.ssl.state != state );
3038 }
3039
3040exit:
3041 mbedtls_endpoint_free( &base_ep );
3042 mbedtls_endpoint_free( &second_ep );
3043}
3044/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003045
3046/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15 */
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003047void handshake( const char *cipher, int version, int pk_alg,
3048 data_t *psk_str )
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003049{
3050 /* forced_ciphersuite needs to last until the end of the handshake */
3051 int forced_ciphersuite[2];
3052 enum { BUFFSIZE = 1024 };
3053 mbedtls_endpoint client, server;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003054#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3055 const char *psk_identity = "foo";
3056#else
3057 (void) psk_str;
3058#endif
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003059 /* Client side */
3060 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
3061 pk_alg ) == 0 );
3062
3063 mbedtls_ssl_conf_min_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3064 version );
3065 mbedtls_ssl_conf_max_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3066 version );
3067
3068 if( strlen( cipher ) > 0 )
3069 {
3070 set_ciphersuite( &client.conf, cipher, forced_ciphersuite );
3071 }
3072 /* Server side */
3073 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
3074 pk_alg ) == 0 );
3075
3076 mbedtls_ssl_conf_min_version( &server.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3077 version );
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003078#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3079 if( psk_str->len > 0 )
3080 {
3081 TEST_ASSERT( mbedtls_ssl_conf_psk( &client.conf, psk_str->x,
3082 psk_str->len,
3083 (const unsigned char *) psk_identity,
3084 strlen( psk_identity ) ) == 0 );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003085
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003086 TEST_ASSERT( mbedtls_ssl_conf_psk( &server.conf, psk_str->x,
3087 psk_str->len,
3088 (const unsigned char *) psk_identity,
3089 strlen( psk_identity ) ) == 0 );
3090
3091 mbedtls_ssl_conf_psk_cb( &server.conf, psk_dummy_callback, NULL );
3092 }
3093#endif
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003094 TEST_ASSERT( mbedtls_mock_socket_connect( &(client.socket),
3095 &(server.socket),
3096 BUFFSIZE ) == 0 );
3097
3098 TEST_ASSERT( mbedtls_move_handshake_to_state( &(client.ssl),
3099 &(server.ssl),
3100 MBEDTLS_SSL_HANDSHAKE_OVER )
3101 == 0 );
3102 TEST_ASSERT( client.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3103 TEST_ASSERT( server.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3104
3105exit:
3106 mbedtls_endpoint_free( &client );
3107 mbedtls_endpoint_free( &server );
3108}
3109/* END_CASE */
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01003110
3111/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15 */
3112void send_application_data( int mfl, int cli_msg_len, int srv_msg_len,
3113 const int expected_cli_frames,
3114 const int expected_srv_frames )
3115{
3116 enum { BUFFSIZE = 2048 };
3117 mbedtls_endpoint server, client;
3118 unsigned char *cli_msg_buf = malloc( cli_msg_len );
3119 unsigned char *cli_in_buf = malloc( srv_msg_len );
3120 unsigned char *srv_msg_buf = malloc( srv_msg_len );
3121 unsigned char *srv_in_buf = malloc( cli_msg_len );
3122 int ret = -1;
3123
3124 ret = mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER, MBEDTLS_PK_RSA );
3125 TEST_ASSERT( ret == 0 );
3126
3127 ret = mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_PK_RSA );
3128 TEST_ASSERT( ret == 0 );
3129
3130#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3131 ret = mbedtls_ssl_conf_max_frag_len( &(server.conf), (unsigned char) mfl );
3132 TEST_ASSERT( ret == 0 );
3133
3134 ret = mbedtls_ssl_conf_max_frag_len( &(client.conf), (unsigned char) mfl );
3135 TEST_ASSERT( ret == 0 );
3136#else
3137 TEST_ASSERT( MBEDTLS_SSL_MAX_FRAG_LEN_NONE == mfl );
3138#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
3139
3140 ret = mbedtls_mock_socket_connect( &(server.socket), &(client.socket),
3141 BUFFSIZE );
3142 TEST_ASSERT( ret == 0 );
3143
3144 ret = mbedtls_move_handshake_to_state( &(client.ssl),
3145 &(server.ssl),
3146 MBEDTLS_SSL_HANDSHAKE_OVER );
3147 TEST_ASSERT( ret == 0 );
3148 TEST_ASSERT( client.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3149 TEST_ASSERT( server.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3150
3151 /* Perform this test with two message types. At first use a message
3152 * consisting of only 0x00 for the client and only 0xFF for the server.
3153 * At the second time use message with generated data */
3154 for( int msg_type = 0; msg_type < 2; msg_type++ )
3155 {
3156 int cli_writen = 0;
3157 int srv_writen = 0;
3158 int cli_read = 0;
3159 int srv_read = 0;
3160 int cli_fragments = 0;
3161 int srv_fragments = 0;
3162
3163 if( msg_type == 0 )
3164 {
3165 memset( cli_msg_buf, 0x00, cli_msg_len );
3166 memset( srv_msg_buf, 0xff, srv_msg_len );
3167 }
3168 else
3169 {
3170 int j = 0;
3171 for( int i = 0; i < cli_msg_len; i++ )
3172 cli_msg_buf[i] = j++ & 0xFF;
3173 for( int i = 0; i < srv_msg_len; i++ )
3174 srv_msg_buf[i] = ( j -= 5 ) & 0xFF;
3175 }
3176
3177 while( cli_read < srv_msg_len || srv_read < cli_msg_len )
3178 {
3179 /* Client sending */
3180 if( cli_msg_len > cli_writen )
3181 {
3182 ret = mbedtls_ssl_write_fragment( &(client.ssl), cli_msg_buf,
3183 cli_msg_len, &cli_writen, &cli_fragments );
3184 TEST_ASSERT( ( ret >= 0 && ret <= cli_msg_len ) ||
3185 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
3186 }
3187
3188 /* Server sending */
3189 if( srv_msg_len > srv_writen )
3190 {
3191 ret = mbedtls_ssl_write_fragment( &(server.ssl), srv_msg_buf,
3192 srv_msg_len, &srv_writen, &srv_fragments );
3193 TEST_ASSERT( ( ret >= 0 && ret <= srv_msg_len ) ||
3194 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
3195 }
3196
3197 /* Client reading */
3198 if( cli_read < srv_msg_len )
3199 {
3200 ret = mbedtls_ssl_read_fragment( &(client.ssl), cli_in_buf,
3201 srv_msg_len, &cli_read );
3202 TEST_ASSERT( ( ret >= 0 && ret <= srv_msg_len ) ||
3203 ret == MBEDTLS_ERR_SSL_WANT_READ );
3204 }
3205
3206 /* Server reading */
3207 if( srv_read < cli_msg_len )
3208 {
3209 ret = mbedtls_ssl_read_fragment( &(server.ssl), srv_in_buf,
3210 cli_msg_len, &srv_read );
3211 TEST_ASSERT( ( ret >= 0 && ret <= cli_msg_len ) ||
3212 ret == MBEDTLS_ERR_SSL_WANT_READ );
3213 }
3214 }
3215
3216 TEST_ASSERT( 0 == memcmp( cli_msg_buf, srv_in_buf, cli_msg_len ) );
3217 TEST_ASSERT( 0 == memcmp( srv_msg_buf, cli_in_buf, srv_msg_len ) );
3218 TEST_ASSERT( cli_fragments == expected_cli_frames );
3219 TEST_ASSERT( srv_fragments == expected_srv_frames );
3220 }
3221
3222exit:
3223 mbedtls_endpoint_free( &client );
3224 mbedtls_endpoint_free( &server );
3225 free( cli_msg_buf );
3226 free( cli_in_buf );
3227 free( srv_msg_buf );
3228 free( srv_in_buf );
3229}
3230/* END_CASE */