blob: ed73678cb55bf03e4159372da790d5e90e685cac [file] [log] [blame]
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include <mbedtls/ssl.h>
Chris Jones84a773f2021-03-05 18:38:47 +00003#include <ssl_misc.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>
Valerio Setti1b08d422023-02-13 11:33:26 +01006#include <mbedtls/pk.h>
Hanno Becker73c825a2020-09-08 10:52:58 +01007#include <ssl_tls13_keys.h>
Gabor Mezeib35759d2022-02-09 16:59:11 +01008#include <ssl_tls13_invasive.h>
Mateusz Starzyk1aec6462021-02-08 15:34:42 +01009#include "test/certs.h"
Yanray Wang47907a42022-10-24 14:42:01 +080010#include <test/ssl_helpers.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +010011
Andrzej Kurek780dc182022-06-10 08:57:19 -040012#if defined(MBEDTLS_SSL_CACHE_C)
13#include "mbedtls/ssl_cache.h"
14#endif
15
Manuel Pégourié-Gonnard07018f92022-09-15 11:29:35 +020016#include <mbedtls/legacy_or_psa.h>
Andrzej Kurek21b68702022-08-17 16:26:12 -040017#include "hash_info.h"
Hanno Becker6667ffd2021-04-19 21:59:22 +010018
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020019#include <constant_time_internal.h>
Manuel Pégourié-Gonnard9670a592020-07-10 10:21:46 +020020#include <test/constant_flow.h>
21
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050022#if defined(MBEDTLS_USE_PSA_CRYPTO)
23#define PSA_TO_MBEDTLS_ERR(status) PSA_TO_MBEDTLS_ERR_LIST(status, \
24 psa_to_ssl_errors, \
25 psa_generic_status_to_mbedtls)
26#endif
27
Andrzej Kurek714ae652022-11-02 19:07:19 -040028#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
29 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
30 defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
31#define MBEDTLS_CAN_HANDLE_RSA_TEST_KEY
32#endif
Gilles Peskine449bd832023-01-11 14:50:10 +010033enum {
34#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
35 tls13_label_ ## name,
36 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +010037#undef MBEDTLS_SSL_TLS1_3_LABEL
Hanno Becker1413bd82020-09-09 12:46:09 +010038};
Hanno Becker70d7fb02020-09-09 10:11:21 +010039
Gilles Peskine449bd832023-01-11 14:50:10 +010040typedef struct log_pattern {
Piotr Nowickibde7ee82020-02-21 10:59:50 +010041 const char *pattern;
42 size_t counter;
43} log_pattern;
44
Ronald Crone68ab4f2022-10-05 12:46:29 +020045#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Andrzej Kurekcccb0442022-08-19 03:42:11 -040046static int rng_seed = 0xBEEF;
Gilles Peskine449bd832023-01-11 14:50:10 +010047static int rng_get(void *p_rng, unsigned char *output, size_t output_len)
Andrzej Kurek635c2c22022-08-17 15:20:40 -040048{
49 (void) p_rng;
Gilles Peskine449bd832023-01-11 14:50:10 +010050 for (size_t i = 0; i < output_len; i++) {
Andrzej Kurekcccb0442022-08-19 03:42:11 -040051 output[i] = rand();
Gilles Peskine449bd832023-01-11 14:50:10 +010052 }
Andrzej Kurekcccb0442022-08-19 03:42:11 -040053
Andrzej Kurek635c2c22022-08-17 15:20:40 -040054 return 0;
55}
Andrzej Kurek32bd0632022-08-20 14:10:36 -040056#endif
Andrzej Kurek635c2c22022-08-17 15:20:40 -040057
Piotr Nowicki438bf3b2020-03-10 12:59:10 +010058/*
59 * This function can be passed to mbedtls to receive output logs from it. In
Piotr Nowickibde7ee82020-02-21 10:59:50 +010060 * this case, it will count the instances of a log_pattern in the received
61 * logged messages.
62 */
Gilles Peskine449bd832023-01-11 14:50:10 +010063void log_analyzer(void *ctx, int level,
64 const char *file, int line,
65 const char *str)
Piotr Nowickibde7ee82020-02-21 10:59:50 +010066{
67 log_pattern *p = (log_pattern *) ctx;
68
69 (void) level;
70 (void) line;
71 (void) file;
72
Gilles Peskine449bd832023-01-11 14:50:10 +010073 if (NULL != p &&
Piotr Nowickibde7ee82020-02-21 10:59:50 +010074 NULL != p->pattern &&
Gilles Peskine449bd832023-01-11 14:50:10 +010075 NULL != strstr(str, p->pattern)) {
Piotr Nowickibde7ee82020-02-21 10:59:50 +010076 p->counter++;
77 }
78}
Janos Follath6264e662019-11-26 11:11:15 +000079
Gilles Peskine449bd832023-01-11 14:50:10 +010080typedef struct handshake_test_options {
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050081 const char *cipher;
Glenn Strauss39e624c2022-04-11 13:33:16 -040082 mbedtls_ssl_protocol_version client_min_version;
83 mbedtls_ssl_protocol_version client_max_version;
84 mbedtls_ssl_protocol_version server_min_version;
85 mbedtls_ssl_protocol_version server_max_version;
86 mbedtls_ssl_protocol_version expected_negotiated_version;
Neil Armstrong8c52ed82022-05-27 13:14:55 +020087 int expected_handshake_result;
88 int expected_ciphersuite;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050089 int pk_alg;
Neil Armstrong8c52ed82022-05-27 13:14:55 +020090 int opaque_alg;
91 int opaque_alg2;
92 int opaque_usage;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050093 data_t *psk_str;
94 int dtls;
Piotr Nowickibde7ee82020-02-21 10:59:50 +010095 int srv_auth_mode;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -050096 int serialize;
97 int mfl;
98 int cli_msg_len;
99 int srv_msg_len;
100 int expected_cli_fragments;
101 int expected_srv_fragments;
102 int renegotiate;
103 int legacy_renegotiation;
Piotr Nowickibde7ee82020-02-21 10:59:50 +0100104 void *srv_log_obj;
105 void *cli_log_obj;
106 void (*srv_log_fun)(void *, int, const char *, int, const char *);
107 void (*cli_log_fun)(void *, int, const char *, int, const char *);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500108 int resize_buffers;
Andrzej Kurek780dc182022-06-10 08:57:19 -0400109#if defined(MBEDTLS_SSL_CACHE_C)
Andrzej Kurek92d74172022-06-28 10:29:42 -0400110 mbedtls_ssl_cache_context *cache;
Andrzej Kurek780dc182022-06-10 08:57:19 -0400111#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -0500112} handshake_test_options;
113
Gilles Peskine449bd832023-01-11 14:50:10 +0100114void init_handshake_options(handshake_test_options *opts)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -0500115{
Ronald Crone68ab4f2022-10-05 12:46:29 +0200116#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 srand(rng_seed);
Andrzej Kurek635c2c22022-08-17 15:20:40 -0400118 rng_seed += 0xD0;
Andrzej Kurek32bd0632022-08-20 14:10:36 -0400119#endif
Andrzej Kurek3d0d5012022-07-04 05:20:55 -0400120 opts->cipher = "";
121 opts->client_min_version = MBEDTLS_SSL_VERSION_UNKNOWN;
122 opts->client_max_version = MBEDTLS_SSL_VERSION_UNKNOWN;
123 opts->server_min_version = MBEDTLS_SSL_VERSION_UNKNOWN;
124 opts->server_max_version = MBEDTLS_SSL_VERSION_UNKNOWN;
125 opts->expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_2;
126 opts->expected_handshake_result = 0;
127 opts->expected_ciphersuite = 0;
128 opts->pk_alg = MBEDTLS_PK_RSA;
129 opts->opaque_alg = 0;
130 opts->opaque_alg2 = 0;
131 opts->opaque_usage = 0;
132 opts->psk_str = NULL;
133 opts->dtls = 0;
134 opts->srv_auth_mode = MBEDTLS_SSL_VERIFY_NONE;
135 opts->serialize = 0;
136 opts->mfl = MBEDTLS_SSL_MAX_FRAG_LEN_NONE;
137 opts->cli_msg_len = 100;
138 opts->srv_msg_len = 100;
139 opts->expected_cli_fragments = 1;
140 opts->expected_srv_fragments = 1;
141 opts->renegotiate = 0;
142 opts->legacy_renegotiation = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION;
143 opts->srv_log_obj = NULL;
144 opts->srv_log_obj = NULL;
145 opts->srv_log_fun = NULL;
146 opts->cli_log_fun = NULL;
147 opts->resize_buffers = 1;
Andrzej Kurek780dc182022-06-10 08:57:19 -0400148#if defined(MBEDTLS_SSL_CACHE_C)
Andrzej Kurek9dc44022022-07-04 05:46:15 -0400149 opts->cache = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 ASSERT_ALLOC(opts->cache, 1);
151 mbedtls_ssl_cache_init(opts->cache);
Andrzej Kurek3d0d5012022-07-04 05:20:55 -0400152exit:
153 return;
Andrzej Kurek780dc182022-06-10 08:57:19 -0400154#endif
155}
156
Gilles Peskine449bd832023-01-11 14:50:10 +0100157void free_handshake_options(handshake_test_options *opts)
Andrzej Kurek780dc182022-06-10 08:57:19 -0400158{
159#if defined(MBEDTLS_SSL_CACHE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 mbedtls_ssl_cache_free(opts->cache);
161 mbedtls_free(opts->cache);
Andrzej Kurek780dc182022-06-10 08:57:19 -0400162#else
163 (void) opts;
164#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -0500165}
Ronald Crone3dac4a2022-06-10 17:21:51 +0200166
Ronald Crone7b9b6b2022-06-10 17:24:31 +0200167#if defined(MBEDTLS_TEST_HOOKS)
168static void set_chk_buf_ptr_args(
169 mbedtls_ssl_chk_buf_ptr_args *args,
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 unsigned char *cur, unsigned char *end, size_t need)
Ronald Crone7b9b6b2022-06-10 17:24:31 +0200171{
172 args->cur = cur;
173 args->end = end;
174 args->need = need;
175}
176
Gilles Peskine449bd832023-01-11 14:50:10 +0100177static void reset_chk_buf_ptr_args(mbedtls_ssl_chk_buf_ptr_args *args)
Ronald Crone7b9b6b2022-06-10 17:24:31 +0200178{
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 memset(args, 0, sizeof(*args));
Ronald Crone7b9b6b2022-06-10 17:24:31 +0200180}
181#endif /* MBEDTLS_TEST_HOOKS */
182
Janos Follath6264e662019-11-26 11:11:15 +0000183/*
184 * Buffer structure for custom I/O callbacks.
185 */
186
Gilles Peskine449bd832023-01-11 14:50:10 +0100187typedef struct mbedtls_test_buffer {
Janos Follath6264e662019-11-26 11:11:15 +0000188 size_t start;
189 size_t content_length;
190 size_t capacity;
191 unsigned char *buffer;
192} mbedtls_test_buffer;
193
194/*
195 * Initialises \p buf. After calling this function it is safe to call
196 * `mbedtls_test_buffer_free()` on \p buf.
197 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100198void mbedtls_test_buffer_init(mbedtls_test_buffer *buf)
Janos Follath6264e662019-11-26 11:11:15 +0000199{
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 memset(buf, 0, sizeof(*buf));
Janos Follath6264e662019-11-26 11:11:15 +0000201}
202
203/*
204 * Sets up \p buf. After calling this function it is safe to call
205 * `mbedtls_test_buffer_put()` and `mbedtls_test_buffer_get()` on \p buf.
206 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100207int mbedtls_test_buffer_setup(mbedtls_test_buffer *buf, size_t capacity)
Janos Follath6264e662019-11-26 11:11:15 +0000208{
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 buf->buffer = (unsigned char *) mbedtls_calloc(capacity,
210 sizeof(unsigned char));
211 if (NULL == buf->buffer) {
Janos Follath6264e662019-11-26 11:11:15 +0000212 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 }
Janos Follath6264e662019-11-26 11:11:15 +0000214 buf->capacity = capacity;
215
216 return 0;
217}
218
Gilles Peskine449bd832023-01-11 14:50:10 +0100219void mbedtls_test_buffer_free(mbedtls_test_buffer *buf)
Janos Follath6264e662019-11-26 11:11:15 +0000220{
Gilles Peskine449bd832023-01-11 14:50:10 +0100221 if (buf->buffer != NULL) {
222 mbedtls_free(buf->buffer);
223 }
Janos Follath6264e662019-11-26 11:11:15 +0000224
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 memset(buf, 0, sizeof(*buf));
Janos Follath6264e662019-11-26 11:11:15 +0000226}
227
228/*
229 * Puts \p input_len bytes from the \p input buffer into the ring buffer \p buf.
230 *
231 * \p buf must have been initialized and set up by calling
232 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
233 *
234 * \retval \p input_len, if the data fits.
235 * \retval 0 <= value < \p input_len, if the data does not fit.
236 * \retval -1, if \p buf is NULL, it hasn't been set up or \p input_len is not
237 * zero and \p input is NULL.
238 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100239int mbedtls_test_buffer_put(mbedtls_test_buffer *buf,
240 const unsigned char *input, size_t input_len)
Janos Follath6264e662019-11-26 11:11:15 +0000241{
242 size_t overflow = 0;
243
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 if ((buf == NULL) || (buf->buffer == NULL)) {
Janos Follath6264e662019-11-26 11:11:15 +0000245 return -1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100246 }
Janos Follath6264e662019-11-26 11:11:15 +0000247
248 /* Reduce input_len to a number that fits in the buffer. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 if ((buf->content_length + input_len) > buf->capacity) {
Janos Follath6264e662019-11-26 11:11:15 +0000250 input_len = buf->capacity - buf->content_length;
251 }
252
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 if (input == NULL) {
254 return (input_len == 0) ? 0 : -1;
Janos Follath6264e662019-11-26 11:11:15 +0000255 }
256
Gilles Peskine449bd832023-01-11 14:50:10 +0100257 /* Check if the buffer has not come full circle and free space is not in
258 * the middle */
259 if (buf->start + buf->content_length < buf->capacity) {
Piotr Nowickifb437d72020-01-13 16:59:12 +0100260
261 /* Calculate the number of bytes that need to be placed at lower memory
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 * address */
263 if (buf->start + buf->content_length + input_len
264 > buf->capacity) {
265 overflow = (buf->start + buf->content_length + input_len)
266 % buf->capacity;
Piotr Nowickifb437d72020-01-13 16:59:12 +0100267 }
268
Gilles Peskine449bd832023-01-11 14:50:10 +0100269 memcpy(buf->buffer + buf->start + buf->content_length, input,
270 input_len - overflow);
271 memcpy(buf->buffer, input + input_len - overflow, overflow);
Piotr Nowickifb437d72020-01-13 16:59:12 +0100272
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 } else {
Piotr Nowickifb437d72020-01-13 16:59:12 +0100274 /* The buffer has come full circle and free space is in the middle */
Gilles Peskine449bd832023-01-11 14:50:10 +0100275 memcpy(buf->buffer + buf->start + buf->content_length - buf->capacity,
276 input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000277 }
278
Janos Follath6264e662019-11-26 11:11:15 +0000279 buf->content_length += input_len;
Janos Follath6264e662019-11-26 11:11:15 +0000280 return input_len;
281}
282
283/*
Andrzej Kurekf7774142020-01-22 06:34:59 -0500284 * Gets \p output_len bytes from the ring buffer \p buf into the
285 * \p output buffer. The output buffer can be NULL, in this case a part of the
286 * ring buffer will be dropped, if the requested length is available.
Janos Follath6264e662019-11-26 11:11:15 +0000287 *
288 * \p buf must have been initialized and set up by calling
289 * `mbedtls_test_buffer_init()` and `mbedtls_test_buffer_setup()`.
290 *
291 * \retval \p output_len, if the data is available.
292 * \retval 0 <= value < \p output_len, if the data is not available.
Andrzej Kurekf7774142020-01-22 06:34:59 -0500293 * \retval -1, if \buf is NULL or it hasn't been set up.
Janos Follath6264e662019-11-26 11:11:15 +0000294 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100295int mbedtls_test_buffer_get(mbedtls_test_buffer *buf,
296 unsigned char *output, size_t output_len)
Janos Follath6264e662019-11-26 11:11:15 +0000297{
298 size_t overflow = 0;
299
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 if ((buf == NULL) || (buf->buffer == NULL)) {
Janos Follath6264e662019-11-26 11:11:15 +0000301 return -1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 }
Janos Follath6264e662019-11-26 11:11:15 +0000303
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 if (output == NULL && output_len == 0) {
Andrzej Kurekf7774142020-01-22 06:34:59 -0500305 return 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 }
Janos Follath6264e662019-11-26 11:11:15 +0000307
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 if (buf->content_length < output_len) {
Janos Follath6264e662019-11-26 11:11:15 +0000309 output_len = buf->content_length;
Gilles Peskine449bd832023-01-11 14:50:10 +0100310 }
Janos Follath6264e662019-11-26 11:11:15 +0000311
312 /* Calculate the number of bytes that need to be drawn from lower memory
313 * address */
Gilles Peskine449bd832023-01-11 14:50:10 +0100314 if (buf->start + output_len > buf->capacity) {
315 overflow = (buf->start + output_len) % buf->capacity;
Janos Follath6264e662019-11-26 11:11:15 +0000316 }
317
Gilles Peskine449bd832023-01-11 14:50:10 +0100318 if (output != NULL) {
319 memcpy(output, buf->buffer + buf->start, output_len - overflow);
320 memcpy(output + output_len - overflow, buf->buffer, overflow);
Andrzej Kurekf7774142020-01-22 06:34:59 -0500321 }
322
Janos Follath6264e662019-11-26 11:11:15 +0000323 buf->content_length -= output_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 buf->start = (buf->start + output_len) % buf->capacity;
Janos Follath6264e662019-11-26 11:11:15 +0000325
326 return output_len;
327}
328
Hanno Beckera18d1322018-01-03 14:27:32 +0000329/*
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500330 * Errors used in the message transport mock tests
331 */
332 #define MBEDTLS_TEST_ERROR_ARG_NULL -11
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500333 #define MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED -44
334
335/*
336 * Context for a message metadata queue (fifo) that is on top of the ring buffer.
337 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100338typedef struct mbedtls_test_message_queue {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500339 size_t *messages;
340 int pos;
341 int num;
342 int capacity;
343} mbedtls_test_message_queue;
344
345/*
346 * Setup and free functions for the message metadata queue.
347 *
348 * \p capacity describes the number of message metadata chunks that can be held
349 * within the queue.
350 *
351 * \retval 0, if a metadata queue of a given length can be allocated.
352 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation failed.
353 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100354int mbedtls_test_message_queue_setup(mbedtls_test_message_queue *queue,
355 size_t capacity)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500356{
Gilles Peskine449bd832023-01-11 14:50:10 +0100357 queue->messages = (size_t *) mbedtls_calloc(capacity, sizeof(size_t));
358 if (NULL == queue->messages) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500359 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500361
362 queue->capacity = capacity;
363 queue->pos = 0;
364 queue->num = 0;
365
366 return 0;
367}
368
Gilles Peskine449bd832023-01-11 14:50:10 +0100369void mbedtls_test_message_queue_free(mbedtls_test_message_queue *queue)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500370{
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 if (queue == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500372 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500374
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 if (queue->messages != NULL) {
376 mbedtls_free(queue->messages);
377 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500378
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 memset(queue, 0, sizeof(*queue));
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500380}
381
382/*
383 * Push message length information onto the message metadata queue.
384 * This will become the last element to leave it (fifo).
385 *
386 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500387 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the queue is full.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500388 * \retval \p len, if the push was successful.
389 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100390int mbedtls_test_message_queue_push_info(mbedtls_test_message_queue *queue,
391 size_t len)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500392{
393 int place;
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 if (queue == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500395 return MBEDTLS_TEST_ERROR_ARG_NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100396 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500397
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 if (queue->num >= queue->capacity) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500399 return MBEDTLS_ERR_SSL_WANT_WRITE;
Gilles Peskine449bd832023-01-11 14:50:10 +0100400 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500401
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 place = (queue->pos + queue->num) % queue->capacity;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500403 queue->messages[place] = len;
404 queue->num++;
405 return len;
406}
407
408/*
409 * Pop information about the next message length from the queue. This will be
410 * the oldest inserted message length(fifo). \p msg_len can be null, in which
411 * case the data will be popped from the queue but not copied anywhere.
412 *
413 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500414 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500415 * \retval message length, if the pop was successful, up to the given
416 \p buf_len.
417 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100418int mbedtls_test_message_queue_pop_info(mbedtls_test_message_queue *queue,
419 size_t buf_len)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500420{
421 size_t message_length;
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 if (queue == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500423 return MBEDTLS_TEST_ERROR_ARG_NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100424 }
425 if (queue->num == 0) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500426 return MBEDTLS_ERR_SSL_WANT_READ;
Gilles Peskine449bd832023-01-11 14:50:10 +0100427 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500428
429 message_length = queue->messages[queue->pos];
430 queue->messages[queue->pos] = 0;
431 queue->num--;
432 queue->pos++;
433 queue->pos %= queue->capacity;
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 if (queue->pos < 0) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500435 queue->pos += queue->capacity;
Gilles Peskine449bd832023-01-11 14:50:10 +0100436 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500437
Gilles Peskine449bd832023-01-11 14:50:10 +0100438 return (message_length > buf_len) ? buf_len : message_length;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500439}
440
441/*
442 * Take a peek on the info about the next message length from the queue.
443 * This will be the oldest inserted message length(fifo).
444 *
445 * \retval MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500446 * \retval MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500447 * \retval 0, if the peek was successful.
448 * \retval MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
449 * too small to fit the message. In this case the \p msg_len will be
450 * set to the full message length so that the
451 * caller knows what portion of the message can be dropped.
452 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100453int mbedtls_test_message_queue_peek_info(mbedtls_test_message_queue *queue,
454 size_t buf_len, size_t *msg_len)
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500455{
Gilles Peskine449bd832023-01-11 14:50:10 +0100456 if (queue == NULL || msg_len == NULL) {
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500457 return MBEDTLS_TEST_ERROR_ARG_NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100458 }
459 if (queue->num == 0) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500460 return MBEDTLS_ERR_SSL_WANT_READ;
Gilles Peskine449bd832023-01-11 14:50:10 +0100461 }
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500462
463 *msg_len = queue->messages[queue->pos];
Gilles Peskine449bd832023-01-11 14:50:10 +0100464 return (*msg_len > buf_len) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500465}
466/*
Janos Follath031827f2019-11-27 11:12:14 +0000467 * Context for the I/O callbacks simulating network connection.
468 */
469
470#define MBEDTLS_MOCK_SOCKET_CONNECTED 1
471
Gilles Peskine449bd832023-01-11 14:50:10 +0100472typedef struct mbedtls_mock_socket {
Janos Follath031827f2019-11-27 11:12:14 +0000473 int status;
474 mbedtls_test_buffer *input;
475 mbedtls_test_buffer *output;
476 struct mbedtls_mock_socket *peer;
477} mbedtls_mock_socket;
478
479/*
480 * Setup and teardown functions for mock sockets.
481 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100482void mbedtls_mock_socket_init(mbedtls_mock_socket *socket)
Janos Follath031827f2019-11-27 11:12:14 +0000483{
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 memset(socket, 0, sizeof(*socket));
Janos Follath031827f2019-11-27 11:12:14 +0000485}
486
487/*
488 * Closes the socket \p socket.
489 *
490 * \p socket must have been previously initialized by calling
491 * mbedtls_mock_socket_init().
492 *
493 * This function frees all allocated resources and both sockets are aware of the
494 * new connection state.
495 *
496 * That is, this function does not simulate half-open TCP connections and the
497 * phenomenon that when closing a UDP connection the peer is not aware of the
498 * connection having been closed.
499 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100500void mbedtls_mock_socket_close(mbedtls_mock_socket *socket)
Janos Follath031827f2019-11-27 11:12:14 +0000501{
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 if (socket == NULL) {
Janos Follath031827f2019-11-27 11:12:14 +0000503 return;
Janos Follath031827f2019-11-27 11:12:14 +0000504 }
505
Gilles Peskine449bd832023-01-11 14:50:10 +0100506 if (socket->input != NULL) {
507 mbedtls_test_buffer_free(socket->input);
508 mbedtls_free(socket->input);
Janos Follath031827f2019-11-27 11:12:14 +0000509 }
510
Gilles Peskine449bd832023-01-11 14:50:10 +0100511 if (socket->output != NULL) {
512 mbedtls_test_buffer_free(socket->output);
513 mbedtls_free(socket->output);
514 }
Janos Follath031827f2019-11-27 11:12:14 +0000515
Gilles Peskine449bd832023-01-11 14:50:10 +0100516 if (socket->peer != NULL) {
517 memset(socket->peer, 0, sizeof(*socket->peer));
518 }
519
520 memset(socket, 0, sizeof(*socket));
Janos Follath031827f2019-11-27 11:12:14 +0000521}
522
523/*
524 * Establishes a connection between \p peer1 and \p peer2.
525 *
526 * \p peer1 and \p peer2 must have been previously initialized by calling
527 * mbedtls_mock_socket_init().
528 *
Tom Cosgrove1797b052022-12-04 17:19:59 +0000529 * The capacities of the internal buffers are set to \p bufsize. Setting this to
Janos Follath031827f2019-11-27 11:12:14 +0000530 * the correct value allows for simulation of MTU, sanity testing the mock
531 * implementation and mocking TCP connections with lower memory cost.
532 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100533int mbedtls_mock_socket_connect(mbedtls_mock_socket *peer1,
534 mbedtls_mock_socket *peer2,
535 size_t bufsize)
Janos Follath031827f2019-11-27 11:12:14 +0000536{
537 int ret = -1;
538
Piotr Nowickid796e192020-01-28 12:09:47 +0100539 peer1->output =
Gilles Peskine449bd832023-01-11 14:50:10 +0100540 (mbedtls_test_buffer *) mbedtls_calloc(1, sizeof(mbedtls_test_buffer));
541 if (peer1->output == NULL) {
Janos Follath031827f2019-11-27 11:12:14 +0000542 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
543 goto exit;
544 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100545 mbedtls_test_buffer_init(peer1->output);
546 if (0 != (ret = mbedtls_test_buffer_setup(peer1->output, bufsize))) {
Janos Follath031827f2019-11-27 11:12:14 +0000547 goto exit;
548 }
549
Piotr Nowickid796e192020-01-28 12:09:47 +0100550 peer2->output =
Gilles Peskine449bd832023-01-11 14:50:10 +0100551 (mbedtls_test_buffer *) mbedtls_calloc(1, sizeof(mbedtls_test_buffer));
552 if (peer2->output == NULL) {
Piotr Nowickid796e192020-01-28 12:09:47 +0100553 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
554 goto exit;
555 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 mbedtls_test_buffer_init(peer2->output);
557 if (0 != (ret = mbedtls_test_buffer_setup(peer2->output, bufsize))) {
Piotr Nowickid796e192020-01-28 12:09:47 +0100558 goto exit;
559 }
560
Janos Follath031827f2019-11-27 11:12:14 +0000561 peer1->peer = peer2;
562 peer2->peer = peer1;
Piotr Nowickid796e192020-01-28 12:09:47 +0100563 peer1->input = peer2->output;
564 peer2->input = peer1->output;
Janos Follath031827f2019-11-27 11:12:14 +0000565
566 peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
567 ret = 0;
568
569exit:
570
Gilles Peskine449bd832023-01-11 14:50:10 +0100571 if (ret != 0) {
572 mbedtls_mock_socket_close(peer1);
573 mbedtls_mock_socket_close(peer2);
Janos Follath031827f2019-11-27 11:12:14 +0000574 }
575
576 return ret;
577}
578
579/*
580 * Callbacks for simulating blocking I/O over connection-oriented transport.
581 */
582
Gilles Peskine449bd832023-01-11 14:50:10 +0100583int mbedtls_mock_tcp_send_b(void *ctx, const unsigned char *buf, size_t len)
Janos Follath031827f2019-11-27 11:12:14 +0000584{
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 mbedtls_mock_socket *socket = (mbedtls_mock_socket *) ctx;
Janos Follath031827f2019-11-27 11:12:14 +0000586
Gilles Peskine449bd832023-01-11 14:50:10 +0100587 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath031827f2019-11-27 11:12:14 +0000588 return -1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 }
Janos Follath031827f2019-11-27 11:12:14 +0000590
Gilles Peskine449bd832023-01-11 14:50:10 +0100591 return mbedtls_test_buffer_put(socket->output, buf, len);
Janos Follath031827f2019-11-27 11:12:14 +0000592}
593
Gilles Peskine449bd832023-01-11 14:50:10 +0100594int mbedtls_mock_tcp_recv_b(void *ctx, unsigned char *buf, size_t len)
Janos Follath031827f2019-11-27 11:12:14 +0000595{
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 mbedtls_mock_socket *socket = (mbedtls_mock_socket *) ctx;
Janos Follath031827f2019-11-27 11:12:14 +0000597
Gilles Peskine449bd832023-01-11 14:50:10 +0100598 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath031827f2019-11-27 11:12:14 +0000599 return -1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100600 }
Janos Follath031827f2019-11-27 11:12:14 +0000601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 return mbedtls_test_buffer_get(socket->input, buf, len);
Janos Follath031827f2019-11-27 11:12:14 +0000603}
604
605/*
Janos Follath3766ba52019-11-27 13:31:42 +0000606 * Callbacks for simulating non-blocking I/O over connection-oriented transport.
607 */
608
Gilles Peskine449bd832023-01-11 14:50:10 +0100609int mbedtls_mock_tcp_send_nb(void *ctx, const unsigned char *buf, size_t len)
Janos Follath3766ba52019-11-27 13:31:42 +0000610{
Gilles Peskine449bd832023-01-11 14:50:10 +0100611 mbedtls_mock_socket *socket = (mbedtls_mock_socket *) ctx;
Janos Follath3766ba52019-11-27 13:31:42 +0000612
Gilles Peskine449bd832023-01-11 14:50:10 +0100613 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath3766ba52019-11-27 13:31:42 +0000614 return -1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100615 }
Janos Follath3766ba52019-11-27 13:31:42 +0000616
Gilles Peskine449bd832023-01-11 14:50:10 +0100617 if (socket->output->capacity == socket->output->content_length) {
Janos Follath3766ba52019-11-27 13:31:42 +0000618 return MBEDTLS_ERR_SSL_WANT_WRITE;
619 }
620
Gilles Peskine449bd832023-01-11 14:50:10 +0100621 return mbedtls_test_buffer_put(socket->output, buf, len);
Janos Follath3766ba52019-11-27 13:31:42 +0000622}
623
Gilles Peskine449bd832023-01-11 14:50:10 +0100624int mbedtls_mock_tcp_recv_nb(void *ctx, unsigned char *buf, size_t len)
Janos Follath3766ba52019-11-27 13:31:42 +0000625{
Gilles Peskine449bd832023-01-11 14:50:10 +0100626 mbedtls_mock_socket *socket = (mbedtls_mock_socket *) ctx;
Janos Follath3766ba52019-11-27 13:31:42 +0000627
Gilles Peskine449bd832023-01-11 14:50:10 +0100628 if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
Janos Follath3766ba52019-11-27 13:31:42 +0000629 return -1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100630 }
Janos Follath3766ba52019-11-27 13:31:42 +0000631
Gilles Peskine449bd832023-01-11 14:50:10 +0100632 if (socket->input->content_length == 0) {
Janos Follath3766ba52019-11-27 13:31:42 +0000633 return MBEDTLS_ERR_SSL_WANT_READ;
634 }
635
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 return mbedtls_test_buffer_get(socket->input, buf, len);
Janos Follath3766ba52019-11-27 13:31:42 +0000637}
638
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500639/* Errors used in the message socket mocks */
640
641#define MBEDTLS_TEST_ERROR_CONTEXT_ERROR -55
642#define MBEDTLS_TEST_ERROR_SEND_FAILED -66
643#define MBEDTLS_TEST_ERROR_RECV_FAILED -77
644
645/*
646 * Structure used as an addon, or a wrapper, around the mocked sockets.
647 * Contains an input queue, to which the other socket pushes metadata,
648 * and an output queue, to which this one pushes metadata. This context is
649 * considered as an owner of the input queue only, which is initialized and
650 * freed in the respective setup and free calls.
651 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100652typedef struct mbedtls_test_message_socket_context {
653 mbedtls_test_message_queue *queue_input;
654 mbedtls_test_message_queue *queue_output;
655 mbedtls_mock_socket *socket;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500656} mbedtls_test_message_socket_context;
657
Gilles Peskine449bd832023-01-11 14:50:10 +0100658void mbedtls_message_socket_init(mbedtls_test_message_socket_context *ctx)
Andrzej Kurek45916ba2020-03-05 14:46:22 -0500659{
660 ctx->queue_input = NULL;
661 ctx->queue_output = NULL;
662 ctx->socket = NULL;
663}
664
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500665/*
Tom Cosgrove1797b052022-12-04 17:19:59 +0000666 * Setup a given message socket context including initialization of
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500667 * input/output queues to a chosen capacity of messages. Also set the
668 * corresponding mock socket.
669 *
670 * \retval 0, if everything succeeds.
671 * \retval MBEDTLS_ERR_SSL_ALLOC_FAILED, if allocation of a message
672 * queue failed.
673 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100674int mbedtls_message_socket_setup(mbedtls_test_message_queue *queue_input,
675 mbedtls_test_message_queue *queue_output,
676 size_t queue_capacity,
677 mbedtls_mock_socket *socket,
678 mbedtls_test_message_socket_context *ctx)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500679{
Gilles Peskine449bd832023-01-11 14:50:10 +0100680 int ret = mbedtls_test_message_queue_setup(queue_input, queue_capacity);
681 if (ret != 0) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500682 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +0100683 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500684 ctx->queue_input = queue_input;
685 ctx->queue_output = queue_output;
686 ctx->socket = socket;
Gilles Peskine449bd832023-01-11 14:50:10 +0100687 mbedtls_mock_socket_init(socket);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500688
689 return 0;
690}
691
692/*
693 * Close a given message socket context, along with the socket itself. Free the
694 * memory allocated by the input queue.
695 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100696void mbedtls_message_socket_close(mbedtls_test_message_socket_context *ctx)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500697{
Gilles Peskine449bd832023-01-11 14:50:10 +0100698 if (ctx == NULL) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500699 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100700 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500701
Gilles Peskine449bd832023-01-11 14:50:10 +0100702 mbedtls_test_message_queue_free(ctx->queue_input);
703 mbedtls_mock_socket_close(ctx->socket);
704 memset(ctx, 0, sizeof(*ctx));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500705}
706
707/*
708 * Send one message through a given message socket context.
709 *
710 * \retval \p len, if everything succeeds.
711 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
712 * elements or the context itself is null.
713 * \retval MBEDTLS_TEST_ERROR_SEND_FAILED if mbedtls_mock_tcp_send_b failed.
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500714 * \retval MBEDTLS_ERR_SSL_WANT_WRITE, if the output queue is full.
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500715 *
716 * This function will also return any error from
717 * mbedtls_test_message_queue_push_info.
718 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100719int mbedtls_mock_tcp_send_msg(void *ctx, const unsigned char *buf, size_t len)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500720{
Gilles Peskine449bd832023-01-11 14:50:10 +0100721 mbedtls_test_message_queue *queue;
722 mbedtls_mock_socket *socket;
723 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context *) ctx;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500724
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 if (context == NULL || context->socket == NULL
726 || context->queue_output == NULL) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500727 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
728 }
729
730 queue = context->queue_output;
731 socket = context->socket;
732
Gilles Peskine449bd832023-01-11 14:50:10 +0100733 if (queue->num >= queue->capacity) {
Andrzej Kurekf46b9122020-02-07 08:19:00 -0500734 return MBEDTLS_ERR_SSL_WANT_WRITE;
Gilles Peskine449bd832023-01-11 14:50:10 +0100735 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500736
Gilles Peskine449bd832023-01-11 14:50:10 +0100737 if (mbedtls_mock_tcp_send_b(socket, buf, len) != (int) len) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500738 return MBEDTLS_TEST_ERROR_SEND_FAILED;
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500740
Gilles Peskine449bd832023-01-11 14:50:10 +0100741 return mbedtls_test_message_queue_push_info(queue, len);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500742}
743
744/*
745 * Receive one message from a given message socket context and return message
746 * length or an error.
747 *
748 * \retval message length, if everything succeeds.
749 * \retval MBEDTLS_TEST_ERROR_CONTEXT_ERROR, if any of the needed context
750 * elements or the context itself is null.
751 * \retval MBEDTLS_TEST_ERROR_RECV_FAILED if mbedtls_mock_tcp_recv_b failed.
752 *
753 * This function will also return any error other than
754 * MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED from mbedtls_test_message_queue_peek_info.
755 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100756int mbedtls_mock_tcp_recv_msg(void *ctx, unsigned char *buf, size_t buf_len)
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500757{
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 mbedtls_test_message_queue *queue;
759 mbedtls_mock_socket *socket;
760 mbedtls_test_message_socket_context *context = (mbedtls_test_message_socket_context *) ctx;
Gilles Peskine19e841e2020-03-09 20:43:51 +0100761 size_t drop_len = 0;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500762 size_t msg_len;
763 int ret;
764
Gilles Peskine449bd832023-01-11 14:50:10 +0100765 if (context == NULL || context->socket == NULL
766 || context->queue_input == NULL) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500767 return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
768 }
769
770 queue = context->queue_input;
771 socket = context->socket;
772
773 /* Peek first, so that in case of a socket error the data remains in
774 * the queue. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100775 ret = mbedtls_test_message_queue_peek_info(queue, buf_len, &msg_len);
776 if (ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500777 /* Calculate how much to drop */
778 drop_len = msg_len - buf_len;
779
780 /* Set the requested message len to be buffer length */
781 msg_len = buf_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 } else if (ret != 0) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500783 return ret;
784 }
785
Gilles Peskine449bd832023-01-11 14:50:10 +0100786 if (mbedtls_mock_tcp_recv_b(socket, buf, msg_len) != (int) msg_len) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500787 return MBEDTLS_TEST_ERROR_RECV_FAILED;
Gilles Peskine449bd832023-01-11 14:50:10 +0100788 }
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500789
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 if (ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500791 /* Drop the remaining part of the message */
Gilles Peskine449bd832023-01-11 14:50:10 +0100792 if (mbedtls_mock_tcp_recv_b(socket, NULL, drop_len) != (int) drop_len) {
793 /* Inconsistent state - part of the message was read,
794 * and a part couldn't. Not much we can do here, but it should not
795 * happen in test environment, unless forced manually. */
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500796 }
797 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100798 mbedtls_test_message_queue_pop_info(queue, buf_len);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500799
800 return msg_len;
801}
802
Ronald Crone68ab4f2022-10-05 12:46:29 +0200803#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100804
805/*
806 * Structure with endpoint's certificates for SSL communication tests.
807 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100808typedef struct mbedtls_endpoint_certificate {
809 mbedtls_x509_crt *ca_cert;
810 mbedtls_x509_crt *cert;
811 mbedtls_pk_context *pkey;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100812} mbedtls_endpoint_certificate;
813
814/*
815 * Endpoint structure for SSL communication tests.
816 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100817typedef struct mbedtls_endpoint {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100818 const char *name;
819 mbedtls_ssl_context ssl;
820 mbedtls_ssl_config conf;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100821 mbedtls_mock_socket socket;
822 mbedtls_endpoint_certificate cert;
823} mbedtls_endpoint;
824
825/*
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400826 * Deinitializes certificates from endpoint represented by \p ep.
827 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100828void mbedtls_endpoint_certificate_free(mbedtls_endpoint *ep)
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400829{
Gilles Peskine449bd832023-01-11 14:50:10 +0100830 mbedtls_endpoint_certificate *cert = &(ep->cert);
831 if (cert != NULL) {
832 if (cert->ca_cert != NULL) {
833 mbedtls_x509_crt_free(cert->ca_cert);
834 mbedtls_free(cert->ca_cert);
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400835 cert->ca_cert = NULL;
836 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100837 if (cert->cert != NULL) {
838 mbedtls_x509_crt_free(cert->cert);
839 mbedtls_free(cert->cert);
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400840 cert->cert = NULL;
841 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100842 if (cert->pkey != NULL) {
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400843#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100844 if (mbedtls_pk_get_type(cert->pkey) == MBEDTLS_PK_OPAQUE) {
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400845 mbedtls_svc_key_id_t *key_slot = cert->pkey->pk_ctx;
Gilles Peskine449bd832023-01-11 14:50:10 +0100846 psa_destroy_key(*key_slot);
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400847 }
848#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100849 mbedtls_pk_free(cert->pkey);
850 mbedtls_free(cert->pkey);
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400851 cert->pkey = NULL;
852 }
853 }
854}
855
856/*
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100857 * Initializes \p ep_cert structure and assigns it to endpoint
858 * represented by \p ep.
859 *
860 * \retval 0 on success, otherwise error code.
861 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100862int mbedtls_endpoint_certificate_init(mbedtls_endpoint *ep, int pk_alg,
863 int opaque_alg, int opaque_alg2,
864 int opaque_usage)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100865{
866 int i = 0;
867 int ret = -1;
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400868 mbedtls_endpoint_certificate *cert = NULL;
Neil Armstrong8c52ed82022-05-27 13:14:55 +0200869#if defined(MBEDTLS_USE_PSA_CRYPTO)
870 mbedtls_svc_key_id_t key_slot = MBEDTLS_SVC_KEY_ID_INIT;
871#endif
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100872
Gilles Peskine449bd832023-01-11 14:50:10 +0100873 if (ep == NULL) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100874 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
875 }
876
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 cert = &(ep->cert);
878 ASSERT_ALLOC(cert->ca_cert, 1);
879 ASSERT_ALLOC(cert->cert, 1);
880 ASSERT_ALLOC(cert->pkey, 1);
Andrzej Kurek0abebeb2022-09-30 12:54:41 -0400881
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 mbedtls_x509_crt_init(cert->ca_cert);
883 mbedtls_x509_crt_init(cert->cert);
884 mbedtls_pk_init(cert->pkey);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100885
886 /* Load the trusted CA */
887
Gilles Peskine449bd832023-01-11 14:50:10 +0100888 for (i = 0; mbedtls_test_cas_der[i] != NULL; i++) {
889 ret = mbedtls_x509_crt_parse_der(cert->ca_cert,
890 (const unsigned char *) mbedtls_test_cas_der[i],
891 mbedtls_test_cas_der_len[i]);
892 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100893 }
894
895 /* Load own certificate and private key */
896
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 if (ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER) {
898 if (pk_alg == MBEDTLS_PK_RSA) {
899 ret = mbedtls_x509_crt_parse(cert->cert,
900 (const unsigned char *) mbedtls_test_srv_crt_rsa_sha256_der,
901 mbedtls_test_srv_crt_rsa_sha256_der_len);
902 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100903
Gilles Peskine449bd832023-01-11 14:50:10 +0100904 ret = mbedtls_pk_parse_key(cert->pkey,
905 (const unsigned char *) mbedtls_test_srv_key_rsa_der,
906 mbedtls_test_srv_key_rsa_der_len, NULL, 0,
907 mbedtls_test_rnd_std_rand, NULL);
908 TEST_ASSERT(ret == 0);
909 } else {
910 ret = mbedtls_x509_crt_parse(cert->cert,
911 (const unsigned char *) mbedtls_test_srv_crt_ec_der,
912 mbedtls_test_srv_crt_ec_der_len);
913 TEST_ASSERT(ret == 0);
914
915 ret = mbedtls_pk_parse_key(cert->pkey,
916 (const unsigned char *) mbedtls_test_srv_key_ec_der,
917 mbedtls_test_srv_key_ec_der_len, NULL, 0,
918 mbedtls_test_rnd_std_rand, NULL);
919 TEST_ASSERT(ret == 0);
Andrzej Kurekb2980742020-02-02 19:25:26 -0500920 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100921 } else {
922 if (pk_alg == MBEDTLS_PK_RSA) {
923 ret = mbedtls_x509_crt_parse(cert->cert,
924 (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
925 mbedtls_test_cli_crt_rsa_der_len);
926 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100927
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 ret = mbedtls_pk_parse_key(cert->pkey,
929 (const unsigned char *) mbedtls_test_cli_key_rsa_der,
930 mbedtls_test_cli_key_rsa_der_len, NULL, 0,
931 mbedtls_test_rnd_std_rand, NULL);
932 TEST_ASSERT(ret == 0);
933 } else {
934 ret = mbedtls_x509_crt_parse(cert->cert,
935 (const unsigned char *) mbedtls_test_cli_crt_ec_der,
936 mbedtls_test_cli_crt_ec_len);
937 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100938
Gilles Peskine449bd832023-01-11 14:50:10 +0100939 ret = mbedtls_pk_parse_key(cert->pkey,
940 (const unsigned char *) mbedtls_test_cli_key_ec_der,
941 mbedtls_test_cli_key_ec_der_len, NULL, 0,
942 mbedtls_test_rnd_std_rand, NULL);
943 TEST_ASSERT(ret == 0);
Andrzej Kurekb2980742020-02-02 19:25:26 -0500944 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100945 }
946
Neil Armstrong8c52ed82022-05-27 13:14:55 +0200947#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 if (opaque_alg != 0) {
949 TEST_EQUAL(mbedtls_pk_wrap_as_opaque(cert->pkey, &key_slot,
950 opaque_alg, opaque_usage,
951 opaque_alg2), 0);
Neil Armstrong8c52ed82022-05-27 13:14:55 +0200952 }
953#else
954 (void) opaque_alg;
955 (void) opaque_alg2;
956 (void) opaque_usage;
957#endif
958
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 mbedtls_ssl_conf_ca_chain(&(ep->conf), cert->ca_cert, NULL);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100960
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 ret = mbedtls_ssl_conf_own_cert(&(ep->conf), cert->cert,
962 cert->pkey);
963 TEST_ASSERT(ret == 0);
964 TEST_ASSERT(ep->conf.key_cert != NULL);
Glenn Strauss36872db2022-01-22 05:06:31 -0500965
Gilles Peskine449bd832023-01-11 14:50:10 +0100966 ret = mbedtls_ssl_conf_own_cert(&(ep->conf), NULL, NULL);
967 TEST_ASSERT(ret == 0);
968 TEST_ASSERT(ep->conf.key_cert == NULL);
Glenn Strauss36872db2022-01-22 05:06:31 -0500969
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 ret = mbedtls_ssl_conf_own_cert(&(ep->conf), cert->cert,
971 cert->pkey);
972 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100973
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100974exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100975 if (ret != 0) {
976 mbedtls_endpoint_certificate_free(ep);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100977 }
978
979 return ret;
980}
981
982/*
983 * Initializes \p ep structure. It is important to call `mbedtls_endpoint_free()`
984 * after calling this function even if it fails.
985 *
986 * \p endpoint_type must be set as MBEDTLS_SSL_IS_SERVER or
987 * MBEDTLS_SSL_IS_CLIENT.
Andrzej Kurek15daf502020-02-12 09:17:52 -0500988 * \p pk_alg the algorithm to use, currently only MBEDTLS_PK_RSA and
989 * MBEDTLS_PK_ECDSA are supported.
990 * \p dtls_context - in case of DTLS - this is the context handling metadata.
991 * \p input_queue - used only in case of DTLS.
992 * \p output_queue - used only in case of DTLS.
Piotr Nowicki2a1f1782020-01-13 09:42:10 +0100993 *
994 * \retval 0 on success, otherwise error code.
995 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100996int mbedtls_endpoint_init(mbedtls_endpoint *ep, int endpoint_type,
997 handshake_test_options *options,
998 mbedtls_test_message_socket_context *dtls_context,
999 mbedtls_test_message_queue *input_queue,
1000 mbedtls_test_message_queue *output_queue,
1001 uint16_t *group_list)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001002{
1003 int ret = -1;
Gilles Peskine80dae042022-01-21 23:50:39 +01001004 uintptr_t user_data_n;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001005
Gilles Peskine449bd832023-01-11 14:50:10 +01001006 if (dtls_context != NULL && (input_queue == NULL || output_queue == NULL)) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001007 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Andrzej Kurek15daf502020-02-12 09:17:52 -05001008 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001009
1010 if (ep == NULL) {
1011 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
1012 }
1013
1014 memset(ep, 0, sizeof(*ep));
1015
1016 ep->name = (endpoint_type == MBEDTLS_SSL_IS_SERVER) ? "Server" : "Client";
1017
1018 mbedtls_ssl_init(&(ep->ssl));
1019 mbedtls_ssl_config_init(&(ep->conf));
1020 mbedtls_ssl_conf_rng(&(ep->conf), rng_get, NULL);
1021
1022 TEST_ASSERT(mbedtls_ssl_conf_get_user_data_p(&ep->conf) == NULL);
1023 TEST_EQUAL(mbedtls_ssl_conf_get_user_data_n(&ep->conf), 0);
1024 TEST_ASSERT(mbedtls_ssl_get_user_data_p(&ep->ssl) == NULL);
1025 TEST_EQUAL(mbedtls_ssl_get_user_data_n(&ep->ssl), 0);
1026
1027 (void) mbedtls_test_rnd_std_rand(NULL,
1028 (void *) &user_data_n,
1029 sizeof(user_data_n));
1030 mbedtls_ssl_conf_set_user_data_n(&ep->conf, user_data_n);
1031 mbedtls_ssl_set_user_data_n(&ep->ssl, user_data_n);
1032
1033 if (dtls_context != NULL) {
1034 TEST_ASSERT(mbedtls_message_socket_setup(input_queue, output_queue,
1035 100, &(ep->socket),
1036 dtls_context) == 0);
1037 } else {
1038 mbedtls_mock_socket_init(&(ep->socket));
Andrzej Kurek15daf502020-02-12 09:17:52 -05001039 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001040
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001041 /* Non-blocking callbacks without timeout */
Gilles Peskine449bd832023-01-11 14:50:10 +01001042 if (dtls_context != NULL) {
1043 mbedtls_ssl_set_bio(&(ep->ssl), dtls_context,
1044 mbedtls_mock_tcp_send_msg,
1045 mbedtls_mock_tcp_recv_msg,
1046 NULL);
1047 } else {
1048 mbedtls_ssl_set_bio(&(ep->ssl), &(ep->socket),
1049 mbedtls_mock_tcp_send_nb,
1050 mbedtls_mock_tcp_recv_nb,
1051 NULL);
Andrzej Kurek15daf502020-02-12 09:17:52 -05001052 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001053
Gilles Peskine449bd832023-01-11 14:50:10 +01001054 ret = mbedtls_ssl_config_defaults(&(ep->conf), endpoint_type,
1055 (dtls_context != NULL) ?
1056 MBEDTLS_SSL_TRANSPORT_DATAGRAM :
1057 MBEDTLS_SSL_TRANSPORT_STREAM,
1058 MBEDTLS_SSL_PRESET_DEFAULT);
1059 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001060
Gilles Peskine449bd832023-01-11 14:50:10 +01001061 if (group_list != NULL) {
1062 mbedtls_ssl_conf_groups(&(ep->conf), group_list);
1063 }
Andrzej Kurek74394a52022-03-08 06:50:12 -05001064
Gilles Peskine449bd832023-01-11 14:50:10 +01001065 mbedtls_ssl_conf_authmode(&(ep->conf), MBEDTLS_SSL_VERIFY_REQUIRED);
Ronald Cronbdddaef2022-06-07 10:34:59 +02001066
Andrzej Kureked58b502022-06-10 19:24:05 -04001067#if defined(MBEDTLS_SSL_CACHE_C) && defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 if (endpoint_type == MBEDTLS_SSL_IS_SERVER && options->cache != NULL) {
1069 mbedtls_ssl_conf_session_cache(&(ep->conf), options->cache,
1070 mbedtls_ssl_cache_get,
1071 mbedtls_ssl_cache_set);
Andrzej Kurek780dc182022-06-10 08:57:19 -04001072 }
1073#endif
1074
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 ret = mbedtls_ssl_setup(&(ep->ssl), &(ep->conf));
1076 TEST_ASSERT(ret == 0);
Andrzej Kurek15daf502020-02-12 09:17:52 -05001077
1078#if defined(MBEDTLS_SSL_PROTO_DTLS) && defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001079 if (endpoint_type == MBEDTLS_SSL_IS_SERVER && dtls_context != NULL) {
1080 mbedtls_ssl_conf_dtls_cookies(&(ep->conf), NULL, NULL, NULL);
1081 }
Andrzej Kurek15daf502020-02-12 09:17:52 -05001082#endif
1083
Gilles Peskine449bd832023-01-11 14:50:10 +01001084 ret = mbedtls_endpoint_certificate_init(ep, options->pk_alg,
1085 options->opaque_alg,
1086 options->opaque_alg2,
1087 options->opaque_usage);
1088 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001089
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 TEST_EQUAL(mbedtls_ssl_conf_get_user_data_n(&ep->conf), user_data_n);
1091 mbedtls_ssl_conf_set_user_data_p(&ep->conf, ep);
1092 TEST_EQUAL(mbedtls_ssl_get_user_data_n(&ep->ssl), user_data_n);
1093 mbedtls_ssl_set_user_data_p(&ep->ssl, ep);
Gilles Peskine80dae042022-01-21 23:50:39 +01001094
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001095exit:
1096 return ret;
1097}
1098
1099/*
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001100 * Deinitializes endpoint represented by \p ep.
1101 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001102void mbedtls_endpoint_free(mbedtls_endpoint *ep,
1103 mbedtls_test_message_socket_context *context)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001104{
Gilles Peskine449bd832023-01-11 14:50:10 +01001105 mbedtls_endpoint_certificate_free(ep);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001106
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 mbedtls_ssl_free(&(ep->ssl));
1108 mbedtls_ssl_config_free(&(ep->conf));
Andrzej Kurek15daf502020-02-12 09:17:52 -05001109
Gilles Peskine449bd832023-01-11 14:50:10 +01001110 if (context != NULL) {
1111 mbedtls_message_socket_close(context);
1112 } else {
1113 mbedtls_mock_socket_close(&(ep->socket));
Andrzej Kurek15daf502020-02-12 09:17:52 -05001114 }
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001115}
1116
1117/*
1118 * This function moves ssl handshake from \p ssl to prescribed \p state.
1119 * /p second_ssl is used as second endpoint and their sockets have to be
1120 * connected before calling this function.
1121 *
1122 * \retval 0 on success, otherwise error code.
1123 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001124int mbedtls_move_handshake_to_state(mbedtls_ssl_context *ssl,
1125 mbedtls_ssl_context *second_ssl,
1126 int state)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001127{
1128 enum { BUFFSIZE = 1024 };
1129 int max_steps = 1000;
1130 int ret = 0;
1131
Gilles Peskine449bd832023-01-11 14:50:10 +01001132 if (ssl == NULL || second_ssl == NULL) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001133 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
1134 }
1135
1136 /* Perform communication via connected sockets */
Gilles Peskine449bd832023-01-11 14:50:10 +01001137 while ((ssl->state != state) && (--max_steps >= 0)) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001138 /* If /p second_ssl ends the handshake procedure before /p ssl then
1139 * there is no need to call the next step */
Gilles Peskine449bd832023-01-11 14:50:10 +01001140 if (!mbedtls_ssl_is_handshake_over(second_ssl)) {
1141 ret = mbedtls_ssl_handshake_step(second_ssl);
1142 if (ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
1143 ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001144 return ret;
1145 }
1146 }
1147
1148 /* We only care about the \p ssl state and returns, so we call it last,
1149 * to leave the iteration as soon as the state is as expected. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 ret = mbedtls_ssl_handshake_step(ssl);
1151 if (ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
1152 ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001153 return ret;
1154 }
1155 }
1156
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 return (max_steps >= 0) ? ret : -1;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001158}
1159
Ronald Crone68ab4f2022-10-05 12:46:29 +02001160#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001161
Janos Follath3766ba52019-11-27 13:31:42 +00001162/*
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001163 * Write application data. Increase write counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001164 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001165int mbedtls_ssl_write_fragment(mbedtls_ssl_context *ssl, unsigned char *buf,
1166 int buf_len, int *written,
1167 const int expected_fragments)
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001168{
Dave Rodgmana4e8fb02023-02-24 15:41:55 +00001169 /* Verify that calling mbedtls_ssl_write with a NULL buffer and zero length is
1170 * a valid no-op for TLS connections. */
1171 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1172 TEST_ASSERT(mbedtls_ssl_write(ssl, NULL, 0) == 0);
1173 }
1174
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 int ret = mbedtls_ssl_write(ssl, buf + *written, buf_len - *written);
1176 if (ret > 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001177 *written += ret;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001178 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001179
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 if (expected_fragments == 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001181 /* Used for DTLS and the message size larger than MFL. In that case
1182 * the message can not be fragmented and the library should return
1183 * MBEDTLS_ERR_SSL_BAD_INPUT_DATA error. This error must be returned
1184 * to prevent a dead loop inside mbedtls_exchange_data(). */
1185 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001186 } else if (expected_fragments == 1) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001187 /* Used for TLS/DTLS and the message size lower than MFL */
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 TEST_ASSERT(ret == buf_len ||
1189 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1190 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
1191 } else {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001192 /* Used for TLS and the message size larger than MFL */
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 TEST_ASSERT(expected_fragments > 1);
1194 TEST_ASSERT((ret >= 0 && ret <= buf_len) ||
1195 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1196 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001197 }
1198
1199 return 0;
1200
1201exit:
1202 /* Some of the tests failed */
1203 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001204}
1205
1206/*
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01001207 * Read application data and increase read counter and fragments counter if necessary.
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001208 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001209int mbedtls_ssl_read_fragment(mbedtls_ssl_context *ssl, unsigned char *buf,
1210 int buf_len, int *read,
1211 int *fragments, const int expected_fragments)
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001212{
Dave Rodgmana4e8fb02023-02-24 15:41:55 +00001213 /* Verify that calling mbedtls_ssl_write with a NULL buffer and zero length is
1214 * a valid no-op for TLS connections. */
1215 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1216 TEST_ASSERT(mbedtls_ssl_read(ssl, NULL, 0) == 0);
1217 }
1218
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 int ret = mbedtls_ssl_read(ssl, buf + *read, buf_len - *read);
1220 if (ret > 0) {
1221 (*fragments)++;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001222 *read += ret;
1223 }
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001224
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 if (expected_fragments == 0) {
1226 TEST_ASSERT(ret == 0);
1227 } else if (expected_fragments == 1) {
1228 TEST_ASSERT(ret == buf_len ||
1229 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1230 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
1231 } else {
1232 TEST_ASSERT(expected_fragments > 1);
1233 TEST_ASSERT((ret >= 0 && ret <= buf_len) ||
1234 ret == MBEDTLS_ERR_SSL_WANT_READ ||
1235 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001236 }
1237
1238 return 0;
1239
1240exit:
1241 /* Some of the tests failed */
1242 return -1;
Piotr Nowickic3fca5e2020-01-30 15:33:42 +01001243}
1244
1245/*
Hanno Beckera18d1322018-01-03 14:27:32 +00001246 * Helper function setting up inverse record transformations
1247 * using given cipher, hash, EtM mode, authentication tag length,
1248 * and version.
1249 */
1250
Gilles Peskine449bd832023-01-11 14:50:10 +01001251#define CHK(x) \
Hanno Beckera18d1322018-01-03 14:27:32 +00001252 do \
1253 { \
Gilles Peskine449bd832023-01-11 14:50:10 +01001254 if (!(x)) \
Hanno Becker81e16a32019-03-01 11:21:44 +00001255 { \
Hanno Beckera5780f12019-04-05 09:55:37 +01001256 ret = -1; \
Hanno Becker81e16a32019-03-01 11:21:44 +00001257 goto cleanup; \
1258 } \
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 } while (0)
Hanno Beckera18d1322018-01-03 14:27:32 +00001260
Gilles Peskine449bd832023-01-11 14:50:10 +01001261void set_ciphersuite(mbedtls_ssl_config *conf, const char *cipher,
1262 int *forced_ciphersuite)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001263{
1264 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01001265 forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id(cipher);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001266 forced_ciphersuite[1] = 0;
1267
1268 ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01001269 mbedtls_ssl_ciphersuite_from_id(forced_ciphersuite[0]);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001270
Gilles Peskine449bd832023-01-11 14:50:10 +01001271 TEST_ASSERT(ciphersuite_info != NULL);
1272 TEST_ASSERT(ciphersuite_info->min_tls_version <= conf->max_tls_version);
1273 TEST_ASSERT(ciphersuite_info->max_tls_version >= conf->min_tls_version);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001274
Gilles Peskine449bd832023-01-11 14:50:10 +01001275 if (conf->max_tls_version > ciphersuite_info->max_tls_version) {
Glenn Strauss60bfe602022-03-14 19:04:24 -04001276 conf->max_tls_version = ciphersuite_info->max_tls_version;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001277 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001278 if (conf->min_tls_version < ciphersuite_info->min_tls_version) {
Glenn Strauss60bfe602022-03-14 19:04:24 -04001279 conf->min_tls_version = ciphersuite_info->min_tls_version;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001280 }
1281
Gilles Peskine449bd832023-01-11 14:50:10 +01001282 mbedtls_ssl_conf_ciphersuites(conf, forced_ciphersuite);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001283
1284exit:
1285 return;
1286}
1287
Gilles Peskine449bd832023-01-11 14:50:10 +01001288int psk_dummy_callback(void *p_info, mbedtls_ssl_context *ssl,
1289 const unsigned char *name, size_t name_len)
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05001290{
1291 (void) p_info;
1292 (void) ssl;
1293 (void) name;
1294 (void) name_len;
1295
Gilles Peskine449bd832023-01-11 14:50:10 +01001296 return 0;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05001297}
1298
Hanno Beckerd856c822019-04-29 17:30:59 +01001299#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
1300#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_IN_LEN_MAX
1301#else
1302#define SSL_CID_LEN_MIN MBEDTLS_SSL_CID_OUT_LEN_MAX
1303#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001304
Gilles Peskine9c656ec2022-02-26 19:55:58 +01001305#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1306 defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_AES_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001307static int psa_cipher_encrypt_helper(mbedtls_ssl_transform *transform,
1308 const unsigned char *iv, size_t iv_len,
1309 const unsigned char *input, size_t ilen,
1310 unsigned char *output, size_t *olen)
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001311{
Przemyslaw Stekiel5648d572022-02-03 14:09:02 +01001312#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemyslaw Stekield66387f2022-02-03 08:55:33 +01001313 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001314 psa_cipher_operation_t cipher_op = PSA_CIPHER_OPERATION_INIT;
1315 size_t part_len;
1316
Gilles Peskine449bd832023-01-11 14:50:10 +01001317 status = psa_cipher_encrypt_setup(&cipher_op,
1318 transform->psa_key_enc, transform->psa_alg);
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001319
Gilles Peskine449bd832023-01-11 14:50:10 +01001320 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001321 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001322 }
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001323
Gilles Peskine449bd832023-01-11 14:50:10 +01001324 status = psa_cipher_set_iv(&cipher_op, iv, iv_len);
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001325
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001327 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001328 }
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001329
Gilles Peskine449bd832023-01-11 14:50:10 +01001330 status = psa_cipher_update(&cipher_op,
1331 input, ilen, output, ilen, olen);
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001332
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001334 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001335 }
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001336
Gilles Peskine449bd832023-01-11 14:50:10 +01001337 status = psa_cipher_finish(&cipher_op,
1338 output + *olen, ilen - *olen, &part_len);
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001339
Gilles Peskine449bd832023-01-11 14:50:10 +01001340 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001341 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 }
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001343
1344 *olen += part_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001345 return 0;
Przemyslaw Stekiel5648d572022-02-03 14:09:02 +01001346#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001347 return mbedtls_cipher_crypt(&transform->cipher_ctx_enc,
1348 iv, iv_len, input, ilen, output, olen);
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001349#endif /* MBEDTLS_USE_PSA_CRYPTO */
Przemyslaw Stekiel5648d572022-02-03 14:09:02 +01001350}
Gilles Peskine9c656ec2022-02-26 19:55:58 +01001351#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_AES_C */
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01001352
Gilles Peskine449bd832023-01-11 14:50:10 +01001353static int build_transforms(mbedtls_ssl_transform *t_in,
1354 mbedtls_ssl_transform *t_out,
1355 int cipher_type, int hash_id,
1356 int etm, int tag_mode,
1357 mbedtls_ssl_protocol_version tls_version,
1358 size_t cid0_len,
1359 size_t cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00001360{
1361 mbedtls_cipher_info_t const *cipher_info;
Hanno Beckera5780f12019-04-05 09:55:37 +01001362 int ret = 0;
Hanno Beckera18d1322018-01-03 14:27:32 +00001363
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001364#if defined(MBEDTLS_USE_PSA_CRYPTO)
1365 psa_key_type_t key_type;
1366 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1367 psa_algorithm_t alg;
1368 size_t key_bits;
Przemyslaw Stekield66387f2022-02-03 08:55:33 +01001369 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001370#endif
1371
Hanno Beckera18d1322018-01-03 14:27:32 +00001372 size_t keylen, maclen, ivlen;
Hanno Becker81e16a32019-03-01 11:21:44 +00001373 unsigned char *key0 = NULL, *key1 = NULL;
Paul Elliott6f1eda72020-06-11 20:22:00 +01001374 unsigned char *md0 = NULL, *md1 = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001375 unsigned char iv_enc[16], iv_dec[16];
1376
Hanno Beckera0e20d02019-05-15 14:03:01 +01001377#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001378 unsigned char cid0[SSL_CID_LEN_MIN];
1379 unsigned char cid1[SSL_CID_LEN_MIN];
Hanno Beckerd856c822019-04-29 17:30:59 +01001380
Gilles Peskine449bd832023-01-11 14:50:10 +01001381 mbedtls_test_rnd_std_rand(NULL, cid0, sizeof(cid0));
1382 mbedtls_test_rnd_std_rand(NULL, cid1, sizeof(cid1));
Hanno Becker43c24b82019-05-01 09:45:57 +01001383#else
1384 ((void) cid0_len);
1385 ((void) cid1_len);
Hanno Beckera0e20d02019-05-15 14:03:01 +01001386#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001387
Hanno Beckera18d1322018-01-03 14:27:32 +00001388 maclen = 0;
1389
1390 /* Pick cipher */
Gilles Peskine449bd832023-01-11 14:50:10 +01001391 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
1392 CHK(cipher_info != NULL);
1393 CHK(cipher_info->iv_size <= 16);
1394 CHK(cipher_info->key_bitlen % 8 == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001395
1396 /* Pick keys */
1397 keylen = cipher_info->key_bitlen / 8;
Hanno Becker78d1f702019-04-05 09:56:10 +01001398 /* Allocate `keylen + 1` bytes to ensure that we get
1399 * a non-NULL pointers from `mbedtls_calloc` even if
1400 * `keylen == 0` in the case of the NULL cipher. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001401 CHK((key0 = mbedtls_calloc(1, keylen + 1)) != NULL);
1402 CHK((key1 = mbedtls_calloc(1, keylen + 1)) != NULL);
1403 memset(key0, 0x1, keylen);
1404 memset(key1, 0x2, keylen);
Hanno Beckera18d1322018-01-03 14:27:32 +00001405
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001406#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckera18d1322018-01-03 14:27:32 +00001407 /* Setup cipher contexts */
Gilles Peskine449bd832023-01-11 14:50:10 +01001408 CHK(mbedtls_cipher_setup(&t_in->cipher_ctx_enc, cipher_info) == 0);
1409 CHK(mbedtls_cipher_setup(&t_in->cipher_ctx_dec, cipher_info) == 0);
1410 CHK(mbedtls_cipher_setup(&t_out->cipher_ctx_enc, cipher_info) == 0);
1411 CHK(mbedtls_cipher_setup(&t_out->cipher_ctx_dec, cipher_info) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001412
1413#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +01001414 if (cipher_info->mode == MBEDTLS_MODE_CBC) {
1415 CHK(mbedtls_cipher_set_padding_mode(&t_in->cipher_ctx_enc,
1416 MBEDTLS_PADDING_NONE) == 0);
1417 CHK(mbedtls_cipher_set_padding_mode(&t_in->cipher_ctx_dec,
1418 MBEDTLS_PADDING_NONE) == 0);
1419 CHK(mbedtls_cipher_set_padding_mode(&t_out->cipher_ctx_enc,
1420 MBEDTLS_PADDING_NONE) == 0);
1421 CHK(mbedtls_cipher_set_padding_mode(&t_out->cipher_ctx_dec,
1422 MBEDTLS_PADDING_NONE) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001423 }
1424#endif /* MBEDTLS_CIPHER_MODE_CBC */
1425
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 CHK(mbedtls_cipher_setkey(&t_in->cipher_ctx_enc, key0,
1427 keylen << 3, MBEDTLS_ENCRYPT) == 0);
1428 CHK(mbedtls_cipher_setkey(&t_in->cipher_ctx_dec, key1,
1429 keylen << 3, MBEDTLS_DECRYPT) == 0);
1430 CHK(mbedtls_cipher_setkey(&t_out->cipher_ctx_enc, key1,
1431 keylen << 3, MBEDTLS_ENCRYPT) == 0);
1432 CHK(mbedtls_cipher_setkey(&t_out->cipher_ctx_dec, key0,
1433 keylen << 3, MBEDTLS_DECRYPT) == 0);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001434#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001435
1436 /* Setup MAC contexts */
Hanno Beckerfd86ca82020-11-30 08:54:23 +00001437#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Gilles Peskine449bd832023-01-11 14:50:10 +01001438 if (cipher_info->mode == MBEDTLS_MODE_CBC ||
1439 cipher_info->mode == MBEDTLS_MODE_STREAM) {
Andrzej Kurek21b68702022-08-17 16:26:12 -04001440#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 mbedtls_md_info_t const *md_info = mbedtls_md_info_from_type(hash_id);
1442 CHK(md_info != NULL);
Andrzej Kurek21b68702022-08-17 16:26:12 -04001443#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001444 maclen = mbedtls_hash_info_get_size(hash_id);
1445 CHK(maclen != 0);
Przemek Stekielcc59c992022-08-01 11:51:22 +02001446 /* Pick hash keys */
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 CHK((md0 = mbedtls_calloc(1, maclen)) != NULL);
1448 CHK((md1 = mbedtls_calloc(1, maclen)) != NULL);
1449 memset(md0, 0x5, maclen);
1450 memset(md1, 0x6, maclen);
Hanno Beckera18d1322018-01-03 14:27:32 +00001451
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001452#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001453 alg = mbedtls_hash_info_psa_from_md(hash_id);
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001454
Gilles Peskine449bd832023-01-11 14:50:10 +01001455 CHK(alg != 0);
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001456
Gilles Peskine449bd832023-01-11 14:50:10 +01001457 t_out->psa_mac_alg = PSA_ALG_HMAC(alg);
1458 t_in->psa_mac_alg = PSA_ALG_HMAC(alg);
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001459 t_in->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
1460 t_out->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
1461 t_in->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
1462 t_out->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
1463
Gilles Peskine449bd832023-01-11 14:50:10 +01001464 psa_reset_key_attributes(&attributes);
1465 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
1466 psa_set_key_algorithm(&attributes, PSA_ALG_HMAC(alg));
1467 psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001468
Gilles Peskine449bd832023-01-11 14:50:10 +01001469 CHK(psa_import_key(&attributes,
1470 md0, maclen,
1471 &t_in->psa_mac_enc) == PSA_SUCCESS);
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001472
Gilles Peskine449bd832023-01-11 14:50:10 +01001473 CHK(psa_import_key(&attributes,
1474 md1, maclen,
1475 &t_out->psa_mac_enc) == PSA_SUCCESS);
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001476
Gilles Peskine449bd832023-01-11 14:50:10 +01001477 if (cipher_info->mode == MBEDTLS_MODE_STREAM ||
1478 etm == MBEDTLS_SSL_ETM_DISABLED) {
Neil Armstrong8f92bf32022-03-18 09:56:57 +01001479 /* mbedtls_ct_hmac() requires the key to be exportable */
Gilles Peskine449bd832023-01-11 14:50:10 +01001480 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_EXPORT |
1481 PSA_KEY_USAGE_VERIFY_HASH);
1482 } else {
1483 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_VERIFY_HASH);
1484 }
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001485
Gilles Peskine449bd832023-01-11 14:50:10 +01001486 CHK(psa_import_key(&attributes,
1487 md1, maclen,
1488 &t_in->psa_mac_dec) == PSA_SUCCESS);
Neil Armstrongf4cc0622022-02-23 16:21:01 +01001489
Gilles Peskine449bd832023-01-11 14:50:10 +01001490 CHK(psa_import_key(&attributes,
1491 md0, maclen,
1492 &t_out->psa_mac_dec) == PSA_SUCCESS);
Neil Armstrongcf8841a2022-02-24 11:17:45 +01001493#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001494 CHK(mbedtls_md_setup(&t_out->md_ctx_enc, md_info, 1) == 0);
1495 CHK(mbedtls_md_setup(&t_out->md_ctx_dec, md_info, 1) == 0);
1496 CHK(mbedtls_md_setup(&t_in->md_ctx_enc, md_info, 1) == 0);
1497 CHK(mbedtls_md_setup(&t_in->md_ctx_dec, md_info, 1) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001498
Gilles Peskine449bd832023-01-11 14:50:10 +01001499 CHK(mbedtls_md_hmac_starts(&t_in->md_ctx_enc,
1500 md0, maclen) == 0);
1501 CHK(mbedtls_md_hmac_starts(&t_in->md_ctx_dec,
1502 md1, maclen) == 0);
1503 CHK(mbedtls_md_hmac_starts(&t_out->md_ctx_enc,
1504 md1, maclen) == 0);
1505 CHK(mbedtls_md_hmac_starts(&t_out->md_ctx_dec,
1506 md0, maclen) == 0);
Neil Armstrongcf8841a2022-02-24 11:17:45 +01001507#endif
Hanno Beckera18d1322018-01-03 14:27:32 +00001508 }
1509#else
1510 ((void) hash_id);
Hanno Beckerfd86ca82020-11-30 08:54:23 +00001511#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Hanno Beckera18d1322018-01-03 14:27:32 +00001512
1513
1514 /* Pick IV's (regardless of whether they
1515 * are being used by the transform). */
1516 ivlen = cipher_info->iv_size;
Gilles Peskine449bd832023-01-11 14:50:10 +01001517 memset(iv_enc, 0x3, sizeof(iv_enc));
1518 memset(iv_dec, 0x4, sizeof(iv_dec));
Hanno Beckera18d1322018-01-03 14:27:32 +00001519
1520 /*
1521 * Setup transforms
1522 */
1523
Jaeden Amero2de07f12019-06-05 13:32:08 +01001524#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
Hanno Beckerfd86ca82020-11-30 08:54:23 +00001525 defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Hanno Beckera18d1322018-01-03 14:27:32 +00001526 t_out->encrypt_then_mac = etm;
1527 t_in->encrypt_then_mac = etm;
1528#else
1529 ((void) etm);
1530#endif
1531
Glenn Strauss07c64162022-03-14 12:34:51 -04001532 t_out->tls_version = tls_version;
1533 t_in->tls_version = tls_version;
Hanno Beckera18d1322018-01-03 14:27:32 +00001534 t_out->ivlen = ivlen;
1535 t_in->ivlen = ivlen;
1536
Gilles Peskine449bd832023-01-11 14:50:10 +01001537 switch (cipher_info->mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001538 case MBEDTLS_MODE_GCM:
1539 case MBEDTLS_MODE_CCM:
Ronald Cron6f135e12021-12-08 16:57:54 +01001540#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01001541 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Hanno Beckere6832872020-05-28 08:29:58 +01001542 t_out->fixed_ivlen = 12;
1543 t_in->fixed_ivlen = 12;
Gilles Peskine449bd832023-01-11 14:50:10 +01001544 } else
Ronald Cron6f135e12021-12-08 16:57:54 +01001545#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckere6832872020-05-28 08:29:58 +01001546 {
1547 t_out->fixed_ivlen = 4;
1548 t_in->fixed_ivlen = 4;
1549 }
Hanno Beckera18d1322018-01-03 14:27:32 +00001550 t_out->maclen = 0;
1551 t_in->maclen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001552 switch (tag_mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001553 case 0: /* Full tag */
1554 t_out->taglen = 16;
1555 t_in->taglen = 16;
1556 break;
1557 case 1: /* Partial tag */
1558 t_out->taglen = 8;
1559 t_in->taglen = 8;
1560 break;
1561 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001562 ret = 1;
1563 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001564 }
1565 break;
1566
1567 case MBEDTLS_MODE_CHACHAPOLY:
1568 t_out->fixed_ivlen = 12;
1569 t_in->fixed_ivlen = 12;
1570 t_out->maclen = 0;
1571 t_in->maclen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001572 switch (tag_mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001573 case 0: /* Full tag */
1574 t_out->taglen = 16;
1575 t_in->taglen = 16;
1576 break;
1577 case 1: /* Partial tag */
1578 t_out->taglen = 8;
1579 t_in->taglen = 8;
1580 break;
1581 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001582 ret = 1;
1583 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001584 }
1585 break;
1586
1587 case MBEDTLS_MODE_STREAM:
1588 case MBEDTLS_MODE_CBC:
1589 t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1590 t_in->fixed_ivlen = 0; /* redundant, must be 0 */
1591 t_out->taglen = 0;
1592 t_in->taglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001593 switch (tag_mode) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001594 case 0: /* Full tag */
1595 t_out->maclen = maclen;
1596 t_in->maclen = maclen;
1597 break;
Hanno Beckera18d1322018-01-03 14:27:32 +00001598 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001599 ret = 1;
1600 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001601 }
1602 break;
1603 default:
Paul Elliottc7b53742021-02-03 13:18:33 +00001604 ret = 1;
1605 goto cleanup;
Hanno Beckera18d1322018-01-03 14:27:32 +00001606 break;
1607 }
1608
1609 /* Setup IV's */
1610
Gilles Peskine449bd832023-01-11 14:50:10 +01001611 memcpy(&t_in->iv_dec, iv_dec, sizeof(iv_dec));
1612 memcpy(&t_in->iv_enc, iv_enc, sizeof(iv_enc));
1613 memcpy(&t_out->iv_dec, iv_enc, sizeof(iv_enc));
1614 memcpy(&t_out->iv_enc, iv_dec, sizeof(iv_dec));
Hanno Beckera18d1322018-01-03 14:27:32 +00001615
Hanno Beckera0e20d02019-05-15 14:03:01 +01001616#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001617 /* Add CID */
Gilles Peskine449bd832023-01-11 14:50:10 +01001618 memcpy(&t_in->in_cid, cid0, cid0_len);
1619 memcpy(&t_in->out_cid, cid1, cid1_len);
Hanno Beckerd856c822019-04-29 17:30:59 +01001620 t_in->in_cid_len = cid0_len;
1621 t_in->out_cid_len = cid1_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 memcpy(&t_out->in_cid, cid1, cid1_len);
1623 memcpy(&t_out->out_cid, cid0, cid0_len);
Hanno Beckerd856c822019-04-29 17:30:59 +01001624 t_out->in_cid_len = cid1_len;
1625 t_out->out_cid_len = cid0_len;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001626#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerd856c822019-04-29 17:30:59 +01001627
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001628#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001629 status = mbedtls_ssl_cipher_to_psa(cipher_type,
1630 t_in->taglen,
1631 &alg,
1632 &key_type,
1633 &key_bits);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001634
Gilles Peskine449bd832023-01-11 14:50:10 +01001635 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001636 ret = PSA_TO_MBEDTLS_ERR(status);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001637 goto cleanup;
1638 }
1639
1640 t_in->psa_alg = alg;
1641 t_out->psa_alg = alg;
1642
Gilles Peskine449bd832023-01-11 14:50:10 +01001643 if (alg != MBEDTLS_SSL_NULL_CIPHER) {
1644 psa_reset_key_attributes(&attributes);
1645 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
1646 psa_set_key_algorithm(&attributes, alg);
1647 psa_set_key_type(&attributes, key_type);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001648
Gilles Peskine449bd832023-01-11 14:50:10 +01001649 status = psa_import_key(&attributes,
1650 key0,
1651 PSA_BITS_TO_BYTES(key_bits),
1652 &t_in->psa_key_enc);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001653
Gilles Peskine449bd832023-01-11 14:50:10 +01001654 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001655 ret = PSA_TO_MBEDTLS_ERR(status);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001656 goto cleanup;
1657 }
1658
Gilles Peskine449bd832023-01-11 14:50:10 +01001659 status = psa_import_key(&attributes,
1660 key1,
1661 PSA_BITS_TO_BYTES(key_bits),
1662 &t_out->psa_key_enc);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001663
Gilles Peskine449bd832023-01-11 14:50:10 +01001664 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001665 ret = PSA_TO_MBEDTLS_ERR(status);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001666 goto cleanup;
1667 }
1668
Gilles Peskine449bd832023-01-11 14:50:10 +01001669 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DECRYPT);
Przemyslaw Stekielf4ca3f02022-01-25 00:25:59 +01001670
Gilles Peskine449bd832023-01-11 14:50:10 +01001671 status = psa_import_key(&attributes,
1672 key1,
1673 PSA_BITS_TO_BYTES(key_bits),
1674 &t_in->psa_key_dec);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001675
Gilles Peskine449bd832023-01-11 14:50:10 +01001676 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001677 ret = PSA_TO_MBEDTLS_ERR(status);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001678 goto cleanup;
1679 }
1680
Gilles Peskine449bd832023-01-11 14:50:10 +01001681 status = psa_import_key(&attributes,
1682 key0,
1683 PSA_BITS_TO_BYTES(key_bits),
1684 &t_out->psa_key_dec);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001685
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001687 ret = PSA_TO_MBEDTLS_ERR(status);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01001688 goto cleanup;
1689 }
1690 }
1691#endif /* MBEDTLS_USE_PSA_CRYPTO */
1692
Hanno Becker81e16a32019-03-01 11:21:44 +00001693cleanup:
1694
Gilles Peskine449bd832023-01-11 14:50:10 +01001695 mbedtls_free(key0);
1696 mbedtls_free(key1);
Hanno Becker81e16a32019-03-01 11:21:44 +00001697
Gilles Peskine449bd832023-01-11 14:50:10 +01001698 mbedtls_free(md0);
1699 mbedtls_free(md1);
Paul Elliott6f1eda72020-06-11 20:22:00 +01001700
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 return ret;
Hanno Beckera18d1322018-01-03 14:27:32 +00001702}
1703
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001704/*
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001705 * Populate a session structure for serialization tests.
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001706 * Choose dummy values, mostly non-0 to distinguish from the init default.
1707 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001708static int ssl_tls12_populate_session(mbedtls_ssl_session *session,
1709 int ticket_len,
1710 const char *crt_file)
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001711{
1712#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01001713 session->start = mbedtls_time(NULL) - 42;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001714#endif
Glenn Straussda7851c2022-03-14 13:29:48 -04001715 session->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001716 session->ciphersuite = 0xabcd;
Gilles Peskine449bd832023-01-11 14:50:10 +01001717 session->id_len = sizeof(session->id);
1718 memset(session->id, 66, session->id_len);
1719 memset(session->master, 17, sizeof(session->master));
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001720
Ronald Crone68ab4f2022-10-05 12:46:29 +02001721#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) && defined(MBEDTLS_FS_IO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001722 if (crt_file != NULL && strlen(crt_file) != 0) {
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001723 mbedtls_x509_crt tmp_crt;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001724 int ret;
Manuel Pégourié-Gonnard6b840702019-05-24 09:40:17 +02001725
Gilles Peskine449bd832023-01-11 14:50:10 +01001726 mbedtls_x509_crt_init(&tmp_crt);
1727 ret = mbedtls_x509_crt_parse_file(&tmp_crt, crt_file);
1728 if (ret != 0) {
1729 return ret;
1730 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001731
1732#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1733 /* Move temporary CRT. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001734 session->peer_cert = mbedtls_calloc(1, sizeof(*session->peer_cert));
1735 if (session->peer_cert == NULL) {
1736 return -1;
1737 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001738 *session->peer_cert = tmp_crt;
Gilles Peskine449bd832023-01-11 14:50:10 +01001739 memset(&tmp_crt, 0, sizeof(tmp_crt));
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001740#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1741 /* Calculate digest of temporary CRT. */
1742 session->peer_cert_digest =
Gilles Peskine449bd832023-01-11 14:50:10 +01001743 mbedtls_calloc(1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN);
1744 if (session->peer_cert_digest == NULL) {
1745 return -1;
1746 }
Przemek Stekielcc59c992022-08-01 11:51:22 +02001747
1748#if defined(MBEDTLS_USE_PSA_CRYPTO)
1749 psa_algorithm_t psa_alg = mbedtls_hash_info_psa_from_md(
Gilles Peskine449bd832023-01-11 14:50:10 +01001750 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE);
Przemek Stekielcc59c992022-08-01 11:51:22 +02001751 size_t hash_size = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 psa_status_t status = psa_hash_compute(psa_alg, tmp_crt.raw.p,
1753 tmp_crt.raw.len,
1754 session->peer_cert_digest,
1755 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN,
1756 &hash_size);
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001757 ret = PSA_TO_MBEDTLS_ERR(status);
Przemek Stekielcc59c992022-08-01 11:51:22 +02001758#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001759 ret = mbedtls_md(mbedtls_md_info_from_type(
1760 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE),
1761 tmp_crt.raw.p, tmp_crt.raw.len,
1762 session->peer_cert_digest);
Przemek Stekielcc59c992022-08-01 11:51:22 +02001763#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01001764 if (ret != 0) {
1765 return ret;
1766 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001767 session->peer_cert_digest_type =
1768 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1769 session->peer_cert_digest_len =
1770 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1771#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1772
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 mbedtls_x509_crt_free(&tmp_crt);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001774 }
Ronald Crone68ab4f2022-10-05 12:46:29 +02001775#else /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001776 (void) crt_file;
Ronald Crone68ab4f2022-10-05 12:46:29 +02001777#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED && MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001778 session->verify_result = 0xdeadbeef;
1779
1780#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001781 if (ticket_len != 0) {
1782 session->ticket = mbedtls_calloc(1, ticket_len);
1783 if (session->ticket == NULL) {
1784 return -1;
1785 }
1786 memset(session->ticket, 33, ticket_len);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001787 }
1788 session->ticket_len = ticket_len;
1789 session->ticket_lifetime = 86401;
1790#else
1791 (void) ticket_len;
1792#endif
1793
1794#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1795 session->mfl_code = 1;
1796#endif
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001797#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1798 session->encrypt_then_mac = 1;
1799#endif
1800
Gilles Peskine449bd832023-01-11 14:50:10 +01001801 return 0;
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001802}
1803
Jerry Yu534ff402022-07-14 16:43:43 +08001804#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01001805static int ssl_tls13_populate_session(mbedtls_ssl_session *session,
1806 int ticket_len,
1807 int endpoint_type)
Jerry Yu534ff402022-07-14 16:43:43 +08001808{
1809 ((void) ticket_len);
1810 session->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
1811 session->endpoint = endpoint_type == MBEDTLS_SSL_IS_CLIENT ?
Gilles Peskine449bd832023-01-11 14:50:10 +01001812 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER;
Jerry Yu534ff402022-07-14 16:43:43 +08001813 session->ciphersuite = 0xabcd;
1814 session->ticket_age_add = 0x87654321;
1815 session->ticket_flags = 0x7;
1816
Jerry Yubc7c1a42022-07-21 22:57:37 +08001817 session->resumption_key_len = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01001818 memset(session->resumption_key, 0x99, sizeof(session->resumption_key));
Jerry Yu534ff402022-07-14 16:43:43 +08001819
1820#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01001821 if (session->endpoint == MBEDTLS_SSL_IS_SERVER) {
1822 session->start = mbedtls_time(NULL) - 42;
Jerry Yu534ff402022-07-14 16:43:43 +08001823 }
1824#endif
1825
1826#if defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001827 if (session->endpoint == MBEDTLS_SSL_IS_CLIENT) {
Jerry Yu534ff402022-07-14 16:43:43 +08001828#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01001829 session->ticket_received = mbedtls_time(NULL) - 40;
Jerry Yu534ff402022-07-14 16:43:43 +08001830#endif
1831 session->ticket_lifetime = 0xfedcba98;
1832
1833 session->ticket_len = ticket_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001834 if (ticket_len != 0) {
1835 session->ticket = mbedtls_calloc(1, ticket_len);
1836 if (session->ticket == NULL) {
1837 return -1;
1838 }
1839 memset(session->ticket, 33, ticket_len);
Jerry Yu534ff402022-07-14 16:43:43 +08001840 }
1841 }
1842#endif /* MBEDTLS_SSL_CLI_C */
1843
Gilles Peskine449bd832023-01-11 14:50:10 +01001844 return 0;
Jerry Yu534ff402022-07-14 16:43:43 +08001845}
1846#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1847
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001848/*
1849 * Perform data exchanging between \p ssl_1 and \p ssl_2 and check if the
1850 * message was sent in the correct number of fragments.
1851 *
1852 * /p ssl_1 and /p ssl_2 Endpoints represented by mbedtls_ssl_context. Both
1853 * of them must be initialized and connected beforehand.
1854 * /p msg_len_1 and /p msg_len_2 specify the size of the message to send.
1855 * /p expected_fragments_1 and /p expected_fragments_2 determine in how many
1856 * fragments the message should be sent.
1857 * expected_fragments is 0: can be used for DTLS testing while the message
1858 * size is larger than MFL. In that case the message
1859 * cannot be fragmented and sent to the second endpoint.
1860 * This value can be used for negative tests.
1861 * expected_fragments is 1: can be used for TLS/DTLS testing while the
1862 * message size is below MFL
1863 * expected_fragments > 1: can be used for TLS testing while the message
1864 * size is larger than MFL
1865 *
1866 * \retval 0 on success, otherwise error code.
1867 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001868int mbedtls_exchange_data(mbedtls_ssl_context *ssl_1,
1869 int msg_len_1, const int expected_fragments_1,
1870 mbedtls_ssl_context *ssl_2,
1871 int msg_len_2, const int expected_fragments_2)
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001872{
Gilles Peskine449bd832023-01-11 14:50:10 +01001873 unsigned char *msg_buf_1 = malloc(msg_len_1);
1874 unsigned char *msg_buf_2 = malloc(msg_len_2);
1875 unsigned char *in_buf_1 = malloc(msg_len_2);
1876 unsigned char *in_buf_2 = malloc(msg_len_1);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001877 int msg_type, ret = -1;
1878
1879 /* Perform this test with two message types. At first use a message
1880 * consisting of only 0x00 for the client and only 0xFF for the server.
1881 * At the second time use message with generated data */
Gilles Peskine449bd832023-01-11 14:50:10 +01001882 for (msg_type = 0; msg_type < 2; msg_type++) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001883 int written_1 = 0;
1884 int written_2 = 0;
1885 int read_1 = 0;
1886 int read_2 = 0;
1887 int fragments_1 = 0;
1888 int fragments_2 = 0;
1889
Gilles Peskine449bd832023-01-11 14:50:10 +01001890 if (msg_type == 0) {
1891 memset(msg_buf_1, 0x00, msg_len_1);
1892 memset(msg_buf_2, 0xff, msg_len_2);
1893 } else {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001894 int i, j = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001895 for (i = 0; i < msg_len_1; i++) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001896 msg_buf_1[i] = j++ & 0xFF;
1897 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001898 for (i = 0; i < msg_len_2; i++) {
1899 msg_buf_2[i] = (j -= 5) & 0xFF;
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001900 }
1901 }
1902
Gilles Peskine449bd832023-01-11 14:50:10 +01001903 while (read_1 < msg_len_2 || read_2 < msg_len_1) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001904 /* ssl_1 sending */
Gilles Peskine449bd832023-01-11 14:50:10 +01001905 if (msg_len_1 > written_1) {
1906 ret = mbedtls_ssl_write_fragment(ssl_1, msg_buf_1,
1907 msg_len_1, &written_1,
1908 expected_fragments_1);
1909 if (expected_fragments_1 == 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001910 /* This error is expected when the message is too large and
1911 * cannot be fragmented */
Gilles Peskine449bd832023-01-11 14:50:10 +01001912 TEST_ASSERT(ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001913 msg_len_1 = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001914 } else {
1915 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001916 }
1917 }
1918
1919 /* ssl_2 sending */
Gilles Peskine449bd832023-01-11 14:50:10 +01001920 if (msg_len_2 > written_2) {
1921 ret = mbedtls_ssl_write_fragment(ssl_2, msg_buf_2,
1922 msg_len_2, &written_2,
1923 expected_fragments_2);
1924 if (expected_fragments_2 == 0) {
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001925 /* This error is expected when the message is too large and
1926 * cannot be fragmented */
Gilles Peskine449bd832023-01-11 14:50:10 +01001927 TEST_ASSERT(ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001928 msg_len_2 = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001929 } else {
1930 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001931 }
1932 }
1933
1934 /* ssl_1 reading */
Gilles Peskine449bd832023-01-11 14:50:10 +01001935 if (read_1 < msg_len_2) {
1936 ret = mbedtls_ssl_read_fragment(ssl_1, in_buf_1,
1937 msg_len_2, &read_1,
1938 &fragments_2,
1939 expected_fragments_2);
1940 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001941 }
1942
1943 /* ssl_2 reading */
Gilles Peskine449bd832023-01-11 14:50:10 +01001944 if (read_2 < msg_len_1) {
1945 ret = mbedtls_ssl_read_fragment(ssl_2, in_buf_2,
1946 msg_len_1, &read_2,
1947 &fragments_1,
1948 expected_fragments_1);
1949 TEST_ASSERT(ret == 0);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001950 }
1951 }
1952
1953 ret = -1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001954 TEST_ASSERT(0 == memcmp(msg_buf_1, in_buf_2, msg_len_1));
1955 TEST_ASSERT(0 == memcmp(msg_buf_2, in_buf_1, msg_len_2));
1956 TEST_ASSERT(fragments_1 == expected_fragments_1);
1957 TEST_ASSERT(fragments_2 == expected_fragments_2);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001958 }
1959
1960 ret = 0;
1961
1962exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001963 free(msg_buf_1);
1964 free(in_buf_1);
1965 free(msg_buf_2);
1966 free(in_buf_2);
Piotr Nowicki6a7f01c2020-02-12 13:53:36 +01001967
1968 return ret;
1969}
1970
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001971/*
1972 * Perform data exchanging between \p ssl_1 and \p ssl_2. Both of endpoints
1973 * must be initialized and connected beforehand.
1974 *
1975 * \retval 0 on success, otherwise error code.
1976 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001977int exchange_data(mbedtls_ssl_context *ssl_1,
1978 mbedtls_ssl_context *ssl_2)
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001979{
Gilles Peskine449bd832023-01-11 14:50:10 +01001980 return mbedtls_exchange_data(ssl_1, 256, 1,
1981 ssl_2, 256, 1);
Piotr Nowicki95e9eb82020-02-14 11:33:34 +01001982}
1983
Ronald Crone68ab4f2022-10-05 12:46:29 +02001984#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001985static int check_ssl_version(mbedtls_ssl_protocol_version expected_negotiated_version,
1986 const mbedtls_ssl_context *ssl)
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001987{
Gilles Peskine449bd832023-01-11 14:50:10 +01001988 const char *version_string = mbedtls_ssl_get_version(ssl);
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001989 mbedtls_ssl_protocol_version version_number =
Gilles Peskine449bd832023-01-11 14:50:10 +01001990 mbedtls_ssl_get_version_number(ssl);
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001991
Gilles Peskine449bd832023-01-11 14:50:10 +01001992 TEST_EQUAL(ssl->tls_version, expected_negotiated_version);
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001993
Gilles Peskine449bd832023-01-11 14:50:10 +01001994 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1995 TEST_EQUAL(version_string[0], 'D');
Gilles Peskine1255b0d2022-01-13 01:08:48 +01001996 ++version_string;
1997 }
1998
Gilles Peskine449bd832023-01-11 14:50:10 +01001999 switch (expected_negotiated_version) {
Glenn Strausse3af4cb2022-03-15 03:23:42 -04002000 case MBEDTLS_SSL_VERSION_TLS1_2:
Gilles Peskine449bd832023-01-11 14:50:10 +01002001 TEST_EQUAL(version_number, MBEDTLS_SSL_VERSION_TLS1_2);
2002 TEST_ASSERT(strcmp(version_string, "TLSv1.2") == 0);
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002003 break;
2004
Glenn Strausse3af4cb2022-03-15 03:23:42 -04002005 case MBEDTLS_SSL_VERSION_TLS1_3:
Gilles Peskine449bd832023-01-11 14:50:10 +01002006 TEST_EQUAL(version_number, MBEDTLS_SSL_VERSION_TLS1_3);
2007 TEST_ASSERT(strcmp(version_string, "TLSv1.3") == 0);
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002008 break;
2009
2010 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01002011 TEST_ASSERT(!"Version check not implemented for this protocol version");
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002012 }
2013
Gilles Peskine449bd832023-01-11 14:50:10 +01002014 return 1;
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002015
2016exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002017 return 0;
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002018}
Ronald Crone68ab4f2022-10-05 12:46:29 +02002019#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002020
2021
Ronald Crone68ab4f2022-10-05 12:46:29 +02002022#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002023void perform_handshake(handshake_test_options *options)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002024{
2025 /* forced_ciphersuite needs to last until the end of the handshake */
2026 int forced_ciphersuite[2];
2027 enum { BUFFSIZE = 17000 };
2028 mbedtls_endpoint client, server;
Ronald Cron73fe8df2022-10-05 14:31:43 +02002029#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002030 const char *psk_identity = "foo";
2031#endif
2032#if defined(MBEDTLS_TIMING_C)
2033 mbedtls_timing_delay_context timer_client, timer_server;
2034#endif
2035#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
2036 unsigned char *context_buf = NULL;
2037 size_t context_buf_len;
2038#endif
2039#if defined(MBEDTLS_SSL_RENEGOTIATION)
2040 int ret = -1;
2041#endif
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002042 int expected_handshake_result = options->expected_handshake_result;
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002043
Gilles Peskine449bd832023-01-11 14:50:10 +01002044 USE_PSA_INIT();
2045 mbedtls_platform_zeroize(&client, sizeof(client));
2046 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002047 mbedtls_test_message_queue server_queue, client_queue;
2048 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01002049 mbedtls_message_socket_init(&server_context);
2050 mbedtls_message_socket_init(&client_context);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002051
2052 /* Client side */
Gilles Peskine449bd832023-01-11 14:50:10 +01002053 if (options->dtls != 0) {
2054 TEST_ASSERT(mbedtls_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
2055 options, &client_context,
2056 &client_queue,
2057 &server_queue, NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002058#if defined(MBEDTLS_TIMING_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 mbedtls_ssl_set_timer_cb(&client.ssl, &timer_client,
2060 mbedtls_timing_set_delay,
2061 mbedtls_timing_get_delay);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002062#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002063 } else {
2064 TEST_ASSERT(mbedtls_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
2065 options, NULL, NULL,
2066 NULL, NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002067 }
Paul Elliottc8570442020-04-15 17:00:50 +01002068
Gilles Peskine449bd832023-01-11 14:50:10 +01002069 if (options->client_min_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
2070 mbedtls_ssl_conf_min_tls_version(&client.conf,
2071 options->client_min_version);
Paul Elliottc8570442020-04-15 17:00:50 +01002072 }
2073
Gilles Peskine449bd832023-01-11 14:50:10 +01002074 if (options->client_max_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
2075 mbedtls_ssl_conf_max_tls_version(&client.conf,
2076 options->client_max_version);
Paul Elliottc8570442020-04-15 17:00:50 +01002077 }
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002078
Gilles Peskine449bd832023-01-11 14:50:10 +01002079 if (strlen(options->cipher) > 0) {
2080 set_ciphersuite(&client.conf, options->cipher, forced_ciphersuite);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002081 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002082
Gilles Peskine449bd832023-01-11 14:50:10 +01002083#if defined(MBEDTLS_DEBUG_C)
2084 if (options->cli_log_fun) {
2085 mbedtls_debug_set_threshold(4);
2086 mbedtls_ssl_conf_dbg(&client.conf, options->cli_log_fun,
2087 options->cli_log_obj);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002088 }
2089#endif
2090
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002091 /* Server side */
Gilles Peskine449bd832023-01-11 14:50:10 +01002092 if (options->dtls != 0) {
2093 TEST_ASSERT(mbedtls_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
2094 options, &server_context,
2095 &server_queue,
2096 &client_queue, NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002097#if defined(MBEDTLS_TIMING_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002098 mbedtls_ssl_set_timer_cb(&server.ssl, &timer_server,
2099 mbedtls_timing_set_delay,
2100 mbedtls_timing_get_delay);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002101#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002102 } else {
2103 TEST_ASSERT(mbedtls_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
2104 options, NULL, NULL, NULL,
2105 NULL) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002106 }
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002107
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 mbedtls_ssl_conf_authmode(&server.conf, options->srv_auth_mode);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002109
Gilles Peskine449bd832023-01-11 14:50:10 +01002110 if (options->server_min_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
2111 mbedtls_ssl_conf_min_tls_version(&server.conf,
2112 options->server_min_version);
Paul Elliottc8570442020-04-15 17:00:50 +01002113 }
2114
Gilles Peskine449bd832023-01-11 14:50:10 +01002115 if (options->server_max_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
2116 mbedtls_ssl_conf_max_tls_version(&server.conf,
2117 options->server_max_version);
Paul Elliottc8570442020-04-15 17:00:50 +01002118 }
2119
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002120#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 TEST_ASSERT(mbedtls_ssl_conf_max_frag_len(&(server.conf),
2122 (unsigned char) options->mfl) == 0);
2123 TEST_ASSERT(mbedtls_ssl_conf_max_frag_len(&(client.conf),
2124 (unsigned char) options->mfl) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002125#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002126 TEST_ASSERT(MBEDTLS_SSL_MAX_FRAG_LEN_NONE == options->mfl);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002127#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2128
Ronald Cron73fe8df2022-10-05 14:31:43 +02002129#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 if (options->psk_str != NULL && options->psk_str->len > 0) {
2131 TEST_ASSERT(mbedtls_ssl_conf_psk(&client.conf, options->psk_str->x,
2132 options->psk_str->len,
2133 (const unsigned char *) psk_identity,
2134 strlen(psk_identity)) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002135
Gilles Peskine449bd832023-01-11 14:50:10 +01002136 TEST_ASSERT(mbedtls_ssl_conf_psk(&server.conf, options->psk_str->x,
2137 options->psk_str->len,
2138 (const unsigned char *) psk_identity,
2139 strlen(psk_identity)) == 0);
Jerry Yu8897c072022-08-12 13:56:53 +08002140#if defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002141 mbedtls_ssl_conf_psk_cb(&server.conf, psk_dummy_callback, NULL);
Jerry Yu8897c072022-08-12 13:56:53 +08002142#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002143 }
2144#endif
2145#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002146 if (options->renegotiate) {
2147 mbedtls_ssl_conf_renegotiation(&(server.conf),
2148 MBEDTLS_SSL_RENEGOTIATION_ENABLED);
2149 mbedtls_ssl_conf_renegotiation(&(client.conf),
2150 MBEDTLS_SSL_RENEGOTIATION_ENABLED);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002151
Gilles Peskine449bd832023-01-11 14:50:10 +01002152 mbedtls_ssl_conf_legacy_renegotiation(&(server.conf),
2153 options->legacy_renegotiation);
2154 mbedtls_ssl_conf_legacy_renegotiation(&(client.conf),
2155 options->legacy_renegotiation);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002156 }
2157#endif /* MBEDTLS_SSL_RENEGOTIATION */
2158
Gilles Peskine449bd832023-01-11 14:50:10 +01002159#if defined(MBEDTLS_DEBUG_C)
2160 if (options->srv_log_fun) {
2161 mbedtls_debug_set_threshold(4);
2162 mbedtls_ssl_conf_dbg(&server.conf, options->srv_log_fun,
2163 options->srv_log_obj);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002164 }
2165#endif
2166
Gilles Peskine449bd832023-01-11 14:50:10 +01002167 TEST_ASSERT(mbedtls_mock_socket_connect(&(client.socket),
2168 &(server.socket),
2169 BUFFSIZE) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002170
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002171#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002172 if (options->resize_buffers != 0) {
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002173 /* Ensure that the buffer sizes are appropriate before resizes */
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 TEST_ASSERT(client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2175 TEST_ASSERT(client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
2176 TEST_ASSERT(server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2177 TEST_ASSERT(server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002178 }
2179#endif
2180
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 if (options->expected_negotiated_version == MBEDTLS_SSL_VERSION_UNKNOWN) {
Hanno Beckerbc000442021-06-24 09:18:19 +01002182 expected_handshake_result = MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Elliottc8570442020-04-15 17:00:50 +01002183 }
2184
Gilles Peskine449bd832023-01-11 14:50:10 +01002185 TEST_ASSERT(mbedtls_move_handshake_to_state(&(client.ssl),
2186 &(server.ssl),
2187 MBEDTLS_SSL_HANDSHAKE_OVER)
2188 == expected_handshake_result);
Paul Elliottc8570442020-04-15 17:00:50 +01002189
Gilles Peskine449bd832023-01-11 14:50:10 +01002190 if (expected_handshake_result != 0) {
Paul Elliottc8570442020-04-15 17:00:50 +01002191 /* Connection will have failed by this point, skip to cleanup */
2192 goto exit;
2193 }
2194
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 TEST_ASSERT(mbedtls_ssl_is_handshake_over(&client.ssl) == 1);
Jerry Yudf0a71a2022-05-26 10:43:30 +08002196
Jerry Yu66adf312022-05-31 15:23:29 +08002197 /* Make sure server state is moved to HANDSHAKE_OVER also. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002198 TEST_EQUAL(mbedtls_move_handshake_to_state(&(server.ssl),
2199 &(client.ssl),
2200 MBEDTLS_SSL_HANDSHAKE_OVER), 0);
Jerry Yudf0a71a2022-05-26 10:43:30 +08002201
Gilles Peskine449bd832023-01-11 14:50:10 +01002202 TEST_ASSERT(mbedtls_ssl_is_handshake_over(&server.ssl) == 1);
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002203 /* Check that both sides have negotiated the expected version. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002204 mbedtls_test_set_step(0);
2205 if (!check_ssl_version(options->expected_negotiated_version,
2206 &client.ssl)) {
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002207 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002208 }
Paul Elliottc8570442020-04-15 17:00:50 +01002209
Gilles Peskine449bd832023-01-11 14:50:10 +01002210 mbedtls_test_set_step(1);
2211 if (!check_ssl_version(options->expected_negotiated_version,
2212 &server.ssl)) {
Gilles Peskine1255b0d2022-01-13 01:08:48 +01002213 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002214 }
Paul Elliottc8570442020-04-15 17:00:50 +01002215
Gilles Peskine449bd832023-01-11 14:50:10 +01002216 if (options->expected_ciphersuite != 0) {
2217 TEST_EQUAL(server.ssl.session->ciphersuite,
2218 options->expected_ciphersuite);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02002219 }
2220
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002221#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002222 if (options->resize_buffers != 0) {
TRodziewicz2abf03c2021-06-25 14:40:09 +02002223 /* A server, when using DTLS, might delay a buffer resize to happen
2224 * after it receives a message, so we force it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002225 TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002226
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 TEST_ASSERT(client.ssl.out_buf_len ==
2228 mbedtls_ssl_get_output_buflen(&client.ssl));
2229 TEST_ASSERT(client.ssl.in_buf_len ==
2230 mbedtls_ssl_get_input_buflen(&client.ssl));
2231 TEST_ASSERT(server.ssl.out_buf_len ==
2232 mbedtls_ssl_get_output_buflen(&server.ssl));
2233 TEST_ASSERT(server.ssl.in_buf_len ==
2234 mbedtls_ssl_get_input_buflen(&server.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002235 }
2236#endif
2237
Gilles Peskine449bd832023-01-11 14:50:10 +01002238 if (options->cli_msg_len != 0 || options->srv_msg_len != 0) {
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002239 /* Start data exchanging test */
Gilles Peskine449bd832023-01-11 14:50:10 +01002240 TEST_ASSERT(mbedtls_exchange_data(&(client.ssl), options->cli_msg_len,
2241 options->expected_cli_fragments,
2242 &(server.ssl), options->srv_msg_len,
2243 options->expected_srv_fragments)
2244 == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002245 }
2246#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002247 if (options->serialize == 1) {
2248 TEST_ASSERT(options->dtls == 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002249
Gilles Peskine449bd832023-01-11 14:50:10 +01002250 TEST_ASSERT(mbedtls_ssl_context_save(&(server.ssl), NULL,
2251 0, &context_buf_len)
2252 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002253
Gilles Peskine449bd832023-01-11 14:50:10 +01002254 context_buf = mbedtls_calloc(1, context_buf_len);
2255 TEST_ASSERT(context_buf != NULL);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002256
Gilles Peskine449bd832023-01-11 14:50:10 +01002257 TEST_ASSERT(mbedtls_ssl_context_save(&(server.ssl), context_buf,
2258 context_buf_len,
2259 &context_buf_len) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002260
Gilles Peskine449bd832023-01-11 14:50:10 +01002261 mbedtls_ssl_free(&(server.ssl));
2262 mbedtls_ssl_init(&(server.ssl));
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002263
Gilles Peskine449bd832023-01-11 14:50:10 +01002264 TEST_ASSERT(mbedtls_ssl_setup(&(server.ssl), &(server.conf)) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002265
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 mbedtls_ssl_set_bio(&(server.ssl), &server_context,
2267 mbedtls_mock_tcp_send_msg,
2268 mbedtls_mock_tcp_recv_msg,
2269 NULL);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002270
Gilles Peskine449bd832023-01-11 14:50:10 +01002271 mbedtls_ssl_set_user_data_p(&server.ssl, &server);
Gilles Peskine49d7ddf2022-01-27 23:25:51 +01002272
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002273#if defined(MBEDTLS_TIMING_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002274 mbedtls_ssl_set_timer_cb(&server.ssl, &timer_server,
2275 mbedtls_timing_set_delay,
2276 mbedtls_timing_get_delay);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002277#endif
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002278#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002279 if (options->resize_buffers != 0) {
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002280 /* Ensure that the buffer sizes are appropriate before resizes */
Gilles Peskine449bd832023-01-11 14:50:10 +01002281 TEST_ASSERT(server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2282 TEST_ASSERT(server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002283 }
2284#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002285 TEST_ASSERT(mbedtls_ssl_context_load(&(server.ssl), context_buf,
2286 context_buf_len) == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002287
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002288#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2289 /* Validate buffer sizes after context deserialization */
Gilles Peskine449bd832023-01-11 14:50:10 +01002290 if (options->resize_buffers != 0) {
2291 TEST_ASSERT(server.ssl.out_buf_len ==
2292 mbedtls_ssl_get_output_buflen(&server.ssl));
2293 TEST_ASSERT(server.ssl.in_buf_len ==
2294 mbedtls_ssl_get_input_buflen(&server.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002295 }
2296#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002297 /* Retest writing/reading */
Gilles Peskine449bd832023-01-11 14:50:10 +01002298 if (options->cli_msg_len != 0 || options->srv_msg_len != 0) {
2299 TEST_ASSERT(mbedtls_exchange_data(&(client.ssl),
2300 options->cli_msg_len,
2301 options->expected_cli_fragments,
2302 &(server.ssl),
2303 options->srv_msg_len,
2304 options->expected_srv_fragments)
2305 == 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002306 }
2307 }
2308#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002309
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002310#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002311 if (options->renegotiate) {
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002312 /* Start test with renegotiation */
Gilles Peskine449bd832023-01-11 14:50:10 +01002313 TEST_ASSERT(server.ssl.renego_status ==
2314 MBEDTLS_SSL_INITIAL_HANDSHAKE);
2315 TEST_ASSERT(client.ssl.renego_status ==
2316 MBEDTLS_SSL_INITIAL_HANDSHAKE);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002317
2318 /* After calling this function for the server, it only sends a handshake
2319 * request. All renegotiation should happen during data exchanging */
Gilles Peskine449bd832023-01-11 14:50:10 +01002320 TEST_ASSERT(mbedtls_ssl_renegotiate(&(server.ssl)) == 0);
2321 TEST_ASSERT(server.ssl.renego_status ==
2322 MBEDTLS_SSL_RENEGOTIATION_PENDING);
2323 TEST_ASSERT(client.ssl.renego_status ==
2324 MBEDTLS_SSL_INITIAL_HANDSHAKE);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002325
Gilles Peskine449bd832023-01-11 14:50:10 +01002326 TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
2327 TEST_ASSERT(server.ssl.renego_status ==
2328 MBEDTLS_SSL_RENEGOTIATION_DONE);
2329 TEST_ASSERT(client.ssl.renego_status ==
2330 MBEDTLS_SSL_RENEGOTIATION_DONE);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002331
2332 /* After calling mbedtls_ssl_renegotiate for the client all renegotiation
2333 * should happen inside this function. However in this test, we cannot
Shaun Case8b0ecbc2021-12-20 21:14:10 -08002334 * perform simultaneous communication between client and server so this
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002335 * function will return waiting error on the socket. All rest of
2336 * renegotiation should happen during data exchanging */
Gilles Peskine449bd832023-01-11 14:50:10 +01002337 ret = mbedtls_ssl_renegotiate(&(client.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002338#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002339 if (options->resize_buffers != 0) {
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002340 /* Ensure that the buffer sizes are appropriate before resizes */
Gilles Peskine449bd832023-01-11 14:50:10 +01002341 TEST_ASSERT(client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2342 TEST_ASSERT(client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002343 }
2344#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002345 TEST_ASSERT(ret == 0 ||
2346 ret == MBEDTLS_ERR_SSL_WANT_READ ||
2347 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
2348 TEST_ASSERT(server.ssl.renego_status ==
2349 MBEDTLS_SSL_RENEGOTIATION_DONE);
2350 TEST_ASSERT(client.ssl.renego_status ==
2351 MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002352
Gilles Peskine449bd832023-01-11 14:50:10 +01002353 TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
2354 TEST_ASSERT(server.ssl.renego_status ==
2355 MBEDTLS_SSL_RENEGOTIATION_DONE);
2356 TEST_ASSERT(client.ssl.renego_status ==
2357 MBEDTLS_SSL_RENEGOTIATION_DONE);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002358#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2359 /* Validate buffer sizes after renegotiation */
Gilles Peskine449bd832023-01-11 14:50:10 +01002360 if (options->resize_buffers != 0) {
2361 TEST_ASSERT(client.ssl.out_buf_len ==
2362 mbedtls_ssl_get_output_buflen(&client.ssl));
2363 TEST_ASSERT(client.ssl.in_buf_len ==
2364 mbedtls_ssl_get_input_buflen(&client.ssl));
2365 TEST_ASSERT(server.ssl.out_buf_len ==
2366 mbedtls_ssl_get_output_buflen(&server.ssl));
2367 TEST_ASSERT(server.ssl.in_buf_len ==
2368 mbedtls_ssl_get_input_buflen(&server.ssl));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002369 }
2370#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002371 }
2372#endif /* MBEDTLS_SSL_RENEGOTIATION */
2373
Gilles Peskine449bd832023-01-11 14:50:10 +01002374 TEST_ASSERT(mbedtls_ssl_conf_get_user_data_p(&client.conf) == &client);
2375 TEST_ASSERT(mbedtls_ssl_get_user_data_p(&client.ssl) == &client);
2376 TEST_ASSERT(mbedtls_ssl_conf_get_user_data_p(&server.conf) == &server);
2377 TEST_ASSERT(mbedtls_ssl_get_user_data_p(&server.ssl) == &server);
Gilles Peskine80dae042022-01-21 23:50:39 +01002378
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002379exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002380 mbedtls_endpoint_free(&client, options->dtls != 0 ? &client_context : NULL);
2381 mbedtls_endpoint_free(&server, options->dtls != 0 ? &server_context : NULL);
2382#if defined(MBEDTLS_DEBUG_C)
2383 if (options->cli_log_fun || options->srv_log_fun) {
2384 mbedtls_debug_set_threshold(0);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002385 }
2386#endif
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002387#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002388 if (context_buf != NULL) {
2389 mbedtls_free(context_buf);
2390 }
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002391#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002392 USE_PSA_DONE();
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002393}
Ronald Crone68ab4f2022-10-05 12:46:29 +02002394#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002395
Ronald Crone7b9b6b2022-06-10 17:24:31 +02002396#if defined(MBEDTLS_TEST_HOOKS)
Ronald Crone3dac4a2022-06-10 17:21:51 +02002397/*
2398 * Tweak vector lengths in a TLS 1.3 Certificate message
2399 *
Ronald Croncf600bc2022-06-17 15:54:16 +02002400 * \param[in] buf Buffer containing the Certificate message to tweak
2401 * \param[in]]out] end End of the buffer to parse
2402 * \param tweak Tweak identifier (from 1 to the number of tweaks).
2403 * \param[out] expected_result Error code expected from the parsing function
2404 * \param[out] args Arguments of the MBEDTLS_SSL_CHK_BUF_READ_PTR call that
Ronald Crone3dac4a2022-06-10 17:21:51 +02002405 * is expected to fail. All zeroes if no
2406 * MBEDTLS_SSL_CHK_BUF_READ_PTR failure is expected.
2407 */
2408int tweak_tls13_certificate_msg_vector_len(
Ronald Crone7b9b6b2022-06-10 17:24:31 +02002409 unsigned char *buf, unsigned char **end, int tweak,
Gilles Peskine449bd832023-01-11 14:50:10 +01002410 int *expected_result, mbedtls_ssl_chk_buf_ptr_args *args)
Ronald Crone3dac4a2022-06-10 17:21:51 +02002411{
2412/*
2413 * The definition of the tweaks assume that the certificate list contains only
2414 * one certificate.
2415 */
2416
2417/*
2418 * struct {
2419 * opaque cert_data<1..2^24-1>;
2420 * Extension extensions<0..2^16-1>;
2421 * } CertificateEntry;
2422 *
2423 * struct {
2424 * opaque certificate_request_context<0..2^8-1>;
2425 * CertificateEntry certificate_list<0..2^24-1>;
2426 * } Certificate;
2427 */
2428 unsigned char *p_certificate_request_context_len = buf;
2429 size_t certificate_request_context_len = buf[0];
2430
2431 unsigned char *p_certificate_list_len = buf + 1 + certificate_request_context_len;
2432 unsigned char *certificate_list = p_certificate_list_len + 3;
Gilles Peskine449bd832023-01-11 14:50:10 +01002433 size_t certificate_list_len = MBEDTLS_GET_UINT24_BE(p_certificate_list_len, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02002434
2435 unsigned char *p_cert_data_len = certificate_list;
2436 unsigned char *cert_data = p_cert_data_len + 3;
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 size_t cert_data_len = MBEDTLS_GET_UINT24_BE(p_cert_data_len, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02002438
2439 unsigned char *p_extensions_len = cert_data + cert_data_len;
2440 unsigned char *extensions = p_extensions_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002441 size_t extensions_len = MBEDTLS_GET_UINT16_BE(p_extensions_len, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02002442
2443 *expected_result = MBEDTLS_ERR_SSL_DECODE_ERROR;
2444
Gilles Peskine449bd832023-01-11 14:50:10 +01002445 switch (tweak) {
Ronald Crone3dac4a2022-06-10 17:21:51 +02002446 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +01002447 /* Failure when checking if the certificate request context length and
2448 * certificate list length can be read
2449 */
2450 *end = buf + 3;
2451 set_chk_buf_ptr_args(args, buf, *end, 4);
2452 break;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002453
2454 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +01002455 /* Invalid certificate request context length.
2456 */
2457 *p_certificate_request_context_len =
2458 certificate_request_context_len + 1;
2459 reset_chk_buf_ptr_args(args);
2460 break;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002461
2462 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +01002463 /* Failure when checking if certificate_list data can be read. */
2464 MBEDTLS_PUT_UINT24_BE(certificate_list_len + 1,
2465 p_certificate_list_len, 0);
2466 set_chk_buf_ptr_args(args, certificate_list, *end,
2467 certificate_list_len + 1);
2468 break;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002469
2470 case 4:
Gilles Peskine449bd832023-01-11 14:50:10 +01002471 /* Failure when checking if the cert_data length can be read. */
2472 MBEDTLS_PUT_UINT24_BE(2, p_certificate_list_len, 0);
2473 set_chk_buf_ptr_args(args, p_cert_data_len, certificate_list + 2, 3);
2474 break;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002475
2476 case 5:
Gilles Peskine449bd832023-01-11 14:50:10 +01002477 /* Failure when checking if cert_data data can be read. */
2478 MBEDTLS_PUT_UINT24_BE(certificate_list_len - 3 + 1,
2479 p_cert_data_len, 0);
2480 set_chk_buf_ptr_args(args, cert_data,
2481 certificate_list + certificate_list_len,
2482 certificate_list_len - 3 + 1);
2483 break;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002484
2485 case 6:
Gilles Peskine449bd832023-01-11 14:50:10 +01002486 /* Failure when checking if the extensions length can be read. */
2487 MBEDTLS_PUT_UINT24_BE(certificate_list_len - extensions_len - 1,
2488 p_certificate_list_len, 0);
2489 set_chk_buf_ptr_args(args, p_extensions_len,
2490 certificate_list + certificate_list_len - extensions_len - 1, 2);
2491 break;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002492
2493 case 7:
Gilles Peskine449bd832023-01-11 14:50:10 +01002494 /* Failure when checking if extensions data can be read. */
2495 MBEDTLS_PUT_UINT16_BE(extensions_len + 1, p_extensions_len, 0);
Ronald Crone7b9b6b2022-06-10 17:24:31 +02002496
Gilles Peskine449bd832023-01-11 14:50:10 +01002497 set_chk_buf_ptr_args(args, extensions,
2498 certificate_list + certificate_list_len, extensions_len + 1);
2499 break;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002500
2501 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01002502 return -1;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002503 }
2504
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 return 0;
Ronald Crone3dac4a2022-06-10 17:21:51 +02002506}
Ronald Crone7b9b6b2022-06-10 17:24:31 +02002507#endif /* MBEDTLS_TEST_HOOKS */
Valerio Setti4452e982022-12-01 15:08:35 +01002508
Valerio Setti4452e982022-12-01 15:08:35 +01002509#define ECJPAKE_TEST_PWD "bla"
Valerio Settie7518ba2022-12-02 12:09:43 +01002510
Gilles Peskine449bd832023-01-11 14:50:10 +01002511#if defined(MBEDTLS_USE_PSA_CRYPTO)
2512#define ECJPAKE_TEST_SET_PASSWORD(exp_ret_val) \
2513 ret = (use_opaque_arg) ? \
2514 mbedtls_ssl_set_hs_ecjpake_password_opaque(&ssl, pwd_slot) : \
2515 mbedtls_ssl_set_hs_ecjpake_password(&ssl, pwd_string, pwd_len); \
2516 TEST_EQUAL(ret, exp_ret_val)
Valerio Settie7518ba2022-12-02 12:09:43 +01002517#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002518#define ECJPAKE_TEST_SET_PASSWORD(exp_ret_val) \
2519 ret = mbedtls_ssl_set_hs_ecjpake_password(&ssl, \
2520 pwd_string, pwd_len); \
2521 TEST_EQUAL(ret, exp_ret_val)
Valerio Settie7518ba2022-12-02 12:09:43 +01002522#endif
Valerio Setti73260b62023-01-03 12:53:28 +01002523
Gilles Peskine449bd832023-01-11 14:50:10 +01002524#define TEST_AVAILABLE_ECC(tls_id_, group_id_, psa_family_, psa_bits_) \
2525 TEST_EQUAL(mbedtls_ssl_get_ecp_group_id_from_tls_id(tls_id_), \
2526 group_id_); \
2527 TEST_EQUAL(mbedtls_ssl_get_tls_id_from_ecp_group_id(group_id_), \
2528 tls_id_); \
2529 TEST_EQUAL(mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id_, \
2530 &psa_family, &psa_bits), PSA_SUCCESS); \
2531 TEST_EQUAL(psa_family_, psa_family); \
2532 TEST_EQUAL(psa_bits_, psa_bits);
Valerio Setti73260b62023-01-03 12:53:28 +01002533
Gilles Peskine449bd832023-01-11 14:50:10 +01002534#define TEST_UNAVAILABLE_ECC(tls_id_, group_id_, psa_family_, psa_bits_) \
2535 TEST_EQUAL(mbedtls_ssl_get_ecp_group_id_from_tls_id(tls_id_), \
2536 MBEDTLS_ECP_DP_NONE); \
2537 TEST_EQUAL(mbedtls_ssl_get_tls_id_from_ecp_group_id(group_id_), \
2538 0); \
2539 TEST_EQUAL(mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id_, \
2540 &psa_family, &psa_bits), \
2541 PSA_ERROR_NOT_SUPPORTED);
Valerio Setti73260b62023-01-03 12:53:28 +01002542
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002543/* END_HEADER */
2544
2545/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002546 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02002547 * END_DEPENDENCIES
2548 */
2549
Janos Follath6264e662019-11-26 11:11:15 +00002550/* BEGIN_CASE */
2551void test_callback_buffer_sanity()
2552{
2553 enum { MSGLEN = 10 };
2554 mbedtls_test_buffer buf;
2555 unsigned char input[MSGLEN];
2556 unsigned char output[MSGLEN];
2557
Gilles Peskine449bd832023-01-11 14:50:10 +01002558 memset(input, 0, sizeof(input));
Janos Follath6264e662019-11-26 11:11:15 +00002559
2560 /* Make sure calling put and get on NULL buffer results in error. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002561 TEST_ASSERT(mbedtls_test_buffer_put(NULL, input, sizeof(input))
2562 == -1);
2563 TEST_ASSERT(mbedtls_test_buffer_get(NULL, output, sizeof(output))
2564 == -1);
2565 TEST_ASSERT(mbedtls_test_buffer_put(NULL, NULL, sizeof(input)) == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -05002566
Gilles Peskine449bd832023-01-11 14:50:10 +01002567 TEST_ASSERT(mbedtls_test_buffer_put(NULL, NULL, 0) == -1);
2568 TEST_ASSERT(mbedtls_test_buffer_get(NULL, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +00002569
2570 /* Make sure calling put and get on a buffer that hasn't been set up results
Shaun Case8b0ecbc2021-12-20 21:14:10 -08002571 * in error. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002572 mbedtls_test_buffer_init(&buf);
Janos Follath6264e662019-11-26 11:11:15 +00002573
Gilles Peskine449bd832023-01-11 14:50:10 +01002574 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, sizeof(input)) == -1);
2575 TEST_ASSERT(mbedtls_test_buffer_get(&buf, output, sizeof(output))
2576 == -1);
2577 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, sizeof(input)) == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -05002578
Gilles Peskine449bd832023-01-11 14:50:10 +01002579 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, 0) == -1);
2580 TEST_ASSERT(mbedtls_test_buffer_get(&buf, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +00002581
Andrzej Kurekf7774142020-01-22 06:34:59 -05002582 /* Make sure calling put and get on NULL input only results in
2583 * error if the length is not zero, and that a NULL output is valid for data
2584 * dropping.
2585 */
Janos Follath6264e662019-11-26 11:11:15 +00002586
Gilles Peskine449bd832023-01-11 14:50:10 +01002587 TEST_ASSERT(mbedtls_test_buffer_setup(&buf, sizeof(input)) == 0);
Janos Follath6264e662019-11-26 11:11:15 +00002588
Gilles Peskine449bd832023-01-11 14:50:10 +01002589 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, sizeof(input)) == -1);
2590 TEST_ASSERT(mbedtls_test_buffer_get(&buf, NULL, sizeof(output))
2591 == 0);
2592 TEST_ASSERT(mbedtls_test_buffer_put(&buf, NULL, 0) == 0);
2593 TEST_ASSERT(mbedtls_test_buffer_get(&buf, NULL, 0) == 0);
Janos Follath6264e662019-11-26 11:11:15 +00002594
Piotr Nowickifb437d72020-01-13 16:59:12 +01002595 /* Make sure calling put several times in the row is safe */
2596
Gilles Peskine449bd832023-01-11 14:50:10 +01002597 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, sizeof(input))
2598 == sizeof(input));
2599 TEST_ASSERT(mbedtls_test_buffer_get(&buf, output, 2) == 2);
2600 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, 1) == 1);
2601 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, 2) == 1);
2602 TEST_ASSERT(mbedtls_test_buffer_put(&buf, input, 2) == 0);
Piotr Nowickifb437d72020-01-13 16:59:12 +01002603
2604
Janos Follath6264e662019-11-26 11:11:15 +00002605exit:
2606
Gilles Peskine449bd832023-01-11 14:50:10 +01002607 mbedtls_test_buffer_free(&buf);
Janos Follath6264e662019-11-26 11:11:15 +00002608}
2609/* END_CASE */
2610
2611/*
2612 * Test if the implementation of `mbedtls_test_buffer` related functions is
2613 * correct and works as expected.
2614 *
2615 * That is
2616 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
2617 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
2618 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
2619 * bytes.
2620 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
2621 * - All of the bytes we got match the bytes we put in in a FIFO manner.
2622 */
2623
2624/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002625void test_callback_buffer(int size, int put1, int put1_ret,
2626 int get1, int get1_ret, int put2, int put2_ret,
2627 int get2, int get2_ret)
Janos Follath6264e662019-11-26 11:11:15 +00002628{
2629 enum { ROUNDS = 2 };
2630 size_t put[ROUNDS];
2631 int put_ret[ROUNDS];
2632 size_t get[ROUNDS];
2633 int get_ret[ROUNDS];
2634 mbedtls_test_buffer buf;
Gilles Peskine449bd832023-01-11 14:50:10 +01002635 unsigned char *input = NULL;
Janos Follath6264e662019-11-26 11:11:15 +00002636 size_t input_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002637 unsigned char *output = NULL;
Janos Follath6264e662019-11-26 11:11:15 +00002638 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +00002639 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +00002640
Gilles Peskine449bd832023-01-11 14:50:10 +01002641 mbedtls_test_buffer_init(&buf);
2642 TEST_ASSERT(mbedtls_test_buffer_setup(&buf, size) == 0);
Janos Follath6264e662019-11-26 11:11:15 +00002643
2644 /* Check the sanity of input parameters and initialise local variables. That
2645 * is, ensure that the amount of data is not negative and that we are not
2646 * expecting more to put or get than we actually asked for. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002647 TEST_ASSERT(put1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002648 put[0] = put1;
2649 put_ret[0] = put1_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002650 TEST_ASSERT(put1_ret <= put1);
2651 TEST_ASSERT(put2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002652 put[1] = put2;
2653 put_ret[1] = put2_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002654 TEST_ASSERT(put2_ret <= put2);
Janos Follath6264e662019-11-26 11:11:15 +00002655
Gilles Peskine449bd832023-01-11 14:50:10 +01002656 TEST_ASSERT(get1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002657 get[0] = get1;
2658 get_ret[0] = get1_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002659 TEST_ASSERT(get1_ret <= get1);
2660 TEST_ASSERT(get2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +00002661 get[1] = get2;
2662 get_ret[1] = get2_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002663 TEST_ASSERT(get2_ret <= get2);
Janos Follath6264e662019-11-26 11:11:15 +00002664
2665 input_len = 0;
2666 /* Calculate actual input and output lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +01002667 for (j = 0; j < ROUNDS; j++) {
2668 if (put_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002669 input_len += put_ret[j];
2670 }
2671 }
2672 /* In order to always have a valid pointer we always allocate at least 1
2673 * byte. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002674 if (input_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002675 input_len = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002676 }
2677 ASSERT_ALLOC(input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +00002678
2679 output_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002680 for (j = 0; j < ROUNDS; j++) {
2681 if (get_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002682 output_len += get_ret[j];
2683 }
2684 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002685 TEST_ASSERT(output_len <= input_len);
Janos Follath6264e662019-11-26 11:11:15 +00002686 /* In order to always have a valid pointer we always allocate at least 1
2687 * byte. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002688 if (output_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +00002689 output_len = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002690 }
2691 ASSERT_ALLOC(output, output_len);
Janos Follath6264e662019-11-26 11:11:15 +00002692
2693 /* Fill up the buffer with structured data so that unwanted changes
2694 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01002695 for (i = 0; i < input_len; i++) {
Janos Follath6264e662019-11-26 11:11:15 +00002696 input[i] = i & 0xFF;
2697 }
2698
2699 written = read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002700 for (j = 0; j < ROUNDS; j++) {
2701 TEST_ASSERT(put_ret[j] == mbedtls_test_buffer_put(&buf,
2702 input + written, put[j]));
Janos Follath6264e662019-11-26 11:11:15 +00002703 written += put_ret[j];
Gilles Peskine449bd832023-01-11 14:50:10 +01002704 TEST_ASSERT(get_ret[j] == mbedtls_test_buffer_get(&buf,
2705 output + read, get[j]));
Janos Follath6264e662019-11-26 11:11:15 +00002706 read += get_ret[j];
Gilles Peskine449bd832023-01-11 14:50:10 +01002707 TEST_ASSERT(read <= written);
2708 if (get_ret[j] > 0) {
2709 TEST_ASSERT(memcmp(output + read - get_ret[j],
2710 input + read - get_ret[j], get_ret[j])
2711 == 0);
Janos Follath6264e662019-11-26 11:11:15 +00002712 }
2713 }
2714
2715exit:
2716
Gilles Peskine449bd832023-01-11 14:50:10 +01002717 mbedtls_free(input);
2718 mbedtls_free(output);
2719 mbedtls_test_buffer_free(&buf);
Janos Follath6264e662019-11-26 11:11:15 +00002720}
2721/* END_CASE */
2722
Janos Follath031827f2019-11-27 11:12:14 +00002723/*
Janos Follathc673c2c2019-12-02 15:47:26 +00002724 * Test if the implementation of `mbedtls_mock_socket` related I/O functions is
2725 * correct and works as expected on unconnected sockets.
2726 */
2727
2728/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002729void ssl_mock_sanity()
Janos Follathc673c2c2019-12-02 15:47:26 +00002730{
2731 enum { MSGLEN = 105 };
Paul Elliott21c8fe52021-11-24 16:54:26 +00002732 unsigned char message[MSGLEN] = { 0 };
2733 unsigned char received[MSGLEN] = { 0 };
Janos Follathc673c2c2019-12-02 15:47:26 +00002734 mbedtls_mock_socket socket;
2735
Gilles Peskine449bd832023-01-11 14:50:10 +01002736 mbedtls_mock_socket_init(&socket);
2737 TEST_ASSERT(mbedtls_mock_tcp_send_b(&socket, message, MSGLEN) < 0);
2738 mbedtls_mock_socket_close(&socket);
2739 mbedtls_mock_socket_init(&socket);
2740 TEST_ASSERT(mbedtls_mock_tcp_recv_b(&socket, received, MSGLEN) < 0);
2741 mbedtls_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +00002742
Gilles Peskine449bd832023-01-11 14:50:10 +01002743 mbedtls_mock_socket_init(&socket);
2744 TEST_ASSERT(mbedtls_mock_tcp_send_nb(&socket, message, MSGLEN) < 0);
2745 mbedtls_mock_socket_close(&socket);
2746 mbedtls_mock_socket_init(&socket);
2747 TEST_ASSERT(mbedtls_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0);
2748 mbedtls_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +00002749
2750exit:
2751
Gilles Peskine449bd832023-01-11 14:50:10 +01002752 mbedtls_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +00002753}
2754/* END_CASE */
2755
2756/*
2757 * Test if the implementation of `mbedtls_mock_socket` related functions can
2758 * send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +00002759 */
2760
2761/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002762void ssl_mock_tcp(int blocking)
Janos Follath031827f2019-11-27 11:12:14 +00002763{
Janos Follathc673c2c2019-12-02 15:47:26 +00002764 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002765 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +00002766 unsigned char message[MSGLEN];
2767 unsigned char received[MSGLEN];
2768 mbedtls_mock_socket client;
2769 mbedtls_mock_socket server;
2770 size_t written, read;
2771 int send_ret, recv_ret;
2772 mbedtls_ssl_send_t *send;
2773 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +00002774 unsigned i;
2775
Gilles Peskine449bd832023-01-11 14:50:10 +01002776 if (blocking == 0) {
Janos Follathc673c2c2019-12-02 15:47:26 +00002777 send = mbedtls_mock_tcp_send_nb;
2778 recv = mbedtls_mock_tcp_recv_nb;
Gilles Peskine449bd832023-01-11 14:50:10 +01002779 } else {
Janos Follathc673c2c2019-12-02 15:47:26 +00002780 send = mbedtls_mock_tcp_send_b;
2781 recv = mbedtls_mock_tcp_recv_b;
2782 }
2783
Gilles Peskine449bd832023-01-11 14:50:10 +01002784 mbedtls_mock_socket_init(&client);
2785 mbedtls_mock_socket_init(&server);
Janos Follathc673c2c2019-12-02 15:47:26 +00002786
2787 /* Fill up the buffer with structured data so that unwanted changes
2788 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01002789 for (i = 0; i < MSGLEN; i++) {
Janos Follathc673c2c2019-12-02 15:47:26 +00002790 message[i] = i & 0xFF;
2791 }
2792
2793 /* Make sure that sending a message takes a few iterations. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002794 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server, BUFLEN));
Janos Follathc673c2c2019-12-02 15:47:26 +00002795
2796 /* Send the message to the server */
2797 send_ret = recv_ret = 1;
2798 written = read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002799 while (send_ret != 0 || recv_ret != 0) {
2800 send_ret = send(&client, message + written, MSGLEN - written);
Janos Follathc673c2c2019-12-02 15:47:26 +00002801
Gilles Peskine449bd832023-01-11 14:50:10 +01002802 TEST_ASSERT(send_ret >= 0);
2803 TEST_ASSERT(send_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002804 written += send_ret;
2805
2806 /* If the buffer is full we can test blocking and non-blocking send */
Gilles Peskine449bd832023-01-11 14:50:10 +01002807 if (send_ret == BUFLEN) {
2808 int blocking_ret = send(&client, message, 1);
2809 if (blocking) {
2810 TEST_ASSERT(blocking_ret == 0);
2811 } else {
2812 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002813 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002814 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002815
Gilles Peskine449bd832023-01-11 14:50:10 +01002816 recv_ret = recv(&server, received + read, MSGLEN - read);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002817
2818 /* The result depends on whether any data was sent */
Gilles Peskine449bd832023-01-11 14:50:10 +01002819 if (send_ret > 0) {
2820 TEST_ASSERT(recv_ret > 0);
2821 TEST_ASSERT(recv_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002822 read += recv_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002823 } else if (blocking) {
2824 TEST_ASSERT(recv_ret == 0);
2825 } else {
2826 TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002827 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +00002828 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002829
2830 /* If the buffer is empty we can test blocking and non-blocking read */
Gilles Peskine449bd832023-01-11 14:50:10 +01002831 if (recv_ret == BUFLEN) {
2832 int blocking_ret = recv(&server, received, 1);
2833 if (blocking) {
2834 TEST_ASSERT(blocking_ret == 0);
2835 } else {
2836 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002837 }
2838 }
Janos Follathc673c2c2019-12-02 15:47:26 +00002839 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002840 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Janos Follathc673c2c2019-12-02 15:47:26 +00002841
2842exit:
2843
Gilles Peskine449bd832023-01-11 14:50:10 +01002844 mbedtls_mock_socket_close(&client);
2845 mbedtls_mock_socket_close(&server);
Janos Follathc673c2c2019-12-02 15:47:26 +00002846}
2847/* END_CASE */
2848
2849/*
2850 * Test if the implementation of `mbedtls_mock_socket` related functions can
2851 * send messages in both direction at the same time (with the I/O calls
2852 * interleaving).
2853 */
2854
2855/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002856void ssl_mock_tcp_interleaving(int blocking)
Janos Follathc673c2c2019-12-02 15:47:26 +00002857{
Janos Follath031827f2019-11-27 11:12:14 +00002858 enum { ROUNDS = 2 };
2859 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002860 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +00002861 unsigned char message[ROUNDS][MSGLEN];
2862 unsigned char received[ROUNDS][MSGLEN];
2863 mbedtls_mock_socket client;
2864 mbedtls_mock_socket server;
2865 size_t written[ROUNDS];
2866 size_t read[ROUNDS];
2867 int send_ret[ROUNDS];
2868 int recv_ret[ROUNDS];
2869 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +00002870 mbedtls_ssl_send_t *send;
2871 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +00002872
Gilles Peskine449bd832023-01-11 14:50:10 +01002873 if (blocking == 0) {
Janos Follath3766ba52019-11-27 13:31:42 +00002874 send = mbedtls_mock_tcp_send_nb;
2875 recv = mbedtls_mock_tcp_recv_nb;
Gilles Peskine449bd832023-01-11 14:50:10 +01002876 } else {
Janos Follath3766ba52019-11-27 13:31:42 +00002877 send = mbedtls_mock_tcp_send_b;
2878 recv = mbedtls_mock_tcp_recv_b;
2879 }
Janos Follath031827f2019-11-27 11:12:14 +00002880
Gilles Peskine449bd832023-01-11 14:50:10 +01002881 mbedtls_mock_socket_init(&client);
2882 mbedtls_mock_socket_init(&server);
Janos Follath031827f2019-11-27 11:12:14 +00002883
2884 /* Fill up the buffers with structured data so that unwanted changes
2885 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01002886 for (i = 0; i < ROUNDS; i++) {
2887 for (j = 0; j < MSGLEN; j++) {
2888 message[i][j] = (i * MSGLEN + j) & 0xFF;
Janos Follath031827f2019-11-27 11:12:14 +00002889 }
2890 }
2891
Janos Follath031827f2019-11-27 11:12:14 +00002892 /* Make sure that sending a message takes a few iterations. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002893 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server, BUFLEN));
Janos Follath031827f2019-11-27 11:12:14 +00002894
Janos Follath031827f2019-11-27 11:12:14 +00002895 /* Send the message from both sides, interleaving. */
2896 progress = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002897 for (i = 0; i < ROUNDS; i++) {
Janos Follath031827f2019-11-27 11:12:14 +00002898 written[i] = 0;
2899 read[i] = 0;
2900 }
2901 /* This loop does not stop as long as there was a successful write or read
2902 * of at least one byte on either side. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002903 while (progress != 0) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002904 mbedtls_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +00002905
Gilles Peskine449bd832023-01-11 14:50:10 +01002906 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002907 /* First sending is from the client */
Gilles Peskine449bd832023-01-11 14:50:10 +01002908 socket = (i % 2 == 0) ? (&client) : (&server);
Janos Follath031827f2019-11-27 11:12:14 +00002909
Gilles Peskine449bd832023-01-11 14:50:10 +01002910 send_ret[i] = send(socket, message[i] + written[i],
2911 MSGLEN - written[i]);
2912 TEST_ASSERT(send_ret[i] >= 0);
2913 TEST_ASSERT(send_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002914 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002915
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002916 /* If the buffer is full we can test blocking and non-blocking
2917 * send */
Gilles Peskine449bd832023-01-11 14:50:10 +01002918 if (send_ret[i] == BUFLEN) {
2919 int blocking_ret = send(socket, message[i], 1);
2920 if (blocking) {
2921 TEST_ASSERT(blocking_ret == 0);
2922 } else {
2923 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002924 }
2925 }
Janos Follath3766ba52019-11-27 13:31:42 +00002926 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002927
Gilles Peskine449bd832023-01-11 14:50:10 +01002928 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002929 /* First receiving is from the server */
Gilles Peskine449bd832023-01-11 14:50:10 +01002930 socket = (i % 2 == 0) ? (&server) : (&client);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002931
Gilles Peskine449bd832023-01-11 14:50:10 +01002932 recv_ret[i] = recv(socket, received[i] + read[i],
2933 MSGLEN - read[i]);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002934
2935 /* The result depends on whether any data was sent */
Gilles Peskine449bd832023-01-11 14:50:10 +01002936 if (send_ret[i] > 0) {
2937 TEST_ASSERT(recv_ret[i] > 0);
2938 TEST_ASSERT(recv_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002939 read[i] += recv_ret[i];
Gilles Peskine449bd832023-01-11 14:50:10 +01002940 } else if (blocking) {
2941 TEST_ASSERT(recv_ret[i] == 0);
2942 } else {
2943 TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002944 recv_ret[i] = 0;
2945 }
2946
2947 /* If the buffer is empty we can test blocking and non-blocking
2948 * read */
Gilles Peskine449bd832023-01-11 14:50:10 +01002949 if (recv_ret[i] == BUFLEN) {
2950 int blocking_ret = recv(socket, received[i], 1);
2951 if (blocking) {
2952 TEST_ASSERT(blocking_ret == 0);
2953 } else {
2954 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002955 }
2956 }
Janos Follath3766ba52019-11-27 13:31:42 +00002957 }
Janos Follath031827f2019-11-27 11:12:14 +00002958
2959 progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002960 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +01002961 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +00002962 }
2963 }
2964
Gilles Peskine449bd832023-01-11 14:50:10 +01002965 for (i = 0; i < ROUNDS; i++) {
2966 TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0);
2967 }
Janos Follath031827f2019-11-27 11:12:14 +00002968
2969exit:
2970
Gilles Peskine449bd832023-01-11 14:50:10 +01002971 mbedtls_mock_socket_close(&client);
2972 mbedtls_mock_socket_close(&server);
Janos Follath031827f2019-11-27 11:12:14 +00002973}
2974/* END_CASE */
2975
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002976/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002977void ssl_message_queue_sanity()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002978{
2979 mbedtls_test_message_queue queue;
2980
2981 /* Trying to push/pull to an empty queue */
Gilles Peskine449bd832023-01-11 14:50:10 +01002982 TEST_ASSERT(mbedtls_test_message_queue_push_info(NULL, 1)
2983 == MBEDTLS_TEST_ERROR_ARG_NULL);
2984 TEST_ASSERT(mbedtls_test_message_queue_pop_info(NULL, 1)
2985 == MBEDTLS_TEST_ERROR_ARG_NULL);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002986
Gilles Peskine449bd832023-01-11 14:50:10 +01002987 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
2988 TEST_ASSERT(queue.capacity == 3);
2989 TEST_ASSERT(queue.num == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002990
2991exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002992 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002993}
2994/* END_CASE */
2995
2996/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002997void ssl_message_queue_basic()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05002998{
2999 mbedtls_test_message_queue queue;
3000
Gilles Peskine449bd832023-01-11 14:50:10 +01003001 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003002
3003 /* Sanity test - 3 pushes and 3 pops with sufficient space */
Gilles Peskine449bd832023-01-11 14:50:10 +01003004 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
3005 TEST_ASSERT(queue.capacity == 3);
3006 TEST_ASSERT(queue.num == 1);
3007 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
3008 TEST_ASSERT(queue.capacity == 3);
3009 TEST_ASSERT(queue.num == 2);
3010 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 2) == 2);
3011 TEST_ASSERT(queue.capacity == 3);
3012 TEST_ASSERT(queue.num == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003013
Gilles Peskine449bd832023-01-11 14:50:10 +01003014 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
3015 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
3016 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003017
3018exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003019 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003020}
3021/* END_CASE */
3022
3023/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003024void ssl_message_queue_overflow_underflow()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003025{
3026 mbedtls_test_message_queue queue;
3027
Gilles Peskine449bd832023-01-11 14:50:10 +01003028 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003029
3030 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003031 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
3032 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
3033 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 2) == 2);
3034 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 3)
3035 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003036
Gilles Peskine449bd832023-01-11 14:50:10 +01003037 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
3038 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
3039 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003040
Gilles Peskine449bd832023-01-11 14:50:10 +01003041 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1)
3042 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003043
3044exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003045 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003046}
3047/* END_CASE */
3048
3049/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003050void ssl_message_queue_interleaved()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003051{
3052 mbedtls_test_message_queue queue;
3053
Gilles Peskine449bd832023-01-11 14:50:10 +01003054 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003055
3056 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
3057 * (to wrap around the buffer) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003058 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
3059 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003060
Gilles Peskine449bd832023-01-11 14:50:10 +01003061 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003062
Gilles Peskine449bd832023-01-11 14:50:10 +01003063 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 2) == 2);
3064 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003065
Gilles Peskine449bd832023-01-11 14:50:10 +01003066 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 1) == 1);
3067 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003068
Gilles Peskine449bd832023-01-11 14:50:10 +01003069 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 5) == 5);
3070 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003071
Gilles Peskine449bd832023-01-11 14:50:10 +01003072 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003073
Gilles Peskine449bd832023-01-11 14:50:10 +01003074 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 5) == 5);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003075
Gilles Peskine449bd832023-01-11 14:50:10 +01003076 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003077
3078exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003079 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003080}
3081/* END_CASE */
3082
3083/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003084void ssl_message_queue_insufficient_buffer()
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003085{
3086 mbedtls_test_message_queue queue;
3087 size_t message_len = 10;
3088 size_t buffer_len = 5;
3089
Gilles Peskine449bd832023-01-11 14:50:10 +01003090 TEST_ASSERT(mbedtls_test_message_queue_setup(&queue, 1) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003091
3092 /* Popping without a sufficient buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01003093 TEST_ASSERT(mbedtls_test_message_queue_push_info(&queue, message_len)
3094 == (int) message_len);
3095 TEST_ASSERT(mbedtls_test_message_queue_pop_info(&queue, buffer_len)
3096 == (int) buffer_len);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003097exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01003098 mbedtls_test_message_queue_free(&queue);
Andrzej Kurek13719cd2020-01-22 06:36:39 -05003099}
3100/* END_CASE */
3101
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003102/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003103void ssl_message_mock_uninitialized()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003104{
3105 enum { MSGLEN = 10 };
Gilles Peskine449bd832023-01-11 14:50:10 +01003106 unsigned char message[MSGLEN] = { 0 }, received[MSGLEN];
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003107 mbedtls_mock_socket client, server;
3108 mbedtls_test_message_queue server_queue, client_queue;
3109 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003110 mbedtls_message_socket_init(&server_context);
3111 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003112
3113 /* Send with a NULL context */
Gilles Peskine449bd832023-01-11 14:50:10 +01003114 TEST_ASSERT(mbedtls_mock_tcp_send_msg(NULL, message, MSGLEN)
3115 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003116
Gilles Peskine449bd832023-01-11 14:50:10 +01003117 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(NULL, message, MSGLEN)
3118 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003119
Gilles Peskine449bd832023-01-11 14:50:10 +01003120 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 1,
3121 &server,
3122 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003123
Gilles Peskine449bd832023-01-11 14:50:10 +01003124 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 1,
3125 &client,
3126 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003127
Gilles Peskine449bd832023-01-11 14:50:10 +01003128 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message, MSGLEN)
3129 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003130
Gilles Peskine449bd832023-01-11 14:50:10 +01003131 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3132 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003133
3134 /* Push directly to a queue to later simulate a disconnected behavior */
Gilles Peskine449bd832023-01-11 14:50:10 +01003135 TEST_ASSERT(mbedtls_test_message_queue_push_info(&server_queue, MSGLEN)
3136 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003137
3138 /* Test if there's an error when trying to read from a disconnected
3139 * socket */
Gilles Peskine449bd832023-01-11 14:50:10 +01003140 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3141 == MBEDTLS_TEST_ERROR_RECV_FAILED);
3142exit:
3143 mbedtls_message_socket_close(&server_context);
3144 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003145}
3146/* END_CASE */
3147
3148/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003149void ssl_message_mock_basic()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003150{
3151 enum { MSGLEN = 10 };
3152 unsigned char message[MSGLEN], received[MSGLEN];
3153 mbedtls_mock_socket client, server;
3154 unsigned i;
3155 mbedtls_test_message_queue server_queue, client_queue;
3156 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003157 mbedtls_message_socket_init(&server_context);
3158 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003159
Gilles Peskine449bd832023-01-11 14:50:10 +01003160 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 1,
3161 &server,
3162 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003163
Gilles Peskine449bd832023-01-11 14:50:10 +01003164 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 1,
3165 &client,
3166 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003167
3168 /* Fill up the buffer with structured data so that unwanted changes
3169 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01003170 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003171 message[i] = i & 0xFF;
3172 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003173 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
3174 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003175
3176 /* Send the message to the server */
Gilles Peskine449bd832023-01-11 14:50:10 +01003177 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3178 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003179
3180 /* Read from the server */
Gilles Peskine449bd832023-01-11 14:50:10 +01003181 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3182 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003183
Gilles Peskine449bd832023-01-11 14:50:10 +01003184 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
3185 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003186
3187 /* Send the message to the client */
Gilles Peskine449bd832023-01-11 14:50:10 +01003188 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&server_context, message,
3189 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003190
3191 /* Read from the client */
Gilles Peskine449bd832023-01-11 14:50:10 +01003192 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received, MSGLEN)
3193 == MSGLEN);
3194 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003195
Gilles Peskine449bd832023-01-11 14:50:10 +01003196exit:
3197 mbedtls_message_socket_close(&server_context);
3198 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003199}
3200/* END_CASE */
3201
3202/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003203void ssl_message_mock_queue_overflow_underflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003204{
3205 enum { MSGLEN = 10 };
3206 unsigned char message[MSGLEN], received[MSGLEN];
3207 mbedtls_mock_socket client, server;
3208 unsigned i;
3209 mbedtls_test_message_queue server_queue, client_queue;
3210 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003211 mbedtls_message_socket_init(&server_context);
3212 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003213
Gilles Peskine449bd832023-01-11 14:50:10 +01003214 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 2,
3215 &server,
3216 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003217
Gilles Peskine449bd832023-01-11 14:50:10 +01003218 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 2,
3219 &client,
3220 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003221
3222 /* Fill up the buffer with structured data so that unwanted changes
3223 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01003224 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003225 message[i] = i & 0xFF;
3226 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003227 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
3228 MSGLEN*2));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003229
3230 /* Send three message to the server, last one with an error */
Gilles Peskine449bd832023-01-11 14:50:10 +01003231 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3232 MSGLEN - 1) == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003233
Gilles Peskine449bd832023-01-11 14:50:10 +01003234 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3235 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003236
Gilles Peskine449bd832023-01-11 14:50:10 +01003237 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3238 MSGLEN)
3239 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003240
3241 /* Read three messages from the server, last one with an error */
Gilles Peskine449bd832023-01-11 14:50:10 +01003242 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
3243 MSGLEN - 1) == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003244
Gilles Peskine449bd832023-01-11 14:50:10 +01003245 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3246 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003247
Gilles Peskine449bd832023-01-11 14:50:10 +01003248 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003249
Gilles Peskine449bd832023-01-11 14:50:10 +01003250 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3251 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003252
Gilles Peskine449bd832023-01-11 14:50:10 +01003253exit:
3254 mbedtls_message_socket_close(&server_context);
3255 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003256}
3257/* END_CASE */
3258
3259/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003260void ssl_message_mock_socket_overflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003261{
3262 enum { MSGLEN = 10 };
3263 unsigned char message[MSGLEN], received[MSGLEN];
3264 mbedtls_mock_socket client, server;
3265 unsigned i;
3266 mbedtls_test_message_queue server_queue, client_queue;
3267 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003268 mbedtls_message_socket_init(&server_context);
3269 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003270
Gilles Peskine449bd832023-01-11 14:50:10 +01003271 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 2,
3272 &server,
3273 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003274
Gilles Peskine449bd832023-01-11 14:50:10 +01003275 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 2,
3276 &client,
3277 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003278
3279 /* Fill up the buffer with structured data so that unwanted changes
3280 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01003281 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003282 message[i] = i & 0xFF;
3283 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003284 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
3285 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003286
3287 /* Send two message to the server, second one with an error */
Gilles Peskine449bd832023-01-11 14:50:10 +01003288 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3289 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003290
Gilles Peskine449bd832023-01-11 14:50:10 +01003291 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3292 MSGLEN)
3293 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003294
3295 /* Read the only message from the server */
Gilles Peskine449bd832023-01-11 14:50:10 +01003296 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3297 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003298
Gilles Peskine449bd832023-01-11 14:50:10 +01003299 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003300
Gilles Peskine449bd832023-01-11 14:50:10 +01003301exit:
3302 mbedtls_message_socket_close(&server_context);
3303 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003304}
3305/* END_CASE */
3306
3307/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003308void ssl_message_mock_truncated()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003309{
3310 enum { MSGLEN = 10 };
3311 unsigned char message[MSGLEN], received[MSGLEN];
3312 mbedtls_mock_socket client, server;
3313 unsigned i;
3314 mbedtls_test_message_queue server_queue, client_queue;
3315 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003316 mbedtls_message_socket_init(&server_context);
3317 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003318
Gilles Peskine449bd832023-01-11 14:50:10 +01003319 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 2,
3320 &server,
3321 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003322
Gilles Peskine449bd832023-01-11 14:50:10 +01003323 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 2,
3324 &client,
3325 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003326
Gilles Peskine449bd832023-01-11 14:50:10 +01003327 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003328 /* Fill up the buffer with structured data so that unwanted changes
3329 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01003330 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003331 message[i] = i & 0xFF;
3332 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003333 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
3334 2 * MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003335
3336 /* Send two messages to the server, the second one small enough to fit in the
3337 * receiver's buffer. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003338 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3339 MSGLEN) == MSGLEN);
3340 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3341 MSGLEN / 2) == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003342 /* Read a truncated message from the server */
Gilles Peskine449bd832023-01-11 14:50:10 +01003343 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN/2)
3344 == MSGLEN/2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003345
3346 /* Test that the first half of the message is valid, and second one isn't */
Gilles Peskine449bd832023-01-11 14:50:10 +01003347 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
3348 TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2)
3349 != 0);
3350 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003351
3352 /* Read a full message from the server */
Gilles Peskine449bd832023-01-11 14:50:10 +01003353 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN/2)
3354 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003355
3356 /* Test that the first half of the message is valid */
Gilles Peskine449bd832023-01-11 14:50:10 +01003357 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003358
Gilles Peskine449bd832023-01-11 14:50:10 +01003359exit:
3360 mbedtls_message_socket_close(&server_context);
3361 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003362}
3363/* END_CASE */
3364
3365/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003366void ssl_message_mock_socket_read_error()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003367{
3368 enum { MSGLEN = 10 };
3369 unsigned char message[MSGLEN], received[MSGLEN];
3370 mbedtls_mock_socket client, server;
3371 unsigned i;
3372 mbedtls_test_message_queue server_queue, client_queue;
3373 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003374 mbedtls_message_socket_init(&server_context);
3375 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003376
Gilles Peskine449bd832023-01-11 14:50:10 +01003377 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 1,
3378 &server,
3379 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003380
Gilles Peskine449bd832023-01-11 14:50:10 +01003381 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 1,
3382 &client,
3383 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003384
3385 /* Fill up the buffer with structured data so that unwanted changes
3386 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01003387 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003388 message[i] = i & 0xFF;
3389 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003390 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
3391 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003392
Gilles Peskine449bd832023-01-11 14:50:10 +01003393 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3394 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003395
3396 /* Force a read error by disconnecting the socket by hand */
3397 server.status = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003398 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3399 == MBEDTLS_TEST_ERROR_RECV_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003400 /* Return to a valid state */
3401 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
3402
Gilles Peskine449bd832023-01-11 14:50:10 +01003403 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003404
3405 /* Test that even though the server tried to read once disconnected, the
3406 * continuity is preserved */
Gilles Peskine449bd832023-01-11 14:50:10 +01003407 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3408 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003409
Gilles Peskine449bd832023-01-11 14:50:10 +01003410 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003411
Gilles Peskine449bd832023-01-11 14:50:10 +01003412exit:
3413 mbedtls_message_socket_close(&server_context);
3414 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003415}
3416/* END_CASE */
3417
3418/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003419void ssl_message_mock_interleaved_one_way()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003420{
3421 enum { MSGLEN = 10 };
3422 unsigned char message[MSGLEN], received[MSGLEN];
3423 mbedtls_mock_socket client, server;
3424 unsigned i;
3425 mbedtls_test_message_queue server_queue, client_queue;
3426 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003427 mbedtls_message_socket_init(&server_context);
3428 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003429
Gilles Peskine449bd832023-01-11 14:50:10 +01003430 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 3,
3431 &server,
3432 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003433
Gilles Peskine449bd832023-01-11 14:50:10 +01003434 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 3,
3435 &client,
3436 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003437
3438 /* Fill up the buffer with structured data so that unwanted changes
3439 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01003440 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003441 message[i] = i & 0xFF;
3442 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003443 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
3444 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003445
3446 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
3447 * (to wrap around the buffer) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003448 for (i = 0; i < 2; i++) {
3449 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3450 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003451
Gilles Peskine449bd832023-01-11 14:50:10 +01003452 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3453 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003454
Gilles Peskine449bd832023-01-11 14:50:10 +01003455 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
3456 MSGLEN) == MSGLEN);
3457 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
3458 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003459 }
3460
Gilles Peskine449bd832023-01-11 14:50:10 +01003461 for (i = 0; i < 2; i++) {
3462 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
3463 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003464
Gilles Peskine449bd832023-01-11 14:50:10 +01003465 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003466 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003467 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3468 == MBEDTLS_ERR_SSL_WANT_READ);
3469exit:
3470 mbedtls_message_socket_close(&server_context);
3471 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003472}
3473/* END_CASE */
3474
3475/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003476void ssl_message_mock_interleaved_two_ways()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003477{
3478 enum { MSGLEN = 10 };
3479 unsigned char message[MSGLEN], received[MSGLEN];
3480 mbedtls_mock_socket client, server;
3481 unsigned i;
3482 mbedtls_test_message_queue server_queue, client_queue;
3483 mbedtls_test_message_socket_context server_context, client_context;
Gilles Peskine449bd832023-01-11 14:50:10 +01003484 mbedtls_message_socket_init(&server_context);
3485 mbedtls_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003486
Gilles Peskine449bd832023-01-11 14:50:10 +01003487 TEST_ASSERT(mbedtls_message_socket_setup(&server_queue, &client_queue, 3,
3488 &server,
3489 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003490
Gilles Peskine449bd832023-01-11 14:50:10 +01003491 TEST_ASSERT(mbedtls_message_socket_setup(&client_queue, &server_queue, 3,
3492 &client,
3493 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003494
3495 /* Fill up the buffer with structured data so that unwanted changes
3496 * can be detected */
Gilles Peskine449bd832023-01-11 14:50:10 +01003497 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003498 message[i] = i & 0xFF;
3499 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003500 TEST_ASSERT(0 == mbedtls_mock_socket_connect(&client, &server,
3501 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003502
3503 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
3504 * (to wrap around the buffer) both ways. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003505 for (i = 0; i < 2; i++) {
3506 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3507 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003508
Gilles Peskine449bd832023-01-11 14:50:10 +01003509 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&client_context, message,
3510 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003511
Gilles Peskine449bd832023-01-11 14:50:10 +01003512 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&server_context, message,
3513 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003514
Gilles Peskine449bd832023-01-11 14:50:10 +01003515 TEST_ASSERT(mbedtls_mock_tcp_send_msg(&server_context, message,
3516 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003517
Gilles Peskine449bd832023-01-11 14:50:10 +01003518 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
3519 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003520
Gilles Peskine449bd832023-01-11 14:50:10 +01003521 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003522
Gilles Peskine449bd832023-01-11 14:50:10 +01003523 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003524
Gilles Peskine449bd832023-01-11 14:50:10 +01003525 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received,
3526 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003527
Gilles Peskine449bd832023-01-11 14:50:10 +01003528 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003529
Gilles Peskine449bd832023-01-11 14:50:10 +01003530 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003531 }
3532
Gilles Peskine449bd832023-01-11 14:50:10 +01003533 for (i = 0; i < 2; i++) {
3534 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received,
3535 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003536
Gilles Peskine449bd832023-01-11 14:50:10 +01003537 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
3538 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003539
Gilles Peskine449bd832023-01-11 14:50:10 +01003540 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received,
3541 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003542
Gilles Peskine449bd832023-01-11 14:50:10 +01003543 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
3544 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003545 }
3546
Gilles Peskine449bd832023-01-11 14:50:10 +01003547 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&server_context, received, MSGLEN)
3548 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003549
Gilles Peskine449bd832023-01-11 14:50:10 +01003550 TEST_ASSERT(mbedtls_mock_tcp_recv_msg(&client_context, received, MSGLEN)
3551 == MBEDTLS_ERR_SSL_WANT_READ);
3552exit:
3553 mbedtls_message_socket_close(&server_context);
3554 mbedtls_message_socket_close(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05003555}
3556/* END_CASE */
3557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003558/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Gilles Peskine449bd832023-01-11 14:50:10 +01003559void ssl_dtls_replay(data_t *prevs, data_t *new, int ret)
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003560{
Azim Khand30ca132017-06-09 04:32:58 +01003561 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003562 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003563 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003564
Gilles Peskine449bd832023-01-11 14:50:10 +01003565 mbedtls_ssl_init(&ssl);
3566 mbedtls_ssl_config_init(&conf);
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02003567
Gilles Peskine449bd832023-01-11 14:50:10 +01003568 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
3569 MBEDTLS_SSL_IS_CLIENT,
3570 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
3571 MBEDTLS_SSL_PRESET_DEFAULT) == 0);
3572 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003573
3574 /* Read previous record numbers */
Gilles Peskine449bd832023-01-11 14:50:10 +01003575 for (len = 0; len < prevs->len; len += 6) {
3576 memcpy(ssl.in_ctr + 2, prevs->x + len, 6);
3577 mbedtls_ssl_dtls_replay_update(&ssl);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003578 }
3579
3580 /* Check new number */
Gilles Peskine449bd832023-01-11 14:50:10 +01003581 memcpy(ssl.in_ctr + 2, new->x, 6);
3582 TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003583
Gilles Peskine449bd832023-01-11 14:50:10 +01003584 mbedtls_ssl_free(&ssl);
3585 mbedtls_ssl_config_free(&conf);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003586}
3587/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01003588
Ronald Crone68ab4f2022-10-05 12:46:29 +02003589/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01003590void ssl_set_hostname_twice(char *hostname0, char *hostname1)
Hanno Beckerb25c0c72017-05-05 11:24:30 +01003591{
3592 mbedtls_ssl_context ssl;
Gilles Peskine449bd832023-01-11 14:50:10 +01003593 mbedtls_ssl_init(&ssl);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01003594
Gilles Peskine449bd832023-01-11 14:50:10 +01003595 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname0) == 0);
3596 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname1) == 0);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01003597
Gilles Peskine449bd832023-01-11 14:50:10 +01003598 mbedtls_ssl_free(&ssl);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01003599}
Darryl Green11999bb2018-03-13 15:22:58 +00003600/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00003601
3602/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003603void ssl_crypt_record(int cipher_type, int hash_id,
3604 int etm, int tag_mode, int ver,
3605 int cid0_len, int cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00003606{
3607 /*
3608 * Test several record encryptions and decryptions
3609 * with plenty of space before and after the data
3610 * within the record buffer.
3611 */
3612
3613 int ret;
3614 int num_records = 16;
3615 mbedtls_ssl_context ssl; /* ONLY for debugging */
3616
3617 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00003618 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00003619 size_t const buflen = 512;
3620 mbedtls_record rec, rec_backup;
3621
Gilles Peskine449bd832023-01-11 14:50:10 +01003622 USE_PSA_INIT();
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003623
Gilles Peskine449bd832023-01-11 14:50:10 +01003624 mbedtls_ssl_init(&ssl);
3625 mbedtls_ssl_transform_init(&t0);
3626 mbedtls_ssl_transform_init(&t1);
3627 ret = build_transforms(&t0, &t1, cipher_type, hash_id,
3628 etm, tag_mode, ver,
3629 (size_t) cid0_len,
3630 (size_t) cid1_len);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003631
Gilles Peskine449bd832023-01-11 14:50:10 +01003632 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00003633
Gilles Peskine449bd832023-01-11 14:50:10 +01003634 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckera18d1322018-01-03 14:27:32 +00003635
Gilles Peskine449bd832023-01-11 14:50:10 +01003636 while (num_records-- > 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00003637 mbedtls_ssl_transform *t_dec, *t_enc;
3638 /* Take turns in who's sending and who's receiving. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003639 if (num_records % 3 == 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00003640 t_dec = &t0;
3641 t_enc = &t1;
Gilles Peskine449bd832023-01-11 14:50:10 +01003642 } else {
Hanno Beckera18d1322018-01-03 14:27:32 +00003643 t_dec = &t1;
3644 t_enc = &t0;
3645 }
3646
3647 /*
3648 * The record header affects the transformation in two ways:
3649 * 1) It determines the AEAD additional data
3650 * 2) The record counter sometimes determines the IV.
3651 *
3652 * Apart from that, the fields don't have influence.
3653 * In particular, it is currently not the responsibility
3654 * of ssl_encrypt/decrypt_buf to check if the transform
3655 * version matches the record version, or that the
3656 * type is sensible.
3657 */
3658
Gilles Peskine449bd832023-01-11 14:50:10 +01003659 memset(rec.ctr, num_records, sizeof(rec.ctr));
Hanno Beckera18d1322018-01-03 14:27:32 +00003660 rec.type = 42;
3661 rec.ver[0] = num_records;
3662 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003663#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003664 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003665#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00003666
3667 rec.buf = buf;
3668 rec.buf_len = buflen;
3669 rec.data_offset = 16;
3670 /* Make sure to vary the length to exercise different
3671 * paddings. */
3672 rec.data_len = 1 + num_records;
3673
Gilles Peskine449bd832023-01-11 14:50:10 +01003674 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckera18d1322018-01-03 14:27:32 +00003675
3676 /* Make a copy for later comparison */
3677 rec_backup = rec;
3678
3679 /* Encrypt record */
Gilles Peskine449bd832023-01-11 14:50:10 +01003680 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
3681 mbedtls_test_rnd_std_rand, NULL);
3682 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
3683 if (ret != 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00003684 continue;
3685 }
3686
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003687#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01003688 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003689 /* DTLS 1.2 + CID hides the real content type and
3690 * uses a special CID content type in the protected
3691 * record. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003692 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003693 }
3694#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3695
Ronald Cron6f135e12021-12-08 16:57:54 +01003696#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01003697 if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003698 /* TLS 1.3 hides the real content type and
3699 * always uses Application Data as the content type
3700 * for protected records. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003701 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003702 }
Ronald Cron6f135e12021-12-08 16:57:54 +01003703#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003704
Hanno Beckera18d1322018-01-03 14:27:32 +00003705 /* Decrypt record with t_dec */
Gilles Peskine449bd832023-01-11 14:50:10 +01003706 ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec);
3707 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00003708
3709 /* Compare results */
Gilles Peskine449bd832023-01-11 14:50:10 +01003710 TEST_ASSERT(rec.type == rec_backup.type);
3711 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
3712 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
3713 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
3714 TEST_ASSERT(rec.data_len == rec_backup.data_len);
3715 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
3716 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
3717 rec_backup.buf + rec_backup.data_offset,
3718 rec.data_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00003719 }
3720
Hanno Becker81e16a32019-03-01 11:21:44 +00003721exit:
3722
Hanno Beckera18d1322018-01-03 14:27:32 +00003723 /* Cleanup */
Gilles Peskine449bd832023-01-11 14:50:10 +01003724 mbedtls_ssl_free(&ssl);
3725 mbedtls_ssl_transform_free(&t0);
3726 mbedtls_ssl_transform_free(&t1);
Hanno Beckera18d1322018-01-03 14:27:32 +00003727
Gilles Peskine449bd832023-01-11 14:50:10 +01003728 mbedtls_free(buf);
3729 USE_PSA_DONE();
Hanno Beckera18d1322018-01-03 14:27:32 +00003730}
3731/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003732
3733/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003734void ssl_crypt_record_small(int cipher_type, int hash_id,
3735 int etm, int tag_mode, int ver,
3736 int cid0_len, int cid1_len)
Hanno Beckerb3268da2018-01-05 15:20:24 +00003737{
3738 /*
3739 * Test pairs of encryption and decryption with an increasing
3740 * amount of space in the record buffer - in more detail:
3741 * 1) Try to encrypt with 0, 1, 2, ... bytes available
3742 * in front of the plaintext, and expect the encryption
3743 * to succeed starting from some offset. Always keep
3744 * enough space in the end of the buffer.
3745 * 2) Try to encrypt with 0, 1, 2, ... bytes available
3746 * at the end of the plaintext, and expect the encryption
3747 * to succeed starting from some offset. Always keep
3748 * enough space at the beginning of the buffer.
3749 * 3) Try to encrypt with 0, 1, 2, ... bytes available
3750 * both at the front and end of the plaintext,
3751 * and expect the encryption to succeed starting from
3752 * some offset.
3753 *
3754 * If encryption succeeds, check that decryption succeeds
3755 * and yields the original record.
3756 */
3757
3758 mbedtls_ssl_context ssl; /* ONLY for debugging */
3759
3760 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00003761 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01003762 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003763 mbedtls_record rec, rec_backup;
3764
3765 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01003766 int mode; /* Mode 1, 2 or 3 as explained above */
3767 size_t offset; /* Available space at beginning/end/both */
3768 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003769
Hanno Beckerd856c822019-04-29 17:30:59 +01003770 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
3771 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003772
3773 int seen_success; /* Indicates if in the current mode we've
3774 * already seen a successful test. */
3775
Gilles Peskine449bd832023-01-11 14:50:10 +01003776 USE_PSA_INIT();
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003777
Gilles Peskine449bd832023-01-11 14:50:10 +01003778 mbedtls_ssl_init(&ssl);
3779 mbedtls_ssl_transform_init(&t0);
3780 mbedtls_ssl_transform_init(&t1);
3781 ret = build_transforms(&t0, &t1, cipher_type, hash_id,
3782 etm, tag_mode, ver,
3783 (size_t) cid0_len,
3784 (size_t) cid1_len);
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003785
Gilles Peskine449bd832023-01-11 14:50:10 +01003786 TEST_ASSERT(ret == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003787
Gilles Peskine449bd832023-01-11 14:50:10 +01003788 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003789
Gilles Peskine449bd832023-01-11 14:50:10 +01003790 for (mode = 1; mode <= 3; mode++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003791 seen_success = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003792 for (offset = 0; offset <= threshold; offset++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003793 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01003794 t_dec = &t0;
3795 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00003796
Gilles Peskine449bd832023-01-11 14:50:10 +01003797 memset(rec.ctr, offset, sizeof(rec.ctr));
Hanno Beckerb3268da2018-01-05 15:20:24 +00003798 rec.type = 42;
3799 rec.ver[0] = offset;
3800 rec.ver[1] = offset;
3801 rec.buf = buf;
3802 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003803#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01003804 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01003805#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00003806
Gilles Peskine449bd832023-01-11 14:50:10 +01003807 switch (mode) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003808 case 1: /* Space in the beginning */
3809 rec.data_offset = offset;
3810 rec.data_len = buflen - offset - default_post_padding;
3811 break;
3812
3813 case 2: /* Space in the end */
3814 rec.data_offset = default_pre_padding;
3815 rec.data_len = buflen - default_pre_padding - offset;
3816 break;
3817
3818 case 3: /* Space in the beginning and end */
3819 rec.data_offset = offset;
3820 rec.data_len = buflen - 2 * offset;
3821 break;
3822
3823 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003824 TEST_ASSERT(0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003825 break;
3826 }
3827
Gilles Peskine449bd832023-01-11 14:50:10 +01003828 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003829
3830 /* Make a copy for later comparison */
3831 rec_backup = rec;
3832
3833 /* Encrypt record */
Gilles Peskine449bd832023-01-11 14:50:10 +01003834 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
3835 mbedtls_test_rnd_std_rand, NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003836
Gilles Peskine449bd832023-01-11 14:50:10 +01003837 if ((mode == 1 || mode == 2) && seen_success) {
3838 TEST_ASSERT(ret == 0);
3839 } else {
3840 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
3841 if (ret == 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003842 seen_success = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01003843 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00003844 }
3845
Gilles Peskine449bd832023-01-11 14:50:10 +01003846 if (ret != 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00003847 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01003848 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00003849
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003850#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01003851 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003852 /* DTLS 1.2 + CID hides the real content type and
3853 * uses a special CID content type in the protected
3854 * record. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003855 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003856 }
3857#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3858
Ronald Cron6f135e12021-12-08 16:57:54 +01003859#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01003860 if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003861 /* TLS 1.3 hides the real content type and
3862 * always uses Application Data as the content type
3863 * for protected records. Double-check this. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003864 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003865 }
Ronald Cron6f135e12021-12-08 16:57:54 +01003866#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb2713ab2020-05-07 14:54:22 +01003867
Hanno Beckerb3268da2018-01-05 15:20:24 +00003868 /* Decrypt record with t_dec */
Gilles Peskine449bd832023-01-11 14:50:10 +01003869 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003870
3871 /* Compare results */
Gilles Peskine449bd832023-01-11 14:50:10 +01003872 TEST_ASSERT(rec.type == rec_backup.type);
3873 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
3874 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
3875 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
3876 TEST_ASSERT(rec.data_len == rec_backup.data_len);
3877 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
3878 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
3879 rec_backup.buf + rec_backup.data_offset,
3880 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003881 }
3882
Gilles Peskine449bd832023-01-11 14:50:10 +01003883 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003884 }
3885
Hanno Becker81e16a32019-03-01 11:21:44 +00003886exit:
3887
Hanno Beckerb3268da2018-01-05 15:20:24 +00003888 /* Cleanup */
Gilles Peskine449bd832023-01-11 14:50:10 +01003889 mbedtls_ssl_free(&ssl);
3890 mbedtls_ssl_transform_free(&t0);
3891 mbedtls_ssl_transform_free(&t1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00003892
Gilles Peskine449bd832023-01-11 14:50:10 +01003893 mbedtls_free(buf);
3894 USE_PSA_DONE();
Hanno Beckerb3268da2018-01-05 15:20:24 +00003895}
3896/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03003897
Przemyslaw Stekielf4facef2022-02-02 21:31:04 +01003898/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_AES_C:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003899void ssl_decrypt_non_etm_cbc(int cipher_type, int hash_id, int trunc_hmac,
3900 int length_selector)
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003901{
3902 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003903 * Test record decryption for CBC without EtM, focused on the verification
3904 * of padding and MAC.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003905 *
TRodziewicz299510e2021-07-09 16:55:11 +02003906 * Actually depends on TLS 1.2 and either AES, ARIA or Camellia, but since
3907 * the test framework doesn't support alternation in dependency statements,
3908 * just depend on AES.
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003909 *
3910 * The length_selector argument is interpreted as follows:
3911 * - if it's -1, the plaintext length is 0 and minimal padding is applied
3912 * - if it's -2, the plaintext length is 0 and maximal padding is applied
3913 * - otherwise it must be in [0, 255] and is padding_length from RFC 5246:
3914 * it's the length of the rest of the padding, that is, excluding the
3915 * byte that encodes the length. The minimal non-zero plaintext length
3916 * that gives this padding_length is automatically selected.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003917 */
3918 mbedtls_ssl_context ssl; /* ONLY for debugging */
3919 mbedtls_ssl_transform t0, t1;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003920 mbedtls_record rec, rec_save;
3921 unsigned char *buf = NULL, *buf_save = NULL;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003922 size_t buflen, olen = 0;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003923 size_t plaintext_len, block_size, i;
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003924 unsigned char padlen; /* excluding the padding_length byte */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003925 unsigned char add_data[13];
Neil Armstrongcf8841a2022-02-24 11:17:45 +01003926#if defined(MBEDTLS_USE_PSA_CRYPTO)
3927 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
3928 size_t sign_mac_length = 0;
Andrzej Kurek8c95ac42022-08-17 16:17:00 -04003929 unsigned char mac[PSA_HASH_MAX_SIZE];
3930#else
3931 unsigned char mac[MBEDTLS_MD_MAX_SIZE];
Neil Armstrongcf8841a2022-02-24 11:17:45 +01003932#endif
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003933 int exp_ret;
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003934 int ret;
Manuel Pégourié-Gonnard4adc04a2020-07-16 10:00:48 +02003935 const unsigned char pad_max_len = 255; /* Per the standard */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003936
Gilles Peskine449bd832023-01-11 14:50:10 +01003937 USE_PSA_INIT();
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01003938
Gilles Peskine449bd832023-01-11 14:50:10 +01003939 mbedtls_ssl_init(&ssl);
3940 mbedtls_ssl_transform_init(&t0);
3941 mbedtls_ssl_transform_init(&t1);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003942
3943 /* Set up transforms with dummy keys */
Gilles Peskine449bd832023-01-11 14:50:10 +01003944 ret = build_transforms(&t0, &t1, cipher_type, hash_id,
3945 0, trunc_hmac,
3946 MBEDTLS_SSL_VERSION_TLS1_2,
3947 0, 0);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003948
Gilles Peskine449bd832023-01-11 14:50:10 +01003949 TEST_ASSERT(ret == 0);
Przemyslaw Stekiel4a36dd32022-01-25 00:43:58 +01003950
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003951 /* Determine padding/plaintext length */
Gilles Peskine449bd832023-01-11 14:50:10 +01003952 TEST_ASSERT(length_selector >= -2 && length_selector <= 255);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003953 block_size = t0.ivlen;
Gilles Peskine449bd832023-01-11 14:50:10 +01003954 if (length_selector < 0) {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003955 plaintext_len = 0;
3956
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003957 /* Minimal padding
3958 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003959 padlen = block_size - (t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003960
3961 /* Maximal padding? */
Gilles Peskine449bd832023-01-11 14:50:10 +01003962 if (length_selector == -2) {
3963 padlen += block_size * ((pad_max_len - padlen) / block_size);
3964 }
3965 } else {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003966 padlen = length_selector;
3967
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02003968 /* Minimal non-zero plaintext_length giving desired padding.
3969 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003970 plaintext_len = block_size - (padlen + t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02003971 }
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003972
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003973 /* Prepare a buffer for record data */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003974 buflen = block_size
Gilles Peskine449bd832023-01-11 14:50:10 +01003975 + plaintext_len
3976 + t0.maclen
3977 + padlen + 1;
3978 ASSERT_ALLOC(buf, buflen);
3979 ASSERT_ALLOC(buf_save, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003980
3981 /* Prepare a dummy record header */
Gilles Peskine449bd832023-01-11 14:50:10 +01003982 memset(rec.ctr, 0, sizeof(rec.ctr));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003983 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01003984 mbedtls_ssl_write_version(rec.ver, MBEDTLS_SSL_TRANSPORT_STREAM,
3985 MBEDTLS_SSL_VERSION_TLS1_2);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003986#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3987 rec.cid_len = 0;
3988#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3989
3990 /* Prepare dummy record content */
3991 rec.buf = buf;
3992 rec.buf_len = buflen;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003993 rec.data_offset = block_size;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003994 rec.data_len = plaintext_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01003995 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003996
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02003997 /* Serialized version of record header for MAC purposes */
Gilles Peskine449bd832023-01-11 14:50:10 +01003998 memcpy(add_data, rec.ctr, 8);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02003999 add_data[8] = rec.type;
4000 add_data[9] = rec.ver[0];
4001 add_data[10] = rec.ver[1];
Gilles Peskine449bd832023-01-11 14:50:10 +01004002 add_data[11] = (rec.data_len >> 8) & 0xff;
4003 add_data[12] = (rec.data_len >> 0) & 0xff;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004004
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004005 /* Set dummy IV */
Gilles Peskine449bd832023-01-11 14:50:10 +01004006 memset(t0.iv_enc, 0x55, t0.ivlen);
4007 memcpy(rec.buf, t0.iv_enc, t0.ivlen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004008
4009 /*
4010 * Prepare a pre-encryption record (with MAC and padding), and save it.
4011 */
4012
4013 /* MAC with additional data */
Neil Armstrongcf8841a2022-02-24 11:17:45 +01004014#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004015 TEST_EQUAL(PSA_SUCCESS, psa_mac_sign_setup(&operation,
4016 t0.psa_mac_enc,
4017 t0.psa_mac_alg));
4018 TEST_EQUAL(PSA_SUCCESS, psa_mac_update(&operation, add_data, 13));
4019 TEST_EQUAL(PSA_SUCCESS, psa_mac_update(&operation,
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004020 rec.buf + rec.data_offset,
Gilles Peskine449bd832023-01-11 14:50:10 +01004021 rec.data_len));
4022 TEST_EQUAL(PSA_SUCCESS, psa_mac_sign_finish(&operation,
4023 mac, sizeof(mac),
4024 &sign_mac_length));
4025#else
4026 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc, add_data, 13));
4027 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc,
4028 rec.buf + rec.data_offset,
4029 rec.data_len));
4030 TEST_EQUAL(0, mbedtls_md_hmac_finish(&t0.md_ctx_enc, mac));
Neil Armstrongcf8841a2022-02-24 11:17:45 +01004031#endif
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004032
Gilles Peskine449bd832023-01-11 14:50:10 +01004033 memcpy(rec.buf + rec.data_offset + rec.data_len, mac, t0.maclen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004034 rec.data_len += t0.maclen;
4035
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004036 /* Pad */
Gilles Peskine449bd832023-01-11 14:50:10 +01004037 memset(rec.buf + rec.data_offset + rec.data_len, padlen, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004038 rec.data_len += padlen + 1;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004039
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004040 /* Save correct pre-encryption record */
4041 rec_save = rec;
4042 rec_save.buf = buf_save;
Gilles Peskine449bd832023-01-11 14:50:10 +01004043 memcpy(buf_save, buf, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004044
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004045 /*
4046 * Encrypt and decrypt the correct record, expecting success
4047 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004048 TEST_EQUAL(0, psa_cipher_encrypt_helper(&t0, t0.iv_enc, t0.ivlen,
4049 rec.buf + rec.data_offset, rec.data_len,
4050 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004051 rec.data_offset -= t0.ivlen;
4052 rec.data_len += t0.ivlen;
4053
Gilles Peskine449bd832023-01-11 14:50:10 +01004054 TEST_EQUAL(0, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004055
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004056 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004057 * Modify each byte of the pre-encryption record before encrypting and
4058 * decrypting it, expecting failure every time.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004059 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004060 for (i = block_size; i < buflen; i++) {
4061 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004062
4063 /* Restore correct pre-encryption record */
4064 rec = rec_save;
4065 rec.buf = buf;
Gilles Peskine449bd832023-01-11 14:50:10 +01004066 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004067
Manuel Pégourié-Gonnardb51f0442020-07-21 10:40:25 +02004068 /* Corrupt one byte of the data (could be plaintext, MAC or padding) */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004069 rec.buf[i] ^= 0x01;
4070
4071 /* Encrypt */
Gilles Peskine449bd832023-01-11 14:50:10 +01004072 TEST_EQUAL(0, psa_cipher_encrypt_helper(&t0, t0.iv_enc, t0.ivlen,
4073 rec.buf + rec.data_offset, rec.data_len,
4074 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004075 rec.data_offset -= t0.ivlen;
4076 rec.data_len += t0.ivlen;
4077
4078 /* Decrypt and expect failure */
Gilles Peskine449bd832023-01-11 14:50:10 +01004079 TEST_EQUAL(MBEDTLS_ERR_SSL_INVALID_MAC,
4080 mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004081 }
4082
4083 /*
4084 * Use larger values of the padding bytes - with small buffers, this tests
4085 * the case where the announced padlen would be larger than the buffer
4086 * (and before that, than the buffer minus the size of the MAC), to make
4087 * sure our padding checking code does not perform any out-of-bounds reads
4088 * in this case. (With larger buffers, ie when the plaintext is long or
4089 * maximal length padding is used, this is less relevant but still doesn't
4090 * hurt to test.)
4091 *
4092 * (Start the loop with correct padding, just to double-check that record
4093 * saving did work, and that we're overwriting the correct bytes.)
4094 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004095 for (i = padlen; i <= pad_max_len; i++) {
4096 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004097
4098 /* Restore correct pre-encryption record */
4099 rec = rec_save;
4100 rec.buf = buf;
Gilles Peskine449bd832023-01-11 14:50:10 +01004101 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004102
4103 /* Set padding bytes to new value */
Gilles Peskine449bd832023-01-11 14:50:10 +01004104 memset(buf + buflen - padlen - 1, i, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004105
4106 /* Encrypt */
Gilles Peskine449bd832023-01-11 14:50:10 +01004107 TEST_EQUAL(0, psa_cipher_encrypt_helper(&t0, t0.iv_enc, t0.ivlen,
4108 rec.buf + rec.data_offset, rec.data_len,
4109 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004110 rec.data_offset -= t0.ivlen;
4111 rec.data_len += t0.ivlen;
4112
4113 /* Decrypt and expect failure except the first time */
Gilles Peskine449bd832023-01-11 14:50:10 +01004114 exp_ret = (i == padlen) ? 0 : MBEDTLS_ERR_SSL_INVALID_MAC;
4115 TEST_EQUAL(exp_ret, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02004116 }
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004117
4118exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01004119 mbedtls_ssl_free(&ssl);
4120 mbedtls_ssl_transform_free(&t0);
4121 mbedtls_ssl_transform_free(&t1);
4122 mbedtls_free(buf);
4123 mbedtls_free(buf_save);
4124 USE_PSA_DONE();
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02004125}
4126/* END_CASE */
4127
Ronald Cron6f135e12021-12-08 16:57:54 +01004128/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004129void ssl_tls13_hkdf_expand_label(int hash_alg,
4130 data_t *secret,
4131 int label_idx,
4132 data_t *ctx,
4133 int desired_length,
4134 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01004135{
Gilles Peskine449bd832023-01-11 14:50:10 +01004136 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01004137
Hanno Becker70d7fb02020-09-09 10:11:21 +01004138 unsigned char const *lbl = NULL;
4139 size_t lbl_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01004140#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
4141 if (label_idx == (int) tls13_label_ ## name) \
Xiaofei Baid25fab62021-12-02 06:36:27 +00004142 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00004143 lbl = mbedtls_ssl_tls13_labels.name; \
Gilles Peskine449bd832023-01-11 14:50:10 +01004144 lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01004145 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004146 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01004147#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine449bd832023-01-11 14:50:10 +01004148 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01004149
4150 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01004151 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
4152 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01004153
Gilles Peskine449bd832023-01-11 14:50:10 +01004154 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004155
Gilles Peskine449bd832023-01-11 14:50:10 +01004156 TEST_ASSERT(mbedtls_ssl_tls13_hkdf_expand_label(
4157 (psa_algorithm_t) hash_alg,
4158 secret->x, secret->len,
4159 lbl, lbl_len,
4160 ctx->x, ctx->len,
4161 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01004162
Gilles Peskine449bd832023-01-11 14:50:10 +01004163 ASSERT_COMPARE(dst, (size_t) desired_length,
4164 expected->x, (size_t) expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004165
Gilles Peskine449bd832023-01-11 14:50:10 +01004166 PSA_DONE();
Hanno Becker39ff4922020-08-21 13:36:56 +01004167}
4168/* END_CASE */
4169
Ronald Cron6f135e12021-12-08 16:57:54 +01004170/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004171void ssl_tls13_traffic_key_generation(int hash_alg,
4172 data_t *server_secret,
4173 data_t *client_secret,
4174 int desired_iv_len,
4175 int desired_key_len,
4176 data_t *expected_server_write_key,
4177 data_t *expected_server_write_iv,
4178 data_t *expected_client_write_key,
4179 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01004180{
4181 mbedtls_ssl_key_set keys;
4182
4183 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01004184 TEST_ASSERT(client_secret->len == server_secret->len);
4185 TEST_ASSERT(expected_client_write_iv->len == expected_server_write_iv->len &&
4186 expected_client_write_iv->len == (size_t) desired_iv_len);
4187 TEST_ASSERT(expected_client_write_key->len == expected_server_write_key->len &&
4188 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01004189
Gilles Peskine449bd832023-01-11 14:50:10 +01004190 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004191
Gilles Peskine449bd832023-01-11 14:50:10 +01004192 TEST_ASSERT(mbedtls_ssl_tls13_make_traffic_keys(
4193 (psa_algorithm_t) hash_alg,
4194 client_secret->x,
4195 server_secret->x,
4196 client_secret->len /* == server_secret->len */,
4197 desired_key_len, desired_iv_len,
4198 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01004199
Gilles Peskine449bd832023-01-11 14:50:10 +01004200 ASSERT_COMPARE(keys.client_write_key,
4201 keys.key_len,
4202 expected_client_write_key->x,
4203 (size_t) desired_key_len);
4204 ASSERT_COMPARE(keys.server_write_key,
4205 keys.key_len,
4206 expected_server_write_key->x,
4207 (size_t) desired_key_len);
4208 ASSERT_COMPARE(keys.client_write_iv,
4209 keys.iv_len,
4210 expected_client_write_iv->x,
4211 (size_t) desired_iv_len);
4212 ASSERT_COMPARE(keys.server_write_iv,
4213 keys.iv_len,
4214 expected_server_write_iv->x,
4215 (size_t) desired_iv_len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004216
Gilles Peskine449bd832023-01-11 14:50:10 +01004217 PSA_DONE();
Hanno Becker19498f82020-08-21 13:37:08 +01004218}
4219/* END_CASE */
4220
Ronald Cron6f135e12021-12-08 16:57:54 +01004221/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004222void ssl_tls13_derive_secret(int hash_alg,
4223 data_t *secret,
4224 int label_idx,
4225 data_t *ctx,
4226 int desired_length,
4227 int already_hashed,
4228 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01004229{
Gilles Peskine449bd832023-01-11 14:50:10 +01004230 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01004231
Hanno Becker70d7fb02020-09-09 10:11:21 +01004232 unsigned char const *lbl = NULL;
4233 size_t lbl_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01004234#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
4235 if (label_idx == (int) tls13_label_ ## name) \
Xiaofei Baid25fab62021-12-02 06:36:27 +00004236 { \
Xiaofei Bai746f9482021-11-12 08:53:56 +00004237 lbl = mbedtls_ssl_tls13_labels.name; \
Gilles Peskine449bd832023-01-11 14:50:10 +01004238 lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01004239 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004240 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01004241#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine449bd832023-01-11 14:50:10 +01004242 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01004243
Hanno Beckere4849d12020-08-21 14:14:14 +01004244 /* Check sanity of test parameters. */
Gilles Peskine449bd832023-01-11 14:50:10 +01004245 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
4246 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01004247
Gilles Peskine449bd832023-01-11 14:50:10 +01004248 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004249
Gilles Peskine449bd832023-01-11 14:50:10 +01004250 TEST_ASSERT(mbedtls_ssl_tls13_derive_secret(
4251 (psa_algorithm_t) hash_alg,
4252 secret->x, secret->len,
4253 lbl, lbl_len,
4254 ctx->x, ctx->len,
4255 already_hashed,
4256 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01004257
Gilles Peskine449bd832023-01-11 14:50:10 +01004258 ASSERT_COMPARE(dst, desired_length,
4259 expected->x, desired_length);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004260
Gilles Peskine449bd832023-01-11 14:50:10 +01004261 PSA_DONE();
Hanno Beckere4849d12020-08-21 14:14:14 +01004262}
4263/* END_CASE */
4264
Ronald Cron6f135e12021-12-08 16:57:54 +01004265/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004266void ssl_tls13_derive_early_secrets(int hash_alg,
4267 data_t *secret,
4268 data_t *transcript,
4269 data_t *traffic_expected,
4270 data_t *exporter_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01004271{
Xiaofei Bai746f9482021-11-12 08:53:56 +00004272 mbedtls_ssl_tls13_early_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01004273
4274 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004275 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01004276 size_t const hash_len = PSA_HASH_LENGTH(alg);
4277 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
4278 secret->len == hash_len &&
4279 transcript->len == hash_len &&
4280 traffic_expected->len == hash_len &&
4281 exporter_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01004282
Gilles Peskine449bd832023-01-11 14:50:10 +01004283 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01004284
Gilles Peskine449bd832023-01-11 14:50:10 +01004285 TEST_ASSERT(mbedtls_ssl_tls13_derive_early_secrets(
4286 alg, secret->x, transcript->x, transcript->len,
4287 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01004288
Gilles Peskine449bd832023-01-11 14:50:10 +01004289 ASSERT_COMPARE(secrets.client_early_traffic_secret, hash_len,
4290 traffic_expected->x, traffic_expected->len);
4291 ASSERT_COMPARE(secrets.early_exporter_master_secret, hash_len,
4292 exporter_expected->x, exporter_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004293
Gilles Peskine449bd832023-01-11 14:50:10 +01004294 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01004295}
4296/* END_CASE */
4297
Ronald Cron6f135e12021-12-08 16:57:54 +01004298/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004299void ssl_tls13_derive_handshake_secrets(int hash_alg,
4300 data_t *secret,
4301 data_t *transcript,
4302 data_t *client_expected,
4303 data_t *server_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01004304{
Xiaofei Bai746f9482021-11-12 08:53:56 +00004305 mbedtls_ssl_tls13_handshake_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01004306
4307 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004308 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01004309 size_t const hash_len = PSA_HASH_LENGTH(alg);
4310 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
4311 secret->len == hash_len &&
4312 transcript->len == hash_len &&
4313 client_expected->len == hash_len &&
4314 server_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01004315
Gilles Peskine449bd832023-01-11 14:50:10 +01004316 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01004317
Gilles Peskine449bd832023-01-11 14:50:10 +01004318 TEST_ASSERT(mbedtls_ssl_tls13_derive_handshake_secrets(
4319 alg, secret->x, transcript->x, transcript->len,
4320 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01004321
Gilles Peskine449bd832023-01-11 14:50:10 +01004322 ASSERT_COMPARE(secrets.client_handshake_traffic_secret, hash_len,
4323 client_expected->x, client_expected->len);
4324 ASSERT_COMPARE(secrets.server_handshake_traffic_secret, hash_len,
4325 server_expected->x, server_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004326
Gilles Peskine449bd832023-01-11 14:50:10 +01004327 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01004328}
4329/* END_CASE */
4330
Ronald Cron6f135e12021-12-08 16:57:54 +01004331/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004332void ssl_tls13_derive_application_secrets(int hash_alg,
Xiaofei Bai746f9482021-11-12 08:53:56 +00004333 data_t *secret,
4334 data_t *transcript,
Gilles Peskine449bd832023-01-11 14:50:10 +01004335 data_t *client_expected,
4336 data_t *server_expected,
4337 data_t *exporter_expected)
Hanno Beckera4f40a02021-05-24 06:42:11 +01004338{
Xiaofei Bai746f9482021-11-12 08:53:56 +00004339 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Beckera4f40a02021-05-24 06:42:11 +01004340
4341 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004342 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01004343 size_t const hash_len = PSA_HASH_LENGTH(alg);
4344 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
4345 secret->len == hash_len &&
4346 transcript->len == hash_len &&
4347 client_expected->len == hash_len &&
4348 server_expected->len == hash_len &&
4349 exporter_expected->len == hash_len);
Hanno Beckera4f40a02021-05-24 06:42:11 +01004350
Gilles Peskine449bd832023-01-11 14:50:10 +01004351 PSA_INIT();
Hanno Beckera4f40a02021-05-24 06:42:11 +01004352
Gilles Peskine449bd832023-01-11 14:50:10 +01004353 TEST_ASSERT(mbedtls_ssl_tls13_derive_application_secrets(
4354 alg, secret->x, transcript->x, transcript->len,
4355 &secrets) == 0);
Hanno Beckera4f40a02021-05-24 06:42:11 +01004356
Gilles Peskine449bd832023-01-11 14:50:10 +01004357 ASSERT_COMPARE(secrets.client_application_traffic_secret_N, hash_len,
4358 client_expected->x, client_expected->len);
4359 ASSERT_COMPARE(secrets.server_application_traffic_secret_N, hash_len,
4360 server_expected->x, server_expected->len);
4361 ASSERT_COMPARE(secrets.exporter_master_secret, hash_len,
4362 exporter_expected->x, exporter_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004363
Gilles Peskine449bd832023-01-11 14:50:10 +01004364 PSA_DONE();
Hanno Beckera4f40a02021-05-24 06:42:11 +01004365}
4366/* END_CASE */
4367
Ronald Cron6f135e12021-12-08 16:57:54 +01004368/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004369void ssl_tls13_derive_resumption_secrets(int hash_alg,
4370 data_t *secret,
4371 data_t *transcript,
4372 data_t *resumption_expected)
Hanno Becker55bc2c52021-05-24 06:53:52 +01004373{
Gilles Peskine449bd832023-01-11 14:50:10 +01004374 mbedtls_ssl_tls13_application_secrets secrets;
Hanno Becker55bc2c52021-05-24 06:53:52 +01004375
4376 /* Double-check that we've passed sane parameters. */
Gabor Mezei07732f72022-03-26 17:04:19 +01004377 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01004378 size_t const hash_len = PSA_HASH_LENGTH(alg);
4379 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
4380 secret->len == hash_len &&
4381 transcript->len == hash_len &&
4382 resumption_expected->len == hash_len);
Hanno Becker55bc2c52021-05-24 06:53:52 +01004383
Gilles Peskine449bd832023-01-11 14:50:10 +01004384 PSA_INIT();
Hanno Becker55bc2c52021-05-24 06:53:52 +01004385
Gilles Peskine449bd832023-01-11 14:50:10 +01004386 TEST_ASSERT(mbedtls_ssl_tls13_derive_resumption_master_secret(
4387 alg, secret->x, transcript->x, transcript->len,
4388 &secrets) == 0);
Hanno Becker55bc2c52021-05-24 06:53:52 +01004389
Gilles Peskine449bd832023-01-11 14:50:10 +01004390 ASSERT_COMPARE(secrets.resumption_master_secret, hash_len,
4391 resumption_expected->x, resumption_expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004392
Gilles Peskine449bd832023-01-11 14:50:10 +01004393 PSA_DONE();
4394}
4395/* END_CASE */
4396
4397/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
4398void ssl_tls13_create_psk_binder(int hash_alg,
4399 data_t *psk,
4400 int psk_type,
4401 data_t *transcript,
4402 data_t *binder_expected)
4403{
4404 unsigned char binder[MBEDTLS_HASH_MAX_SIZE];
4405
4406 /* Double-check that we've passed sane parameters. */
4407 psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
4408 size_t const hash_len = PSA_HASH_LENGTH(alg);
4409 TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
4410 transcript->len == hash_len &&
4411 binder_expected->len == hash_len);
4412
4413 PSA_INIT();
4414
4415 TEST_ASSERT(mbedtls_ssl_tls13_create_psk_binder(
4416 NULL, /* SSL context for debugging only */
4417 alg,
4418 psk->x, psk->len,
4419 psk_type,
4420 transcript->x,
4421 binder) == 0);
4422
4423 ASSERT_COMPARE(binder, hash_len,
4424 binder_expected->x, binder_expected->len);
4425
4426 PSA_DONE();
Hanno Becker55bc2c52021-05-24 06:53:52 +01004427}
4428/* END_CASE */
4429
Andrzej Kurekdaf43fb2022-10-12 10:46:42 -04004430/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01004431void ssl_tls13_record_protection(int ciphersuite,
4432 int endpoint,
4433 int ctr,
4434 int padding_used,
4435 data_t *server_write_key,
4436 data_t *server_write_iv,
4437 data_t *client_write_key,
4438 data_t *client_write_iv,
4439 data_t *plaintext,
4440 data_t *ciphertext)
Hanno Beckera77d0052021-03-22 15:16:33 +00004441{
4442 mbedtls_ssl_key_set keys;
4443 mbedtls_ssl_transform transform_send;
4444 mbedtls_ssl_transform transform_recv;
4445 mbedtls_record rec;
4446 unsigned char *buf = NULL;
Hanno Becker1f918782021-08-01 19:18:28 +01004447 size_t buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00004448 int other_endpoint;
4449
Gilles Peskine449bd832023-01-11 14:50:10 +01004450 USE_PSA_INIT();
Przemyslaw Stekiel93cf4ee2022-01-19 16:18:53 +01004451
Gilles Peskine449bd832023-01-11 14:50:10 +01004452 TEST_ASSERT(endpoint == MBEDTLS_SSL_IS_CLIENT ||
4453 endpoint == MBEDTLS_SSL_IS_SERVER);
Hanno Beckera77d0052021-03-22 15:16:33 +00004454
Gilles Peskine449bd832023-01-11 14:50:10 +01004455 if (endpoint == MBEDTLS_SSL_IS_SERVER) {
Hanno Beckera77d0052021-03-22 15:16:33 +00004456 other_endpoint = MBEDTLS_SSL_IS_CLIENT;
Gilles Peskine449bd832023-01-11 14:50:10 +01004457 }
4458 if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
Hanno Beckera77d0052021-03-22 15:16:33 +00004459 other_endpoint = MBEDTLS_SSL_IS_SERVER;
Gilles Peskine449bd832023-01-11 14:50:10 +01004460 }
Hanno Beckera77d0052021-03-22 15:16:33 +00004461
Gilles Peskine449bd832023-01-11 14:50:10 +01004462 TEST_ASSERT(server_write_key->len == client_write_key->len);
4463 TEST_ASSERT(server_write_iv->len == client_write_iv->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00004464
Gilles Peskine449bd832023-01-11 14:50:10 +01004465 memcpy(keys.client_write_key,
4466 client_write_key->x, client_write_key->len);
4467 memcpy(keys.client_write_iv,
4468 client_write_iv->x, client_write_iv->len);
4469 memcpy(keys.server_write_key,
4470 server_write_key->x, server_write_key->len);
4471 memcpy(keys.server_write_iv,
4472 server_write_iv->x, server_write_iv->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00004473
4474 keys.key_len = server_write_key->len;
4475 keys.iv_len = server_write_iv->len;
4476
Gilles Peskine449bd832023-01-11 14:50:10 +01004477 mbedtls_ssl_transform_init(&transform_recv);
4478 mbedtls_ssl_transform_init(&transform_send);
Hanno Beckera77d0052021-03-22 15:16:33 +00004479
Gilles Peskine449bd832023-01-11 14:50:10 +01004480 TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
4481 &transform_send, endpoint,
4482 ciphersuite, &keys, NULL) == 0);
4483 TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
4484 &transform_recv, other_endpoint,
4485 ciphersuite, &keys, NULL) == 0);
Hanno Beckera77d0052021-03-22 15:16:33 +00004486
Hanno Becker1f918782021-08-01 19:18:28 +01004487 /* Make sure we have enough space in the buffer even if
4488 * we use more padding than the KAT. */
4489 buf_len = ciphertext->len + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01004490 ASSERT_ALLOC(buf, buf_len);
Hanno Beckera77d0052021-03-22 15:16:33 +00004491 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
Hanno Becker41537452021-04-20 05:35:28 +01004492
4493 /* TLS 1.3 uses the version identifier from TLS 1.2 on the wire. */
Gilles Peskine449bd832023-01-11 14:50:10 +01004494 mbedtls_ssl_write_version(rec.ver,
4495 MBEDTLS_SSL_TRANSPORT_STREAM,
4496 MBEDTLS_SSL_VERSION_TLS1_2);
Hanno Beckera77d0052021-03-22 15:16:33 +00004497
4498 /* Copy plaintext into record structure */
4499 rec.buf = buf;
Hanno Becker1f918782021-08-01 19:18:28 +01004500 rec.buf_len = buf_len;
Hanno Beckera77d0052021-03-22 15:16:33 +00004501 rec.data_offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01004502 TEST_ASSERT(plaintext->len <= ciphertext->len);
4503 memcpy(rec.buf + rec.data_offset, plaintext->x, plaintext->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00004504 rec.data_len = plaintext->len;
4505#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4506 rec.cid_len = 0;
4507#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4508
Gilles Peskine449bd832023-01-11 14:50:10 +01004509 memset(&rec.ctr[0], 0, 8);
Hanno Beckera77d0052021-03-22 15:16:33 +00004510 rec.ctr[7] = ctr;
4511
Gilles Peskine449bd832023-01-11 14:50:10 +01004512 TEST_ASSERT(mbedtls_ssl_encrypt_buf(NULL, &transform_send, &rec,
4513 NULL, NULL) == 0);
Hanno Becker1f918782021-08-01 19:18:28 +01004514
Gilles Peskine449bd832023-01-11 14:50:10 +01004515 if (padding_used == MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) {
4516 ASSERT_COMPARE(rec.buf + rec.data_offset, rec.data_len,
4517 ciphertext->x, ciphertext->len);
Hanno Becker1f918782021-08-01 19:18:28 +01004518 }
Hanno Beckera77d0052021-03-22 15:16:33 +00004519
Gilles Peskine449bd832023-01-11 14:50:10 +01004520 TEST_ASSERT(mbedtls_ssl_decrypt_buf(NULL, &transform_recv, &rec) == 0);
4521 ASSERT_COMPARE(rec.buf + rec.data_offset, rec.data_len,
4522 plaintext->x, plaintext->len);
Hanno Beckera77d0052021-03-22 15:16:33 +00004523
Gilles Peskine449bd832023-01-11 14:50:10 +01004524 mbedtls_free(buf);
4525 mbedtls_ssl_transform_free(&transform_send);
4526 mbedtls_ssl_transform_free(&transform_recv);
4527 USE_PSA_DONE();
Hanno Beckera77d0052021-03-22 15:16:33 +00004528}
4529/* END_CASE */
4530
Andrzej Kurek658442f2022-10-12 11:28:41 -04004531/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004532void ssl_tls13_key_evolution(int hash_alg,
4533 data_t *secret,
4534 data_t *input,
4535 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01004536{
Gilles Peskine449bd832023-01-11 14:50:10 +01004537 unsigned char secret_new[MBEDTLS_HASH_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01004538
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004539 PSA_INIT();
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004540
Gilles Peskine449bd832023-01-11 14:50:10 +01004541 TEST_ASSERT(mbedtls_ssl_tls13_evolve_secret(
4542 (psa_algorithm_t) hash_alg,
4543 secret->len ? secret->x : NULL,
4544 input->len ? input->x : NULL, input->len,
4545 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01004546
Gilles Peskine449bd832023-01-11 14:50:10 +01004547 ASSERT_COMPARE(secret_new, (size_t) expected->len,
4548 expected->x, (size_t) expected->len);
Gabor Mezei892c4aa2022-03-21 12:21:43 +01004549
Gabor Mezei5d9a1fe2022-03-24 17:49:14 +01004550 PSA_DONE();
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01004551}
4552/* END_CASE */
4553
Jerry Yu53d23e22022-02-09 16:25:09 +08004554/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004555void ssl_tls_prf(int type, data_t *secret, data_t *random,
4556 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03004557{
4558 unsigned char *output;
4559
Gilles Peskine449bd832023-01-11 14:50:10 +01004560 output = mbedtls_calloc(1, result_str->len);
4561 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03004562 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01004563 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03004564
Gilles Peskine449bd832023-01-11 14:50:10 +01004565 USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03004566
Gilles Peskine449bd832023-01-11 14:50:10 +01004567 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
4568 label, random->x, random->len,
4569 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03004570
Gilles Peskine449bd832023-01-11 14:50:10 +01004571 if (exp_ret == 0) {
4572 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
4573 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03004574 }
4575exit:
4576
Gilles Peskine449bd832023-01-11 14:50:10 +01004577 mbedtls_free(output);
4578 USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03004579}
4580/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004581
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004582/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004583void ssl_serialize_session_save_load(int ticket_len, char *crt_file,
4584 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004585{
4586 mbedtls_ssl_session original, restored;
4587 unsigned char *buf = NULL;
4588 size_t len;
4589
4590 /*
4591 * Test that a save-load pair is the identity
4592 */
4593
Gilles Peskine449bd832023-01-11 14:50:10 +01004594 mbedtls_ssl_session_init(&original);
4595 mbedtls_ssl_session_init(&restored);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004596
4597 /* Prepare a dummy session to work on */
Jerry Yuf0926292022-07-15 13:05:57 +08004598 ((void) endpoint_type);
4599 ((void) tls_version);
4600#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01004601 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
4602 TEST_ASSERT(ssl_tls13_populate_session(
4603 &original, 0, endpoint_type) == 0);
4604 } else
Jerry Yuf0926292022-07-15 13:05:57 +08004605#endif
4606 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004607 TEST_ASSERT(ssl_tls12_populate_session(
4608 &original, ticket_len, crt_file) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08004609 }
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004610
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004611 /* Serialize it */
Gilles Peskine449bd832023-01-11 14:50:10 +01004612 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
4613 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
4614 TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL);
4615 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
4616 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004617
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004618 /* Restore session from serialized data */
Gilles Peskine449bd832023-01-11 14:50:10 +01004619 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004620
4621 /*
4622 * Make sure both session structures are identical
4623 */
4624#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01004625 TEST_ASSERT(original.start == restored.start);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004626#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004627 TEST_ASSERT(original.tls_version == restored.tls_version);
4628 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
Jerry Yuf0926292022-07-15 13:05:57 +08004629#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskine449bd832023-01-11 14:50:10 +01004630 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
4631 TEST_ASSERT(original.id_len == restored.id_len);
4632 TEST_ASSERT(memcmp(original.id,
4633 restored.id, sizeof(original.id)) == 0);
4634 TEST_ASSERT(memcmp(original.master,
4635 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004636
Ronald Crone68ab4f2022-10-05 12:46:29 +02004637#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02004638#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004639 TEST_ASSERT((original.peer_cert == NULL) ==
4640 (restored.peer_cert == NULL));
4641 if (original.peer_cert != NULL) {
4642 TEST_ASSERT(original.peer_cert->raw.len ==
4643 restored.peer_cert->raw.len);
4644 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
4645 restored.peer_cert->raw.p,
4646 original.peer_cert->raw.len) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08004647 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02004648#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004649 TEST_ASSERT(original.peer_cert_digest_type ==
4650 restored.peer_cert_digest_type);
4651 TEST_ASSERT(original.peer_cert_digest_len ==
4652 restored.peer_cert_digest_len);
4653 TEST_ASSERT((original.peer_cert_digest == NULL) ==
4654 (restored.peer_cert_digest == NULL));
4655 if (original.peer_cert_digest != NULL) {
4656 TEST_ASSERT(memcmp(original.peer_cert_digest,
4657 restored.peer_cert_digest,
4658 original.peer_cert_digest_len) == 0);
Jerry Yuf0926292022-07-15 13:05:57 +08004659 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02004660#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Crone68ab4f2022-10-05 12:46:29 +02004661#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01004662 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004663
Jerry Yuf0926292022-07-15 13:05:57 +08004664#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01004665 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Jerry Yuf0926292022-07-15 13:05:57 +08004666#endif
4667
4668#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine449bd832023-01-11 14:50:10 +01004669 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Jerry Yuf0926292022-07-15 13:05:57 +08004670#endif
Jerry Yu6ac7c032022-07-21 23:11:55 +08004671#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01004672 TEST_ASSERT(original.ticket_len == restored.ticket_len);
4673 if (original.ticket_len != 0) {
4674 TEST_ASSERT(original.ticket != NULL);
4675 TEST_ASSERT(restored.ticket != NULL);
4676 TEST_ASSERT(memcmp(original.ticket,
4677 restored.ticket, original.ticket_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08004678 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004679 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Jerry Yu6ac7c032022-07-21 23:11:55 +08004680#endif
Jerry Yuf0926292022-07-15 13:05:57 +08004681 }
Jerry Yu6ac7c032022-07-21 23:11:55 +08004682#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
4683
4684#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01004685 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
4686 TEST_ASSERT(original.endpoint == restored.endpoint);
4687 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
4688 TEST_ASSERT(original.ticket_age_add == restored.ticket_age_add);
4689 TEST_ASSERT(original.ticket_flags == restored.ticket_flags);
4690 TEST_ASSERT(original.resumption_key_len == restored.resumption_key_len);
4691 if (original.resumption_key_len != 0) {
4692 TEST_ASSERT(original.resumption_key != NULL);
4693 TEST_ASSERT(restored.resumption_key != NULL);
4694 TEST_ASSERT(memcmp(original.resumption_key,
4695 restored.resumption_key,
4696 original.resumption_key_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08004697 }
4698#if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01004699 if (endpoint_type == MBEDTLS_SSL_IS_SERVER) {
4700 TEST_ASSERT(original.start == restored.start);
Jerry Yu6ac7c032022-07-21 23:11:55 +08004701 }
Jerry Yuf0926292022-07-15 13:05:57 +08004702#endif
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004703#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01004704 if (endpoint_type == MBEDTLS_SSL_IS_CLIENT) {
Jerry Yu6ac7c032022-07-21 23:11:55 +08004705#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01004706 TEST_ASSERT(original.ticket_received == restored.ticket_received);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004707#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004708 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
4709 TEST_ASSERT(original.ticket_len == restored.ticket_len);
4710 if (original.ticket_len != 0) {
4711 TEST_ASSERT(original.ticket != NULL);
4712 TEST_ASSERT(restored.ticket != NULL);
4713 TEST_ASSERT(memcmp(original.ticket,
4714 restored.ticket,
4715 original.ticket_len) == 0);
Jerry Yu6ac7c032022-07-21 23:11:55 +08004716 }
4717
4718 }
4719#endif
4720 }
4721#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004722
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004723exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01004724 mbedtls_ssl_session_free(&original);
4725 mbedtls_ssl_session_free(&restored);
4726 mbedtls_free(buf);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02004727}
4728/* END_CASE */
4729
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02004730/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004731void ssl_serialize_session_load_save(int ticket_len, char *crt_file,
4732 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004733{
4734 mbedtls_ssl_session session;
4735 unsigned char *buf1 = NULL, *buf2 = NULL;
4736 size_t len0, len1, len2;
4737
4738 /*
4739 * Test that a load-save pair is the identity
4740 */
4741
Gilles Peskine449bd832023-01-11 14:50:10 +01004742 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004743
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02004744 /* Prepare a dummy session to work on */
Jerry Yua180f992022-07-15 12:52:54 +08004745 ((void) endpoint_type);
4746 ((void) tls_version);
4747#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01004748 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
4749 TEST_ASSERT(ssl_tls13_populate_session(
4750 &session, 0, endpoint_type) == 0);
4751 } else
Jerry Yua180f992022-07-15 12:52:54 +08004752#endif
4753 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004754 TEST_ASSERT(ssl_tls12_populate_session(
4755 &session, ticket_len, crt_file) == 0);
Jerry Yua180f992022-07-15 12:52:54 +08004756 }
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02004757
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004758 /* Get desired buffer size for serializing */
Gilles Peskine449bd832023-01-11 14:50:10 +01004759 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
4760 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004761
4762 /* Allocate first buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01004763 buf1 = mbedtls_calloc(1, len0);
4764 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004765
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004766 /* Serialize to buffer and free live session */
Gilles Peskine449bd832023-01-11 14:50:10 +01004767 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
4768 == 0);
4769 TEST_ASSERT(len0 == len1);
4770 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004771
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004772 /* Restore session from serialized data */
Gilles Peskine449bd832023-01-11 14:50:10 +01004773 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004774
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004775 /* Allocate second buffer and serialize to it */
Gilles Peskine449bd832023-01-11 14:50:10 +01004776 buf2 = mbedtls_calloc(1, len0);
4777 TEST_ASSERT(buf2 != NULL);
4778 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
4779 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004780
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004781 /* Make sure both serialized versions are identical */
Gilles Peskine449bd832023-01-11 14:50:10 +01004782 TEST_ASSERT(len1 == len2);
4783 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004784
4785exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01004786 mbedtls_ssl_session_free(&session);
4787 mbedtls_free(buf1);
4788 mbedtls_free(buf2);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02004789}
4790/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004791
4792/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004793void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file,
4794 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004795{
4796 mbedtls_ssl_session session;
4797 unsigned char *buf = NULL;
4798 size_t good_len, bad_len, test_len;
4799
4800 /*
4801 * Test that session_save() fails cleanly on small buffers
4802 */
4803
Gilles Peskine449bd832023-01-11 14:50:10 +01004804 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004805
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004806 /* Prepare dummy session and get serialized size */
Jerry Yu1ac476c2022-07-15 11:22:40 +08004807 ((void) endpoint_type);
4808 ((void) tls_version);
4809#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01004810 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
4811 TEST_ASSERT(ssl_tls13_populate_session(
4812 &session, 0, endpoint_type) == 0);
4813 } else
Jerry Yu1ac476c2022-07-15 11:22:40 +08004814#endif
4815 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004816 TEST_ASSERT(ssl_tls12_populate_session(
4817 &session, ticket_len, crt_file) == 0);
Jerry Yu1ac476c2022-07-15 11:22:40 +08004818 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004819 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
4820 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004821
4822 /* Try all possible bad lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +01004823 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004824 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine449bd832023-01-11 14:50:10 +01004825 mbedtls_free(buf);
4826 TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL);
4827 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
4828 &test_len)
4829 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
4830 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004831 }
4832
4833exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01004834 mbedtls_ssl_session_free(&session);
4835 mbedtls_free(buf);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02004836}
4837/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004838
4839/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004840void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file,
4841 int endpoint_type, int tls_version)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004842{
4843 mbedtls_ssl_session session;
4844 unsigned char *good_buf = NULL, *bad_buf = NULL;
4845 size_t good_len, bad_len;
4846
4847 /*
4848 * Test that session_load() fails cleanly on small buffers
4849 */
4850
Gilles Peskine449bd832023-01-11 14:50:10 +01004851 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004852
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02004853 /* Prepare serialized session data */
Jerry Yu6e8fec22022-07-15 10:37:02 +08004854 ((void) endpoint_type);
4855 ((void) tls_version);
4856#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01004857 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
4858 TEST_ASSERT(ssl_tls13_populate_session(
4859 &session, 0, endpoint_type) == 0);
4860 } else
Jerry Yu6e8fec22022-07-15 10:37:02 +08004861#endif
4862 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004863 TEST_ASSERT(ssl_tls12_populate_session(
4864 &session, ticket_len, crt_file) == 0);
Jerry Yu6e8fec22022-07-15 10:37:02 +08004865 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004866 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
4867 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
4868 TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL);
4869 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
4870 &good_len) == 0);
4871 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004872
4873 /* Try all possible bad lengths */
Gilles Peskine449bd832023-01-11 14:50:10 +01004874 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004875 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine449bd832023-01-11 14:50:10 +01004876 mbedtls_free(bad_buf);
4877 bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1);
4878 TEST_ASSERT(bad_buf != NULL);
4879 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004880
Gilles Peskine449bd832023-01-11 14:50:10 +01004881 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
4882 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004883 }
4884
4885exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01004886 mbedtls_ssl_session_free(&session);
4887 mbedtls_free(good_buf);
4888 mbedtls_free(bad_buf);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004889}
4890/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01004891
Hanno Becker363b6462019-05-29 12:44:28 +01004892/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004893void ssl_session_serialize_version_check(int corrupt_major,
4894 int corrupt_minor,
4895 int corrupt_patch,
4896 int corrupt_config,
4897 int endpoint_type,
4898 int tls_version)
Hanno Becker861d0bb2019-05-21 16:39:30 +01004899{
Gilles Peskine449bd832023-01-11 14:50:10 +01004900 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01004901 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004902 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01004903 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004904 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
4905 corrupt_minor == 1,
4906 corrupt_patch == 1,
4907 corrupt_config == 1,
4908 corrupt_config == 1 };
4909
Gilles Peskine449bd832023-01-11 14:50:10 +01004910 mbedtls_ssl_session_init(&session);
Jerry Yu534ff402022-07-14 16:43:43 +08004911 ((void) endpoint_type);
4912 ((void) tls_version);
4913#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Gilles Peskine449bd832023-01-11 14:50:10 +01004914 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
4915 TEST_ASSERT(ssl_tls13_populate_session(
4916 &session, 0, endpoint_type) == 0);
4917 } else
Jerry Yu534ff402022-07-14 16:43:43 +08004918#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004919 TEST_ASSERT(ssl_tls12_populate_session(&session, 0, NULL) == 0);
Jerry Yu534ff402022-07-14 16:43:43 +08004920
Hanno Becker861d0bb2019-05-21 16:39:30 +01004921
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004922 /* Infer length of serialized session. */
Gilles Peskine449bd832023-01-11 14:50:10 +01004923 TEST_ASSERT(mbedtls_ssl_session_save(&session,
4924 serialized_session,
4925 sizeof(serialized_session),
4926 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01004927
Gilles Peskine449bd832023-01-11 14:50:10 +01004928 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01004929
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004930 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01004931 * de-serialize the session - double-check that. */
Gilles Peskine449bd832023-01-11 14:50:10 +01004932 TEST_ASSERT(mbedtls_ssl_session_load(&session,
4933 serialized_session,
4934 serialized_session_len) == 0);
4935 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01004936
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004937 /* Go through the bytes in the serialized session header and
4938 * corrupt them bit-by-bit. */
Gilles Peskine449bd832023-01-11 14:50:10 +01004939 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004940 int cur_bit;
Gilles Peskine449bd832023-01-11 14:50:10 +01004941 unsigned char * const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004942
Gilles Peskine449bd832023-01-11 14:50:10 +01004943 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004944 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01004945 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004946
Gilles Peskine449bd832023-01-11 14:50:10 +01004947 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004948 unsigned char const corrupted_bit = 0x1u << cur_bit;
4949 /* Modify a single bit in the serialized session. */
4950 *byte ^= corrupted_bit;
4951
4952 /* Attempt to deserialize */
Gilles Peskine449bd832023-01-11 14:50:10 +01004953 TEST_ASSERT(mbedtls_ssl_session_load(&session,
4954 serialized_session,
4955 serialized_session_len) ==
4956 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01004957
4958 /* Undo the change */
4959 *byte ^= corrupted_bit;
4960 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01004961 }
4962
Hanno Becker861d0bb2019-05-21 16:39:30 +01004963}
4964/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004965
Ronald Crone68ab4f2022-10-05 12:46:29 +02004966/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01004967void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004968{
4969 enum { BUFFSIZE = 1024 };
4970 mbedtls_endpoint ep;
4971 int ret = -1;
Andrzej Kurek780dc182022-06-10 08:57:19 -04004972 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01004973 init_handshake_options(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04004974 options.pk_alg = MBEDTLS_PK_RSA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004975
Gilles Peskine449bd832023-01-11 14:50:10 +01004976 ret = mbedtls_endpoint_init(NULL, endpoint_type, &options,
4977 NULL, NULL, NULL, NULL);
4978 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004979
Gilles Peskine449bd832023-01-11 14:50:10 +01004980 ret = mbedtls_endpoint_certificate_init(NULL, options.pk_alg, 0, 0, 0);
4981 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004982
Gilles Peskine449bd832023-01-11 14:50:10 +01004983 ret = mbedtls_endpoint_init(&ep, endpoint_type, &options,
4984 NULL, NULL, NULL, NULL);
4985 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004986
4987exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01004988 mbedtls_endpoint_free(&ep, NULL);
4989 free_handshake_options(&options);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004990}
4991/* END_CASE */
4992
Ronald Crone68ab4f2022-10-05 12:46:29 +02004993/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_ECP_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01004994void move_handshake_to_state(int endpoint_type, int state, int need_pass)
4995{
4996 enum { BUFFSIZE = 1024 };
4997 mbedtls_endpoint base_ep, second_ep;
4998 int ret = -1;
Andrzej Kurek780dc182022-06-10 08:57:19 -04004999 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005000 init_handshake_options(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04005001 options.pk_alg = MBEDTLS_PK_RSA;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005002
Gilles Peskine449bd832023-01-11 14:50:10 +01005003 USE_PSA_INIT();
5004 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
5005 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Neil Armstrong06baf042022-04-14 16:21:15 +02005006
Gilles Peskine449bd832023-01-11 14:50:10 +01005007 ret = mbedtls_endpoint_init(&base_ep, endpoint_type, &options,
5008 NULL, NULL, NULL, NULL);
5009 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005010
Gilles Peskine449bd832023-01-11 14:50:10 +01005011 ret = mbedtls_endpoint_init(&second_ep,
5012 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
5013 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
5014 &options, NULL, NULL, NULL, NULL);
Andrzej Kurek780dc182022-06-10 08:57:19 -04005015
Gilles Peskine449bd832023-01-11 14:50:10 +01005016 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005017
Gilles Peskine449bd832023-01-11 14:50:10 +01005018 ret = mbedtls_mock_socket_connect(&(base_ep.socket),
5019 &(second_ep.socket),
5020 BUFFSIZE);
5021 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005022
Gilles Peskine449bd832023-01-11 14:50:10 +01005023 ret = mbedtls_move_handshake_to_state(&(base_ep.ssl),
5024 &(second_ep.ssl),
5025 state);
5026 if (need_pass) {
5027 TEST_ASSERT(ret == 0 ||
5028 ret == MBEDTLS_ERR_SSL_WANT_READ ||
5029 ret == MBEDTLS_ERR_SSL_WANT_WRITE);
5030 TEST_ASSERT(base_ep.ssl.state == state);
5031 } else {
5032 TEST_ASSERT(ret != 0 &&
5033 ret != MBEDTLS_ERR_SSL_WANT_READ &&
5034 ret != MBEDTLS_ERR_SSL_WANT_WRITE);
5035 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005036 }
5037
5038exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005039 free_handshake_options(&options);
5040 mbedtls_endpoint_free(&base_ep, NULL);
5041 mbedtls_endpoint_free(&second_ep, NULL);
5042 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01005043}
5044/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005045
Andrzej Kurek9113df82023-01-19 18:26:31 -05005046/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_ECP_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine449bd832023-01-11 14:50:10 +01005047void handshake_version(int dtls, int client_min_version, int client_max_version,
5048 int server_min_version, int server_max_version,
5049 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005050{
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005051 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005052 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005053
Paul Elliottc8570442020-04-15 17:00:50 +01005054 options.client_min_version = client_min_version;
5055 options.client_max_version = client_max_version;
5056 options.server_min_version = server_min_version;
5057 options.server_max_version = server_max_version;
Paul Elliottc8570442020-04-15 17:00:50 +01005058 options.expected_negotiated_version = expected_negotiated_version;
5059
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005060 options.dtls = dtls;
Gilles Peskine449bd832023-01-11 14:50:10 +01005061 perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005062
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005063 /* The goto below is used to avoid an "unused label" warning.*/
5064 goto exit;
Andrzej Kureke11acb22022-06-27 06:11:34 -04005065
5066exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005067 free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005068}
5069/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05005070
Ronald Crone68ab4f2022-10-05 12:46:29 +02005071/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01005072void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005073{
5074 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005075 init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005076
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005077 options.cipher = cipher;
5078 options.dtls = dtls;
5079 options.psk_str = psk_str;
5080 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05005081
Gilles Peskine449bd832023-01-11 14:50:10 +01005082 perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05005083
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005084 /* The goto below is used to avoid an "unused label" warning.*/
5085 goto exit;
Andrzej Kureke11acb22022-06-27 06:11:34 -04005086
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04005087exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005088 free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005089}
5090/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05005091
Ronald Crone68ab4f2022-10-05 12:46:29 +02005092/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01005093void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005094{
Gilles Peskine449bd832023-01-11 14:50:10 +01005095 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005096
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005097 /* The goto below is used to avoid an "unused label" warning.*/
5098 goto exit;
5099}
5100/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005101
Ronald Crone68ab4f2022-10-05 12:46:29 +02005102/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01005103void handshake_ciphersuite_select(char *cipher, int pk_alg, data_t *psk_str,
5104 int psa_alg, int psa_alg2, int psa_usage,
5105 int expected_handshake_result,
5106 int expected_ciphersuite)
Neil Armstrong8c52ed82022-05-27 13:14:55 +02005107{
5108 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005109 init_handshake_options(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02005110
5111 options.cipher = cipher;
Neil Armstrongdb134972022-06-30 09:06:28 +02005112 options.psk_str = psk_str;
Neil Armstrong8c52ed82022-05-27 13:14:55 +02005113 options.pk_alg = pk_alg;
5114 options.opaque_alg = psa_alg;
5115 options.opaque_alg2 = psa_alg2;
5116 options.opaque_usage = psa_usage;
5117 options.expected_handshake_result = expected_handshake_result;
5118 options.expected_ciphersuite = expected_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01005119 perform_handshake(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02005120
5121 /* The goto below is used to avoid an "unused label" warning.*/
5122 goto exit;
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04005123
5124exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005125 free_handshake_options(&options);
Neil Armstrong8c52ed82022-05-27 13:14:55 +02005126}
5127/* END_CASE */
5128
Ronald Crone68ab4f2022-10-05 12:46:29 +02005129/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01005130void app_data(int mfl, int cli_msg_len, int srv_msg_len,
5131 int expected_cli_fragments,
5132 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005133{
5134 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005135 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005136
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005137 options.mfl = mfl;
5138 options.cli_msg_len = cli_msg_len;
5139 options.srv_msg_len = srv_msg_len;
5140 options.expected_cli_fragments = expected_cli_fragments;
5141 options.expected_srv_fragments = expected_srv_fragments;
5142 options.dtls = dtls;
Gilles Peskine449bd832023-01-11 14:50:10 +01005143#if !defined(MBEDTLS_SSL_PROTO_TLS1_2)
Ronald Cron21a1b2d2022-06-15 17:11:35 +02005144 options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_3;
5145#endif
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005146
Gilles Peskine449bd832023-01-11 14:50:10 +01005147 perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04005148
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005149 /* The goto below is used to avoid an "unused label" warning.*/
5150 goto exit;
Andrzej Kurek780dc182022-06-10 08:57:19 -04005151
5152exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005153 free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005154}
5155/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005156
Andrzej Kurek714ae652022-11-02 19:07:19 -04005157/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_ECP_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine449bd832023-01-11 14:50:10 +01005158void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
5159 int expected_cli_fragments,
5160 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005161{
Gilles Peskine449bd832023-01-11 14:50:10 +01005162 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
5163 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005164 /* The goto below is used to avoid an "unused label" warning.*/
5165 goto exit;
5166}
5167/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005168
Andrzej Kurek9113df82023-01-19 18:26:31 -05005169/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine449bd832023-01-11 14:50:10 +01005170void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
5171 int expected_cli_fragments,
5172 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005173{
Gilles Peskine449bd832023-01-11 14:50:10 +01005174 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
5175 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005176 /* The goto below is used to avoid an "unused label" warning.*/
5177 goto exit;
5178}
5179/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005180
Andrzej Kurek9113df82023-01-19 18:26:31 -05005181/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3: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_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine449bd832023-01-11 14:50:10 +01005182void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005183{
5184 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005185 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005186
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005187 options.serialize = 1;
5188 options.dtls = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01005189 perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005190 /* The goto below is used to avoid an "unused label" warning.*/
5191 goto exit;
Andrzej Kurek6e518ab2022-06-11 05:08:38 -04005192exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005193 free_handshake_options(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005194}
5195/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005196
Andrzej Kureka86cef32023-01-19 18:27:57 -05005197/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01005198void handshake_fragmentation(int mfl,
5199 int expected_srv_hs_fragmentation,
5200 int expected_cli_hs_fragmentation)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005201{
5202 handshake_test_options options;
5203 log_pattern srv_pattern, cli_pattern;
5204
5205 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
5206 srv_pattern.counter = 0;
5207 cli_pattern.counter = 0;
5208
Gilles Peskine449bd832023-01-11 14:50:10 +01005209 init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005210 options.dtls = 1;
5211 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00005212 /* Set cipher to one using CBC so that record splitting can be tested */
5213 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005214 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
5215 options.srv_log_obj = &srv_pattern;
5216 options.cli_log_obj = &cli_pattern;
5217 options.srv_log_fun = log_analyzer;
5218 options.cli_log_fun = log_analyzer;
5219
Gilles Peskine449bd832023-01-11 14:50:10 +01005220 perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005221
5222 /* Test if the server received a fragmented handshake */
Gilles Peskine449bd832023-01-11 14:50:10 +01005223 if (expected_srv_hs_fragmentation) {
5224 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005225 }
5226 /* Test if the client received a fragmented handshake */
Gilles Peskine449bd832023-01-11 14:50:10 +01005227 if (expected_cli_hs_fragmentation) {
5228 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005229 }
Andrzej Kurek780dc182022-06-10 08:57:19 -04005230
5231exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005232 free_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01005233}
5234/* END_CASE */
5235
Andrzej Kurek9113df82023-01-19 18:26:31 -05005236/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine449bd832023-01-11 14:50:10 +01005237void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005238{
5239 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005240 init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05005241
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005242 options.renegotiate = 1;
5243 options.legacy_renegotiation = legacy_renegotiation;
5244 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05005245
Gilles Peskine449bd832023-01-11 14:50:10 +01005246 perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04005247
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05005248 /* The goto below is used to avoid an "unused label" warning.*/
5249 goto exit;
Andrzej Kurekddb8cd62022-07-04 16:07:28 -04005250exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005251 free_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05005252}
5253/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005254
Ronald Crone68ab4f2022-10-05 12:46:29 +02005255/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01005256void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
5257 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005258{
5259 handshake_test_options options;
Gilles Peskine449bd832023-01-11 14:50:10 +01005260 init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005261
5262 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04005263 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005264 options.renegotiate = renegotiation;
5265 options.legacy_renegotiation = legacy_renegotiation;
5266 options.serialize = serialize;
5267 options.dtls = dtls;
5268 options.resize_buffers = 1;
5269
Gilles Peskine449bd832023-01-11 14:50:10 +01005270 perform_handshake(&options);
Andrzej Kurek780dc182022-06-10 08:57:19 -04005271
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005272 /* The goto below is used to avoid an "unused label" warning.*/
5273 goto exit;
Andrzej Kurek780dc182022-06-10 08:57:19 -04005274exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005275 free_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005276}
5277/* END_CASE */
5278
Andrzej Kurek9113df82023-01-19 18:26:31 -05005279/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3: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_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine449bd832023-01-11 14:50:10 +01005280void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005281{
Gilles Peskine449bd832023-01-11 14:50:10 +01005282 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
5283 (char *) "");
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005284
5285 /* The goto below is used to avoid an "unused label" warning.*/
5286 goto exit;
5287}
5288/* END_CASE */
5289
Andrzej Kurek9113df82023-01-19 18:26:31 -05005290/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine449bd832023-01-11 14:50:10 +01005291void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
5292 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005293{
Gilles Peskine449bd832023-01-11 14:50:10 +01005294 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005295
5296 /* The goto below is used to avoid an "unused label" warning.*/
5297 goto exit;
5298}
5299/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005300
Ronald Cron73fe8df2022-10-05 14:31:43 +02005301/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
Hanno Becker6667ffd2021-04-19 21:59:22 +01005302void test_multiple_psks()
5303{
5304 unsigned char psk0[10] = { 0 };
5305 unsigned char psk0_identity[] = { 'f', 'o', 'o' };
5306
5307 unsigned char psk1[10] = { 0 };
5308 unsigned char psk1_identity[] = { 'b', 'a', 'r' };
5309
5310 mbedtls_ssl_config conf;
5311
Gilles Peskine449bd832023-01-11 14:50:10 +01005312 USE_PSA_INIT();
5313 mbedtls_ssl_config_init(&conf);
Hanno Becker6667ffd2021-04-19 21:59:22 +01005314
Gilles Peskine449bd832023-01-11 14:50:10 +01005315 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
5316 psk0, sizeof(psk0),
5317 psk0_identity, sizeof(psk0_identity)) == 0);
5318 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
5319 psk1, sizeof(psk1),
5320 psk1_identity, sizeof(psk1_identity)) ==
5321 MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01005322
5323exit:
5324
Gilles Peskine449bd832023-01-11 14:50:10 +01005325 mbedtls_ssl_config_free(&conf);
Neil Armstrong4c3b4e02022-05-03 09:24:26 +02005326
Gilles Peskine449bd832023-01-11 14:50:10 +01005327 USE_PSA_DONE();
Hanno Becker6667ffd2021-04-19 21:59:22 +01005328}
5329/* END_CASE */
5330
Ronald Cron73fe8df2022-10-05 14:31:43 +02005331/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED:MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01005332void test_multiple_psks_opaque(int mode)
Hanno Becker6667ffd2021-04-19 21:59:22 +01005333{
5334 /*
5335 * Mode 0: Raw PSK, then opaque PSK
5336 * Mode 1: Opaque PSK, then raw PSK
5337 * Mode 2: 2x opaque PSK
5338 */
5339
5340 unsigned char psk0_raw[10] = { 0 };
5341 unsigned char psk0_raw_identity[] = { 'f', 'o', 'o' };
5342
Gilles Peskine449bd832023-01-11 14:50:10 +01005343 mbedtls_svc_key_id_t psk0_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 1);
Andrzej Kurek03e01462022-01-03 12:53:24 +01005344
Hanno Becker6667ffd2021-04-19 21:59:22 +01005345 unsigned char psk0_opaque_identity[] = { 'f', 'o', 'o' };
5346
5347 unsigned char psk1_raw[10] = { 0 };
5348 unsigned char psk1_raw_identity[] = { 'b', 'a', 'r' };
5349
Gilles Peskine449bd832023-01-11 14:50:10 +01005350 mbedtls_svc_key_id_t psk1_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 2);
Andrzej Kurek03e01462022-01-03 12:53:24 +01005351
Hanno Becker6667ffd2021-04-19 21:59:22 +01005352 unsigned char psk1_opaque_identity[] = { 'b', 'a', 'r' };
5353
5354 mbedtls_ssl_config conf;
5355
Gilles Peskine449bd832023-01-11 14:50:10 +01005356 USE_PSA_INIT();
5357 mbedtls_ssl_config_init(&conf);
Hanno Becker6667ffd2021-04-19 21:59:22 +01005358
Gilles Peskine449bd832023-01-11 14:50:10 +01005359 switch (mode) {
Hanno Becker6667ffd2021-04-19 21:59:22 +01005360 case 0:
5361
Gilles Peskine449bd832023-01-11 14:50:10 +01005362 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
5363 psk0_raw, sizeof(psk0_raw),
5364 psk0_raw_identity, sizeof(psk0_raw_identity))
5365 == 0);
5366 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
5367 psk1_opaque,
5368 psk1_opaque_identity,
5369 sizeof(psk1_opaque_identity))
5370 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01005371 break;
5372
5373 case 1:
5374
Gilles Peskine449bd832023-01-11 14:50:10 +01005375 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
5376 psk0_opaque,
5377 psk0_opaque_identity,
5378 sizeof(psk0_opaque_identity))
5379 == 0);
5380 TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
5381 psk1_raw, sizeof(psk1_raw),
5382 psk1_raw_identity, sizeof(psk1_raw_identity))
5383 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01005384
5385 break;
5386
5387 case 2:
5388
Gilles Peskine449bd832023-01-11 14:50:10 +01005389 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
5390 psk0_opaque,
5391 psk0_opaque_identity,
5392 sizeof(psk0_opaque_identity))
5393 == 0);
5394 TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
5395 psk1_opaque,
5396 psk1_opaque_identity,
5397 sizeof(psk1_opaque_identity))
5398 == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
Hanno Becker6667ffd2021-04-19 21:59:22 +01005399
5400 break;
5401
5402 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01005403 TEST_ASSERT(0);
Hanno Becker6667ffd2021-04-19 21:59:22 +01005404 break;
5405 }
5406
5407exit:
5408
Gilles Peskine449bd832023-01-11 14:50:10 +01005409 mbedtls_ssl_config_free(&conf);
5410 USE_PSA_DONE();
Hanno Becker6667ffd2021-04-19 21:59:22 +01005411
5412}
5413/* END_CASE */
Brett Warren7f813d52021-10-20 23:08:38 +01005414
Ronald Cron37bdaab2022-03-30 16:45:51 +02005415/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01005416void conf_version(int endpoint, int transport,
5417 int min_tls_version, int max_tls_version,
5418 int expected_ssl_setup_result)
Ronald Cron37bdaab2022-03-30 16:45:51 +02005419{
5420 mbedtls_ssl_config conf;
5421 mbedtls_ssl_context ssl;
5422
Gilles Peskine449bd832023-01-11 14:50:10 +01005423 mbedtls_ssl_config_init(&conf);
5424 mbedtls_ssl_init(&ssl);
Ronald Cron37bdaab2022-03-30 16:45:51 +02005425
Gilles Peskine449bd832023-01-11 14:50:10 +01005426 mbedtls_ssl_conf_endpoint(&conf, endpoint);
5427 mbedtls_ssl_conf_transport(&conf, transport);
5428 mbedtls_ssl_conf_min_tls_version(&conf, min_tls_version);
5429 mbedtls_ssl_conf_max_tls_version(&conf, max_tls_version);
Ronald Cron37bdaab2022-03-30 16:45:51 +02005430
Gilles Peskine449bd832023-01-11 14:50:10 +01005431 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == expected_ssl_setup_result);
Ronald Cron37bdaab2022-03-30 16:45:51 +02005432
Gilles Peskine449bd832023-01-11 14:50:10 +01005433 mbedtls_ssl_free(&ssl);
5434 mbedtls_ssl_config_free(&conf);
Ronald Cron37bdaab2022-03-30 16:45:51 +02005435}
5436/* END_CASE */
5437
Brett Warren7f813d52021-10-20 23:08:38 +01005438/* BEGIN_CASE depends_on:MBEDTLS_ECP_C:!MBEDTLS_DEPRECATED_REMOVED:!MBEDTLS_DEPRECATED_WARNING:MBEDTLS_ECP_DP_SECP192R1_ENABLED:MBEDTLS_ECP_DP_SECP224R1_ENABLED:MBEDTLS_ECP_DP_SECP256R1_ENABLED */
5439void conf_curve()
5440{
5441
5442 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP192R1,
5443 MBEDTLS_ECP_DP_SECP224R1,
5444 MBEDTLS_ECP_DP_SECP256R1,
5445 MBEDTLS_ECP_DP_NONE };
Tom Cosgrovea327b522022-08-03 08:33:06 +01005446 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
5447 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
5448 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5449 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Brett Warren7f813d52021-10-20 23:08:38 +01005450
5451 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01005452 mbedtls_ssl_config_init(&conf);
Jerry Yubaa49342022-02-15 10:26:40 +08005453#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskine449bd832023-01-11 14:50:10 +01005454 mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
5455 mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
Jerry Yubaa49342022-02-15 10:26:40 +08005456#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005457 mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
5458 mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
Jerry Yubaa49342022-02-15 10:26:40 +08005459#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005460 mbedtls_ssl_conf_curves(&conf, curve_list);
Brett Warren7f813d52021-10-20 23:08:38 +01005461
5462 mbedtls_ssl_context ssl;
Gilles Peskine449bd832023-01-11 14:50:10 +01005463 mbedtls_ssl_init(&ssl);
5464 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Brett Warren7f813d52021-10-20 23:08:38 +01005465
Gilles Peskine449bd832023-01-11 14:50:10 +01005466 TEST_ASSERT(ssl.handshake != NULL && ssl.handshake->group_list != NULL);
5467 TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list == NULL);
Brett Warren7f813d52021-10-20 23:08:38 +01005468
Gilles Peskine449bd832023-01-11 14:50:10 +01005469 TEST_EQUAL(ssl.handshake->group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
5470 MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
Brett Warren7f813d52021-10-20 23:08:38 +01005471
Gilles Peskine449bd832023-01-11 14:50:10 +01005472 for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
5473 TEST_EQUAL(iana_tls_group_list[i], ssl.handshake->group_list[i]);
5474 }
Brett Warren7f813d52021-10-20 23:08:38 +01005475
Gilles Peskine449bd832023-01-11 14:50:10 +01005476 mbedtls_ssl_free(&ssl);
5477 mbedtls_ssl_config_free(&conf);
Brett Warren7f813d52021-10-20 23:08:38 +01005478}
5479/* END_CASE */
5480
5481/* BEGIN_CASE depends_on:MBEDTLS_DEPRECATED_REMOVED */
5482void conf_group()
5483{
5484 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
Gilles Peskine449bd832023-01-11 14:50:10 +01005485 MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
5486 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5487 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Brett Warren7f813d52021-10-20 23:08:38 +01005488
5489 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01005490 mbedtls_ssl_config_init(&conf);
Brett Warren7f813d52021-10-20 23:08:38 +01005491
Gilles Peskine449bd832023-01-11 14:50:10 +01005492 mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
5493 mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
Brett Warren7f813d52021-10-20 23:08:38 +01005494
Gilles Peskine449bd832023-01-11 14:50:10 +01005495 mbedtls_ssl_conf_groups(&conf, iana_tls_group_list);
Brett Warren7f813d52021-10-20 23:08:38 +01005496
5497 mbedtls_ssl_context ssl;
Gilles Peskine449bd832023-01-11 14:50:10 +01005498 mbedtls_ssl_init(&ssl);
5499 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Brett Warren7f813d52021-10-20 23:08:38 +01005500
Gilles Peskine449bd832023-01-11 14:50:10 +01005501 TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list != NULL);
Brett Warren7f813d52021-10-20 23:08:38 +01005502
Gilles Peskine449bd832023-01-11 14:50:10 +01005503 TEST_EQUAL(ssl.conf->group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
5504 MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
Brett Warren7f813d52021-10-20 23:08:38 +01005505
Gilles Peskine449bd832023-01-11 14:50:10 +01005506 for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
5507 TEST_EQUAL(iana_tls_group_list[i], ssl.conf->group_list[i]);
5508 }
Brett Warren7f813d52021-10-20 23:08:38 +01005509
Gilles Peskine449bd832023-01-11 14:50:10 +01005510 mbedtls_ssl_free(&ssl);
5511 mbedtls_ssl_config_free(&conf);
Brett Warren7f813d52021-10-20 23:08:38 +01005512}
5513/* END_CASE */
Paul Elliottb9af2db2022-03-09 15:34:37 +00005514
Ronald Crone68ab4f2022-10-05 12:46:29 +02005515/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_CACHE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Gilles Peskine449bd832023-01-11 14:50:10 +01005516void force_bad_session_id_len()
Andrzej Kurek514683a2022-06-10 10:33:05 -04005517{
5518 enum { BUFFSIZE = 1024 };
5519 handshake_test_options options;
5520 mbedtls_endpoint client, server;
5521 log_pattern srv_pattern, cli_pattern;
5522 mbedtls_test_message_socket_context server_context, client_context;
5523
5524 srv_pattern.pattern = cli_pattern.pattern = "cache did not store session";
5525 srv_pattern.counter = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01005526 init_handshake_options(&options);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005527
5528 options.srv_log_obj = &srv_pattern;
5529 options.srv_log_fun = log_analyzer;
5530
Gilles Peskine449bd832023-01-11 14:50:10 +01005531 USE_PSA_INIT();
5532 mbedtls_platform_zeroize(&client, sizeof(client));
5533 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurek514683a2022-06-10 10:33:05 -04005534
Gilles Peskine449bd832023-01-11 14:50:10 +01005535 mbedtls_message_socket_init(&server_context);
5536 mbedtls_message_socket_init(&client_context);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005537
Gilles Peskine449bd832023-01-11 14:50:10 +01005538 TEST_ASSERT(mbedtls_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
5539 &options, NULL, NULL,
5540 NULL, NULL) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005541
Gilles Peskine449bd832023-01-11 14:50:10 +01005542 TEST_ASSERT(mbedtls_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
5543 &options, NULL, NULL, NULL,
5544 NULL) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005545
Gilles Peskine449bd832023-01-11 14:50:10 +01005546 mbedtls_debug_set_threshold(1);
5547 mbedtls_ssl_conf_dbg(&server.conf, options.srv_log_fun,
5548 options.srv_log_obj);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005549
Gilles Peskine449bd832023-01-11 14:50:10 +01005550 TEST_ASSERT(mbedtls_mock_socket_connect(&(client.socket),
5551 &(server.socket),
5552 BUFFSIZE) == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005553
Gilles Peskine449bd832023-01-11 14:50:10 +01005554 TEST_ASSERT(mbedtls_move_handshake_to_state(&(client.ssl),
5555 &(server.ssl),
5556 MBEDTLS_SSL_HANDSHAKE_WRAPUP)
5557 == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005558 /* Force a bad session_id_len that will be read by the server in
5559 * mbedtls_ssl_cache_set. */
5560 server.ssl.session_negotiate->id_len = 33;
Gilles Peskine449bd832023-01-11 14:50:10 +01005561 if (options.cli_msg_len != 0 || options.srv_msg_len != 0) {
Andrzej Kurek514683a2022-06-10 10:33:05 -04005562 /* Start data exchanging test */
Gilles Peskine449bd832023-01-11 14:50:10 +01005563 TEST_ASSERT(mbedtls_exchange_data(&(client.ssl), options.cli_msg_len,
5564 options.expected_cli_fragments,
5565 &(server.ssl), options.srv_msg_len,
5566 options.expected_srv_fragments)
5567 == 0);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005568 }
Andrzej Kurek514683a2022-06-10 10:33:05 -04005569
5570 /* Make sure that the cache did not store the session */
Gilles Peskine449bd832023-01-11 14:50:10 +01005571 TEST_EQUAL(srv_pattern.counter, 1);
Andrzej Kurek514683a2022-06-10 10:33:05 -04005572exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005573 mbedtls_endpoint_free(&client, NULL);
5574 mbedtls_endpoint_free(&server, NULL);
5575 free_handshake_options(&options);
5576 mbedtls_debug_set_threshold(0);
5577 USE_PSA_DONE();
Andrzej Kurek514683a2022-06-10 10:33:05 -04005578}
5579/* END_CASE */
5580
Andrzej Kureked4d2172022-06-08 11:57:57 -04005581/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine449bd832023-01-11 14:50:10 +01005582void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurekcfb01942022-06-06 13:08:23 -04005583{
5584 mbedtls_ssl_context ssl;
5585 mbedtls_ssl_config conf;
5586 size_t len;
5587
Gilles Peskine449bd832023-01-11 14:50:10 +01005588 mbedtls_ssl_init(&ssl);
5589 mbedtls_ssl_config_init(&conf);
5590 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
5591 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
5592 MBEDTLS_SSL_PRESET_DEFAULT),
5593 0);
Andrzej Kurekcfb01942022-06-06 13:08:23 -04005594
Gilles Peskine449bd832023-01-11 14:50:10 +01005595 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
5596 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
5597 ssl.cli_id_len,
5598 cookie->x, cookie->len,
5599 ssl.out_buf,
5600 MBEDTLS_SSL_OUT_CONTENT_LEN,
5601 &len),
5602 exp_ret);
Andrzej Kurekcfb01942022-06-06 13:08:23 -04005603
Gilles Peskine449bd832023-01-11 14:50:10 +01005604 mbedtls_ssl_free(&ssl);
5605 mbedtls_ssl_config_free(&conf);
Andrzej Kurekcfb01942022-06-06 13:08:23 -04005606}
5607/* END_CASE */
5608
Paul Elliottb9af2db2022-03-09 15:34:37 +00005609/* BEGIN_CASE depends_on:MBEDTLS_TIMING_C:MBEDTLS_HAVE_TIME */
Gilles Peskine449bd832023-01-11 14:50:10 +01005610void timing_final_delay_accessor()
Paul Elliottb9af2db2022-03-09 15:34:37 +00005611{
5612 mbedtls_timing_delay_context delay_context;
5613
Gilles Peskine449bd832023-01-11 14:50:10 +01005614 mbedtls_timing_set_delay(&delay_context, 50, 100);
Paul Elliottb9af2db2022-03-09 15:34:37 +00005615
Gilles Peskine449bd832023-01-11 14:50:10 +01005616 TEST_ASSERT(mbedtls_timing_get_final_delay(&delay_context) == 100);
Paul Elliottb9af2db2022-03-09 15:34:37 +00005617}
5618/* END_CASE */
Paul Elliott02758a52022-03-16 14:32:33 +00005619
5620/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_CONNECTION_ID */
Gilles Peskine449bd832023-01-11 14:50:10 +01005621void cid_sanity()
Paul Elliott02758a52022-03-16 14:32:33 +00005622{
5623 mbedtls_ssl_context ssl;
5624 mbedtls_ssl_config conf;
5625
5626 unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
5627 unsigned char test_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
5628 int cid_enabled;
5629 size_t own_cid_len;
5630
Gilles Peskine449bd832023-01-11 14:50:10 +01005631 mbedtls_test_rnd_std_rand(NULL, own_cid, sizeof(own_cid));
Paul Elliott02758a52022-03-16 14:32:33 +00005632
Gilles Peskine449bd832023-01-11 14:50:10 +01005633 mbedtls_ssl_init(&ssl);
5634 mbedtls_ssl_config_init(&conf);
Paul Elliott02758a52022-03-16 14:32:33 +00005635
Gilles Peskine449bd832023-01-11 14:50:10 +01005636 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
5637 MBEDTLS_SSL_IS_CLIENT,
5638 MBEDTLS_SSL_TRANSPORT_STREAM,
5639 MBEDTLS_SSL_PRESET_DEFAULT)
5640 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005641
Gilles Peskine449bd832023-01-11 14:50:10 +01005642 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005643
5644 /* Can't use CID functions with stream transport. */
Gilles Peskine449bd832023-01-11 14:50:10 +01005645 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
5646 sizeof(own_cid))
5647 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00005648
Gilles Peskine449bd832023-01-11 14:50:10 +01005649 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
5650 &own_cid_len)
5651 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00005652
Gilles Peskine449bd832023-01-11 14:50:10 +01005653 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
5654 MBEDTLS_SSL_IS_CLIENT,
5655 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
5656 MBEDTLS_SSL_PRESET_DEFAULT)
5657 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005658
5659 /* Attempt to set config cid size too big. */
Gilles Peskine449bd832023-01-11 14:50:10 +01005660 TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, MBEDTLS_SSL_CID_IN_LEN_MAX + 1,
5661 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
5662 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00005663
Gilles Peskine449bd832023-01-11 14:50:10 +01005664 TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, sizeof(own_cid),
5665 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
5666 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005667
5668 /* Attempt to set CID length not matching config. */
Gilles Peskine449bd832023-01-11 14:50:10 +01005669 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
5670 MBEDTLS_SSL_CID_IN_LEN_MAX - 1)
5671 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Paul Elliott02758a52022-03-16 14:32:33 +00005672
Gilles Peskine449bd832023-01-11 14:50:10 +01005673 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
5674 sizeof(own_cid))
5675 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005676
5677 /* Test we get back what we put in. */
Gilles Peskine449bd832023-01-11 14:50:10 +01005678 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
5679 &own_cid_len)
5680 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005681
Gilles Peskine449bd832023-01-11 14:50:10 +01005682 TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_ENABLED);
5683 ASSERT_COMPARE(own_cid, own_cid_len, test_cid, own_cid_len);
Paul Elliott02758a52022-03-16 14:32:33 +00005684
5685 /* Test disabling works. */
Gilles Peskine449bd832023-01-11 14:50:10 +01005686 TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_DISABLED, NULL,
5687 0)
5688 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005689
Gilles Peskine449bd832023-01-11 14:50:10 +01005690 TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
5691 &own_cid_len)
5692 == 0);
Paul Elliott02758a52022-03-16 14:32:33 +00005693
Gilles Peskine449bd832023-01-11 14:50:10 +01005694 TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_DISABLED);
Paul Elliott02758a52022-03-16 14:32:33 +00005695
Gilles Peskine449bd832023-01-11 14:50:10 +01005696 mbedtls_ssl_free(&ssl);
5697 mbedtls_ssl_config_free(&conf);
Paul Elliott02758a52022-03-16 14:32:33 +00005698}
5699/* END_CASE */
5700
Valerio Setti2f081472023-02-23 17:36:06 +01005701/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_PK_CAN_ECDSA_SOME */
Gilles Peskine449bd832023-01-11 14:50:10 +01005702void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb3427822022-03-08 06:55:42 -05005703{
5704 enum { BUFFSIZE = 17000 };
5705 mbedtls_endpoint client, server;
5706 mbedtls_psa_stats_t stats;
Andrzej Kurek39d88d42022-03-31 06:30:54 -04005707 size_t free_slots_before = -1;
Andrzej Kurek626a9312022-06-10 11:07:39 -04005708 handshake_test_options options;
Andrzej Kurekb3427822022-03-08 06:55:42 -05005709
Andrzej Kurekcc28e9a2022-03-08 18:36:35 -05005710 uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5711 MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
Gilles Peskine449bd832023-01-11 14:50:10 +01005712 USE_PSA_INIT();
5713 mbedtls_platform_zeroize(&client, sizeof(client));
5714 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb3427822022-03-08 06:55:42 -05005715
Gilles Peskine449bd832023-01-11 14:50:10 +01005716 init_handshake_options(&options);
Andrzej Kurek626a9312022-06-10 11:07:39 -04005717 options.pk_alg = MBEDTLS_PK_ECDSA;
5718
Andrzej Kurekb3427822022-03-08 06:55:42 -05005719 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek83e60ee2022-04-14 08:51:41 -04005720 * the raw key agreement. Flipping the first byte makes the
5721 * required 0x04 identifier invalid. */
Gilles Peskine449bd832023-01-11 14:50:10 +01005722 TEST_EQUAL(mbedtls_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
5723 &options, NULL, NULL,
5724 NULL, iana_tls_group_list), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05005725
5726 /* Server side */
Gilles Peskine449bd832023-01-11 14:50:10 +01005727 TEST_EQUAL(mbedtls_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
5728 &options, NULL, NULL,
5729 NULL, NULL), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05005730
Gilles Peskine449bd832023-01-11 14:50:10 +01005731 TEST_EQUAL(mbedtls_mock_socket_connect(&(client.socket),
5732 &(server.socket),
5733 BUFFSIZE), 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05005734
Gilles Peskine449bd832023-01-11 14:50:10 +01005735 TEST_EQUAL(mbedtls_move_handshake_to_state(&(client.ssl),
5736 &(server.ssl),
5737 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE)
5738 , 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05005739
Gilles Peskine449bd832023-01-11 14:50:10 +01005740 mbedtls_psa_get_stats(&stats);
Andrzej Kurek39d88d42022-03-31 06:30:54 -04005741 /* Save the number of slots in use up to this point.
5742 * With PSA, one can be used for the ECDH private key. */
5743 free_slots_before = stats.empty_slots;
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04005744
Gilles Peskine449bd832023-01-11 14:50:10 +01005745 if (bad_server_ecdhe_key) {
Gilles Peskineb4f874d2022-04-08 16:48:09 -04005746 /* Force a simulated bitflip in the server key. to make the
5747 * raw key agreement in ssl_write_client_key_exchange fail. */
5748 (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
5749 }
Andrzej Kurekb3427822022-03-08 06:55:42 -05005750
Gilles Peskine449bd832023-01-11 14:50:10 +01005751 TEST_EQUAL(mbedtls_move_handshake_to_state(&(client.ssl),
5752 &(server.ssl),
5753 MBEDTLS_SSL_HANDSHAKE_OVER),
5754 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb3427822022-03-08 06:55:42 -05005755
Gilles Peskine449bd832023-01-11 14:50:10 +01005756 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb3427822022-03-08 06:55:42 -05005757
Gilles Peskineb4f874d2022-04-08 16:48:09 -04005758 /* Make sure that the key slot is already destroyed in case of failure,
5759 * without waiting to close the connection. */
Gilles Peskine449bd832023-01-11 14:50:10 +01005760 if (bad_server_ecdhe_key) {
5761 TEST_EQUAL(free_slots_before, stats.empty_slots);
5762 }
Andrzej Kurekb3427822022-03-08 06:55:42 -05005763
5764exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005765 mbedtls_endpoint_free(&client, NULL);
5766 mbedtls_endpoint_free(&server, NULL);
5767 free_handshake_options(&options);
Andrzej Kurekcb33bc52022-03-31 07:17:18 -04005768
Gilles Peskine449bd832023-01-11 14:50:10 +01005769 USE_PSA_DONE();
Andrzej Kurekb3427822022-03-08 06:55:42 -05005770}
5771/* END_CASE */
Ronald Crone68ab4f2022-10-05 12:46:29 +02005772/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_SSL_PROTO_TLS1_3:!MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_ECP_DP_SECP384R1_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01005773void tls13_server_certificate_msg_invalid_vector_len()
Ronald Crone3dac4a2022-06-10 17:21:51 +02005774{
5775 int ret = -1;
5776 mbedtls_endpoint client_ep, server_ep;
5777 unsigned char *buf, *end;
5778 size_t buf_len;
5779 int step = 0;
5780 int expected_result;
Ronald Crone7b9b6b2022-06-10 17:24:31 +02005781 mbedtls_ssl_chk_buf_ptr_args expected_chk_buf_ptr_args;
Paul Elliott9a8d7842022-07-10 12:48:57 +01005782 handshake_test_options client_options;
5783 handshake_test_options server_options;
Ronald Crone3dac4a2022-06-10 17:21:51 +02005784
5785 /*
5786 * Test set-up
5787 */
Gilles Peskine449bd832023-01-11 14:50:10 +01005788 USE_PSA_INIT();
5789 mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
5790 mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
Ronald Crone3dac4a2022-06-10 17:21:51 +02005791
Gilles Peskine449bd832023-01-11 14:50:10 +01005792 init_handshake_options(&client_options);
Paul Elliott9a8d7842022-07-10 12:48:57 +01005793 client_options.pk_alg = MBEDTLS_PK_ECDSA;
Gilles Peskine449bd832023-01-11 14:50:10 +01005794 ret = mbedtls_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
5795 &client_options, NULL, NULL, NULL, NULL);
5796 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005797
Gilles Peskine449bd832023-01-11 14:50:10 +01005798 init_handshake_options(&server_options);
Paul Elliott9a8d7842022-07-10 12:48:57 +01005799 server_options.pk_alg = MBEDTLS_PK_ECDSA;
Gilles Peskine449bd832023-01-11 14:50:10 +01005800 ret = mbedtls_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
5801 &server_options, NULL, NULL, NULL, NULL);
5802 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005803
Gilles Peskine449bd832023-01-11 14:50:10 +01005804 ret = mbedtls_mock_socket_connect(&(client_ep.socket),
5805 &(server_ep.socket), 1024);
5806 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005807
Gilles Peskine449bd832023-01-11 14:50:10 +01005808 while (1) {
5809 mbedtls_test_set_step(++step);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005810
Gilles Peskine449bd832023-01-11 14:50:10 +01005811 ret = mbedtls_move_handshake_to_state(&(server_ep.ssl),
5812 &(client_ep.ssl),
5813 MBEDTLS_SSL_CERTIFICATE_VERIFY);
5814 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005815
Gilles Peskine449bd832023-01-11 14:50:10 +01005816 ret = mbedtls_ssl_flush_output(&(server_ep.ssl));
5817 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005818
Gilles Peskine449bd832023-01-11 14:50:10 +01005819 ret = mbedtls_move_handshake_to_state(&(client_ep.ssl),
5820 &(server_ep.ssl),
5821 MBEDTLS_SSL_SERVER_CERTIFICATE);
5822 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005823
Gilles Peskine449bd832023-01-11 14:50:10 +01005824 ret = mbedtls_ssl_tls13_fetch_handshake_msg(&(client_ep.ssl),
5825 MBEDTLS_SSL_HS_CERTIFICATE,
5826 &buf, &buf_len);
5827 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005828
5829 end = buf + buf_len;
5830
5831 /*
5832 * Tweak server Certificate message and parse it.
5833 */
5834
5835 ret = tweak_tls13_certificate_msg_vector_len(
Gilles Peskine449bd832023-01-11 14:50:10 +01005836 buf, &end, step, &expected_result, &expected_chk_buf_ptr_args);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005837
Gilles Peskine449bd832023-01-11 14:50:10 +01005838 if (ret != 0) {
Ronald Crone3dac4a2022-06-10 17:21:51 +02005839 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01005840 }
Ronald Crone3dac4a2022-06-10 17:21:51 +02005841
Gilles Peskine449bd832023-01-11 14:50:10 +01005842 ret = mbedtls_ssl_tls13_parse_certificate(&(client_ep.ssl), buf, end);
5843 TEST_EQUAL(ret, expected_result);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005844
Gilles Peskine449bd832023-01-11 14:50:10 +01005845 TEST_ASSERT(mbedtls_ssl_cmp_chk_buf_ptr_fail_args(
5846 &expected_chk_buf_ptr_args) == 0);
Ronald Crone7b9b6b2022-06-10 17:24:31 +02005847
Gilles Peskine449bd832023-01-11 14:50:10 +01005848 mbedtls_ssl_reset_chk_buf_ptr_fail_args();
Ronald Crone7b9b6b2022-06-10 17:24:31 +02005849
Gilles Peskine449bd832023-01-11 14:50:10 +01005850 ret = mbedtls_ssl_session_reset(&(client_ep.ssl));
5851 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005852
Gilles Peskine449bd832023-01-11 14:50:10 +01005853 ret = mbedtls_ssl_session_reset(&(server_ep.ssl));
5854 TEST_EQUAL(ret, 0);
Ronald Crone3dac4a2022-06-10 17:21:51 +02005855 }
5856
5857exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01005858 mbedtls_ssl_reset_chk_buf_ptr_fail_args();
5859 mbedtls_endpoint_free(&client_ep, NULL);
5860 mbedtls_endpoint_free(&server_ep, NULL);
5861 free_handshake_options(&client_options);
5862 free_handshake_options(&server_options);
5863 USE_PSA_DONE();
Ronald Crone3dac4a2022-06-10 17:21:51 +02005864}
5865/* END_CASE */
Valerio Setti4452e982022-12-01 15:08:35 +01005866
5867/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +01005868void ssl_ecjpake_set_password(int use_opaque_arg)
Valerio Setti4452e982022-12-01 15:08:35 +01005869{
5870 mbedtls_ssl_context ssl;
5871 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +01005872#if defined(MBEDTLS_USE_PSA_CRYPTO)
Valerio Setti4452e982022-12-01 15:08:35 +01005873 mbedtls_svc_key_id_t pwd_slot = MBEDTLS_SVC_KEY_ID_INIT;
5874#else /* MBEDTLS_USE_PSA_CRYPTO */
5875 (void) use_opaque_arg;
5876#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01005877 unsigned char pwd_string[sizeof(ECJPAKE_TEST_PWD)] = "";
Valerio Setti4452e982022-12-01 15:08:35 +01005878 size_t pwd_len = 0;
Valerio Setti4452e982022-12-01 15:08:35 +01005879 int ret;
5880
Gilles Peskine449bd832023-01-11 14:50:10 +01005881 USE_PSA_INIT();
Valerio Setti4452e982022-12-01 15:08:35 +01005882
Gilles Peskine449bd832023-01-11 14:50:10 +01005883 mbedtls_ssl_init(&ssl);
Valerio Setti4452e982022-12-01 15:08:35 +01005884
Valerio Settie7518ba2022-12-02 12:09:43 +01005885 /* test with uninitalized SSL context */
Gilles Peskine449bd832023-01-11 14:50:10 +01005886 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Valerio Setti4452e982022-12-01 15:08:35 +01005887
Gilles Peskine449bd832023-01-11 14:50:10 +01005888 mbedtls_ssl_config_init(&conf);
Valerio Setti4452e982022-12-01 15:08:35 +01005889
Gilles Peskine449bd832023-01-11 14:50:10 +01005890 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf,
5891 MBEDTLS_SSL_IS_CLIENT,
5892 MBEDTLS_SSL_TRANSPORT_STREAM,
5893 MBEDTLS_SSL_PRESET_DEFAULT), 0);
Valerio Setti4452e982022-12-01 15:08:35 +01005894
Gilles Peskine449bd832023-01-11 14:50:10 +01005895 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
Valerio Setti4452e982022-12-01 15:08:35 +01005896
Valerio Settiba22c9c2022-12-06 11:42:33 +01005897 /* test with empty password or unitialized password key (depending on use_opaque_arg) */
Gilles Peskine449bd832023-01-11 14:50:10 +01005898 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Valerio Setti4452e982022-12-01 15:08:35 +01005899
Gilles Peskine449bd832023-01-11 14:50:10 +01005900 pwd_len = strlen(ECJPAKE_TEST_PWD);
5901 memcpy(pwd_string, ECJPAKE_TEST_PWD, pwd_len);
Valerio Setti4452e982022-12-01 15:08:35 +01005902
Gilles Peskine449bd832023-01-11 14:50:10 +01005903#if defined(MBEDTLS_USE_PSA_CRYPTO)
5904 if (use_opaque_arg) {
Valerio Setti4452e982022-12-01 15:08:35 +01005905 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti785116a2022-12-12 11:59:25 +01005906 psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti4452e982022-12-01 15:08:35 +01005907
Valerio Setti2a3ffb42022-12-08 16:27:46 +01005908 /* First try with an invalid usage */
Gilles Peskine449bd832023-01-11 14:50:10 +01005909 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
5910 psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE);
5911 psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD);
Valerio Setti4452e982022-12-01 15:08:35 +01005912
Gilles Peskine449bd832023-01-11 14:50:10 +01005913 PSA_ASSERT(psa_import_key(&attributes, pwd_string,
5914 pwd_len, &pwd_slot));
Valerio Setti2a3ffb42022-12-08 16:27:46 +01005915
Gilles Peskine449bd832023-01-11 14:50:10 +01005916 ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01005917
Valerio Setti9d313df2022-12-09 11:38:59 +01005918 /* check that the opaque key is still valid after failure */
Gilles Peskine449bd832023-01-11 14:50:10 +01005919 TEST_EQUAL(psa_get_key_attributes(pwd_slot, &check_attributes),
5920 PSA_SUCCESS);
Valerio Setti9d313df2022-12-09 11:38:59 +01005921
Gilles Peskine449bd832023-01-11 14:50:10 +01005922 psa_destroy_key(pwd_slot);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01005923
5924 /* Then set the correct usage */
Gilles Peskine449bd832023-01-11 14:50:10 +01005925 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE);
Valerio Setti2a3ffb42022-12-08 16:27:46 +01005926
Gilles Peskine449bd832023-01-11 14:50:10 +01005927 PSA_ASSERT(psa_import_key(&attributes, pwd_string,
5928 pwd_len, &pwd_slot));
Valerio Setti4452e982022-12-01 15:08:35 +01005929 }
5930#endif /* MBEDTLS_USE_PSA_CRYPTO */
5931
Valerio Settie7518ba2022-12-02 12:09:43 +01005932 /* final check which should work without errors */
Gilles Peskine449bd832023-01-11 14:50:10 +01005933 ECJPAKE_TEST_SET_PASSWORD(0);
Valerio Setti4452e982022-12-01 15:08:35 +01005934
Gilles Peskine449bd832023-01-11 14:50:10 +01005935#if defined(MBEDTLS_USE_PSA_CRYPTO)
5936 if (use_opaque_arg) {
5937 psa_destroy_key(pwd_slot);
Valerio Setti31e99bb2022-12-09 14:35:10 +01005938 }
Valerio Settie7518ba2022-12-02 12:09:43 +01005939#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01005940 mbedtls_ssl_free(&ssl);
5941 mbedtls_ssl_config_free(&conf);
Valerio Setti4452e982022-12-01 15:08:35 +01005942
Gilles Peskine449bd832023-01-11 14:50:10 +01005943 USE_PSA_DONE();
Valerio Setti4452e982022-12-01 15:08:35 +01005944}
5945/* END_CASE */
Valerio Setti73260b62023-01-03 12:53:28 +01005946
Valerio Setti2c121852023-01-09 18:00:39 +01005947/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01005948void elliptic_curve_get_properties()
Valerio Setti73260b62023-01-03 12:53:28 +01005949{
5950 psa_ecc_family_t psa_family;
5951 size_t psa_bits;
5952
Gilles Peskine449bd832023-01-11 14:50:10 +01005953 USE_PSA_INIT();
Valerio Setti73260b62023-01-03 12:53:28 +01005954
Gilles Peskine449bd832023-01-11 14:50:10 +01005955#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_521)
5956 TEST_AVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
Valerio Setti73260b62023-01-03 12:53:28 +01005957#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005958 TEST_UNAVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
Valerio Setti73260b62023-01-03 12:53:28 +01005959#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005960#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
5961 TEST_AVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
Valerio Setti73260b62023-01-03 12:53:28 +01005962#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005963 TEST_UNAVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
Valerio Setti73260b62023-01-03 12:53:28 +01005964#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005965#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_384)
5966 TEST_AVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01005967#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005968 TEST_UNAVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01005969#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005970#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
5971 TEST_AVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01005972#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005973 TEST_UNAVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
Valerio Setti73260b62023-01-03 12:53:28 +01005974#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005975#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_256)
5976 TEST_AVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01005977#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005978 TEST_UNAVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01005979#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005980#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_256)
5981 TEST_AVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01005982#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005983 TEST_UNAVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01005984#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005985#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
5986 TEST_AVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01005987#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005988 TEST_UNAVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
Valerio Setti73260b62023-01-03 12:53:28 +01005989#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005990#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_224)
5991 TEST_AVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01005992#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005993 TEST_UNAVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01005994#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01005995#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_224)
5996 TEST_AVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01005997#else
Gilles Peskine449bd832023-01-11 14:50:10 +01005998 TEST_UNAVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
Valerio Setti73260b62023-01-03 12:53:28 +01005999#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01006000#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_192)
6001 TEST_AVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01006002#else
Gilles Peskine449bd832023-01-11 14:50:10 +01006003 TEST_UNAVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01006004#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01006005#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_192)
6006 TEST_AVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01006007#else
Gilles Peskine449bd832023-01-11 14:50:10 +01006008 TEST_UNAVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
Valerio Setti73260b62023-01-03 12:53:28 +01006009#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01006010#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) || defined(PSA_WANT_ECC_MONTGOMERY_255)
6011 TEST_AVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
Valerio Setti73260b62023-01-03 12:53:28 +01006012#else
Gilles Peskine449bd832023-01-11 14:50:10 +01006013 TEST_UNAVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
Valerio Setti73260b62023-01-03 12:53:28 +01006014#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01006015#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) || defined(PSA_WANT_ECC_MONTGOMERY_448)
6016 TEST_AVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
Valerio Setti73260b62023-01-03 12:53:28 +01006017#else
Gilles Peskine449bd832023-01-11 14:50:10 +01006018 TEST_UNAVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
Valerio Setti73260b62023-01-03 12:53:28 +01006019#endif
6020
Gilles Peskine449bd832023-01-11 14:50:10 +01006021 USE_PSA_DONE();
Valerio Setti73260b62023-01-03 12:53:28 +01006022}
6023/* END_CASE */