blob: 9cb632dbc9a026e223469f54a34311a5cb1c15bc [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
Hanno Beckerd856c822019-04-29 17:30:59 +0100940#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
941#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
942#else
943#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
944#endif
Hanno Beckera18d1322018-01-03 14:27:32 +0000945
946static int build_transforms( mbedtls_ssl_transform *t_in,
947 mbedtls_ssl_transform *t_out,
948 int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +0100949 int etm, int tag_mode, int ver,
950 size_t cid0_len,
951 size_t cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +0000952{
953 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +0100954 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +0000955
956 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +0000957 unsigned char *key0 = NULL, *key1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +0000958 unsigned char iv_enc[16], iv_dec[16];
959
Hanno Beckera0e20d02019-05-15 14:03:01 +0100960#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +0100961 unsigned char cid0[ SSL_CID_LEN_MIN ];
962 unsigned char cid1[ SSL_CID_LEN_MIN ];
963
964 rnd_std_rand( NULL, cid0, sizeof( cid0 ) );
965 rnd_std_rand( NULL, cid1, sizeof( cid1 ) );
Hanno Becker43c24b82019-05-01 09:45:57 +0100966#else
967 ((void) cid0_len);
968 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +0100969#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +0100970
Hanno Beckera18d1322018-01-03 14:27:32 +0000971 maclen = 0;
972
973 /* Pick cipher */
974 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
975 CHK( cipher_info != NULL );
976 CHK( cipher_info->iv_size <= 16 );
977 CHK( cipher_info->key_bitlen % 8 == 0 );
978
979 /* Pick keys */
980 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +0100981 /* Allocate `keylen + 1` bytes to ensure that we get
982 * a non-NULL pointers from `mbedtls_calloc` even if
983 * `keylen == 0` in the case of the NULL cipher. */
984 CHK( ( key0 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
985 CHK( ( key1 = mbedtls_calloc( 1, keylen + 1 ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +0000986 memset( key0, 0x1, keylen );
987 memset( key1, 0x2, keylen );
988
989 /* Setup cipher contexts */
990 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_enc, cipher_info ) == 0 );
991 CHK( mbedtls_cipher_setup( &t_in->cipher_ctx_dec, cipher_info ) == 0 );
992 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_enc, cipher_info ) == 0 );
993 CHK( mbedtls_cipher_setup( &t_out->cipher_ctx_dec, cipher_info ) == 0 );
994
995#if defined(MBEDTLS_CIPHER_MODE_CBC)
996 if( cipher_info->mode == MBEDTLS_MODE_CBC )
997 {
998 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_enc,
999 MBEDTLS_PADDING_NONE ) == 0 );
1000 CHK( mbedtls_cipher_set_padding_mode( &t_in->cipher_ctx_dec,
1001 MBEDTLS_PADDING_NONE ) == 0 );
1002 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_enc,
1003 MBEDTLS_PADDING_NONE ) == 0 );
1004 CHK( mbedtls_cipher_set_padding_mode( &t_out->cipher_ctx_dec,
1005 MBEDTLS_PADDING_NONE ) == 0 );
1006 }
1007#endif /* MBEDTLS_CIPHER_MODE_CBC */
1008
1009 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_enc, key0,
1010 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1011 CHK( mbedtls_cipher_setkey( &t_in->cipher_ctx_dec, key1,
1012 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
1013 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_enc, key1,
1014 keylen << 3, MBEDTLS_ENCRYPT ) == 0 );
1015 CHK( mbedtls_cipher_setkey( &t_out->cipher_ctx_dec, key0,
1016 keylen << 3, MBEDTLS_DECRYPT ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001017
1018 /* Setup MAC contexts */
1019#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1020 if( cipher_info->mode == MBEDTLS_MODE_CBC ||
1021 cipher_info->mode == MBEDTLS_MODE_STREAM )
1022 {
1023 mbedtls_md_info_t const *md_info;
1024 unsigned char *md0, *md1;
1025
1026 /* Pick hash */
1027 md_info = mbedtls_md_info_from_type( hash_id );
1028 CHK( md_info != NULL );
1029
1030 /* Pick hash keys */
1031 maclen = mbedtls_md_get_size( md_info );
Hanno Becker3ee54212019-04-04 16:31:26 +01001032 CHK( ( md0 = mbedtls_calloc( 1, maclen ) ) != NULL );
1033 CHK( ( md1 = mbedtls_calloc( 1, maclen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00001034 memset( md0, 0x5, maclen );
1035 memset( md1, 0x6, maclen );
1036
1037 CHK( mbedtls_md_setup( &t_out->md_ctx_enc, md_info, 1 ) == 0 );
1038 CHK( mbedtls_md_setup( &t_out->md_ctx_dec, md_info, 1 ) == 0 );
1039 CHK( mbedtls_md_setup( &t_in->md_ctx_enc, md_info, 1 ) == 0 );
1040 CHK( mbedtls_md_setup( &t_in->md_ctx_dec, md_info, 1 ) == 0 );
1041
1042 if( ver > MBEDTLS_SSL_MINOR_VERSION_0 )
1043 {
1044 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_enc,
1045 md0, maclen ) == 0 );
1046 CHK( mbedtls_md_hmac_starts( &t_in->md_ctx_dec,
1047 md1, maclen ) == 0 );
1048 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_enc,
1049 md1, maclen ) == 0 );
1050 CHK( mbedtls_md_hmac_starts( &t_out->md_ctx_dec,
1051 md0, maclen ) == 0 );
1052 }
1053#if defined(MBEDTLS_SSL_PROTO_SSL3)
1054 else
1055 {
1056 memcpy( &t_in->mac_enc, md0, maclen );
1057 memcpy( &t_in->mac_dec, md1, maclen );
1058 memcpy( &t_out->mac_enc, md1, maclen );
1059 memcpy( &t_out->mac_dec, md0, maclen );
1060 }
1061#endif
1062
Hanno Becker3ee54212019-04-04 16:31:26 +01001063 mbedtls_free( md0 );
1064 mbedtls_free( md1 );
Hanno Beckera18d1322018-01-03 14:27:32 +00001065 }
1066#else
1067 ((void) hash_id);
1068#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1069
1070
1071 /* Pick IV's (regardless of whether they
1072 * are being used by the transform). */
1073 ivlen = cipher_info->iv_size;
1074 memset( iv_enc, 0x3, sizeof( iv_enc ) );
1075 memset( iv_dec, 0x4, sizeof( iv_dec ) );
1076
1077 /*
1078 * Setup transforms
1079 */
1080
Jaeden Amero2de07f12019-06-05 13:32:08 +01001081#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1082 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001083 t_out->encrypt_then_mac = etm;
1084 t_in->encrypt_then_mac = etm;
1085#else
1086 ((void) etm);
1087#endif
1088
1089 t_out->minor_ver = ver;
1090 t_in->minor_ver = ver;
1091 t_out->ivlen = ivlen;
1092 t_in->ivlen = ivlen;
1093
1094 switch( cipher_info->mode )
1095 {
1096 case MBEDTLS_MODE_GCM:
1097 case MBEDTLS_MODE_CCM:
1098 t_out->fixed_ivlen = 4;
1099 t_in->fixed_ivlen = 4;
1100 t_out->maclen = 0;
1101 t_in->maclen = 0;
1102 switch( tag_mode )
1103 {
1104 case 0: /* Full tag */
1105 t_out->taglen = 16;
1106 t_in->taglen = 16;
1107 break;
1108 case 1: /* Partial tag */
1109 t_out->taglen = 8;
1110 t_in->taglen = 8;
1111 break;
1112 default:
1113 return( 1 );
1114 }
1115 break;
1116
1117 case MBEDTLS_MODE_CHACHAPOLY:
1118 t_out->fixed_ivlen = 12;
1119 t_in->fixed_ivlen = 12;
1120 t_out->maclen = 0;
1121 t_in->maclen = 0;
1122 switch( tag_mode )
1123 {
1124 case 0: /* Full tag */
1125 t_out->taglen = 16;
1126 t_in->taglen = 16;
1127 break;
1128 case 1: /* Partial tag */
1129 t_out->taglen = 8;
1130 t_in->taglen = 8;
1131 break;
1132 default:
1133 return( 1 );
1134 }
1135 break;
1136
1137 case MBEDTLS_MODE_STREAM:
1138 case MBEDTLS_MODE_CBC:
1139 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1140 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1141 t_out->taglen = 0;
1142 t_in->taglen = 0;
1143 switch( tag_mode )
1144 {
1145 case 0: /* Full tag */
1146 t_out->maclen = maclen;
1147 t_in->maclen = maclen;
1148 break;
1149 case 1: /* Partial tag */
1150 t_out->maclen = 10;
1151 t_in->maclen = 10;
1152 break;
1153 default:
1154 return( 1 );
1155 }
1156 break;
1157 default:
1158 return( 1 );
1159 break;
1160 }
1161
1162 /* Setup IV's */
1163
1164 memcpy( &t_in->iv_dec, iv_dec, sizeof( iv_dec ) );
1165 memcpy( &t_in->iv_enc, iv_enc, sizeof( iv_enc ) );
1166 memcpy( &t_out->iv_dec, iv_enc, sizeof( iv_enc ) );
1167 memcpy( &t_out->iv_enc, iv_dec, sizeof( iv_dec ) );
1168
Hanno Beckera0e20d02019-05-15 14:03:01 +01001169#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001170 /* Add CID */
1171 memcpy( &t_in->in_cid, cid0, cid0_len );
1172 memcpy( &t_in->out_cid, cid1, cid1_len );
1173 t_in->in_cid_len = cid0_len;
1174 t_in->out_cid_len = cid1_len;
1175 memcpy( &t_out->in_cid, cid1, cid1_len );
1176 memcpy( &t_out->out_cid, cid0, cid0_len );
1177 t_out->in_cid_len = cid1_len;
1178 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001179#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001180
Hanno Becker81e16a32019-03-01 11:21:44 +00001181cleanup:
1182
Hanno Becker3ee54212019-04-04 16:31:26 +01001183 mbedtls_free( key0 );
1184 mbedtls_free( key1 );
Hanno Becker81e16a32019-03-01 11:21:44 +00001185
Hanno Beckera5780f12019-04-05 09:55:37 +01001186 return( ret );
Hanno Beckera18d1322018-01-03 14:27:32 +00001187}
1188
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001189/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001190 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001191 * Choose dummy values, mostly non-0 to distinguish from the init default.
1192 */
1193static int ssl_populate_session( mbedtls_ssl_session *session,
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001194 int ticket_len,
1195 const char *crt_file )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001196{
1197#if defined(MBEDTLS_HAVE_TIME)
1198 session->start = mbedtls_time( NULL ) - 42;
1199#endif
1200 session->ciphersuite = 0xabcd;
1201 session->compression = 1;
1202 session->id_len = sizeof( session->id );
1203 memset( session->id, 66, session->id_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001204 memset( session->master, 17, sizeof( session->master ) );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001205
Manuel Pégourié-Gonnard1f6033a2019-05-24 10:17:52 +02001206#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001207 if( strlen( crt_file ) != 0 )
1208 {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001209 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001210 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001211
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001212 mbedtls_x509_crt_init( &tmp_crt );
1213 ret = mbedtls_x509_crt_parse_file( &tmp_crt, crt_file );
1214 if( ret != 0 )
1215 return( ret );
1216
1217#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1218 /* Move temporary CRT. */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001219 session->peer_cert = mbedtls_calloc( 1, sizeof( *session->peer_cert ) );
1220 if( session->peer_cert == NULL )
1221 return( -1 );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001222 *session->peer_cert = tmp_crt;
1223 memset( &tmp_crt, 0, sizeof( tmp_crt ) );
1224#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1225 /* Calculate digest of temporary CRT. */
1226 session->peer_cert_digest =
1227 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
1228 if( session->peer_cert_digest == NULL )
1229 return( -1 );
1230 ret = mbedtls_md( mbedtls_md_info_from_type(
1231 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
1232 tmp_crt.raw.p, tmp_crt.raw.len,
1233 session->peer_cert_digest );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001234 if( ret != 0 )
1235 return( ret );
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001236 session->peer_cert_digest_type =
1237 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1238 session->peer_cert_digest_len =
1239 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1240#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1241
1242 mbedtls_x509_crt_free( &tmp_crt );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001243 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001244#else /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001245 (void) crt_file;
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001246#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001247 session->verify_result = 0xdeadbeef;
1248
1249#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
1250 if( ticket_len != 0 )
1251 {
1252 session->ticket = mbedtls_calloc( 1, ticket_len );
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02001253 if( session->ticket == NULL )
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001254 return( -1 );
1255 memset( session->ticket, 33, ticket_len );
1256 }
1257 session->ticket_len = ticket_len;
1258 session->ticket_lifetime = 86401;
1259#else
1260 (void) ticket_len;
1261#endif
1262
1263#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1264 session->mfl_code = 1;
1265#endif
1266#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1267 session->trunc_hmac = 1;
1268#endif
1269#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1270 session->encrypt_then_mac = 1;
1271#endif
1272
1273 return( 0 );
1274}
1275
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001276/* END_HEADER */
1277
1278/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001279 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001280 * END_DEPENDENCIES
1281 */
1282
Janos Follath6264e662019-11-26 11:11:15 +00001283/* BEGIN_CASE */
1284void test_callback_buffer_sanity()
1285{
1286 enum { MSGLEN = 10 };
1287 mbedtls_test_buffer buf;
1288 unsigned char input[MSGLEN];
1289 unsigned char output[MSGLEN];
1290
1291 memset( input, 0, sizeof(input) );
1292
1293 /* Make sure calling put and get on NULL buffer results in error. */
1294 TEST_ASSERT( mbedtls_test_buffer_put( NULL, input, sizeof( input ) )
1295 == -1 );
1296 TEST_ASSERT( mbedtls_test_buffer_get( NULL, output, sizeof( output ) )
1297 == -1 );
1298 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001299
Janos Follath6264e662019-11-26 11:11:15 +00001300 TEST_ASSERT( mbedtls_test_buffer_put( NULL, NULL, 0 ) == -1 );
1301 TEST_ASSERT( mbedtls_test_buffer_get( NULL, NULL, 0 ) == -1 );
1302
1303 /* Make sure calling put and get on a buffer that hasn't been set up results
1304 * in eror. */
1305 mbedtls_test_buffer_init( &buf );
1306
1307 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) ) == -1 );
1308 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, sizeof( output ) )
1309 == -1 );
1310 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
Andrzej Kurekf7774142020-01-22 06:34:59 -05001311
Janos Follath6264e662019-11-26 11:11:15 +00001312 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == -1 );
1313 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == -1 );
1314
Andrzej Kurekf7774142020-01-22 06:34:59 -05001315 /* Make sure calling put and get on NULL input only results in
1316 * error if the length is not zero, and that a NULL output is valid for data
1317 * dropping.
1318 */
Janos Follath6264e662019-11-26 11:11:15 +00001319
1320 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, sizeof( input ) ) == 0 );
1321
1322 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, sizeof( input ) ) == -1 );
1323 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, sizeof( output ) )
Andrzej Kurekf7774142020-01-22 06:34:59 -05001324 == 0 );
Janos Follath6264e662019-11-26 11:11:15 +00001325 TEST_ASSERT( mbedtls_test_buffer_put( &buf, NULL, 0 ) == 0 );
1326 TEST_ASSERT( mbedtls_test_buffer_get( &buf, NULL, 0 ) == 0 );
1327
Piotr Nowickifb437d72020-01-13 16:59:12 +01001328 /* Make sure calling put several times in the row is safe */
1329
1330 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, sizeof( input ) )
1331 == sizeof( input ) );
1332 TEST_ASSERT( mbedtls_test_buffer_get( &buf, output, 2 ) == 2 );
1333 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 1 ) == 1 );
1334 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 1 );
1335 TEST_ASSERT( mbedtls_test_buffer_put( &buf, input, 2 ) == 0 );
1336
1337
Janos Follath6264e662019-11-26 11:11:15 +00001338exit:
1339
1340 mbedtls_test_buffer_free( &buf );
1341}
1342/* END_CASE */
1343
1344/*
1345 * Test if the implementation of `mbedtls_test_buffer` related functions is
1346 * correct and works as expected.
1347 *
1348 * That is
1349 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
1350 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1351 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
1352 * bytes.
1353 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1354 * - All of the bytes we got match the bytes we put in in a FIFO manner.
1355 */
1356
1357/* BEGIN_CASE */
1358void test_callback_buffer( int size, int put1, int put1_ret,
1359 int get1, int get1_ret, int put2, int put2_ret,
1360 int get2, int get2_ret )
1361{
1362 enum { ROUNDS = 2 };
1363 size_t put[ROUNDS];
1364 int put_ret[ROUNDS];
1365 size_t get[ROUNDS];
1366 int get_ret[ROUNDS];
1367 mbedtls_test_buffer buf;
1368 unsigned char* input = NULL;
1369 size_t input_len;
1370 unsigned char* output = NULL;
1371 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00001372 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00001373
1374 mbedtls_test_buffer_init( &buf );
1375 TEST_ASSERT( mbedtls_test_buffer_setup( &buf, size ) == 0 );
1376
1377 /* Check the sanity of input parameters and initialise local variables. That
1378 * is, ensure that the amount of data is not negative and that we are not
1379 * expecting more to put or get than we actually asked for. */
1380 TEST_ASSERT( put1 >= 0 );
1381 put[0] = put1;
1382 put_ret[0] = put1_ret;
1383 TEST_ASSERT( put1_ret <= put1 );
1384 TEST_ASSERT( put2 >= 0 );
1385 put[1] = put2;
1386 put_ret[1] = put2_ret;
1387 TEST_ASSERT( put2_ret <= put2 );
1388
1389 TEST_ASSERT( get1 >= 0 );
1390 get[0] = get1;
1391 get_ret[0] = get1_ret;
1392 TEST_ASSERT( get1_ret <= get1 );
1393 TEST_ASSERT( get2 >= 0 );
1394 get[1] = get2;
1395 get_ret[1] = get2_ret;
1396 TEST_ASSERT( get2_ret <= get2 );
1397
1398 input_len = 0;
1399 /* Calculate actual input and output lengths */
1400 for( j = 0; j < ROUNDS; j++ )
1401 {
1402 if( put_ret[j] > 0 )
1403 {
1404 input_len += put_ret[j];
1405 }
1406 }
1407 /* In order to always have a valid pointer we always allocate at least 1
1408 * byte. */
1409 if( input_len == 0 )
1410 input_len = 1;
1411 ASSERT_ALLOC( input, input_len );
1412
1413 output_len = 0;
1414 for( j = 0; j < ROUNDS; j++ )
1415 {
1416 if( get_ret[j] > 0 )
1417 {
1418 output_len += get_ret[j];
1419 }
1420 }
1421 TEST_ASSERT( output_len <= input_len );
1422 /* In order to always have a valid pointer we always allocate at least 1
1423 * byte. */
1424 if( output_len == 0 )
1425 output_len = 1;
1426 ASSERT_ALLOC( output, output_len );
1427
1428 /* Fill up the buffer with structured data so that unwanted changes
1429 * can be detected */
1430 for( i = 0; i < input_len; i++ )
1431 {
1432 input[i] = i & 0xFF;
1433 }
1434
1435 written = read = 0;
1436 for( j = 0; j < ROUNDS; j++ )
1437 {
1438 TEST_ASSERT( put_ret[j] == mbedtls_test_buffer_put( &buf,
1439 input + written, put[j] ) );
1440 written += put_ret[j];
1441 TEST_ASSERT( get_ret[j] == mbedtls_test_buffer_get( &buf,
1442 output + read, get[j] ) );
1443 read += get_ret[j];
1444 TEST_ASSERT( read <= written );
1445 if( get_ret[j] > 0 )
1446 {
1447 TEST_ASSERT( memcmp( output + read - get_ret[j],
1448 input + read - get_ret[j], get_ret[j] )
1449 == 0 );
1450 }
1451 }
1452
1453exit:
1454
1455 mbedtls_free( input );
1456 mbedtls_free( output );
1457 mbedtls_test_buffer_free( &buf );
1458}
1459/* END_CASE */
1460
Janos Follath031827f2019-11-27 11:12:14 +00001461/*
Janos Follathc673c2c2019-12-02 15:47:26 +00001462 * Test if the implementation of `mbedtls_mock_socket` related I/O functions is
1463 * correct and works as expected on unconnected sockets.
1464 */
1465
1466/* BEGIN_CASE */
1467void ssl_mock_sanity( )
1468{
1469 enum { MSGLEN = 105 };
1470 unsigned char message[MSGLEN];
1471 unsigned char received[MSGLEN];
1472 mbedtls_mock_socket socket;
1473
1474 mbedtls_mock_socket_init( &socket );
1475 TEST_ASSERT( mbedtls_mock_tcp_send_b( &socket, message, MSGLEN ) < 0 );
1476 mbedtls_mock_socket_close( &socket );
1477 mbedtls_mock_socket_init( &socket );
1478 TEST_ASSERT( mbedtls_mock_tcp_recv_b( &socket, received, MSGLEN ) < 0 );
1479 mbedtls_mock_socket_close( &socket );
1480
1481 mbedtls_mock_socket_init( &socket );
1482 TEST_ASSERT( mbedtls_mock_tcp_send_nb( &socket, message, MSGLEN ) < 0 );
1483 mbedtls_mock_socket_close( &socket );
1484 mbedtls_mock_socket_init( &socket );
1485 TEST_ASSERT( mbedtls_mock_tcp_recv_nb( &socket, received, MSGLEN ) < 0 );
1486 mbedtls_mock_socket_close( &socket );
1487
1488exit:
1489
1490 mbedtls_mock_socket_close( &socket );
1491}
1492/* END_CASE */
1493
1494/*
1495 * Test if the implementation of `mbedtls_mock_socket` related functions can
1496 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00001497 */
1498
1499/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001500void ssl_mock_tcp( int blocking )
Janos Follath031827f2019-11-27 11:12:14 +00001501{
Janos Follathc673c2c2019-12-02 15:47:26 +00001502 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001503 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00001504 unsigned char message[MSGLEN];
1505 unsigned char received[MSGLEN];
1506 mbedtls_mock_socket client;
1507 mbedtls_mock_socket server;
1508 size_t written, read;
1509 int send_ret, recv_ret;
1510 mbedtls_ssl_send_t *send;
1511 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00001512 unsigned i;
1513
1514 if( blocking == 0 )
1515 {
1516 send = mbedtls_mock_tcp_send_nb;
1517 recv = mbedtls_mock_tcp_recv_nb;
1518 }
1519 else
1520 {
1521 send = mbedtls_mock_tcp_send_b;
1522 recv = mbedtls_mock_tcp_recv_b;
1523 }
1524
1525 mbedtls_mock_socket_init( &client );
1526 mbedtls_mock_socket_init( &server );
1527
1528 /* Fill up the buffer with structured data so that unwanted changes
1529 * can be detected */
1530 for( i = 0; i < MSGLEN; i++ )
1531 {
1532 message[i] = i & 0xFF;
1533 }
1534
1535 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001536 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follathc673c2c2019-12-02 15:47:26 +00001537
1538 /* Send the message to the server */
1539 send_ret = recv_ret = 1;
1540 written = read = 0;
1541 while( send_ret != 0 || recv_ret != 0 )
1542 {
1543 send_ret = send( &client, message + written, MSGLEN - written );
1544
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001545 TEST_ASSERT( send_ret >= 0 );
1546 TEST_ASSERT( send_ret <= BUFLEN );
1547 written += send_ret;
1548
1549 /* If the buffer is full we can test blocking and non-blocking send */
1550 if ( send_ret == BUFLEN )
Janos Follathc673c2c2019-12-02 15:47:26 +00001551 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001552 int blocking_ret = send( &client, message , 1 );
1553 if ( blocking )
1554 {
1555 TEST_ASSERT( blocking_ret == 0 );
1556 }
1557 else
1558 {
1559 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1560 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001561 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001562
1563 recv_ret = recv( &server, received + read, MSGLEN - read );
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001564
1565 /* The result depends on whether any data was sent */
1566 if ( send_ret > 0 )
Janos Follathc673c2c2019-12-02 15:47:26 +00001567 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001568 TEST_ASSERT( recv_ret > 0 );
1569 TEST_ASSERT( recv_ret <= BUFLEN );
1570 read += recv_ret;
1571 }
1572 else if( blocking )
1573 {
1574 TEST_ASSERT( recv_ret == 0 );
Janos Follathc673c2c2019-12-02 15:47:26 +00001575 }
1576 else
1577 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001578 TEST_ASSERT( recv_ret == MBEDTLS_ERR_SSL_WANT_READ );
1579 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00001580 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001581
1582 /* If the buffer is empty we can test blocking and non-blocking read */
1583 if ( recv_ret == BUFLEN )
1584 {
1585 int blocking_ret = recv( &server, received, 1 );
1586 if ( blocking )
1587 {
1588 TEST_ASSERT( blocking_ret == 0 );
1589 }
1590 else
1591 {
1592 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
1593 }
1594 }
Janos Follathc673c2c2019-12-02 15:47:26 +00001595 }
1596 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1597
1598exit:
1599
1600 mbedtls_mock_socket_close( &client );
1601 mbedtls_mock_socket_close( &server );
1602}
1603/* END_CASE */
1604
1605/*
1606 * Test if the implementation of `mbedtls_mock_socket` related functions can
1607 * send messages in both direction at the same time (with the I/O calls
1608 * interleaving).
1609 */
1610
1611/* BEGIN_CASE */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001612void ssl_mock_tcp_interleaving( int blocking )
Janos Follathc673c2c2019-12-02 15:47:26 +00001613{
Janos Follath031827f2019-11-27 11:12:14 +00001614 enum { ROUNDS = 2 };
1615 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001616 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00001617 unsigned char message[ROUNDS][MSGLEN];
1618 unsigned char received[ROUNDS][MSGLEN];
1619 mbedtls_mock_socket client;
1620 mbedtls_mock_socket server;
1621 size_t written[ROUNDS];
1622 size_t read[ROUNDS];
1623 int send_ret[ROUNDS];
1624 int recv_ret[ROUNDS];
1625 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00001626 mbedtls_ssl_send_t *send;
1627 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00001628
1629 if( blocking == 0 )
1630 {
1631 send = mbedtls_mock_tcp_send_nb;
1632 recv = mbedtls_mock_tcp_recv_nb;
1633 }
1634 else
1635 {
1636 send = mbedtls_mock_tcp_send_b;
1637 recv = mbedtls_mock_tcp_recv_b;
1638 }
Janos Follath031827f2019-11-27 11:12:14 +00001639
1640 mbedtls_mock_socket_init( &client );
1641 mbedtls_mock_socket_init( &server );
1642
1643 /* Fill up the buffers with structured data so that unwanted changes
1644 * can be detected */
1645 for( i = 0; i < ROUNDS; i++ )
1646 {
1647 for( j = 0; j < MSGLEN; j++ )
1648 {
1649 message[i][j] = ( i * MSGLEN + j ) & 0xFF;
1650 }
1651 }
1652
Janos Follath031827f2019-11-27 11:12:14 +00001653 /* Make sure that sending a message takes a few iterations. */
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001654 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server, BUFLEN ) );
Janos Follath031827f2019-11-27 11:12:14 +00001655
Janos Follath031827f2019-11-27 11:12:14 +00001656 /* Send the message from both sides, interleaving. */
1657 progress = 1;
1658 for( i = 0; i < ROUNDS; i++ )
1659 {
1660 written[i] = 0;
1661 read[i] = 0;
1662 }
1663 /* This loop does not stop as long as there was a successful write or read
1664 * of at least one byte on either side. */
1665 while( progress != 0 )
1666 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001667 mbedtls_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00001668
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001669 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001670 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001671 /* First sending is from the client */
1672 socket = ( i % 2 == 0 ) ? ( &client ) : ( &server );
Janos Follath031827f2019-11-27 11:12:14 +00001673
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001674 send_ret[i] = send( socket, message[i] + written[i],
1675 MSGLEN - written[i] );
1676 TEST_ASSERT( send_ret[i] >= 0 );
1677 TEST_ASSERT( send_ret[i] <= BUFLEN );
1678 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00001679
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001680 /* If the buffer is full we can test blocking and non-blocking
1681 * send */
1682 if ( send_ret[i] == BUFLEN )
1683 {
1684 int blocking_ret = send( socket, message[i] , 1 );
1685 if ( blocking )
1686 {
1687 TEST_ASSERT( blocking_ret == 0 );
1688 }
1689 else
1690 {
1691 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE );
1692 }
1693 }
Janos Follath3766ba52019-11-27 13:31:42 +00001694 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001695
1696 for( i = 0; i < ROUNDS; i++ )
Janos Follath3766ba52019-11-27 13:31:42 +00001697 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001698 /* First receiving is from the server */
1699 socket = ( i % 2 == 0 ) ? ( &server ) : ( &client );
1700
1701 recv_ret[i] = recv( socket, received[i] + read[i],
1702 MSGLEN - read[i] );
1703
1704 /* The result depends on whether any data was sent */
1705 if ( send_ret[i] > 0 )
1706 {
1707 TEST_ASSERT( recv_ret[i] > 0 );
1708 TEST_ASSERT( recv_ret[i] <= BUFLEN );
1709 read[i] += recv_ret[i];
1710 }
1711 else if( blocking )
1712 {
1713 TEST_ASSERT( recv_ret[i] == 0 );
1714 }
1715 else
1716 {
1717 TEST_ASSERT( recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ );
1718 recv_ret[i] = 0;
1719 }
1720
1721 /* If the buffer is empty we can test blocking and non-blocking
1722 * read */
1723 if ( recv_ret[i] == BUFLEN )
1724 {
1725 int blocking_ret = recv( socket, received[i], 1 );
1726 if ( blocking )
1727 {
1728 TEST_ASSERT( blocking_ret == 0 );
1729 }
1730 else
1731 {
1732 TEST_ASSERT( blocking_ret == MBEDTLS_ERR_SSL_WANT_READ );
1733 }
1734 }
Janos Follath3766ba52019-11-27 13:31:42 +00001735 }
Janos Follath031827f2019-11-27 11:12:14 +00001736
1737 progress = 0;
1738 for( i = 0; i < ROUNDS; i++ )
1739 {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01001740 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00001741 }
1742 }
1743
1744 for( i = 0; i < ROUNDS; i++ )
1745 TEST_ASSERT( memcmp( message[i], received[i], MSGLEN ) == 0 );
1746
1747exit:
1748
1749 mbedtls_mock_socket_close( &client );
1750 mbedtls_mock_socket_close( &server );
1751}
1752/* END_CASE */
1753
Andrzej Kurek13719cd2020-01-22 06:36:39 -05001754/* BEGIN_CASE */
1755void ssl_message_queue_sanity( )
1756{
1757 mbedtls_test_message_queue queue;
1758
1759 /* Trying to push/pull to an empty queue */
1760 TEST_ASSERT( mbedtls_test_message_queue_push_info( NULL, 1 )
1761 == MBEDTLS_TEST_ERROR_ARG_NULL );
1762 TEST_ASSERT( mbedtls_test_message_queue_pop_info( NULL, 1 )
1763 == MBEDTLS_TEST_ERROR_ARG_NULL );
1764
1765 mbedtls_test_message_queue_setup( &queue, 3 );
1766 TEST_ASSERT( queue.capacity == 3 );
1767 TEST_ASSERT( queue.num == 0 );
1768
1769exit:
1770 mbedtls_test_message_queue_free( &queue );
1771}
1772/* END_CASE */
1773
1774/* BEGIN_CASE */
1775void ssl_message_queue_basic( )
1776{
1777 mbedtls_test_message_queue queue;
1778
1779 mbedtls_test_message_queue_setup( &queue, 3 );
1780
1781 /* Sanity test - 3 pushes and 3 pops with sufficient space */
1782 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1783 TEST_ASSERT( queue.capacity == 3 );
1784 TEST_ASSERT( queue.num == 1 );
1785 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1786 TEST_ASSERT( queue.capacity == 3 );
1787 TEST_ASSERT( queue.num == 2 );
1788 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1789 TEST_ASSERT( queue.capacity == 3 );
1790 TEST_ASSERT( queue.num == 3 );
1791
1792 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1793 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1794 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1795
1796exit:
1797 mbedtls_test_message_queue_free( &queue );
1798}
1799/* END_CASE */
1800
1801/* BEGIN_CASE */
1802void ssl_message_queue_overflow_underflow( )
1803{
1804 mbedtls_test_message_queue queue;
1805
1806 mbedtls_test_message_queue_setup( &queue, 3 );
1807
1808 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
1809 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1810 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1811 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1812 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 )
1813 == MBEDTLS_TEST_ERROR_QUEUE_FULL );
1814
1815 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1816 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1817 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1818
1819 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 )
1820 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
1821
1822exit:
1823 mbedtls_test_message_queue_free( &queue );
1824}
1825/* END_CASE */
1826
1827/* BEGIN_CASE */
1828void ssl_message_queue_interleaved( )
1829{
1830 mbedtls_test_message_queue queue;
1831
1832 mbedtls_test_message_queue_setup( &queue, 3 );
1833
1834 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
1835 * (to wrap around the buffer) */
1836 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1837 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 1 ) == 1 );
1838
1839 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1840
1841 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 2 ) == 2 );
1842 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 3 ) == 3 );
1843
1844 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 1 ) == 1 );
1845 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 2 ) == 2 );
1846
1847 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 5 ) == 5 );
1848 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, 8 ) == 8 );
1849
1850 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 3 ) == 3 );
1851
1852 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 5 ) == 5 );
1853
1854 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, 8 ) == 8 );
1855
1856exit:
1857 mbedtls_test_message_queue_free( &queue );
1858}
1859/* END_CASE */
1860
1861/* BEGIN_CASE */
1862void ssl_message_queue_insufficient_buffer( )
1863{
1864 mbedtls_test_message_queue queue;
1865 size_t message_len = 10;
1866 size_t buffer_len = 5;
1867
1868 mbedtls_test_message_queue_setup( &queue, 1 );
1869
1870 /* Popping without a sufficient buffer */
1871 TEST_ASSERT( mbedtls_test_message_queue_push_info( &queue, message_len )
1872 == (int) message_len );
1873 TEST_ASSERT( mbedtls_test_message_queue_pop_info( &queue, buffer_len )
1874 == (int) buffer_len );
1875exit:
1876 mbedtls_test_message_queue_free( &queue );
1877}
1878/* END_CASE */
1879
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001880/* BEGIN_CASE */
1881void ssl_message_mock_uninitialized( )
1882{
1883 enum { MSGLEN = 10 };
1884 unsigned char message[MSGLEN], received[MSGLEN];
1885 mbedtls_mock_socket client, server;
1886 mbedtls_test_message_queue server_queue, client_queue;
1887 mbedtls_test_message_socket_context server_context, client_context;
1888
1889 /* Send with a NULL context */
1890 TEST_ASSERT( mbedtls_mock_tcp_send_msg( NULL, message, MSGLEN )
1891 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
1892
1893 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( NULL, message, MSGLEN )
1894 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR );
1895
1896 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
1897 &server,
1898 &server_context ) == 0 );
1899
1900 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
1901 &client,
1902 &client_context ) == 0 );
1903
1904 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message, MSGLEN )
1905 == MBEDTLS_TEST_ERROR_SEND_FAILED );
1906
1907 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1908 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
1909
1910 /* Push directly to a queue to later simulate a disconnected behavior */
1911 TEST_ASSERT( mbedtls_test_message_queue_push_info( &server_queue, MSGLEN )
1912 == MSGLEN );
1913
1914 /* Test if there's an error when trying to read from a disconnected
1915 * socket */
1916 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1917 == MBEDTLS_TEST_ERROR_RECV_FAILED );
1918 exit:
1919 mbedtls_message_socket_close( &server_context );
1920 mbedtls_message_socket_close( &client_context );
1921}
1922/* END_CASE */
1923
1924/* BEGIN_CASE */
1925void ssl_message_mock_basic( )
1926{
1927 enum { MSGLEN = 10 };
1928 unsigned char message[MSGLEN], received[MSGLEN];
1929 mbedtls_mock_socket client, server;
1930 unsigned i;
1931 mbedtls_test_message_queue server_queue, client_queue;
1932 mbedtls_test_message_socket_context server_context, client_context;
1933
1934 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
1935 &server,
1936 &server_context ) == 0 );
1937
1938 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
1939 &client,
1940 &client_context ) == 0 );
1941
1942 /* Fill up the buffer with structured data so that unwanted changes
1943 * can be detected */
1944 for( i = 0; i < MSGLEN; i++ )
1945 {
1946 message[i] = i & 0xFF;
1947 }
1948 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
1949 MSGLEN ) );
1950
1951 /* Send the message to the server */
1952 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
1953 MSGLEN ) == MSGLEN );
1954
1955 /* Read from the server */
1956 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
1957 == MSGLEN );
1958
1959 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1960 memset( received, 0, MSGLEN );
1961
1962 /* Send the message to the client */
1963 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
1964 MSGLEN ) == MSGLEN );
1965
1966 /* Read from the client */
1967 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
1968 == MSGLEN );
1969 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
1970
1971 exit:
1972 mbedtls_message_socket_close( &server_context );
1973 mbedtls_message_socket_close( &client_context );
1974}
1975/* END_CASE */
1976
1977/* BEGIN_CASE */
1978void ssl_message_mock_queue_overflow_underflow( )
1979{
1980 enum { MSGLEN = 10 };
1981 unsigned char message[MSGLEN], received[MSGLEN];
1982 mbedtls_mock_socket client, server;
1983 unsigned i;
1984 mbedtls_test_message_queue server_queue, client_queue;
1985 mbedtls_test_message_socket_context server_context, client_context;
1986
1987 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
1988 &server,
1989 &server_context ) == 0 );
1990
1991 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
1992 &client,
1993 &client_context ) == 0 );
1994
1995 /* Fill up the buffer with structured data so that unwanted changes
1996 * can be detected */
1997 for( i = 0; i < MSGLEN; i++ )
1998 {
1999 message[i] = i & 0xFF;
2000 }
2001 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2002 MSGLEN*2 ) );
2003
2004 /* Send three message to the server, last one with an error */
2005 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2006 MSGLEN - 1 ) == MSGLEN - 1 );
2007
2008 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2009 MSGLEN ) == MSGLEN );
2010
2011 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2012 MSGLEN )
2013 == MBEDTLS_TEST_ERROR_QUEUE_FULL );
2014
2015 /* Read three messages from the server, last one with an error */
2016 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2017 MSGLEN - 1 ) == MSGLEN - 1 );
2018
2019 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2020 == MSGLEN );
2021
2022 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2023
2024 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2025 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2026
2027 exit:
2028 mbedtls_message_socket_close( &server_context );
2029 mbedtls_message_socket_close( &client_context );
2030}
2031/* END_CASE */
2032
2033/* BEGIN_CASE */
2034void ssl_message_mock_socket_overflow( )
2035{
2036 enum { MSGLEN = 10 };
2037 unsigned char message[MSGLEN], received[MSGLEN];
2038 mbedtls_mock_socket client, server;
2039 unsigned i;
2040 mbedtls_test_message_queue server_queue, client_queue;
2041 mbedtls_test_message_socket_context server_context, client_context;
2042
2043 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2044 &server,
2045 &server_context ) == 0 );
2046
2047 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2048 &client,
2049 &client_context ) == 0 );
2050
2051 /* Fill up the buffer with structured data so that unwanted changes
2052 * can be detected */
2053 for( i = 0; i < MSGLEN; i++ )
2054 {
2055 message[i] = i & 0xFF;
2056 }
2057 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2058 MSGLEN ) );
2059
2060 /* Send two message to the server, second one with an error */
2061 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2062 MSGLEN ) == MSGLEN );
2063
2064 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2065 MSGLEN )
2066 == MBEDTLS_TEST_ERROR_SEND_FAILED );
2067
2068 /* Read the only message from the server */
2069 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2070 == MSGLEN );
2071
2072 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2073
2074 exit:
2075 mbedtls_message_socket_close( &server_context );
2076 mbedtls_message_socket_close( &client_context );
2077}
2078/* END_CASE */
2079
2080/* BEGIN_CASE */
2081void ssl_message_mock_truncated( )
2082{
2083 enum { MSGLEN = 10 };
2084 unsigned char message[MSGLEN], received[MSGLEN];
2085 mbedtls_mock_socket client, server;
2086 unsigned i;
2087 mbedtls_test_message_queue server_queue, client_queue;
2088 mbedtls_test_message_socket_context server_context, client_context;
2089
2090 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 2,
2091 &server,
2092 &server_context ) == 0 );
2093
2094 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 2,
2095 &client,
2096 &client_context ) == 0 );
2097
2098 memset( received, 0, MSGLEN );
2099 /* Fill up the buffer with structured data so that unwanted changes
2100 * can be detected */
2101 for( i = 0; i < MSGLEN; i++ )
2102 {
2103 message[i] = i & 0xFF;
2104 }
2105 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2106 2 * MSGLEN ) );
2107
2108 /* Send two messages to the server, the second one small enough to fit in the
2109 * receiver's buffer. */
2110 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2111 MSGLEN ) == MSGLEN );
2112 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2113 MSGLEN / 2 ) == MSGLEN / 2 );
2114 /* Read a truncated message from the server */
2115 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2116 == MSGLEN/2 );
2117
2118 /* Test that the first half of the message is valid, and second one isn't */
2119 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2120 TEST_ASSERT( memcmp( message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2 )
2121 != 0 );
2122 memset( received, 0, MSGLEN );
2123
2124 /* Read a full message from the server */
2125 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN/2 )
2126 == MSGLEN / 2 );
2127
2128 /* Test that the first half of the message is valid */
2129 TEST_ASSERT( memcmp( message, received, MSGLEN/2 ) == 0 );
2130
2131 exit:
2132 mbedtls_message_socket_close( &server_context );
2133 mbedtls_message_socket_close( &client_context );
2134}
2135/* END_CASE */
2136
2137/* BEGIN_CASE */
2138void ssl_message_mock_socket_read_error( )
2139{
2140 enum { MSGLEN = 10 };
2141 unsigned char message[MSGLEN], received[MSGLEN];
2142 mbedtls_mock_socket client, server;
2143 unsigned i;
2144 mbedtls_test_message_queue server_queue, client_queue;
2145 mbedtls_test_message_socket_context server_context, client_context;
2146
2147 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 1,
2148 &server,
2149 &server_context ) == 0 );
2150
2151 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 1,
2152 &client,
2153 &client_context ) == 0 );
2154
2155 /* Fill up the buffer with structured data so that unwanted changes
2156 * can be detected */
2157 for( i = 0; i < MSGLEN; i++ )
2158 {
2159 message[i] = i & 0xFF;
2160 }
2161 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2162 MSGLEN ) );
2163
2164 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2165 MSGLEN ) == MSGLEN );
2166
2167 /* Force a read error by disconnecting the socket by hand */
2168 server.status = 0;
2169 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2170 == MBEDTLS_TEST_ERROR_RECV_FAILED );
2171 /* Return to a valid state */
2172 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
2173
2174 memset( received, 0, sizeof( received ) );
2175
2176 /* Test that even though the server tried to read once disconnected, the
2177 * continuity is preserved */
2178 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2179 == MSGLEN );
2180
2181 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2182
2183 exit:
2184 mbedtls_message_socket_close( &server_context );
2185 mbedtls_message_socket_close( &client_context );
2186}
2187/* END_CASE */
2188
2189/* BEGIN_CASE */
2190void ssl_message_mock_interleaved_one_way( )
2191{
2192 enum { MSGLEN = 10 };
2193 unsigned char message[MSGLEN], received[MSGLEN];
2194 mbedtls_mock_socket client, server;
2195 unsigned i;
2196 mbedtls_test_message_queue server_queue, client_queue;
2197 mbedtls_test_message_socket_context server_context, client_context;
2198
2199 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2200 &server,
2201 &server_context ) == 0 );
2202
2203 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2204 &client,
2205 &client_context ) == 0 );
2206
2207 /* Fill up the buffer with structured data so that unwanted changes
2208 * can be detected */
2209 for( i = 0; i < MSGLEN; i++ )
2210 {
2211 message[i] = i & 0xFF;
2212 }
2213 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2214 MSGLEN*3 ) );
2215
2216 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
2217 * (to wrap around the buffer) */
2218 for( i = 0; i < 2; i++ )
2219 {
2220 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2221 MSGLEN ) == MSGLEN );
2222
2223 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2224 MSGLEN ) == MSGLEN );
2225
2226 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2227 MSGLEN ) == MSGLEN );
2228 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2229 memset( received, 0, sizeof( received ) );
2230 }
2231
2232 for( i = 0; i < 2; i++ )
2233 {
2234 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2235 MSGLEN ) == MSGLEN );
2236
2237 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2238 }
2239 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2240 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2241 exit:
2242 mbedtls_message_socket_close( &server_context );
2243 mbedtls_message_socket_close( &client_context );
2244}
2245/* END_CASE */
2246
2247/* BEGIN_CASE */
2248void ssl_message_mock_interleaved_two_ways( )
2249{
2250 enum { MSGLEN = 10 };
2251 unsigned char message[MSGLEN], received[MSGLEN];
2252 mbedtls_mock_socket client, server;
2253 unsigned i;
2254 mbedtls_test_message_queue server_queue, client_queue;
2255 mbedtls_test_message_socket_context server_context, client_context;
2256
2257 TEST_ASSERT( mbedtls_message_socket_setup( &server_queue, &client_queue, 3,
2258 &server,
2259 &server_context ) == 0 );
2260
2261 TEST_ASSERT( mbedtls_message_socket_setup( &client_queue, &server_queue, 3,
2262 &client,
2263 &client_context ) == 0 );
2264
2265 /* Fill up the buffer with structured data so that unwanted changes
2266 * can be detected */
2267 for( i = 0; i < MSGLEN; i++ )
2268 {
2269 message[i] = i & 0xFF;
2270 }
2271 TEST_ASSERT( 0 == mbedtls_mock_socket_connect( &client, &server,
2272 MSGLEN*3 ) );
2273
2274 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
2275 * (to wrap around the buffer) both ways. */
2276 for( i = 0; i < 2; i++ )
2277 {
2278 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2279 MSGLEN ) == MSGLEN );
2280
2281 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &client_context, message,
2282 MSGLEN ) == MSGLEN );
2283
2284 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2285 MSGLEN ) == MSGLEN );
2286
2287 TEST_ASSERT( mbedtls_mock_tcp_send_msg( &server_context, message,
2288 MSGLEN ) == MSGLEN );
2289
2290 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2291 MSGLEN ) == MSGLEN );
2292
2293 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2294
2295 memset( received, 0, sizeof( received ) );
2296
2297 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2298 MSGLEN ) == MSGLEN );
2299
2300 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2301
2302 memset( received, 0, sizeof( received ) );
2303 }
2304
2305 for( i = 0; i < 2; i++ )
2306 {
2307 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received,
2308 MSGLEN ) == MSGLEN );
2309
2310 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2311 memset( received, 0, sizeof( received ) );
2312
2313 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received,
2314 MSGLEN ) == MSGLEN );
2315
2316 TEST_ASSERT( memcmp( message, received, MSGLEN ) == 0 );
2317 memset( received, 0, sizeof( received ) );
2318 }
2319
2320 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &server_context, received, MSGLEN )
2321 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2322
2323 TEST_ASSERT( mbedtls_mock_tcp_recv_msg( &client_context, received, MSGLEN )
2324 == MBEDTLS_TEST_ERROR_QUEUE_EMPTY );
2325 exit:
2326 mbedtls_message_socket_close( &server_context );
2327 mbedtls_message_socket_close( &client_context );
2328}
2329/* END_CASE */
2330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002331/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Azim Khan5fcca462018-06-29 11:05:32 +01002332void ssl_dtls_replay( data_t * prevs, data_t * new, int ret )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002333{
Azim Khand30ca132017-06-09 04:32:58 +01002334 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002335 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002336 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002337
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002338 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002339 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002340
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02002341 TEST_ASSERT( mbedtls_ssl_config_defaults( &conf,
2342 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02002343 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2344 MBEDTLS_SSL_PRESET_DEFAULT ) == 0 );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002345 TEST_ASSERT( mbedtls_ssl_setup( &ssl, &conf ) == 0 );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002346
2347 /* Read previous record numbers */
Azim Khand30ca132017-06-09 04:32:58 +01002348 for( len = 0; len < prevs->len; len += 6 )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002349 {
Azim Khand30ca132017-06-09 04:32:58 +01002350 memcpy( ssl.in_ctr + 2, prevs->x + len, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002351 mbedtls_ssl_dtls_replay_update( &ssl );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002352 }
2353
2354 /* Check new number */
Azim Khand30ca132017-06-09 04:32:58 +01002355 memcpy( ssl.in_ctr + 2, new->x, 6 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002356 TEST_ASSERT( mbedtls_ssl_dtls_replay_check( &ssl ) == ret );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002358 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002359 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002360}
2361/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002362
2363/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
2364void ssl_set_hostname_twice( char *hostname0, char *hostname1 )
2365{
2366 mbedtls_ssl_context ssl;
2367 mbedtls_ssl_init( &ssl );
2368
2369 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname0 ) == 0 );
2370 TEST_ASSERT( mbedtls_ssl_set_hostname( &ssl, hostname1 ) == 0 );
2371
2372 mbedtls_ssl_free( &ssl );
2373}
Darryl Green11999bb2018-03-13 15:22:58 +00002374/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00002375
2376/* BEGIN_CASE */
2377void ssl_crypt_record( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002378 int etm, int tag_mode, int ver,
2379 int cid0_len, int cid1_len )
Hanno Beckera18d1322018-01-03 14:27:32 +00002380{
2381 /*
2382 * Test several record encryptions and decryptions
2383 * with plenty of space before and after the data
2384 * within the record buffer.
2385 */
2386
2387 int ret;
2388 int num_records = 16;
2389 mbedtls_ssl_context ssl; /* ONLY for debugging */
2390
2391 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002392 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00002393 size_t const buflen = 512;
2394 mbedtls_record rec, rec_backup;
2395
2396 mbedtls_ssl_init( &ssl );
2397 mbedtls_ssl_transform_init( &t0 );
2398 mbedtls_ssl_transform_init( &t1 );
2399 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002400 etm, tag_mode, ver,
2401 (size_t) cid0_len,
2402 (size_t) cid1_len ) == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002403
Hanno Becker3ee54212019-04-04 16:31:26 +01002404 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckera18d1322018-01-03 14:27:32 +00002405
2406 while( num_records-- > 0 )
2407 {
2408 mbedtls_ssl_transform *t_dec, *t_enc;
2409 /* Take turns in who's sending and who's receiving. */
2410 if( num_records % 3 == 0 )
2411 {
2412 t_dec = &t0;
2413 t_enc = &t1;
2414 }
2415 else
2416 {
2417 t_dec = &t1;
2418 t_enc = &t0;
2419 }
2420
2421 /*
2422 * The record header affects the transformation in two ways:
2423 * 1) It determines the AEAD additional data
2424 * 2) The record counter sometimes determines the IV.
2425 *
2426 * Apart from that, the fields don't have influence.
2427 * In particular, it is currently not the responsibility
2428 * of ssl_encrypt/decrypt_buf to check if the transform
2429 * version matches the record version, or that the
2430 * type is sensible.
2431 */
2432
2433 memset( rec.ctr, num_records, sizeof( rec.ctr ) );
2434 rec.type = 42;
2435 rec.ver[0] = num_records;
2436 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002437#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002438 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002439#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00002440
2441 rec.buf = buf;
2442 rec.buf_len = buflen;
2443 rec.data_offset = 16;
2444 /* Make sure to vary the length to exercise different
2445 * paddings. */
2446 rec.data_len = 1 + num_records;
2447
2448 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2449
2450 /* Make a copy for later comparison */
2451 rec_backup = rec;
2452
2453 /* Encrypt record */
2454 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec,
2455 rnd_std_rand, NULL );
2456 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2457 if( ret != 0 )
2458 {
2459 continue;
2460 }
2461
2462 /* Decrypt record with t_dec */
Hanno Beckerd856c822019-04-29 17:30:59 +01002463 ret = mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec );
2464 TEST_ASSERT( ret == 0 );
Hanno Beckera18d1322018-01-03 14:27:32 +00002465
2466 /* Compare results */
2467 TEST_ASSERT( rec.type == rec_backup.type );
2468 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2469 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2470 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2471 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2472 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2473 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2474 rec_backup.buf + rec_backup.data_offset,
2475 rec.data_len ) == 0 );
2476 }
2477
Hanno Becker81e16a32019-03-01 11:21:44 +00002478exit:
2479
Hanno Beckera18d1322018-01-03 14:27:32 +00002480 /* Cleanup */
2481 mbedtls_ssl_free( &ssl );
2482 mbedtls_ssl_transform_free( &t0 );
2483 mbedtls_ssl_transform_free( &t1 );
2484
Hanno Becker3ee54212019-04-04 16:31:26 +01002485 mbedtls_free( buf );
Hanno Beckera18d1322018-01-03 14:27:32 +00002486}
2487/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002488
2489/* BEGIN_CASE */
2490void ssl_crypt_record_small( int cipher_type, int hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002491 int etm, int tag_mode, int ver,
2492 int cid0_len, int cid1_len )
Hanno Beckerb3268da2018-01-05 15:20:24 +00002493{
2494 /*
2495 * Test pairs of encryption and decryption with an increasing
2496 * amount of space in the record buffer - in more detail:
2497 * 1) Try to encrypt with 0, 1, 2, ... bytes available
2498 * in front of the plaintext, and expect the encryption
2499 * to succeed starting from some offset. Always keep
2500 * enough space in the end of the buffer.
2501 * 2) Try to encrypt with 0, 1, 2, ... bytes available
2502 * at the end of the plaintext, and expect the encryption
2503 * to succeed starting from some offset. Always keep
2504 * enough space at the beginning of the buffer.
2505 * 3) Try to encrypt with 0, 1, 2, ... bytes available
2506 * both at the front and end of the plaintext,
2507 * and expect the encryption to succeed starting from
2508 * some offset.
2509 *
2510 * If encryption succeeds, check that decryption succeeds
2511 * and yields the original record.
2512 */
2513
2514 mbedtls_ssl_context ssl; /* ONLY for debugging */
2515
2516 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002517 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01002518 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002519 mbedtls_record rec, rec_backup;
2520
2521 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01002522 int mode; /* Mode 1, 2 or 3 as explained above */
2523 size_t offset; /* Available space at beginning/end/both */
2524 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002525
Hanno Beckerd856c822019-04-29 17:30:59 +01002526 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
2527 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002528
2529 int seen_success; /* Indicates if in the current mode we've
2530 * already seen a successful test. */
2531
2532 mbedtls_ssl_init( &ssl );
2533 mbedtls_ssl_transform_init( &t0 );
2534 mbedtls_ssl_transform_init( &t1 );
2535 TEST_ASSERT( build_transforms( &t0, &t1, cipher_type, hash_id,
Hanno Beckerd856c822019-04-29 17:30:59 +01002536 etm, tag_mode, ver,
2537 (size_t) cid0_len,
2538 (size_t) cid1_len ) == 0 );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002539
Hanno Becker3ee54212019-04-04 16:31:26 +01002540 TEST_ASSERT( ( buf = mbedtls_calloc( 1, buflen ) ) != NULL );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002541
2542 for( mode=1; mode <= 3; mode++ )
2543 {
2544 seen_success = 0;
2545 for( offset=0; offset <= threshold; offset++ )
2546 {
2547 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01002548 t_dec = &t0;
2549 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00002550
2551 memset( rec.ctr, offset, sizeof( rec.ctr ) );
2552 rec.type = 42;
2553 rec.ver[0] = offset;
2554 rec.ver[1] = offset;
2555 rec.buf = buf;
2556 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002557#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01002558 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002559#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00002560
2561 switch( mode )
2562 {
2563 case 1: /* Space in the beginning */
2564 rec.data_offset = offset;
2565 rec.data_len = buflen - offset - default_post_padding;
2566 break;
2567
2568 case 2: /* Space in the end */
2569 rec.data_offset = default_pre_padding;
2570 rec.data_len = buflen - default_pre_padding - offset;
2571 break;
2572
2573 case 3: /* Space in the beginning and end */
2574 rec.data_offset = offset;
2575 rec.data_len = buflen - 2 * offset;
2576 break;
2577
2578 default:
2579 TEST_ASSERT( 0 );
2580 break;
2581 }
2582
2583 memset( rec.buf + rec.data_offset, 42, rec.data_len );
2584
2585 /* Make a copy for later comparison */
2586 rec_backup = rec;
2587
2588 /* Encrypt record */
2589 ret = mbedtls_ssl_encrypt_buf( &ssl, t_enc, &rec, rnd_std_rand, NULL );
2590
2591 if( ( mode == 1 || mode == 2 ) && seen_success )
2592 {
2593 TEST_ASSERT( ret == 0 );
2594 }
2595 else
2596 {
2597 TEST_ASSERT( ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2598 if( ret == 0 )
2599 seen_success = 1;
2600 }
2601
2602 if( ret != 0 )
2603 continue;
2604
2605 /* Decrypt record with t_dec */
2606 TEST_ASSERT( mbedtls_ssl_decrypt_buf( &ssl, t_dec, &rec ) == 0 );
2607
2608 /* Compare results */
2609 TEST_ASSERT( rec.type == rec_backup.type );
2610 TEST_ASSERT( memcmp( rec.ctr, rec_backup.ctr, 8 ) == 0 );
2611 TEST_ASSERT( rec.ver[0] == rec_backup.ver[0] );
2612 TEST_ASSERT( rec.ver[1] == rec_backup.ver[1] );
2613 TEST_ASSERT( rec.data_len == rec_backup.data_len );
2614 TEST_ASSERT( rec.data_offset == rec_backup.data_offset );
2615 TEST_ASSERT( memcmp( rec.buf + rec.data_offset,
2616 rec_backup.buf + rec_backup.data_offset,
2617 rec.data_len ) == 0 );
2618 }
2619
2620 TEST_ASSERT( seen_success == 1 );
2621 }
2622
Hanno Becker81e16a32019-03-01 11:21:44 +00002623exit:
2624
Hanno Beckerb3268da2018-01-05 15:20:24 +00002625 /* Cleanup */
2626 mbedtls_ssl_free( &ssl );
2627 mbedtls_ssl_transform_free( &t0 );
2628 mbedtls_ssl_transform_free( &t1 );
2629
Hanno Becker3ee54212019-04-04 16:31:26 +01002630 mbedtls_free( buf );
Hanno Beckerb3268da2018-01-05 15:20:24 +00002631}
2632/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03002633
2634/* BEGIN_CASE */
2635void ssl_tls_prf( int type, data_t * secret, data_t * random,
2636 char *label, data_t *result_hex_str, int exp_ret )
2637{
2638 unsigned char *output;
2639
2640 output = mbedtls_calloc( 1, result_hex_str->len );
2641 if( output == NULL )
2642 goto exit;
2643
Ron Eldor6b9b1b82019-05-15 17:04:33 +03002644#if defined(MBEDTLS_USE_PSA_CRYPTO)
2645 TEST_ASSERT( psa_crypto_init() == 0 );
2646#endif
2647
Ron Eldor824ad7b2019-05-13 14:09:00 +03002648 TEST_ASSERT( mbedtls_ssl_tls_prf( type, secret->x, secret->len,
2649 label, random->x, random->len,
2650 output, result_hex_str->len ) == exp_ret );
2651
2652 if( exp_ret == 0 )
2653 {
2654 TEST_ASSERT( hexcmp( output, result_hex_str->x,
2655 result_hex_str->len, result_hex_str->len ) == 0 );
2656 }
2657exit:
2658
2659 mbedtls_free( output );
2660}
2661/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002662
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002663/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002664void ssl_serialize_session_save_load( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002665{
2666 mbedtls_ssl_session original, restored;
2667 unsigned char *buf = NULL;
2668 size_t len;
2669
2670 /*
2671 * Test that a save-load pair is the identity
2672 */
2673
2674 mbedtls_ssl_session_init( &original );
2675 mbedtls_ssl_session_init( &restored );
2676
2677 /* Prepare a dummy session to work on */
2678 TEST_ASSERT( ssl_populate_session( &original, ticket_len, crt_file ) == 0 );
2679
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002680 /* Serialize it */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002681 TEST_ASSERT( mbedtls_ssl_session_save( &original, NULL, 0, &len )
2682 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2683 TEST_ASSERT( ( buf = mbedtls_calloc( 1, len ) ) != NULL );
2684 TEST_ASSERT( mbedtls_ssl_session_save( &original, buf, len, &len )
2685 == 0 );
2686
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002687 /* Restore session from serialized data */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002688 TEST_ASSERT( mbedtls_ssl_session_load( &restored, buf, len) == 0 );
2689
2690 /*
2691 * Make sure both session structures are identical
2692 */
2693#if defined(MBEDTLS_HAVE_TIME)
2694 TEST_ASSERT( original.start == restored.start );
2695#endif
2696 TEST_ASSERT( original.ciphersuite == restored.ciphersuite );
2697 TEST_ASSERT( original.compression == restored.compression );
2698 TEST_ASSERT( original.id_len == restored.id_len );
2699 TEST_ASSERT( memcmp( original.id,
2700 restored.id, sizeof( original.id ) ) == 0 );
2701 TEST_ASSERT( memcmp( original.master,
2702 restored.master, sizeof( original.master ) ) == 0 );
2703
2704#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002705#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002706 TEST_ASSERT( ( original.peer_cert == NULL ) ==
2707 ( restored.peer_cert == NULL ) );
2708 if( original.peer_cert != NULL )
2709 {
2710 TEST_ASSERT( original.peer_cert->raw.len ==
2711 restored.peer_cert->raw.len );
2712 TEST_ASSERT( memcmp( original.peer_cert->raw.p,
2713 restored.peer_cert->raw.p,
2714 original.peer_cert->raw.len ) == 0 );
2715 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02002716#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2717 TEST_ASSERT( original.peer_cert_digest_type ==
2718 restored.peer_cert_digest_type );
2719 TEST_ASSERT( original.peer_cert_digest_len ==
2720 restored.peer_cert_digest_len );
2721 TEST_ASSERT( ( original.peer_cert_digest == NULL ) ==
2722 ( restored.peer_cert_digest == NULL ) );
2723 if( original.peer_cert_digest != NULL )
2724 {
2725 TEST_ASSERT( memcmp( original.peer_cert_digest,
2726 restored.peer_cert_digest,
2727 original.peer_cert_digest_len ) == 0 );
2728 }
2729#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2730#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02002731 TEST_ASSERT( original.verify_result == restored.verify_result );
2732
2733#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
2734 TEST_ASSERT( original.ticket_len == restored.ticket_len );
2735 if( original.ticket_len != 0 )
2736 {
2737 TEST_ASSERT( original.ticket != NULL );
2738 TEST_ASSERT( restored.ticket != NULL );
2739 TEST_ASSERT( memcmp( original.ticket,
2740 restored.ticket, original.ticket_len ) == 0 );
2741 }
2742 TEST_ASSERT( original.ticket_lifetime == restored.ticket_lifetime );
2743#endif
2744
2745#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2746 TEST_ASSERT( original.mfl_code == restored.mfl_code );
2747#endif
2748
2749#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2750 TEST_ASSERT( original.trunc_hmac == restored.trunc_hmac );
2751#endif
2752
2753#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2754 TEST_ASSERT( original.encrypt_then_mac == restored.encrypt_then_mac );
2755#endif
2756
2757exit:
2758 mbedtls_ssl_session_free( &original );
2759 mbedtls_ssl_session_free( &restored );
2760 mbedtls_free( buf );
2761}
2762/* END_CASE */
2763
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02002764/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002765void ssl_serialize_session_load_save( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002766{
2767 mbedtls_ssl_session session;
2768 unsigned char *buf1 = NULL, *buf2 = NULL;
2769 size_t len0, len1, len2;
2770
2771 /*
2772 * Test that a load-save pair is the identity
2773 */
2774
2775 mbedtls_ssl_session_init( &session );
2776
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002777 /* Prepare a dummy session to work on */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002778 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02002779
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002780 /* Get desired buffer size for serializing */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002781 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &len0 )
2782 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2783
2784 /* Allocate first buffer */
2785 buf1 = mbedtls_calloc( 1, len0 );
2786 TEST_ASSERT( buf1 != NULL );
2787
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002788 /* Serialize to buffer and free live session */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002789 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf1, len0, &len1 )
2790 == 0 );
2791 TEST_ASSERT( len0 == len1 );
2792 mbedtls_ssl_session_free( &session );
2793
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002794 /* Restore session from serialized data */
Manuel Pégourié-Gonnard220403b2019-05-24 09:54:21 +02002795 TEST_ASSERT( mbedtls_ssl_session_load( &session, buf1, len1 ) == 0 );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002796
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002797 /* Allocate second buffer and serialize to it */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002798 buf2 = mbedtls_calloc( 1, len0 );
Manuel Pégourié-Gonnardb4079902019-05-24 09:52:10 +02002799 TEST_ASSERT( buf2 != NULL );
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002800 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf2, len0, &len2 )
2801 == 0 );
2802
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002803 /* Make sure both serialized versions are identical */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02002804 TEST_ASSERT( len1 == len2 );
2805 TEST_ASSERT( memcmp( buf1, buf2, len1 ) == 0 );
2806
2807exit:
2808 mbedtls_ssl_session_free( &session );
2809 mbedtls_free( buf1 );
2810 mbedtls_free( buf2 );
2811}
2812/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002813
2814/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002815void ssl_serialize_session_save_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002816{
2817 mbedtls_ssl_session session;
2818 unsigned char *buf = NULL;
2819 size_t good_len, bad_len, test_len;
2820
2821 /*
2822 * Test that session_save() fails cleanly on small buffers
2823 */
2824
2825 mbedtls_ssl_session_init( &session );
2826
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002827 /* Prepare dummy session and get serialized size */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002828 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002829 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
2830 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2831
2832 /* Try all possible bad lengths */
2833 for( bad_len = 1; bad_len < good_len; bad_len++ )
2834 {
2835 /* Allocate exact size so that asan/valgrind can detect any overwrite */
2836 mbedtls_free( buf );
2837 TEST_ASSERT( ( buf = mbedtls_calloc( 1, bad_len ) ) != NULL );
2838 TEST_ASSERT( mbedtls_ssl_session_save( &session, buf, bad_len,
2839 &test_len )
2840 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2841 TEST_ASSERT( test_len == good_len );
2842 }
2843
2844exit:
2845 mbedtls_ssl_session_free( &session );
2846 mbedtls_free( buf );
2847}
2848/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002849
2850/* BEGIN_CASE */
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002851void ssl_serialize_session_load_buf_size( int ticket_len, char *crt_file )
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002852{
2853 mbedtls_ssl_session session;
2854 unsigned char *good_buf = NULL, *bad_buf = NULL;
2855 size_t good_len, bad_len;
2856
2857 /*
2858 * Test that session_load() fails cleanly on small buffers
2859 */
2860
2861 mbedtls_ssl_session_init( &session );
2862
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002863 /* Prepare serialized session data */
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02002864 TEST_ASSERT( ssl_populate_session( &session, ticket_len, crt_file ) == 0 );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002865 TEST_ASSERT( mbedtls_ssl_session_save( &session, NULL, 0, &good_len )
2866 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2867 TEST_ASSERT( ( good_buf = mbedtls_calloc( 1, good_len ) ) != NULL );
2868 TEST_ASSERT( mbedtls_ssl_session_save( &session, good_buf, good_len,
2869 &good_len ) == 0 );
2870 mbedtls_ssl_session_free( &session );
2871
2872 /* Try all possible bad lengths */
2873 for( bad_len = 0; bad_len < good_len; bad_len++ )
2874 {
2875 /* Allocate exact size so that asan/valgrind can detect any overread */
2876 mbedtls_free( bad_buf );
2877 bad_buf = mbedtls_calloc( 1, bad_len ? bad_len : 1 );
2878 TEST_ASSERT( bad_buf != NULL );
2879 memcpy( bad_buf, good_buf, bad_len );
2880
2881 TEST_ASSERT( mbedtls_ssl_session_load( &session, bad_buf, bad_len )
2882 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2883 }
2884
2885exit:
2886 mbedtls_ssl_session_free( &session );
2887 mbedtls_free( good_buf );
2888 mbedtls_free( bad_buf );
2889}
2890/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002891
Hanno Becker363b6462019-05-29 12:44:28 +01002892/* BEGIN_CASE */
2893void ssl_session_serialize_version_check( int corrupt_major,
Hanno Becker861d0bb2019-05-21 16:39:30 +01002894 int corrupt_minor,
2895 int corrupt_patch,
2896 int corrupt_config )
2897{
Hanno Becker363b6462019-05-29 12:44:28 +01002898 unsigned char serialized_session[ 2048 ];
2899 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002900 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002901 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002902 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2903 corrupt_minor == 1,
2904 corrupt_patch == 1,
2905 corrupt_config == 1,
2906 corrupt_config == 1 };
2907
Hanno Becker861d0bb2019-05-21 16:39:30 +01002908 mbedtls_ssl_session_init( &session );
2909
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002910 /* Infer length of serialized session. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002911 TEST_ASSERT( mbedtls_ssl_session_save( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01002912 serialized_session,
2913 sizeof( serialized_session ),
2914 &serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002915
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002916 mbedtls_ssl_session_free( &session );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002917
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002918 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002919 * de-serialize the session - double-check that. */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002920 TEST_ASSERT( mbedtls_ssl_session_load( &session,
Hanno Becker363b6462019-05-29 12:44:28 +01002921 serialized_session,
2922 serialized_session_len ) == 0 );
Hanno Becker861d0bb2019-05-21 16:39:30 +01002923 mbedtls_ssl_session_free( &session );
2924
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002925 /* Go through the bytes in the serialized session header and
2926 * corrupt them bit-by-bit. */
2927 for( cur_byte = 0; cur_byte < sizeof( should_corrupt_byte ); cur_byte++ )
Hanno Becker861d0bb2019-05-21 16:39:30 +01002928 {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002929 int cur_bit;
2930 unsigned char * const byte = &serialized_session[ cur_byte ];
2931
2932 if( should_corrupt_byte[ cur_byte ] == 0 )
2933 continue;
2934
2935 for( cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++ )
2936 {
2937 unsigned char const corrupted_bit = 0x1u << cur_bit;
2938 /* Modify a single bit in the serialized session. */
2939 *byte ^= corrupted_bit;
2940
2941 /* Attempt to deserialize */
2942 TEST_ASSERT( mbedtls_ssl_session_load( &session,
2943 serialized_session,
2944 serialized_session_len ) ==
Hanno Beckerf9b33032019-06-03 12:58:39 +01002945 MBEDTLS_ERR_SSL_VERSION_MISMATCH );
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002946
2947 /* Undo the change */
2948 *byte ^= corrupted_bit;
2949 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002950 }
2951
Hanno Becker861d0bb2019-05-21 16:39:30 +01002952}
2953/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002954
Andrzej Kurekb2980742020-02-02 19:25:26 -05002955/* 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 +01002956void mbedtls_endpoint_sanity( int endpoint_type )
2957{
2958 enum { BUFFSIZE = 1024 };
2959 mbedtls_endpoint ep;
2960 int ret = -1;
2961
Andrzej Kurekb2980742020-02-02 19:25:26 -05002962 ret = mbedtls_endpoint_init( NULL, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002963 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
2964
Andrzej Kurekb2980742020-02-02 19:25:26 -05002965 ret = mbedtls_endpoint_certificate_init( NULL, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002966 TEST_ASSERT( MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret );
2967
Andrzej Kurekb2980742020-02-02 19:25:26 -05002968 ret = mbedtls_endpoint_init( &ep, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002969 TEST_ASSERT( ret == 0 );
2970
2971exit:
2972 mbedtls_endpoint_free( &ep );
2973}
2974/* END_CASE */
2975
Andrzej Kurekb2980742020-02-02 19:25:26 -05002976/* 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 +01002977void move_handshake_to_state(int endpoint_type, int state, int need_pass)
2978{
2979 enum { BUFFSIZE = 1024 };
2980 mbedtls_endpoint base_ep, second_ep;
2981 int ret = -1;
2982
Andrzej Kurekb2980742020-02-02 19:25:26 -05002983 ret = mbedtls_endpoint_init( &base_ep, endpoint_type, MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002984 TEST_ASSERT( ret == 0 );
2985
2986 ret = mbedtls_endpoint_init( &second_ep,
2987 ( endpoint_type == MBEDTLS_SSL_IS_SERVER ) ?
Andrzej Kurekb2980742020-02-02 19:25:26 -05002988 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
2989 MBEDTLS_PK_RSA );
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002990 TEST_ASSERT( ret == 0 );
2991
2992 ret = mbedtls_mock_socket_connect( &(base_ep.socket),
2993 &(second_ep.socket),
2994 BUFFSIZE );
2995 TEST_ASSERT( ret == 0 );
2996
2997 ret = mbedtls_move_handshake_to_state( &(base_ep.ssl),
2998 &(second_ep.ssl),
2999 state );
3000 if( need_pass )
3001 {
3002 TEST_ASSERT( ret == 0 );
3003 TEST_ASSERT( base_ep.ssl.state == state );
3004 }
3005 else
3006 {
3007 TEST_ASSERT( ret != 0 );
3008 TEST_ASSERT( base_ep.ssl.state != state );
3009 }
3010
3011exit:
3012 mbedtls_endpoint_free( &base_ep );
3013 mbedtls_endpoint_free( &second_ep );
3014}
3015/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003016
3017/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15 */
3018void handshake( const char *cipher, int version, int pk_alg )
3019{
3020 /* forced_ciphersuite needs to last until the end of the handshake */
3021 int forced_ciphersuite[2];
3022 enum { BUFFSIZE = 1024 };
3023 mbedtls_endpoint client, server;
3024
3025 /* Client side */
3026 TEST_ASSERT( mbedtls_endpoint_init( &client, MBEDTLS_SSL_IS_CLIENT,
3027 pk_alg ) == 0 );
3028
3029 mbedtls_ssl_conf_min_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3030 version );
3031 mbedtls_ssl_conf_max_version( &client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3032 version );
3033
3034 if( strlen( cipher ) > 0 )
3035 {
3036 set_ciphersuite( &client.conf, cipher, forced_ciphersuite );
3037 }
3038 /* Server side */
3039 TEST_ASSERT( mbedtls_endpoint_init( &server, MBEDTLS_SSL_IS_SERVER,
3040 pk_alg ) == 0 );
3041
3042 mbedtls_ssl_conf_min_version( &server.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
3043 version );
3044
3045 TEST_ASSERT( mbedtls_mock_socket_connect( &(client.socket),
3046 &(server.socket),
3047 BUFFSIZE ) == 0 );
3048
3049 TEST_ASSERT( mbedtls_move_handshake_to_state( &(client.ssl),
3050 &(server.ssl),
3051 MBEDTLS_SSL_HANDSHAKE_OVER )
3052 == 0 );
3053 TEST_ASSERT( client.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3054 TEST_ASSERT( server.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER );
3055
3056exit:
3057 mbedtls_endpoint_free( &client );
3058 mbedtls_endpoint_free( &server );
3059}
3060/* END_CASE */