blob: b9b7b1857e5c29e3f0f53873287ebeb7c7bfdc03 [file] [log] [blame]
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include <mbedtls/ssl.h>
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +02003#include <mbedtls/ssl_internal.h>
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004#include <mbedtls/ctr_drbg.h>
5#include <mbedtls/entropy.h>
6#include <mbedtls/certs.h>
Andrzej Kurek941962e2020-02-07 09:20:32 -05007#include <mbedtls/timing.h>
Janos Follath6264e662019-11-26 11:11:15 +00008
9/*
10 * Buffer structure for custom I/O callbacks.
11 */
12
13typedef struct mbedtls_test_buffer
14{
15 size_t start;
16 size_t content_length;
17 size_t capacity;
18 unsigned char *buffer;
19} mbedtls_test_buffer;
20
21/*
22 * Initialises \p buf. After calling this function it is safe to call
23 * `mbedtls_test_buffer_free()` on \p buf.
24 */
25void mbedtls_test_buffer_init( mbedtls_test_buffer *buf )
26{
27 memset( buf, 0, sizeof( *buf ) );
28}
29
30/*
31 * Sets up \p buf. After calling this function it is safe to call
32 * `mbedtls_test_buffer_put()` and `mbedtls_test_buffer_get()` on \p buf.
33 */
34int mbedtls_test_buffer_setup( mbedtls_test_buffer *buf, size_t capacity )
35{
36 buf->buffer = (unsigned char*) mbedtls_calloc( capacity,
37 sizeof(unsigned char) );
38 if( NULL == buf->buffer )
39 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
40 buf->capacity = capacity;
41
42 return 0;
43}
44
45void mbedtls_test_buffer_free( mbedtls_test_buffer *buf )
46{
47 if( buf->buffer != NULL )
48 mbedtls_free( buf->buffer );
49
50 memset( buf, 0, sizeof( *buf ) );
51}
52
53/*
54 * Puts \p input_len bytes from the \p input buffer into the ring buffer \p buf.
55 *
56 * \p buf must have been initialized and set up by calling
57 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
58 *
59 * \retval \p input_len, if the data fits.
60 * \retval 0 <= value < \p input_len, if the data does not fit.
61 * \retval -1, if \p buf is NULL, it hasn't been set up or \p input_len is not
62 * zero and \p input is NULL.
63 */
64int mbedtls_test_buffer_put( mbedtls_test_buffer *buf,
Piotr Nowicki2a1f1782020-01-13 09:42:10 +010065 const unsigned char *input, size_t input_len )
Janos Follath6264e662019-11-26 11:11:15 +000066{
67 size_t overflow = 0;
68
69 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
70 return -1;
71
72 /* Reduce input_len to a number that fits in the buffer. */
73 if ( ( buf->content_length + input_len ) > buf->capacity )
74 {
75 input_len = buf->capacity - buf->content_length;
76 }
77
78 if( input == NULL )
79 {
80 return ( input_len == 0 ) ? 0 : -1;
81 }
82
Piotr Nowickifb437d72020-01-13 16:59:12 +010083 /* Check if the buffer has not come full circle and free space is not in
84 * the middle */
85 if( buf->start + buf->content_length < buf->capacity )
Janos Follath6264e662019-11-26 11:11:15 +000086 {
Piotr Nowickifb437d72020-01-13 16:59:12 +010087
88 /* Calculate the number of bytes that need to be placed at lower memory
89 * address */
90 if( buf->start + buf->content_length + input_len
91 > buf->capacity )
92 {
93 overflow = ( buf->start + buf->content_length + input_len )
94 % buf->capacity;
95 }
96
97 memcpy( buf->buffer + buf->start + buf->content_length, input,
98 input_len - overflow );
99 memcpy( buf->buffer, input + input_len - overflow, overflow );
100
101 }
102 else
103 {
104 /* The buffer has come full circle and free space is in the middle */
105 memcpy( buf->buffer + buf->start + buf->content_length - buf->capacity,
106 input, input_len );
Janos Follath6264e662019-11-26 11:11:15 +0000107 }
108
Janos Follath6264e662019-11-26 11:11:15 +0000109 buf->content_length += input_len;
Janos Follath6264e662019-11-26 11:11:15 +0000110 return input_len;
111}
112
113/*
Andrzej Kurekf7774142020-01-22 06:34:59 -0500114 * Gets \p output_len bytes from the ring buffer \p buf into the
115 * \p output buffer. The output buffer can be NULL, in this case a part of the
116 * ring buffer will be dropped, if the requested length is available.
Janos Follath6264e662019-11-26 11:11:15 +0000117 *
118 * \p buf must have been initialized and set up by calling
119 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
120 *
121 * \retval \p output_len, if the data is available.
122 * \retval 0 <= value < \p output_len, if the data is not available.
Andrzej Kurekf7774142020-01-22 06:34:59 -0500123 * \retval -1, if \buf is NULL or it hasn't been set up.
Janos Follath6264e662019-11-26 11:11:15 +0000124 */
125int mbedtls_test_buffer_get( mbedtls_test_buffer *buf,
126 unsigned char* output, size_t output_len )
127{
128 size_t overflow = 0;
129
130 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
131 return -1;
132
Andrzej Kurekf7774142020-01-22 06:34:59 -0500133 if( output == NULL && output_len == 0 )
134 return 0;
Janos Follath6264e662019-11-26 11:11:15 +0000135
136 if( buf->content_length < output_len )
137 output_len = buf->content_length;
138
139 /* Calculate the number of bytes that need to be drawn from lower memory
140 * address */
141 if( buf->start + output_len > buf->capacity )
142 {
143 overflow = ( buf->start + output_len ) % buf->capacity;
144 }
145
Andrzej Kurekf7774142020-01-22 06:34:59 -0500146 if( output != NULL )
147 {
148 memcpy( output, buf->buffer + buf->start, output_len - overflow );
149 memcpy( output + output_len - overflow, buf->buffer, overflow );
150 }
151
Janos Follath6264e662019-11-26 11:11:15 +0000152 buf->content_length -= output_len;
153 buf->start = ( buf->start + output_len ) % buf->capacity;
154
155 return output_len;
156}
157
Hanno Beckera18d1322018-01-03 14:27:32 +0000158/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500159 * Errors used in the message transport mock tests
160 */
161 #define MBEDTLS_TEST_ERROR_ARG_NULL -11
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500162 #define MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED -44
163
164/*
165 * Context for a message metadata queue (fifo) that is on top of the ring buffer.
166 */
167typedef struct mbedtls_test_message_queue
168{
169 size_t *messages;
170 int pos;
171 int num;
172 int capacity;
173} mbedtls_test_message_queue;
174
175/*
176 * Setup and free functions for the message metadata queue.
177 *
178 * \p capacity describes the number of message metadata chunks that can be held
179 * within the queue.
180 *
181 * \retval 0, if a metadata queue of a given length can be allocated.
182 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation failed.
183 */
184int mbedtls_test_message_queue_setup( mbedtls_test_message_queue *queue,
185 size_t capacity )
186{
187 queue->messages = (size_t*) mbedtls_calloc( capacity, sizeof(size_t) );
188 if( NULL == queue->messages )
189 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
190
191 queue->capacity = capacity;
192 queue->pos = 0;
193 queue->num = 0;
194
195 return 0;
196}
197
198void mbedtls_test_message_queue_free( mbedtls_test_message_queue *queue )
199{
200 if( queue == NULL )
201 return;
202
203 if( queue->messages != NULL )
204 mbedtls_free( queue->messages );
205
206 memset( queue, 0, sizeof( *queue ) );
207}
208
209/*
210 * Push message length information onto the message metadata queue.
211 * This will become the last element to leave it (fifo).
212 *
213 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500214 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the queue is full.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500215 * \retval \p len, if the push was successful.
216 */
217int mbedtls_test_message_queue_push_info( mbedtls_test_message_queue *queue,
218 size_t len )
219{
220 int place;
221 if( queue == NULL )
222 return MBEDTLS_TEST_ERROR_ARG_NULL;
223
224 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500225 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500226
227 place = ( queue->pos + queue->num ) % queue->capacity;
228 queue->messages[place] = len;
229 queue->num++;
230 return len;
231}
232
233/*
234 * Pop information about the next message length from the queue. This will be
235 * the oldest inserted message length(fifo). \p msg_len can be null, in which
236 * case the data will be popped from the queue but not copied anywhere.
237 *
238 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500239 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500240 * \retval message length, if the pop was successful, up to the given
241 \p buf_len.
242 */
243int mbedtls_test_message_queue_pop_info( mbedtls_test_message_queue *queue,
244 size_t buf_len )
245{
246 size_t message_length;
247 if( queue == NULL )
248 return MBEDTLS_TEST_ERROR_ARG_NULL;
249 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500250 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500251
252 message_length = queue->messages[queue->pos];
253 queue->messages[queue->pos] = 0;
254 queue->num--;
255 queue->pos++;
256 queue->pos %= queue->capacity;
257 if( queue->pos < 0 )
258 queue->pos += queue->capacity;
259
260 return ( message_length > buf_len ) ? buf_len : message_length;
261}
262
263/*
264 * Take a peek on the info about the next message length from the queue.
265 * This will be the oldest inserted message length(fifo).
266 *
267 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500268 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500269 * \retval 0, if the peek was successful.
270 * \retval MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
271 * too small to fit the message. In this case the \p msg_len will be
272 * set to the full message length so that the
273 * caller knows what portion of the message can be dropped.
274 */
275int mbedtls_test_message_queue_peek_info( mbedtls_test_message_queue *queue,
276 size_t buf_len, size_t* msg_len )
277{
278 if( queue == NULL || msg_len == NULL )
279 return MBEDTLS_TEST_ERROR_ARG_NULL;
280 if( queue->num == 0 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500281 return MBEDTLS_ERR_SSL_WANT_READ;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500282
283 *msg_len = queue->messages[queue->pos];
284 return ( *msg_len > buf_len ) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
285}
286/*
Janos Follath031827f2019-11-27 11:12:14 +0000287 * Context for the I/O callbacks simulating network connection.
288 */
289
290#define MBEDTLS_MOCK_SOCKET_CONNECTED 1
291
292typedef struct mbedtls_mock_socket
293{
294 int status;
295 mbedtls_test_buffer *input;
296 mbedtls_test_buffer *output;
297 struct mbedtls_mock_socket *peer;
298} mbedtls_mock_socket;
299
300/*
301 * Setup and teardown functions for mock sockets.
302 */
303void mbedtls_mock_socket_init( mbedtls_mock_socket *socket )
304{
305 memset( socket, 0, sizeof( *socket ) );
306}
307
308/*
309 * Closes the socket \p socket.
310 *
311 * \p socket must have been previously initialized by calling
312 * mbedtls_mock_socket_init().
313 *
314 * This function frees all allocated resources and both sockets are aware of the
315 * new connection state.
316 *
317 * That is, this function does not simulate half-open TCP connections and the
318 * phenomenon that when closing a UDP connection the peer is not aware of the
319 * connection having been closed.
320 */
321void mbedtls_mock_socket_close( mbedtls_mock_socket* socket )
322{
323 if( socket == NULL )
324 return;
325
326 if( socket->input != NULL )
327 {
328 mbedtls_test_buffer_free( socket->input );
329 mbedtls_free( socket->input );
330 }
331
332 if( socket->output != NULL )
333 {
334 mbedtls_test_buffer_free( socket->output );
335 mbedtls_free( socket->output );
336 }
337
338 if( socket->peer != NULL )
339 memset( socket->peer, 0, sizeof( *socket->peer ) );
340
341 memset( socket, 0, sizeof( *socket ) );
342}
343
344/*
345 * Establishes a connection between \p peer1 and \p peer2.
346 *
347 * \p peer1 and \p peer2 must have been previously initialized by calling
348 * mbedtls_mock_socket_init().
349 *
350 * The capacites of the internal buffers are set to \p bufsize. Setting this to
351 * the correct value allows for simulation of MTU, sanity testing the mock
352 * implementation and mocking TCP connections with lower memory cost.
353 */
354int mbedtls_mock_socket_connect( mbedtls_mock_socket* peer1,
355 mbedtls_mock_socket* peer2,
356 size_t bufsize )
357{
358 int ret = -1;
359
Piotr Nowickid796e192020-01-28 12:09:47 +0100360 peer1->output =
Janos Follath031827f2019-11-27 11:12:14 +0000361 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
362 if( peer1->output == NULL )
363 {
364 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
365 goto exit;
366 }
367 mbedtls_test_buffer_init( peer1->output );
368 if( 0 != ( ret = mbedtls_test_buffer_setup( peer1->output, bufsize ) ) )
369 {
370 goto exit;
371 }
372
Piotr Nowickid796e192020-01-28 12:09:47 +0100373 peer2->output =
374 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
375 if( peer2->output == NULL )
376 {
377 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
378 goto exit;
379 }
380 mbedtls_test_buffer_init( peer2->output );
381 if( 0 != ( ret = mbedtls_test_buffer_setup( peer2->output, bufsize ) ) )
382 {
383 goto exit;
384 }
385
Janos Follath031827f2019-11-27 11:12:14 +0000386 peer1->peer = peer2;
387 peer2->peer = peer1;
Piotr Nowickid796e192020-01-28 12:09:47 +0100388 peer1->input = peer2->output;
389 peer2->input = peer1->output;
Janos Follath031827f2019-11-27 11:12:14 +0000390
391 peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
392 ret = 0;
393
394exit:
395
396 if( ret != 0 )
397 {
398 mbedtls_mock_socket_close( peer1 );
399 mbedtls_mock_socket_close( peer2 );
400 }
401
402 return ret;
403}
404
405/*
406 * Callbacks for simulating blocking I/O over connection-oriented transport.
407 */
408
409int mbedtls_mock_tcp_send_b( void *ctx, const unsigned char *buf, size_t len )
410{
411 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
412
413 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
414 return -1;
415
416 return mbedtls_test_buffer_put( socket->output, buf, len );
417}
418
419int mbedtls_mock_tcp_recv_b( void *ctx, unsigned char *buf, size_t len )
420{
421 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
422
423 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
424 return -1;
425
426 return mbedtls_test_buffer_get( socket->input, buf, len );
427}
428
429/*
Janos Follath3766ba52019-11-27 13:31:42 +0000430 * Callbacks for simulating non-blocking I/O over connection-oriented transport.
431 */
432
433int mbedtls_mock_tcp_send_nb( void *ctx, const unsigned char *buf, size_t len )
434{
435 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
436
437 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
438 return -1;
439
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100440 if( socket->output->capacity == socket->output->content_length )
Janos Follath3766ba52019-11-27 13:31:42 +0000441 {
Janos Follath3766ba52019-11-27 13:31:42 +0000442 return MBEDTLS_ERR_SSL_WANT_WRITE;
443 }
444
Janos Follath3766ba52019-11-27 13:31:42 +0000445 return mbedtls_test_buffer_put( socket->output, buf, len );
446}
447
448int mbedtls_mock_tcp_recv_nb( void *ctx, unsigned char *buf, size_t len )
449{
450 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
451
452 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
453 return -1;
454
Andrzej Kurekf40daa32020-02-04 09:00:01 -0500455 if( socket->input->content_length == 0 )
Janos Follath3766ba52019-11-27 13:31:42 +0000456 {
Janos Follath3766ba52019-11-27 13:31:42 +0000457 return MBEDTLS_ERR_SSL_WANT_READ;
458 }
459
Janos Follath3766ba52019-11-27 13:31:42 +0000460 return mbedtls_test_buffer_get( socket->input, buf, len );
461}
462
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500463/* Errors used in the message socket mocks */
464
465#define MBEDTLS_TEST_ERROR_CONTEXT_ERROR -55
466#define MBEDTLS_TEST_ERROR_SEND_FAILED -66
467#define MBEDTLS_TEST_ERROR_RECV_FAILED -77
468
469/*
470 * Structure used as an addon, or a wrapper, around the mocked sockets.
471 * Contains an input queue, to which the other socket pushes metadata,
472 * and an output queue, to which this one pushes metadata. This context is
473 * considered as an owner of the input queue only, which is initialized and
474 * freed in the respective setup and free calls.
475 */
476typedef struct mbedtls_test_message_socket_context
477{
478 mbedtls_test_message_queue* queue_input;
479 mbedtls_test_message_queue* queue_output;
480 mbedtls_mock_socket* socket;
481} mbedtls_test_message_socket_context;
482
483/*
484 * Setup a given mesasge socket context including initialization of
485 * input/output queues to a chosen capacity of messages. Also set the
486 * corresponding mock socket.
487 *
488 * \retval 0, if everything succeeds.
489 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation of a message
490 * queue failed.
491 */
492int mbedtls_message_socket_setup( mbedtls_test_message_queue* queue_input,
493 mbedtls_test_message_queue* queue_output,
494 size_t queue_capacity,
495 mbedtls_mock_socket* socket,
496 mbedtls_test_message_socket_context* ctx )
497{
498 int ret = mbedtls_test_message_queue_setup( queue_input, queue_capacity );
499 if( ret != 0 )
500 return ret;
501 ctx->queue_input = queue_input;
502 ctx->queue_output = queue_output;
503 ctx->socket = socket;
504 mbedtls_mock_socket_init( socket );
505
506 return 0;
507}
508
509/*
510 * Close a given message socket context, along with the socket itself. Free the
511 * memory allocated by the input queue.
512 */
513void mbedtls_message_socket_close( mbedtls_test_message_socket_context* ctx )
514{
515 if( ctx == NULL )
516 return;
517
518 mbedtls_test_message_queue_free( ctx->queue_input );
519 mbedtls_mock_socket_close( ctx->socket );
520 memset( ctx, 0, sizeof( *ctx ) );
521}
522
523/*
524 * Send one message through a given message socket context.
525 *
526 * \retval \p len, if everything succeeds.
527 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
528 * elements or the context itself is null.
529 * \retval MBEDTLS_TEST_ERROR_SEND_FAILED if mbedtls_mock_tcp_send_b failed.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500530 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the output queue is full.
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500531 *
532 * This function will also return any error from
533 * mbedtls_test_message_queue_push_info.
534 */
535int mbedtls_mock_tcp_send_msg( void *ctx, const unsigned char *buf, size_t len )
536{
537 mbedtls_test_message_queue* queue;
538 mbedtls_mock_socket* socket;
539 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
540
541 if( context == NULL || context->socket == NULL
542 || context->queue_output == NULL )
543 {
544 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
545 }
546
547 queue = context->queue_output;
548 socket = context->socket;
549
550 if( queue->num >= queue->capacity )
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500551 return MBEDTLS_ERR_SSL_WANT_WRITE;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500552
553 if( mbedtls_mock_tcp_send_b( socket, buf, len ) != (int) len )
554 return MBEDTLS_TEST_ERROR_SEND_FAILED;
555
556 return mbedtls_test_message_queue_push_info( queue, len );
557}
558
559/*
560 * Receive one message from a given message socket context and return message
561 * length or an error.
562 *
563 * \retval message length, if everything succeeds.
564 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
565 * elements or the context itself is null.
566 * \retval MBEDTLS_TEST_ERROR_RECV_FAILED if mbedtls_mock_tcp_recv_b failed.
567 *
568 * This function will also return any error other than
569 * MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED from mbedtls_test_message_queue_peek_info.
570 */
571int mbedtls_mock_tcp_recv_msg( void *ctx, unsigned char *buf, size_t buf_len )
572{
573 mbedtls_test_message_queue* queue;
574 mbedtls_mock_socket* socket;
575 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
576 size_t drop_len;
577 size_t msg_len;
578 int ret;
579
580 if( context == NULL || context->socket == NULL
581 || context->queue_input == NULL )
582 {
583 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
584 }
585
586 queue = context->queue_input;
587 socket = context->socket;
588
589 /* Peek first, so that in case of a socket error the data remains in
590 * the queue. */
591 ret = mbedtls_test_message_queue_peek_info( queue, buf_len, &msg_len );
592 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
593 {
594 /* Calculate how much to drop */
595 drop_len = msg_len - buf_len;
596
597 /* Set the requested message len to be buffer length */
598 msg_len = buf_len;
599 } else if( ret != 0 )
600 {
601 return ret;
602 }
603
604 if( mbedtls_mock_tcp_recv_b( socket, buf, msg_len ) != (int) msg_len )
605 return MBEDTLS_TEST_ERROR_RECV_FAILED;
606
607 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
608 {
609 /* Drop the remaining part of the message */
610 if( mbedtls_mock_tcp_recv_b( socket, NULL, drop_len ) != (int) drop_len )
611 {
612 /* Inconsistent state - part of the message was read,
613 * and a part couldn't. Not much we can do here, but it should not
614 * happen in test environment, unless forced manually. */
615 }
616 }
617 mbedtls_test_message_queue_pop_info( queue, buf_len );
618
619 return msg_len;
620}
621
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100622#if defined(MBEDTLS_X509_CRT_PARSE_C)
623
624/*
625 * Structure with endpoint's certificates for SSL communication tests.
626 */
627typedef struct mbedtls_endpoint_certificate
628{
629 mbedtls_x509_crt ca_cert;
630 mbedtls_x509_crt cert;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100631 mbedtls_pk_context pkey;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100632} mbedtls_endpoint_certificate;
633
634/*
635 * Endpoint structure for SSL communication tests.
636 */
637typedef struct mbedtls_endpoint
638{
639 const char *name;
640 mbedtls_ssl_context ssl;
641 mbedtls_ssl_config conf;
642 mbedtls_ctr_drbg_context ctr_drbg;
643 mbedtls_entropy_context entropy;
644 mbedtls_mock_socket socket;
645 mbedtls_endpoint_certificate cert;
646} mbedtls_endpoint;
647
648/*
649 * Initializes \p ep_cert structure and assigns it to endpoint
650 * represented by \p ep.
651 *
652 * \retval 0 on success, otherwise error code.
653 */
Andrzej Kurekb2980742020-02-02 19:25:26 -0500654int mbedtls_endpoint_certificate_init( mbedtls_endpoint *ep, int pk_alg )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100655{
656 int i = 0;
657 int ret = -1;
658 mbedtls_endpoint_certificate *cert;
659
660 if( ep == NULL )
661 {
662 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
663 }
664
665 cert = &( ep->cert );
666 mbedtls_x509_crt_init( &( cert->ca_cert ) );
667 mbedtls_x509_crt_init( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100668 mbedtls_pk_init( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100669
670 /* Load the trusted CA */
671
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100672 for( i = 0; mbedtls_test_cas_der[i] != NULL; i++ )
673 {
674 ret = mbedtls_x509_crt_parse_der( &( cert->ca_cert ),
675 (const unsigned char *) mbedtls_test_cas_der[i],
676 mbedtls_test_cas_der_len[i] );
677 TEST_ASSERT( ret == 0 );
678 }
679
680 /* Load own certificate and private key */
681
682 if( ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER )
683 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500684 if( pk_alg == MBEDTLS_PK_RSA )
685 {
686 ret = mbedtls_x509_crt_parse( &( cert->cert ),
687 (const unsigned char*) mbedtls_test_srv_crt_rsa_sha256_der,
688 mbedtls_test_srv_crt_rsa_sha256_der_len );
689 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100690
Andrzej Kurekb2980742020-02-02 19:25:26 -0500691 ret = mbedtls_pk_parse_key( &( cert->pkey ),
692 (const unsigned char*) mbedtls_test_srv_key_rsa_der,
693 mbedtls_test_srv_key_rsa_der_len, NULL, 0 );
694 TEST_ASSERT( ret == 0 );
695 }
696 else
697 {
698 ret = mbedtls_x509_crt_parse( &( cert->cert ),
699 (const unsigned char*) mbedtls_test_srv_crt_ec_der,
700 mbedtls_test_srv_crt_ec_der_len );
701 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100702
Andrzej Kurekb2980742020-02-02 19:25:26 -0500703 ret = mbedtls_pk_parse_key( &( cert->pkey ),
704 (const unsigned char*) mbedtls_test_srv_key_ec_der,
705 mbedtls_test_srv_key_ec_der_len, NULL, 0 );
706 TEST_ASSERT( ret == 0 );
707 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100708 }
709 else
710 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500711 if( pk_alg == MBEDTLS_PK_RSA )
712 {
713 ret = mbedtls_x509_crt_parse( &( cert->cert ),
714 (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
715 mbedtls_test_cli_crt_rsa_der_len );
716 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100717
Andrzej Kurekb2980742020-02-02 19:25:26 -0500718 ret = mbedtls_pk_parse_key( &( cert->pkey ),
719 (const unsigned char *) mbedtls_test_cli_key_rsa_der,
720 mbedtls_test_cli_key_rsa_der_len, NULL, 0 );
721 TEST_ASSERT( ret == 0 );
722 }
723 else
724 {
725 ret = mbedtls_x509_crt_parse( &( cert->cert ),
726 (const unsigned char *) mbedtls_test_cli_crt_ec_der,
727 mbedtls_test_cli_crt_ec_len );
728 TEST_ASSERT( ret == 0 );
729
730 ret = mbedtls_pk_parse_key( &( cert->pkey ),
731 (const unsigned char *) mbedtls_test_cli_key_ec_der,
732 mbedtls_test_cli_key_ec_der_len, NULL, 0 );
733 TEST_ASSERT( ret == 0 );
734 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100735 }
736
737 mbedtls_ssl_conf_ca_chain( &( ep->conf ), &( cert->ca_cert ), NULL );
738
Andrzej Kurekb2980742020-02-02 19:25:26 -0500739 ret = mbedtls_ssl_conf_own_cert( &( ep->conf ), &( cert->cert ),
740 &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100741 TEST_ASSERT( ret == 0 );
742
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100743exit:
744 if( ret != 0 )
745 {
746 mbedtls_x509_crt_free( &( cert->ca_cert ) );
747 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100748 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100749 }
750
751 return ret;
752}
753
754/*
755 * Initializes \p ep structure. It is important to call `mbedtls_endpoint_free()`
756 * after calling this function even if it fails.
757 *
758 * \p endpoint_type must be set as MBEDTLS_SSL_IS_SERVER or
759 * MBEDTLS_SSL_IS_CLIENT.
Andrzej Kurek15daf502020-02-12 09:17:52 -0500760 * \p pk_alg the algorithm to use, currently only MBEDTLS_PK_RSA and
761 * MBEDTLS_PK_ECDSA are supported.
762 * \p dtls_context - in case of DTLS - this is the context handling metadata.
763 * \p input_queue - used only in case of DTLS.
764 * \p output_queue - used only in case of DTLS.
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100765 *
766 * \retval 0 on success, otherwise error code.
767 */
Andrzej Kurek15daf502020-02-12 09:17:52 -0500768int mbedtls_endpoint_init( mbedtls_endpoint *ep, int endpoint_type, int pk_alg,
769 mbedtls_test_message_socket_context *dtls_context,
770 mbedtls_test_message_queue *input_queue,
771 mbedtls_test_message_queue *output_queue )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100772{
773 int ret = -1;
774
Andrzej Kurek15daf502020-02-12 09:17:52 -0500775 if( dtls_context != NULL && ( input_queue == NULL || output_queue == NULL ) )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100776 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Andrzej Kurek15daf502020-02-12 09:17:52 -0500777
778 if( ep == NULL )
779 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100780
781 memset( ep, 0, sizeof( *ep ) );
782
783 ep->name = ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ? "Server" : "Client";
784
785 mbedtls_ssl_init( &( ep->ssl ) );
786 mbedtls_ssl_config_init( &( ep->conf ) );
787 mbedtls_ctr_drbg_init( &( ep->ctr_drbg ) );
788 mbedtls_ssl_conf_rng( &( ep->conf ),
789 mbedtls_ctr_drbg_random,
790 &( ep->ctr_drbg ) );
791 mbedtls_entropy_init( &( ep->entropy ) );
Andrzej Kurek15daf502020-02-12 09:17:52 -0500792 if( dtls_context != NULL )
793 {
794 TEST_ASSERT( mbedtls_message_socket_setup( input_queue, output_queue,
795 100, &( ep->socket ),
796 dtls_context ) == 0 );
797 }
798 else
799 {
800 mbedtls_mock_socket_init( &( ep->socket ) );
801 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100802
803 ret = mbedtls_ctr_drbg_seed( &( ep->ctr_drbg ), mbedtls_entropy_func,
804 &( ep->entropy ), (const unsigned char *) ( ep->name ),
805 strlen( ep->name ) );
806 TEST_ASSERT( ret == 0 );
807
808 /* Non-blocking callbacks without timeout */
Andrzej Kurek15daf502020-02-12 09:17:52 -0500809 if( dtls_context != NULL )
810 {
811 mbedtls_ssl_set_bio( &( ep->ssl ), dtls_context,
812 mbedtls_mock_tcp_send_msg,
813 mbedtls_mock_tcp_recv_msg,
814 NULL );
815 }
816 else
817 {
818 mbedtls_ssl_set_bio( &( ep->ssl ), &( ep->socket ),
819 mbedtls_mock_tcp_send_nb,
820 mbedtls_mock_tcp_recv_nb,
821 NULL );
822 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100823
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100824 ret = mbedtls_ssl_config_defaults( &( ep->conf ), endpoint_type,
Andrzej Kurek15daf502020-02-12 09:17:52 -0500825 ( dtls_context != NULL ) ?
826 MBEDTLS_SSL_TRANSPORT_DATAGRAM :
827 MBEDTLS_SSL_TRANSPORT_STREAM,
828 MBEDTLS_SSL_PRESET_DEFAULT );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100829 TEST_ASSERT( ret == 0 );
830
Andrzej Kurek1a44a152020-02-07 08:21:32 -0500831 ret = mbedtls_ssl_setup( &( ep->ssl ), &( ep->conf ) );
832 TEST_ASSERT( ret == 0 );
Andrzej Kurek15daf502020-02-12 09:17:52 -0500833
834#if defined(MBEDTLS_SSL_PROTO_DTLS) && defined(MBEDTLS_SSL_SRV_C)
835 if( endpoint_type == MBEDTLS_SSL_IS_SERVER && dtls_context != NULL )
836 mbedtls_ssl_conf_dtls_cookies( &( ep->conf ), NULL, NULL, NULL );
837#endif
838
Andrzej Kurekb2980742020-02-02 19:25:26 -0500839 ret = mbedtls_endpoint_certificate_init( ep, pk_alg );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100840 TEST_ASSERT( ret == 0 );
841
842exit:
843 return ret;
844}
845
846/*
847 * Deinitializes certificates from endpoint represented by \p ep.
848 */
849void mbedtls_endpoint_certificate_free( mbedtls_endpoint *ep )
850{
851 mbedtls_endpoint_certificate *cert = &( ep->cert );
852 mbedtls_x509_crt_free( &( cert->ca_cert ) );
853 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100854 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100855}
856
857/*
858 * Deinitializes endpoint represented by \p ep.
859 */
Andrzej Kurek15daf502020-02-12 09:17:52 -0500860void mbedtls_endpoint_free( mbedtls_endpoint *ep,
861 mbedtls_test_message_socket_context *context )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100862{
863 mbedtls_endpoint_certificate_free( ep );
864
865 mbedtls_ssl_free( &( ep->ssl ) );
866 mbedtls_ssl_config_free( &( ep->conf ) );
867 mbedtls_ctr_drbg_free( &( ep->ctr_drbg ) );
868 mbedtls_entropy_free( &( ep->entropy ) );
Andrzej Kurek15daf502020-02-12 09:17:52 -0500869
870 if( context != NULL )
871 {
872 mbedtls_message_socket_close( context );
873 }
874 else
875 {
876 mbedtls_mock_socket_close( &( ep->socket ) );
877 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100878}
879
880/*
881 * This function moves ssl handshake from \p ssl to prescribed \p state.
882 * /p second_ssl is used as second endpoint and their sockets have to be
883 * connected before calling this function.
884 *
885 * \retval 0 on success, otherwise error code.
886 */
887int mbedtls_move_handshake_to_state( mbedtls_ssl_context *ssl,
888 mbedtls_ssl_context *second_ssl,
889 int state )
890{
891 enum { BUFFSIZE = 1024 };
892 int max_steps = 1000;
893 int ret = 0;
894
895 if( ssl == NULL || second_ssl == NULL )
896 {
897 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
898 }
899
900 /* Perform communication via connected sockets */
901 while( ( ssl->state != state ) && ( --max_steps >= 0 ) )
902 {
903 /* If /p second_ssl ends the handshake procedure before /p ssl then
904 * there is no need to call the next step */
905 if( second_ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
906 {
907 ret = mbedtls_ssl_handshake_step( second_ssl );
908 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
909 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
910 {
911 return ret;
912 }
913 }
914
915 /* We only care about the \p ssl state and returns, so we call it last,
916 * to leave the iteration as soon as the state is as expected. */
917 ret = mbedtls_ssl_handshake_step( ssl );
918 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
919 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
920 {
921 return ret;
922 }
923 }
924
925 return ( max_steps >= 0 ) ? ret : -1;
926}
927
928#endif /* MBEDTLS_X509_CRT_PARSE_C */
929
Janos Follath3766ba52019-11-27 13:31:42 +0000930/*
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100931 * Write application data. Increase write counter and fragments counter if
932 * necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100933 */
934int mbedtls_ssl_write_fragment( mbedtls_ssl_context *ssl, unsigned char *buf,
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100935 int buf_len, int *written,
936 int *fragments, const int expected_fragments )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100937{
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100938 int ret = mbedtls_ssl_write( ssl, buf + *written, buf_len - *written );
939 if( ret > 0 )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100940 {
941 (*fragments)++;
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100942 *written += ret;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100943 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100944
945 if( expected_fragments == 0 )
946 {
947 /* Used for DTLS and the message size larger than MFL. In that case
948 * the message can not be fragmented and the library should return
949 * MBEDTLS_ERR_SSL_BAD_INPUT_DATA error. This error must be returned
950 * to prevent a dead loop inside mbedtls_exchange_data(). */
951 return ret;
952 }
953 else if( expected_fragments == 1 )
954 {
955 /* Used for TLS/DTLS and the message size lower than MFL */
956 TEST_ASSERT( ret == buf_len ||
957 ret == MBEDTLS_ERR_SSL_WANT_READ ||
958 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
959 }
960 else
961 {
962 /* Used for TLS and the message size larger than MFL */
963 TEST_ASSERT( expected_fragments > 1 );
964 TEST_ASSERT( ( ret >= 0 && ret <= buf_len ) ||
965 ret == MBEDTLS_ERR_SSL_WANT_READ ||
966 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
967 }
968
969 return 0;
970
971exit:
972 /* Some of the tests failed */
973 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100974}
975
976/*
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100977 * Read application data and increase read counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100978 */
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100979int mbedtls_ssl_read_fragment( mbedtls_ssl_context *ssl, unsigned char *buf,
980 int buf_len, int *read,
981 const int expected_fragments )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100982{
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100983 int ret = mbedtls_ssl_read( ssl, buf + *read, buf_len - *read );
984 if( ret > 0 )
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100985 {
986 *read += ret;
987 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100988
989 if( expected_fragments == 0 )
990 {
991 TEST_ASSERT( ret == 0 );
992 }
993 else if( expected_fragments == 1 )
994 {
995 TEST_ASSERT( ret == buf_len ||
996 ret == MBEDTLS_ERR_SSL_WANT_READ ||
997 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
998 }
999 else
1000 {
1001 TEST_ASSERT( expected_fragments > 1 );
1002 TEST_ASSERT( ( ret >= 0 && ret <= buf_len ) ||
1003 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1004 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1005 }
1006
1007 return 0;
1008
1009exit:
1010 /* Some of the tests failed */
1011 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001012}
1013
1014/*
Hanno Beckera18d1322018-01-03 14:27:32 +00001015 * Helper function setting up inverse record transformations
1016 * using given cipher, hash, EtM mode, authentication tag length,
1017 * and version.
1018 */
1019
1020#define CHK( x ) \
1021 do \
1022 { \
1023 if( !( x ) ) \
Hanno Becker81e16a32019-03-01 11:21:44 +00001024 { \
Hanno Beckera5780f12019-04-05 09:55:37 +01001025 ret = -1; \
Hanno Becker81e16a32019-03-01 11:21:44 +00001026 goto cleanup; \
1027 } \
Hanno Beckera18d1322018-01-03 14:27:32 +00001028 } while( 0 )
1029
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001030void set_ciphersuite( mbedtls_ssl_config *conf, const char *cipher,
1031 int* forced_ciphersuite )
1032{
1033 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
1034 forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( cipher );
1035 forced_ciphersuite[1] = 0;
1036
1037 ciphersuite_info =
1038 mbedtls_ssl_ciphersuite_from_id( forced_ciphersuite[0] );
1039
1040 TEST_ASSERT( ciphersuite_info != NULL );
1041 TEST_ASSERT( ciphersuite_info->min_minor_ver <= conf->max_minor_ver );
1042 TEST_ASSERT( ciphersuite_info->max_minor_ver >= conf->min_minor_ver );
1043
1044 if( conf->max_minor_ver > ciphersuite_info->max_minor_ver )
1045 {
1046 conf->max_minor_ver = ciphersuite_info->max_minor_ver;
1047 }
1048 if( conf->min_minor_ver < ciphersuite_info->min_minor_ver )
1049 {
1050 conf->min_minor_ver = ciphersuite_info->min_minor_ver;
1051 }
1052
1053 mbedtls_ssl_conf_ciphersuites( conf, forced_ciphersuite );
1054
1055exit:
1056 return;
1057}
1058
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05001059int psk_dummy_callback( void *p_info, mbedtls_ssl_context *ssl,
1060 const unsigned char *name, size_t name_len )
1061{
1062 (void) p_info;
1063 (void) ssl;
1064 (void) name;
1065 (void) name_len;
1066
1067 return ( 0 );
1068}
1069
Hanno Beckerd856c822019-04-29 17:30:59 +01001070#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
1071#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
1072#else
1073#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
1074#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001075
1076static int build_transforms( mbedtls_ssl_transform *t_in,
1077 mbedtls_ssl_transform *t_out,
1078 int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01001079 int etm, int tag_mode, int ver,
1080 size_t cid0_len,
1081 size_t cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00001082{
1083 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +01001084 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +00001085
1086 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +00001087 unsigned char *key0 = NULL, *key1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001088 unsigned char iv_enc[16], iv_dec[16];
1089
Hanno Beckera0e20d02019-05-15 14:03:01 +01001090#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001091 unsigned char cid0[ SSL_CID_LEN_MIN ];
1092 unsigned char cid1[ SSL_CID_LEN_MIN ];
1093
1094 rnd_std_rand( NULL, cid0, sizeof( cid0 ) );
1095 rnd_std_rand( NULL, cid1, sizeof( cid1 ) );
Hanno Becker43c24b82019-05-01 09:45:57 +01001096#else
1097 ((void) cid0_len);
1098 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +01001099#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001100
Hanno Beckera18d1322018-01-03 14:27:32 +00001101 maclen = 0;
1102
1103 /* Pick cipher */
1104 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
1105 CHK( cipher_info != NULL );
1106 CHK( cipher_info->iv_size <= 16 );
1107 CHK( cipher_info->key_bitlen % 8 == 0 );
1108
1109 /* Pick keys */
1110 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +01001111 /* Allocate `keylen + 1` bytes to ensure that we get
1112 * a non-NULL pointers from `mbedtls_calloc` even if
1113 * `keylen == 0` in the case of the NULL cipher. */
1114 CHK( ( key0 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
1115 CHK( ( key1 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001116 memset( key0, 0x1, keylen );
1117 memset( key1, 0x2, keylen );
1118
1119 /* Setup cipher contexts */
1120 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_enc, cipher_info ) == 0 );
1121 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_dec, cipher_info ) == 0 );
1122 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_enc, cipher_info ) == 0 );
1123 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_dec, cipher_info ) == 0 );
1124
1125#if defined(MBEDTLS_CIPHER_MODE_CBC)
1126 if( cipher_info->mode == MBEDTLS_MODE_CBC )
1127 {
1128 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_enc,
1129 MBEDTLS_PADDING_NONE ) == 0 );
1130 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_dec,
1131 MBEDTLS_PADDING_NONE ) == 0 );
1132 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_enc,
1133 MBEDTLS_PADDING_NONE ) == 0 );
1134 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_dec,
1135 MBEDTLS_PADDING_NONE ) == 0 );
1136 }
1137#endif /* MBEDTLS_CIPHER_MODE_CBC */
1138
1139 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_enc, key0,
1140 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1141 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_dec, key1,
1142 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
1143 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_enc, key1,
1144 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1145 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_dec, key0,
1146 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001147
1148 /* Setup MAC contexts */
1149#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1150 if( cipher_info->mode == MBEDTLS_MODE_CBC ||
1151 cipher_info->mode == MBEDTLS_MODE_STREAM )
1152 {
1153 mbedtls_md_info_t const *md_info;
1154 unsigned char *md0, *md1;
1155
1156 /* Pick hash */
1157 md_info = mbedtls_md_info_from_type( hash_id );
1158 CHK( md_info != NULL );
1159
1160 /* Pick hash keys */
1161 maclen = mbedtls_md_get_size( md_info );
Hanno Becker3ee54212019-04-04 16:31:26 +01001162 CHK( ( md0 = mbedtls_calloc( 1, maclen ) ) != NULL );
1163 CHK( ( md1 = mbedtls_calloc( 1, maclen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001164 memset( md0, 0x5, maclen );
1165 memset( md1, 0x6, maclen );
1166
1167 CHK( mbedtls_md_setup( &t_out->md_ctx_enc, md_info, 1 ) == 0 );
1168 CHK( mbedtls_md_setup( &t_out->md_ctx_dec, md_info, 1 ) == 0 );
1169 CHK( mbedtls_md_setup( &t_in->md_ctx_enc, md_info, 1 ) == 0 );
1170 CHK( mbedtls_md_setup( &t_in->md_ctx_dec, md_info, 1 ) == 0 );
1171
1172 if( ver > MBEDTLS_SSL_MINOR_VERSION_0 )
1173 {
1174 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_enc,
1175 md0, maclen ) == 0 );
1176 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_dec,
1177 md1, maclen ) == 0 );
1178 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_enc,
1179 md1, maclen ) == 0 );
1180 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_dec,
1181 md0, maclen ) == 0 );
1182 }
1183#if defined(MBEDTLS_SSL_PROTO_SSL3)
1184 else
1185 {
1186 memcpy( &t_in->mac_enc, md0, maclen );
1187 memcpy( &t_in->mac_dec, md1, maclen );
1188 memcpy( &t_out->mac_enc, md1, maclen );
1189 memcpy( &t_out->mac_dec, md0, maclen );
1190 }
1191#endif
1192
Hanno Becker3ee54212019-04-04 16:31:26 +01001193 mbedtls_free( md0 );
1194 mbedtls_free( md1 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001195 }
1196#else
1197 ((void) hash_id);
1198#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1199
1200
1201 /* Pick IV's (regardless of whether they
1202 * are being used by the transform). */
1203 ivlen = cipher_info->iv_size;
1204 memset( iv_enc, 0x3, sizeof( iv_enc ) );
1205 memset( iv_dec, 0x4, sizeof( iv_dec ) );
1206
1207 /*
1208 * Setup transforms
1209 */
1210
Jaeden Amero2de07f12019-06-05 13:32:08 +01001211#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1212 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001213 t_out->encrypt_then_mac = etm;
1214 t_in->encrypt_then_mac = etm;
1215#else
1216 ((void) etm);
1217#endif
1218
1219 t_out->minor_ver = ver;
1220 t_in->minor_ver = ver;
1221 t_out->ivlen = ivlen;
1222 t_in->ivlen = ivlen;
1223
1224 switch( cipher_info->mode )
1225 {
1226 case MBEDTLS_MODE_GCM:
1227 case MBEDTLS_MODE_CCM:
1228 t_out->fixed_ivlen = 4;
1229 t_in->fixed_ivlen = 4;
1230 t_out->maclen = 0;
1231 t_in->maclen = 0;
1232 switch( tag_mode )
1233 {
1234 case 0: /* Full tag */
1235 t_out->taglen = 16;
1236 t_in->taglen = 16;
1237 break;
1238 case 1: /* Partial tag */
1239 t_out->taglen = 8;
1240 t_in->taglen = 8;
1241 break;
1242 default:
1243 return( 1 );
1244 }
1245 break;
1246
1247 case MBEDTLS_MODE_CHACHAPOLY:
1248 t_out->fixed_ivlen = 12;
1249 t_in->fixed_ivlen = 12;
1250 t_out->maclen = 0;
1251 t_in->maclen = 0;
1252 switch( tag_mode )
1253 {
1254 case 0: /* Full tag */
1255 t_out->taglen = 16;
1256 t_in->taglen = 16;
1257 break;
1258 case 1: /* Partial tag */
1259 t_out->taglen = 8;
1260 t_in->taglen = 8;
1261 break;
1262 default:
1263 return( 1 );
1264 }
1265 break;
1266
1267 case MBEDTLS_MODE_STREAM:
1268 case MBEDTLS_MODE_CBC:
1269 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1270 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1271 t_out->taglen = 0;
1272 t_in->taglen = 0;
1273 switch( tag_mode )
1274 {
1275 case 0: /* Full tag */
1276 t_out->maclen = maclen;
1277 t_in->maclen = maclen;
1278 break;
1279 case 1: /* Partial tag */
1280 t_out->maclen = 10;
1281 t_in->maclen = 10;
1282 break;
1283 default:
1284 return( 1 );
1285 }
1286 break;
1287 default:
1288 return( 1 );
1289 break;
1290 }
1291
1292 /* Setup IV's */
1293
1294 memcpy( &t_in->iv_dec, iv_dec, sizeof( iv_dec ) );
1295 memcpy( &t_in->iv_enc, iv_enc, sizeof( iv_enc ) );
1296 memcpy( &t_out->iv_dec, iv_enc, sizeof( iv_enc ) );
1297 memcpy( &t_out->iv_enc, iv_dec, sizeof( iv_dec ) );
1298
Hanno Beckera0e20d02019-05-15 14:03:01 +01001299#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001300 /* Add CID */
1301 memcpy( &t_in->in_cid, cid0, cid0_len );
1302 memcpy( &t_in->out_cid, cid1, cid1_len );
1303 t_in->in_cid_len = cid0_len;
1304 t_in->out_cid_len = cid1_len;
1305 memcpy( &t_out->in_cid, cid1, cid1_len );
1306 memcpy( &t_out->out_cid, cid0, cid0_len );
1307 t_out->in_cid_len = cid1_len;
1308 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001309#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001310
Hanno Becker81e16a32019-03-01 11:21:44 +00001311cleanup:
1312
Hanno Becker3ee54212019-04-04 16:31:26 +01001313 mbedtls_free( key0 );
1314 mbedtls_free( key1 );
Hanno Becker81e16a32019-03-01 11:21:44 +00001315
Hanno Beckera5780f12019-04-05 09:55:37 +01001316 return( ret );
Hanno Beckera18d1322018-01-03 14:27:32 +00001317}
1318
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001319/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001320 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001321 * Choose dummy values, mostly non-0 to distinguish from the init default.
1322 */
1323static int ssl_populate_session( mbedtls_ssl_session *session,
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001324 int ticket_len,
1325 const char *crt_file )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001326{
1327#if defined(MBEDTLS_HAVE_TIME)
1328 session->start = mbedtls_time( NULL ) - 42;
1329#endif
1330 session->ciphersuite = 0xabcd;
1331 session->compression = 1;
1332 session->id_len = sizeof( session->id );
1333 memset( session->id, 66, session->id_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001334 memset( session->master, 17, sizeof( session->master ) );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001335
Manuel Pégourié-Gonnard1f6033a2019-05-24 10:17:52 +02001336#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001337 if( strlen( crt_file ) != 0 )
1338 {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001339 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001340 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001341
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001342 mbedtls_x509_crt_init( &tmp_crt );
1343 ret = mbedtls_x509_crt_parse_file( &tmp_crt, crt_file );
1344 if( ret != 0 )
1345 return( ret );
1346
1347#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1348 /* Move temporary CRT. */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001349 session->peer_cert = mbedtls_calloc( 1, sizeof( *session->peer_cert ) );
1350 if( session->peer_cert == NULL )
1351 return( -1 );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001352 *session->peer_cert = tmp_crt;
1353 memset( &tmp_crt, 0, sizeof( tmp_crt ) );
1354#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1355 /* Calculate digest of temporary CRT. */
1356 session->peer_cert_digest =
1357 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
1358 if( session->peer_cert_digest == NULL )
1359 return( -1 );
1360 ret = mbedtls_md( mbedtls_md_info_from_type(
1361 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
1362 tmp_crt.raw.p, tmp_crt.raw.len,
1363 session->peer_cert_digest );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001364 if( ret != 0 )
1365 return( ret );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001366 session->peer_cert_digest_type =
1367 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1368 session->peer_cert_digest_len =
1369 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1370#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1371
1372 mbedtls_x509_crt_free( &tmp_crt );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001373 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001374#else /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001375 (void) crt_file;
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001376#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001377 session->verify_result = 0xdeadbeef;
1378
1379#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
1380 if( ticket_len != 0 )
1381 {
1382 session->ticket = mbedtls_calloc( 1, ticket_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001383 if( session->ticket == NULL )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001384 return( -1 );
1385 memset( session->ticket, 33, ticket_len );
1386 }
1387 session->ticket_len = ticket_len;
1388 session->ticket_lifetime = 86401;
1389#else
1390 (void) ticket_len;
1391#endif
1392
1393#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1394 session->mfl_code = 1;
1395#endif
1396#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1397 session->trunc_hmac = 1;
1398#endif
1399#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1400 session->encrypt_then_mac = 1;
1401#endif
1402
1403 return( 0 );
1404}
1405
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001406/*
1407 * Perform data exchanging between \p ssl_1 and \p ssl_2 and check if the
1408 * message was sent in the correct number of fragments.
1409 *
1410 * /p ssl_1 and /p ssl_2 Endpoints represented by mbedtls_ssl_context. Both
1411 * of them must be initialized and connected beforehand.
1412 * /p msg_len_1 and /p msg_len_2 specify the size of the message to send.
1413 * /p expected_fragments_1 and /p expected_fragments_2 determine in how many
1414 * fragments the message should be sent.
1415 * expected_fragments is 0: can be used for DTLS testing while the message
1416 * size is larger than MFL. In that case the message
1417 * cannot be fragmented and sent to the second endpoint.
1418 * This value can be used for negative tests.
1419 * expected_fragments is 1: can be used for TLS/DTLS testing while the
1420 * message size is below MFL
1421 * expected_fragments > 1: can be used for TLS testing while the message
1422 * size is larger than MFL
1423 *
1424 * \retval 0 on success, otherwise error code.
1425 */
1426int mbedtls_exchange_data( mbedtls_ssl_context *ssl_1,
1427 int msg_len_1, const int expected_fragments_1,
1428 mbedtls_ssl_context *ssl_2,
1429 int msg_len_2, const int expected_fragments_2 )
1430{
1431 unsigned char *msg_buf_1 = malloc( msg_len_1 );
1432 unsigned char *msg_buf_2 = malloc( msg_len_2 );
1433 unsigned char *in_buf_1 = malloc( msg_len_2 );
1434 unsigned char *in_buf_2 = malloc( msg_len_1 );
1435 int msg_type, ret = -1;
1436
1437 /* Perform this test with two message types. At first use a message
1438 * consisting of only 0x00 for the client and only 0xFF for the server.
1439 * At the second time use message with generated data */
1440 for( msg_type = 0; msg_type < 2; msg_type++ )
1441 {
1442 int written_1 = 0;
1443 int written_2 = 0;
1444 int read_1 = 0;
1445 int read_2 = 0;
1446 int fragments_1 = 0;
1447 int fragments_2 = 0;
1448
1449 if( msg_type == 0 )
1450 {
1451 memset( msg_buf_1, 0x00, msg_len_1 );
1452 memset( msg_buf_2, 0xff, msg_len_2 );
1453 }
1454 else
1455 {
1456 int i, j = 0;
1457 for( i = 0; i < msg_len_1; i++ )
1458 {
1459 msg_buf_1[i] = j++ & 0xFF;
1460 }
1461 for( i = 0; i < msg_len_2; i++ )
1462 {
1463 msg_buf_2[i] = ( j -= 5 ) & 0xFF;
1464 }
1465 }
1466
1467 while( read_1 < msg_len_2 || read_2 < msg_len_1 )
1468 {
1469 /* ssl_1 sending */
1470 if( msg_len_1 > written_1 )
1471 {
1472 ret = mbedtls_ssl_write_fragment( ssl_1, msg_buf_1,
1473 msg_len_1, &written_1,
1474 &fragments_1,
1475 expected_fragments_1 );
1476 if( expected_fragments_1 == 0 )
1477 {
1478 /* This error is expected when the message is too large and
1479 * cannot be fragmented */
1480 TEST_ASSERT( ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1481 msg_len_1 = 0;
1482 }
1483 else
1484 {
1485 TEST_ASSERT( ret == 0 );
1486 }
1487 }
1488
1489 /* ssl_2 sending */
1490 if( msg_len_2 > written_2 )
1491 {
1492 ret = mbedtls_ssl_write_fragment( ssl_2, msg_buf_2,
1493 msg_len_2, &written_2,
1494 &fragments_2,
1495 expected_fragments_2 );
1496 if( expected_fragments_2 == 0 )
1497 {
1498 /* This error is expected when the message is too large and
1499 * cannot be fragmented */
1500 TEST_ASSERT( ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1501 msg_len_2 = 0;
1502 }
1503 else
1504 {
1505 TEST_ASSERT( ret == 0 );
1506 }
1507 }
1508
1509 /* ssl_1 reading */
1510 if( read_1 < msg_len_2 )
1511 {
1512 ret = mbedtls_ssl_read_fragment( ssl_1, in_buf_1,
1513 msg_len_2, &read_1,
1514 expected_fragments_1 );
1515 TEST_ASSERT( ret == 0 );
1516 }
1517
1518 /* ssl_2 reading */
1519 if( read_2 < msg_len_1 )
1520 {
1521 ret = mbedtls_ssl_read_fragment( ssl_2, in_buf_2,
1522 msg_len_1, &read_2,
1523 expected_fragments_2 );
1524 TEST_ASSERT( ret == 0 );
1525 }
1526 }
1527
1528 ret = -1;
1529 TEST_ASSERT( 0 == memcmp( msg_buf_1, in_buf_2, msg_len_1 ) );
1530 TEST_ASSERT( 0 == memcmp( msg_buf_2, in_buf_1, msg_len_2 ) );
1531 TEST_ASSERT( fragments_1 == expected_fragments_1 );
1532 TEST_ASSERT( fragments_2 == expected_fragments_2 );
1533 }
1534
1535 ret = 0;
1536
1537exit:
1538 free( msg_buf_1 );
1539 free( in_buf_1 );
1540 free( msg_buf_2 );
1541 free( in_buf_2 );
1542
1543 return ret;
1544}
1545
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001546/*
1547 * Perform data exchanging between \p ssl_1 and \p ssl_2. Both of endpoints
1548 * must be initialized and connected beforehand.
1549 *
1550 * \retval 0 on success, otherwise error code.
1551 */
1552int exchange_data( mbedtls_ssl_context *ssl_1,
1553 mbedtls_ssl_context *ssl_2 )
1554{
1555 return mbedtls_exchange_data( ssl_1, 256, 1,
1556 ssl_2, 256, 1 );
1557}
1558
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001559/* END_HEADER */
1560
1561/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001562 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001563 * END_DEPENDENCIES
1564 */
1565
Janos Follath6264e662019-11-26 11:11:15 +00001566/* BEGIN_CASE */
1567void test_callback_buffer_sanity()
1568{
1569 enum { MSGLEN = 10 };
1570 mbedtls_test_buffer buf;
1571 unsigned char input[MSGLEN];
1572 unsigned char output[MSGLEN];
1573
1574 memset( input, 0, sizeof(input) );
1575
1576 /* Make sure calling put and get on NULL buffer results in error. */
1577 TEST_ASSERT( mbedtls_test_buffer_put( NULL, input, sizeof( input ) )
1578 == -1 );
1579 TEST_ASSERT( mbedtls_test_buffer_get( NULL, output, sizeof( output ) )
1580 == -1 );
1581 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001582
Janos Follath6264e662019-11-26 11:11:15 +00001583 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, 0 ) == -1 );
1584 TEST_ASSERT( mbedtls_test_buffer_get( NULL, NULL, 0 ) == -1 );
1585
1586 /* Make sure calling put and get on a buffer that hasn't been set up results
1587 * in eror. */
1588 mbedtls_test_buffer_init( &buf );
1589
1590 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) ) == -1 );
1591 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, sizeof( output ) )
1592 == -1 );
1593 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001594
Janos Follath6264e662019-11-26 11:11:15 +00001595 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == -1 );
1596 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == -1 );
1597
Andrzej Kurekf7774142020-01-22 06:34:59 -05001598 /* Make sure calling put and get on NULL input only results in
1599 * error if the length is not zero, and that a NULL output is valid for data
1600 * dropping.
1601 */
Janos Follath6264e662019-11-26 11:11:15 +00001602
1603 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, sizeof( input ) ) == 0 );
1604
1605 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
1606 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, sizeof( output ) )
Andrzej Kurekf7774142020-01-22 06:34:59 -05001607 == 0 );
Janos Follath6264e662019-11-26 11:11:15 +00001608 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == 0 );
1609 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == 0 );
1610
Piotr Nowickifb437d72020-01-13 16:59:12 +01001611 /* Make sure calling put several times in the row is safe */
1612
1613 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) )
1614 == sizeof( input ) );
1615 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, 2 ) == 2 );
1616 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 1 ) == 1 );
1617 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 1 );
1618 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 0 );
1619
1620
Janos Follath6264e662019-11-26 11:11:15 +00001621exit:
1622
1623 mbedtls_test_buffer_free( &buf );
1624}
1625/* END_CASE */
1626
1627/*
1628 * Test if the implementation of `mbedtls_test_buffer` related functions is
1629 * correct and works as expected.
1630 *
1631 * That is
1632 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
1633 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1634 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
1635 * bytes.
1636 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1637 * - All of the bytes we got match the bytes we put in in a FIFO manner.
1638 */
1639
1640/* BEGIN_CASE */
1641void test_callback_buffer( int size, int put1, int put1_ret,
1642 int get1, int get1_ret, int put2, int put2_ret,
1643 int get2, int get2_ret )
1644{
1645 enum { ROUNDS = 2 };
1646 size_t put[ROUNDS];
1647 int put_ret[ROUNDS];
1648 size_t get[ROUNDS];
1649 int get_ret[ROUNDS];
1650 mbedtls_test_buffer buf;
1651 unsigned char* input = NULL;
1652 size_t input_len;
1653 unsigned char* output = NULL;
1654 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00001655 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00001656
1657 mbedtls_test_buffer_init( &buf );
1658 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, size ) == 0 );
1659
1660 /* Check the sanity of input parameters and initialise local variables. That
1661 * is, ensure that the amount of data is not negative and that we are not
1662 * expecting more to put or get than we actually asked for. */
1663 TEST_ASSERT( put1 >= 0 );
1664 put[0] = put1;
1665 put_ret[0] = put1_ret;
1666 TEST_ASSERT( put1_ret <= put1 );
1667 TEST_ASSERT( put2 >= 0 );
1668 put[1] = put2;
1669 put_ret[1] = put2_ret;
1670 TEST_ASSERT( put2_ret <= put2 );
1671
1672 TEST_ASSERT( get1 >= 0 );
1673 get[0] = get1;
1674 get_ret[0] = get1_ret;
1675 TEST_ASSERT( get1_ret <= get1 );
1676 TEST_ASSERT( get2 >= 0 );
1677 get[1] = get2;
1678 get_ret[1] = get2_ret;
1679 TEST_ASSERT( get2_ret <= get2 );
1680
1681 input_len = 0;
1682 /* Calculate actual input and output lengths */
1683 for( j = 0; j < ROUNDS; j++ )
1684 {
1685 if( put_ret[j] > 0 )
1686 {
1687 input_len += put_ret[j];
1688 }
1689 }
1690 /* In order to always have a valid pointer we always allocate at least 1
1691 * byte. */
1692 if( input_len == 0 )
1693 input_len = 1;
1694 ASSERT_ALLOC( input, input_len );
1695
1696 output_len = 0;
1697 for( j = 0; j < ROUNDS; j++ )
1698 {
1699 if( get_ret[j] > 0 )
1700 {
1701 output_len += get_ret[j];
1702 }
1703 }
1704 TEST_ASSERT( output_len <= input_len );
1705 /* In order to always have a valid pointer we always allocate at least 1
1706 * byte. */
1707 if( output_len == 0 )
1708 output_len = 1;
1709 ASSERT_ALLOC( output, output_len );
1710
1711 /* Fill up the buffer with structured data so that unwanted changes
1712 * can be detected */
1713 for( i = 0; i < input_len; i++ )
1714 {
1715 input[i] = i & 0xFF;
1716 }
1717
1718 written = read = 0;
1719 for( j = 0; j < ROUNDS; j++ )
1720 {
1721 TEST_ASSERT( put_ret[j] == mbedtls_test_buffer_put( &buf,
1722 input + written, put[j] ) );
1723 written += put_ret[j];
1724 TEST_ASSERT( get_ret[j] == mbedtls_test_buffer_get( &buf,
1725 output + read, get[j] ) );
1726 read += get_ret[j];
1727 TEST_ASSERT( read <= written );
1728 if( get_ret[j] > 0 )
1729 {
1730 TEST_ASSERT( memcmp( output + read - get_ret[j],
1731 input + read - get_ret[j], get_ret[j] )
1732 == 0 );
1733 }
1734 }
1735
1736exit:
1737
1738 mbedtls_free( input );
1739 mbedtls_free( output );
1740 mbedtls_test_buffer_free( &buf );
1741}
1742/* END_CASE */
1743
Janos Follath031827f2019-11-27 11:12:14 +00001744/*
Janos Follathc673c2c2019-12-02 15:47:26 +00001745 * Test if the implementation of `mbedtls_mock_socket` related I/O functions is
1746 * correct and works as expected on unconnected sockets.
1747 */
1748
1749/* BEGIN_CASE */
1750void ssl_mock_sanity( )
1751{
1752 enum { MSGLEN = 105 };
1753 unsigned char message[MSGLEN];
1754 unsigned char received[MSGLEN];
1755 mbedtls_mock_socket socket;
1756
1757 mbedtls_mock_socket_init( &socket );
1758 TEST_ASSERT( mbedtls_mock_tcp_send_b( &socket, message, MSGLEN ) < 0 );
1759 mbedtls_mock_socket_close( &socket );
1760 mbedtls_mock_socket_init( &socket );
1761 TEST_ASSERT( mbedtls_mock_tcp_recv_b( &socket, received, MSGLEN ) < 0 );
1762 mbedtls_mock_socket_close( &socket );
1763
1764 mbedtls_mock_socket_init( &socket );
1765 TEST_ASSERT( mbedtls_mock_tcp_send_nb( &socket, message, MSGLEN ) < 0 );
1766 mbedtls_mock_socket_close( &socket );
1767 mbedtls_mock_socket_init( &socket );
1768 TEST_ASSERT( mbedtls_mock_tcp_recv_nb( &socket, received, MSGLEN ) < 0 );
1769 mbedtls_mock_socket_close( &socket );
1770
1771exit:
1772
1773 mbedtls_mock_socket_close( &socket );
1774}
1775/* END_CASE */
1776
1777/*
1778 * Test if the implementation of `mbedtls_mock_socket` related functions can
1779 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00001780 */
1781
1782/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001783void ssl_mock_tcp( int blocking )
Janos Follath031827f2019-11-27 11:12:14 +00001784{
Janos Follathc673c2c2019-12-02 15:47:26 +00001785 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001786 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00001787 unsigned char message[MSGLEN];
1788 unsigned char received[MSGLEN];
1789 mbedtls_mock_socket client;
1790 mbedtls_mock_socket server;
1791 size_t written, read;
1792 int send_ret, recv_ret;
1793 mbedtls_ssl_send_t *send;
1794 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00001795 unsigned i;
1796
1797 if( blocking == 0 )
1798 {
1799 send = mbedtls_mock_tcp_send_nb;
1800 recv = mbedtls_mock_tcp_recv_nb;
1801 }
1802 else
1803 {
1804 send = mbedtls_mock_tcp_send_b;
1805 recv = mbedtls_mock_tcp_recv_b;
1806 }
1807
1808 mbedtls_mock_socket_init( &client );
1809 mbedtls_mock_socket_init( &server );
1810
1811 /* Fill up the buffer with structured data so that unwanted changes
1812 * can be detected */
1813 for( i = 0; i < MSGLEN; i++ )
1814 {
1815 message[i] = i & 0xFF;
1816 }
1817
1818 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001819 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follathc673c2c2019-12-02 15:47:26 +00001820
1821 /* Send the message to the server */
1822 send_ret = recv_ret = 1;
1823 written = read = 0;
1824 while( send_ret != 0 || recv_ret != 0 )
1825 {
1826 send_ret = send( &client, message + written, MSGLEN - written );
1827
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001828 TEST_ASSERT( send_ret >= 0 );
1829 TEST_ASSERT( send_ret <= BUFLEN );
1830 written += send_ret;
1831
1832 /* If the buffer is full we can test blocking and non-blocking send */
1833 if ( send_ret == BUFLEN )
Janos Follathc673c2c2019-12-02 15:47:26 +00001834 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001835 int blocking_ret = send( &client, message , 1 );
1836 if ( blocking )
1837 {
1838 TEST_ASSERT( blocking_ret == 0 );
1839 }
1840 else
1841 {
1842 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1843 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001844 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001845
1846 recv_ret = recv( &server, received + read, MSGLEN - read );
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001847
1848 /* The result depends on whether any data was sent */
1849 if ( send_ret > 0 )
Janos Follathc673c2c2019-12-02 15:47:26 +00001850 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001851 TEST_ASSERT( recv_ret > 0 );
1852 TEST_ASSERT( recv_ret <= BUFLEN );
1853 read += recv_ret;
1854 }
1855 else if( blocking )
1856 {
1857 TEST_ASSERT( recv_ret == 0 );
Janos Follathc673c2c2019-12-02 15:47:26 +00001858 }
1859 else
1860 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001861 TEST_ASSERT( recv_ret == MBEDTLS_ERR_SSL_WANT_READ );
1862 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00001863 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001864
1865 /* If the buffer is empty we can test blocking and non-blocking read */
1866 if ( recv_ret == BUFLEN )
1867 {
1868 int blocking_ret = recv( &server, received, 1 );
1869 if ( blocking )
1870 {
1871 TEST_ASSERT( blocking_ret == 0 );
1872 }
1873 else
1874 {
1875 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
1876 }
1877 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001878 }
1879 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1880
1881exit:
1882
1883 mbedtls_mock_socket_close( &client );
1884 mbedtls_mock_socket_close( &server );
1885}
1886/* END_CASE */
1887
1888/*
1889 * Test if the implementation of `mbedtls_mock_socket` related functions can
1890 * send messages in both direction at the same time (with the I/O calls
1891 * interleaving).
1892 */
1893
1894/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001895void ssl_mock_tcp_interleaving( int blocking )
Janos Follathc673c2c2019-12-02 15:47:26 +00001896{
Janos Follath031827f2019-11-27 11:12:14 +00001897 enum { ROUNDS = 2 };
1898 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001899 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00001900 unsigned char message[ROUNDS][MSGLEN];
1901 unsigned char received[ROUNDS][MSGLEN];
1902 mbedtls_mock_socket client;
1903 mbedtls_mock_socket server;
1904 size_t written[ROUNDS];
1905 size_t read[ROUNDS];
1906 int send_ret[ROUNDS];
1907 int recv_ret[ROUNDS];
1908 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00001909 mbedtls_ssl_send_t *send;
1910 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00001911
1912 if( blocking == 0 )
1913 {
1914 send = mbedtls_mock_tcp_send_nb;
1915 recv = mbedtls_mock_tcp_recv_nb;
1916 }
1917 else
1918 {
1919 send = mbedtls_mock_tcp_send_b;
1920 recv = mbedtls_mock_tcp_recv_b;
1921 }
Janos Follath031827f2019-11-27 11:12:14 +00001922
1923 mbedtls_mock_socket_init( &client );
1924 mbedtls_mock_socket_init( &server );
1925
1926 /* Fill up the buffers with structured data so that unwanted changes
1927 * can be detected */
1928 for( i = 0; i < ROUNDS; i++ )
1929 {
1930 for( j = 0; j < MSGLEN; j++ )
1931 {
1932 message[i][j] = ( i * MSGLEN + j ) & 0xFF;
1933 }
1934 }
1935
Janos Follath031827f2019-11-27 11:12:14 +00001936 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001937 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follath031827f2019-11-27 11:12:14 +00001938
Janos Follath031827f2019-11-27 11:12:14 +00001939 /* Send the message from both sides, interleaving. */
1940 progress = 1;
1941 for( i = 0; i < ROUNDS; i++ )
1942 {
1943 written[i] = 0;
1944 read[i] = 0;
1945 }
1946 /* This loop does not stop as long as there was a successful write or read
1947 * of at least one byte on either side. */
1948 while( progress != 0 )
1949 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001950 mbedtls_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00001951
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001952 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001953 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001954 /* First sending is from the client */
1955 socket = ( i % 2 == 0 ) ? ( &client ) : ( &server );
Janos Follath031827f2019-11-27 11:12:14 +00001956
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001957 send_ret[i] = send( socket, message[i] + written[i],
1958 MSGLEN - written[i] );
1959 TEST_ASSERT( send_ret[i] >= 0 );
1960 TEST_ASSERT( send_ret[i] <= BUFLEN );
1961 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00001962
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001963 /* If the buffer is full we can test blocking and non-blocking
1964 * send */
1965 if ( send_ret[i] == BUFLEN )
1966 {
1967 int blocking_ret = send( socket, message[i] , 1 );
1968 if ( blocking )
1969 {
1970 TEST_ASSERT( blocking_ret == 0 );
1971 }
1972 else
1973 {
1974 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1975 }
1976 }
Janos Follath3766ba52019-11-27 13:31:42 +00001977 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001978
1979 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001980 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001981 /* First receiving is from the server */
1982 socket = ( i % 2 == 0 ) ? ( &server ) : ( &client );
1983
1984 recv_ret[i] = recv( socket, received[i] + read[i],
1985 MSGLEN - read[i] );
1986
1987 /* The result depends on whether any data was sent */
1988 if ( send_ret[i] > 0 )
1989 {
1990 TEST_ASSERT( recv_ret[i] > 0 );
1991 TEST_ASSERT( recv_ret[i] <= BUFLEN );
1992 read[i] += recv_ret[i];
1993 }
1994 else if( blocking )
1995 {
1996 TEST_ASSERT( recv_ret[i] == 0 );
1997 }
1998 else
1999 {
2000 TEST_ASSERT( recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ );
2001 recv_ret[i] = 0;
2002 }
2003
2004 /* If the buffer is empty we can test blocking and non-blocking
2005 * read */
2006 if ( recv_ret[i] == BUFLEN )
2007 {
2008 int blocking_ret = recv( socket, received[i], 1 );
2009 if ( blocking )
2010 {
2011 TEST_ASSERT( blocking_ret == 0 );
2012 }
2013 else
2014 {
2015 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
2016 }
2017 }
Janos Follath3766ba52019-11-27 13:31:42 +00002018 }
Janos Follath031827f2019-11-27 11:12:14 +00002019
2020 progress = 0;
2021 for( i = 0; i < ROUNDS; i++ )
2022 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002023 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002024 }
2025 }
2026
2027 for( i = 0; i < ROUNDS; i++ )
2028 TEST_ASSERT( memcmp( message[i], received[i], MSGLEN ) == 0 );
2029
2030exit:
2031
2032 mbedtls_mock_socket_close( &client );
2033 mbedtls_mock_socket_close( &server );
2034}
2035/* END_CASE */
2036
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002037/* BEGIN_CASE */
2038void ssl_message_queue_sanity( )
2039{
2040 mbedtls_test_message_queue queue;
2041
2042 /* Trying to push/pull to an empty queue */
2043 TEST_ASSERT( mbedtls_test_message_queue_push_info( NULL, 1 )
2044 == MBEDTLS_TEST_ERROR_ARG_NULL );
2045 TEST_ASSERT( mbedtls_test_message_queue_pop_info( NULL, 1 )
2046 == MBEDTLS_TEST_ERROR_ARG_NULL );
2047
2048 mbedtls_test_message_queue_setup( &queue, 3 );
2049 TEST_ASSERT( queue.capacity == 3 );
2050 TEST_ASSERT( queue.num == 0 );
2051
2052exit:
2053 mbedtls_test_message_queue_free( &queue );
2054}
2055/* END_CASE */
2056
2057/* BEGIN_CASE */
2058void ssl_message_queue_basic( )
2059{
2060 mbedtls_test_message_queue queue;
2061
2062 mbedtls_test_message_queue_setup( &queue, 3 );
2063
2064 /* Sanity test - 3 pushes and 3 pops with sufficient space */
2065 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2066 TEST_ASSERT( queue.capacity == 3 );
2067 TEST_ASSERT( queue.num == 1 );
2068 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2069 TEST_ASSERT( queue.capacity == 3 );
2070 TEST_ASSERT( queue.num == 2 );
2071 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2072 TEST_ASSERT( queue.capacity == 3 );
2073 TEST_ASSERT( queue.num == 3 );
2074
2075 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2076 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2077 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2078
2079exit:
2080 mbedtls_test_message_queue_free( &queue );
2081}
2082/* END_CASE */
2083
2084/* BEGIN_CASE */
2085void ssl_message_queue_overflow_underflow( )
2086{
2087 mbedtls_test_message_queue queue;
2088
2089 mbedtls_test_message_queue_setup( &queue, 3 );
2090
2091 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
2092 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2093 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2094 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2095 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002096 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002097
2098 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2099 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2100 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2101
2102 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002103 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002104
2105exit:
2106 mbedtls_test_message_queue_free( &queue );
2107}
2108/* END_CASE */
2109
2110/* BEGIN_CASE */
2111void ssl_message_queue_interleaved( )
2112{
2113 mbedtls_test_message_queue queue;
2114
2115 mbedtls_test_message_queue_setup( &queue, 3 );
2116
2117 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
2118 * (to wrap around the buffer) */
2119 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2120 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
2121
2122 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2123
2124 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
2125 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 ) == 3 );
2126
2127 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
2128 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
2129
2130 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 5 ) == 5 );
2131 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 8 ) == 8 );
2132
2133 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 3 ) == 3 );
2134
2135 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 5 ) == 5 );
2136
2137 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 8 ) == 8 );
2138
2139exit:
2140 mbedtls_test_message_queue_free( &queue );
2141}
2142/* END_CASE */
2143
2144/* BEGIN_CASE */
2145void ssl_message_queue_insufficient_buffer( )
2146{
2147 mbedtls_test_message_queue queue;
2148 size_t message_len = 10;
2149 size_t buffer_len = 5;
2150
2151 mbedtls_test_message_queue_setup( &queue, 1 );
2152
2153 /* Popping without a sufficient buffer */
2154 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, message_len )
2155 == (int) message_len );
2156 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, buffer_len )
2157 == (int) buffer_len );
2158exit:
2159 mbedtls_test_message_queue_free( &queue );
2160}
2161/* END_CASE */
2162
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002163/* BEGIN_CASE */
2164void ssl_message_mock_uninitialized( )
2165{
2166 enum { MSGLEN = 10 };
2167 unsigned char message[MSGLEN], received[MSGLEN];
2168 mbedtls_mock_socket client, server;
2169 mbedtls_test_message_queue server_queue, client_queue;
2170 mbedtls_test_message_socket_context server_context, client_context;
2171
2172 /* Send with a NULL context */
2173 TEST_ASSERT( mbedtls_mock_tcp_send_msg( NULL, message, MSGLEN )
2174 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
2175
2176 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( NULL, message, MSGLEN )
2177 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
2178
2179 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2180 &server,
2181 &server_context ) == 0 );
2182
2183 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2184 &client,
2185 &client_context ) == 0 );
2186
2187 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message, MSGLEN )
2188 == MBEDTLS_TEST_ERROR_SEND_FAILED );
2189
2190 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002191 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002192
2193 /* Push directly to a queue to later simulate a disconnected behavior */
2194 TEST_ASSERT( mbedtls_test_message_queue_push_info( &server_queue, MSGLEN )
2195 == MSGLEN );
2196
2197 /* Test if there's an error when trying to read from a disconnected
2198 * socket */
2199 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2200 == MBEDTLS_TEST_ERROR_RECV_FAILED );
2201 exit:
2202 mbedtls_message_socket_close( &server_context );
2203 mbedtls_message_socket_close( &client_context );
2204}
2205/* END_CASE */
2206
2207/* BEGIN_CASE */
2208void ssl_message_mock_basic( )
2209{
2210 enum { MSGLEN = 10 };
2211 unsigned char message[MSGLEN], received[MSGLEN];
2212 mbedtls_mock_socket client, server;
2213 unsigned i;
2214 mbedtls_test_message_queue server_queue, client_queue;
2215 mbedtls_test_message_socket_context server_context, client_context;
2216
2217 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2218 &server,
2219 &server_context ) == 0 );
2220
2221 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2222 &client,
2223 &client_context ) == 0 );
2224
2225 /* Fill up the buffer with structured data so that unwanted changes
2226 * can be detected */
2227 for( i = 0; i < MSGLEN; i++ )
2228 {
2229 message[i] = i & 0xFF;
2230 }
2231 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2232 MSGLEN ) );
2233
2234 /* Send the message to the server */
2235 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2236 MSGLEN ) == MSGLEN );
2237
2238 /* Read from the server */
2239 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2240 == MSGLEN );
2241
2242 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2243 memset( received, 0, MSGLEN );
2244
2245 /* Send the message to the client */
2246 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2247 MSGLEN ) == MSGLEN );
2248
2249 /* Read from the client */
2250 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
2251 == MSGLEN );
2252 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2253
2254 exit:
2255 mbedtls_message_socket_close( &server_context );
2256 mbedtls_message_socket_close( &client_context );
2257}
2258/* END_CASE */
2259
2260/* BEGIN_CASE */
2261void ssl_message_mock_queue_overflow_underflow( )
2262{
2263 enum { MSGLEN = 10 };
2264 unsigned char message[MSGLEN], received[MSGLEN];
2265 mbedtls_mock_socket client, server;
2266 unsigned i;
2267 mbedtls_test_message_queue server_queue, client_queue;
2268 mbedtls_test_message_socket_context server_context, client_context;
2269
2270 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2271 &server,
2272 &server_context ) == 0 );
2273
2274 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2275 &client,
2276 &client_context ) == 0 );
2277
2278 /* Fill up the buffer with structured data so that unwanted changes
2279 * can be detected */
2280 for( i = 0; i < MSGLEN; i++ )
2281 {
2282 message[i] = i & 0xFF;
2283 }
2284 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2285 MSGLEN*2 ) );
2286
2287 /* Send three message to the server, last one with an error */
2288 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2289 MSGLEN - 1 ) == MSGLEN - 1 );
2290
2291 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2292 MSGLEN ) == MSGLEN );
2293
2294 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2295 MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002296 == MBEDTLS_ERR_SSL_WANT_WRITE );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002297
2298 /* Read three messages from the server, last one with an error */
2299 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2300 MSGLEN - 1 ) == MSGLEN - 1 );
2301
2302 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2303 == MSGLEN );
2304
2305 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2306
2307 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002308 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002309
2310 exit:
2311 mbedtls_message_socket_close( &server_context );
2312 mbedtls_message_socket_close( &client_context );
2313}
2314/* END_CASE */
2315
2316/* BEGIN_CASE */
2317void ssl_message_mock_socket_overflow( )
2318{
2319 enum { MSGLEN = 10 };
2320 unsigned char message[MSGLEN], received[MSGLEN];
2321 mbedtls_mock_socket client, server;
2322 unsigned i;
2323 mbedtls_test_message_queue server_queue, client_queue;
2324 mbedtls_test_message_socket_context server_context, client_context;
2325
2326 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2327 &server,
2328 &server_context ) == 0 );
2329
2330 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2331 &client,
2332 &client_context ) == 0 );
2333
2334 /* Fill up the buffer with structured data so that unwanted changes
2335 * can be detected */
2336 for( i = 0; i < MSGLEN; i++ )
2337 {
2338 message[i] = i & 0xFF;
2339 }
2340 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2341 MSGLEN ) );
2342
2343 /* Send two message to the server, second one with an error */
2344 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2345 MSGLEN ) == MSGLEN );
2346
2347 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2348 MSGLEN )
2349 == MBEDTLS_TEST_ERROR_SEND_FAILED );
2350
2351 /* Read the only message from the server */
2352 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2353 == MSGLEN );
2354
2355 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2356
2357 exit:
2358 mbedtls_message_socket_close( &server_context );
2359 mbedtls_message_socket_close( &client_context );
2360}
2361/* END_CASE */
2362
2363/* BEGIN_CASE */
2364void ssl_message_mock_truncated( )
2365{
2366 enum { MSGLEN = 10 };
2367 unsigned char message[MSGLEN], received[MSGLEN];
2368 mbedtls_mock_socket client, server;
2369 unsigned i;
2370 mbedtls_test_message_queue server_queue, client_queue;
2371 mbedtls_test_message_socket_context server_context, client_context;
2372
2373 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2374 &server,
2375 &server_context ) == 0 );
2376
2377 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2378 &client,
2379 &client_context ) == 0 );
2380
2381 memset( received, 0, MSGLEN );
2382 /* Fill up the buffer with structured data so that unwanted changes
2383 * can be detected */
2384 for( i = 0; i < MSGLEN; i++ )
2385 {
2386 message[i] = i & 0xFF;
2387 }
2388 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2389 2 * MSGLEN ) );
2390
2391 /* Send two messages to the server, the second one small enough to fit in the
2392 * receiver's buffer. */
2393 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2394 MSGLEN ) == MSGLEN );
2395 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2396 MSGLEN / 2 ) == MSGLEN / 2 );
2397 /* Read a truncated message from the server */
2398 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2399 == MSGLEN/2 );
2400
2401 /* Test that the first half of the message is valid, and second one isn't */
2402 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2403 TEST_ASSERT( memcmp( message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2 )
2404 != 0 );
2405 memset( received, 0, MSGLEN );
2406
2407 /* Read a full message from the server */
2408 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2409 == MSGLEN / 2 );
2410
2411 /* Test that the first half of the message is valid */
2412 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2413
2414 exit:
2415 mbedtls_message_socket_close( &server_context );
2416 mbedtls_message_socket_close( &client_context );
2417}
2418/* END_CASE */
2419
2420/* BEGIN_CASE */
2421void ssl_message_mock_socket_read_error( )
2422{
2423 enum { MSGLEN = 10 };
2424 unsigned char message[MSGLEN], received[MSGLEN];
2425 mbedtls_mock_socket client, server;
2426 unsigned i;
2427 mbedtls_test_message_queue server_queue, client_queue;
2428 mbedtls_test_message_socket_context server_context, client_context;
2429
2430 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2431 &server,
2432 &server_context ) == 0 );
2433
2434 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2435 &client,
2436 &client_context ) == 0 );
2437
2438 /* Fill up the buffer with structured data so that unwanted changes
2439 * can be detected */
2440 for( i = 0; i < MSGLEN; i++ )
2441 {
2442 message[i] = i & 0xFF;
2443 }
2444 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2445 MSGLEN ) );
2446
2447 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2448 MSGLEN ) == MSGLEN );
2449
2450 /* Force a read error by disconnecting the socket by hand */
2451 server.status = 0;
2452 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2453 == MBEDTLS_TEST_ERROR_RECV_FAILED );
2454 /* Return to a valid state */
2455 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
2456
2457 memset( received, 0, sizeof( received ) );
2458
2459 /* Test that even though the server tried to read once disconnected, the
2460 * continuity is preserved */
2461 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2462 == MSGLEN );
2463
2464 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2465
2466 exit:
2467 mbedtls_message_socket_close( &server_context );
2468 mbedtls_message_socket_close( &client_context );
2469}
2470/* END_CASE */
2471
2472/* BEGIN_CASE */
2473void ssl_message_mock_interleaved_one_way( )
2474{
2475 enum { MSGLEN = 10 };
2476 unsigned char message[MSGLEN], received[MSGLEN];
2477 mbedtls_mock_socket client, server;
2478 unsigned i;
2479 mbedtls_test_message_queue server_queue, client_queue;
2480 mbedtls_test_message_socket_context server_context, client_context;
2481
2482 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2483 &server,
2484 &server_context ) == 0 );
2485
2486 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2487 &client,
2488 &client_context ) == 0 );
2489
2490 /* Fill up the buffer with structured data so that unwanted changes
2491 * can be detected */
2492 for( i = 0; i < MSGLEN; i++ )
2493 {
2494 message[i] = i & 0xFF;
2495 }
2496 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2497 MSGLEN*3 ) );
2498
2499 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
2500 * (to wrap around the buffer) */
2501 for( i = 0; i < 2; i++ )
2502 {
2503 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2504 MSGLEN ) == MSGLEN );
2505
2506 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2507 MSGLEN ) == MSGLEN );
2508
2509 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2510 MSGLEN ) == MSGLEN );
2511 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2512 memset( received, 0, sizeof( received ) );
2513 }
2514
2515 for( i = 0; i < 2; i++ )
2516 {
2517 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2518 MSGLEN ) == MSGLEN );
2519
2520 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2521 }
2522 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002523 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002524 exit:
2525 mbedtls_message_socket_close( &server_context );
2526 mbedtls_message_socket_close( &client_context );
2527}
2528/* END_CASE */
2529
2530/* BEGIN_CASE */
2531void ssl_message_mock_interleaved_two_ways( )
2532{
2533 enum { MSGLEN = 10 };
2534 unsigned char message[MSGLEN], received[MSGLEN];
2535 mbedtls_mock_socket client, server;
2536 unsigned i;
2537 mbedtls_test_message_queue server_queue, client_queue;
2538 mbedtls_test_message_socket_context server_context, client_context;
2539
2540 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2541 &server,
2542 &server_context ) == 0 );
2543
2544 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2545 &client,
2546 &client_context ) == 0 );
2547
2548 /* Fill up the buffer with structured data so that unwanted changes
2549 * can be detected */
2550 for( i = 0; i < MSGLEN; i++ )
2551 {
2552 message[i] = i & 0xFF;
2553 }
2554 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2555 MSGLEN*3 ) );
2556
2557 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
2558 * (to wrap around the buffer) both ways. */
2559 for( i = 0; i < 2; i++ )
2560 {
2561 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2562 MSGLEN ) == MSGLEN );
2563
2564 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2565 MSGLEN ) == MSGLEN );
2566
2567 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2568 MSGLEN ) == MSGLEN );
2569
2570 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2571 MSGLEN ) == MSGLEN );
2572
2573 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2574 MSGLEN ) == MSGLEN );
2575
2576 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2577
2578 memset( received, 0, sizeof( received ) );
2579
2580 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2581 MSGLEN ) == MSGLEN );
2582
2583 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2584
2585 memset( received, 0, sizeof( received ) );
2586 }
2587
2588 for( i = 0; i < 2; i++ )
2589 {
2590 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2591 MSGLEN ) == MSGLEN );
2592
2593 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2594 memset( received, 0, sizeof( received ) );
2595
2596 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2597 MSGLEN ) == MSGLEN );
2598
2599 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2600 memset( received, 0, sizeof( received ) );
2601 }
2602
2603 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002604 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002605
2606 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
Andrzej Kurekf46b9122020-02-07 08:19:00 -05002607 == MBEDTLS_ERR_SSL_WANT_READ );
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002608 exit:
2609 mbedtls_message_socket_close( &server_context );
2610 mbedtls_message_socket_close( &client_context );
2611}
2612/* END_CASE */
2613
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002614/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Azim Khan5fcca462018-06-29 11:05:32 +01002615void ssl_dtls_replay( data_t * prevs, data_t * new, int ret )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002616{
Azim Khand30ca132017-06-09 04:32:58 +01002617 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002618 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002619 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002620
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002621 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002622 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002623
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02002624 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
2625 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02002626 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2627 MBEDTLS_SSL_PRESET_DEFAULT ) == 0 );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002628 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002629
2630 /* Read previous record numbers */
Azim Khand30ca132017-06-09 04:32:58 +01002631 for( len = 0; len < prevs->len; len += 6 )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002632 {
Azim Khand30ca132017-06-09 04:32:58 +01002633 memcpy( ssl.in_ctr + 2, prevs->x + len, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002634 mbedtls_ssl_dtls_replay_update( &ssl );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002635 }
2636
2637 /* Check new number */
Azim Khand30ca132017-06-09 04:32:58 +01002638 memcpy( ssl.in_ctr + 2, new->x, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002639 TEST_ASSERT( mbedtls_ssl_dtls_replay_check( &ssl ) == ret );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002641 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002642 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002643}
2644/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002645
2646/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
2647void ssl_set_hostname_twice( char *hostname0, char *hostname1 )
2648{
2649 mbedtls_ssl_context ssl;
2650 mbedtls_ssl_init( &ssl );
2651
2652 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname0 ) == 0 );
2653 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname1 ) == 0 );
2654
2655 mbedtls_ssl_free( &ssl );
2656}
Darryl Green11999bb2018-03-13 15:22:58 +00002657/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00002658
2659/* BEGIN_CASE */
2660void ssl_crypt_record( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002661 int etm, int tag_mode, int ver,
2662 int cid0_len, int cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00002663{
2664 /*
2665 * Test several record encryptions and decryptions
2666 * with plenty of space before and after the data
2667 * within the record buffer.
2668 */
2669
2670 int ret;
2671 int num_records = 16;
2672 mbedtls_ssl_context ssl; /* ONLY for debugging */
2673
2674 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002675 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00002676 size_t const buflen = 512;
2677 mbedtls_record rec, rec_backup;
2678
2679 mbedtls_ssl_init( &ssl );
2680 mbedtls_ssl_transform_init( &t0 );
2681 mbedtls_ssl_transform_init( &t1 );
2682 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002683 etm, tag_mode, ver,
2684 (size_t) cid0_len,
2685 (size_t) cid1_len ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002686
Hanno Becker3ee54212019-04-04 16:31:26 +01002687 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00002688
2689 while( num_records-- > 0 )
2690 {
2691 mbedtls_ssl_transform *t_dec, *t_enc;
2692 /* Take turns in who's sending and who's receiving. */
2693 if( num_records % 3 == 0 )
2694 {
2695 t_dec = &t0;
2696 t_enc = &t1;
2697 }
2698 else
2699 {
2700 t_dec = &t1;
2701 t_enc = &t0;
2702 }
2703
2704 /*
2705 * The record header affects the transformation in two ways:
2706 * 1) It determines the AEAD additional data
2707 * 2) The record counter sometimes determines the IV.
2708 *
2709 * Apart from that, the fields don't have influence.
2710 * In particular, it is currently not the responsibility
2711 * of ssl_encrypt/decrypt_buf to check if the transform
2712 * version matches the record version, or that the
2713 * type is sensible.
2714 */
2715
2716 memset( rec.ctr, num_records, sizeof( rec.ctr ) );
2717 rec.type = 42;
2718 rec.ver[0] = num_records;
2719 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002720#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002721 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002722#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00002723
2724 rec.buf = buf;
2725 rec.buf_len = buflen;
2726 rec.data_offset = 16;
2727 /* Make sure to vary the length to exercise different
2728 * paddings. */
2729 rec.data_len = 1 + num_records;
2730
2731 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2732
2733 /* Make a copy for later comparison */
2734 rec_backup = rec;
2735
2736 /* Encrypt record */
2737 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec,
2738 rnd_std_rand, NULL );
2739 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2740 if( ret != 0 )
2741 {
2742 continue;
2743 }
2744
2745 /* Decrypt record with t_dec */
Hanno Beckerd856c822019-04-29 17:30:59 +01002746 ret = mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec );
2747 TEST_ASSERT( ret == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002748
2749 /* Compare results */
2750 TEST_ASSERT( rec.type == rec_backup.type );
2751 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2752 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2753 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2754 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2755 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2756 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2757 rec_backup.buf + rec_backup.data_offset,
2758 rec.data_len ) == 0 );
2759 }
2760
Hanno Becker81e16a32019-03-01 11:21:44 +00002761exit:
2762
Hanno Beckera18d1322018-01-03 14:27:32 +00002763 /* Cleanup */
2764 mbedtls_ssl_free( &ssl );
2765 mbedtls_ssl_transform_free( &t0 );
2766 mbedtls_ssl_transform_free( &t1 );
2767
Hanno Becker3ee54212019-04-04 16:31:26 +01002768 mbedtls_free( buf );
Hanno Beckera18d1322018-01-03 14:27:32 +00002769}
2770/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002771
2772/* BEGIN_CASE */
2773void ssl_crypt_record_small( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002774 int etm, int tag_mode, int ver,
2775 int cid0_len, int cid1_len )
Hanno Beckerb3268da2018-01-05 15:20:24 +00002776{
2777 /*
2778 * Test pairs of encryption and decryption with an increasing
2779 * amount of space in the record buffer - in more detail:
2780 * 1) Try to encrypt with 0, 1, 2, ... bytes available
2781 * in front of the plaintext, and expect the encryption
2782 * to succeed starting from some offset. Always keep
2783 * enough space in the end of the buffer.
2784 * 2) Try to encrypt with 0, 1, 2, ... bytes available
2785 * at the end of the plaintext, and expect the encryption
2786 * to succeed starting from some offset. Always keep
2787 * enough space at the beginning of the buffer.
2788 * 3) Try to encrypt with 0, 1, 2, ... bytes available
2789 * both at the front and end of the plaintext,
2790 * and expect the encryption to succeed starting from
2791 * some offset.
2792 *
2793 * If encryption succeeds, check that decryption succeeds
2794 * and yields the original record.
2795 */
2796
2797 mbedtls_ssl_context ssl; /* ONLY for debugging */
2798
2799 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002800 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01002801 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002802 mbedtls_record rec, rec_backup;
2803
2804 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01002805 int mode; /* Mode 1, 2 or 3 as explained above */
2806 size_t offset; /* Available space at beginning/end/both */
2807 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002808
Hanno Beckerd856c822019-04-29 17:30:59 +01002809 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
2810 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002811
2812 int seen_success; /* Indicates if in the current mode we've
2813 * already seen a successful test. */
2814
2815 mbedtls_ssl_init( &ssl );
2816 mbedtls_ssl_transform_init( &t0 );
2817 mbedtls_ssl_transform_init( &t1 );
2818 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002819 etm, tag_mode, ver,
2820 (size_t) cid0_len,
2821 (size_t) cid1_len ) == 0 );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002822
Hanno Becker3ee54212019-04-04 16:31:26 +01002823 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002824
2825 for( mode=1; mode <= 3; mode++ )
2826 {
2827 seen_success = 0;
2828 for( offset=0; offset <= threshold; offset++ )
2829 {
2830 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01002831 t_dec = &t0;
2832 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002833
2834 memset( rec.ctr, offset, sizeof( rec.ctr ) );
2835 rec.type = 42;
2836 rec.ver[0] = offset;
2837 rec.ver[1] = offset;
2838 rec.buf = buf;
2839 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002840#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002841 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002842#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002843
2844 switch( mode )
2845 {
2846 case 1: /* Space in the beginning */
2847 rec.data_offset = offset;
2848 rec.data_len = buflen - offset - default_post_padding;
2849 break;
2850
2851 case 2: /* Space in the end */
2852 rec.data_offset = default_pre_padding;
2853 rec.data_len = buflen - default_pre_padding - offset;
2854 break;
2855
2856 case 3: /* Space in the beginning and end */
2857 rec.data_offset = offset;
2858 rec.data_len = buflen - 2 * offset;
2859 break;
2860
2861 default:
2862 TEST_ASSERT( 0 );
2863 break;
2864 }
2865
2866 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2867
2868 /* Make a copy for later comparison */
2869 rec_backup = rec;
2870
2871 /* Encrypt record */
2872 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec, rnd_std_rand, NULL );
2873
2874 if( ( mode == 1 || mode == 2 ) && seen_success )
2875 {
2876 TEST_ASSERT( ret == 0 );
2877 }
2878 else
2879 {
2880 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2881 if( ret == 0 )
2882 seen_success = 1;
2883 }
2884
2885 if( ret != 0 )
2886 continue;
2887
2888 /* Decrypt record with t_dec */
2889 TEST_ASSERT( mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec ) == 0 );
2890
2891 /* Compare results */
2892 TEST_ASSERT( rec.type == rec_backup.type );
2893 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2894 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2895 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2896 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2897 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2898 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2899 rec_backup.buf + rec_backup.data_offset,
2900 rec.data_len ) == 0 );
2901 }
2902
2903 TEST_ASSERT( seen_success == 1 );
2904 }
2905
Hanno Becker81e16a32019-03-01 11:21:44 +00002906exit:
2907
Hanno Beckerb3268da2018-01-05 15:20:24 +00002908 /* Cleanup */
2909 mbedtls_ssl_free( &ssl );
2910 mbedtls_ssl_transform_free( &t0 );
2911 mbedtls_ssl_transform_free( &t1 );
2912
Hanno Becker3ee54212019-04-04 16:31:26 +01002913 mbedtls_free( buf );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002914}
2915/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03002916
2917/* BEGIN_CASE */
2918void ssl_tls_prf( int type, data_t * secret, data_t * random,
2919 char *label, data_t *result_hex_str, int exp_ret )
2920{
2921 unsigned char *output;
2922
2923 output = mbedtls_calloc( 1, result_hex_str->len );
2924 if( output == NULL )
2925 goto exit;
2926
Ron Eldor6b9b1b82019-05-15 17:04:33 +03002927#if defined(MBEDTLS_USE_PSA_CRYPTO)
2928 TEST_ASSERT( psa_crypto_init() == 0 );
2929#endif
2930
Ron Eldor824ad7b2019-05-13 14:09:00 +03002931 TEST_ASSERT( mbedtls_ssl_tls_prf( type, secret->x, secret->len,
2932 label, random->x, random->len,
2933 output, result_hex_str->len ) == exp_ret );
2934
2935 if( exp_ret == 0 )
2936 {
2937 TEST_ASSERT( hexcmp( output, result_hex_str->x,
2938 result_hex_str->len, result_hex_str->len ) == 0 );
2939 }
2940exit:
2941
2942 mbedtls_free( output );
2943}
2944/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002945
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002946/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002947void ssl_serialize_session_save_load( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002948{
2949 mbedtls_ssl_session original, restored;
2950 unsigned char *buf = NULL;
2951 size_t len;
2952
2953 /*
2954 * Test that a save-load pair is the identity
2955 */
2956
2957 mbedtls_ssl_session_init( &original );
2958 mbedtls_ssl_session_init( &restored );
2959
2960 /* Prepare a dummy session to work on */
2961 TEST_ASSERT( ssl_populate_session( &original, ticket_len, crt_file ) == 0 );
2962
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002963 /* Serialize it */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002964 TEST_ASSERT( mbedtls_ssl_session_save( &original, NULL, 0, &len )
2965 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2966 TEST_ASSERT( ( buf = mbedtls_calloc( 1, len ) ) != NULL );
2967 TEST_ASSERT( mbedtls_ssl_session_save( &original, buf, len, &len )
2968 == 0 );
2969
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002970 /* Restore session from serialized data */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002971 TEST_ASSERT( mbedtls_ssl_session_load( &restored, buf, len) == 0 );
2972
2973 /*
2974 * Make sure both session structures are identical
2975 */
2976#if defined(MBEDTLS_HAVE_TIME)
2977 TEST_ASSERT( original.start == restored.start );
2978#endif
2979 TEST_ASSERT( original.ciphersuite == restored.ciphersuite );
2980 TEST_ASSERT( original.compression == restored.compression );
2981 TEST_ASSERT( original.id_len == restored.id_len );
2982 TEST_ASSERT( memcmp( original.id,
2983 restored.id, sizeof( original.id ) ) == 0 );
2984 TEST_ASSERT( memcmp( original.master,
2985 restored.master, sizeof( original.master ) ) == 0 );
2986
2987#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002988#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002989 TEST_ASSERT( ( original.peer_cert == NULL ) ==
2990 ( restored.peer_cert == NULL ) );
2991 if( original.peer_cert != NULL )
2992 {
2993 TEST_ASSERT( original.peer_cert->raw.len ==
2994 restored.peer_cert->raw.len );
2995 TEST_ASSERT( memcmp( original.peer_cert->raw.p,
2996 restored.peer_cert->raw.p,
2997 original.peer_cert->raw.len ) == 0 );
2998 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002999#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3000 TEST_ASSERT( original.peer_cert_digest_type ==
3001 restored.peer_cert_digest_type );
3002 TEST_ASSERT( original.peer_cert_digest_len ==
3003 restored.peer_cert_digest_len );
3004 TEST_ASSERT( ( original.peer_cert_digest == NULL ) ==
3005 ( restored.peer_cert_digest == NULL ) );
3006 if( original.peer_cert_digest != NULL )
3007 {
3008 TEST_ASSERT( memcmp( original.peer_cert_digest,
3009 restored.peer_cert_digest,
3010 original.peer_cert_digest_len ) == 0 );
3011 }
3012#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3013#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003014 TEST_ASSERT( original.verify_result == restored.verify_result );
3015
3016#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
3017 TEST_ASSERT( original.ticket_len == restored.ticket_len );
3018 if( original.ticket_len != 0 )
3019 {
3020 TEST_ASSERT( original.ticket != NULL );
3021 TEST_ASSERT( restored.ticket != NULL );
3022 TEST_ASSERT( memcmp( original.ticket,
3023 restored.ticket, original.ticket_len ) == 0 );
3024 }
3025 TEST_ASSERT( original.ticket_lifetime == restored.ticket_lifetime );
3026#endif
3027
3028#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3029 TEST_ASSERT( original.mfl_code == restored.mfl_code );
3030#endif
3031
3032#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
3033 TEST_ASSERT( original.trunc_hmac == restored.trunc_hmac );
3034#endif
3035
3036#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
3037 TEST_ASSERT( original.encrypt_then_mac == restored.encrypt_then_mac );
3038#endif
3039
3040exit:
3041 mbedtls_ssl_session_free( &original );
3042 mbedtls_ssl_session_free( &restored );
3043 mbedtls_free( buf );
3044}
3045/* END_CASE */
3046
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02003047/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003048void ssl_serialize_session_load_save( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003049{
3050 mbedtls_ssl_session session;
3051 unsigned char *buf1 = NULL, *buf2 = NULL;
3052 size_t len0, len1, len2;
3053
3054 /*
3055 * Test that a load-save pair is the identity
3056 */
3057
3058 mbedtls_ssl_session_init( &session );
3059
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02003060 /* Prepare a dummy session to work on */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02003061 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02003062
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003063 /* Get desired buffer size for serializing */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003064 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &len0 )
3065 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3066
3067 /* Allocate first buffer */
3068 buf1 = mbedtls_calloc( 1, len0 );
3069 TEST_ASSERT( buf1 != NULL );
3070
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003071 /* Serialize to buffer and free live session */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003072 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf1, len0, &len1 )
3073 == 0 );
3074 TEST_ASSERT( len0 == len1 );
3075 mbedtls_ssl_session_free( &session );
3076
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003077 /* Restore session from serialized data */
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02003078 TEST_ASSERT( mbedtls_ssl_session_load( &session, buf1, len1 ) == 0 );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003079
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003080 /* Allocate second buffer and serialize to it */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003081 buf2 = mbedtls_calloc( 1, len0 );
Manuel Pégourié-Gonnardb4079902019-05-24 09:52:10 +02003082 TEST_ASSERT( buf2 != NULL );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003083 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf2, len0, &len2 )
3084 == 0 );
3085
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003086 /* Make sure both serialized versions are identical */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003087 TEST_ASSERT( len1 == len2 );
3088 TEST_ASSERT( memcmp( buf1, buf2, len1 ) == 0 );
3089
3090exit:
3091 mbedtls_ssl_session_free( &session );
3092 mbedtls_free( buf1 );
3093 mbedtls_free( buf2 );
3094}
3095/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003096
3097/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003098void ssl_serialize_session_save_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003099{
3100 mbedtls_ssl_session session;
3101 unsigned char *buf = NULL;
3102 size_t good_len, bad_len, test_len;
3103
3104 /*
3105 * Test that session_save() fails cleanly on small buffers
3106 */
3107
3108 mbedtls_ssl_session_init( &session );
3109
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003110 /* Prepare dummy session and get serialized size */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02003111 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003112 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
3113 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3114
3115 /* Try all possible bad lengths */
3116 for( bad_len = 1; bad_len < good_len; bad_len++ )
3117 {
3118 /* Allocate exact size so that asan/valgrind can detect any overwrite */
3119 mbedtls_free( buf );
3120 TEST_ASSERT( ( buf = mbedtls_calloc( 1, bad_len ) ) != NULL );
3121 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf, bad_len,
3122 &test_len )
3123 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3124 TEST_ASSERT( test_len == good_len );
3125 }
3126
3127exit:
3128 mbedtls_ssl_session_free( &session );
3129 mbedtls_free( buf );
3130}
3131/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003132
3133/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003134void ssl_serialize_session_load_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003135{
3136 mbedtls_ssl_session session;
3137 unsigned char *good_buf = NULL, *bad_buf = NULL;
3138 size_t good_len, bad_len;
3139
3140 /*
3141 * Test that session_load() fails cleanly on small buffers
3142 */
3143
3144 mbedtls_ssl_session_init( &session );
3145
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003146 /* Prepare serialized session data */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02003147 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003148 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
3149 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3150 TEST_ASSERT( ( good_buf = mbedtls_calloc( 1, good_len ) ) != NULL );
3151 TEST_ASSERT( mbedtls_ssl_session_save( &session, good_buf, good_len,
3152 &good_len ) == 0 );
3153 mbedtls_ssl_session_free( &session );
3154
3155 /* Try all possible bad lengths */
3156 for( bad_len = 0; bad_len < good_len; bad_len++ )
3157 {
3158 /* Allocate exact size so that asan/valgrind can detect any overread */
3159 mbedtls_free( bad_buf );
3160 bad_buf = mbedtls_calloc( 1, bad_len ? bad_len : 1 );
3161 TEST_ASSERT( bad_buf != NULL );
3162 memcpy( bad_buf, good_buf, bad_len );
3163
3164 TEST_ASSERT( mbedtls_ssl_session_load( &session, bad_buf, bad_len )
3165 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3166 }
3167
3168exit:
3169 mbedtls_ssl_session_free( &session );
3170 mbedtls_free( good_buf );
3171 mbedtls_free( bad_buf );
3172}
3173/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01003174
Hanno Becker363b6462019-05-29 12:44:28 +01003175/* BEGIN_CASE */
3176void ssl_session_serialize_version_check( int corrupt_major,
Hanno Becker861d0bb2019-05-21 16:39:30 +01003177 int corrupt_minor,
3178 int corrupt_patch,
3179 int corrupt_config )
3180{
Hanno Becker363b6462019-05-29 12:44:28 +01003181 unsigned char serialized_session[ 2048 ];
3182 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003183 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01003184 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003185 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
3186 corrupt_minor == 1,
3187 corrupt_patch == 1,
3188 corrupt_config == 1,
3189 corrupt_config == 1 };
3190
Hanno Becker861d0bb2019-05-21 16:39:30 +01003191 mbedtls_ssl_session_init( &session );
3192
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003193 /* Infer length of serialized session. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01003194 TEST_ASSERT( mbedtls_ssl_session_save( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01003195 serialized_session,
3196 sizeof( serialized_session ),
3197 &serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01003198
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003199 mbedtls_ssl_session_free( &session );
Hanno Becker861d0bb2019-05-21 16:39:30 +01003200
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003201 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01003202 * de-serialize the session - double-check that. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01003203 TEST_ASSERT( mbedtls_ssl_session_load( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01003204 serialized_session,
3205 serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01003206 mbedtls_ssl_session_free( &session );
3207
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003208 /* Go through the bytes in the serialized session header and
3209 * corrupt them bit-by-bit. */
3210 for( cur_byte = 0; cur_byte < sizeof( should_corrupt_byte ); cur_byte++ )
Hanno Becker861d0bb2019-05-21 16:39:30 +01003211 {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003212 int cur_bit;
3213 unsigned char * const byte = &serialized_session[ cur_byte ];
3214
3215 if( should_corrupt_byte[ cur_byte ] == 0 )
3216 continue;
3217
3218 for( cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++ )
3219 {
3220 unsigned char const corrupted_bit = 0x1u << cur_bit;
3221 /* Modify a single bit in the serialized session. */
3222 *byte ^= corrupted_bit;
3223
3224 /* Attempt to deserialize */
3225 TEST_ASSERT( mbedtls_ssl_session_load( &session,
3226 serialized_session,
3227 serialized_session_len ) ==
Hanno Beckerf9b33032019-06-03 12:58:39 +01003228 MBEDTLS_ERR_SSL_VERSION_MISMATCH );
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003229
3230 /* Undo the change */
3231 *byte ^= corrupted_bit;
3232 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01003233 }
3234
Hanno Becker861d0bb2019-05-21 16:39:30 +01003235}
3236/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003237
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01003238/* 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 +01003239void mbedtls_endpoint_sanity( int endpoint_type )
3240{
3241 enum { BUFFSIZE = 1024 };
3242 mbedtls_endpoint ep;
3243 int ret = -1;
3244
Andrzej Kurek15daf502020-02-12 09:17:52 -05003245 ret = mbedtls_endpoint_init( NULL, endpoint_type, MBEDTLS_PK_RSA,
3246 NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003247 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
3248
Andrzej Kurekb2980742020-02-02 19:25:26 -05003249 ret = mbedtls_endpoint_certificate_init( NULL, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003250 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
3251
Andrzej Kurek15daf502020-02-12 09:17:52 -05003252 ret = mbedtls_endpoint_init( &ep, endpoint_type, MBEDTLS_PK_RSA,
3253 NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003254 TEST_ASSERT( ret == 0 );
3255
3256exit:
Andrzej Kurek15daf502020-02-12 09:17:52 -05003257 mbedtls_endpoint_free( &ep, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003258}
3259/* END_CASE */
3260
Andrzej Kurekb2980742020-02-02 19:25:26 -05003261/* 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 +01003262void move_handshake_to_state(int endpoint_type, int state, int need_pass)
3263{
3264 enum { BUFFSIZE = 1024 };
3265 mbedtls_endpoint base_ep, second_ep;
3266 int ret = -1;
3267
Andrzej Kurek15daf502020-02-12 09:17:52 -05003268 ret = mbedtls_endpoint_init( &base_ep, endpoint_type, MBEDTLS_PK_RSA,
3269 NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003270 TEST_ASSERT( ret == 0 );
3271
3272 ret = mbedtls_endpoint_init( &second_ep,
3273 ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ?
Andrzej Kurekb2980742020-02-02 19:25:26 -05003274 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
Andrzej Kurek15daf502020-02-12 09:17:52 -05003275 MBEDTLS_PK_RSA, NULL, NULL, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003276 TEST_ASSERT( ret == 0 );
3277
3278 ret = mbedtls_mock_socket_connect( &(base_ep.socket),
3279 &(second_ep.socket),
3280 BUFFSIZE );
3281 TEST_ASSERT( ret == 0 );
3282
3283 ret = mbedtls_move_handshake_to_state( &(base_ep.ssl),
3284 &(second_ep.ssl),
3285 state );
3286 if( need_pass )
3287 {
3288 TEST_ASSERT( ret == 0 );
3289 TEST_ASSERT( base_ep.ssl.state == state );
3290 }
3291 else
3292 {
3293 TEST_ASSERT( ret != 0 );
3294 TEST_ASSERT( base_ep.ssl.state != state );
3295 }
3296
3297exit:
Andrzej Kurek15daf502020-02-12 09:17:52 -05003298 mbedtls_endpoint_free( &base_ep, NULL );
3299 mbedtls_endpoint_free( &second_ep, NULL );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003300}
3301/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003302
3303/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15 */
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003304void handshake( const char *cipher, int version, int pk_alg,
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05003305 data_t *psk_str, int dtls, int serialize, int mfl,
3306 int cli_msg_len, int srv_msg_len,
3307 const int expected_cli_fragments,
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003308 const int expected_srv_fragments, const int renegotiate,
3309 const int legacy_renegotiation )
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003310{
3311 /* forced_ciphersuite needs to last until the end of the handshake */
3312 int forced_ciphersuite[2];
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05003313 enum { BUFFSIZE = 17000 };
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003314 mbedtls_endpoint client, server;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003315#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3316 const char *psk_identity = "foo";
3317#else
3318 (void) psk_str;
3319#endif
Andrzej Kurek941962e2020-02-07 09:20:32 -05003320#if defined(MBEDTLS_TIMING_C)
3321 mbedtls_timing_delay_context timer_client, timer_server;
3322#endif
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003323#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003324 unsigned char *context_buf = NULL;
3325 size_t context_buf_len;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003326#else
3327 (void) serialize;
3328#endif
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003329#if defined(MBEDTLS_SSL_RENEGOTIATION)
3330 int ret = -1;
3331#else
3332 (void) renegotiate;
3333 (void) legacy_renegotiation;
3334#endif
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003335
Andrzej Kurek941962e2020-02-07 09:20:32 -05003336 mbedtls_test_message_queue server_queue, client_queue;
3337 mbedtls_test_message_socket_context server_context, client_context;
Andrzej Kurek15daf502020-02-12 09:17:52 -05003338
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003339 /* Client side */
Andrzej Kurek941962e2020-02-07 09:20:32 -05003340 if( dtls != 0 )
3341 {
3342 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
3343 pk_alg, &client_context,
3344 &client_queue,
3345 &server_queue ) == 0 );
3346#if defined(MBEDTLS_TIMING_C)
3347 mbedtls_ssl_set_timer_cb( &client.ssl, &timer_client,
3348 mbedtls_timing_set_delay,
3349 mbedtls_timing_get_delay );
3350#endif
3351 }
3352 else
3353 {
3354 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
3355 pk_alg, NULL, NULL, NULL ) == 0 );
3356 }
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003357 mbedtls_ssl_conf_min_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3358 version );
3359 mbedtls_ssl_conf_max_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3360 version );
3361
3362 if( strlen( cipher ) > 0 )
3363 {
3364 set_ciphersuite( &client.conf, cipher, forced_ciphersuite );
3365 }
3366 /* Server side */
Andrzej Kurek941962e2020-02-07 09:20:32 -05003367 if( dtls != 0 )
3368 {
3369 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
3370 pk_alg, &server_context,
3371 &server_queue,
3372 &client_queue) == 0 );
3373#if defined(MBEDTLS_TIMING_C)
3374 mbedtls_ssl_set_timer_cb( &server.ssl, &timer_server,
3375 mbedtls_timing_set_delay,
3376 mbedtls_timing_get_delay );
3377#endif
3378 }
3379 else
3380 {
3381 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
3382 pk_alg, NULL, NULL, NULL ) == 0 );
3383 }
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003384 mbedtls_ssl_conf_min_version( &server.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3385 version );
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05003386#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3387 TEST_ASSERT( mbedtls_ssl_conf_max_frag_len( &(server.conf),
3388 (unsigned char) mfl ) == 0 );
3389 TEST_ASSERT( mbedtls_ssl_conf_max_frag_len( &(client.conf),
3390 (unsigned char) mfl ) == 0 );
3391#else
3392 TEST_ASSERT( MBEDTLS_SSL_MAX_FRAG_LEN_NONE == mfl );
3393#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
3394
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003395#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3396 if( psk_str->len > 0 )
3397 {
3398 TEST_ASSERT( mbedtls_ssl_conf_psk( &client.conf, psk_str->x,
3399 psk_str->len,
3400 (const unsigned char *) psk_identity,
3401 strlen( psk_identity ) ) == 0 );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003402
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003403 TEST_ASSERT( mbedtls_ssl_conf_psk( &server.conf, psk_str->x,
3404 psk_str->len,
3405 (const unsigned char *) psk_identity,
3406 strlen( psk_identity ) ) == 0 );
3407
3408 mbedtls_ssl_conf_psk_cb( &server.conf, psk_dummy_callback, NULL );
3409 }
3410#endif
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003411#if defined(MBEDTLS_SSL_RENEGOTIATION)
3412 if( renegotiate )
3413 {
3414 mbedtls_ssl_conf_renegotiation( &(server.conf),
3415 MBEDTLS_SSL_RENEGOTIATION_ENABLED );
3416 mbedtls_ssl_conf_renegotiation( &(client.conf),
3417 MBEDTLS_SSL_RENEGOTIATION_ENABLED );
3418
3419 mbedtls_ssl_conf_legacy_renegotiation( &(server.conf),
3420 legacy_renegotiation );
3421 mbedtls_ssl_conf_legacy_renegotiation( &(client.conf),
3422 legacy_renegotiation );
3423 }
3424#endif /* MBEDTLS_SSL_RENEGOTIATION */
3425
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003426 TEST_ASSERT( mbedtls_mock_socket_connect( &(client.socket),
3427 &(server.socket),
3428 BUFFSIZE ) == 0 );
3429
3430 TEST_ASSERT( mbedtls_move_handshake_to_state( &(client.ssl),
3431 &(server.ssl),
3432 MBEDTLS_SSL_HANDSHAKE_OVER )
3433 == 0 );
3434 TEST_ASSERT( client.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3435 TEST_ASSERT( server.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3436
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05003437 if( cli_msg_len != 0 || srv_msg_len != 0 )
3438 {
3439 /* Start data exchanging test */
3440 TEST_ASSERT( mbedtls_exchange_data( &(client.ssl), cli_msg_len,
3441 expected_cli_fragments,
3442 &(server.ssl), srv_msg_len,
3443 expected_srv_fragments ) == 0 );
3444 }
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003445#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003446 if( serialize == 1 )
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003447 {
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003448 TEST_ASSERT( dtls == 1 );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003449
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003450 TEST_ASSERT( mbedtls_ssl_context_save( &(server.ssl), NULL,
3451 0, &context_buf_len )
3452 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003453
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003454 context_buf = mbedtls_calloc( 1, context_buf_len );
3455 TEST_ASSERT( context_buf != NULL );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003456
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003457 TEST_ASSERT( mbedtls_ssl_context_save( &(server.ssl), context_buf,
3458 context_buf_len,
3459 &context_buf_len ) == 0 );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003460
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003461 mbedtls_ssl_free( &(server.ssl) );
3462 mbedtls_ssl_init( &(server.ssl) );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003463
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003464 TEST_ASSERT( mbedtls_ssl_setup( &(server.ssl), &(server.conf) ) == 0 );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003465
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003466 mbedtls_ssl_set_bio( &( server.ssl ), &server_context,
3467 mbedtls_mock_tcp_send_msg,
3468 mbedtls_mock_tcp_recv_msg,
3469 NULL );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003470
3471#if defined(MBEDTLS_TIMING_C)
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003472 mbedtls_ssl_set_timer_cb( &server.ssl, &timer_server,
3473 mbedtls_timing_set_delay,
3474 mbedtls_timing_get_delay );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003475#endif
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003476 TEST_ASSERT( mbedtls_ssl_context_load( &( server.ssl ), context_buf,
3477 context_buf_len ) == 0 );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003478
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003479 /* Retest writing/reading */
3480 if( cli_msg_len != 0 || srv_msg_len != 0 )
3481 {
3482 TEST_ASSERT( mbedtls_exchange_data( &(client.ssl), cli_msg_len,
3483 expected_cli_fragments,
3484 &(server.ssl), srv_msg_len,
3485 expected_srv_fragments ) == 0 );
3486 }
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05003487 }
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003488#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05003489#if defined(MBEDTLS_SSL_RENEGOTIATION)
3490 if( renegotiate )
3491 {
3492 /* Start test with renegotiation */
3493 TEST_ASSERT( server.ssl.renego_status ==
3494 MBEDTLS_SSL_INITIAL_HANDSHAKE );
3495 TEST_ASSERT( client.ssl.renego_status ==
3496 MBEDTLS_SSL_INITIAL_HANDSHAKE );
3497
3498 /* After calling this function for the server, it only sends a handshake
3499 * request. All renegotiation should happen during data exchanging */
3500 TEST_ASSERT( mbedtls_ssl_renegotiate( &(server.ssl) ) == 0 );
3501 TEST_ASSERT( server.ssl.renego_status ==
3502 MBEDTLS_SSL_RENEGOTIATION_PENDING );
3503 TEST_ASSERT( client.ssl.renego_status ==
3504 MBEDTLS_SSL_INITIAL_HANDSHAKE );
3505
3506 TEST_ASSERT( exchange_data( &(client.ssl), &(server.ssl) ) == 0 );
3507 TEST_ASSERT( server.ssl.renego_status ==
3508 MBEDTLS_SSL_RENEGOTIATION_DONE );
3509 TEST_ASSERT( client.ssl.renego_status ==
3510 MBEDTLS_SSL_RENEGOTIATION_DONE );
3511
3512 /* After calling mbedtls_ssl_renegotiate for the client all renegotiation
3513 * should happen inside this function. However in this test, we cannot
3514 * perform simultaneous communication betwen client and server so this
3515 * function will return waiting error on the socket. All rest of
3516 * renegotiation should happen during data exchanging */
3517 ret = mbedtls_ssl_renegotiate( &(client.ssl) );
3518 TEST_ASSERT( ret == 0 ||
3519 ret == MBEDTLS_ERR_SSL_WANT_READ ||
3520 ret == MBEDTLS_ERR_SSL_WANT_WRITE );
3521 TEST_ASSERT( server.ssl.renego_status ==
3522 MBEDTLS_SSL_RENEGOTIATION_DONE );
3523 TEST_ASSERT( client.ssl.renego_status ==
3524 MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS );
3525
3526 TEST_ASSERT( exchange_data( &(client.ssl), &(server.ssl) ) == 0 );
3527 TEST_ASSERT( server.ssl.renego_status ==
3528 MBEDTLS_SSL_RENEGOTIATION_DONE );
3529 TEST_ASSERT( client.ssl.renego_status ==
3530 MBEDTLS_SSL_RENEGOTIATION_DONE );
3531 }
3532#endif /* MBEDTLS_SSL_RENEGOTIATION */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003533
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003534exit:
Andrzej Kurek941962e2020-02-07 09:20:32 -05003535 mbedtls_endpoint_free( &client, dtls != 0 ? &client_context : NULL );
3536 mbedtls_endpoint_free( &server, dtls != 0 ? &server_context : NULL );
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003537#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
3538 if( dtls != 0 && serialize != 0 )
3539 {
3540 mbedtls_free( context_buf );
3541 }
3542#endif
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003543}
3544/* END_CASE */