blob: 4a6c6fbf13f26c6629b1f0b829a4e0b99ecd93f7 [file] [log] [blame]
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +02002#include <mbedtls/ssl_internal.h>
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003#include <mbedtls/certs.h>
Andrzej Kurek941962e2020-02-07 09:20:32 -05004#include <mbedtls/timing.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005#include <mbedtls/debug.h>
Hanno Becker73c825a2020-09-08 10:52:58 +01006#include <ssl_tls13_keys.h>
Yanray Wang5fce1452022-10-24 14:42:01 +08007#include <test/ssl_helpers.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +01008
Gabor Mezeic0ae1cf2021-10-20 12:09:35 +02009#include <constant_time_internal.h>
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +020010
Manuel Pégourié-Gonnard9670a592020-07-10 10:21:46 +020011#include <test/constant_flow.h>
12
Andrzej Kurek01bdab32023-01-17 11:12:11 -050013#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
14 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
15 defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
16#define MBEDTLS_CAN_HANDLE_RSA_TEST_KEY
17#endif
18
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010019enum {
20#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
21 tls1_3_label_ ## name,
22 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +010023#undef MBEDTLS_SSL_TLS1_3_LABEL
Hanno Becker1413bd82020-09-09 12:46:09 +010024};
Hanno Becker70d7fb02020-09-09 10:11:21 +010025
Piotr Nowicki438bf3b2020-03-10 12:59:10 +010026/*
27 * This function can be passed to mbedtls to receive output logs from it. In
Yanray Wangabfdcd82022-10-25 16:44:13 +080028 * this case, it will count the instances of a mbedtls_test_ssl_log_pattern in the received
Piotr Nowickibde7ee82020-02-21 10:59:50 +010029 * logged messages.
30 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010031void log_analyzer(void *ctx, int level,
32 const char *file, int line,
33 const char *str)
Piotr Nowickibde7ee82020-02-21 10:59:50 +010034{
Yanray Wangabfdcd82022-10-25 16:44:13 +080035 mbedtls_test_ssl_log_pattern *p = (mbedtls_test_ssl_log_pattern *) ctx;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010036
37 (void) level;
38 (void) line;
39 (void) file;
40
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010041 if (NULL != p &&
Piotr Nowickibde7ee82020-02-21 10:59:50 +010042 NULL != p->pattern &&
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010043 NULL != strstr(str, p->pattern)) {
Piotr Nowickibde7ee82020-02-21 10:59:50 +010044 p->counter++;
45 }
46}
Janos Follath6264e662019-11-26 11:11:15 +000047
Yanray Wangabfdcd82022-10-25 16:44:13 +080048void init_handshake_options(mbedtls_test_handshake_test_options *opts)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050049{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010050 opts->cipher = "";
51 opts->client_min_version = TEST_SSL_MINOR_VERSION_NONE;
52 opts->client_max_version = TEST_SSL_MINOR_VERSION_NONE;
53 opts->server_min_version = TEST_SSL_MINOR_VERSION_NONE;
54 opts->server_max_version = TEST_SSL_MINOR_VERSION_NONE;
55 opts->expected_negotiated_version = MBEDTLS_SSL_MINOR_VERSION_3;
56 opts->pk_alg = MBEDTLS_PK_RSA;
57 opts->psk_str = NULL;
58 opts->dtls = 0;
59 opts->srv_auth_mode = MBEDTLS_SSL_VERIFY_NONE;
60 opts->serialize = 0;
61 opts->mfl = MBEDTLS_SSL_MAX_FRAG_LEN_NONE;
62 opts->cli_msg_len = 100;
63 opts->srv_msg_len = 100;
64 opts->expected_cli_fragments = 1;
65 opts->expected_srv_fragments = 1;
66 opts->renegotiate = 0;
67 opts->legacy_renegotiation = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION;
68 opts->srv_log_obj = NULL;
69 opts->srv_log_obj = NULL;
70 opts->srv_log_fun = NULL;
71 opts->cli_log_fun = NULL;
72 opts->resize_buffers = 1;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050073}
Janos Follath6264e662019-11-26 11:11:15 +000074
75/*
76 * Initialises \p buf. After calling this function it is safe to call
77 * `mbedtls_test_buffer_free()` on \p buf.
78 */
Yanray Wangabfdcd82022-10-25 16:44:13 +080079void mbedtls_test_buffer_init(mbedtls_test_ssl_buffer *buf)
Janos Follath6264e662019-11-26 11:11:15 +000080{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010081 memset(buf, 0, sizeof(*buf));
Janos Follath6264e662019-11-26 11:11:15 +000082}
83
84/*
85 * Sets up \p buf. After calling this function it is safe to call
86 * `mbedtls_test_buffer_put()` and `mbedtls_test_buffer_get()` on \p buf.
87 */
Yanray Wangabfdcd82022-10-25 16:44:13 +080088int mbedtls_test_buffer_setup(mbedtls_test_ssl_buffer *buf, size_t capacity)
Janos Follath6264e662019-11-26 11:11:15 +000089{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010090 buf->buffer = (unsigned char *) mbedtls_calloc(capacity,
91 sizeof(unsigned char));
92 if (NULL == buf->buffer) {
Janos Follath6264e662019-11-26 11:11:15 +000093 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010094 }
Janos Follath6264e662019-11-26 11:11:15 +000095 buf->capacity = capacity;
96
97 return 0;
98}
99
Yanray Wangabfdcd82022-10-25 16:44:13 +0800100void mbedtls_test_buffer_free(mbedtls_test_ssl_buffer *buf)
Janos Follath6264e662019-11-26 11:11:15 +0000101{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100102 if (buf->buffer != NULL) {
103 mbedtls_free(buf->buffer);
104 }
Janos Follath6264e662019-11-26 11:11:15 +0000105
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100106 memset(buf, 0, sizeof(*buf));
Janos Follath6264e662019-11-26 11:11:15 +0000107}
108
109/*
110 * Puts \p input_len bytes from the \p input buffer into the ring buffer \p buf.
111 *
112 * \p buf must have been initialized and set up by calling
113 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
114 *
115 * \retval \p input_len, if the data fits.
116 * \retval 0 <= value < \p input_len, if the data does not fit.
117 * \retval -1, if \p buf is NULL, it hasn't been set up or \p input_len is not
118 * zero and \p input is NULL.
119 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800120int mbedtls_test_buffer_put(mbedtls_test_ssl_buffer *buf,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100121 const unsigned char *input, size_t input_len)
Janos Follath6264e662019-11-26 11:11:15 +0000122{
123 size_t overflow = 0;
124
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100125 if ((buf == NULL) || (buf->buffer == NULL)) {
Janos Follath6264e662019-11-26 11:11:15 +0000126 return -1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100127 }
Janos Follath6264e662019-11-26 11:11:15 +0000128
129 /* Reduce input_len to a number that fits in the buffer. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100130 if ((buf->content_length + input_len) > buf->capacity) {
Janos Follath6264e662019-11-26 11:11:15 +0000131 input_len = buf->capacity - buf->content_length;
132 }
133
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100134 if (input == NULL) {
135 return (input_len == 0) ? 0 : -1;
Janos Follath6264e662019-11-26 11:11:15 +0000136 }
137
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100138 /* Check if the buffer has not come full circle and free space is not in
139 * the middle */
140 if (buf->start + buf->content_length < buf->capacity) {
Piotr Nowickifb437d72020-01-13 16:59:12 +0100141
142 /* Calculate the number of bytes that need to be placed at lower memory
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100143 * address */
144 if (buf->start + buf->content_length + input_len
145 > buf->capacity) {
146 overflow = (buf->start + buf->content_length + input_len)
147 % buf->capacity;
Piotr Nowickifb437d72020-01-13 16:59:12 +0100148 }
149
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100150 memcpy(buf->buffer + buf->start + buf->content_length, input,
151 input_len - overflow);
152 memcpy(buf->buffer, input + input_len - overflow, overflow);
Piotr Nowickifb437d72020-01-13 16:59:12 +0100153
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100154 } else {
Piotr Nowickifb437d72020-01-13 16:59:12 +0100155 /* The buffer has come full circle and free space is in the middle */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100156 memcpy(buf->buffer + buf->start + buf->content_length - buf->capacity,
157 input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000158 }
159
Janos Follath6264e662019-11-26 11:11:15 +0000160 buf->content_length += input_len;
Janos Follath6264e662019-11-26 11:11:15 +0000161 return input_len;
162}
163
164/*
Andrzej Kurekf7774142020-01-22 06:34:59 -0500165 * Gets \p output_len bytes from the ring buffer \p buf into the
166 * \p output buffer. The output buffer can be NULL, in this case a part of the
167 * ring buffer will be dropped, if the requested length is available.
Janos Follath6264e662019-11-26 11:11:15 +0000168 *
169 * \p buf must have been initialized and set up by calling
170 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
171 *
172 * \retval \p output_len, if the data is available.
173 * \retval 0 <= value < \p output_len, if the data is not available.
Andrzej Kurekf7774142020-01-22 06:34:59 -0500174 * \retval -1, if \buf is NULL or it hasn't been set up.
Janos Follath6264e662019-11-26 11:11:15 +0000175 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800176int mbedtls_test_buffer_get(mbedtls_test_ssl_buffer *buf,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100177 unsigned char *output, size_t output_len)
Janos Follath6264e662019-11-26 11:11:15 +0000178{
179 size_t overflow = 0;
180
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100181 if ((buf == NULL) || (buf->buffer == NULL)) {
Janos Follath6264e662019-11-26 11:11:15 +0000182 return -1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100183 }
Janos Follath6264e662019-11-26 11:11:15 +0000184
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100185 if (output == NULL && output_len == 0) {
Andrzej Kurekf7774142020-01-22 06:34:59 -0500186 return 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100187 }
Janos Follath6264e662019-11-26 11:11:15 +0000188
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100189 if (buf->content_length < output_len) {
Janos Follath6264e662019-11-26 11:11:15 +0000190 output_len = buf->content_length;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100191 }
Janos Follath6264e662019-11-26 11:11:15 +0000192
193 /* Calculate the number of bytes that need to be drawn from lower memory
194 * address */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100195 if (buf->start + output_len > buf->capacity) {
196 overflow = (buf->start + output_len) % buf->capacity;
Janos Follath6264e662019-11-26 11:11:15 +0000197 }
198
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100199 if (output != NULL) {
200 memcpy(output, buf->buffer + buf->start, output_len - overflow);
201 memcpy(output + output_len - overflow, buf->buffer, overflow);
Andrzej Kurekf7774142020-01-22 06:34:59 -0500202 }
203
Janos Follath6264e662019-11-26 11:11:15 +0000204 buf->content_length -= output_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100205 buf->start = (buf->start + output_len) % buf->capacity;
Janos Follath6264e662019-11-26 11:11:15 +0000206
207 return output_len;
208}
209
Hanno Beckera18d1322018-01-03 14:27:32 +0000210/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500211 * Errors used in the message transport mock tests
212 */
213 #define MBEDTLS_TEST_ERROR_ARG_NULL -11
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500214 #define MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED -44
215
216/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500217 * Setup and free functions for the message metadata queue.
218 *
219 * \p capacity describes the number of message metadata chunks that can be held
220 * within the queue.
221 *
222 * \retval 0, if a metadata queue of a given length can be allocated.
223 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation failed.
224 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800225int mbedtls_test_message_queue_setup(mbedtls_test_ssl_message_queue *queue,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100226 size_t capacity)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500227{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100228 queue->messages = (size_t *) mbedtls_calloc(capacity, sizeof(size_t));
229 if (NULL == queue->messages) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500230 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100231 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500232
233 queue->capacity = capacity;
234 queue->pos = 0;
235 queue->num = 0;
236
237 return 0;
238}
239
Yanray Wangabfdcd82022-10-25 16:44:13 +0800240void mbedtls_test_message_queue_free(mbedtls_test_ssl_message_queue *queue)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500241{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100242 if (queue == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500243 return;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100244 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500245
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100246 if (queue->messages != NULL) {
247 mbedtls_free(queue->messages);
248 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500249
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100250 memset(queue, 0, sizeof(*queue));
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500251}
252
253/*
254 * Push message length information onto the message metadata queue.
255 * This will become the last element to leave it (fifo).
256 *
257 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500258 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the queue is full.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500259 * \retval \p len, if the push was successful.
260 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800261int mbedtls_test_message_queue_push_info(mbedtls_test_ssl_message_queue *queue,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100262 size_t len)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500263{
264 int place;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100265 if (queue == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500266 return MBEDTLS_TEST_ERROR_ARG_NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100267 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500268
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100269 if (queue->num >= queue->capacity) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500270 return MBEDTLS_ERR_SSL_WANT_WRITE;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100271 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500272
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100273 place = (queue->pos + queue->num) % queue->capacity;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500274 queue->messages[place] = len;
275 queue->num++;
276 return len;
277}
278
279/*
280 * Pop information about the next message length from the queue. This will be
281 * the oldest inserted message length(fifo). \p msg_len can be null, in which
282 * case the data will be popped from the queue but not copied anywhere.
283 *
284 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500285 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500286 * \retval message length, if the pop was successful, up to the given
287 \p buf_len.
288 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800289int mbedtls_test_message_queue_pop_info(mbedtls_test_ssl_message_queue *queue,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100290 size_t buf_len)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500291{
292 size_t message_length;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100293 if (queue == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500294 return MBEDTLS_TEST_ERROR_ARG_NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100295 }
296 if (queue->num == 0) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500297 return MBEDTLS_ERR_SSL_WANT_READ;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100298 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500299
300 message_length = queue->messages[queue->pos];
301 queue->messages[queue->pos] = 0;
302 queue->num--;
303 queue->pos++;
304 queue->pos %= queue->capacity;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100305 if (queue->pos < 0) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500306 queue->pos += queue->capacity;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100307 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500308
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100309 return (message_length > buf_len) ? buf_len : message_length;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500310}
311
312/*
313 * Take a peek on the info about the next message length from the queue.
314 * This will be the oldest inserted message length(fifo).
315 *
316 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500317 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500318 * \retval 0, if the peek was successful.
319 * \retval MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
320 * too small to fit the message. In this case the \p msg_len will be
321 * set to the full message length so that the
322 * caller knows what portion of the message can be dropped.
323 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800324int mbedtls_test_message_queue_peek_info(mbedtls_test_ssl_message_queue *queue,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100325 size_t buf_len, size_t *msg_len)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500326{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100327 if (queue == NULL || msg_len == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500328 return MBEDTLS_TEST_ERROR_ARG_NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100329 }
330 if (queue->num == 0) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500331 return MBEDTLS_ERR_SSL_WANT_READ;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100332 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500333
334 *msg_len = queue->messages[queue->pos];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100335 return (*msg_len > buf_len) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500336}
Janos Follath031827f2019-11-27 11:12:14 +0000337
338/*
339 * Setup and teardown functions for mock sockets.
340 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800341void mbedtls_mock_socket_init(mbedtls_test_mock_socket *socket)
Janos Follath031827f2019-11-27 11:12:14 +0000342{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100343 memset(socket, 0, sizeof(*socket));
Janos Follath031827f2019-11-27 11:12:14 +0000344}
345
346/*
347 * Closes the socket \p socket.
348 *
349 * \p socket must have been previously initialized by calling
350 * mbedtls_mock_socket_init().
351 *
352 * This function frees all allocated resources and both sockets are aware of the
353 * new connection state.
354 *
355 * That is, this function does not simulate half-open TCP connections and the
356 * phenomenon that when closing a UDP connection the peer is not aware of the
357 * connection having been closed.
358 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800359void mbedtls_mock_socket_close(mbedtls_test_mock_socket *socket)
Janos Follath031827f2019-11-27 11:12:14 +0000360{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100361 if (socket == NULL) {
Janos Follath031827f2019-11-27 11:12:14 +0000362 return;
Janos Follath031827f2019-11-27 11:12:14 +0000363 }
364
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100365 if (socket->input != NULL) {
366 mbedtls_test_buffer_free(socket->input);
367 mbedtls_free(socket->input);
Janos Follath031827f2019-11-27 11:12:14 +0000368 }
369
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100370 if (socket->output != NULL) {
371 mbedtls_test_buffer_free(socket->output);
372 mbedtls_free(socket->output);
373 }
Janos Follath031827f2019-11-27 11:12:14 +0000374
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100375 if (socket->peer != NULL) {
376 memset(socket->peer, 0, sizeof(*socket->peer));
377 }
378
379 memset(socket, 0, sizeof(*socket));
Janos Follath031827f2019-11-27 11:12:14 +0000380}
381
382/*
383 * Establishes a connection between \p peer1 and \p peer2.
384 *
385 * \p peer1 and \p peer2 must have been previously initialized by calling
386 * mbedtls_mock_socket_init().
387 *
Tom Cosgrove49f99bc2022-12-04 16:44:21 +0000388 * The capacities of the internal buffers are set to \p bufsize. Setting this to
Janos Follath031827f2019-11-27 11:12:14 +0000389 * the correct value allows for simulation of MTU, sanity testing the mock
390 * implementation and mocking TCP connections with lower memory cost.
391 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800392int mbedtls_mock_socket_connect(mbedtls_test_mock_socket *peer1,
393 mbedtls_test_mock_socket *peer2,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100394 size_t bufsize)
Janos Follath031827f2019-11-27 11:12:14 +0000395{
396 int ret = -1;
397
Piotr Nowickid796e192020-01-28 12:09:47 +0100398 peer1->output =
Yanray Wangabfdcd82022-10-25 16:44:13 +0800399 (mbedtls_test_ssl_buffer *) mbedtls_calloc(1, sizeof(mbedtls_test_ssl_buffer));
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100400 if (peer1->output == NULL) {
Janos Follath031827f2019-11-27 11:12:14 +0000401 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
402 goto exit;
403 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100404 mbedtls_test_buffer_init(peer1->output);
405 if (0 != (ret = mbedtls_test_buffer_setup(peer1->output, bufsize))) {
Janos Follath031827f2019-11-27 11:12:14 +0000406 goto exit;
407 }
408
Piotr Nowickid796e192020-01-28 12:09:47 +0100409 peer2->output =
Yanray Wangabfdcd82022-10-25 16:44:13 +0800410 (mbedtls_test_ssl_buffer *) mbedtls_calloc(1, sizeof(mbedtls_test_ssl_buffer));
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100411 if (peer2->output == NULL) {
Piotr Nowickid796e192020-01-28 12:09:47 +0100412 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
413 goto exit;
414 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100415 mbedtls_test_buffer_init(peer2->output);
416 if (0 != (ret = mbedtls_test_buffer_setup(peer2->output, bufsize))) {
Piotr Nowickid796e192020-01-28 12:09:47 +0100417 goto exit;
418 }
419
Janos Follath031827f2019-11-27 11:12:14 +0000420 peer1->peer = peer2;
421 peer2->peer = peer1;
Piotr Nowickid796e192020-01-28 12:09:47 +0100422 peer1->input = peer2->output;
423 peer2->input = peer1->output;
Janos Follath031827f2019-11-27 11:12:14 +0000424
425 peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
426 ret = 0;
427
428exit:
429
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100430 if (ret != 0) {
431 mbedtls_mock_socket_close(peer1);
432 mbedtls_mock_socket_close(peer2);
Janos Follath031827f2019-11-27 11:12:14 +0000433 }
434
435 return ret;
436}
437
438/*
439 * Callbacks for simulating blocking I/O over connection-oriented transport.
440 */
441
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100442int mbedtls_mock_tcp_send_b(void *ctx, const unsigned char *buf, size_t len)
Janos Follath031827f2019-11-27 11:12:14 +0000443{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800444 mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
Janos Follath031827f2019-11-27 11:12:14 +0000445
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100446 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath031827f2019-11-27 11:12:14 +0000447 return -1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100448 }
Janos Follath031827f2019-11-27 11:12:14 +0000449
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100450 return mbedtls_test_buffer_put(socket->output, buf, len);
Janos Follath031827f2019-11-27 11:12:14 +0000451}
452
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100453int mbedtls_mock_tcp_recv_b(void *ctx, unsigned char *buf, size_t len)
Janos Follath031827f2019-11-27 11:12:14 +0000454{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800455 mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
Janos Follath031827f2019-11-27 11:12:14 +0000456
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100457 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath031827f2019-11-27 11:12:14 +0000458 return -1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100459 }
Janos Follath031827f2019-11-27 11:12:14 +0000460
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100461 return mbedtls_test_buffer_get(socket->input, buf, len);
Janos Follath031827f2019-11-27 11:12:14 +0000462}
463
464/*
Janos Follath3766ba52019-11-27 13:31:42 +0000465 * Callbacks for simulating non-blocking I/O over connection-oriented transport.
466 */
467
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100468int mbedtls_mock_tcp_send_nb(void *ctx, const unsigned char *buf, size_t len)
Janos Follath3766ba52019-11-27 13:31:42 +0000469{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800470 mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
Janos Follath3766ba52019-11-27 13:31:42 +0000471
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100472 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath3766ba52019-11-27 13:31:42 +0000473 return -1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100474 }
Janos Follath3766ba52019-11-27 13:31:42 +0000475
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100476 if (socket->output->capacity == socket->output->content_length) {
Janos Follath3766ba52019-11-27 13:31:42 +0000477 return MBEDTLS_ERR_SSL_WANT_WRITE;
478 }
479
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100480 return mbedtls_test_buffer_put(socket->output, buf, len);
Janos Follath3766ba52019-11-27 13:31:42 +0000481}
482
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100483int mbedtls_mock_tcp_recv_nb(void *ctx, unsigned char *buf, size_t len)
Janos Follath3766ba52019-11-27 13:31:42 +0000484{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800485 mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
Janos Follath3766ba52019-11-27 13:31:42 +0000486
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100487 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath3766ba52019-11-27 13:31:42 +0000488 return -1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100489 }
Janos Follath3766ba52019-11-27 13:31:42 +0000490
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100491 if (socket->input->content_length == 0) {
Janos Follath3766ba52019-11-27 13:31:42 +0000492 return MBEDTLS_ERR_SSL_WANT_READ;
493 }
494
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100495 return mbedtls_test_buffer_get(socket->input, buf, len);
Janos Follath3766ba52019-11-27 13:31:42 +0000496}
497
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100498void mbedtls_message_socket_init(mbedtls_test_message_socket_context *ctx)
Andrzej Kurek45916ba2020-03-05 14:46:22 -0500499{
500 ctx->queue_input = NULL;
501 ctx->queue_output = NULL;
502 ctx->socket = NULL;
503}
504
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500505/*
Tom Cosgrove49f99bc2022-12-04 16:44:21 +0000506 * Setup a given message socket context including initialization of
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500507 * input/output queues to a chosen capacity of messages. Also set the
508 * corresponding mock socket.
509 *
510 * \retval 0, if everything succeeds.
511 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation of a message
512 * queue failed.
513 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800514int mbedtls_message_socket_setup(mbedtls_test_ssl_message_queue *queue_input,
515 mbedtls_test_ssl_message_queue *queue_output,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100516 size_t queue_capacity,
Yanray Wangabfdcd82022-10-25 16:44:13 +0800517 mbedtls_test_mock_socket *socket,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100518 mbedtls_test_message_socket_context *ctx)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500519{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100520 int ret = mbedtls_test_message_queue_setup(queue_input, queue_capacity);
521 if (ret != 0) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500522 return ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100523 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500524 ctx->queue_input = queue_input;
525 ctx->queue_output = queue_output;
526 ctx->socket = socket;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100527 mbedtls_mock_socket_init(socket);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500528
529 return 0;
530}
531
532/*
533 * Close a given message socket context, along with the socket itself. Free the
534 * memory allocated by the input queue.
535 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100536void mbedtls_message_socket_close(mbedtls_test_message_socket_context *ctx)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500537{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100538 if (ctx == NULL) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500539 return;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100540 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500541
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100542 mbedtls_test_message_queue_free(ctx->queue_input);
543 mbedtls_mock_socket_close(ctx->socket);
544 memset(ctx, 0, sizeof(*ctx));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500545}
546
547/*
548 * Send one message through a given message socket context.
549 *
550 * \retval \p len, if everything succeeds.
551 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
552 * elements or the context itself is null.
553 * \retval MBEDTLS_TEST_ERROR_SEND_FAILED if mbedtls_mock_tcp_send_b failed.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500554 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the output queue is full.
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500555 *
556 * This function will also return any error from
557 * mbedtls_test_message_queue_push_info.
558 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100559int mbedtls_mock_tcp_send_msg(void *ctx, const unsigned char *buf, size_t len)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500560{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800561 mbedtls_test_ssl_message_queue *queue;
562 mbedtls_test_mock_socket *socket;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100563 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context *) ctx;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500564
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100565 if (context == NULL || context->socket == NULL
566 || context->queue_output == NULL) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500567 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
568 }
569
570 queue = context->queue_output;
571 socket = context->socket;
572
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100573 if (queue->num >= queue->capacity) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500574 return MBEDTLS_ERR_SSL_WANT_WRITE;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100575 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500576
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100577 if (mbedtls_mock_tcp_send_b(socket, buf, len) != (int) len) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500578 return MBEDTLS_TEST_ERROR_SEND_FAILED;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100579 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500580
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100581 return mbedtls_test_message_queue_push_info(queue, len);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500582}
583
584/*
585 * Receive one message from a given message socket context and return message
586 * length or an error.
587 *
588 * \retval message length, if everything succeeds.
589 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
590 * elements or the context itself is null.
591 * \retval MBEDTLS_TEST_ERROR_RECV_FAILED if mbedtls_mock_tcp_recv_b failed.
592 *
593 * This function will also return any error other than
594 * MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED from mbedtls_test_message_queue_peek_info.
595 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100596int mbedtls_mock_tcp_recv_msg(void *ctx, unsigned char *buf, size_t buf_len)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500597{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800598 mbedtls_test_ssl_message_queue *queue;
599 mbedtls_test_mock_socket *socket;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100600 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context *) ctx;
Gilles Peskine19e841e2020-03-09 20:43:51 +0100601 size_t drop_len = 0;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500602 size_t msg_len;
603 int ret;
604
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100605 if (context == NULL || context->socket == NULL
606 || context->queue_input == NULL) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500607 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
608 }
609
610 queue = context->queue_input;
611 socket = context->socket;
612
613 /* Peek first, so that in case of a socket error the data remains in
614 * the queue. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100615 ret = mbedtls_test_message_queue_peek_info(queue, buf_len, &msg_len);
616 if (ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500617 /* Calculate how much to drop */
618 drop_len = msg_len - buf_len;
619
620 /* Set the requested message len to be buffer length */
621 msg_len = buf_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100622 } else if (ret != 0) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500623 return ret;
624 }
625
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100626 if (mbedtls_mock_tcp_recv_b(socket, buf, msg_len) != (int) msg_len) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500627 return MBEDTLS_TEST_ERROR_RECV_FAILED;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100628 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500629
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100630 if (ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500631 /* Drop the remaining part of the message */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100632 if (mbedtls_mock_tcp_recv_b(socket, NULL, drop_len) != (int) drop_len) {
633 /* Inconsistent state - part of the message was read,
634 * and a part couldn't. Not much we can do here, but it should not
635 * happen in test environment, unless forced manually. */
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500636 }
637 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100638 mbedtls_test_message_queue_pop_info(queue, buf_len);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500639
640 return msg_len;
641}
642
Andrzej Kurek9155e7f2022-10-18 09:36:19 -0400643#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
Gilles Peskine33d03fe2023-02-01 18:37:49 +0100644 defined(MBEDTLS_CERTS_C) && \
Manuel Pégourié-Gonnardd12402f2020-05-20 10:34:25 +0200645 defined(MBEDTLS_ENTROPY_C) && \
646 defined(MBEDTLS_CTR_DRBG_C)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100647
648/*
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400649 * Deinitializes certificates from endpoint represented by \p ep.
650 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800651void mbedtls_endpoint_certificate_free(mbedtls_test_ssl_endpoint *ep)
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400652{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800653 mbedtls_test_ssl_endpoint_certificate *cert = &(ep->cert);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100654 if (cert != NULL) {
655 if (cert->ca_cert != NULL) {
656 mbedtls_x509_crt_free(cert->ca_cert);
657 mbedtls_free(cert->ca_cert);
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400658 cert->ca_cert = NULL;
659 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100660 if (cert->cert != NULL) {
661 mbedtls_x509_crt_free(cert->cert);
662 mbedtls_free(cert->cert);
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400663 cert->cert = NULL;
664 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100665 if (cert->pkey != NULL) {
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400666#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100667 if (mbedtls_pk_get_type(cert->pkey) == MBEDTLS_PK_OPAQUE) {
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400668 mbedtls_svc_key_id_t *key_slot = cert->pkey->pk_ctx;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100669 psa_destroy_key(*key_slot);
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400670 }
671#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100672 mbedtls_pk_free(cert->pkey);
673 mbedtls_free(cert->pkey);
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400674 cert->pkey = NULL;
675 }
676 }
677}
678
679/*
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100680 * Initializes \p ep_cert structure and assigns it to endpoint
681 * represented by \p ep.
682 *
683 * \retval 0 on success, otherwise error code.
684 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800685int mbedtls_endpoint_certificate_init(mbedtls_test_ssl_endpoint *ep, int pk_alg)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100686{
687 int i = 0;
688 int ret = -1;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800689 mbedtls_test_ssl_endpoint_certificate *cert = NULL;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100690
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100691 if (ep == NULL) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100692 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
693 }
694
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100695 cert = &(ep->cert);
696 ASSERT_ALLOC(cert->ca_cert, 1);
697 ASSERT_ALLOC(cert->cert, 1);
698 ASSERT_ALLOC(cert->pkey, 1);
Andrzej Kurek0d2982b2022-10-18 07:55:46 -0400699
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100700 mbedtls_x509_crt_init(cert->ca_cert);
701 mbedtls_x509_crt_init(cert->cert);
702 mbedtls_pk_init(cert->pkey);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100703
704 /* Load the trusted CA */
705
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100706 for (i = 0; mbedtls_test_cas_der[i] != NULL; i++) {
707 ret = mbedtls_x509_crt_parse_der(cert->ca_cert,
708 (const unsigned char *) mbedtls_test_cas_der[i],
709 mbedtls_test_cas_der_len[i]);
710 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100711 }
712
713 /* Load own certificate and private key */
714
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100715 if (ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER) {
716 if (pk_alg == MBEDTLS_PK_RSA) {
717 ret = mbedtls_x509_crt_parse(cert->cert,
718 (const unsigned char *) mbedtls_test_srv_crt_rsa_sha256_der,
719 mbedtls_test_srv_crt_rsa_sha256_der_len);
720 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100721
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100722 ret = mbedtls_pk_parse_key(cert->pkey,
723 (const unsigned char *) mbedtls_test_srv_key_rsa_der,
724 mbedtls_test_srv_key_rsa_der_len, NULL, 0);
725 TEST_ASSERT(ret == 0);
726 } else {
727 ret = mbedtls_x509_crt_parse(cert->cert,
728 (const unsigned char *) mbedtls_test_srv_crt_ec_der,
729 mbedtls_test_srv_crt_ec_der_len);
730 TEST_ASSERT(ret == 0);
731
732 ret = mbedtls_pk_parse_key(cert->pkey,
733 (const unsigned char *) mbedtls_test_srv_key_ec_der,
734 mbedtls_test_srv_key_ec_der_len, NULL, 0);
735 TEST_ASSERT(ret == 0);
Andrzej Kurekb2980742020-02-02 19:25:26 -0500736 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100737 } else {
738 if (pk_alg == MBEDTLS_PK_RSA) {
739 ret = mbedtls_x509_crt_parse(cert->cert,
740 (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
741 mbedtls_test_cli_crt_rsa_der_len);
742 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100743
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100744 ret = mbedtls_pk_parse_key(cert->pkey,
745 (const unsigned char *) mbedtls_test_cli_key_rsa_der,
746 mbedtls_test_cli_key_rsa_der_len, NULL, 0);
747 TEST_ASSERT(ret == 0);
748 } else {
749 ret = mbedtls_x509_crt_parse(cert->cert,
750 (const unsigned char *) mbedtls_test_cli_crt_ec_der,
751 mbedtls_test_cli_crt_ec_len);
752 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100753
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100754 ret = mbedtls_pk_parse_key(cert->pkey,
755 (const unsigned char *) mbedtls_test_cli_key_ec_der,
756 mbedtls_test_cli_key_ec_der_len, NULL, 0);
757 TEST_ASSERT(ret == 0);
Andrzej Kurekb2980742020-02-02 19:25:26 -0500758 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100759 }
760
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100761 mbedtls_ssl_conf_ca_chain(&(ep->conf), cert->ca_cert, NULL);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100762
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100763 ret = mbedtls_ssl_conf_own_cert(&(ep->conf), cert->cert,
764 cert->pkey);
765 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100766
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100767exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100768 if (ret != 0) {
769 mbedtls_endpoint_certificate_free(ep);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100770 }
771
772 return ret;
773}
774
775/*
776 * Initializes \p ep structure. It is important to call `mbedtls_endpoint_free()`
777 * after calling this function even if it fails.
778 *
779 * \p endpoint_type must be set as MBEDTLS_SSL_IS_SERVER or
780 * MBEDTLS_SSL_IS_CLIENT.
Andrzej Kurek15daf502020-02-12 09:17:52 -0500781 * \p pk_alg the algorithm to use, currently only MBEDTLS_PK_RSA and
782 * MBEDTLS_PK_ECDSA are supported.
783 * \p dtls_context - in case of DTLS - this is the context handling metadata.
784 * \p input_queue - used only in case of DTLS.
785 * \p output_queue - used only in case of DTLS.
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100786 *
787 * \retval 0 on success, otherwise error code.
788 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800789int mbedtls_endpoint_init(mbedtls_test_ssl_endpoint *ep, int endpoint_type, int pk_alg,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100790 mbedtls_test_message_socket_context *dtls_context,
Yanray Wangabfdcd82022-10-25 16:44:13 +0800791 mbedtls_test_ssl_message_queue *input_queue,
792 mbedtls_test_ssl_message_queue *output_queue,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100793 const mbedtls_ecp_group_id *curves)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100794{
795 int ret = -1;
796
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100797 if (dtls_context != NULL && (input_queue == NULL || output_queue == NULL)) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100798 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Andrzej Kurek15daf502020-02-12 09:17:52 -0500799 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100800
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100801 if (ep == NULL) {
802 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
803 }
804
805 memset(ep, 0, sizeof(*ep));
806
807 ep->name = (endpoint_type == MBEDTLS_SSL_IS_SERVER) ? "Server" : "Client";
808
809 mbedtls_ssl_init(&(ep->ssl));
810 mbedtls_ssl_config_init(&(ep->conf));
811 mbedtls_ctr_drbg_init(&(ep->ctr_drbg));
812 mbedtls_ssl_conf_rng(&(ep->conf),
813 mbedtls_ctr_drbg_random,
814 &(ep->ctr_drbg));
815 mbedtls_entropy_init(&(ep->entropy));
816 if (dtls_context != NULL) {
817 TEST_ASSERT(mbedtls_message_socket_setup(input_queue, output_queue,
818 100, &(ep->socket),
819 dtls_context) == 0);
820 } else {
821 mbedtls_mock_socket_init(&(ep->socket));
822 }
823
824 ret = mbedtls_ctr_drbg_seed(&(ep->ctr_drbg), mbedtls_entropy_func,
825 &(ep->entropy), (const unsigned char *) (ep->name),
826 strlen(ep->name));
827 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100828
829 /* Non-blocking callbacks without timeout */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100830 if (dtls_context != NULL) {
831 mbedtls_ssl_set_bio(&(ep->ssl), dtls_context,
832 mbedtls_mock_tcp_send_msg,
833 mbedtls_mock_tcp_recv_msg,
834 NULL);
835 } else {
836 mbedtls_ssl_set_bio(&(ep->ssl), &(ep->socket),
837 mbedtls_mock_tcp_send_nb,
838 mbedtls_mock_tcp_recv_nb,
839 NULL);
Andrzej Kurek15daf502020-02-12 09:17:52 -0500840 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100841
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100842 ret = mbedtls_ssl_config_defaults(&(ep->conf), endpoint_type,
843 (dtls_context != NULL) ?
844 MBEDTLS_SSL_TRANSPORT_DATAGRAM :
845 MBEDTLS_SSL_TRANSPORT_STREAM,
846 MBEDTLS_SSL_PRESET_DEFAULT);
847 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100848
Andrzej Kurek96bf3d12022-04-15 07:35:16 -0400849#if defined(MBEDTLS_ECP_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100850 if (curves != NULL) {
851 mbedtls_ssl_conf_curves(&(ep->conf), curves);
852 }
Andrzej Kurek96bf3d12022-04-15 07:35:16 -0400853#else
854 (void) curves;
855#endif
Andrzej Kurek535cd172022-03-08 06:50:12 -0500856
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100857 ret = mbedtls_ssl_setup(&(ep->ssl), &(ep->conf));
858 TEST_ASSERT(ret == 0);
Andrzej Kurek15daf502020-02-12 09:17:52 -0500859
860#if defined(MBEDTLS_SSL_PROTO_DTLS) && defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100861 if (endpoint_type == MBEDTLS_SSL_IS_SERVER && dtls_context != NULL) {
862 mbedtls_ssl_conf_dtls_cookies(&(ep->conf), NULL, NULL, NULL);
863 }
Andrzej Kurek15daf502020-02-12 09:17:52 -0500864#endif
865
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100866 ret = mbedtls_endpoint_certificate_init(ep, pk_alg);
867 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100868
869exit:
870 return ret;
871}
872
873/*
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100874 * Deinitializes endpoint represented by \p ep.
875 */
Yanray Wangabfdcd82022-10-25 16:44:13 +0800876void mbedtls_endpoint_free(mbedtls_test_ssl_endpoint *ep,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100877 mbedtls_test_message_socket_context *context)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100878{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100879 mbedtls_endpoint_certificate_free(ep);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100880
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100881 mbedtls_ssl_free(&(ep->ssl));
882 mbedtls_ssl_config_free(&(ep->conf));
883 mbedtls_ctr_drbg_free(&(ep->ctr_drbg));
884 mbedtls_entropy_free(&(ep->entropy));
Andrzej Kurek15daf502020-02-12 09:17:52 -0500885
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100886 if (context != NULL) {
887 mbedtls_message_socket_close(context);
888 } else {
889 mbedtls_mock_socket_close(&(ep->socket));
Andrzej Kurek15daf502020-02-12 09:17:52 -0500890 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100891}
892
893/*
894 * This function moves ssl handshake from \p ssl to prescribed \p state.
895 * /p second_ssl is used as second endpoint and their sockets have to be
896 * connected before calling this function.
897 *
898 * \retval 0 on success, otherwise error code.
899 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100900int mbedtls_move_handshake_to_state(mbedtls_ssl_context *ssl,
901 mbedtls_ssl_context *second_ssl,
902 int state)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100903{
904 enum { BUFFSIZE = 1024 };
905 int max_steps = 1000;
906 int ret = 0;
907
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100908 if (ssl == NULL || second_ssl == NULL) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100909 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
910 }
911
912 /* Perform communication via connected sockets */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100913 while ((ssl->state != state) && (--max_steps >= 0)) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100914 /* If /p second_ssl ends the handshake procedure before /p ssl then
915 * there is no need to call the next step */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100916 if (second_ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) {
917 ret = mbedtls_ssl_handshake_step(second_ssl);
918 if (ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
919 ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100920 return ret;
921 }
922 }
923
924 /* We only care about the \p ssl state and returns, so we call it last,
925 * to leave the iteration as soon as the state is as expected. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100926 ret = mbedtls_ssl_handshake_step(ssl);
927 if (ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
928 ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100929 return ret;
930 }
931 }
932
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100933 return (max_steps >= 0) ? ret : -1;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100934}
935
Gilles Peskine33d03fe2023-02-01 18:37:49 +0100936#endif \
937 /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100938
Janos Follath3766ba52019-11-27 13:31:42 +0000939/*
Piotr Nowicki438bf3b2020-03-10 12:59:10 +0100940 * Write application data. Increase write counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100941 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100942int mbedtls_ssl_write_fragment(mbedtls_ssl_context *ssl, unsigned char *buf,
943 int buf_len, int *written,
944 const int expected_fragments)
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100945{
Dave Rodgmancd09d682023-02-24 15:41:55 +0000946 /* Verify that calling mbedtls_ssl_write with a NULL buffer and zero length is
947 * a valid no-op for TLS connections. */
948 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
949 TEST_ASSERT(mbedtls_ssl_write(ssl, NULL, 0) == 0);
950 }
951
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100952 int ret = mbedtls_ssl_write(ssl, buf + *written, buf_len - *written);
953 if (ret > 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100954 *written += ret;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100955 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100956
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100957 if (expected_fragments == 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100958 /* Used for DTLS and the message size larger than MFL. In that case
959 * the message can not be fragmented and the library should return
960 * MBEDTLS_ERR_SSL_BAD_INPUT_DATA error. This error must be returned
961 * to prevent a dead loop inside mbedtls_exchange_data(). */
962 return ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100963 } else if (expected_fragments == 1) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100964 /* Used for TLS/DTLS and the message size lower than MFL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100965 TEST_ASSERT(ret == buf_len ||
966 ret == MBEDTLS_ERR_SSL_WANT_READ ||
967 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
968 } else {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100969 /* Used for TLS and the message size larger than MFL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100970 TEST_ASSERT(expected_fragments > 1);
971 TEST_ASSERT((ret >= 0 && ret <= buf_len) ||
972 ret == MBEDTLS_ERR_SSL_WANT_READ ||
973 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +0100974 }
975
976 return 0;
977
978exit:
979 /* Some of the tests failed */
980 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100981}
982
983/*
Piotr Nowicki438bf3b2020-03-10 12:59:10 +0100984 * Read application data and increase read counter and fragments counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100985 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100986int mbedtls_ssl_read_fragment(mbedtls_ssl_context *ssl, unsigned char *buf,
987 int buf_len, int *read,
988 int *fragments, const int expected_fragments)
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100989{
Dave Rodgmancd09d682023-02-24 15:41:55 +0000990 /* Verify that calling mbedtls_ssl_write with a NULL buffer and zero length is
991 * a valid no-op for TLS connections. */
992 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
993 TEST_ASSERT(mbedtls_ssl_read(ssl, NULL, 0) == 0);
994 }
995
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100996 int ret = mbedtls_ssl_read(ssl, buf + *read, buf_len - *read);
997 if (ret > 0) {
998 (*fragments)++;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +0100999 *read += ret;
1000 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001001
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001002 if (expected_fragments == 0) {
1003 TEST_ASSERT(ret == 0);
1004 } else if (expected_fragments == 1) {
1005 TEST_ASSERT(ret == buf_len ||
1006 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1007 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
1008 } else {
1009 TEST_ASSERT(expected_fragments > 1);
1010 TEST_ASSERT((ret >= 0 && ret <= buf_len) ||
1011 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1012 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001013 }
1014
1015 return 0;
1016
1017exit:
1018 /* Some of the tests failed */
1019 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001020}
1021
1022/*
Hanno Beckera18d1322018-01-03 14:27:32 +00001023 * Helper function setting up inverse record transformations
1024 * using given cipher, hash, EtM mode, authentication tag length,
1025 * and version.
1026 */
1027
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001028#define CHK(x) \
Hanno Beckera18d1322018-01-03 14:27:32 +00001029 do \
1030 { \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001031 if (!(x)) \
Hanno Becker81e16a32019-03-01 11:21:44 +00001032 { \
Hanno Beckera5780f12019-04-05 09:55:37 +01001033 ret = -1; \
Hanno Becker81e16a32019-03-01 11:21:44 +00001034 goto cleanup; \
1035 } \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001036 } while (0)
Hanno Beckera18d1322018-01-03 14:27:32 +00001037
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001038void set_ciphersuite(mbedtls_ssl_config *conf, const char *cipher,
1039 int *forced_ciphersuite)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001040{
1041 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001042 forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id(cipher);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001043 forced_ciphersuite[1] = 0;
1044
1045 ciphersuite_info =
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001046 mbedtls_ssl_ciphersuite_from_id(forced_ciphersuite[0]);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001047
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001048 TEST_ASSERT(ciphersuite_info != NULL);
1049 TEST_ASSERT(ciphersuite_info->min_minor_ver <= conf->max_minor_ver);
1050 TEST_ASSERT(ciphersuite_info->max_minor_ver >= conf->min_minor_ver);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001051
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001052 if (conf->max_minor_ver > ciphersuite_info->max_minor_ver) {
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001053 conf->max_minor_ver = ciphersuite_info->max_minor_ver;
1054 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001055 if (conf->min_minor_ver < ciphersuite_info->min_minor_ver) {
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001056 conf->min_minor_ver = ciphersuite_info->min_minor_ver;
1057 }
1058
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001059 mbedtls_ssl_conf_ciphersuites(conf, forced_ciphersuite);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001060
1061exit:
1062 return;
1063}
1064
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001065int psk_dummy_callback(void *p_info, mbedtls_ssl_context *ssl,
1066 const unsigned char *name, size_t name_len)
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05001067{
1068 (void) p_info;
1069 (void) ssl;
1070 (void) name;
1071 (void) name_len;
1072
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001073 return 0;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05001074}
1075
Hanno Beckerd856c822019-04-29 17:30:59 +01001076#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
1077#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
1078#else
1079#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
1080#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001081
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001082static int build_transforms(mbedtls_ssl_transform *t_in,
1083 mbedtls_ssl_transform *t_out,
1084 int cipher_type, int hash_id,
1085 int etm, int tag_mode, int ver,
1086 size_t cid0_len,
1087 size_t cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00001088{
1089 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +01001090 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +00001091
1092 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +00001093 unsigned char *key0 = NULL, *key1 = NULL;
Paul Elliott6f1eda72020-06-11 20:22:00 +01001094 unsigned char *md0 = NULL, *md1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001095 unsigned char iv_enc[16], iv_dec[16];
1096
Hanno Beckera0e20d02019-05-15 14:03:01 +01001097#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001098 unsigned char cid0[SSL_CID_LEN_MIN];
1099 unsigned char cid1[SSL_CID_LEN_MIN];
Hanno Beckerd856c822019-04-29 17:30:59 +01001100
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001101 mbedtls_test_rnd_std_rand(NULL, cid0, sizeof(cid0));
1102 mbedtls_test_rnd_std_rand(NULL, cid1, sizeof(cid1));
Hanno Becker43c24b82019-05-01 09:45:57 +01001103#else
1104 ((void) cid0_len);
1105 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +01001106#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001107
Hanno Beckera18d1322018-01-03 14:27:32 +00001108 maclen = 0;
1109
1110 /* Pick cipher */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001111 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
1112 CHK(cipher_info != NULL);
1113 CHK(cipher_info->iv_size <= 16);
1114 CHK(cipher_info->key_bitlen % 8 == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001115
1116 /* Pick keys */
1117 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +01001118 /* Allocate `keylen + 1` bytes to ensure that we get
1119 * a non-NULL pointers from `mbedtls_calloc` even if
1120 * `keylen == 0` in the case of the NULL cipher. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001121 CHK((key0 = mbedtls_calloc(1, keylen + 1)) != NULL);
1122 CHK((key1 = mbedtls_calloc(1, keylen + 1)) != NULL);
1123 memset(key0, 0x1, keylen);
1124 memset(key1, 0x2, keylen);
Hanno Beckera18d1322018-01-03 14:27:32 +00001125
1126 /* Setup cipher contexts */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001127 CHK(mbedtls_cipher_setup(&t_in->cipher_ctx_enc, cipher_info) == 0);
1128 CHK(mbedtls_cipher_setup(&t_in->cipher_ctx_dec, cipher_info) == 0);
1129 CHK(mbedtls_cipher_setup(&t_out->cipher_ctx_enc, cipher_info) == 0);
1130 CHK(mbedtls_cipher_setup(&t_out->cipher_ctx_dec, cipher_info) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001131
1132#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001133 if (cipher_info->mode == MBEDTLS_MODE_CBC) {
1134 CHK(mbedtls_cipher_set_padding_mode(&t_in->cipher_ctx_enc,
1135 MBEDTLS_PADDING_NONE) == 0);
1136 CHK(mbedtls_cipher_set_padding_mode(&t_in->cipher_ctx_dec,
1137 MBEDTLS_PADDING_NONE) == 0);
1138 CHK(mbedtls_cipher_set_padding_mode(&t_out->cipher_ctx_enc,
1139 MBEDTLS_PADDING_NONE) == 0);
1140 CHK(mbedtls_cipher_set_padding_mode(&t_out->cipher_ctx_dec,
1141 MBEDTLS_PADDING_NONE) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001142 }
1143#endif /* MBEDTLS_CIPHER_MODE_CBC */
1144
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001145 CHK(mbedtls_cipher_setkey(&t_in->cipher_ctx_enc, key0,
1146 keylen << 3, MBEDTLS_ENCRYPT) == 0);
1147 CHK(mbedtls_cipher_setkey(&t_in->cipher_ctx_dec, key1,
1148 keylen << 3, MBEDTLS_DECRYPT) == 0);
1149 CHK(mbedtls_cipher_setkey(&t_out->cipher_ctx_enc, key1,
1150 keylen << 3, MBEDTLS_ENCRYPT) == 0);
1151 CHK(mbedtls_cipher_setkey(&t_out->cipher_ctx_dec, key0,
1152 keylen << 3, MBEDTLS_DECRYPT) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001153
1154 /* Setup MAC contexts */
1155#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001156 if (cipher_info->mode == MBEDTLS_MODE_CBC ||
1157 cipher_info->mode == MBEDTLS_MODE_STREAM) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001158 mbedtls_md_info_t const *md_info;
Hanno Beckera18d1322018-01-03 14:27:32 +00001159
1160 /* Pick hash */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001161 md_info = mbedtls_md_info_from_type(hash_id);
1162 CHK(md_info != NULL);
Hanno Beckera18d1322018-01-03 14:27:32 +00001163
1164 /* Pick hash keys */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001165 maclen = mbedtls_md_get_size(md_info);
1166 CHK((md0 = mbedtls_calloc(1, maclen)) != NULL);
1167 CHK((md1 = mbedtls_calloc(1, maclen)) != NULL);
1168 memset(md0, 0x5, maclen);
1169 memset(md1, 0x6, maclen);
Hanno Beckera18d1322018-01-03 14:27:32 +00001170
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001171 CHK(mbedtls_md_setup(&t_out->md_ctx_enc, md_info, 1) == 0);
1172 CHK(mbedtls_md_setup(&t_out->md_ctx_dec, md_info, 1) == 0);
1173 CHK(mbedtls_md_setup(&t_in->md_ctx_enc, md_info, 1) == 0);
1174 CHK(mbedtls_md_setup(&t_in->md_ctx_dec, md_info, 1) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001175
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001176 if (ver > MBEDTLS_SSL_MINOR_VERSION_0) {
1177 CHK(mbedtls_md_hmac_starts(&t_in->md_ctx_enc,
1178 md0, maclen) == 0);
1179 CHK(mbedtls_md_hmac_starts(&t_in->md_ctx_dec,
1180 md1, maclen) == 0);
1181 CHK(mbedtls_md_hmac_starts(&t_out->md_ctx_enc,
1182 md1, maclen) == 0);
1183 CHK(mbedtls_md_hmac_starts(&t_out->md_ctx_dec,
1184 md0, maclen) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001185 }
1186#if defined(MBEDTLS_SSL_PROTO_SSL3)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001187 else {
1188 memcpy(&t_in->mac_enc, md0, maclen);
1189 memcpy(&t_in->mac_dec, md1, maclen);
1190 memcpy(&t_out->mac_enc, md1, maclen);
1191 memcpy(&t_out->mac_dec, md0, maclen);
Hanno Beckera18d1322018-01-03 14:27:32 +00001192 }
1193#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001194 }
1195#else
1196 ((void) hash_id);
1197#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1198
1199
1200 /* Pick IV's (regardless of whether they
1201 * are being used by the transform). */
1202 ivlen = cipher_info->iv_size;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001203 memset(iv_enc, 0x3, sizeof(iv_enc));
1204 memset(iv_dec, 0x4, sizeof(iv_dec));
Hanno Beckera18d1322018-01-03 14:27:32 +00001205
1206 /*
1207 * Setup transforms
1208 */
1209
Jaeden Amero2de07f12019-06-05 13:32:08 +01001210#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1211 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001212 t_out->encrypt_then_mac = etm;
1213 t_in->encrypt_then_mac = etm;
1214#else
1215 ((void) etm);
1216#endif
1217
1218 t_out->minor_ver = ver;
1219 t_in->minor_ver = ver;
1220 t_out->ivlen = ivlen;
1221 t_in->ivlen = ivlen;
1222
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001223 switch (cipher_info->mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001224 case MBEDTLS_MODE_GCM:
1225 case MBEDTLS_MODE_CCM:
Hanno Beckere6832872020-05-28 08:29:58 +01001226#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001227 if (ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckere6832872020-05-28 08:29:58 +01001228 t_out->fixed_ivlen = 12;
1229 t_in->fixed_ivlen = 12;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001230 } else
Hanno Beckere6832872020-05-28 08:29:58 +01001231#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1232 {
1233 t_out->fixed_ivlen = 4;
1234 t_in->fixed_ivlen = 4;
1235 }
Hanno Beckera18d1322018-01-03 14:27:32 +00001236 t_out->maclen = 0;
1237 t_in->maclen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001238 switch (tag_mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001239 case 0: /* Full tag */
1240 t_out->taglen = 16;
1241 t_in->taglen = 16;
1242 break;
1243 case 1: /* Partial tag */
1244 t_out->taglen = 8;
1245 t_in->taglen = 8;
1246 break;
1247 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001248 ret = 1;
1249 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001250 }
1251 break;
1252
1253 case MBEDTLS_MODE_CHACHAPOLY:
1254 t_out->fixed_ivlen = 12;
1255 t_in->fixed_ivlen = 12;
1256 t_out->maclen = 0;
1257 t_in->maclen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001258 switch (tag_mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001259 case 0: /* Full tag */
1260 t_out->taglen = 16;
1261 t_in->taglen = 16;
1262 break;
1263 case 1: /* Partial tag */
1264 t_out->taglen = 8;
1265 t_in->taglen = 8;
1266 break;
1267 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001268 ret = 1;
1269 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001270 }
1271 break;
1272
1273 case MBEDTLS_MODE_STREAM:
1274 case MBEDTLS_MODE_CBC:
1275 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1276 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1277 t_out->taglen = 0;
1278 t_in->taglen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001279 switch (tag_mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001280 case 0: /* Full tag */
1281 t_out->maclen = maclen;
1282 t_in->maclen = maclen;
1283 break;
1284 case 1: /* Partial tag */
1285 t_out->maclen = 10;
1286 t_in->maclen = 10;
1287 break;
1288 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001289 ret = 1;
1290 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001291 }
1292 break;
1293 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001294 ret = 1;
1295 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001296 break;
1297 }
1298
1299 /* Setup IV's */
1300
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001301 memcpy(&t_in->iv_dec, iv_dec, sizeof(iv_dec));
1302 memcpy(&t_in->iv_enc, iv_enc, sizeof(iv_enc));
1303 memcpy(&t_out->iv_dec, iv_enc, sizeof(iv_enc));
1304 memcpy(&t_out->iv_enc, iv_dec, sizeof(iv_dec));
Hanno Beckera18d1322018-01-03 14:27:32 +00001305
Hanno Beckera0e20d02019-05-15 14:03:01 +01001306#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001307 /* Add CID */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001308 memcpy(&t_in->in_cid, cid0, cid0_len);
1309 memcpy(&t_in->out_cid, cid1, cid1_len);
Hanno Beckerd856c822019-04-29 17:30:59 +01001310 t_in->in_cid_len = cid0_len;
1311 t_in->out_cid_len = cid1_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001312 memcpy(&t_out->in_cid, cid1, cid1_len);
1313 memcpy(&t_out->out_cid, cid0, cid0_len);
Hanno Beckerd856c822019-04-29 17:30:59 +01001314 t_out->in_cid_len = cid1_len;
1315 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001316#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001317
Hanno Becker81e16a32019-03-01 11:21:44 +00001318cleanup:
1319
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001320 mbedtls_free(key0);
1321 mbedtls_free(key1);
Hanno Becker81e16a32019-03-01 11:21:44 +00001322
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001323 mbedtls_free(md0);
1324 mbedtls_free(md1);
Paul Elliott6f1eda72020-06-11 20:22:00 +01001325
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001326 return ret;
Hanno Beckera18d1322018-01-03 14:27:32 +00001327}
1328
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001329/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001330 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001331 * Choose dummy values, mostly non-0 to distinguish from the init default.
1332 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001333static int ssl_populate_session(mbedtls_ssl_session *session,
1334 int ticket_len,
1335 const char *crt_file)
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001336{
1337#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001338 session->start = mbedtls_time(NULL) - 42;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001339#endif
1340 session->ciphersuite = 0xabcd;
1341 session->compression = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001342 session->id_len = sizeof(session->id);
1343 memset(session->id, 66, session->id_len);
1344 memset(session->master, 17, sizeof(session->master));
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001345
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001346#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
1347 defined(MBEDTLS_CERTS_C) && \
1348 defined(MBEDTLS_FS_IO)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001349 if (strlen(crt_file) != 0) {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001350 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001351 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001352
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001353 mbedtls_x509_crt_init(&tmp_crt);
1354 ret = mbedtls_x509_crt_parse_file(&tmp_crt, crt_file);
1355 if (ret != 0) {
1356 return ret;
1357 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001358
1359#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1360 /* Move temporary CRT. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001361 session->peer_cert = mbedtls_calloc(1, sizeof(*session->peer_cert));
1362 if (session->peer_cert == NULL) {
1363 return -1;
1364 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001365 *session->peer_cert = tmp_crt;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001366 memset(&tmp_crt, 0, sizeof(tmp_crt));
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001367#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1368 /* Calculate digest of temporary CRT. */
1369 session->peer_cert_digest =
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001370 mbedtls_calloc(1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN);
1371 if (session->peer_cert_digest == NULL) {
1372 return -1;
1373 }
1374 ret = mbedtls_md(mbedtls_md_info_from_type(
1375 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE),
1376 tmp_crt.raw.p, tmp_crt.raw.len,
1377 session->peer_cert_digest);
1378 if (ret != 0) {
1379 return ret;
1380 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001381 session->peer_cert_digest_type =
1382 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1383 session->peer_cert_digest_len =
1384 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1385#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1386
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001387 mbedtls_x509_crt_free(&tmp_crt);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001388 }
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001389#else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001390 (void) crt_file;
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001391#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001392 session->verify_result = 0xdeadbeef;
1393
1394#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001395 if (ticket_len != 0) {
1396 session->ticket = mbedtls_calloc(1, ticket_len);
1397 if (session->ticket == NULL) {
1398 return -1;
1399 }
1400 memset(session->ticket, 33, ticket_len);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001401 }
1402 session->ticket_len = ticket_len;
1403 session->ticket_lifetime = 86401;
1404#else
1405 (void) ticket_len;
1406#endif
1407
1408#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1409 session->mfl_code = 1;
1410#endif
1411#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1412 session->trunc_hmac = 1;
1413#endif
1414#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1415 session->encrypt_then_mac = 1;
1416#endif
1417
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001418 return 0;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001419}
1420
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001421/*
1422 * Perform data exchanging between \p ssl_1 and \p ssl_2 and check if the
1423 * message was sent in the correct number of fragments.
1424 *
1425 * /p ssl_1 and /p ssl_2 Endpoints represented by mbedtls_ssl_context. Both
1426 * of them must be initialized and connected beforehand.
1427 * /p msg_len_1 and /p msg_len_2 specify the size of the message to send.
1428 * /p expected_fragments_1 and /p expected_fragments_2 determine in how many
1429 * fragments the message should be sent.
1430 * expected_fragments is 0: can be used for DTLS testing while the message
1431 * size is larger than MFL. In that case the message
1432 * cannot be fragmented and sent to the second endpoint.
1433 * This value can be used for negative tests.
1434 * expected_fragments is 1: can be used for TLS/DTLS testing while the
1435 * message size is below MFL
1436 * expected_fragments > 1: can be used for TLS testing while the message
1437 * size is larger than MFL
1438 *
1439 * \retval 0 on success, otherwise error code.
1440 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001441int mbedtls_exchange_data(mbedtls_ssl_context *ssl_1,
1442 int msg_len_1, const int expected_fragments_1,
1443 mbedtls_ssl_context *ssl_2,
1444 int msg_len_2, const int expected_fragments_2)
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001445{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001446 unsigned char *msg_buf_1 = malloc(msg_len_1);
1447 unsigned char *msg_buf_2 = malloc(msg_len_2);
1448 unsigned char *in_buf_1 = malloc(msg_len_2);
1449 unsigned char *in_buf_2 = malloc(msg_len_1);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001450 int msg_type, ret = -1;
1451
1452 /* Perform this test with two message types. At first use a message
1453 * consisting of only 0x00 for the client and only 0xFF for the server.
1454 * At the second time use message with generated data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001455 for (msg_type = 0; msg_type < 2; msg_type++) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001456 int written_1 = 0;
1457 int written_2 = 0;
1458 int read_1 = 0;
1459 int read_2 = 0;
1460 int fragments_1 = 0;
1461 int fragments_2 = 0;
1462
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001463 if (msg_type == 0) {
1464 memset(msg_buf_1, 0x00, msg_len_1);
1465 memset(msg_buf_2, 0xff, msg_len_2);
1466 } else {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001467 int i, j = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001468 for (i = 0; i < msg_len_1; i++) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001469 msg_buf_1[i] = j++ & 0xFF;
1470 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001471 for (i = 0; i < msg_len_2; i++) {
1472 msg_buf_2[i] = (j -= 5) & 0xFF;
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001473 }
1474 }
1475
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001476 while (read_1 < msg_len_2 || read_2 < msg_len_1) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001477 /* ssl_1 sending */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001478 if (msg_len_1 > written_1) {
1479 ret = mbedtls_ssl_write_fragment(ssl_1, msg_buf_1,
1480 msg_len_1, &written_1,
1481 expected_fragments_1);
1482 if (expected_fragments_1 == 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001483 /* This error is expected when the message is too large and
1484 * cannot be fragmented */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001485 TEST_ASSERT(ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001486 msg_len_1 = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001487 } else {
1488 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001489 }
1490 }
1491
1492 /* ssl_2 sending */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001493 if (msg_len_2 > written_2) {
1494 ret = mbedtls_ssl_write_fragment(ssl_2, msg_buf_2,
1495 msg_len_2, &written_2,
1496 expected_fragments_2);
1497 if (expected_fragments_2 == 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001498 /* This error is expected when the message is too large and
1499 * cannot be fragmented */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001500 TEST_ASSERT(ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001501 msg_len_2 = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001502 } else {
1503 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001504 }
1505 }
1506
1507 /* ssl_1 reading */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001508 if (read_1 < msg_len_2) {
1509 ret = mbedtls_ssl_read_fragment(ssl_1, in_buf_1,
1510 msg_len_2, &read_1,
1511 &fragments_2,
1512 expected_fragments_2);
1513 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001514 }
1515
1516 /* ssl_2 reading */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001517 if (read_2 < msg_len_1) {
1518 ret = mbedtls_ssl_read_fragment(ssl_2, in_buf_2,
1519 msg_len_1, &read_2,
1520 &fragments_1,
1521 expected_fragments_1);
1522 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001523 }
1524 }
1525
1526 ret = -1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001527 TEST_ASSERT(0 == memcmp(msg_buf_1, in_buf_2, msg_len_1));
1528 TEST_ASSERT(0 == memcmp(msg_buf_2, in_buf_1, msg_len_2));
1529 TEST_ASSERT(fragments_1 == expected_fragments_1);
1530 TEST_ASSERT(fragments_2 == expected_fragments_2);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001531 }
1532
1533 ret = 0;
1534
1535exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001536 free(msg_buf_1);
1537 free(in_buf_1);
1538 free(msg_buf_2);
1539 free(in_buf_2);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001540
1541 return ret;
1542}
1543
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001544/*
1545 * Perform data exchanging between \p ssl_1 and \p ssl_2. Both of endpoints
1546 * must be initialized and connected beforehand.
1547 *
1548 * \retval 0 on success, otherwise error code.
1549 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001550int exchange_data(mbedtls_ssl_context *ssl_1,
1551 mbedtls_ssl_context *ssl_2)
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001552{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001553 return mbedtls_exchange_data(ssl_1, 256, 1,
1554 ssl_2, 256, 1);
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001555}
1556
Andrzej Kurek9155e7f2022-10-18 09:36:19 -04001557#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001558 defined(MBEDTLS_CERTS_C) && \
Manuel Pégourié-Gonnardd12402f2020-05-20 10:34:25 +02001559 defined(MBEDTLS_ENTROPY_C) && \
1560 defined(MBEDTLS_CTR_DRBG_C)
Yanray Wangabfdcd82022-10-25 16:44:13 +08001561void perform_handshake(mbedtls_test_handshake_test_options *options)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001562{
1563 /* forced_ciphersuite needs to last until the end of the handshake */
1564 int forced_ciphersuite[2];
1565 enum { BUFFSIZE = 17000 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08001566 mbedtls_test_ssl_endpoint client, server;
Gilles Peskineeccd8882020-03-10 12:19:08 +01001567#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001568 const char *psk_identity = "foo";
1569#endif
1570#if defined(MBEDTLS_TIMING_C)
1571 mbedtls_timing_delay_context timer_client, timer_server;
1572#endif
1573#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1574 unsigned char *context_buf = NULL;
1575 size_t context_buf_len;
1576#endif
1577#if defined(MBEDTLS_SSL_RENEGOTIATION)
1578 int ret = -1;
1579#endif
Paul Elliottc8570442020-04-15 17:00:50 +01001580 int expected_handshake_result = 0;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001581
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001582 USE_PSA_INIT();
1583 mbedtls_platform_zeroize(&client, sizeof(client));
1584 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurek0d2982b2022-10-18 07:55:46 -04001585
Yanray Wangabfdcd82022-10-25 16:44:13 +08001586 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001587 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001588 mbedtls_message_socket_init(&server_context);
1589 mbedtls_message_socket_init(&client_context);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001590
1591 /* Client side */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001592 if (options->dtls != 0) {
1593 TEST_ASSERT(mbedtls_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
1594 options->pk_alg, &client_context,
1595 &client_queue,
1596 &server_queue, NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001597#if defined(MBEDTLS_TIMING_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001598 mbedtls_ssl_set_timer_cb(&client.ssl, &timer_client,
1599 mbedtls_timing_set_delay,
1600 mbedtls_timing_get_delay);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001601#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001602 } else {
1603 TEST_ASSERT(mbedtls_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
1604 options->pk_alg, NULL, NULL,
1605 NULL, NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001606 }
Paul Elliottc8570442020-04-15 17:00:50 +01001607
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001608 if (options->client_min_version != TEST_SSL_MINOR_VERSION_NONE) {
1609 mbedtls_ssl_conf_min_version(&client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
1610 options->client_min_version);
Paul Elliottc8570442020-04-15 17:00:50 +01001611 }
1612
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001613 if (options->client_max_version != TEST_SSL_MINOR_VERSION_NONE) {
1614 mbedtls_ssl_conf_max_version(&client.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
1615 options->client_max_version);
Paul Elliottc8570442020-04-15 17:00:50 +01001616 }
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001617
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001618 if (strlen(options->cipher) > 0) {
1619 set_ciphersuite(&client.conf, options->cipher, forced_ciphersuite);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001620 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001621
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001622#if defined(MBEDTLS_DEBUG_C)
1623 if (options->cli_log_fun) {
1624 mbedtls_debug_set_threshold(4);
1625 mbedtls_ssl_conf_dbg(&client.conf, options->cli_log_fun,
1626 options->cli_log_obj);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001627 }
1628#endif
1629
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001630 /* Server side */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001631 if (options->dtls != 0) {
1632 TEST_ASSERT(mbedtls_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
1633 options->pk_alg, &server_context,
1634 &server_queue,
1635 &client_queue, NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001636#if defined(MBEDTLS_TIMING_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001637 mbedtls_ssl_set_timer_cb(&server.ssl, &timer_server,
1638 mbedtls_timing_set_delay,
1639 mbedtls_timing_get_delay);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001640#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001641 } else {
1642 TEST_ASSERT(mbedtls_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
1643 options->pk_alg, NULL, NULL,
1644 NULL, NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001645 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001646
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001647 mbedtls_ssl_conf_authmode(&server.conf, options->srv_auth_mode);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001648
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001649 if (options->server_min_version != TEST_SSL_MINOR_VERSION_NONE) {
1650 mbedtls_ssl_conf_min_version(&server.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
1651 options->server_min_version);
Paul Elliottc8570442020-04-15 17:00:50 +01001652 }
1653
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001654 if (options->server_max_version != TEST_SSL_MINOR_VERSION_NONE) {
1655 mbedtls_ssl_conf_max_version(&server.conf, MBEDTLS_SSL_MAJOR_VERSION_3,
1656 options->server_max_version);
Paul Elliottc8570442020-04-15 17:00:50 +01001657 }
1658
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001659#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001660 TEST_ASSERT(mbedtls_ssl_conf_max_frag_len(&(server.conf),
1661 (unsigned char) options->mfl) == 0);
1662 TEST_ASSERT(mbedtls_ssl_conf_max_frag_len(&(client.conf),
1663 (unsigned char) options->mfl) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001664#else
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001665 TEST_ASSERT(MBEDTLS_SSL_MAX_FRAG_LEN_NONE == options->mfl);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001666#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
1667
Gilles Peskineeccd8882020-03-10 12:19:08 +01001668#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001669 if (options->psk_str != NULL && options->psk_str->len > 0) {
1670 TEST_ASSERT(mbedtls_ssl_conf_psk(&client.conf, options->psk_str->x,
1671 options->psk_str->len,
1672 (const unsigned char *) psk_identity,
1673 strlen(psk_identity)) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001674
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001675 TEST_ASSERT(mbedtls_ssl_conf_psk(&server.conf, options->psk_str->x,
1676 options->psk_str->len,
1677 (const unsigned char *) psk_identity,
1678 strlen(psk_identity)) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001679
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001680 mbedtls_ssl_conf_psk_cb(&server.conf, psk_dummy_callback, NULL);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001681 }
1682#endif
1683#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001684 if (options->renegotiate) {
1685 mbedtls_ssl_conf_renegotiation(&(server.conf),
1686 MBEDTLS_SSL_RENEGOTIATION_ENABLED);
1687 mbedtls_ssl_conf_renegotiation(&(client.conf),
1688 MBEDTLS_SSL_RENEGOTIATION_ENABLED);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001689
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001690 mbedtls_ssl_conf_legacy_renegotiation(&(server.conf),
1691 options->legacy_renegotiation);
1692 mbedtls_ssl_conf_legacy_renegotiation(&(client.conf),
1693 options->legacy_renegotiation);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001694 }
1695#endif /* MBEDTLS_SSL_RENEGOTIATION */
1696
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001697#if defined(MBEDTLS_DEBUG_C)
1698 if (options->srv_log_fun) {
1699 mbedtls_debug_set_threshold(4);
1700 mbedtls_ssl_conf_dbg(&server.conf, options->srv_log_fun,
1701 options->srv_log_obj);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001702 }
1703#endif
1704
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001705 TEST_ASSERT(mbedtls_mock_socket_connect(&(client.socket),
1706 &(server.socket),
1707 BUFFSIZE) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001708
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001709#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001710 if (options->resize_buffers != 0) {
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001711 /* Ensure that the buffer sizes are appropriate before resizes */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001712 TEST_ASSERT(client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
1713 TEST_ASSERT(client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
1714 TEST_ASSERT(server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
1715 TEST_ASSERT(server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001716 }
1717#endif
1718
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001719 if (options->expected_negotiated_version == TEST_SSL_MINOR_VERSION_NONE) {
Paul Elliottc8570442020-04-15 17:00:50 +01001720 expected_handshake_result = MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION;
1721 }
1722
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001723 TEST_ASSERT(mbedtls_move_handshake_to_state(&(client.ssl),
1724 &(server.ssl),
1725 MBEDTLS_SSL_HANDSHAKE_OVER)
1726 == expected_handshake_result);
Paul Elliottc8570442020-04-15 17:00:50 +01001727
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001728 if (expected_handshake_result != 0) {
Paul Elliottc8570442020-04-15 17:00:50 +01001729 /* Connection will have failed by this point, skip to cleanup */
1730 goto exit;
1731 }
1732
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001733 TEST_ASSERT(client.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER);
1734 TEST_ASSERT(server.ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001735
Paul Elliottc8570442020-04-15 17:00:50 +01001736 /* Check that we agree on the version... */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001737 TEST_ASSERT(client.ssl.minor_ver == server.ssl.minor_ver);
Paul Elliottc8570442020-04-15 17:00:50 +01001738
1739 /* And check that the version negotiated is the expected one. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001740 TEST_EQUAL(client.ssl.minor_ver, options->expected_negotiated_version);
Paul Elliottc8570442020-04-15 17:00:50 +01001741
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001742#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001743 if (options->resize_buffers != 0) {
1744 if (options->expected_negotiated_version != MBEDTLS_SSL_MINOR_VERSION_0 &&
1745 options->expected_negotiated_version != MBEDTLS_SSL_MINOR_VERSION_1) {
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001746 /* A server, when using DTLS, might delay a buffer resize to happen
1747 * after it receives a message, so we force it. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001748 TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001749
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001750 TEST_ASSERT(client.ssl.out_buf_len ==
1751 mbedtls_ssl_get_output_buflen(&client.ssl));
1752 TEST_ASSERT(client.ssl.in_buf_len ==
1753 mbedtls_ssl_get_input_buflen(&client.ssl));
1754 TEST_ASSERT(server.ssl.out_buf_len ==
1755 mbedtls_ssl_get_output_buflen(&server.ssl));
1756 TEST_ASSERT(server.ssl.in_buf_len ==
1757 mbedtls_ssl_get_input_buflen(&server.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001758 }
1759 }
1760#endif
1761
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001762 if (options->cli_msg_len != 0 || options->srv_msg_len != 0) {
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001763 /* Start data exchanging test */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001764 TEST_ASSERT(mbedtls_exchange_data(&(client.ssl), options->cli_msg_len,
1765 options->expected_cli_fragments,
1766 &(server.ssl), options->srv_msg_len,
1767 options->expected_srv_fragments)
1768 == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001769 }
1770#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001771 if (options->serialize == 1) {
1772 TEST_ASSERT(options->dtls == 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001773
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001774 TEST_ASSERT(mbedtls_ssl_context_save(&(server.ssl), NULL,
1775 0, &context_buf_len)
1776 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001777
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001778 context_buf = mbedtls_calloc(1, context_buf_len);
1779 TEST_ASSERT(context_buf != NULL);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001780
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001781 TEST_ASSERT(mbedtls_ssl_context_save(&(server.ssl), context_buf,
1782 context_buf_len,
1783 &context_buf_len) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001784
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001785 mbedtls_ssl_free(&(server.ssl));
1786 mbedtls_ssl_init(&(server.ssl));
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001787
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001788 TEST_ASSERT(mbedtls_ssl_setup(&(server.ssl), &(server.conf)) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001789
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001790 mbedtls_ssl_set_bio(&(server.ssl), &server_context,
1791 mbedtls_mock_tcp_send_msg,
1792 mbedtls_mock_tcp_recv_msg,
1793 NULL);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001794
1795#if defined(MBEDTLS_TIMING_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001796 mbedtls_ssl_set_timer_cb(&server.ssl, &timer_server,
1797 mbedtls_timing_set_delay,
1798 mbedtls_timing_get_delay);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001799#endif
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001800#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001801 if (options->resize_buffers != 0) {
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001802 /* Ensure that the buffer sizes are appropriate before resizes */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001803 TEST_ASSERT(server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
1804 TEST_ASSERT(server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001805 }
1806#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001807 TEST_ASSERT(mbedtls_ssl_context_load(&(server.ssl), context_buf,
1808 context_buf_len) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001809
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001810#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1811 /* Validate buffer sizes after context deserialization */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001812 if (options->resize_buffers != 0) {
1813 TEST_ASSERT(server.ssl.out_buf_len ==
1814 mbedtls_ssl_get_output_buflen(&server.ssl));
1815 TEST_ASSERT(server.ssl.in_buf_len ==
1816 mbedtls_ssl_get_input_buflen(&server.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001817 }
1818#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001819 /* Retest writing/reading */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001820 if (options->cli_msg_len != 0 || options->srv_msg_len != 0) {
1821 TEST_ASSERT(mbedtls_exchange_data(&(client.ssl),
1822 options->cli_msg_len,
1823 options->expected_cli_fragments,
1824 &(server.ssl),
1825 options->srv_msg_len,
1826 options->expected_srv_fragments)
1827 == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001828 }
1829 }
1830#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001831
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001832#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001833 if (options->renegotiate) {
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001834 /* Start test with renegotiation */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001835 TEST_ASSERT(server.ssl.renego_status ==
1836 MBEDTLS_SSL_INITIAL_HANDSHAKE);
1837 TEST_ASSERT(client.ssl.renego_status ==
1838 MBEDTLS_SSL_INITIAL_HANDSHAKE);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001839
1840 /* After calling this function for the server, it only sends a handshake
1841 * request. All renegotiation should happen during data exchanging */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001842 TEST_ASSERT(mbedtls_ssl_renegotiate(&(server.ssl)) == 0);
1843 TEST_ASSERT(server.ssl.renego_status ==
1844 MBEDTLS_SSL_RENEGOTIATION_PENDING);
1845 TEST_ASSERT(client.ssl.renego_status ==
1846 MBEDTLS_SSL_INITIAL_HANDSHAKE);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001847
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001848 TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
1849 TEST_ASSERT(server.ssl.renego_status ==
1850 MBEDTLS_SSL_RENEGOTIATION_DONE);
1851 TEST_ASSERT(client.ssl.renego_status ==
1852 MBEDTLS_SSL_RENEGOTIATION_DONE);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001853
1854 /* After calling mbedtls_ssl_renegotiate for the client all renegotiation
1855 * should happen inside this function. However in this test, we cannot
Shaun Case0e7791f2021-12-20 21:14:10 -08001856 * perform simultaneous communication between client and server so this
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001857 * function will return waiting error on the socket. All rest of
1858 * renegotiation should happen during data exchanging */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001859 ret = mbedtls_ssl_renegotiate(&(client.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001860#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001861 if (options->resize_buffers != 0) {
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001862 /* Ensure that the buffer sizes are appropriate before resizes */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001863 TEST_ASSERT(client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
1864 TEST_ASSERT(client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001865 }
1866#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001867 TEST_ASSERT(ret == 0 ||
1868 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1869 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
1870 TEST_ASSERT(server.ssl.renego_status ==
1871 MBEDTLS_SSL_RENEGOTIATION_DONE);
1872 TEST_ASSERT(client.ssl.renego_status ==
1873 MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001874
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001875 TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
1876 TEST_ASSERT(server.ssl.renego_status ==
1877 MBEDTLS_SSL_RENEGOTIATION_DONE);
1878 TEST_ASSERT(client.ssl.renego_status ==
1879 MBEDTLS_SSL_RENEGOTIATION_DONE);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001880#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1881 /* Validate buffer sizes after renegotiation */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001882 if (options->resize_buffers != 0) {
1883 TEST_ASSERT(client.ssl.out_buf_len ==
1884 mbedtls_ssl_get_output_buflen(&client.ssl));
1885 TEST_ASSERT(client.ssl.in_buf_len ==
1886 mbedtls_ssl_get_input_buflen(&client.ssl));
1887 TEST_ASSERT(server.ssl.out_buf_len ==
1888 mbedtls_ssl_get_output_buflen(&server.ssl));
1889 TEST_ASSERT(server.ssl.in_buf_len ==
1890 mbedtls_ssl_get_input_buflen(&server.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001891 }
1892#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001893 }
1894#endif /* MBEDTLS_SSL_RENEGOTIATION */
1895
1896exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001897 mbedtls_endpoint_free(&client, options->dtls != 0 ? &client_context : NULL);
1898 mbedtls_endpoint_free(&server, options->dtls != 0 ? &server_context : NULL);
1899#if defined(MBEDTLS_DEBUG_C)
1900 if (options->cli_log_fun || options->srv_log_fun) {
1901 mbedtls_debug_set_threshold(0);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01001902 }
1903#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001904#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001905 if (context_buf != NULL) {
1906 mbedtls_free(context_buf);
1907 }
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001908#endif
1909}
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001910#endif \
1911 /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05001912
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001913/* END_HEADER */
1914
1915/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001916 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001917 * END_DEPENDENCIES
1918 */
1919
Janos Follath6264e662019-11-26 11:11:15 +00001920/* BEGIN_CASE */
1921void test_callback_buffer_sanity()
1922{
1923 enum { MSGLEN = 10 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08001924 mbedtls_test_ssl_buffer buf;
Janos Follath6264e662019-11-26 11:11:15 +00001925 unsigned char input[MSGLEN];
1926 unsigned char output[MSGLEN];
1927
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001928 memset(input, 0, sizeof(input));
Janos Follath6264e662019-11-26 11:11:15 +00001929
1930 /* Make sure calling put and get on NULL buffer results in error. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001931 TEST_ASSERT(mbedtls_test_buffer_put(NULL, input, sizeof(input))
1932 == -1);
1933 TEST_ASSERT(mbedtls_test_buffer_get(NULL, output, sizeof(output))
1934 == -1);
1935 TEST_ASSERT(mbedtls_test_buffer_put(NULL, NULL, sizeof(input)) == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -05001936
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001937 TEST_ASSERT(mbedtls_test_buffer_put(NULL, NULL, 0) == -1);
1938 TEST_ASSERT(mbedtls_test_buffer_get(NULL, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +00001939
1940 /* Make sure calling put and get on a buffer that hasn't been set up results
Shaun Case0e7791f2021-12-20 21:14:10 -08001941 * in error. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001942 mbedtls_test_buffer_init(&buf);
Janos Follath6264e662019-11-26 11:11:15 +00001943
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001944 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, sizeof(input)) == -1);
1945 TEST_ASSERT(mbedtls_test_buffer_get(&buf, output, sizeof(output))
1946 == -1);
1947 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, sizeof(input)) == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -05001948
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001949 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, 0) == -1);
1950 TEST_ASSERT(mbedtls_test_buffer_get(&buf, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +00001951
Andrzej Kurekf7774142020-01-22 06:34:59 -05001952 /* Make sure calling put and get on NULL input only results in
1953 * error if the length is not zero, and that a NULL output is valid for data
1954 * dropping.
1955 */
Janos Follath6264e662019-11-26 11:11:15 +00001956
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001957 TEST_ASSERT(mbedtls_test_buffer_setup(&buf, sizeof(input)) == 0);
Janos Follath6264e662019-11-26 11:11:15 +00001958
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001959 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, sizeof(input)) == -1);
1960 TEST_ASSERT(mbedtls_test_buffer_get(&buf, NULL, sizeof(output))
1961 == 0);
1962 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, 0) == 0);
1963 TEST_ASSERT(mbedtls_test_buffer_get(&buf, NULL, 0) == 0);
Janos Follath6264e662019-11-26 11:11:15 +00001964
Piotr Nowickifb437d72020-01-13 16:59:12 +01001965 /* Make sure calling put several times in the row is safe */
1966
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001967 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, sizeof(input))
1968 == sizeof(input));
1969 TEST_ASSERT(mbedtls_test_buffer_get(&buf, output, 2) == 2);
1970 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, 1) == 1);
1971 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, 2) == 1);
1972 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, 2) == 0);
Piotr Nowickifb437d72020-01-13 16:59:12 +01001973
1974
Janos Follath6264e662019-11-26 11:11:15 +00001975exit:
1976
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001977 mbedtls_test_buffer_free(&buf);
Janos Follath6264e662019-11-26 11:11:15 +00001978}
1979/* END_CASE */
1980
1981/*
Yanray Wangabfdcd82022-10-25 16:44:13 +08001982 * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is
Janos Follath6264e662019-11-26 11:11:15 +00001983 * correct and works as expected.
1984 *
1985 * That is
1986 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
1987 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1988 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
1989 * bytes.
1990 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
1991 * - All of the bytes we got match the bytes we put in in a FIFO manner.
1992 */
1993
1994/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001995void test_callback_buffer(int size, int put1, int put1_ret,
1996 int get1, int get1_ret, int put2, int put2_ret,
1997 int get2, int get2_ret)
Janos Follath6264e662019-11-26 11:11:15 +00001998{
1999 enum { ROUNDS = 2 };
2000 size_t put[ROUNDS];
2001 int put_ret[ROUNDS];
2002 size_t get[ROUNDS];
2003 int get_ret[ROUNDS];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002004 mbedtls_test_ssl_buffer buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002005 unsigned char *input = NULL;
Janos Follath6264e662019-11-26 11:11:15 +00002006 size_t input_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002007 unsigned char *output = NULL;
Janos Follath6264e662019-11-26 11:11:15 +00002008 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00002009 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00002010
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002011 mbedtls_test_buffer_init(&buf);
2012 TEST_ASSERT(mbedtls_test_buffer_setup(&buf, size) == 0);
Janos Follath6264e662019-11-26 11:11:15 +00002013
2014 /* Check the sanity of input parameters and initialise local variables. That
2015 * is, ensure that the amount of data is not negative and that we are not
2016 * expecting more to put or get than we actually asked for. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002017 TEST_ASSERT(put1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002018 put[0] = put1;
2019 put_ret[0] = put1_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002020 TEST_ASSERT(put1_ret <= put1);
2021 TEST_ASSERT(put2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002022 put[1] = put2;
2023 put_ret[1] = put2_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002024 TEST_ASSERT(put2_ret <= put2);
Janos Follath6264e662019-11-26 11:11:15 +00002025
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002026 TEST_ASSERT(get1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002027 get[0] = get1;
2028 get_ret[0] = get1_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002029 TEST_ASSERT(get1_ret <= get1);
2030 TEST_ASSERT(get2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002031 get[1] = get2;
2032 get_ret[1] = get2_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002033 TEST_ASSERT(get2_ret <= get2);
Janos Follath6264e662019-11-26 11:11:15 +00002034
2035 input_len = 0;
2036 /* Calculate actual input and output lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002037 for (j = 0; j < ROUNDS; j++) {
2038 if (put_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002039 input_len += put_ret[j];
2040 }
2041 }
2042 /* In order to always have a valid pointer we always allocate at least 1
2043 * byte. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002044 if (input_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002045 input_len = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002046 }
2047 ASSERT_ALLOC(input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +00002048
2049 output_len = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002050 for (j = 0; j < ROUNDS; j++) {
2051 if (get_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002052 output_len += get_ret[j];
2053 }
2054 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002055 TEST_ASSERT(output_len <= input_len);
Janos Follath6264e662019-11-26 11:11:15 +00002056 /* In order to always have a valid pointer we always allocate at least 1
2057 * byte. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002058 if (output_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002059 output_len = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002060 }
2061 ASSERT_ALLOC(output, output_len);
Janos Follath6264e662019-11-26 11:11:15 +00002062
2063 /* Fill up the buffer with structured data so that unwanted changes
2064 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002065 for (i = 0; i < input_len; i++) {
Janos Follath6264e662019-11-26 11:11:15 +00002066 input[i] = i & 0xFF;
2067 }
2068
2069 written = read = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002070 for (j = 0; j < ROUNDS; j++) {
2071 TEST_ASSERT(put_ret[j] == mbedtls_test_buffer_put(&buf,
2072 input + written, put[j]));
Janos Follath6264e662019-11-26 11:11:15 +00002073 written += put_ret[j];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002074 TEST_ASSERT(get_ret[j] == mbedtls_test_buffer_get(&buf,
2075 output + read, get[j]));
Janos Follath6264e662019-11-26 11:11:15 +00002076 read += get_ret[j];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002077 TEST_ASSERT(read <= written);
2078 if (get_ret[j] > 0) {
2079 TEST_ASSERT(memcmp(output + read - get_ret[j],
2080 input + read - get_ret[j], get_ret[j])
2081 == 0);
Janos Follath6264e662019-11-26 11:11:15 +00002082 }
2083 }
2084
2085exit:
2086
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002087 mbedtls_free(input);
2088 mbedtls_free(output);
2089 mbedtls_test_buffer_free(&buf);
Janos Follath6264e662019-11-26 11:11:15 +00002090}
2091/* END_CASE */
2092
Janos Follath031827f2019-11-27 11:12:14 +00002093/*
Yanray Wangabfdcd82022-10-25 16:44:13 +08002094 * Test if the implementation of `mbedtls_test_mock_socket` related I/O functions is
Janos Follathc673c2c2019-12-02 15:47:26 +00002095 * correct and works as expected on unconnected sockets.
2096 */
2097
2098/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002099void ssl_mock_sanity()
Janos Follathc673c2c2019-12-02 15:47:26 +00002100{
2101 enum { MSGLEN = 105 };
Paul Elliott95457862021-11-24 16:54:26 +00002102 unsigned char message[MSGLEN] = { 0 };
2103 unsigned char received[MSGLEN] = { 0 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002104 mbedtls_test_mock_socket socket;
Janos Follathc673c2c2019-12-02 15:47:26 +00002105
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002106 mbedtls_mock_socket_init(&socket);
2107 TEST_ASSERT(mbedtls_mock_tcp_send_b(&socket, message, MSGLEN) < 0);
2108 mbedtls_mock_socket_close(&socket);
2109 mbedtls_mock_socket_init(&socket);
2110 TEST_ASSERT(mbedtls_mock_tcp_recv_b(&socket, received, MSGLEN) < 0);
2111 mbedtls_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +00002112
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002113 mbedtls_mock_socket_init(&socket);
2114 TEST_ASSERT(mbedtls_mock_tcp_send_nb(&socket, message, MSGLEN) < 0);
2115 mbedtls_mock_socket_close(&socket);
2116 mbedtls_mock_socket_init(&socket);
2117 TEST_ASSERT(mbedtls_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0);
2118 mbedtls_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +00002119
2120exit:
2121
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002122 mbedtls_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +00002123}
2124/* END_CASE */
2125
2126/*
Yanray Wangabfdcd82022-10-25 16:44:13 +08002127 * Test if the implementation of `mbedtls_test_mock_socket` related functions can
Janos Follathc673c2c2019-12-02 15:47:26 +00002128 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00002129 */
2130
2131/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002132void ssl_mock_tcp(int blocking)
Janos Follath031827f2019-11-27 11:12:14 +00002133{
Janos Follathc673c2c2019-12-02 15:47:26 +00002134 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002135 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00002136 unsigned char message[MSGLEN];
2137 unsigned char received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002138 mbedtls_test_mock_socket client;
2139 mbedtls_test_mock_socket server;
Janos Follathc673c2c2019-12-02 15:47:26 +00002140 size_t written, read;
2141 int send_ret, recv_ret;
2142 mbedtls_ssl_send_t *send;
2143 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00002144 unsigned i;
2145
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002146 if (blocking == 0) {
Janos Follathc673c2c2019-12-02 15:47:26 +00002147 send = mbedtls_mock_tcp_send_nb;
2148 recv = mbedtls_mock_tcp_recv_nb;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002149 } else {
Janos Follathc673c2c2019-12-02 15:47:26 +00002150 send = mbedtls_mock_tcp_send_b;
2151 recv = mbedtls_mock_tcp_recv_b;
2152 }
2153
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002154 mbedtls_mock_socket_init(&client);
2155 mbedtls_mock_socket_init(&server);
Janos Follathc673c2c2019-12-02 15:47:26 +00002156
2157 /* Fill up the buffer with structured data so that unwanted changes
2158 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002159 for (i = 0; i < MSGLEN; i++) {
Janos Follathc673c2c2019-12-02 15:47:26 +00002160 message[i] = i & 0xFF;
2161 }
2162
2163 /* Make sure that sending a message takes a few iterations. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002164 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server, BUFLEN));
Janos Follathc673c2c2019-12-02 15:47:26 +00002165
2166 /* Send the message to the server */
2167 send_ret = recv_ret = 1;
2168 written = read = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002169 while (send_ret != 0 || recv_ret != 0) {
2170 send_ret = send(&client, message + written, MSGLEN - written);
Janos Follathc673c2c2019-12-02 15:47:26 +00002171
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002172 TEST_ASSERT(send_ret >= 0);
2173 TEST_ASSERT(send_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002174 written += send_ret;
2175
2176 /* If the buffer is full we can test blocking and non-blocking send */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002177 if (send_ret == BUFLEN) {
2178 int blocking_ret = send(&client, message, 1);
2179 if (blocking) {
2180 TEST_ASSERT(blocking_ret == 0);
2181 } else {
2182 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002183 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002184 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002185
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002186 recv_ret = recv(&server, received + read, MSGLEN - read);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002187
2188 /* The result depends on whether any data was sent */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002189 if (send_ret > 0) {
2190 TEST_ASSERT(recv_ret > 0);
2191 TEST_ASSERT(recv_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002192 read += recv_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002193 } else if (blocking) {
2194 TEST_ASSERT(recv_ret == 0);
2195 } else {
2196 TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002197 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00002198 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002199
2200 /* If the buffer is empty we can test blocking and non-blocking read */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002201 if (recv_ret == BUFLEN) {
2202 int blocking_ret = recv(&server, received, 1);
2203 if (blocking) {
2204 TEST_ASSERT(blocking_ret == 0);
2205 } else {
2206 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002207 }
2208 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002209 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002210 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Janos Follathc673c2c2019-12-02 15:47:26 +00002211
2212exit:
2213
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002214 mbedtls_mock_socket_close(&client);
2215 mbedtls_mock_socket_close(&server);
Janos Follathc673c2c2019-12-02 15:47:26 +00002216}
2217/* END_CASE */
2218
2219/*
Yanray Wangabfdcd82022-10-25 16:44:13 +08002220 * Test if the implementation of `mbedtls_test_mock_socket` related functions can
Janos Follathc673c2c2019-12-02 15:47:26 +00002221 * send messages in both direction at the same time (with the I/O calls
2222 * interleaving).
2223 */
2224
2225/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002226void ssl_mock_tcp_interleaving(int blocking)
Janos Follathc673c2c2019-12-02 15:47:26 +00002227{
Janos Follath031827f2019-11-27 11:12:14 +00002228 enum { ROUNDS = 2 };
2229 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002230 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00002231 unsigned char message[ROUNDS][MSGLEN];
2232 unsigned char received[ROUNDS][MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002233 mbedtls_test_mock_socket client;
2234 mbedtls_test_mock_socket server;
Janos Follath031827f2019-11-27 11:12:14 +00002235 size_t written[ROUNDS];
2236 size_t read[ROUNDS];
2237 int send_ret[ROUNDS];
2238 int recv_ret[ROUNDS];
2239 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00002240 mbedtls_ssl_send_t *send;
2241 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00002242
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002243 if (blocking == 0) {
Janos Follath3766ba52019-11-27 13:31:42 +00002244 send = mbedtls_mock_tcp_send_nb;
2245 recv = mbedtls_mock_tcp_recv_nb;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002246 } else {
Janos Follath3766ba52019-11-27 13:31:42 +00002247 send = mbedtls_mock_tcp_send_b;
2248 recv = mbedtls_mock_tcp_recv_b;
2249 }
Janos Follath031827f2019-11-27 11:12:14 +00002250
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002251 mbedtls_mock_socket_init(&client);
2252 mbedtls_mock_socket_init(&server);
Janos Follath031827f2019-11-27 11:12:14 +00002253
2254 /* Fill up the buffers with structured data so that unwanted changes
2255 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002256 for (i = 0; i < ROUNDS; i++) {
2257 for (j = 0; j < MSGLEN; j++) {
2258 message[i][j] = (i * MSGLEN + j) & 0xFF;
Janos Follath031827f2019-11-27 11:12:14 +00002259 }
2260 }
2261
Janos Follath031827f2019-11-27 11:12:14 +00002262 /* Make sure that sending a message takes a few iterations. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002263 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server, BUFLEN));
Janos Follath031827f2019-11-27 11:12:14 +00002264
Janos Follath031827f2019-11-27 11:12:14 +00002265 /* Send the message from both sides, interleaving. */
2266 progress = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002267 for (i = 0; i < ROUNDS; i++) {
Janos Follath031827f2019-11-27 11:12:14 +00002268 written[i] = 0;
2269 read[i] = 0;
2270 }
2271 /* This loop does not stop as long as there was a successful write or read
2272 * of at least one byte on either side. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002273 while (progress != 0) {
Yanray Wangabfdcd82022-10-25 16:44:13 +08002274 mbedtls_test_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00002275
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002276 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002277 /* First sending is from the client */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002278 socket = (i % 2 == 0) ? (&client) : (&server);
Janos Follath031827f2019-11-27 11:12:14 +00002279
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002280 send_ret[i] = send(socket, message[i] + written[i],
2281 MSGLEN - written[i]);
2282 TEST_ASSERT(send_ret[i] >= 0);
2283 TEST_ASSERT(send_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002284 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002285
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002286 /* If the buffer is full we can test blocking and non-blocking
2287 * send */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002288 if (send_ret[i] == BUFLEN) {
2289 int blocking_ret = send(socket, message[i], 1);
2290 if (blocking) {
2291 TEST_ASSERT(blocking_ret == 0);
2292 } else {
2293 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002294 }
2295 }
Janos Follath3766ba52019-11-27 13:31:42 +00002296 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002297
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002298 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002299 /* First receiving is from the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002300 socket = (i % 2 == 0) ? (&server) : (&client);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002301
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002302 recv_ret[i] = recv(socket, received[i] + read[i],
2303 MSGLEN - read[i]);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002304
2305 /* The result depends on whether any data was sent */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002306 if (send_ret[i] > 0) {
2307 TEST_ASSERT(recv_ret[i] > 0);
2308 TEST_ASSERT(recv_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002309 read[i] += recv_ret[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002310 } else if (blocking) {
2311 TEST_ASSERT(recv_ret[i] == 0);
2312 } else {
2313 TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002314 recv_ret[i] = 0;
2315 }
2316
2317 /* If the buffer is empty we can test blocking and non-blocking
2318 * read */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002319 if (recv_ret[i] == BUFLEN) {
2320 int blocking_ret = recv(socket, received[i], 1);
2321 if (blocking) {
2322 TEST_ASSERT(blocking_ret == 0);
2323 } else {
2324 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002325 }
2326 }
Janos Follath3766ba52019-11-27 13:31:42 +00002327 }
Janos Follath031827f2019-11-27 11:12:14 +00002328
2329 progress = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002330 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002331 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002332 }
2333 }
2334
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002335 for (i = 0; i < ROUNDS; i++) {
2336 TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0);
2337 }
Janos Follath031827f2019-11-27 11:12:14 +00002338
2339exit:
2340
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002341 mbedtls_mock_socket_close(&client);
2342 mbedtls_mock_socket_close(&server);
Janos Follath031827f2019-11-27 11:12:14 +00002343}
2344/* END_CASE */
2345
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002346/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002347void ssl_message_queue_sanity()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002348{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002349 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002350
2351 /* Trying to push/pull to an empty queue */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002352 TEST_ASSERT(mbedtls_test_message_queue_push_info(NULL, 1)
2353 == MBEDTLS_TEST_ERROR_ARG_NULL);
2354 TEST_ASSERT(mbedtls_test_message_queue_pop_info(NULL, 1)
2355 == MBEDTLS_TEST_ERROR_ARG_NULL);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002356
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002357 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
2358 TEST_ASSERT(queue.capacity == 3);
2359 TEST_ASSERT(queue.num == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002360
2361exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002362 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002363}
2364/* END_CASE */
2365
2366/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002367void ssl_message_queue_basic()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002368{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002369 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002370
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002371 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002372
2373 /* Sanity test - 3 pushes and 3 pops with sufficient space */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002374 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
2375 TEST_ASSERT(queue.capacity == 3);
2376 TEST_ASSERT(queue.num == 1);
2377 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
2378 TEST_ASSERT(queue.capacity == 3);
2379 TEST_ASSERT(queue.num == 2);
2380 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 2) == 2);
2381 TEST_ASSERT(queue.capacity == 3);
2382 TEST_ASSERT(queue.num == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002383
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002384 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
2385 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
2386 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002387
2388exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002389 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002390}
2391/* END_CASE */
2392
2393/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002394void ssl_message_queue_overflow_underflow()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002395{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002396 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002397
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002398 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002399
2400 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002401 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
2402 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
2403 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 2) == 2);
2404 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 3)
2405 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002406
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002407 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
2408 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
2409 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002410
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002411 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1)
2412 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002413
2414exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002415 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002416}
2417/* END_CASE */
2418
2419/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002420void ssl_message_queue_interleaved()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002421{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002422 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002423
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002424 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002425
2426 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
2427 * (to wrap around the buffer) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002428 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
2429 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002430
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002431 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002432
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002433 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 2) == 2);
2434 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002435
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002436 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
2437 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002438
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002439 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 5) == 5);
2440 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002441
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002442 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002443
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002444 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 5) == 5);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002445
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002446 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002447
2448exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002449 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002450}
2451/* END_CASE */
2452
2453/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002454void ssl_message_queue_insufficient_buffer()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002455{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002456 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002457 size_t message_len = 10;
2458 size_t buffer_len = 5;
2459
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002460 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 1) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002461
2462 /* Popping without a sufficient buffer */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002463 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, message_len)
2464 == (int) message_len);
2465 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, buffer_len)
2466 == (int) buffer_len);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002467exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002468 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002469}
2470/* END_CASE */
2471
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002472/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002473void ssl_message_mock_uninitialized()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002474{
2475 enum { MSGLEN = 10 };
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002476 unsigned char message[MSGLEN] = { 0 }, received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002477 mbedtls_test_mock_socket client, server;
2478 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002479 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002480 mbedtls_message_socket_init(&server_context);
2481 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002482
2483 /* Send with a NULL context */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002484 TEST_ASSERT(mbedtls_mock_tcp_send_msg(NULL, message, MSGLEN)
2485 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002486
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002487 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(NULL, message, MSGLEN)
2488 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002489
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002490 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 1,
2491 &server,
2492 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002493
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002494 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 1,
2495 &client,
2496 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002497
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002498 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message, MSGLEN)
2499 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002500
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002501 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2502 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002503
2504 /* Push directly to a queue to later simulate a disconnected behavior */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002505 TEST_ASSERT(mbedtls_test_message_queue_push_info(&server_queue, MSGLEN)
2506 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002507
2508 /* Test if there's an error when trying to read from a disconnected
2509 * socket */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002510 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2511 == MBEDTLS_TEST_ERROR_RECV_FAILED);
2512exit:
2513 mbedtls_message_socket_close(&server_context);
2514 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002515}
2516/* END_CASE */
2517
2518/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002519void ssl_message_mock_basic()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002520{
2521 enum { MSGLEN = 10 };
2522 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002523 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002524 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08002525 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002526 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002527 mbedtls_message_socket_init(&server_context);
2528 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002529
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002530 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 1,
2531 &server,
2532 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002533
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002534 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 1,
2535 &client,
2536 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002537
2538 /* Fill up the buffer with structured data so that unwanted changes
2539 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002540 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002541 message[i] = i & 0xFF;
2542 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002543 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
2544 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002545
2546 /* Send the message to the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002547 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2548 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002549
2550 /* Read from the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002551 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2552 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002553
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002554 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
2555 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002556
2557 /* Send the message to the client */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002558 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&server_context, message,
2559 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002560
2561 /* Read from the client */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002562 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received, MSGLEN)
2563 == MSGLEN);
2564 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002565
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002566exit:
2567 mbedtls_message_socket_close(&server_context);
2568 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002569}
2570/* END_CASE */
2571
2572/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002573void ssl_message_mock_queue_overflow_underflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002574{
2575 enum { MSGLEN = 10 };
2576 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002577 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002578 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08002579 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002580 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002581 mbedtls_message_socket_init(&server_context);
2582 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002583
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002584 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 2,
2585 &server,
2586 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002587
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002588 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 2,
2589 &client,
2590 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002591
2592 /* Fill up the buffer with structured data so that unwanted changes
2593 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002594 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002595 message[i] = i & 0xFF;
2596 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002597 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
2598 MSGLEN*2));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002599
2600 /* Send three message to the server, last one with an error */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002601 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2602 MSGLEN - 1) == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002603
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002604 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2605 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002606
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002607 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2608 MSGLEN)
2609 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002610
2611 /* Read three messages from the server, last one with an error */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002612 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
2613 MSGLEN - 1) == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002614
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002615 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2616 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002617
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002618 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002619
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002620 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2621 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002622
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002623exit:
2624 mbedtls_message_socket_close(&server_context);
2625 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002626}
2627/* END_CASE */
2628
2629/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002630void ssl_message_mock_socket_overflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002631{
2632 enum { MSGLEN = 10 };
2633 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002634 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002635 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08002636 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002637 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002638 mbedtls_message_socket_init(&server_context);
2639 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002640
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002641 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 2,
2642 &server,
2643 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002644
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002645 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 2,
2646 &client,
2647 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002648
2649 /* Fill up the buffer with structured data so that unwanted changes
2650 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002651 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002652 message[i] = i & 0xFF;
2653 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002654 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
2655 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002656
2657 /* Send two message to the server, second one with an error */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002658 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2659 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002660
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002661 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2662 MSGLEN)
2663 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002664
2665 /* Read the only message from the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002666 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2667 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002668
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002669 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002670
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002671exit:
2672 mbedtls_message_socket_close(&server_context);
2673 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002674}
2675/* END_CASE */
2676
2677/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002678void ssl_message_mock_truncated()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002679{
2680 enum { MSGLEN = 10 };
2681 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002682 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002683 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08002684 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002685 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002686 mbedtls_message_socket_init(&server_context);
2687 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002688
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002689 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 2,
2690 &server,
2691 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002692
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002693 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 2,
2694 &client,
2695 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002696
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002697 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002698 /* Fill up the buffer with structured data so that unwanted changes
2699 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002700 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002701 message[i] = i & 0xFF;
2702 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002703 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
2704 2 * MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002705
2706 /* Send two messages to the server, the second one small enough to fit in the
2707 * receiver's buffer. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002708 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2709 MSGLEN) == MSGLEN);
2710 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2711 MSGLEN / 2) == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002712 /* Read a truncated message from the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002713 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN/2)
2714 == MSGLEN/2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002715
2716 /* Test that the first half of the message is valid, and second one isn't */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002717 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
2718 TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2)
2719 != 0);
2720 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002721
2722 /* Read a full message from the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002723 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN/2)
2724 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002725
2726 /* Test that the first half of the message is valid */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002727 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002728
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002729exit:
2730 mbedtls_message_socket_close(&server_context);
2731 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002732}
2733/* END_CASE */
2734
2735/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002736void ssl_message_mock_socket_read_error()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002737{
2738 enum { MSGLEN = 10 };
2739 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002740 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002741 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08002742 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002743 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002744 mbedtls_message_socket_init(&server_context);
2745 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002746
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002747 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 1,
2748 &server,
2749 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002750
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002751 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 1,
2752 &client,
2753 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002754
2755 /* Fill up the buffer with structured data so that unwanted changes
2756 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002757 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002758 message[i] = i & 0xFF;
2759 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002760 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
2761 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002762
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002763 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2764 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002765
2766 /* Force a read error by disconnecting the socket by hand */
2767 server.status = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002768 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2769 == MBEDTLS_TEST_ERROR_RECV_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002770 /* Return to a valid state */
2771 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
2772
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002773 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002774
2775 /* Test that even though the server tried to read once disconnected, the
2776 * continuity is preserved */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002777 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2778 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002779
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002780 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002781
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002782exit:
2783 mbedtls_message_socket_close(&server_context);
2784 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002785}
2786/* END_CASE */
2787
2788/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002789void ssl_message_mock_interleaved_one_way()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002790{
2791 enum { MSGLEN = 10 };
2792 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002793 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002794 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08002795 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002796 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002797 mbedtls_message_socket_init(&server_context);
2798 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002799
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002800 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 3,
2801 &server,
2802 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002803
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002804 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 3,
2805 &client,
2806 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002807
2808 /* Fill up the buffer with structured data so that unwanted changes
2809 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002810 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002811 message[i] = i & 0xFF;
2812 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002813 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
2814 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002815
2816 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
2817 * (to wrap around the buffer) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002818 for (i = 0; i < 2; i++) {
2819 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2820 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002821
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002822 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2823 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002824
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002825 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
2826 MSGLEN) == MSGLEN);
2827 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
2828 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002829 }
2830
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002831 for (i = 0; i < 2; i++) {
2832 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
2833 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002834
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002835 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002836 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002837 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2838 == MBEDTLS_ERR_SSL_WANT_READ);
2839exit:
2840 mbedtls_message_socket_close(&server_context);
2841 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002842}
2843/* END_CASE */
2844
2845/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002846void ssl_message_mock_interleaved_two_ways()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002847{
2848 enum { MSGLEN = 10 };
2849 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08002850 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002851 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08002852 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002853 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002854 mbedtls_message_socket_init(&server_context);
2855 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002856
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002857 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 3,
2858 &server,
2859 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002860
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002861 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 3,
2862 &client,
2863 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002864
2865 /* Fill up the buffer with structured data so that unwanted changes
2866 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002867 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002868 message[i] = i & 0xFF;
2869 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002870 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
2871 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002872
2873 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
2874 * (to wrap around the buffer) both ways. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002875 for (i = 0; i < 2; i++) {
2876 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2877 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002878
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002879 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
2880 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002881
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002882 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&server_context, message,
2883 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002884
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002885 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&server_context, message,
2886 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002887
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002888 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
2889 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002890
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002891 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002892
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002893 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002894
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002895 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received,
2896 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002897
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002898 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002899
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002900 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002901 }
2902
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002903 for (i = 0; i < 2; i++) {
2904 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
2905 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002906
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002907 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
2908 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002909
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002910 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received,
2911 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002912
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002913 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
2914 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002915 }
2916
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002917 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
2918 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002919
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002920 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received, MSGLEN)
2921 == MBEDTLS_ERR_SSL_WANT_READ);
2922exit:
2923 mbedtls_message_socket_close(&server_context);
2924 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05002925}
2926/* END_CASE */
2927
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002928/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002929void ssl_dtls_replay(data_t *prevs, data_t *new, int ret)
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002930{
Azim Khand30ca132017-06-09 04:32:58 +01002931 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002932 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02002933 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002934
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002935 mbedtls_ssl_init(&ssl);
2936 mbedtls_ssl_config_init(&conf);
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002937
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002938 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
2939 MBEDTLS_SSL_IS_CLIENT,
2940 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2941 MBEDTLS_SSL_PRESET_DEFAULT) == 0);
2942 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002943
2944 /* Read previous record numbers */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002945 for (len = 0; len < prevs->len; len += 6) {
2946 memcpy(ssl.in_ctr + 2, prevs->x + len, 6);
2947 mbedtls_ssl_dtls_replay_update(&ssl);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002948 }
2949
2950 /* Check new number */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002951 memcpy(ssl.in_ctr + 2, new->x, 6);
2952 TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002953
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002954 mbedtls_ssl_free(&ssl);
2955 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002956}
2957/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002958
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002959/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002960void ssl_set_hostname_twice(char *hostname0, char *hostname1)
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002961{
2962 mbedtls_ssl_context ssl;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002963 mbedtls_ssl_init(&ssl);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002964
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002965 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname0) == 0);
2966 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname1) == 0);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002967
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002968 mbedtls_ssl_free(&ssl);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01002969}
Darryl Green11999bb2018-03-13 15:22:58 +00002970/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00002971
2972/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002973void ssl_crypt_record(int cipher_type, int hash_id,
2974 int etm, int tag_mode, int ver,
2975 int cid0_len, int cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00002976{
2977 /*
2978 * Test several record encryptions and decryptions
2979 * with plenty of space before and after the data
2980 * within the record buffer.
2981 */
2982
2983 int ret;
2984 int num_records = 16;
2985 mbedtls_ssl_context ssl; /* ONLY for debugging */
2986
2987 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00002988 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00002989 size_t const buflen = 512;
2990 mbedtls_record rec, rec_backup;
2991
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002992 mbedtls_ssl_init(&ssl);
2993 mbedtls_ssl_transform_init(&t0);
2994 mbedtls_ssl_transform_init(&t1);
2995 TEST_ASSERT(build_transforms(&t0, &t1, cipher_type, hash_id,
2996 etm, tag_mode, ver,
2997 (size_t) cid0_len,
2998 (size_t) cid1_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00002999
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003000 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckera18d1322018-01-03 14:27:32 +00003001
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003002 while (num_records-- > 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00003003 mbedtls_ssl_transform *t_dec, *t_enc;
3004 /* Take turns in who's sending and who's receiving. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003005 if (num_records % 3 == 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00003006 t_dec = &t0;
3007 t_enc = &t1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003008 } else {
Hanno Beckera18d1322018-01-03 14:27:32 +00003009 t_dec = &t1;
3010 t_enc = &t0;
3011 }
3012
3013 /*
3014 * The record header affects the transformation in two ways:
3015 * 1) It determines the AEAD additional data
3016 * 2) The record counter sometimes determines the IV.
3017 *
3018 * Apart from that, the fields don't have influence.
3019 * In particular, it is currently not the responsibility
3020 * of ssl_encrypt/decrypt_buf to check if the transform
3021 * version matches the record version, or that the
3022 * type is sensible.
3023 */
3024
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003025 memset(rec.ctr, num_records, sizeof(rec.ctr));
Hanno Beckera18d1322018-01-03 14:27:32 +00003026 rec.type = 42;
3027 rec.ver[0] = num_records;
3028 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003029#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003030 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003031#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00003032
3033 rec.buf = buf;
3034 rec.buf_len = buflen;
3035 rec.data_offset = 16;
3036 /* Make sure to vary the length to exercise different
3037 * paddings. */
3038 rec.data_len = 1 + num_records;
3039
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003040 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckera18d1322018-01-03 14:27:32 +00003041
3042 /* Make a copy for later comparison */
3043 rec_backup = rec;
3044
3045 /* Encrypt record */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003046 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
3047 mbedtls_test_rnd_std_rand, NULL);
3048 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
3049 if (ret != 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00003050 continue;
3051 }
3052
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003053#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003054 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003055 /* DTLS 1.2 + CID hides the real content type and
3056 * uses a special CID content type in the protected
3057 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003058 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003059 }
3060#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3061
3062#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003063 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003064 /* TLS 1.3 hides the real content type and
3065 * always uses Application Data as the content type
3066 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003067 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003068 }
3069#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
3070
Hanno Beckera18d1322018-01-03 14:27:32 +00003071 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003072 ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec);
3073 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00003074
3075 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003076 TEST_ASSERT(rec.type == rec_backup.type);
3077 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
3078 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
3079 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
3080 TEST_ASSERT(rec.data_len == rec_backup.data_len);
3081 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
3082 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
3083 rec_backup.buf + rec_backup.data_offset,
3084 rec.data_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00003085 }
3086
Hanno Becker81e16a32019-03-01 11:21:44 +00003087exit:
3088
Hanno Beckera18d1322018-01-03 14:27:32 +00003089 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003090 mbedtls_ssl_free(&ssl);
3091 mbedtls_ssl_transform_free(&t0);
3092 mbedtls_ssl_transform_free(&t1);
Hanno Beckera18d1322018-01-03 14:27:32 +00003093
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003094 mbedtls_free(buf);
Hanno Beckera18d1322018-01-03 14:27:32 +00003095}
3096/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003097
3098/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003099void ssl_crypt_record_small(int cipher_type, int hash_id,
3100 int etm, int tag_mode, int ver,
3101 int cid0_len, int cid1_len)
Hanno Beckerb3268da2018-01-05 15:20:24 +00003102{
3103 /*
3104 * Test pairs of encryption and decryption with an increasing
3105 * amount of space in the record buffer - in more detail:
3106 * 1) Try to encrypt with 0, 1, 2, ... bytes available
3107 * in front of the plaintext, and expect the encryption
3108 * to succeed starting from some offset. Always keep
3109 * enough space in the end of the buffer.
3110 * 2) Try to encrypt with 0, 1, 2, ... bytes available
3111 * at the end of the plaintext, and expect the encryption
3112 * to succeed starting from some offset. Always keep
3113 * enough space at the beginning of the buffer.
3114 * 3) Try to encrypt with 0, 1, 2, ... bytes available
3115 * both at the front and end of the plaintext,
3116 * and expect the encryption to succeed starting from
3117 * some offset.
3118 *
3119 * If encryption succeeds, check that decryption succeeds
3120 * and yields the original record.
3121 */
3122
3123 mbedtls_ssl_context ssl; /* ONLY for debugging */
3124
3125 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00003126 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01003127 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003128 mbedtls_record rec, rec_backup;
3129
3130 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01003131 int mode; /* Mode 1, 2 or 3 as explained above */
3132 size_t offset; /* Available space at beginning/end/both */
3133 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003134
Hanno Beckerd856c822019-04-29 17:30:59 +01003135 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
3136 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003137
3138 int seen_success; /* Indicates if in the current mode we've
3139 * already seen a successful test. */
3140
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003141 mbedtls_ssl_init(&ssl);
3142 mbedtls_ssl_transform_init(&t0);
3143 mbedtls_ssl_transform_init(&t1);
3144 TEST_ASSERT(build_transforms(&t0, &t1, cipher_type, hash_id,
3145 etm, tag_mode, ver,
3146 (size_t) cid0_len,
3147 (size_t) cid1_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003148
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003149 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003150
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003151 for (mode = 1; mode <= 3; mode++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003152 seen_success = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003153 for (offset = 0; offset <= threshold; offset++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003154 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01003155 t_dec = &t0;
3156 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003157
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003158 memset(rec.ctr, offset, sizeof(rec.ctr));
Hanno Beckerb3268da2018-01-05 15:20:24 +00003159 rec.type = 42;
3160 rec.ver[0] = offset;
3161 rec.ver[1] = offset;
3162 rec.buf = buf;
3163 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003164#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003165 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003166#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003167
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003168 switch (mode) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003169 case 1: /* Space in the beginning */
3170 rec.data_offset = offset;
3171 rec.data_len = buflen - offset - default_post_padding;
3172 break;
3173
3174 case 2: /* Space in the end */
3175 rec.data_offset = default_pre_padding;
3176 rec.data_len = buflen - default_pre_padding - offset;
3177 break;
3178
3179 case 3: /* Space in the beginning and end */
3180 rec.data_offset = offset;
3181 rec.data_len = buflen - 2 * offset;
3182 break;
3183
3184 default:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003185 TEST_ASSERT(0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003186 break;
3187 }
3188
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003189 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003190
3191 /* Make a copy for later comparison */
3192 rec_backup = rec;
3193
3194 /* Encrypt record */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003195 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
3196 mbedtls_test_rnd_std_rand, NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003197
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003198 if ((mode == 1 || mode == 2) && seen_success) {
3199 TEST_ASSERT(ret == 0);
3200 } else {
3201 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
3202 if (ret == 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003203 seen_success = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003204 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00003205 }
3206
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003207 if (ret != 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003208 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003209 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00003210
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003211#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003212 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003213 /* DTLS 1.2 + CID hides the real content type and
3214 * uses a special CID content type in the protected
3215 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003216 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003217 }
3218#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3219
3220#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003221 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003222 /* TLS 1.3 hides the real content type and
3223 * always uses Application Data as the content type
3224 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003225 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003226 }
3227#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
3228
Hanno Beckerb3268da2018-01-05 15:20:24 +00003229 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003230 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003231
3232 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003233 TEST_ASSERT(rec.type == rec_backup.type);
3234 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
3235 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
3236 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
3237 TEST_ASSERT(rec.data_len == rec_backup.data_len);
3238 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
3239 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
3240 rec_backup.buf + rec_backup.data_offset,
3241 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003242 }
3243
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003244 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003245 }
3246
Hanno Becker81e16a32019-03-01 11:21:44 +00003247exit:
3248
Hanno Beckerb3268da2018-01-05 15:20:24 +00003249 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003250 mbedtls_ssl_free(&ssl);
3251 mbedtls_ssl_transform_free(&t0);
3252 mbedtls_ssl_transform_free(&t1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003253
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003254 mbedtls_free(buf);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003255}
3256/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03003257
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02003258/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_AES_C:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003259void ssl_decrypt_non_etm_cbc(int cipher_type, int hash_id, int trunc_hmac,
3260 int length_selector)
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003261{
3262 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003263 * Test record decryption for CBC without EtM, focused on the verification
3264 * of padding and MAC.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003265 *
3266 * Actually depends on TLS >= 1.0 (SSL 3.0 computes the MAC differently),
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02003267 * and either AES, ARIA, Camellia or DES, but since the test framework
3268 * doesn't support alternation in dependency statements, just depend on
3269 * TLS 1.2 and AES.
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003270 *
3271 * The length_selector argument is interpreted as follows:
3272 * - if it's -1, the plaintext length is 0 and minimal padding is applied
3273 * - if it's -2, the plaintext length is 0 and maximal padding is applied
3274 * - otherwise it must be in [0, 255] and is padding_length from RFC 5246:
3275 * it's the length of the rest of the padding, that is, excluding the
3276 * byte that encodes the length. The minimal non-zero plaintext length
3277 * that gives this padding_length is automatically selected.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003278 */
3279 mbedtls_ssl_context ssl; /* ONLY for debugging */
3280 mbedtls_ssl_transform t0, t1;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003281 mbedtls_record rec, rec_save;
3282 unsigned char *buf = NULL, *buf_save = NULL;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003283 size_t buflen, olen = 0;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003284 size_t plaintext_len, block_size, i;
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003285 unsigned char padlen; /* excluding the padding_length byte */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003286 unsigned char add_data[13];
3287 unsigned char mac[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003288 int exp_ret;
Manuel Pégourié-Gonnard4adc04a2020-07-16 10:00:48 +02003289 const unsigned char pad_max_len = 255; /* Per the standard */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003290
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003291 mbedtls_ssl_init(&ssl);
3292 mbedtls_ssl_transform_init(&t0);
3293 mbedtls_ssl_transform_init(&t1);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003294
3295 /* Set up transforms with dummy keys */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003296 TEST_ASSERT(build_transforms(&t0, &t1, cipher_type, hash_id,
3297 0, trunc_hmac,
3298 MBEDTLS_SSL_MINOR_VERSION_3,
3299 0, 0) == 0);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003300
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003301 /* Determine padding/plaintext length */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003302 TEST_ASSERT(length_selector >= -2 && length_selector <= 255);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003303 block_size = t0.ivlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003304 if (length_selector < 0) {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003305 plaintext_len = 0;
3306
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003307 /* Minimal padding
3308 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003309 padlen = block_size - (t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003310
3311 /* Maximal padding? */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003312 if (length_selector == -2) {
3313 padlen += block_size * ((pad_max_len - padlen) / block_size);
3314 }
3315 } else {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003316 padlen = length_selector;
3317
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003318 /* Minimal non-zero plaintext_length giving desired padding.
3319 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003320 plaintext_len = block_size - (padlen + t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003321 }
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003322
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003323 /* Prepare a buffer for record data */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003324 buflen = block_size
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003325 + plaintext_len
3326 + t0.maclen
3327 + padlen + 1;
3328 ASSERT_ALLOC(buf, buflen);
3329 ASSERT_ALLOC(buf_save, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003330
3331 /* Prepare a dummy record header */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003332 memset(rec.ctr, 0, sizeof(rec.ctr));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003333 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
3334 rec.ver[0] = MBEDTLS_SSL_MAJOR_VERSION_3;
3335 rec.ver[1] = MBEDTLS_SSL_MINOR_VERSION_3;
3336#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3337 rec.cid_len = 0;
3338#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3339
3340 /* Prepare dummy record content */
3341 rec.buf = buf;
3342 rec.buf_len = buflen;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003343 rec.data_offset = block_size;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003344 rec.data_len = plaintext_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003345 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003346
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003347 /* Serialized version of record header for MAC purposes */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003348 memcpy(add_data, rec.ctr, 8);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003349 add_data[8] = rec.type;
3350 add_data[9] = rec.ver[0];
3351 add_data[10] = rec.ver[1];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003352 add_data[11] = (rec.data_len >> 8) & 0xff;
3353 add_data[12] = (rec.data_len >> 0) & 0xff;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003354
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003355 /* Set dummy IV */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003356 memset(t0.iv_enc, 0x55, t0.ivlen);
3357 memcpy(rec.buf, t0.iv_enc, t0.ivlen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003358
3359 /*
3360 * Prepare a pre-encryption record (with MAC and padding), and save it.
3361 */
3362
3363 /* MAC with additional data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003364 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc, add_data, 13));
3365 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc,
3366 rec.buf + rec.data_offset,
3367 rec.data_len));
3368 TEST_EQUAL(0, mbedtls_md_hmac_finish(&t0.md_ctx_enc, mac));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003369
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003370 memcpy(rec.buf + rec.data_offset + rec.data_len, mac, t0.maclen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003371 rec.data_len += t0.maclen;
3372
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003373 /* Pad */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003374 memset(rec.buf + rec.data_offset + rec.data_len, padlen, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003375 rec.data_len += padlen + 1;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003376
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003377 /* Save correct pre-encryption record */
3378 rec_save = rec;
3379 rec_save.buf = buf_save;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003380 memcpy(buf_save, buf, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003381
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003382 /*
3383 * Encrypt and decrypt the correct record, expecting success
3384 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003385 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
3386 t0.iv_enc, t0.ivlen,
3387 rec.buf + rec.data_offset, rec.data_len,
3388 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003389 rec.data_offset -= t0.ivlen;
3390 rec.data_len += t0.ivlen;
3391
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003392 TEST_EQUAL(0, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003393
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003394 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003395 * Modify each byte of the pre-encryption record before encrypting and
3396 * decrypting it, expecting failure every time.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003397 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003398 for (i = block_size; i < buflen; i++) {
3399 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003400
3401 /* Restore correct pre-encryption record */
3402 rec = rec_save;
3403 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003404 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003405
Manuel Pégourié-Gonnardb51f0442020-07-21 10:40:25 +02003406 /* Corrupt one byte of the data (could be plaintext, MAC or padding) */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003407 rec.buf[i] ^= 0x01;
3408
3409 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003410 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
3411 t0.iv_enc, t0.ivlen,
3412 rec.buf + rec.data_offset, rec.data_len,
3413 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003414 rec.data_offset -= t0.ivlen;
3415 rec.data_len += t0.ivlen;
3416
3417 /* Decrypt and expect failure */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003418 TEST_EQUAL(MBEDTLS_ERR_SSL_INVALID_MAC,
3419 mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003420 }
3421
3422 /*
3423 * Use larger values of the padding bytes - with small buffers, this tests
3424 * the case where the announced padlen would be larger than the buffer
3425 * (and before that, than the buffer minus the size of the MAC), to make
3426 * sure our padding checking code does not perform any out-of-bounds reads
3427 * in this case. (With larger buffers, ie when the plaintext is long or
3428 * maximal length padding is used, this is less relevant but still doesn't
3429 * hurt to test.)
3430 *
3431 * (Start the loop with correct padding, just to double-check that record
3432 * saving did work, and that we're overwriting the correct bytes.)
3433 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003434 for (i = padlen; i <= pad_max_len; i++) {
3435 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003436
3437 /* Restore correct pre-encryption record */
3438 rec = rec_save;
3439 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003440 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003441
3442 /* Set padding bytes to new value */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003443 memset(buf + buflen - padlen - 1, i, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003444
3445 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003446 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
3447 t0.iv_enc, t0.ivlen,
3448 rec.buf + rec.data_offset, rec.data_len,
3449 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003450 rec.data_offset -= t0.ivlen;
3451 rec.data_len += t0.ivlen;
3452
3453 /* Decrypt and expect failure except the first time */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003454 exp_ret = (i == padlen) ? 0 : MBEDTLS_ERR_SSL_INVALID_MAC;
3455 TEST_EQUAL(exp_ret, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003456 }
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003457
3458exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003459 mbedtls_ssl_free(&ssl);
3460 mbedtls_ssl_transform_free(&t0);
3461 mbedtls_ssl_transform_free(&t1);
3462 mbedtls_free(buf);
3463 mbedtls_free(buf_save);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003464}
3465/* END_CASE */
3466
Hanno Becker39ff4922020-08-21 13:36:56 +01003467/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003468void ssl_tls1_3_hkdf_expand_label(int hash_alg,
3469 data_t *secret,
3470 int label_idx,
3471 data_t *ctx,
3472 int desired_length,
3473 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01003474{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003475 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01003476
Hanno Becker70d7fb02020-09-09 10:11:21 +01003477 unsigned char const *lbl = NULL;
3478 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003479#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
3480 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01003481 { \
3482 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003483 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01003484 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003485 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01003486#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003487 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01003488
3489 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003490 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
3491 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01003492
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003493 TEST_ASSERT(mbedtls_ssl_tls1_3_hkdf_expand_label(
3494 (mbedtls_md_type_t) hash_alg,
3495 secret->x, secret->len,
3496 lbl, lbl_len,
3497 ctx->x, ctx->len,
3498 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01003499
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003500 ASSERT_COMPARE(dst, (size_t) desired_length,
3501 expected->x, (size_t) expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01003502}
3503/* END_CASE */
3504
Hanno Becker19498f82020-08-21 13:37:08 +01003505/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003506void ssl_tls1_3_traffic_key_generation(int hash_alg,
3507 data_t *server_secret,
3508 data_t *client_secret,
3509 int desired_iv_len,
3510 int desired_key_len,
3511 data_t *expected_server_write_key,
3512 data_t *expected_server_write_iv,
3513 data_t *expected_client_write_key,
3514 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01003515{
3516 mbedtls_ssl_key_set keys;
3517
3518 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003519 TEST_ASSERT(client_secret->len == server_secret->len);
3520 TEST_ASSERT(expected_client_write_iv->len == expected_server_write_iv->len &&
3521 expected_client_write_iv->len == (size_t) desired_iv_len);
3522 TEST_ASSERT(expected_client_write_key->len == expected_server_write_key->len &&
3523 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01003524
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003525 TEST_ASSERT(mbedtls_ssl_tls1_3_make_traffic_keys(
3526 (mbedtls_md_type_t) hash_alg,
3527 client_secret->x,
3528 server_secret->x,
3529 client_secret->len /* == server_secret->len */,
3530 desired_key_len, desired_iv_len,
3531 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01003532
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003533 ASSERT_COMPARE(keys.client_write_key,
3534 keys.key_len,
3535 expected_client_write_key->x,
3536 (size_t) desired_key_len);
3537 ASSERT_COMPARE(keys.server_write_key,
3538 keys.key_len,
3539 expected_server_write_key->x,
3540 (size_t) desired_key_len);
3541 ASSERT_COMPARE(keys.client_write_iv,
3542 keys.iv_len,
3543 expected_client_write_iv->x,
3544 (size_t) desired_iv_len);
3545 ASSERT_COMPARE(keys.server_write_iv,
3546 keys.iv_len,
3547 expected_server_write_iv->x,
3548 (size_t) desired_iv_len);
Hanno Becker19498f82020-08-21 13:37:08 +01003549}
3550/* END_CASE */
3551
Hanno Beckere4849d12020-08-21 14:14:14 +01003552/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003553void ssl_tls1_3_derive_secret(int hash_alg,
3554 data_t *secret,
3555 int label_idx,
3556 data_t *ctx,
3557 int desired_length,
3558 int already_hashed,
3559 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01003560{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003561 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01003562
Hanno Becker70d7fb02020-09-09 10:11:21 +01003563 unsigned char const *lbl = NULL;
3564 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003565#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
3566 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01003567 { \
3568 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003569 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01003570 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003571 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01003572#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003573 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01003574
Hanno Beckere4849d12020-08-21 14:14:14 +01003575 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003576 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
3577 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01003578
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003579 TEST_ASSERT(mbedtls_ssl_tls1_3_derive_secret(
3580 (mbedtls_md_type_t) hash_alg,
3581 secret->x, secret->len,
3582 lbl, lbl_len,
3583 ctx->x, ctx->len,
3584 already_hashed,
3585 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01003586
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003587 ASSERT_COMPARE(dst, desired_length,
3588 expected->x, desired_length);
Hanno Beckere4849d12020-08-21 14:14:14 +01003589}
3590/* END_CASE */
3591
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01003592/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003593void ssl_tls1_3_key_evolution(int hash_alg,
3594 data_t *secret,
3595 data_t *input,
3596 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01003597{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003598 unsigned char secret_new[MBEDTLS_MD_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01003599
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003600 TEST_ASSERT(mbedtls_ssl_tls1_3_evolve_secret(
3601 (mbedtls_md_type_t) hash_alg,
3602 secret->len ? secret->x : NULL,
3603 input->len ? input->x : NULL, input->len,
3604 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01003605
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003606 ASSERT_COMPARE(secret_new, (size_t) expected->len,
3607 expected->x, (size_t) expected->len);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01003608}
3609/* END_CASE */
3610
Ron Eldor824ad7b2019-05-13 14:09:00 +03003611/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003612void ssl_tls_prf(int type, data_t *secret, data_t *random,
3613 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03003614{
3615 unsigned char *output;
3616
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003617 output = mbedtls_calloc(1, result_str->len);
3618 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03003619 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003620 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03003621
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003622 USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03003623
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003624 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
3625 label, random->x, random->len,
3626 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03003627
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003628 if (exp_ret == 0) {
3629 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
3630 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03003631 }
3632exit:
3633
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003634 mbedtls_free(output);
3635 USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03003636}
3637/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003638
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003639/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003640void ssl_serialize_session_save_load(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003641{
3642 mbedtls_ssl_session original, restored;
3643 unsigned char *buf = NULL;
3644 size_t len;
3645
3646 /*
3647 * Test that a save-load pair is the identity
3648 */
3649
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003650 mbedtls_ssl_session_init(&original);
3651 mbedtls_ssl_session_init(&restored);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003652
3653 /* Prepare a dummy session to work on */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003654 TEST_ASSERT(ssl_populate_session(&original, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003655
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003656 /* Serialize it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003657 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
3658 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
3659 TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL);
3660 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
3661 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003662
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003663 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003664 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003665
3666 /*
3667 * Make sure both session structures are identical
3668 */
3669#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003670 TEST_ASSERT(original.start == restored.start);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003671#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003672 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
3673 TEST_ASSERT(original.compression == restored.compression);
3674 TEST_ASSERT(original.id_len == restored.id_len);
3675 TEST_ASSERT(memcmp(original.id,
3676 restored.id, sizeof(original.id)) == 0);
3677 TEST_ASSERT(memcmp(original.master,
3678 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003679
Gilles Peskine33d03fe2023-02-01 18:37:49 +01003680#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
3681 defined(MBEDTLS_CERTS_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02003682#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003683 TEST_ASSERT((original.peer_cert == NULL) ==
3684 (restored.peer_cert == NULL));
3685 if (original.peer_cert != NULL) {
3686 TEST_ASSERT(original.peer_cert->raw.len ==
3687 restored.peer_cert->raw.len);
3688 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
3689 restored.peer_cert->raw.p,
3690 original.peer_cert->raw.len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003691 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02003692#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003693 TEST_ASSERT(original.peer_cert_digest_type ==
3694 restored.peer_cert_digest_type);
3695 TEST_ASSERT(original.peer_cert_digest_len ==
3696 restored.peer_cert_digest_len);
3697 TEST_ASSERT((original.peer_cert_digest == NULL) ==
3698 (restored.peer_cert_digest == NULL));
3699 if (original.peer_cert_digest != NULL) {
3700 TEST_ASSERT(memcmp(original.peer_cert_digest,
3701 restored.peer_cert_digest,
3702 original.peer_cert_digest_len) == 0);
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02003703 }
3704#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine33d03fe2023-02-01 18:37:49 +01003705#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003706 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003707
3708#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003709 TEST_ASSERT(original.ticket_len == restored.ticket_len);
3710 if (original.ticket_len != 0) {
3711 TEST_ASSERT(original.ticket != NULL);
3712 TEST_ASSERT(restored.ticket != NULL);
3713 TEST_ASSERT(memcmp(original.ticket,
3714 restored.ticket, original.ticket_len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003715 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003716 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003717#endif
3718
3719#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003720 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003721#endif
3722
3723#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003724 TEST_ASSERT(original.trunc_hmac == restored.trunc_hmac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003725#endif
3726
3727#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003728 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003729#endif
3730
3731exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003732 mbedtls_ssl_session_free(&original);
3733 mbedtls_ssl_session_free(&restored);
3734 mbedtls_free(buf);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02003735}
3736/* END_CASE */
3737
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02003738/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003739void ssl_serialize_session_load_save(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003740{
3741 mbedtls_ssl_session session;
3742 unsigned char *buf1 = NULL, *buf2 = NULL;
3743 size_t len0, len1, len2;
3744
3745 /*
3746 * Test that a load-save pair is the identity
3747 */
3748
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003749 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003750
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02003751 /* Prepare a dummy session to work on */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003752 TEST_ASSERT(ssl_populate_session(&session, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02003753
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003754 /* Get desired buffer size for serializing */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003755 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
3756 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003757
3758 /* Allocate first buffer */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003759 buf1 = mbedtls_calloc(1, len0);
3760 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003761
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003762 /* Serialize to buffer and free live session */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003763 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
3764 == 0);
3765 TEST_ASSERT(len0 == len1);
3766 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003767
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003768 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003769 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003770
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003771 /* Allocate second buffer and serialize to it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003772 buf2 = mbedtls_calloc(1, len0);
3773 TEST_ASSERT(buf2 != NULL);
3774 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
3775 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003776
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003777 /* Make sure both serialized versions are identical */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003778 TEST_ASSERT(len1 == len2);
3779 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003780
3781exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003782 mbedtls_ssl_session_free(&session);
3783 mbedtls_free(buf1);
3784 mbedtls_free(buf2);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02003785}
3786/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003787
3788/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003789void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003790{
3791 mbedtls_ssl_session session;
3792 unsigned char *buf = NULL;
3793 size_t good_len, bad_len, test_len;
3794
3795 /*
3796 * Test that session_save() fails cleanly on small buffers
3797 */
3798
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003799 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003800
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003801 /* Prepare dummy session and get serialized size */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003802 TEST_ASSERT(ssl_populate_session(&session, ticket_len, crt_file) == 0);
3803 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
3804 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003805
3806 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003807 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003808 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003809 mbedtls_free(buf);
3810 TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL);
3811 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
3812 &test_len)
3813 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
3814 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003815 }
3816
3817exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003818 mbedtls_ssl_session_free(&session);
3819 mbedtls_free(buf);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02003820}
3821/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003822
3823/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003824void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003825{
3826 mbedtls_ssl_session session;
3827 unsigned char *good_buf = NULL, *bad_buf = NULL;
3828 size_t good_len, bad_len;
3829
3830 /*
3831 * Test that session_load() fails cleanly on small buffers
3832 */
3833
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003834 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003835
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02003836 /* Prepare serialized session data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003837 TEST_ASSERT(ssl_populate_session(&session, ticket_len, crt_file) == 0);
3838 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
3839 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
3840 TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL);
3841 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
3842 &good_len) == 0);
3843 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003844
3845 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003846 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003847 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003848 mbedtls_free(bad_buf);
3849 bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1);
3850 TEST_ASSERT(bad_buf != NULL);
3851 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003852
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003853 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
3854 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003855 }
3856
3857exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003858 mbedtls_ssl_session_free(&session);
3859 mbedtls_free(good_buf);
3860 mbedtls_free(bad_buf);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003861}
3862/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01003863
Hanno Becker363b6462019-05-29 12:44:28 +01003864/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003865void ssl_session_serialize_version_check(int corrupt_major,
3866 int corrupt_minor,
3867 int corrupt_patch,
3868 int corrupt_config)
Hanno Becker861d0bb2019-05-21 16:39:30 +01003869{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003870 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01003871 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003872 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01003873 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003874 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
3875 corrupt_minor == 1,
3876 corrupt_patch == 1,
3877 corrupt_config == 1,
3878 corrupt_config == 1 };
3879
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003880 mbedtls_ssl_session_init(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01003881
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003882 /* Infer length of serialized session. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003883 TEST_ASSERT(mbedtls_ssl_session_save(&session,
3884 serialized_session,
3885 sizeof(serialized_session),
3886 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01003887
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003888 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01003889
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003890 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01003891 * de-serialize the session - double-check that. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003892 TEST_ASSERT(mbedtls_ssl_session_load(&session,
3893 serialized_session,
3894 serialized_session_len) == 0);
3895 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01003896
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003897 /* Go through the bytes in the serialized session header and
3898 * corrupt them bit-by-bit. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003899 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003900 int cur_bit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003901 unsigned char * const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003902
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003903 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003904 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003905 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003906
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003907 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003908 unsigned char const corrupted_bit = 0x1u << cur_bit;
3909 /* Modify a single bit in the serialized session. */
3910 *byte ^= corrupted_bit;
3911
3912 /* Attempt to deserialize */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003913 TEST_ASSERT(mbedtls_ssl_session_load(&session,
3914 serialized_session,
3915 serialized_session_len) ==
3916 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01003917
3918 /* Undo the change */
3919 *byte ^= corrupted_bit;
3920 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01003921 }
3922
Hanno Becker861d0bb2019-05-21 16:39:30 +01003923}
3924/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003925
Gilles Peskine33d03fe2023-02-01 18:37:49 +01003926/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003927void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003928{
3929 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08003930 mbedtls_test_ssl_endpoint ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003931 int ret = -1;
3932
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003933 ret = mbedtls_endpoint_init(NULL, endpoint_type, MBEDTLS_PK_RSA,
3934 NULL, NULL, NULL, NULL);
3935 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003936
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003937 ret = mbedtls_endpoint_certificate_init(NULL, MBEDTLS_PK_RSA);
3938 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003939
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003940 ret = mbedtls_endpoint_init(&ep, endpoint_type, MBEDTLS_PK_RSA,
3941 NULL, NULL, NULL, NULL);
3942 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003943
3944exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003945 mbedtls_endpoint_free(&ep, NULL);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003946}
3947/* END_CASE */
3948
Gilles Peskine33d03fe2023-02-01 18:37:49 +01003949/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003950void move_handshake_to_state(int endpoint_type, int state, int need_pass)
3951{
3952 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08003953 mbedtls_test_ssl_endpoint base_ep, second_ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003954 int ret = -1;
3955
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003956 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
3957 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Andrzej Kurek0d2982b2022-10-18 07:55:46 -04003958
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003959 ret = mbedtls_endpoint_init(&base_ep, endpoint_type, MBEDTLS_PK_RSA,
3960 NULL, NULL, NULL, NULL);
3961 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003962
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003963 ret = mbedtls_endpoint_init(&second_ep,
3964 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
3965 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
3966 MBEDTLS_PK_RSA, NULL, NULL, NULL, NULL);
3967 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003968
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003969 ret = mbedtls_mock_socket_connect(&(base_ep.socket),
3970 &(second_ep.socket),
3971 BUFFSIZE);
3972 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003973
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003974 ret = mbedtls_move_handshake_to_state(&(base_ep.ssl),
3975 &(second_ep.ssl),
3976 state);
3977 if (need_pass) {
3978 TEST_ASSERT(ret == 0);
3979 TEST_ASSERT(base_ep.ssl.state == state);
3980 } else {
3981 TEST_ASSERT(ret != 0);
3982 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003983 }
3984
3985exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003986 mbedtls_endpoint_free(&base_ep, NULL);
3987 mbedtls_endpoint_free(&second_ep, NULL);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01003988}
3989/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003990
Gilles Peskine33d03fe2023-02-01 18:37:49 +01003991/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003992void handshake_version(int dtls, int client_min_version, int client_max_version,
3993 int server_min_version, int server_max_version,
3994 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05003995{
Yanray Wangabfdcd82022-10-25 16:44:13 +08003996 mbedtls_test_handshake_test_options options;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01003997 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05003998
Paul Elliottc8570442020-04-15 17:00:50 +01003999 options.client_min_version = client_min_version;
4000 options.client_max_version = client_max_version;
4001 options.server_min_version = server_min_version;
4002 options.server_max_version = server_max_version;
4003
4004 options.expected_negotiated_version = expected_negotiated_version;
4005
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004006 options.dtls = dtls;
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01004007 /* By default, SSLv3.0 and TLSv1.0 use 1/n-1 splitting when sending data, so
4008 * the number of fragments will be twice as big. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004009 if (expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_0 ||
4010 expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_1) {
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01004011 options.expected_cli_fragments = 2;
4012 options.expected_srv_fragments = 2;
Andrzej Kurek941962e2020-02-07 09:20:32 -05004013 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004014 perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05004015
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004016 /* The goto below is used to avoid an "unused label" warning.*/
4017 goto exit;
4018}
4019/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05004020
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004021/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004022void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004023{
Yanray Wangabfdcd82022-10-25 16:44:13 +08004024 mbedtls_test_handshake_test_options options;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004025 init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05004026
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004027 options.cipher = cipher;
4028 options.dtls = dtls;
4029 options.psk_str = psk_str;
4030 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05004031
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004032 perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05004033
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004034 /* The goto below is used to avoid an "unused label" warning.*/
4035 goto exit;
4036}
4037/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05004038
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004039/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004040void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004041{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004042 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05004043
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004044 /* The goto below is used to avoid an "unused label" warning.*/
4045 goto exit;
4046}
4047/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05004048
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004049/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004050void app_data(int mfl, int cli_msg_len, int srv_msg_len,
4051 int expected_cli_fragments,
4052 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004053{
Yanray Wangabfdcd82022-10-25 16:44:13 +08004054 mbedtls_test_handshake_test_options options;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004055 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004056
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004057 options.mfl = mfl;
4058 options.cli_msg_len = cli_msg_len;
4059 options.srv_msg_len = srv_msg_len;
4060 options.expected_cli_fragments = expected_cli_fragments;
4061 options.expected_srv_fragments = expected_srv_fragments;
4062 options.dtls = dtls;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004063
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004064 perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004065 /* The goto below is used to avoid an "unused label" warning.*/
4066 goto exit;
4067}
4068/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004069
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004070/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004071void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
4072 int expected_cli_fragments,
4073 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004074{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004075 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
4076 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004077 /* The goto below is used to avoid an "unused label" warning.*/
4078 goto exit;
4079}
4080/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004081
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004082/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004083void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
4084 int expected_cli_fragments,
4085 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004086{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004087 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
4088 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004089 /* The goto below is used to avoid an "unused label" warning.*/
4090 goto exit;
4091}
4092/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004093
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004094/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004095void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004096{
Yanray Wangabfdcd82022-10-25 16:44:13 +08004097 mbedtls_test_handshake_test_options options;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004098 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004099
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004100 options.serialize = 1;
4101 options.dtls = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004102 perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004103 /* The goto below is used to avoid an "unused label" warning.*/
4104 goto exit;
4105}
4106/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004107
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004108/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED*/
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004109void handshake_fragmentation(int mfl,
4110 int expected_srv_hs_fragmentation,
4111 int expected_cli_hs_fragmentation)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004112{
Yanray Wangabfdcd82022-10-25 16:44:13 +08004113 mbedtls_test_handshake_test_options options;
4114 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004115
4116 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
4117 srv_pattern.counter = 0;
4118 cli_pattern.counter = 0;
4119
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004120 init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004121 options.dtls = 1;
4122 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00004123 /* Set cipher to one using CBC so that record splitting can be tested */
4124 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004125 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
4126 options.srv_log_obj = &srv_pattern;
4127 options.cli_log_obj = &cli_pattern;
4128 options.srv_log_fun = log_analyzer;
4129 options.cli_log_fun = log_analyzer;
4130
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004131 perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004132
4133 /* Test if the server received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004134 if (expected_srv_hs_fragmentation) {
4135 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004136 }
4137 /* Test if the client received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004138 if (expected_cli_hs_fragmentation) {
4139 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01004140 }
4141}
4142/* END_CASE */
4143
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004144/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004145void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004146{
Yanray Wangabfdcd82022-10-25 16:44:13 +08004147 mbedtls_test_handshake_test_options options;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004148 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05004149
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004150 options.renegotiate = 1;
4151 options.legacy_renegotiation = legacy_renegotiation;
4152 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05004153
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004154 perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05004155 /* The goto below is used to avoid an "unused label" warning.*/
4156 goto exit;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05004157}
4158/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004159
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004160/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004161void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
4162 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004163{
Yanray Wangabfdcd82022-10-25 16:44:13 +08004164 mbedtls_test_handshake_test_options options;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004165 init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004166
4167 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04004168 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004169 options.renegotiate = renegotiation;
4170 options.legacy_renegotiation = legacy_renegotiation;
4171 options.serialize = serialize;
4172 options.dtls = dtls;
4173 options.resize_buffers = 1;
4174
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004175 perform_handshake(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004176 /* The goto below is used to avoid an "unused label" warning.*/
4177 goto exit;
4178}
4179/* END_CASE */
4180
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004181/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004182void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004183{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004184 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
4185 (char *) "");
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004186
4187 /* The goto below is used to avoid an "unused label" warning.*/
4188 goto exit;
4189}
4190/* END_CASE */
4191
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004192/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004193void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
4194 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004195{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004196 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004197
4198 /* The goto below is used to avoid an "unused label" warning.*/
4199 goto exit;
4200}
4201/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02004202
Gilles Peskine33d03fe2023-02-01 18:37:49 +01004203/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_ECDSA_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004204void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004205{
4206 enum { BUFFSIZE = 17000 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08004207 mbedtls_test_ssl_endpoint client, server;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004208 mbedtls_psa_stats_t stats;
Andrzej Kurek2582ba32022-03-31 06:30:54 -04004209 size_t free_slots_before = -1;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004210
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004211 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP256R1,
4212 MBEDTLS_ECP_DP_NONE };
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004213 USE_PSA_INIT();
4214 mbedtls_platform_zeroize(&client, sizeof(client));
4215 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004216
4217 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek9cb14d42022-04-14 08:51:41 -04004218 * the raw key agreement. Flipping the first byte makes the
4219 * required 0x04 identifier invalid. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004220 TEST_EQUAL(mbedtls_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
4221 MBEDTLS_PK_ECDSA, NULL, NULL,
4222 NULL, curve_list), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004223
4224 /* Server side */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004225 TEST_EQUAL(mbedtls_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
4226 MBEDTLS_PK_ECDSA, NULL, NULL,
4227 NULL, NULL), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004228
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004229 TEST_EQUAL(mbedtls_mock_socket_connect(&(client.socket),
4230 &(server.socket),
4231 BUFFSIZE), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004232
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004233 TEST_EQUAL(mbedtls_move_handshake_to_state(&(client.ssl),
4234 &(server.ssl),
4235 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE)
4236 , 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004237
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004238 mbedtls_psa_get_stats(&stats);
Andrzej Kurek2582ba32022-03-31 06:30:54 -04004239 /* Save the number of slots in use up to this point.
4240 * With PSA, one can be used for the ECDH private key. */
4241 free_slots_before = stats.empty_slots;
Andrzej Kurek99f67782022-03-31 07:17:18 -04004242
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004243 if (bad_server_ecdhe_key) {
Gilles Peskine6dd489c2022-04-15 05:54:40 -04004244 /* Force a simulated bitflip in the server key. to make the
4245 * raw key agreement in ssl_write_client_key_exchange fail. */
4246 (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
4247 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004248
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004249 TEST_EQUAL(mbedtls_move_handshake_to_state(&(client.ssl),
4250 &(server.ssl),
4251 MBEDTLS_SSL_HANDSHAKE_OVER),
4252 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004253
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004254 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004255
Gilles Peskine6dd489c2022-04-15 05:54:40 -04004256 /* Make sure that the key slot is already destroyed in case of failure,
4257 * without waiting to close the connection. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004258 if (bad_server_ecdhe_key) {
4259 TEST_EQUAL(free_slots_before, stats.empty_slots);
4260 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004261
4262exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004263 mbedtls_endpoint_free(&client, NULL);
4264 mbedtls_endpoint_free(&server, NULL);
Andrzej Kurek99f67782022-03-31 07:17:18 -04004265
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004266 USE_PSA_DONE();
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04004267}
4268/* END_CASE */
Andrzej Kurek862acb82022-06-06 13:08:23 -04004269
Andrzej Kurek3c036f52022-06-08 11:57:57 -04004270/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004271void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurek862acb82022-06-06 13:08:23 -04004272{
4273 mbedtls_ssl_context ssl;
4274 mbedtls_ssl_config conf;
4275 size_t len;
4276
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004277 mbedtls_ssl_init(&ssl);
4278 mbedtls_ssl_config_init(&conf);
4279 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
4280 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
4281 MBEDTLS_SSL_PRESET_DEFAULT),
4282 0);
Andrzej Kurek862acb82022-06-06 13:08:23 -04004283
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004284 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
4285 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
4286 ssl.cli_id_len,
4287 cookie->x, cookie->len,
4288 ssl.out_buf,
4289 MBEDTLS_SSL_OUT_CONTENT_LEN,
4290 &len),
4291 exp_ret);
Andrzej Kurek862acb82022-06-06 13:08:23 -04004292
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01004293 mbedtls_ssl_free(&ssl);
4294 mbedtls_ssl_config_free(&conf);
Andrzej Kurek862acb82022-06-06 13:08:23 -04004295}
4296/* END_CASE */