blob: f3e4b3acd755766d7e5259b289b92998b1963eaa [file] [log] [blame]
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include <mbedtls/ssl.h>
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +02003#include <mbedtls/ssl_internal.h>
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004#include <mbedtls/ctr_drbg.h>
5#include <mbedtls/entropy.h>
6#include <mbedtls/certs.h>
Janos Follath6264e662019-11-26 11:11:15 +00007
8/*
9 * Buffer structure for custom I/O callbacks.
10 */
11
12typedef struct mbedtls_test_buffer
13{
14 size_t start;
15 size_t content_length;
16 size_t capacity;
17 unsigned char *buffer;
18} mbedtls_test_buffer;
19
20/*
21 * Initialises \p buf. After calling this function it is safe to call
22 * `mbedtls_test_buffer_free()` on \p buf.
23 */
24void mbedtls_test_buffer_init( mbedtls_test_buffer *buf )
25{
26 memset( buf, 0, sizeof( *buf ) );
27}
28
29/*
30 * Sets up \p buf. After calling this function it is safe to call
31 * `mbedtls_test_buffer_put()` and `mbedtls_test_buffer_get()` on \p buf.
32 */
33int mbedtls_test_buffer_setup( mbedtls_test_buffer *buf, size_t capacity )
34{
35 buf->buffer = (unsigned char*) mbedtls_calloc( capacity,
36 sizeof(unsigned char) );
37 if( NULL == buf->buffer )
38 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
39 buf->capacity = capacity;
40
41 return 0;
42}
43
44void mbedtls_test_buffer_free( mbedtls_test_buffer *buf )
45{
46 if( buf->buffer != NULL )
47 mbedtls_free( buf->buffer );
48
49 memset( buf, 0, sizeof( *buf ) );
50}
51
52/*
53 * Puts \p input_len bytes from the \p input buffer into the ring buffer \p buf.
54 *
55 * \p buf must have been initialized and set up by calling
56 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
57 *
58 * \retval \p input_len, if the data fits.
59 * \retval 0 <= value < \p input_len, if the data does not fit.
60 * \retval -1, if \p buf is NULL, it hasn't been set up or \p input_len is not
61 * zero and \p input is NULL.
62 */
63int mbedtls_test_buffer_put( mbedtls_test_buffer *buf,
Piotr Nowicki2a1f1782020-01-13 09:42:10 +010064 const unsigned char *input, size_t input_len )
Janos Follath6264e662019-11-26 11:11:15 +000065{
66 size_t overflow = 0;
67
68 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
69 return -1;
70
71 /* Reduce input_len to a number that fits in the buffer. */
72 if ( ( buf->content_length + input_len ) > buf->capacity )
73 {
74 input_len = buf->capacity - buf->content_length;
75 }
76
77 if( input == NULL )
78 {
79 return ( input_len == 0 ) ? 0 : -1;
80 }
81
Piotr Nowickifb437d72020-01-13 16:59:12 +010082 /* Check if the buffer has not come full circle and free space is not in
83 * the middle */
84 if( buf->start + buf->content_length < buf->capacity )
Janos Follath6264e662019-11-26 11:11:15 +000085 {
Piotr Nowickifb437d72020-01-13 16:59:12 +010086
87 /* Calculate the number of bytes that need to be placed at lower memory
88 * address */
89 if( buf->start + buf->content_length + input_len
90 > buf->capacity )
91 {
92 overflow = ( buf->start + buf->content_length + input_len )
93 % buf->capacity;
94 }
95
96 memcpy( buf->buffer + buf->start + buf->content_length, input,
97 input_len - overflow );
98 memcpy( buf->buffer, input + input_len - overflow, overflow );
99
100 }
101 else
102 {
103 /* The buffer has come full circle and free space is in the middle */
104 memcpy( buf->buffer + buf->start + buf->content_length - buf->capacity,
105 input, input_len );
Janos Follath6264e662019-11-26 11:11:15 +0000106 }
107
Janos Follath6264e662019-11-26 11:11:15 +0000108 buf->content_length += input_len;
Janos Follath6264e662019-11-26 11:11:15 +0000109 return input_len;
110}
111
112/*
Andrzej Kurekf7774142020-01-22 06:34:59 -0500113 * Gets \p output_len bytes from the ring buffer \p buf into the
114 * \p output buffer. The output buffer can be NULL, in this case a part of the
115 * ring buffer will be dropped, if the requested length is available.
Janos Follath6264e662019-11-26 11:11:15 +0000116 *
117 * \p buf must have been initialized and set up by calling
118 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
119 *
120 * \retval \p output_len, if the data is available.
121 * \retval 0 <= value < \p output_len, if the data is not available.
Andrzej Kurekf7774142020-01-22 06:34:59 -0500122 * \retval -1, if \buf is NULL or it hasn't been set up.
Janos Follath6264e662019-11-26 11:11:15 +0000123 */
124int mbedtls_test_buffer_get( mbedtls_test_buffer *buf,
125 unsigned char* output, size_t output_len )
126{
127 size_t overflow = 0;
128
129 if( ( buf == NULL ) || ( buf->buffer == NULL ) )
130 return -1;
131
Andrzej Kurekf7774142020-01-22 06:34:59 -0500132 if( output == NULL && output_len == 0 )
133 return 0;
Janos Follath6264e662019-11-26 11:11:15 +0000134
135 if( buf->content_length < output_len )
136 output_len = buf->content_length;
137
138 /* Calculate the number of bytes that need to be drawn from lower memory
139 * address */
140 if( buf->start + output_len > buf->capacity )
141 {
142 overflow = ( buf->start + output_len ) % buf->capacity;
143 }
144
Andrzej Kurekf7774142020-01-22 06:34:59 -0500145 if( output != NULL )
146 {
147 memcpy( output, buf->buffer + buf->start, output_len - overflow );
148 memcpy( output + output_len - overflow, buf->buffer, overflow );
149 }
150
Janos Follath6264e662019-11-26 11:11:15 +0000151 buf->content_length -= output_len;
152 buf->start = ( buf->start + output_len ) % buf->capacity;
153
154 return output_len;
155}
156
Hanno Beckera18d1322018-01-03 14:27:32 +0000157/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500158 * Errors used in the message transport mock tests
159 */
160 #define MBEDTLS_TEST_ERROR_ARG_NULL -11
161 #define MBEDTLS_TEST_ERROR_QUEUE_FULL -22
162 #define MBEDTLS_TEST_ERROR_QUEUE_EMPTY -33
163 #define MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED -44
164
165/*
166 * Context for a message metadata queue (fifo) that is on top of the ring buffer.
167 */
168typedef struct mbedtls_test_message_queue
169{
170 size_t *messages;
171 int pos;
172 int num;
173 int capacity;
174} mbedtls_test_message_queue;
175
176/*
177 * Setup and free functions for the message metadata queue.
178 *
179 * \p capacity describes the number of message metadata chunks that can be held
180 * within the queue.
181 *
182 * \retval 0, if a metadata queue of a given length can be allocated.
183 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation failed.
184 */
185int mbedtls_test_message_queue_setup( mbedtls_test_message_queue *queue,
186 size_t capacity )
187{
188 queue->messages = (size_t*) mbedtls_calloc( capacity, sizeof(size_t) );
189 if( NULL == queue->messages )
190 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
191
192 queue->capacity = capacity;
193 queue->pos = 0;
194 queue->num = 0;
195
196 return 0;
197}
198
199void mbedtls_test_message_queue_free( mbedtls_test_message_queue *queue )
200{
201 if( queue == NULL )
202 return;
203
204 if( queue->messages != NULL )
205 mbedtls_free( queue->messages );
206
207 memset( queue, 0, sizeof( *queue ) );
208}
209
210/*
211 * Push message length information onto the message metadata queue.
212 * This will become the last element to leave it (fifo).
213 *
214 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
215 * \retval MBEDTLS_TEST_ERROR_QUEUE_FULL, if the queue is full.
216 * \retval \p len, if the push was successful.
217 */
218int mbedtls_test_message_queue_push_info( mbedtls_test_message_queue *queue,
219 size_t len )
220{
221 int place;
222 if( queue == NULL )
223 return MBEDTLS_TEST_ERROR_ARG_NULL;
224
225 if( queue->num >= queue->capacity )
226 return MBEDTLS_TEST_ERROR_QUEUE_FULL;
227
228 place = ( queue->pos + queue->num ) % queue->capacity;
229 queue->messages[place] = len;
230 queue->num++;
231 return len;
232}
233
234/*
235 * Pop information about the next message length from the queue. This will be
236 * the oldest inserted message length(fifo). \p msg_len can be null, in which
237 * case the data will be popped from the queue but not copied anywhere.
238 *
239 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
240 * \retval MBEDTLS_TEST_ERROR_QUEUE_EMPTY, if the queue is empty.
241 * \retval message length, if the pop was successful, up to the given
242 \p buf_len.
243 */
244int mbedtls_test_message_queue_pop_info( mbedtls_test_message_queue *queue,
245 size_t buf_len )
246{
247 size_t message_length;
248 if( queue == NULL )
249 return MBEDTLS_TEST_ERROR_ARG_NULL;
250 if( queue->num == 0 )
251 return MBEDTLS_TEST_ERROR_QUEUE_EMPTY;
252
253 message_length = queue->messages[queue->pos];
254 queue->messages[queue->pos] = 0;
255 queue->num--;
256 queue->pos++;
257 queue->pos %= queue->capacity;
258 if( queue->pos < 0 )
259 queue->pos += queue->capacity;
260
261 return ( message_length > buf_len ) ? buf_len : message_length;
262}
263
264/*
265 * Take a peek on the info about the next message length from the queue.
266 * This will be the oldest inserted message length(fifo).
267 *
268 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
269 * \retval MBEDTLS_TEST_ERROR_QUEUE_EMPTY, if the queue is empty.
270 * \retval 0, if the peek was successful.
271 * \retval MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
272 * too small to fit the message. In this case the \p msg_len will be
273 * set to the full message length so that the
274 * caller knows what portion of the message can be dropped.
275 */
276int mbedtls_test_message_queue_peek_info( mbedtls_test_message_queue *queue,
277 size_t buf_len, size_t* msg_len )
278{
279 if( queue == NULL || msg_len == NULL )
280 return MBEDTLS_TEST_ERROR_ARG_NULL;
281 if( queue->num == 0 )
282 return MBEDTLS_TEST_ERROR_QUEUE_EMPTY;
283
284 *msg_len = queue->messages[queue->pos];
285 return ( *msg_len > buf_len ) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
286}
287/*
Janos Follath031827f2019-11-27 11:12:14 +0000288 * Context for the I/O callbacks simulating network connection.
289 */
290
291#define MBEDTLS_MOCK_SOCKET_CONNECTED 1
292
293typedef struct mbedtls_mock_socket
294{
295 int status;
296 mbedtls_test_buffer *input;
297 mbedtls_test_buffer *output;
298 struct mbedtls_mock_socket *peer;
299} mbedtls_mock_socket;
300
301/*
302 * Setup and teardown functions for mock sockets.
303 */
304void mbedtls_mock_socket_init( mbedtls_mock_socket *socket )
305{
306 memset( socket, 0, sizeof( *socket ) );
307}
308
309/*
310 * Closes the socket \p socket.
311 *
312 * \p socket must have been previously initialized by calling
313 * mbedtls_mock_socket_init().
314 *
315 * This function frees all allocated resources and both sockets are aware of the
316 * new connection state.
317 *
318 * That is, this function does not simulate half-open TCP connections and the
319 * phenomenon that when closing a UDP connection the peer is not aware of the
320 * connection having been closed.
321 */
322void mbedtls_mock_socket_close( mbedtls_mock_socket* socket )
323{
324 if( socket == NULL )
325 return;
326
327 if( socket->input != NULL )
328 {
329 mbedtls_test_buffer_free( socket->input );
330 mbedtls_free( socket->input );
331 }
332
333 if( socket->output != NULL )
334 {
335 mbedtls_test_buffer_free( socket->output );
336 mbedtls_free( socket->output );
337 }
338
339 if( socket->peer != NULL )
340 memset( socket->peer, 0, sizeof( *socket->peer ) );
341
342 memset( socket, 0, sizeof( *socket ) );
343}
344
345/*
346 * Establishes a connection between \p peer1 and \p peer2.
347 *
348 * \p peer1 and \p peer2 must have been previously initialized by calling
349 * mbedtls_mock_socket_init().
350 *
351 * The capacites of the internal buffers are set to \p bufsize. Setting this to
352 * the correct value allows for simulation of MTU, sanity testing the mock
353 * implementation and mocking TCP connections with lower memory cost.
354 */
355int mbedtls_mock_socket_connect( mbedtls_mock_socket* peer1,
356 mbedtls_mock_socket* peer2,
357 size_t bufsize )
358{
359 int ret = -1;
360
Piotr Nowickid796e192020-01-28 12:09:47 +0100361 peer1->output =
Janos Follath031827f2019-11-27 11:12:14 +0000362 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
363 if( peer1->output == NULL )
364 {
365 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
366 goto exit;
367 }
368 mbedtls_test_buffer_init( peer1->output );
369 if( 0 != ( ret = mbedtls_test_buffer_setup( peer1->output, bufsize ) ) )
370 {
371 goto exit;
372 }
373
Piotr Nowickid796e192020-01-28 12:09:47 +0100374 peer2->output =
375 (mbedtls_test_buffer*) mbedtls_calloc( 1, sizeof(mbedtls_test_buffer) );
376 if( peer2->output == NULL )
377 {
378 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
379 goto exit;
380 }
381 mbedtls_test_buffer_init( peer2->output );
382 if( 0 != ( ret = mbedtls_test_buffer_setup( peer2->output, bufsize ) ) )
383 {
384 goto exit;
385 }
386
Janos Follath031827f2019-11-27 11:12:14 +0000387 peer1->peer = peer2;
388 peer2->peer = peer1;
Piotr Nowickid796e192020-01-28 12:09:47 +0100389 peer1->input = peer2->output;
390 peer2->input = peer1->output;
Janos Follath031827f2019-11-27 11:12:14 +0000391
392 peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
393 ret = 0;
394
395exit:
396
397 if( ret != 0 )
398 {
399 mbedtls_mock_socket_close( peer1 );
400 mbedtls_mock_socket_close( peer2 );
401 }
402
403 return ret;
404}
405
406/*
407 * Callbacks for simulating blocking I/O over connection-oriented transport.
408 */
409
410int mbedtls_mock_tcp_send_b( void *ctx, const unsigned char *buf, size_t len )
411{
412 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
413
414 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
415 return -1;
416
417 return mbedtls_test_buffer_put( socket->output, buf, len );
418}
419
420int mbedtls_mock_tcp_recv_b( void *ctx, unsigned char *buf, size_t len )
421{
422 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
423
424 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
425 return -1;
426
427 return mbedtls_test_buffer_get( socket->input, buf, len );
428}
429
430/*
Janos Follath3766ba52019-11-27 13:31:42 +0000431 * Callbacks for simulating non-blocking I/O over connection-oriented transport.
432 */
433
434int mbedtls_mock_tcp_send_nb( void *ctx, const unsigned char *buf, size_t len )
435{
436 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
437
438 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
439 return -1;
440
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100441 if( socket->output->capacity == socket->output->content_length )
Janos Follath3766ba52019-11-27 13:31:42 +0000442 {
Janos Follath3766ba52019-11-27 13:31:42 +0000443 return MBEDTLS_ERR_SSL_WANT_WRITE;
444 }
445
Janos Follath3766ba52019-11-27 13:31:42 +0000446 return mbedtls_test_buffer_put( socket->output, buf, len );
447}
448
449int mbedtls_mock_tcp_recv_nb( void *ctx, unsigned char *buf, size_t len )
450{
451 mbedtls_mock_socket *socket = (mbedtls_mock_socket*) ctx;
452
453 if( socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED )
454 return -1;
455
Andrzej Kurekf40daa32020-02-04 09:00:01 -0500456 if( socket->input->content_length == 0 )
Janos Follath3766ba52019-11-27 13:31:42 +0000457 {
Janos Follath3766ba52019-11-27 13:31:42 +0000458 return MBEDTLS_ERR_SSL_WANT_READ;
459 }
460
Janos Follath3766ba52019-11-27 13:31:42 +0000461 return mbedtls_test_buffer_get( socket->input, buf, len );
462}
463
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500464/* Errors used in the message socket mocks */
465
466#define MBEDTLS_TEST_ERROR_CONTEXT_ERROR -55
467#define MBEDTLS_TEST_ERROR_SEND_FAILED -66
468#define MBEDTLS_TEST_ERROR_RECV_FAILED -77
469
470/*
471 * Structure used as an addon, or a wrapper, around the mocked sockets.
472 * Contains an input queue, to which the other socket pushes metadata,
473 * and an output queue, to which this one pushes metadata. This context is
474 * considered as an owner of the input queue only, which is initialized and
475 * freed in the respective setup and free calls.
476 */
477typedef struct mbedtls_test_message_socket_context
478{
479 mbedtls_test_message_queue* queue_input;
480 mbedtls_test_message_queue* queue_output;
481 mbedtls_mock_socket* socket;
482} mbedtls_test_message_socket_context;
483
484/*
485 * Setup a given mesasge socket context including initialization of
486 * input/output queues to a chosen capacity of messages. Also set the
487 * corresponding mock socket.
488 *
489 * \retval 0, if everything succeeds.
490 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation of a message
491 * queue failed.
492 */
493int mbedtls_message_socket_setup( mbedtls_test_message_queue* queue_input,
494 mbedtls_test_message_queue* queue_output,
495 size_t queue_capacity,
496 mbedtls_mock_socket* socket,
497 mbedtls_test_message_socket_context* ctx )
498{
499 int ret = mbedtls_test_message_queue_setup( queue_input, queue_capacity );
500 if( ret != 0 )
501 return ret;
502 ctx->queue_input = queue_input;
503 ctx->queue_output = queue_output;
504 ctx->socket = socket;
505 mbedtls_mock_socket_init( socket );
506
507 return 0;
508}
509
510/*
511 * Close a given message socket context, along with the socket itself. Free the
512 * memory allocated by the input queue.
513 */
514void mbedtls_message_socket_close( mbedtls_test_message_socket_context* ctx )
515{
516 if( ctx == NULL )
517 return;
518
519 mbedtls_test_message_queue_free( ctx->queue_input );
520 mbedtls_mock_socket_close( ctx->socket );
521 memset( ctx, 0, sizeof( *ctx ) );
522}
523
524/*
525 * Send one message through a given message socket context.
526 *
527 * \retval \p len, if everything succeeds.
528 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
529 * elements or the context itself is null.
530 * \retval MBEDTLS_TEST_ERROR_SEND_FAILED if mbedtls_mock_tcp_send_b failed.
531 * \retval MBEDTLS_TEST_ERROR_QUEUE_FULL, if the output queue is full.
532 *
533 * This function will also return any error from
534 * mbedtls_test_message_queue_push_info.
535 */
536int mbedtls_mock_tcp_send_msg( void *ctx, const unsigned char *buf, size_t len )
537{
538 mbedtls_test_message_queue* queue;
539 mbedtls_mock_socket* socket;
540 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
541
542 if( context == NULL || context->socket == NULL
543 || context->queue_output == NULL )
544 {
545 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
546 }
547
548 queue = context->queue_output;
549 socket = context->socket;
550
551 if( queue->num >= queue->capacity )
552 return MBEDTLS_TEST_ERROR_QUEUE_FULL;
553
554 if( mbedtls_mock_tcp_send_b( socket, buf, len ) != (int) len )
555 return MBEDTLS_TEST_ERROR_SEND_FAILED;
556
557 return mbedtls_test_message_queue_push_info( queue, len );
558}
559
560/*
561 * Receive one message from a given message socket context and return message
562 * length or an error.
563 *
564 * \retval message length, if everything succeeds.
565 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
566 * elements or the context itself is null.
567 * \retval MBEDTLS_TEST_ERROR_RECV_FAILED if mbedtls_mock_tcp_recv_b failed.
568 *
569 * This function will also return any error other than
570 * MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED from mbedtls_test_message_queue_peek_info.
571 */
572int mbedtls_mock_tcp_recv_msg( void *ctx, unsigned char *buf, size_t buf_len )
573{
574 mbedtls_test_message_queue* queue;
575 mbedtls_mock_socket* socket;
576 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context*) ctx;
577 size_t drop_len;
578 size_t msg_len;
579 int ret;
580
581 if( context == NULL || context->socket == NULL
582 || context->queue_input == NULL )
583 {
584 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
585 }
586
587 queue = context->queue_input;
588 socket = context->socket;
589
590 /* Peek first, so that in case of a socket error the data remains in
591 * the queue. */
592 ret = mbedtls_test_message_queue_peek_info( queue, buf_len, &msg_len );
593 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
594 {
595 /* Calculate how much to drop */
596 drop_len = msg_len - buf_len;
597
598 /* Set the requested message len to be buffer length */
599 msg_len = buf_len;
600 } else if( ret != 0 )
601 {
602 return ret;
603 }
604
605 if( mbedtls_mock_tcp_recv_b( socket, buf, msg_len ) != (int) msg_len )
606 return MBEDTLS_TEST_ERROR_RECV_FAILED;
607
608 if( ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED )
609 {
610 /* Drop the remaining part of the message */
611 if( mbedtls_mock_tcp_recv_b( socket, NULL, drop_len ) != (int) drop_len )
612 {
613 /* Inconsistent state - part of the message was read,
614 * and a part couldn't. Not much we can do here, but it should not
615 * happen in test environment, unless forced manually. */
616 }
617 }
618 mbedtls_test_message_queue_pop_info( queue, buf_len );
619
620 return msg_len;
621}
622
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100623#if defined(MBEDTLS_X509_CRT_PARSE_C)
624
625/*
626 * Structure with endpoint's certificates for SSL communication tests.
627 */
628typedef struct mbedtls_endpoint_certificate
629{
630 mbedtls_x509_crt ca_cert;
631 mbedtls_x509_crt cert;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100632 mbedtls_pk_context pkey;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100633} mbedtls_endpoint_certificate;
634
635/*
636 * Endpoint structure for SSL communication tests.
637 */
638typedef struct mbedtls_endpoint
639{
640 const char *name;
641 mbedtls_ssl_context ssl;
642 mbedtls_ssl_config conf;
643 mbedtls_ctr_drbg_context ctr_drbg;
644 mbedtls_entropy_context entropy;
645 mbedtls_mock_socket socket;
646 mbedtls_endpoint_certificate cert;
647} mbedtls_endpoint;
648
649/*
650 * Initializes \p ep_cert structure and assigns it to endpoint
651 * represented by \p ep.
652 *
653 * \retval 0 on success, otherwise error code.
654 */
Andrzej Kurekb2980742020-02-02 19:25:26 -0500655int mbedtls_endpoint_certificate_init( mbedtls_endpoint *ep, int pk_alg )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100656{
657 int i = 0;
658 int ret = -1;
659 mbedtls_endpoint_certificate *cert;
660
661 if( ep == NULL )
662 {
663 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
664 }
665
666 cert = &( ep->cert );
667 mbedtls_x509_crt_init( &( cert->ca_cert ) );
668 mbedtls_x509_crt_init( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100669 mbedtls_pk_init( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100670
671 /* Load the trusted CA */
672
673 for( i = 0; mbedtls_test_cas[i] != NULL; i++ )
674 {
675 ret = mbedtls_x509_crt_parse( &( cert->ca_cert ),
676 (const unsigned char *) mbedtls_test_cas[i],
677 mbedtls_test_cas_len[i] );
678 TEST_ASSERT( ret == 0 );
679 }
680
681 for( i = 0; mbedtls_test_cas_der[i] != NULL; i++ )
682 {
683 ret = mbedtls_x509_crt_parse_der( &( cert->ca_cert ),
684 (const unsigned char *) mbedtls_test_cas_der[i],
685 mbedtls_test_cas_der_len[i] );
686 TEST_ASSERT( ret == 0 );
687 }
688
689 /* Load own certificate and private key */
690
691 if( ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER )
692 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500693 if( pk_alg == MBEDTLS_PK_RSA )
694 {
695 ret = mbedtls_x509_crt_parse( &( cert->cert ),
696 (const unsigned char*) mbedtls_test_srv_crt_rsa_sha256_der,
697 mbedtls_test_srv_crt_rsa_sha256_der_len );
698 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100699
Andrzej Kurekb2980742020-02-02 19:25:26 -0500700 ret = mbedtls_pk_parse_key( &( cert->pkey ),
701 (const unsigned char*) mbedtls_test_srv_key_rsa_der,
702 mbedtls_test_srv_key_rsa_der_len, NULL, 0 );
703 TEST_ASSERT( ret == 0 );
704 }
705 else
706 {
707 ret = mbedtls_x509_crt_parse( &( cert->cert ),
708 (const unsigned char*) mbedtls_test_srv_crt_ec_der,
709 mbedtls_test_srv_crt_ec_der_len );
710 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100711
Andrzej Kurekb2980742020-02-02 19:25:26 -0500712 ret = mbedtls_pk_parse_key( &( cert->pkey ),
713 (const unsigned char*) mbedtls_test_srv_key_ec_der,
714 mbedtls_test_srv_key_ec_der_len, NULL, 0 );
715 TEST_ASSERT( ret == 0 );
716 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100717 }
718 else
719 {
Andrzej Kurekb2980742020-02-02 19:25:26 -0500720 if( pk_alg == MBEDTLS_PK_RSA )
721 {
722 ret = mbedtls_x509_crt_parse( &( cert->cert ),
723 (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
724 mbedtls_test_cli_crt_rsa_der_len );
725 TEST_ASSERT( ret == 0 );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100726
Andrzej Kurekb2980742020-02-02 19:25:26 -0500727 ret = mbedtls_pk_parse_key( &( cert->pkey ),
728 (const unsigned char *) mbedtls_test_cli_key_rsa_der,
729 mbedtls_test_cli_key_rsa_der_len, NULL, 0 );
730 TEST_ASSERT( ret == 0 );
731 }
732 else
733 {
734 ret = mbedtls_x509_crt_parse( &( cert->cert ),
735 (const unsigned char *) mbedtls_test_cli_crt_ec_der,
736 mbedtls_test_cli_crt_ec_len );
737 TEST_ASSERT( ret == 0 );
738
739 ret = mbedtls_pk_parse_key( &( cert->pkey ),
740 (const unsigned char *) mbedtls_test_cli_key_ec_der,
741 mbedtls_test_cli_key_ec_der_len, NULL, 0 );
742 TEST_ASSERT( ret == 0 );
743 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100744 }
745
746 mbedtls_ssl_conf_ca_chain( &( ep->conf ), &( cert->ca_cert ), NULL );
747
Andrzej Kurekb2980742020-02-02 19:25:26 -0500748 ret = mbedtls_ssl_conf_own_cert( &( ep->conf ), &( cert->cert ),
749 &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100750 TEST_ASSERT( ret == 0 );
751
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100752exit:
753 if( ret != 0 )
754 {
755 mbedtls_x509_crt_free( &( cert->ca_cert ) );
756 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100757 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100758 }
759
760 return ret;
761}
762
763/*
764 * Initializes \p ep structure. It is important to call `mbedtls_endpoint_free()`
765 * after calling this function even if it fails.
766 *
767 * \p endpoint_type must be set as MBEDTLS_SSL_IS_SERVER or
768 * MBEDTLS_SSL_IS_CLIENT.
769 *
770 * \retval 0 on success, otherwise error code.
771 */
Andrzej Kurekb2980742020-02-02 19:25:26 -0500772int mbedtls_endpoint_init( mbedtls_endpoint *ep, int endpoint_type, int pk_alg )
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100773{
774 int ret = -1;
775
776 if( ep == NULL )
777 {
778 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
779 }
780
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 ) );
792 mbedtls_mock_socket_init( &( ep->socket ) );
793
794 ret = mbedtls_ctr_drbg_seed( &( ep->ctr_drbg ), mbedtls_entropy_func,
795 &( ep->entropy ), (const unsigned char *) ( ep->name ),
796 strlen( ep->name ) );
797 TEST_ASSERT( ret == 0 );
798
799 /* Non-blocking callbacks without timeout */
800 mbedtls_ssl_set_bio( &( ep->ssl ), &( ep->socket ),
801 mbedtls_mock_tcp_send_nb,
802 mbedtls_mock_tcp_recv_nb,
803 NULL );
804
805 ret = mbedtls_ssl_setup( &( ep->ssl ), &( ep->conf ) );
806 TEST_ASSERT( ret == 0 );
807
808 ret = mbedtls_ssl_config_defaults( &( ep->conf ), endpoint_type,
809 MBEDTLS_SSL_TRANSPORT_STREAM,
810 MBEDTLS_SSL_PRESET_DEFAULT );
811 TEST_ASSERT( ret == 0 );
812
Andrzej Kurekb2980742020-02-02 19:25:26 -0500813 ret = mbedtls_endpoint_certificate_init( ep, pk_alg );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100814 TEST_ASSERT( ret == 0 );
815
816exit:
817 return ret;
818}
819
820/*
821 * Deinitializes certificates from endpoint represented by \p ep.
822 */
823void mbedtls_endpoint_certificate_free( mbedtls_endpoint *ep )
824{
825 mbedtls_endpoint_certificate *cert = &( ep->cert );
826 mbedtls_x509_crt_free( &( cert->ca_cert ) );
827 mbedtls_x509_crt_free( &( cert->cert ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100828 mbedtls_pk_free( &( cert->pkey ) );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100829}
830
831/*
832 * Deinitializes endpoint represented by \p ep.
833 */
834void mbedtls_endpoint_free( mbedtls_endpoint *ep )
835{
836 mbedtls_endpoint_certificate_free( ep );
837
838 mbedtls_ssl_free( &( ep->ssl ) );
839 mbedtls_ssl_config_free( &( ep->conf ) );
840 mbedtls_ctr_drbg_free( &( ep->ctr_drbg ) );
841 mbedtls_entropy_free( &( ep->entropy ) );
842 mbedtls_mock_socket_close( &( ep->socket ) );
843}
844
845/*
846 * This function moves ssl handshake from \p ssl to prescribed \p state.
847 * /p second_ssl is used as second endpoint and their sockets have to be
848 * connected before calling this function.
849 *
850 * \retval 0 on success, otherwise error code.
851 */
852int mbedtls_move_handshake_to_state( mbedtls_ssl_context *ssl,
853 mbedtls_ssl_context *second_ssl,
854 int state )
855{
856 enum { BUFFSIZE = 1024 };
857 int max_steps = 1000;
858 int ret = 0;
859
860 if( ssl == NULL || second_ssl == NULL )
861 {
862 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
863 }
864
865 /* Perform communication via connected sockets */
866 while( ( ssl->state != state ) && ( --max_steps >= 0 ) )
867 {
868 /* If /p second_ssl ends the handshake procedure before /p ssl then
869 * there is no need to call the next step */
870 if( second_ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
871 {
872 ret = mbedtls_ssl_handshake_step( second_ssl );
873 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
874 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
875 {
876 return ret;
877 }
878 }
879
880 /* We only care about the \p ssl state and returns, so we call it last,
881 * to leave the iteration as soon as the state is as expected. */
882 ret = mbedtls_ssl_handshake_step( ssl );
883 if( ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
884 ret != MBEDTLS_ERR_SSL_WANT_WRITE )
885 {
886 return ret;
887 }
888 }
889
890 return ( max_steps >= 0 ) ? ret : -1;
891}
892
893#endif /* MBEDTLS_X509_CRT_PARSE_C */
894
Janos Follath3766ba52019-11-27 13:31:42 +0000895/*
Hanno Beckera18d1322018-01-03 14:27:32 +0000896 * Helper function setting up inverse record transformations
897 * using given cipher, hash, EtM mode, authentication tag length,
898 * and version.
899 */
900
901#define CHK( x ) \
902 do \
903 { \
904 if( !( x ) ) \
Hanno Becker81e16a32019-03-01 11:21:44 +0000905 { \
Hanno Beckera5780f12019-04-05 09:55:37 +0100906 ret = -1; \
Hanno Becker81e16a32019-03-01 11:21:44 +0000907 goto cleanup; \
908 } \
Hanno Beckera18d1322018-01-03 14:27:32 +0000909 } while( 0 )
910
Andrzej Kurekf40daa32020-02-04 09:00:01 -0500911void set_ciphersuite( mbedtls_ssl_config *conf, const char *cipher,
912 int* forced_ciphersuite )
913{
914 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
915 forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( cipher );
916 forced_ciphersuite[1] = 0;
917
918 ciphersuite_info =
919 mbedtls_ssl_ciphersuite_from_id( forced_ciphersuite[0] );
920
921 TEST_ASSERT( ciphersuite_info != NULL );
922 TEST_ASSERT( ciphersuite_info->min_minor_ver <= conf->max_minor_ver );
923 TEST_ASSERT( ciphersuite_info->max_minor_ver >= conf->min_minor_ver );
924
925 if( conf->max_minor_ver > ciphersuite_info->max_minor_ver )
926 {
927 conf->max_minor_ver = ciphersuite_info->max_minor_ver;
928 }
929 if( conf->min_minor_ver < ciphersuite_info->min_minor_ver )
930 {
931 conf->min_minor_ver = ciphersuite_info->min_minor_ver;
932 }
933
934 mbedtls_ssl_conf_ciphersuites( conf, forced_ciphersuite );
935
936exit:
937 return;
938}
939
Andrzej Kurekcc5169c2020-02-04 09:04:56 -0500940int psk_dummy_callback( void *p_info, mbedtls_ssl_context *ssl,
941 const unsigned char *name, size_t name_len )
942{
943 (void) p_info;
944 (void) ssl;
945 (void) name;
946 (void) name_len;
947
948 return ( 0 );
949}
950
Hanno Beckerd856c822019-04-29 17:30:59 +0100951#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
952#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
953#else
954#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
955#endif
Hanno Beckera18d1322018-01-03 14:27:32 +0000956
957static int build_transforms( mbedtls_ssl_transform *t_in,
958 mbedtls_ssl_transform *t_out,
959 int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +0100960 int etm, int tag_mode, int ver,
961 size_t cid0_len,
962 size_t cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +0000963{
964 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +0100965 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +0000966
967 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +0000968 unsigned char *key0 = NULL, *key1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +0000969 unsigned char iv_enc[16], iv_dec[16];
970
Hanno Beckera0e20d02019-05-15 14:03:01 +0100971#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +0100972 unsigned char cid0[ SSL_CID_LEN_MIN ];
973 unsigned char cid1[ SSL_CID_LEN_MIN ];
974
975 rnd_std_rand( NULL, cid0, sizeof( cid0 ) );
976 rnd_std_rand( NULL, cid1, sizeof( cid1 ) );
Hanno Becker43c24b82019-05-01 09:45:57 +0100977#else
978 ((void) cid0_len);
979 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +0100980#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +0100981
Hanno Beckera18d1322018-01-03 14:27:32 +0000982 maclen = 0;
983
984 /* Pick cipher */
985 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
986 CHK( cipher_info != NULL );
987 CHK( cipher_info->iv_size <= 16 );
988 CHK( cipher_info->key_bitlen % 8 == 0 );
989
990 /* Pick keys */
991 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +0100992 /* Allocate `keylen + 1` bytes to ensure that we get
993 * a non-NULL pointers from `mbedtls_calloc` even if
994 * `keylen == 0` in the case of the NULL cipher. */
995 CHK( ( key0 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
996 CHK( ( key1 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +0000997 memset( key0, 0x1, keylen );
998 memset( key1, 0x2, keylen );
999
1000 /* Setup cipher contexts */
1001 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_enc, cipher_info ) == 0 );
1002 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_dec, cipher_info ) == 0 );
1003 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_enc, cipher_info ) == 0 );
1004 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_dec, cipher_info ) == 0 );
1005
1006#if defined(MBEDTLS_CIPHER_MODE_CBC)
1007 if( cipher_info->mode == MBEDTLS_MODE_CBC )
1008 {
1009 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_enc,
1010 MBEDTLS_PADDING_NONE ) == 0 );
1011 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_dec,
1012 MBEDTLS_PADDING_NONE ) == 0 );
1013 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_enc,
1014 MBEDTLS_PADDING_NONE ) == 0 );
1015 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_dec,
1016 MBEDTLS_PADDING_NONE ) == 0 );
1017 }
1018#endif /* MBEDTLS_CIPHER_MODE_CBC */
1019
1020 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_enc, key0,
1021 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1022 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_dec, key1,
1023 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
1024 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_enc, key1,
1025 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1026 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_dec, key0,
1027 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001028
1029 /* Setup MAC contexts */
1030#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1031 if( cipher_info->mode == MBEDTLS_MODE_CBC ||
1032 cipher_info->mode == MBEDTLS_MODE_STREAM )
1033 {
1034 mbedtls_md_info_t const *md_info;
1035 unsigned char *md0, *md1;
1036
1037 /* Pick hash */
1038 md_info = mbedtls_md_info_from_type( hash_id );
1039 CHK( md_info != NULL );
1040
1041 /* Pick hash keys */
1042 maclen = mbedtls_md_get_size( md_info );
Hanno Becker3ee54212019-04-04 16:31:26 +01001043 CHK( ( md0 = mbedtls_calloc( 1, maclen ) ) != NULL );
1044 CHK( ( md1 = mbedtls_calloc( 1, maclen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001045 memset( md0, 0x5, maclen );
1046 memset( md1, 0x6, maclen );
1047
1048 CHK( mbedtls_md_setup( &t_out->md_ctx_enc, md_info, 1 ) == 0 );
1049 CHK( mbedtls_md_setup( &t_out->md_ctx_dec, md_info, 1 ) == 0 );
1050 CHK( mbedtls_md_setup( &t_in->md_ctx_enc, md_info, 1 ) == 0 );
1051 CHK( mbedtls_md_setup( &t_in->md_ctx_dec, md_info, 1 ) == 0 );
1052
1053 if( ver > MBEDTLS_SSL_MINOR_VERSION_0 )
1054 {
1055 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_enc,
1056 md0, maclen ) == 0 );
1057 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_dec,
1058 md1, maclen ) == 0 );
1059 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_enc,
1060 md1, maclen ) == 0 );
1061 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_dec,
1062 md0, maclen ) == 0 );
1063 }
1064#if defined(MBEDTLS_SSL_PROTO_SSL3)
1065 else
1066 {
1067 memcpy( &t_in->mac_enc, md0, maclen );
1068 memcpy( &t_in->mac_dec, md1, maclen );
1069 memcpy( &t_out->mac_enc, md1, maclen );
1070 memcpy( &t_out->mac_dec, md0, maclen );
1071 }
1072#endif
1073
Hanno Becker3ee54212019-04-04 16:31:26 +01001074 mbedtls_free( md0 );
1075 mbedtls_free( md1 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001076 }
1077#else
1078 ((void) hash_id);
1079#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1080
1081
1082 /* Pick IV's (regardless of whether they
1083 * are being used by the transform). */
1084 ivlen = cipher_info->iv_size;
1085 memset( iv_enc, 0x3, sizeof( iv_enc ) );
1086 memset( iv_dec, 0x4, sizeof( iv_dec ) );
1087
1088 /*
1089 * Setup transforms
1090 */
1091
Jaeden Amero2de07f12019-06-05 13:32:08 +01001092#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1093 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001094 t_out->encrypt_then_mac = etm;
1095 t_in->encrypt_then_mac = etm;
1096#else
1097 ((void) etm);
1098#endif
1099
1100 t_out->minor_ver = ver;
1101 t_in->minor_ver = ver;
1102 t_out->ivlen = ivlen;
1103 t_in->ivlen = ivlen;
1104
1105 switch( cipher_info->mode )
1106 {
1107 case MBEDTLS_MODE_GCM:
1108 case MBEDTLS_MODE_CCM:
1109 t_out->fixed_ivlen = 4;
1110 t_in->fixed_ivlen = 4;
1111 t_out->maclen = 0;
1112 t_in->maclen = 0;
1113 switch( tag_mode )
1114 {
1115 case 0: /* Full tag */
1116 t_out->taglen = 16;
1117 t_in->taglen = 16;
1118 break;
1119 case 1: /* Partial tag */
1120 t_out->taglen = 8;
1121 t_in->taglen = 8;
1122 break;
1123 default:
1124 return( 1 );
1125 }
1126 break;
1127
1128 case MBEDTLS_MODE_CHACHAPOLY:
1129 t_out->fixed_ivlen = 12;
1130 t_in->fixed_ivlen = 12;
1131 t_out->maclen = 0;
1132 t_in->maclen = 0;
1133 switch( tag_mode )
1134 {
1135 case 0: /* Full tag */
1136 t_out->taglen = 16;
1137 t_in->taglen = 16;
1138 break;
1139 case 1: /* Partial tag */
1140 t_out->taglen = 8;
1141 t_in->taglen = 8;
1142 break;
1143 default:
1144 return( 1 );
1145 }
1146 break;
1147
1148 case MBEDTLS_MODE_STREAM:
1149 case MBEDTLS_MODE_CBC:
1150 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1151 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1152 t_out->taglen = 0;
1153 t_in->taglen = 0;
1154 switch( tag_mode )
1155 {
1156 case 0: /* Full tag */
1157 t_out->maclen = maclen;
1158 t_in->maclen = maclen;
1159 break;
1160 case 1: /* Partial tag */
1161 t_out->maclen = 10;
1162 t_in->maclen = 10;
1163 break;
1164 default:
1165 return( 1 );
1166 }
1167 break;
1168 default:
1169 return( 1 );
1170 break;
1171 }
1172
1173 /* Setup IV's */
1174
1175 memcpy( &t_in->iv_dec, iv_dec, sizeof( iv_dec ) );
1176 memcpy( &t_in->iv_enc, iv_enc, sizeof( iv_enc ) );
1177 memcpy( &t_out->iv_dec, iv_enc, sizeof( iv_enc ) );
1178 memcpy( &t_out->iv_enc, iv_dec, sizeof( iv_dec ) );
1179
Hanno Beckera0e20d02019-05-15 14:03:01 +01001180#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001181 /* Add CID */
1182 memcpy( &t_in->in_cid, cid0, cid0_len );
1183 memcpy( &t_in->out_cid, cid1, cid1_len );
1184 t_in->in_cid_len = cid0_len;
1185 t_in->out_cid_len = cid1_len;
1186 memcpy( &t_out->in_cid, cid1, cid1_len );
1187 memcpy( &t_out->out_cid, cid0, cid0_len );
1188 t_out->in_cid_len = cid1_len;
1189 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001190#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001191
Hanno Becker81e16a32019-03-01 11:21:44 +00001192cleanup:
1193
Hanno Becker3ee54212019-04-04 16:31:26 +01001194 mbedtls_free( key0 );
1195 mbedtls_free( key1 );
Hanno Becker81e16a32019-03-01 11:21:44 +00001196
Hanno Beckera5780f12019-04-05 09:55:37 +01001197 return( ret );
Hanno Beckera18d1322018-01-03 14:27:32 +00001198}
1199
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001200/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001201 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001202 * Choose dummy values, mostly non-0 to distinguish from the init default.
1203 */
1204static int ssl_populate_session( mbedtls_ssl_session *session,
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001205 int ticket_len,
1206 const char *crt_file )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001207{
1208#if defined(MBEDTLS_HAVE_TIME)
1209 session->start = mbedtls_time( NULL ) - 42;
1210#endif
1211 session->ciphersuite = 0xabcd;
1212 session->compression = 1;
1213 session->id_len = sizeof( session->id );
1214 memset( session->id, 66, session->id_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001215 memset( session->master, 17, sizeof( session->master ) );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001216
Manuel Pégourié-Gonnard1f6033a2019-05-24 10:17:52 +02001217#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001218 if( strlen( crt_file ) != 0 )
1219 {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001220 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001221 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001222
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001223 mbedtls_x509_crt_init( &tmp_crt );
1224 ret = mbedtls_x509_crt_parse_file( &tmp_crt, crt_file );
1225 if( ret != 0 )
1226 return( ret );
1227
1228#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1229 /* Move temporary CRT. */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001230 session->peer_cert = mbedtls_calloc( 1, sizeof( *session->peer_cert ) );
1231 if( session->peer_cert == NULL )
1232 return( -1 );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001233 *session->peer_cert = tmp_crt;
1234 memset( &tmp_crt, 0, sizeof( tmp_crt ) );
1235#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1236 /* Calculate digest of temporary CRT. */
1237 session->peer_cert_digest =
1238 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
1239 if( session->peer_cert_digest == NULL )
1240 return( -1 );
1241 ret = mbedtls_md( mbedtls_md_info_from_type(
1242 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
1243 tmp_crt.raw.p, tmp_crt.raw.len,
1244 session->peer_cert_digest );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001245 if( ret != 0 )
1246 return( ret );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001247 session->peer_cert_digest_type =
1248 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1249 session->peer_cert_digest_len =
1250 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1251#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1252
1253 mbedtls_x509_crt_free( &tmp_crt );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001254 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001255#else /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001256 (void) crt_file;
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001257#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001258 session->verify_result = 0xdeadbeef;
1259
1260#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
1261 if( ticket_len != 0 )
1262 {
1263 session->ticket = mbedtls_calloc( 1, ticket_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001264 if( session->ticket == NULL )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001265 return( -1 );
1266 memset( session->ticket, 33, ticket_len );
1267 }
1268 session->ticket_len = ticket_len;
1269 session->ticket_lifetime = 86401;
1270#else
1271 (void) ticket_len;
1272#endif
1273
1274#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1275 session->mfl_code = 1;
1276#endif
1277#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1278 session->trunc_hmac = 1;
1279#endif
1280#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1281 session->encrypt_then_mac = 1;
1282#endif
1283
1284 return( 0 );
1285}
1286
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001287/* END_HEADER */
1288
1289/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001290 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001291 * END_DEPENDENCIES
1292 */
1293
Janos Follath6264e662019-11-26 11:11:15 +00001294/* BEGIN_CASE */
1295void test_callback_buffer_sanity()
1296{
1297 enum { MSGLEN = 10 };
1298 mbedtls_test_buffer buf;
1299 unsigned char input[MSGLEN];
1300 unsigned char output[MSGLEN];
1301
1302 memset( input, 0, sizeof(input) );
1303
1304 /* Make sure calling put and get on NULL buffer results in error. */
1305 TEST_ASSERT( mbedtls_test_buffer_put( NULL, input, sizeof( input ) )
1306 == -1 );
1307 TEST_ASSERT( mbedtls_test_buffer_get( NULL, output, sizeof( output ) )
1308 == -1 );
1309 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001310
Janos Follath6264e662019-11-26 11:11:15 +00001311 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, 0 ) == -1 );
1312 TEST_ASSERT( mbedtls_test_buffer_get( NULL, NULL, 0 ) == -1 );
1313
1314 /* Make sure calling put and get on a buffer that hasn't been set up results
1315 * in eror. */
1316 mbedtls_test_buffer_init( &buf );
1317
1318 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) ) == -1 );
1319 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, sizeof( output ) )
1320 == -1 );
1321 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001322
Janos Follath6264e662019-11-26 11:11:15 +00001323 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == -1 );
1324 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == -1 );
1325
Andrzej Kurekf7774142020-01-22 06:34:59 -05001326 /* Make sure calling put and get on NULL input only results in
1327 * error if the length is not zero, and that a NULL output is valid for data
1328 * dropping.
1329 */
Janos Follath6264e662019-11-26 11:11:15 +00001330
1331 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, sizeof( input ) ) == 0 );
1332
1333 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
1334 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, sizeof( output ) )
Andrzej Kurekf7774142020-01-22 06:34:59 -05001335 == 0 );
Janos Follath6264e662019-11-26 11:11:15 +00001336 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == 0 );
1337 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == 0 );
1338
Piotr Nowickifb437d72020-01-13 16:59:12 +01001339 /* Make sure calling put several times in the row is safe */
1340
1341 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) )
1342 == sizeof( input ) );
1343 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, 2 ) == 2 );
1344 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 1 ) == 1 );
1345 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 1 );
1346 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 0 );
1347
1348
Janos Follath6264e662019-11-26 11:11:15 +00001349exit:
1350
1351 mbedtls_test_buffer_free( &buf );
1352}
1353/* END_CASE */
1354
1355/*
1356 * Test if the implementation of `mbedtls_test_buffer` related functions is
1357 * correct and works as expected.
1358 *
1359 * That is
1360 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
1361 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1362 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
1363 * bytes.
1364 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1365 * - All of the bytes we got match the bytes we put in in a FIFO manner.
1366 */
1367
1368/* BEGIN_CASE */
1369void test_callback_buffer( int size, int put1, int put1_ret,
1370 int get1, int get1_ret, int put2, int put2_ret,
1371 int get2, int get2_ret )
1372{
1373 enum { ROUNDS = 2 };
1374 size_t put[ROUNDS];
1375 int put_ret[ROUNDS];
1376 size_t get[ROUNDS];
1377 int get_ret[ROUNDS];
1378 mbedtls_test_buffer buf;
1379 unsigned char* input = NULL;
1380 size_t input_len;
1381 unsigned char* output = NULL;
1382 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00001383 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00001384
1385 mbedtls_test_buffer_init( &buf );
1386 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, size ) == 0 );
1387
1388 /* Check the sanity of input parameters and initialise local variables. That
1389 * is, ensure that the amount of data is not negative and that we are not
1390 * expecting more to put or get than we actually asked for. */
1391 TEST_ASSERT( put1 >= 0 );
1392 put[0] = put1;
1393 put_ret[0] = put1_ret;
1394 TEST_ASSERT( put1_ret <= put1 );
1395 TEST_ASSERT( put2 >= 0 );
1396 put[1] = put2;
1397 put_ret[1] = put2_ret;
1398 TEST_ASSERT( put2_ret <= put2 );
1399
1400 TEST_ASSERT( get1 >= 0 );
1401 get[0] = get1;
1402 get_ret[0] = get1_ret;
1403 TEST_ASSERT( get1_ret <= get1 );
1404 TEST_ASSERT( get2 >= 0 );
1405 get[1] = get2;
1406 get_ret[1] = get2_ret;
1407 TEST_ASSERT( get2_ret <= get2 );
1408
1409 input_len = 0;
1410 /* Calculate actual input and output lengths */
1411 for( j = 0; j < ROUNDS; j++ )
1412 {
1413 if( put_ret[j] > 0 )
1414 {
1415 input_len += put_ret[j];
1416 }
1417 }
1418 /* In order to always have a valid pointer we always allocate at least 1
1419 * byte. */
1420 if( input_len == 0 )
1421 input_len = 1;
1422 ASSERT_ALLOC( input, input_len );
1423
1424 output_len = 0;
1425 for( j = 0; j < ROUNDS; j++ )
1426 {
1427 if( get_ret[j] > 0 )
1428 {
1429 output_len += get_ret[j];
1430 }
1431 }
1432 TEST_ASSERT( output_len <= input_len );
1433 /* In order to always have a valid pointer we always allocate at least 1
1434 * byte. */
1435 if( output_len == 0 )
1436 output_len = 1;
1437 ASSERT_ALLOC( output, output_len );
1438
1439 /* Fill up the buffer with structured data so that unwanted changes
1440 * can be detected */
1441 for( i = 0; i < input_len; i++ )
1442 {
1443 input[i] = i & 0xFF;
1444 }
1445
1446 written = read = 0;
1447 for( j = 0; j < ROUNDS; j++ )
1448 {
1449 TEST_ASSERT( put_ret[j] == mbedtls_test_buffer_put( &buf,
1450 input + written, put[j] ) );
1451 written += put_ret[j];
1452 TEST_ASSERT( get_ret[j] == mbedtls_test_buffer_get( &buf,
1453 output + read, get[j] ) );
1454 read += get_ret[j];
1455 TEST_ASSERT( read <= written );
1456 if( get_ret[j] > 0 )
1457 {
1458 TEST_ASSERT( memcmp( output + read - get_ret[j],
1459 input + read - get_ret[j], get_ret[j] )
1460 == 0 );
1461 }
1462 }
1463
1464exit:
1465
1466 mbedtls_free( input );
1467 mbedtls_free( output );
1468 mbedtls_test_buffer_free( &buf );
1469}
1470/* END_CASE */
1471
Janos Follath031827f2019-11-27 11:12:14 +00001472/*
Janos Follathc673c2c2019-12-02 15:47:26 +00001473 * Test if the implementation of `mbedtls_mock_socket` related I/O functions is
1474 * correct and works as expected on unconnected sockets.
1475 */
1476
1477/* BEGIN_CASE */
1478void ssl_mock_sanity( )
1479{
1480 enum { MSGLEN = 105 };
1481 unsigned char message[MSGLEN];
1482 unsigned char received[MSGLEN];
1483 mbedtls_mock_socket socket;
1484
1485 mbedtls_mock_socket_init( &socket );
1486 TEST_ASSERT( mbedtls_mock_tcp_send_b( &socket, message, MSGLEN ) < 0 );
1487 mbedtls_mock_socket_close( &socket );
1488 mbedtls_mock_socket_init( &socket );
1489 TEST_ASSERT( mbedtls_mock_tcp_recv_b( &socket, received, MSGLEN ) < 0 );
1490 mbedtls_mock_socket_close( &socket );
1491
1492 mbedtls_mock_socket_init( &socket );
1493 TEST_ASSERT( mbedtls_mock_tcp_send_nb( &socket, message, MSGLEN ) < 0 );
1494 mbedtls_mock_socket_close( &socket );
1495 mbedtls_mock_socket_init( &socket );
1496 TEST_ASSERT( mbedtls_mock_tcp_recv_nb( &socket, received, MSGLEN ) < 0 );
1497 mbedtls_mock_socket_close( &socket );
1498
1499exit:
1500
1501 mbedtls_mock_socket_close( &socket );
1502}
1503/* END_CASE */
1504
1505/*
1506 * Test if the implementation of `mbedtls_mock_socket` related functions can
1507 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00001508 */
1509
1510/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001511void ssl_mock_tcp( int blocking )
Janos Follath031827f2019-11-27 11:12:14 +00001512{
Janos Follathc673c2c2019-12-02 15:47:26 +00001513 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001514 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00001515 unsigned char message[MSGLEN];
1516 unsigned char received[MSGLEN];
1517 mbedtls_mock_socket client;
1518 mbedtls_mock_socket server;
1519 size_t written, read;
1520 int send_ret, recv_ret;
1521 mbedtls_ssl_send_t *send;
1522 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00001523 unsigned i;
1524
1525 if( blocking == 0 )
1526 {
1527 send = mbedtls_mock_tcp_send_nb;
1528 recv = mbedtls_mock_tcp_recv_nb;
1529 }
1530 else
1531 {
1532 send = mbedtls_mock_tcp_send_b;
1533 recv = mbedtls_mock_tcp_recv_b;
1534 }
1535
1536 mbedtls_mock_socket_init( &client );
1537 mbedtls_mock_socket_init( &server );
1538
1539 /* Fill up the buffer with structured data so that unwanted changes
1540 * can be detected */
1541 for( i = 0; i < MSGLEN; i++ )
1542 {
1543 message[i] = i & 0xFF;
1544 }
1545
1546 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001547 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follathc673c2c2019-12-02 15:47:26 +00001548
1549 /* Send the message to the server */
1550 send_ret = recv_ret = 1;
1551 written = read = 0;
1552 while( send_ret != 0 || recv_ret != 0 )
1553 {
1554 send_ret = send( &client, message + written, MSGLEN - written );
1555
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001556 TEST_ASSERT( send_ret >= 0 );
1557 TEST_ASSERT( send_ret <= BUFLEN );
1558 written += send_ret;
1559
1560 /* If the buffer is full we can test blocking and non-blocking send */
1561 if ( send_ret == BUFLEN )
Janos Follathc673c2c2019-12-02 15:47:26 +00001562 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001563 int blocking_ret = send( &client, message , 1 );
1564 if ( blocking )
1565 {
1566 TEST_ASSERT( blocking_ret == 0 );
1567 }
1568 else
1569 {
1570 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1571 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001572 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001573
1574 recv_ret = recv( &server, received + read, MSGLEN - read );
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001575
1576 /* The result depends on whether any data was sent */
1577 if ( send_ret > 0 )
Janos Follathc673c2c2019-12-02 15:47:26 +00001578 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001579 TEST_ASSERT( recv_ret > 0 );
1580 TEST_ASSERT( recv_ret <= BUFLEN );
1581 read += recv_ret;
1582 }
1583 else if( blocking )
1584 {
1585 TEST_ASSERT( recv_ret == 0 );
Janos Follathc673c2c2019-12-02 15:47:26 +00001586 }
1587 else
1588 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001589 TEST_ASSERT( recv_ret == MBEDTLS_ERR_SSL_WANT_READ );
1590 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00001591 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001592
1593 /* If the buffer is empty we can test blocking and non-blocking read */
1594 if ( recv_ret == BUFLEN )
1595 {
1596 int blocking_ret = recv( &server, received, 1 );
1597 if ( blocking )
1598 {
1599 TEST_ASSERT( blocking_ret == 0 );
1600 }
1601 else
1602 {
1603 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
1604 }
1605 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001606 }
1607 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1608
1609exit:
1610
1611 mbedtls_mock_socket_close( &client );
1612 mbedtls_mock_socket_close( &server );
1613}
1614/* END_CASE */
1615
1616/*
1617 * Test if the implementation of `mbedtls_mock_socket` related functions can
1618 * send messages in both direction at the same time (with the I/O calls
1619 * interleaving).
1620 */
1621
1622/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001623void ssl_mock_tcp_interleaving( int blocking )
Janos Follathc673c2c2019-12-02 15:47:26 +00001624{
Janos Follath031827f2019-11-27 11:12:14 +00001625 enum { ROUNDS = 2 };
1626 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001627 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00001628 unsigned char message[ROUNDS][MSGLEN];
1629 unsigned char received[ROUNDS][MSGLEN];
1630 mbedtls_mock_socket client;
1631 mbedtls_mock_socket server;
1632 size_t written[ROUNDS];
1633 size_t read[ROUNDS];
1634 int send_ret[ROUNDS];
1635 int recv_ret[ROUNDS];
1636 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00001637 mbedtls_ssl_send_t *send;
1638 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00001639
1640 if( blocking == 0 )
1641 {
1642 send = mbedtls_mock_tcp_send_nb;
1643 recv = mbedtls_mock_tcp_recv_nb;
1644 }
1645 else
1646 {
1647 send = mbedtls_mock_tcp_send_b;
1648 recv = mbedtls_mock_tcp_recv_b;
1649 }
Janos Follath031827f2019-11-27 11:12:14 +00001650
1651 mbedtls_mock_socket_init( &client );
1652 mbedtls_mock_socket_init( &server );
1653
1654 /* Fill up the buffers with structured data so that unwanted changes
1655 * can be detected */
1656 for( i = 0; i < ROUNDS; i++ )
1657 {
1658 for( j = 0; j < MSGLEN; j++ )
1659 {
1660 message[i][j] = ( i * MSGLEN + j ) & 0xFF;
1661 }
1662 }
1663
Janos Follath031827f2019-11-27 11:12:14 +00001664 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001665 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follath031827f2019-11-27 11:12:14 +00001666
Janos Follath031827f2019-11-27 11:12:14 +00001667 /* Send the message from both sides, interleaving. */
1668 progress = 1;
1669 for( i = 0; i < ROUNDS; i++ )
1670 {
1671 written[i] = 0;
1672 read[i] = 0;
1673 }
1674 /* This loop does not stop as long as there was a successful write or read
1675 * of at least one byte on either side. */
1676 while( progress != 0 )
1677 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001678 mbedtls_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00001679
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001680 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001681 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001682 /* First sending is from the client */
1683 socket = ( i % 2 == 0 ) ? ( &client ) : ( &server );
Janos Follath031827f2019-11-27 11:12:14 +00001684
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001685 send_ret[i] = send( socket, message[i] + written[i],
1686 MSGLEN - written[i] );
1687 TEST_ASSERT( send_ret[i] >= 0 );
1688 TEST_ASSERT( send_ret[i] <= BUFLEN );
1689 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00001690
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001691 /* If the buffer is full we can test blocking and non-blocking
1692 * send */
1693 if ( send_ret[i] == BUFLEN )
1694 {
1695 int blocking_ret = send( socket, message[i] , 1 );
1696 if ( blocking )
1697 {
1698 TEST_ASSERT( blocking_ret == 0 );
1699 }
1700 else
1701 {
1702 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1703 }
1704 }
Janos Follath3766ba52019-11-27 13:31:42 +00001705 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001706
1707 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001708 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001709 /* First receiving is from the server */
1710 socket = ( i % 2 == 0 ) ? ( &server ) : ( &client );
1711
1712 recv_ret[i] = recv( socket, received[i] + read[i],
1713 MSGLEN - read[i] );
1714
1715 /* The result depends on whether any data was sent */
1716 if ( send_ret[i] > 0 )
1717 {
1718 TEST_ASSERT( recv_ret[i] > 0 );
1719 TEST_ASSERT( recv_ret[i] <= BUFLEN );
1720 read[i] += recv_ret[i];
1721 }
1722 else if( blocking )
1723 {
1724 TEST_ASSERT( recv_ret[i] == 0 );
1725 }
1726 else
1727 {
1728 TEST_ASSERT( recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ );
1729 recv_ret[i] = 0;
1730 }
1731
1732 /* If the buffer is empty we can test blocking and non-blocking
1733 * read */
1734 if ( recv_ret[i] == BUFLEN )
1735 {
1736 int blocking_ret = recv( socket, received[i], 1 );
1737 if ( blocking )
1738 {
1739 TEST_ASSERT( blocking_ret == 0 );
1740 }
1741 else
1742 {
1743 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
1744 }
1745 }
Janos Follath3766ba52019-11-27 13:31:42 +00001746 }
Janos Follath031827f2019-11-27 11:12:14 +00001747
1748 progress = 0;
1749 for( i = 0; i < ROUNDS; i++ )
1750 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001751 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00001752 }
1753 }
1754
1755 for( i = 0; i < ROUNDS; i++ )
1756 TEST_ASSERT( memcmp( message[i], received[i], MSGLEN ) == 0 );
1757
1758exit:
1759
1760 mbedtls_mock_socket_close( &client );
1761 mbedtls_mock_socket_close( &server );
1762}
1763/* END_CASE */
1764
Andrzej Kurek13719cd2020-01-22 06:36:39 -05001765/* BEGIN_CASE */
1766void ssl_message_queue_sanity( )
1767{
1768 mbedtls_test_message_queue queue;
1769
1770 /* Trying to push/pull to an empty queue */
1771 TEST_ASSERT( mbedtls_test_message_queue_push_info( NULL, 1 )
1772 == MBEDTLS_TEST_ERROR_ARG_NULL );
1773 TEST_ASSERT( mbedtls_test_message_queue_pop_info( NULL, 1 )
1774 == MBEDTLS_TEST_ERROR_ARG_NULL );
1775
1776 mbedtls_test_message_queue_setup( &queue, 3 );
1777 TEST_ASSERT( queue.capacity == 3 );
1778 TEST_ASSERT( queue.num == 0 );
1779
1780exit:
1781 mbedtls_test_message_queue_free( &queue );
1782}
1783/* END_CASE */
1784
1785/* BEGIN_CASE */
1786void ssl_message_queue_basic( )
1787{
1788 mbedtls_test_message_queue queue;
1789
1790 mbedtls_test_message_queue_setup( &queue, 3 );
1791
1792 /* Sanity test - 3 pushes and 3 pops with sufficient space */
1793 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1794 TEST_ASSERT( queue.capacity == 3 );
1795 TEST_ASSERT( queue.num == 1 );
1796 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1797 TEST_ASSERT( queue.capacity == 3 );
1798 TEST_ASSERT( queue.num == 2 );
1799 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1800 TEST_ASSERT( queue.capacity == 3 );
1801 TEST_ASSERT( queue.num == 3 );
1802
1803 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1804 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1805 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1806
1807exit:
1808 mbedtls_test_message_queue_free( &queue );
1809}
1810/* END_CASE */
1811
1812/* BEGIN_CASE */
1813void ssl_message_queue_overflow_underflow( )
1814{
1815 mbedtls_test_message_queue queue;
1816
1817 mbedtls_test_message_queue_setup( &queue, 3 );
1818
1819 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
1820 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1821 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1822 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1823 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 )
1824 == MBEDTLS_TEST_ERROR_QUEUE_FULL );
1825
1826 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1827 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1828 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1829
1830 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 )
1831 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
1832
1833exit:
1834 mbedtls_test_message_queue_free( &queue );
1835}
1836/* END_CASE */
1837
1838/* BEGIN_CASE */
1839void ssl_message_queue_interleaved( )
1840{
1841 mbedtls_test_message_queue queue;
1842
1843 mbedtls_test_message_queue_setup( &queue, 3 );
1844
1845 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
1846 * (to wrap around the buffer) */
1847 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1848 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1849
1850 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1851
1852 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1853 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 ) == 3 );
1854
1855 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1856 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1857
1858 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 5 ) == 5 );
1859 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 8 ) == 8 );
1860
1861 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 3 ) == 3 );
1862
1863 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 5 ) == 5 );
1864
1865 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 8 ) == 8 );
1866
1867exit:
1868 mbedtls_test_message_queue_free( &queue );
1869}
1870/* END_CASE */
1871
1872/* BEGIN_CASE */
1873void ssl_message_queue_insufficient_buffer( )
1874{
1875 mbedtls_test_message_queue queue;
1876 size_t message_len = 10;
1877 size_t buffer_len = 5;
1878
1879 mbedtls_test_message_queue_setup( &queue, 1 );
1880
1881 /* Popping without a sufficient buffer */
1882 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, message_len )
1883 == (int) message_len );
1884 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, buffer_len )
1885 == (int) buffer_len );
1886exit:
1887 mbedtls_test_message_queue_free( &queue );
1888}
1889/* END_CASE */
1890
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001891/* BEGIN_CASE */
1892void ssl_message_mock_uninitialized( )
1893{
1894 enum { MSGLEN = 10 };
1895 unsigned char message[MSGLEN], received[MSGLEN];
1896 mbedtls_mock_socket client, server;
1897 mbedtls_test_message_queue server_queue, client_queue;
1898 mbedtls_test_message_socket_context server_context, client_context;
1899
1900 /* Send with a NULL context */
1901 TEST_ASSERT( mbedtls_mock_tcp_send_msg( NULL, message, MSGLEN )
1902 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
1903
1904 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( NULL, message, MSGLEN )
1905 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
1906
1907 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
1908 &server,
1909 &server_context ) == 0 );
1910
1911 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
1912 &client,
1913 &client_context ) == 0 );
1914
1915 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message, MSGLEN )
1916 == MBEDTLS_TEST_ERROR_SEND_FAILED );
1917
1918 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1919 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
1920
1921 /* Push directly to a queue to later simulate a disconnected behavior */
1922 TEST_ASSERT( mbedtls_test_message_queue_push_info( &server_queue, MSGLEN )
1923 == MSGLEN );
1924
1925 /* Test if there's an error when trying to read from a disconnected
1926 * socket */
1927 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1928 == MBEDTLS_TEST_ERROR_RECV_FAILED );
1929 exit:
1930 mbedtls_message_socket_close( &server_context );
1931 mbedtls_message_socket_close( &client_context );
1932}
1933/* END_CASE */
1934
1935/* BEGIN_CASE */
1936void ssl_message_mock_basic( )
1937{
1938 enum { MSGLEN = 10 };
1939 unsigned char message[MSGLEN], received[MSGLEN];
1940 mbedtls_mock_socket client, server;
1941 unsigned i;
1942 mbedtls_test_message_queue server_queue, client_queue;
1943 mbedtls_test_message_socket_context server_context, client_context;
1944
1945 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
1946 &server,
1947 &server_context ) == 0 );
1948
1949 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
1950 &client,
1951 &client_context ) == 0 );
1952
1953 /* Fill up the buffer with structured data so that unwanted changes
1954 * can be detected */
1955 for( i = 0; i < MSGLEN; i++ )
1956 {
1957 message[i] = i & 0xFF;
1958 }
1959 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
1960 MSGLEN ) );
1961
1962 /* Send the message to the server */
1963 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
1964 MSGLEN ) == MSGLEN );
1965
1966 /* Read from the server */
1967 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1968 == MSGLEN );
1969
1970 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1971 memset( received, 0, MSGLEN );
1972
1973 /* Send the message to the client */
1974 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
1975 MSGLEN ) == MSGLEN );
1976
1977 /* Read from the client */
1978 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
1979 == MSGLEN );
1980 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1981
1982 exit:
1983 mbedtls_message_socket_close( &server_context );
1984 mbedtls_message_socket_close( &client_context );
1985}
1986/* END_CASE */
1987
1988/* BEGIN_CASE */
1989void ssl_message_mock_queue_overflow_underflow( )
1990{
1991 enum { MSGLEN = 10 };
1992 unsigned char message[MSGLEN], received[MSGLEN];
1993 mbedtls_mock_socket client, server;
1994 unsigned i;
1995 mbedtls_test_message_queue server_queue, client_queue;
1996 mbedtls_test_message_socket_context server_context, client_context;
1997
1998 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
1999 &server,
2000 &server_context ) == 0 );
2001
2002 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2003 &client,
2004 &client_context ) == 0 );
2005
2006 /* Fill up the buffer with structured data so that unwanted changes
2007 * can be detected */
2008 for( i = 0; i < MSGLEN; i++ )
2009 {
2010 message[i] = i & 0xFF;
2011 }
2012 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2013 MSGLEN*2 ) );
2014
2015 /* Send three message to the server, last one with an error */
2016 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2017 MSGLEN - 1 ) == MSGLEN - 1 );
2018
2019 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2020 MSGLEN ) == MSGLEN );
2021
2022 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2023 MSGLEN )
2024 == MBEDTLS_TEST_ERROR_QUEUE_FULL );
2025
2026 /* Read three messages from the server, last one with an error */
2027 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2028 MSGLEN - 1 ) == MSGLEN - 1 );
2029
2030 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2031 == MSGLEN );
2032
2033 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2034
2035 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2036 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2037
2038 exit:
2039 mbedtls_message_socket_close( &server_context );
2040 mbedtls_message_socket_close( &client_context );
2041}
2042/* END_CASE */
2043
2044/* BEGIN_CASE */
2045void ssl_message_mock_socket_overflow( )
2046{
2047 enum { MSGLEN = 10 };
2048 unsigned char message[MSGLEN], received[MSGLEN];
2049 mbedtls_mock_socket client, server;
2050 unsigned i;
2051 mbedtls_test_message_queue server_queue, client_queue;
2052 mbedtls_test_message_socket_context server_context, client_context;
2053
2054 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2055 &server,
2056 &server_context ) == 0 );
2057
2058 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2059 &client,
2060 &client_context ) == 0 );
2061
2062 /* Fill up the buffer with structured data so that unwanted changes
2063 * can be detected */
2064 for( i = 0; i < MSGLEN; i++ )
2065 {
2066 message[i] = i & 0xFF;
2067 }
2068 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2069 MSGLEN ) );
2070
2071 /* Send two message to the server, second one with an error */
2072 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2073 MSGLEN ) == MSGLEN );
2074
2075 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2076 MSGLEN )
2077 == MBEDTLS_TEST_ERROR_SEND_FAILED );
2078
2079 /* Read the only message from the server */
2080 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2081 == MSGLEN );
2082
2083 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2084
2085 exit:
2086 mbedtls_message_socket_close( &server_context );
2087 mbedtls_message_socket_close( &client_context );
2088}
2089/* END_CASE */
2090
2091/* BEGIN_CASE */
2092void ssl_message_mock_truncated( )
2093{
2094 enum { MSGLEN = 10 };
2095 unsigned char message[MSGLEN], received[MSGLEN];
2096 mbedtls_mock_socket client, server;
2097 unsigned i;
2098 mbedtls_test_message_queue server_queue, client_queue;
2099 mbedtls_test_message_socket_context server_context, client_context;
2100
2101 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2102 &server,
2103 &server_context ) == 0 );
2104
2105 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2106 &client,
2107 &client_context ) == 0 );
2108
2109 memset( received, 0, MSGLEN );
2110 /* Fill up the buffer with structured data so that unwanted changes
2111 * can be detected */
2112 for( i = 0; i < MSGLEN; i++ )
2113 {
2114 message[i] = i & 0xFF;
2115 }
2116 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2117 2 * MSGLEN ) );
2118
2119 /* Send two messages to the server, the second one small enough to fit in the
2120 * receiver's buffer. */
2121 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2122 MSGLEN ) == MSGLEN );
2123 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2124 MSGLEN / 2 ) == MSGLEN / 2 );
2125 /* Read a truncated message from the server */
2126 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2127 == MSGLEN/2 );
2128
2129 /* Test that the first half of the message is valid, and second one isn't */
2130 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2131 TEST_ASSERT( memcmp( message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2 )
2132 != 0 );
2133 memset( received, 0, MSGLEN );
2134
2135 /* Read a full message from the server */
2136 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2137 == MSGLEN / 2 );
2138
2139 /* Test that the first half of the message is valid */
2140 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2141
2142 exit:
2143 mbedtls_message_socket_close( &server_context );
2144 mbedtls_message_socket_close( &client_context );
2145}
2146/* END_CASE */
2147
2148/* BEGIN_CASE */
2149void ssl_message_mock_socket_read_error( )
2150{
2151 enum { MSGLEN = 10 };
2152 unsigned char message[MSGLEN], received[MSGLEN];
2153 mbedtls_mock_socket client, server;
2154 unsigned i;
2155 mbedtls_test_message_queue server_queue, client_queue;
2156 mbedtls_test_message_socket_context server_context, client_context;
2157
2158 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2159 &server,
2160 &server_context ) == 0 );
2161
2162 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2163 &client,
2164 &client_context ) == 0 );
2165
2166 /* Fill up the buffer with structured data so that unwanted changes
2167 * can be detected */
2168 for( i = 0; i < MSGLEN; i++ )
2169 {
2170 message[i] = i & 0xFF;
2171 }
2172 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2173 MSGLEN ) );
2174
2175 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2176 MSGLEN ) == MSGLEN );
2177
2178 /* Force a read error by disconnecting the socket by hand */
2179 server.status = 0;
2180 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2181 == MBEDTLS_TEST_ERROR_RECV_FAILED );
2182 /* Return to a valid state */
2183 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
2184
2185 memset( received, 0, sizeof( received ) );
2186
2187 /* Test that even though the server tried to read once disconnected, the
2188 * continuity is preserved */
2189 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2190 == MSGLEN );
2191
2192 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2193
2194 exit:
2195 mbedtls_message_socket_close( &server_context );
2196 mbedtls_message_socket_close( &client_context );
2197}
2198/* END_CASE */
2199
2200/* BEGIN_CASE */
2201void ssl_message_mock_interleaved_one_way( )
2202{
2203 enum { MSGLEN = 10 };
2204 unsigned char message[MSGLEN], received[MSGLEN];
2205 mbedtls_mock_socket client, server;
2206 unsigned i;
2207 mbedtls_test_message_queue server_queue, client_queue;
2208 mbedtls_test_message_socket_context server_context, client_context;
2209
2210 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2211 &server,
2212 &server_context ) == 0 );
2213
2214 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2215 &client,
2216 &client_context ) == 0 );
2217
2218 /* Fill up the buffer with structured data so that unwanted changes
2219 * can be detected */
2220 for( i = 0; i < MSGLEN; i++ )
2221 {
2222 message[i] = i & 0xFF;
2223 }
2224 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2225 MSGLEN*3 ) );
2226
2227 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
2228 * (to wrap around the buffer) */
2229 for( i = 0; i < 2; i++ )
2230 {
2231 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2232 MSGLEN ) == MSGLEN );
2233
2234 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2235 MSGLEN ) == MSGLEN );
2236
2237 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2238 MSGLEN ) == MSGLEN );
2239 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2240 memset( received, 0, sizeof( received ) );
2241 }
2242
2243 for( i = 0; i < 2; i++ )
2244 {
2245 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2246 MSGLEN ) == MSGLEN );
2247
2248 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2249 }
2250 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2251 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2252 exit:
2253 mbedtls_message_socket_close( &server_context );
2254 mbedtls_message_socket_close( &client_context );
2255}
2256/* END_CASE */
2257
2258/* BEGIN_CASE */
2259void ssl_message_mock_interleaved_two_ways( )
2260{
2261 enum { MSGLEN = 10 };
2262 unsigned char message[MSGLEN], received[MSGLEN];
2263 mbedtls_mock_socket client, server;
2264 unsigned i;
2265 mbedtls_test_message_queue server_queue, client_queue;
2266 mbedtls_test_message_socket_context server_context, client_context;
2267
2268 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2269 &server,
2270 &server_context ) == 0 );
2271
2272 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2273 &client,
2274 &client_context ) == 0 );
2275
2276 /* Fill up the buffer with structured data so that unwanted changes
2277 * can be detected */
2278 for( i = 0; i < MSGLEN; i++ )
2279 {
2280 message[i] = i & 0xFF;
2281 }
2282 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2283 MSGLEN*3 ) );
2284
2285 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
2286 * (to wrap around the buffer) both ways. */
2287 for( i = 0; i < 2; i++ )
2288 {
2289 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2290 MSGLEN ) == MSGLEN );
2291
2292 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2293 MSGLEN ) == MSGLEN );
2294
2295 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2296 MSGLEN ) == MSGLEN );
2297
2298 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2299 MSGLEN ) == MSGLEN );
2300
2301 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2302 MSGLEN ) == MSGLEN );
2303
2304 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2305
2306 memset( received, 0, sizeof( received ) );
2307
2308 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2309 MSGLEN ) == MSGLEN );
2310
2311 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2312
2313 memset( received, 0, sizeof( received ) );
2314 }
2315
2316 for( i = 0; i < 2; i++ )
2317 {
2318 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2319 MSGLEN ) == MSGLEN );
2320
2321 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2322 memset( received, 0, sizeof( received ) );
2323
2324 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2325 MSGLEN ) == MSGLEN );
2326
2327 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2328 memset( received, 0, sizeof( received ) );
2329 }
2330
2331 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2332 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2333
2334 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
2335 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2336 exit:
2337 mbedtls_message_socket_close( &server_context );
2338 mbedtls_message_socket_close( &client_context );
2339}
2340/* END_CASE */
2341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002342/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Azim Khan5fcca462018-06-29 11:05:32 +01002343void ssl_dtls_replay( data_t * prevs, data_t * new, int ret )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002344{
Azim Khand30ca132017-06-09 04:32:58 +01002345 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002346 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002347 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002348
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002349 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002350 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002351
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02002352 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
2353 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02002354 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2355 MBEDTLS_SSL_PRESET_DEFAULT ) == 0 );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002356 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002357
2358 /* Read previous record numbers */
Azim Khand30ca132017-06-09 04:32:58 +01002359 for( len = 0; len < prevs->len; len += 6 )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002360 {
Azim Khand30ca132017-06-09 04:32:58 +01002361 memcpy( ssl.in_ctr + 2, prevs->x + len, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002362 mbedtls_ssl_dtls_replay_update( &ssl );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002363 }
2364
2365 /* Check new number */
Azim Khand30ca132017-06-09 04:32:58 +01002366 memcpy( ssl.in_ctr + 2, new->x, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002367 TEST_ASSERT( mbedtls_ssl_dtls_replay_check( &ssl ) == ret );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002369 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002370 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002371}
2372/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002373
2374/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
2375void ssl_set_hostname_twice( char *hostname0, char *hostname1 )
2376{
2377 mbedtls_ssl_context ssl;
2378 mbedtls_ssl_init( &ssl );
2379
2380 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname0 ) == 0 );
2381 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname1 ) == 0 );
2382
2383 mbedtls_ssl_free( &ssl );
2384}
Darryl Green11999bb2018-03-13 15:22:58 +00002385/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00002386
2387/* BEGIN_CASE */
2388void ssl_crypt_record( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002389 int etm, int tag_mode, int ver,
2390 int cid0_len, int cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00002391{
2392 /*
2393 * Test several record encryptions and decryptions
2394 * with plenty of space before and after the data
2395 * within the record buffer.
2396 */
2397
2398 int ret;
2399 int num_records = 16;
2400 mbedtls_ssl_context ssl; /* ONLY for debugging */
2401
2402 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002403 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00002404 size_t const buflen = 512;
2405 mbedtls_record rec, rec_backup;
2406
2407 mbedtls_ssl_init( &ssl );
2408 mbedtls_ssl_transform_init( &t0 );
2409 mbedtls_ssl_transform_init( &t1 );
2410 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002411 etm, tag_mode, ver,
2412 (size_t) cid0_len,
2413 (size_t) cid1_len ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002414
Hanno Becker3ee54212019-04-04 16:31:26 +01002415 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00002416
2417 while( num_records-- > 0 )
2418 {
2419 mbedtls_ssl_transform *t_dec, *t_enc;
2420 /* Take turns in who's sending and who's receiving. */
2421 if( num_records % 3 == 0 )
2422 {
2423 t_dec = &t0;
2424 t_enc = &t1;
2425 }
2426 else
2427 {
2428 t_dec = &t1;
2429 t_enc = &t0;
2430 }
2431
2432 /*
2433 * The record header affects the transformation in two ways:
2434 * 1) It determines the AEAD additional data
2435 * 2) The record counter sometimes determines the IV.
2436 *
2437 * Apart from that, the fields don't have influence.
2438 * In particular, it is currently not the responsibility
2439 * of ssl_encrypt/decrypt_buf to check if the transform
2440 * version matches the record version, or that the
2441 * type is sensible.
2442 */
2443
2444 memset( rec.ctr, num_records, sizeof( rec.ctr ) );
2445 rec.type = 42;
2446 rec.ver[0] = num_records;
2447 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002448#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002449 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002450#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00002451
2452 rec.buf = buf;
2453 rec.buf_len = buflen;
2454 rec.data_offset = 16;
2455 /* Make sure to vary the length to exercise different
2456 * paddings. */
2457 rec.data_len = 1 + num_records;
2458
2459 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2460
2461 /* Make a copy for later comparison */
2462 rec_backup = rec;
2463
2464 /* Encrypt record */
2465 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec,
2466 rnd_std_rand, NULL );
2467 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2468 if( ret != 0 )
2469 {
2470 continue;
2471 }
2472
2473 /* Decrypt record with t_dec */
Hanno Beckerd856c822019-04-29 17:30:59 +01002474 ret = mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec );
2475 TEST_ASSERT( ret == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002476
2477 /* Compare results */
2478 TEST_ASSERT( rec.type == rec_backup.type );
2479 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2480 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2481 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2482 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2483 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2484 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2485 rec_backup.buf + rec_backup.data_offset,
2486 rec.data_len ) == 0 );
2487 }
2488
Hanno Becker81e16a32019-03-01 11:21:44 +00002489exit:
2490
Hanno Beckera18d1322018-01-03 14:27:32 +00002491 /* Cleanup */
2492 mbedtls_ssl_free( &ssl );
2493 mbedtls_ssl_transform_free( &t0 );
2494 mbedtls_ssl_transform_free( &t1 );
2495
Hanno Becker3ee54212019-04-04 16:31:26 +01002496 mbedtls_free( buf );
Hanno Beckera18d1322018-01-03 14:27:32 +00002497}
2498/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002499
2500/* BEGIN_CASE */
2501void ssl_crypt_record_small( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002502 int etm, int tag_mode, int ver,
2503 int cid0_len, int cid1_len )
Hanno Beckerb3268da2018-01-05 15:20:24 +00002504{
2505 /*
2506 * Test pairs of encryption and decryption with an increasing
2507 * amount of space in the record buffer - in more detail:
2508 * 1) Try to encrypt with 0, 1, 2, ... bytes available
2509 * in front of the plaintext, and expect the encryption
2510 * to succeed starting from some offset. Always keep
2511 * enough space in the end of the buffer.
2512 * 2) Try to encrypt with 0, 1, 2, ... bytes available
2513 * at the end of the plaintext, and expect the encryption
2514 * to succeed starting from some offset. Always keep
2515 * enough space at the beginning of the buffer.
2516 * 3) Try to encrypt with 0, 1, 2, ... bytes available
2517 * both at the front and end of the plaintext,
2518 * and expect the encryption to succeed starting from
2519 * some offset.
2520 *
2521 * If encryption succeeds, check that decryption succeeds
2522 * and yields the original record.
2523 */
2524
2525 mbedtls_ssl_context ssl; /* ONLY for debugging */
2526
2527 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002528 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01002529 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002530 mbedtls_record rec, rec_backup;
2531
2532 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01002533 int mode; /* Mode 1, 2 or 3 as explained above */
2534 size_t offset; /* Available space at beginning/end/both */
2535 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002536
Hanno Beckerd856c822019-04-29 17:30:59 +01002537 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
2538 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002539
2540 int seen_success; /* Indicates if in the current mode we've
2541 * already seen a successful test. */
2542
2543 mbedtls_ssl_init( &ssl );
2544 mbedtls_ssl_transform_init( &t0 );
2545 mbedtls_ssl_transform_init( &t1 );
2546 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002547 etm, tag_mode, ver,
2548 (size_t) cid0_len,
2549 (size_t) cid1_len ) == 0 );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002550
Hanno Becker3ee54212019-04-04 16:31:26 +01002551 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002552
2553 for( mode=1; mode <= 3; mode++ )
2554 {
2555 seen_success = 0;
2556 for( offset=0; offset <= threshold; offset++ )
2557 {
2558 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01002559 t_dec = &t0;
2560 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002561
2562 memset( rec.ctr, offset, sizeof( rec.ctr ) );
2563 rec.type = 42;
2564 rec.ver[0] = offset;
2565 rec.ver[1] = offset;
2566 rec.buf = buf;
2567 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002568#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002569 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002570#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002571
2572 switch( mode )
2573 {
2574 case 1: /* Space in the beginning */
2575 rec.data_offset = offset;
2576 rec.data_len = buflen - offset - default_post_padding;
2577 break;
2578
2579 case 2: /* Space in the end */
2580 rec.data_offset = default_pre_padding;
2581 rec.data_len = buflen - default_pre_padding - offset;
2582 break;
2583
2584 case 3: /* Space in the beginning and end */
2585 rec.data_offset = offset;
2586 rec.data_len = buflen - 2 * offset;
2587 break;
2588
2589 default:
2590 TEST_ASSERT( 0 );
2591 break;
2592 }
2593
2594 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2595
2596 /* Make a copy for later comparison */
2597 rec_backup = rec;
2598
2599 /* Encrypt record */
2600 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec, rnd_std_rand, NULL );
2601
2602 if( ( mode == 1 || mode == 2 ) && seen_success )
2603 {
2604 TEST_ASSERT( ret == 0 );
2605 }
2606 else
2607 {
2608 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2609 if( ret == 0 )
2610 seen_success = 1;
2611 }
2612
2613 if( ret != 0 )
2614 continue;
2615
2616 /* Decrypt record with t_dec */
2617 TEST_ASSERT( mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec ) == 0 );
2618
2619 /* Compare results */
2620 TEST_ASSERT( rec.type == rec_backup.type );
2621 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2622 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2623 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2624 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2625 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2626 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2627 rec_backup.buf + rec_backup.data_offset,
2628 rec.data_len ) == 0 );
2629 }
2630
2631 TEST_ASSERT( seen_success == 1 );
2632 }
2633
Hanno Becker81e16a32019-03-01 11:21:44 +00002634exit:
2635
Hanno Beckerb3268da2018-01-05 15:20:24 +00002636 /* Cleanup */
2637 mbedtls_ssl_free( &ssl );
2638 mbedtls_ssl_transform_free( &t0 );
2639 mbedtls_ssl_transform_free( &t1 );
2640
Hanno Becker3ee54212019-04-04 16:31:26 +01002641 mbedtls_free( buf );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002642}
2643/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03002644
2645/* BEGIN_CASE */
2646void ssl_tls_prf( int type, data_t * secret, data_t * random,
2647 char *label, data_t *result_hex_str, int exp_ret )
2648{
2649 unsigned char *output;
2650
2651 output = mbedtls_calloc( 1, result_hex_str->len );
2652 if( output == NULL )
2653 goto exit;
2654
Ron Eldor6b9b1b82019-05-15 17:04:33 +03002655#if defined(MBEDTLS_USE_PSA_CRYPTO)
2656 TEST_ASSERT( psa_crypto_init() == 0 );
2657#endif
2658
Ron Eldor824ad7b2019-05-13 14:09:00 +03002659 TEST_ASSERT( mbedtls_ssl_tls_prf( type, secret->x, secret->len,
2660 label, random->x, random->len,
2661 output, result_hex_str->len ) == exp_ret );
2662
2663 if( exp_ret == 0 )
2664 {
2665 TEST_ASSERT( hexcmp( output, result_hex_str->x,
2666 result_hex_str->len, result_hex_str->len ) == 0 );
2667 }
2668exit:
2669
2670 mbedtls_free( output );
2671}
2672/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002673
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002674/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002675void ssl_serialize_session_save_load( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002676{
2677 mbedtls_ssl_session original, restored;
2678 unsigned char *buf = NULL;
2679 size_t len;
2680
2681 /*
2682 * Test that a save-load pair is the identity
2683 */
2684
2685 mbedtls_ssl_session_init( &original );
2686 mbedtls_ssl_session_init( &restored );
2687
2688 /* Prepare a dummy session to work on */
2689 TEST_ASSERT( ssl_populate_session( &original, ticket_len, crt_file ) == 0 );
2690
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002691 /* Serialize it */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002692 TEST_ASSERT( mbedtls_ssl_session_save( &original, NULL, 0, &len )
2693 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2694 TEST_ASSERT( ( buf = mbedtls_calloc( 1, len ) ) != NULL );
2695 TEST_ASSERT( mbedtls_ssl_session_save( &original, buf, len, &len )
2696 == 0 );
2697
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002698 /* Restore session from serialized data */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002699 TEST_ASSERT( mbedtls_ssl_session_load( &restored, buf, len) == 0 );
2700
2701 /*
2702 * Make sure both session structures are identical
2703 */
2704#if defined(MBEDTLS_HAVE_TIME)
2705 TEST_ASSERT( original.start == restored.start );
2706#endif
2707 TEST_ASSERT( original.ciphersuite == restored.ciphersuite );
2708 TEST_ASSERT( original.compression == restored.compression );
2709 TEST_ASSERT( original.id_len == restored.id_len );
2710 TEST_ASSERT( memcmp( original.id,
2711 restored.id, sizeof( original.id ) ) == 0 );
2712 TEST_ASSERT( memcmp( original.master,
2713 restored.master, sizeof( original.master ) ) == 0 );
2714
2715#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002716#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002717 TEST_ASSERT( ( original.peer_cert == NULL ) ==
2718 ( restored.peer_cert == NULL ) );
2719 if( original.peer_cert != NULL )
2720 {
2721 TEST_ASSERT( original.peer_cert->raw.len ==
2722 restored.peer_cert->raw.len );
2723 TEST_ASSERT( memcmp( original.peer_cert->raw.p,
2724 restored.peer_cert->raw.p,
2725 original.peer_cert->raw.len ) == 0 );
2726 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002727#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2728 TEST_ASSERT( original.peer_cert_digest_type ==
2729 restored.peer_cert_digest_type );
2730 TEST_ASSERT( original.peer_cert_digest_len ==
2731 restored.peer_cert_digest_len );
2732 TEST_ASSERT( ( original.peer_cert_digest == NULL ) ==
2733 ( restored.peer_cert_digest == NULL ) );
2734 if( original.peer_cert_digest != NULL )
2735 {
2736 TEST_ASSERT( memcmp( original.peer_cert_digest,
2737 restored.peer_cert_digest,
2738 original.peer_cert_digest_len ) == 0 );
2739 }
2740#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2741#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002742 TEST_ASSERT( original.verify_result == restored.verify_result );
2743
2744#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
2745 TEST_ASSERT( original.ticket_len == restored.ticket_len );
2746 if( original.ticket_len != 0 )
2747 {
2748 TEST_ASSERT( original.ticket != NULL );
2749 TEST_ASSERT( restored.ticket != NULL );
2750 TEST_ASSERT( memcmp( original.ticket,
2751 restored.ticket, original.ticket_len ) == 0 );
2752 }
2753 TEST_ASSERT( original.ticket_lifetime == restored.ticket_lifetime );
2754#endif
2755
2756#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2757 TEST_ASSERT( original.mfl_code == restored.mfl_code );
2758#endif
2759
2760#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2761 TEST_ASSERT( original.trunc_hmac == restored.trunc_hmac );
2762#endif
2763
2764#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2765 TEST_ASSERT( original.encrypt_then_mac == restored.encrypt_then_mac );
2766#endif
2767
2768exit:
2769 mbedtls_ssl_session_free( &original );
2770 mbedtls_ssl_session_free( &restored );
2771 mbedtls_free( buf );
2772}
2773/* END_CASE */
2774
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02002775/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002776void ssl_serialize_session_load_save( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002777{
2778 mbedtls_ssl_session session;
2779 unsigned char *buf1 = NULL, *buf2 = NULL;
2780 size_t len0, len1, len2;
2781
2782 /*
2783 * Test that a load-save pair is the identity
2784 */
2785
2786 mbedtls_ssl_session_init( &session );
2787
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002788 /* Prepare a dummy session to work on */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002789 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002790
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002791 /* Get desired buffer size for serializing */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002792 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &len0 )
2793 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2794
2795 /* Allocate first buffer */
2796 buf1 = mbedtls_calloc( 1, len0 );
2797 TEST_ASSERT( buf1 != NULL );
2798
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002799 /* Serialize to buffer and free live session */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002800 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf1, len0, &len1 )
2801 == 0 );
2802 TEST_ASSERT( len0 == len1 );
2803 mbedtls_ssl_session_free( &session );
2804
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002805 /* Restore session from serialized data */
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02002806 TEST_ASSERT( mbedtls_ssl_session_load( &session, buf1, len1 ) == 0 );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002807
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002808 /* Allocate second buffer and serialize to it */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002809 buf2 = mbedtls_calloc( 1, len0 );
Manuel Pégourié-Gonnardb4079902019-05-24 09:52:10 +02002810 TEST_ASSERT( buf2 != NULL );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002811 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf2, len0, &len2 )
2812 == 0 );
2813
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002814 /* Make sure both serialized versions are identical */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002815 TEST_ASSERT( len1 == len2 );
2816 TEST_ASSERT( memcmp( buf1, buf2, len1 ) == 0 );
2817
2818exit:
2819 mbedtls_ssl_session_free( &session );
2820 mbedtls_free( buf1 );
2821 mbedtls_free( buf2 );
2822}
2823/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002824
2825/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002826void ssl_serialize_session_save_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002827{
2828 mbedtls_ssl_session session;
2829 unsigned char *buf = NULL;
2830 size_t good_len, bad_len, test_len;
2831
2832 /*
2833 * Test that session_save() fails cleanly on small buffers
2834 */
2835
2836 mbedtls_ssl_session_init( &session );
2837
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002838 /* Prepare dummy session and get serialized size */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002839 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002840 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
2841 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2842
2843 /* Try all possible bad lengths */
2844 for( bad_len = 1; bad_len < good_len; bad_len++ )
2845 {
2846 /* Allocate exact size so that asan/valgrind can detect any overwrite */
2847 mbedtls_free( buf );
2848 TEST_ASSERT( ( buf = mbedtls_calloc( 1, bad_len ) ) != NULL );
2849 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf, bad_len,
2850 &test_len )
2851 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2852 TEST_ASSERT( test_len == good_len );
2853 }
2854
2855exit:
2856 mbedtls_ssl_session_free( &session );
2857 mbedtls_free( buf );
2858}
2859/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002860
2861/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002862void ssl_serialize_session_load_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002863{
2864 mbedtls_ssl_session session;
2865 unsigned char *good_buf = NULL, *bad_buf = NULL;
2866 size_t good_len, bad_len;
2867
2868 /*
2869 * Test that session_load() fails cleanly on small buffers
2870 */
2871
2872 mbedtls_ssl_session_init( &session );
2873
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002874 /* Prepare serialized session data */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002875 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002876 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
2877 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2878 TEST_ASSERT( ( good_buf = mbedtls_calloc( 1, good_len ) ) != NULL );
2879 TEST_ASSERT( mbedtls_ssl_session_save( &session, good_buf, good_len,
2880 &good_len ) == 0 );
2881 mbedtls_ssl_session_free( &session );
2882
2883 /* Try all possible bad lengths */
2884 for( bad_len = 0; bad_len < good_len; bad_len++ )
2885 {
2886 /* Allocate exact size so that asan/valgrind can detect any overread */
2887 mbedtls_free( bad_buf );
2888 bad_buf = mbedtls_calloc( 1, bad_len ? bad_len : 1 );
2889 TEST_ASSERT( bad_buf != NULL );
2890 memcpy( bad_buf, good_buf, bad_len );
2891
2892 TEST_ASSERT( mbedtls_ssl_session_load( &session, bad_buf, bad_len )
2893 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2894 }
2895
2896exit:
2897 mbedtls_ssl_session_free( &session );
2898 mbedtls_free( good_buf );
2899 mbedtls_free( bad_buf );
2900}
2901/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002902
Hanno Becker363b6462019-05-29 12:44:28 +01002903/* BEGIN_CASE */
2904void ssl_session_serialize_version_check( int corrupt_major,
Hanno Becker861d0bb2019-05-21 16:39:30 +01002905 int corrupt_minor,
2906 int corrupt_patch,
2907 int corrupt_config )
2908{
Hanno Becker363b6462019-05-29 12:44:28 +01002909 unsigned char serialized_session[ 2048 ];
2910 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002911 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002912 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002913 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2914 corrupt_minor == 1,
2915 corrupt_patch == 1,
2916 corrupt_config == 1,
2917 corrupt_config == 1 };
2918
Hanno Becker861d0bb2019-05-21 16:39:30 +01002919 mbedtls_ssl_session_init( &session );
2920
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002921 /* Infer length of serialized session. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002922 TEST_ASSERT( mbedtls_ssl_session_save( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01002923 serialized_session,
2924 sizeof( serialized_session ),
2925 &serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002926
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002927 mbedtls_ssl_session_free( &session );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002928
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002929 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002930 * de-serialize the session - double-check that. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002931 TEST_ASSERT( mbedtls_ssl_session_load( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01002932 serialized_session,
2933 serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002934 mbedtls_ssl_session_free( &session );
2935
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002936 /* Go through the bytes in the serialized session header and
2937 * corrupt them bit-by-bit. */
2938 for( cur_byte = 0; cur_byte < sizeof( should_corrupt_byte ); cur_byte++ )
Hanno Becker861d0bb2019-05-21 16:39:30 +01002939 {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002940 int cur_bit;
2941 unsigned char * const byte = &serialized_session[ cur_byte ];
2942
2943 if( should_corrupt_byte[ cur_byte ] == 0 )
2944 continue;
2945
2946 for( cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++ )
2947 {
2948 unsigned char const corrupted_bit = 0x1u << cur_bit;
2949 /* Modify a single bit in the serialized session. */
2950 *byte ^= corrupted_bit;
2951
2952 /* Attempt to deserialize */
2953 TEST_ASSERT( mbedtls_ssl_session_load( &session,
2954 serialized_session,
2955 serialized_session_len ) ==
Hanno Beckerf9b33032019-06-03 12:58:39 +01002956 MBEDTLS_ERR_SSL_VERSION_MISMATCH );
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002957
2958 /* Undo the change */
2959 *byte ^= corrupted_bit;
2960 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002961 }
2962
Hanno Becker861d0bb2019-05-21 16:39:30 +01002963}
2964/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002965
Andrzej Kurekb2980742020-02-02 19:25:26 -05002966/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002967void mbedtls_endpoint_sanity( int endpoint_type )
2968{
2969 enum { BUFFSIZE = 1024 };
2970 mbedtls_endpoint ep;
2971 int ret = -1;
2972
Andrzej Kurekb2980742020-02-02 19:25:26 -05002973 ret = mbedtls_endpoint_init( NULL, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002974 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
2975
Andrzej Kurekb2980742020-02-02 19:25:26 -05002976 ret = mbedtls_endpoint_certificate_init( NULL, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002977 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
2978
Andrzej Kurekb2980742020-02-02 19:25:26 -05002979 ret = mbedtls_endpoint_init( &ep, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002980 TEST_ASSERT( ret == 0 );
2981
2982exit:
2983 mbedtls_endpoint_free( &ep );
2984}
2985/* END_CASE */
2986
Andrzej Kurekb2980742020-02-02 19:25:26 -05002987/* 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 +01002988void move_handshake_to_state(int endpoint_type, int state, int need_pass)
2989{
2990 enum { BUFFSIZE = 1024 };
2991 mbedtls_endpoint base_ep, second_ep;
2992 int ret = -1;
2993
Andrzej Kurekb2980742020-02-02 19:25:26 -05002994 ret = mbedtls_endpoint_init( &base_ep, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002995 TEST_ASSERT( ret == 0 );
2996
2997 ret = mbedtls_endpoint_init( &second_ep,
2998 ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ?
Andrzej Kurekb2980742020-02-02 19:25:26 -05002999 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
3000 MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003001 TEST_ASSERT( ret == 0 );
3002
3003 ret = mbedtls_mock_socket_connect( &(base_ep.socket),
3004 &(second_ep.socket),
3005 BUFFSIZE );
3006 TEST_ASSERT( ret == 0 );
3007
3008 ret = mbedtls_move_handshake_to_state( &(base_ep.ssl),
3009 &(second_ep.ssl),
3010 state );
3011 if( need_pass )
3012 {
3013 TEST_ASSERT( ret == 0 );
3014 TEST_ASSERT( base_ep.ssl.state == state );
3015 }
3016 else
3017 {
3018 TEST_ASSERT( ret != 0 );
3019 TEST_ASSERT( base_ep.ssl.state != state );
3020 }
3021
3022exit:
3023 mbedtls_endpoint_free( &base_ep );
3024 mbedtls_endpoint_free( &second_ep );
3025}
3026/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003027
3028/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15 */
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003029void handshake( const char *cipher, int version, int pk_alg,
3030 data_t *psk_str )
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003031{
3032 /* forced_ciphersuite needs to last until the end of the handshake */
3033 int forced_ciphersuite[2];
3034 enum { BUFFSIZE = 1024 };
3035 mbedtls_endpoint client, server;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003036#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3037 const char *psk_identity = "foo";
3038#else
3039 (void) psk_str;
3040#endif
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003041 /* Client side */
3042 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
3043 pk_alg ) == 0 );
3044
3045 mbedtls_ssl_conf_min_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3046 version );
3047 mbedtls_ssl_conf_max_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3048 version );
3049
3050 if( strlen( cipher ) > 0 )
3051 {
3052 set_ciphersuite( &client.conf, cipher, forced_ciphersuite );
3053 }
3054 /* Server side */
3055 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
3056 pk_alg ) == 0 );
3057
3058 mbedtls_ssl_conf_min_version( &server.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3059 version );
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003060#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3061 if( psk_str->len > 0 )
3062 {
3063 TEST_ASSERT( mbedtls_ssl_conf_psk( &client.conf, psk_str->x,
3064 psk_str->len,
3065 (const unsigned char *) psk_identity,
3066 strlen( psk_identity ) ) == 0 );
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003067
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05003068 TEST_ASSERT( mbedtls_ssl_conf_psk( &server.conf, psk_str->x,
3069 psk_str->len,
3070 (const unsigned char *) psk_identity,
3071 strlen( psk_identity ) ) == 0 );
3072
3073 mbedtls_ssl_conf_psk_cb( &server.conf, psk_dummy_callback, NULL );
3074 }
3075#endif
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003076 TEST_ASSERT( mbedtls_mock_socket_connect( &(client.socket),
3077 &(server.socket),
3078 BUFFSIZE ) == 0 );
3079
3080 TEST_ASSERT( mbedtls_move_handshake_to_state( &(client.ssl),
3081 &(server.ssl),
3082 MBEDTLS_SSL_HANDSHAKE_OVER )
3083 == 0 );
3084 TEST_ASSERT( client.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3085 TEST_ASSERT( server.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3086
3087exit:
3088 mbedtls_endpoint_free( &client );
3089 mbedtls_endpoint_free( &server );
3090}
3091/* END_CASE */