blob: 549e8dee12136c2d1cf8650b9bf19417c02de94f [file] [log] [blame]
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001/* BEGIN_HEADER */
Yanray Wang5fce1452022-10-24 14:42:01 +08002#include <test/ssl_helpers.h>
Piotr Nowickibde7ee82020-02-21 10:59:50 +01003
Gabor Mezeic0ae1cf2021-10-20 12:09:35 +02004#include <constant_time_internal.h>
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02005
Manuel Pégourié-Gonnard9670a592020-07-10 10:21:46 +02006#include <test/constant_flow.h>
7
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02008/* END_HEADER */
9
10/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020011 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +020012 * END_DEPENDENCIES
13 */
14
Janos Follath6264e662019-11-26 11:11:15 +000015/* BEGIN_CASE */
16void test_callback_buffer_sanity()
17{
18 enum { MSGLEN = 10 };
Yanray Wangabfdcd82022-10-25 16:44:13 +080019 mbedtls_test_ssl_buffer buf;
Janos Follath6264e662019-11-26 11:11:15 +000020 unsigned char input[MSGLEN];
21 unsigned char output[MSGLEN];
22
Valerio Setti44570a52023-04-19 15:10:45 +020023 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010024 memset(input, 0, sizeof(input));
Janos Follath6264e662019-11-26 11:11:15 +000025
26 /* Make sure calling put and get on NULL buffer results in error. */
Yanray Wangc4638492022-10-26 11:51:53 +080027 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, input, sizeof(input))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010028 == -1);
Yanray Wangc4638492022-10-26 11:51:53 +080029 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, output, sizeof(output))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010030 == -1);
Yanray Wang862ef862023-03-14 11:05:04 +080031 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, sizeof(input))
32 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -050033
Yanray Wangc4638492022-10-26 11:51:53 +080034 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, 0) == -1);
35 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +000036
37 /* Make sure calling put and get on a buffer that hasn't been set up results
Shaun Case0e7791f2021-12-20 21:14:10 -080038 * in error. */
Yanray Wangc4638492022-10-26 11:51:53 +080039 mbedtls_test_ssl_buffer_init(&buf);
Janos Follath6264e662019-11-26 11:11:15 +000040
Yanray Wang862ef862023-03-14 11:05:04 +080041 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
42 == -1);
Yanray Wangc4638492022-10-26 11:51:53 +080043 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, sizeof(output))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010044 == -1);
Yanray Wang862ef862023-03-14 11:05:04 +080045 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
46 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -050047
Yanray Wangc4638492022-10-26 11:51:53 +080048 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == -1);
49 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +000050
Andrzej Kurekf7774142020-01-22 06:34:59 -050051 /* Make sure calling put and get on NULL input only results in
52 * error if the length is not zero, and that a NULL output is valid for data
53 * dropping.
54 */
Janos Follath6264e662019-11-26 11:11:15 +000055
Yanray Wangc4638492022-10-26 11:51:53 +080056 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, sizeof(input)) == 0);
Janos Follath6264e662019-11-26 11:11:15 +000057
Yanray Wang862ef862023-03-14 11:05:04 +080058 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
59 == -1);
Yanray Wangc4638492022-10-26 11:51:53 +080060 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, sizeof(output))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010061 == 0);
Yanray Wangc4638492022-10-26 11:51:53 +080062 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == 0);
63 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == 0);
Janos Follath6264e662019-11-26 11:11:15 +000064
Piotr Nowickifb437d72020-01-13 16:59:12 +010065 /* Make sure calling put several times in the row is safe */
66
Yanray Wangc4638492022-10-26 11:51:53 +080067 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010068 == sizeof(input));
Yanray Wangc4638492022-10-26 11:51:53 +080069 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, 2) == 2);
70 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 1) == 1);
71 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 1);
72 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 0);
Piotr Nowickifb437d72020-01-13 16:59:12 +010073
74
Janos Follath6264e662019-11-26 11:11:15 +000075exit:
Yanray Wangc4638492022-10-26 11:51:53 +080076 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti44570a52023-04-19 15:10:45 +020077 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +000078}
79/* END_CASE */
80
81/*
Yanray Wangabfdcd82022-10-25 16:44:13 +080082 * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is
Janos Follath6264e662019-11-26 11:11:15 +000083 * correct and works as expected.
84 *
85 * That is
86 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
87 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
88 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
89 * bytes.
90 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
91 * - All of the bytes we got match the bytes we put in in a FIFO manner.
92 */
93
94/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010095void test_callback_buffer(int size, int put1, int put1_ret,
96 int get1, int get1_ret, int put2, int put2_ret,
97 int get2, int get2_ret)
Janos Follath6264e662019-11-26 11:11:15 +000098{
99 enum { ROUNDS = 2 };
100 size_t put[ROUNDS];
101 int put_ret[ROUNDS];
102 size_t get[ROUNDS];
103 int get_ret[ROUNDS];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800104 mbedtls_test_ssl_buffer buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100105 unsigned char *input = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000106 size_t input_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100107 unsigned char *output = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000108 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +0000109 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +0000110
Valerio Setti44570a52023-04-19 15:10:45 +0200111 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800112 mbedtls_test_ssl_buffer_init(&buf);
113 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, size) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000114
115 /* Check the sanity of input parameters and initialise local variables. That
116 * is, ensure that the amount of data is not negative and that we are not
117 * expecting more to put or get than we actually asked for. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100118 TEST_ASSERT(put1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000119 put[0] = put1;
120 put_ret[0] = put1_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100121 TEST_ASSERT(put1_ret <= put1);
122 TEST_ASSERT(put2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000123 put[1] = put2;
124 put_ret[1] = put2_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100125 TEST_ASSERT(put2_ret <= put2);
Janos Follath6264e662019-11-26 11:11:15 +0000126
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100127 TEST_ASSERT(get1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000128 get[0] = get1;
129 get_ret[0] = get1_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100130 TEST_ASSERT(get1_ret <= get1);
131 TEST_ASSERT(get2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000132 get[1] = get2;
133 get_ret[1] = get2_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100134 TEST_ASSERT(get2_ret <= get2);
Janos Follath6264e662019-11-26 11:11:15 +0000135
136 input_len = 0;
137 /* Calculate actual input and output lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100138 for (j = 0; j < ROUNDS; j++) {
139 if (put_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000140 input_len += put_ret[j];
141 }
142 }
143 /* In order to always have a valid pointer we always allocate at least 1
144 * byte. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100145 if (input_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000146 input_len = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100147 }
148 ASSERT_ALLOC(input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000149
150 output_len = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100151 for (j = 0; j < ROUNDS; j++) {
152 if (get_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000153 output_len += get_ret[j];
154 }
155 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100156 TEST_ASSERT(output_len <= input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000157 /* In order to always have a valid pointer we always allocate at least 1
158 * byte. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100159 if (output_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000160 output_len = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100161 }
162 ASSERT_ALLOC(output, output_len);
Janos Follath6264e662019-11-26 11:11:15 +0000163
164 /* Fill up the buffer with structured data so that unwanted changes
165 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100166 for (i = 0; i < input_len; i++) {
Janos Follath6264e662019-11-26 11:11:15 +0000167 input[i] = i & 0xFF;
168 }
169
170 written = read = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100171 for (j = 0; j < ROUNDS; j++) {
Yanray Wangc4638492022-10-26 11:51:53 +0800172 TEST_ASSERT(put_ret[j] == mbedtls_test_ssl_buffer_put(&buf,
173 input + written, put[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000174 written += put_ret[j];
Yanray Wangc4638492022-10-26 11:51:53 +0800175 TEST_ASSERT(get_ret[j] == mbedtls_test_ssl_buffer_get(&buf,
176 output + read, get[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000177 read += get_ret[j];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100178 TEST_ASSERT(read <= written);
179 if (get_ret[j] > 0) {
180 TEST_ASSERT(memcmp(output + read - get_ret[j],
181 input + read - get_ret[j], get_ret[j])
182 == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000183 }
184 }
185
186exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100187 mbedtls_free(input);
188 mbedtls_free(output);
Yanray Wangc4638492022-10-26 11:51:53 +0800189 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti44570a52023-04-19 15:10:45 +0200190 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +0000191}
192/* END_CASE */
193
Janos Follath031827f2019-11-27 11:12:14 +0000194/*
Yanray Wang862ef862023-03-14 11:05:04 +0800195 * Test if the implementation of `mbedtls_test_mock_socket` related
196 * I/O functions is correct and works as expected on unconnected sockets.
Janos Follathc673c2c2019-12-02 15:47:26 +0000197 */
198
199/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100200void ssl_mock_sanity()
Janos Follathc673c2c2019-12-02 15:47:26 +0000201{
202 enum { MSGLEN = 105 };
Paul Elliott95457862021-11-24 16:54:26 +0000203 unsigned char message[MSGLEN] = { 0 };
204 unsigned char received[MSGLEN] = { 0 };
Yanray Wangabfdcd82022-10-25 16:44:13 +0800205 mbedtls_test_mock_socket socket;
Janos Follathc673c2c2019-12-02 15:47:26 +0000206
Valerio Setti44570a52023-04-19 15:10:45 +0200207 USE_PSA_INIT();
Yanray Wangd02c3172023-03-15 16:02:29 +0800208 mbedtls_test_mock_socket_init(&socket);
Yanray Wangc4638492022-10-26 11:51:53 +0800209 TEST_ASSERT(mbedtls_test_mock_tcp_send_b(&socket, message, MSGLEN) < 0);
210 mbedtls_test_mock_socket_close(&socket);
Yanray Wangd02c3172023-03-15 16:02:29 +0800211 mbedtls_test_mock_socket_init(&socket);
Yanray Wangc4638492022-10-26 11:51:53 +0800212 TEST_ASSERT(mbedtls_test_mock_tcp_recv_b(&socket, received, MSGLEN) < 0);
213 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000214
Yanray Wangd02c3172023-03-15 16:02:29 +0800215 mbedtls_test_mock_socket_init(&socket);
Yanray Wangc4638492022-10-26 11:51:53 +0800216 TEST_ASSERT(mbedtls_test_mock_tcp_send_nb(&socket, message, MSGLEN) < 0);
217 mbedtls_test_mock_socket_close(&socket);
Yanray Wangd02c3172023-03-15 16:02:29 +0800218 mbedtls_test_mock_socket_init(&socket);
Yanray Wangc4638492022-10-26 11:51:53 +0800219 TEST_ASSERT(mbedtls_test_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0);
220 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000221
222exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800223 mbedtls_test_mock_socket_close(&socket);
Valerio Setti44570a52023-04-19 15:10:45 +0200224 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000225}
226/* END_CASE */
227
228/*
Yanray Wang862ef862023-03-14 11:05:04 +0800229 * Test if the implementation of `mbedtls_test_mock_socket` related functions
230 * can send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +0000231 */
232
233/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100234void ssl_mock_tcp(int blocking)
Janos Follath031827f2019-11-27 11:12:14 +0000235{
Janos Follathc673c2c2019-12-02 15:47:26 +0000236 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100237 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +0000238 unsigned char message[MSGLEN];
239 unsigned char received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800240 mbedtls_test_mock_socket client;
241 mbedtls_test_mock_socket server;
Janos Follathc673c2c2019-12-02 15:47:26 +0000242 size_t written, read;
243 int send_ret, recv_ret;
244 mbedtls_ssl_send_t *send;
245 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +0000246 unsigned i;
247
Valerio Setti44570a52023-04-19 15:10:45 +0200248 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100249 if (blocking == 0) {
Yanray Wangc4638492022-10-26 11:51:53 +0800250 send = mbedtls_test_mock_tcp_send_nb;
251 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100252 } else {
Yanray Wangc4638492022-10-26 11:51:53 +0800253 send = mbedtls_test_mock_tcp_send_b;
254 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follathc673c2c2019-12-02 15:47:26 +0000255 }
256
Yanray Wangd02c3172023-03-15 16:02:29 +0800257 mbedtls_test_mock_socket_init(&client);
258 mbedtls_test_mock_socket_init(&server);
Janos Follathc673c2c2019-12-02 15:47:26 +0000259
260 /* Fill up the buffer with structured data so that unwanted changes
261 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100262 for (i = 0; i < MSGLEN; i++) {
Janos Follathc673c2c2019-12-02 15:47:26 +0000263 message[i] = i & 0xFF;
264 }
265
266 /* Make sure that sending a message takes a few iterations. */
Yanray Wangc4638492022-10-26 11:51:53 +0800267 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, BUFLEN));
Janos Follathc673c2c2019-12-02 15:47:26 +0000268
269 /* Send the message to the server */
270 send_ret = recv_ret = 1;
271 written = read = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100272 while (send_ret != 0 || recv_ret != 0) {
273 send_ret = send(&client, message + written, MSGLEN - written);
Janos Follathc673c2c2019-12-02 15:47:26 +0000274
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100275 TEST_ASSERT(send_ret >= 0);
276 TEST_ASSERT(send_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100277 written += send_ret;
278
279 /* If the buffer is full we can test blocking and non-blocking send */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100280 if (send_ret == BUFLEN) {
281 int blocking_ret = send(&client, message, 1);
282 if (blocking) {
283 TEST_ASSERT(blocking_ret == 0);
284 } else {
285 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100286 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000287 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000288
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100289 recv_ret = recv(&server, received + read, MSGLEN - read);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100290
291 /* The result depends on whether any data was sent */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100292 if (send_ret > 0) {
293 TEST_ASSERT(recv_ret > 0);
294 TEST_ASSERT(recv_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100295 read += recv_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100296 } else if (blocking) {
297 TEST_ASSERT(recv_ret == 0);
298 } else {
299 TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100300 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +0000301 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100302
303 /* If the buffer is empty we can test blocking and non-blocking read */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100304 if (recv_ret == BUFLEN) {
305 int blocking_ret = recv(&server, received, 1);
306 if (blocking) {
307 TEST_ASSERT(blocking_ret == 0);
308 } else {
309 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100310 }
311 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000312 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100313 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Janos Follathc673c2c2019-12-02 15:47:26 +0000314
315exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800316 mbedtls_test_mock_socket_close(&client);
317 mbedtls_test_mock_socket_close(&server);
Valerio Setti44570a52023-04-19 15:10:45 +0200318 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000319}
320/* END_CASE */
321
322/*
Yanray Wang862ef862023-03-14 11:05:04 +0800323 * Test if the implementation of `mbedtls_test_mock_socket` related functions
324 * can send messages in both direction at the same time (with the I/O calls
Janos Follathc673c2c2019-12-02 15:47:26 +0000325 * interleaving).
326 */
327
328/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100329void ssl_mock_tcp_interleaving(int blocking)
Janos Follathc673c2c2019-12-02 15:47:26 +0000330{
Janos Follath031827f2019-11-27 11:12:14 +0000331 enum { ROUNDS = 2 };
332 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100333 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +0000334 unsigned char message[ROUNDS][MSGLEN];
335 unsigned char received[ROUNDS][MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800336 mbedtls_test_mock_socket client;
337 mbedtls_test_mock_socket server;
Janos Follath031827f2019-11-27 11:12:14 +0000338 size_t written[ROUNDS];
339 size_t read[ROUNDS];
340 int send_ret[ROUNDS];
341 int recv_ret[ROUNDS];
342 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +0000343 mbedtls_ssl_send_t *send;
344 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +0000345
Valerio Setti44570a52023-04-19 15:10:45 +0200346 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100347 if (blocking == 0) {
Yanray Wangc4638492022-10-26 11:51:53 +0800348 send = mbedtls_test_mock_tcp_send_nb;
349 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100350 } else {
Yanray Wangc4638492022-10-26 11:51:53 +0800351 send = mbedtls_test_mock_tcp_send_b;
352 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follath3766ba52019-11-27 13:31:42 +0000353 }
Janos Follath031827f2019-11-27 11:12:14 +0000354
Yanray Wangd02c3172023-03-15 16:02:29 +0800355 mbedtls_test_mock_socket_init(&client);
356 mbedtls_test_mock_socket_init(&server);
Janos Follath031827f2019-11-27 11:12:14 +0000357
358 /* Fill up the buffers with structured data so that unwanted changes
359 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100360 for (i = 0; i < ROUNDS; i++) {
361 for (j = 0; j < MSGLEN; j++) {
362 message[i][j] = (i * MSGLEN + j) & 0xFF;
Janos Follath031827f2019-11-27 11:12:14 +0000363 }
364 }
365
Janos Follath031827f2019-11-27 11:12:14 +0000366 /* Make sure that sending a message takes a few iterations. */
Yanray Wang862ef862023-03-14 11:05:04 +0800367 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
368 BUFLEN));
Janos Follath031827f2019-11-27 11:12:14 +0000369
Janos Follath031827f2019-11-27 11:12:14 +0000370 /* Send the message from both sides, interleaving. */
371 progress = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100372 for (i = 0; i < ROUNDS; i++) {
Janos Follath031827f2019-11-27 11:12:14 +0000373 written[i] = 0;
374 read[i] = 0;
375 }
376 /* This loop does not stop as long as there was a successful write or read
377 * of at least one byte on either side. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100378 while (progress != 0) {
Yanray Wangabfdcd82022-10-25 16:44:13 +0800379 mbedtls_test_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +0000380
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100381 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100382 /* First sending is from the client */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100383 socket = (i % 2 == 0) ? (&client) : (&server);
Janos Follath031827f2019-11-27 11:12:14 +0000384
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100385 send_ret[i] = send(socket, message[i] + written[i],
386 MSGLEN - written[i]);
387 TEST_ASSERT(send_ret[i] >= 0);
388 TEST_ASSERT(send_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100389 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000390
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100391 /* If the buffer is full we can test blocking and non-blocking
392 * send */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100393 if (send_ret[i] == BUFLEN) {
394 int blocking_ret = send(socket, message[i], 1);
395 if (blocking) {
396 TEST_ASSERT(blocking_ret == 0);
397 } else {
398 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100399 }
400 }
Janos Follath3766ba52019-11-27 13:31:42 +0000401 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100402
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100403 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100404 /* First receiving is from the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100405 socket = (i % 2 == 0) ? (&server) : (&client);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100406
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100407 recv_ret[i] = recv(socket, received[i] + read[i],
408 MSGLEN - read[i]);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100409
410 /* The result depends on whether any data was sent */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100411 if (send_ret[i] > 0) {
412 TEST_ASSERT(recv_ret[i] > 0);
413 TEST_ASSERT(recv_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100414 read[i] += recv_ret[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100415 } else if (blocking) {
416 TEST_ASSERT(recv_ret[i] == 0);
417 } else {
418 TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100419 recv_ret[i] = 0;
420 }
421
422 /* If the buffer is empty we can test blocking and non-blocking
423 * read */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100424 if (recv_ret[i] == BUFLEN) {
425 int blocking_ret = recv(socket, received[i], 1);
426 if (blocking) {
427 TEST_ASSERT(blocking_ret == 0);
428 } else {
429 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100430 }
431 }
Janos Follath3766ba52019-11-27 13:31:42 +0000432 }
Janos Follath031827f2019-11-27 11:12:14 +0000433
434 progress = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100435 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100436 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000437 }
438 }
439
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100440 for (i = 0; i < ROUNDS; i++) {
441 TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0);
442 }
Janos Follath031827f2019-11-27 11:12:14 +0000443
444exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800445 mbedtls_test_mock_socket_close(&client);
446 mbedtls_test_mock_socket_close(&server);
Valerio Setti44570a52023-04-19 15:10:45 +0200447 USE_PSA_DONE();
Janos Follath031827f2019-11-27 11:12:14 +0000448}
449/* END_CASE */
450
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500451/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100452void ssl_message_queue_sanity()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500453{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800454 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500455
Valerio Setti44570a52023-04-19 15:10:45 +0200456 USE_PSA_INIT();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500457 /* Trying to push/pull to an empty queue */
Yanray Wangc4638492022-10-26 11:51:53 +0800458 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(NULL, 1)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100459 == MBEDTLS_TEST_ERROR_ARG_NULL);
Yanray Wangc4638492022-10-26 11:51:53 +0800460 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(NULL, 1)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100461 == MBEDTLS_TEST_ERROR_ARG_NULL);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500462
Yanray Wangc4638492022-10-26 11:51:53 +0800463 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100464 TEST_ASSERT(queue.capacity == 3);
465 TEST_ASSERT(queue.num == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500466
467exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800468 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200469 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500470}
471/* END_CASE */
472
473/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100474void ssl_message_queue_basic()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500475{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800476 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500477
Valerio Setti44570a52023-04-19 15:10:45 +0200478 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800479 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500480
481 /* Sanity test - 3 pushes and 3 pops with sufficient space */
Yanray Wangc4638492022-10-26 11:51:53 +0800482 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100483 TEST_ASSERT(queue.capacity == 3);
484 TEST_ASSERT(queue.num == 1);
Yanray Wangc4638492022-10-26 11:51:53 +0800485 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100486 TEST_ASSERT(queue.capacity == 3);
487 TEST_ASSERT(queue.num == 2);
Yanray Wangc4638492022-10-26 11:51:53 +0800488 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100489 TEST_ASSERT(queue.capacity == 3);
490 TEST_ASSERT(queue.num == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500491
Yanray Wangc4638492022-10-26 11:51:53 +0800492 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
493 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
494 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500495
496exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800497 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200498 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500499}
500/* END_CASE */
501
502/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100503void ssl_message_queue_overflow_underflow()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500504{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800505 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500506
Valerio Setti44570a52023-04-19 15:10:45 +0200507 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800508 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500509
510 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
Yanray Wangc4638492022-10-26 11:51:53 +0800511 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
512 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
513 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
514 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100515 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500516
Yanray Wangc4638492022-10-26 11:51:53 +0800517 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
518 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
519 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500520
Yanray Wangc4638492022-10-26 11:51:53 +0800521 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100522 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500523
524exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800525 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200526 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500527}
528/* END_CASE */
529
530/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100531void ssl_message_queue_interleaved()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500532{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800533 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500534
Valerio Setti44570a52023-04-19 15:10:45 +0200535 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800536 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500537
538 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
539 * (to wrap around the buffer) */
Yanray Wangc4638492022-10-26 11:51:53 +0800540 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
541 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500542
Yanray Wangc4638492022-10-26 11:51:53 +0800543 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500544
Yanray Wangc4638492022-10-26 11:51:53 +0800545 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
546 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500547
Yanray Wangc4638492022-10-26 11:51:53 +0800548 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
549 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500550
Yanray Wangc4638492022-10-26 11:51:53 +0800551 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 5) == 5);
552 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500553
Yanray Wangc4638492022-10-26 11:51:53 +0800554 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500555
Yanray Wangc4638492022-10-26 11:51:53 +0800556 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 5) == 5);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500557
Yanray Wangc4638492022-10-26 11:51:53 +0800558 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500559
560exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800561 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200562 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500563}
564/* END_CASE */
565
566/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100567void ssl_message_queue_insufficient_buffer()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500568{
Yanray Wangabfdcd82022-10-25 16:44:13 +0800569 mbedtls_test_ssl_message_queue queue;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500570 size_t message_len = 10;
571 size_t buffer_len = 5;
572
Valerio Setti44570a52023-04-19 15:10:45 +0200573 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800574 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 1) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500575
576 /* Popping without a sufficient buffer */
Yanray Wangc4638492022-10-26 11:51:53 +0800577 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, message_len)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100578 == (int) message_len);
Yanray Wangc4638492022-10-26 11:51:53 +0800579 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, buffer_len)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100580 == (int) buffer_len);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500581exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800582 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200583 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500584}
585/* END_CASE */
586
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500587/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100588void ssl_message_mock_uninitialized()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500589{
590 enum { MSGLEN = 10 };
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100591 unsigned char message[MSGLEN] = { 0 }, received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800592 mbedtls_test_mock_socket client, server;
593 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500594 mbedtls_test_message_socket_context server_context, client_context;
Yanray Wangc4638492022-10-26 11:51:53 +0800595 mbedtls_test_message_socket_init(&server_context);
596 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500597
Valerio Setti44570a52023-04-19 15:10:45 +0200598 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500599 /* Send with a NULL context */
Yanray Wangc4638492022-10-26 11:51:53 +0800600 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(NULL, message, MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100601 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500602
Yanray Wangc4638492022-10-26 11:51:53 +0800603 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(NULL, message, MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100604 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500605
Yanray Wang862ef862023-03-14 11:05:04 +0800606 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
607 &client_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800608 &server,
609 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500610
Yanray Wang862ef862023-03-14 11:05:04 +0800611 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
612 &server_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800613 &client,
614 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500615
Yanray Wang862ef862023-03-14 11:05:04 +0800616 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
617 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100618 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500619
Yanray Wang862ef862023-03-14 11:05:04 +0800620 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
621 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100622 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500623
624 /* Push directly to a queue to later simulate a disconnected behavior */
Yanray Wang862ef862023-03-14 11:05:04 +0800625 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&server_queue,
626 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100627 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500628
629 /* Test if there's an error when trying to read from a disconnected
630 * socket */
Yanray Wang862ef862023-03-14 11:05:04 +0800631 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
632 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100633 == MBEDTLS_TEST_ERROR_RECV_FAILED);
634exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800635 mbedtls_test_message_socket_close(&server_context);
636 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200637 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500638}
639/* END_CASE */
640
641/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100642void ssl_message_mock_basic()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500643{
644 enum { MSGLEN = 10 };
645 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800646 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500647 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800648 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500649 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200650
651 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800652 mbedtls_test_message_socket_init(&server_context);
653 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500654
Yanray Wang862ef862023-03-14 11:05:04 +0800655 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
656 &client_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800657 &server,
658 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500659
Yanray Wang862ef862023-03-14 11:05:04 +0800660 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
661 &server_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800662 &client,
663 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500664
665 /* Fill up the buffer with structured data so that unwanted changes
666 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100667 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500668 message[i] = i & 0xFF;
669 }
Yanray Wangc4638492022-10-26 11:51:53 +0800670 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
671 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500672
673 /* Send the message to the server */
Yanray Wangc4638492022-10-26 11:51:53 +0800674 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800675 MSGLEN)
676 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500677
678 /* Read from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800679 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
680 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100681 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500682
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100683 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
684 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500685
686 /* Send the message to the client */
Yanray Wangc4638492022-10-26 11:51:53 +0800687 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
688 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500689
690 /* Read from the client */
Yanray Wang862ef862023-03-14 11:05:04 +0800691 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
692 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100693 == MSGLEN);
694 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500695
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100696exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800697 mbedtls_test_message_socket_close(&server_context);
698 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200699 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500700}
701/* END_CASE */
702
703/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100704void ssl_message_mock_queue_overflow_underflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500705{
706 enum { MSGLEN = 10 };
707 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800708 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500709 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800710 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500711 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200712
713 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800714 mbedtls_test_message_socket_init(&server_context);
715 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500716
Yanray Wang862ef862023-03-14 11:05:04 +0800717 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
718 &client_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800719 &server,
720 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500721
Yanray Wang862ef862023-03-14 11:05:04 +0800722 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
723 &server_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800724 &client,
725 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500726
727 /* Fill up the buffer with structured data so that unwanted changes
728 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100729 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500730 message[i] = i & 0xFF;
731 }
Yanray Wangc4638492022-10-26 11:51:53 +0800732 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
733 MSGLEN*2));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500734
735 /* Send three message to the server, last one with an error */
Yanray Wangc4638492022-10-26 11:51:53 +0800736 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800737 MSGLEN - 1)
738 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500739
Yanray Wangc4638492022-10-26 11:51:53 +0800740 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800741 MSGLEN)
742 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500743
Yanray Wangc4638492022-10-26 11:51:53 +0800744 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
745 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100746 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500747
748 /* Read three messages from the server, last one with an error */
Yanray Wangc4638492022-10-26 11:51:53 +0800749 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
Yanray Wang862ef862023-03-14 11:05:04 +0800750 MSGLEN - 1)
751 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500752
Yanray Wang862ef862023-03-14 11:05:04 +0800753 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
754 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100755 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500756
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100757 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500758
Yanray Wang862ef862023-03-14 11:05:04 +0800759 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
760 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100761 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500762
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100763exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800764 mbedtls_test_message_socket_close(&server_context);
765 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200766 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500767}
768/* END_CASE */
769
770/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100771void ssl_message_mock_socket_overflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500772{
773 enum { MSGLEN = 10 };
774 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800775 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500776 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800777 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500778 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200779
780 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800781 mbedtls_test_message_socket_init(&server_context);
782 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500783
Yanray Wang862ef862023-03-14 11:05:04 +0800784 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
785 &client_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800786 &server,
787 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500788
Yanray Wang862ef862023-03-14 11:05:04 +0800789 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
790 &server_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800791 &client,
792 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500793
794 /* Fill up the buffer with structured data so that unwanted changes
795 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100796 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500797 message[i] = i & 0xFF;
798 }
Yanray Wangc4638492022-10-26 11:51:53 +0800799 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
800 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500801
802 /* Send two message to the server, second one with an error */
Yanray Wangc4638492022-10-26 11:51:53 +0800803 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800804 MSGLEN)
805 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500806
Yanray Wangc4638492022-10-26 11:51:53 +0800807 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
808 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100809 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500810
811 /* Read the only message from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800812 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
813 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100814 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500815
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100816 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500817
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100818exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800819 mbedtls_test_message_socket_close(&server_context);
820 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200821 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500822}
823/* END_CASE */
824
825/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100826void ssl_message_mock_truncated()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500827{
828 enum { MSGLEN = 10 };
829 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800830 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500831 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800832 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500833 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200834
835 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800836 mbedtls_test_message_socket_init(&server_context);
837 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500838
Yanray Wang862ef862023-03-14 11:05:04 +0800839 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
840 &client_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800841 &server,
842 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500843
Yanray Wang862ef862023-03-14 11:05:04 +0800844 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
845 &server_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800846 &client,
847 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500848
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100849 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500850 /* Fill up the buffer with structured data so that unwanted changes
851 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100852 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500853 message[i] = i & 0xFF;
854 }
Yanray Wangc4638492022-10-26 11:51:53 +0800855 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
856 2 * MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500857
858 /* Send two messages to the server, the second one small enough to fit in the
859 * receiver's buffer. */
Yanray Wangc4638492022-10-26 11:51:53 +0800860 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800861 MSGLEN)
862 == MSGLEN);
Yanray Wangc4638492022-10-26 11:51:53 +0800863 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800864 MSGLEN / 2)
865 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500866 /* Read a truncated message from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800867 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
868 MSGLEN/2)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100869 == MSGLEN/2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500870
871 /* Test that the first half of the message is valid, and second one isn't */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100872 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
873 TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2)
874 != 0);
875 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500876
877 /* Read a full message from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800878 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
879 MSGLEN/2)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100880 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500881
882 /* Test that the first half of the message is valid */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100883 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500884
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100885exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800886 mbedtls_test_message_socket_close(&server_context);
887 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200888 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500889}
890/* END_CASE */
891
892/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100893void ssl_message_mock_socket_read_error()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500894{
895 enum { MSGLEN = 10 };
896 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800897 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500898 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800899 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500900 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200901
902 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800903 mbedtls_test_message_socket_init(&server_context);
904 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500905
Yanray Wang862ef862023-03-14 11:05:04 +0800906 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
907 &client_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800908 &server,
909 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500910
Yanray Wang862ef862023-03-14 11:05:04 +0800911 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
912 &server_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800913 &client,
914 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500915
916 /* Fill up the buffer with structured data so that unwanted changes
917 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100918 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500919 message[i] = i & 0xFF;
920 }
Yanray Wangc4638492022-10-26 11:51:53 +0800921 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
922 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500923
Yanray Wangc4638492022-10-26 11:51:53 +0800924 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800925 MSGLEN)
926 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500927
928 /* Force a read error by disconnecting the socket by hand */
929 server.status = 0;
Yanray Wang862ef862023-03-14 11:05:04 +0800930 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
931 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100932 == MBEDTLS_TEST_ERROR_RECV_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500933 /* Return to a valid state */
934 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
935
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100936 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500937
938 /* Test that even though the server tried to read once disconnected, the
939 * continuity is preserved */
Yanray Wang862ef862023-03-14 11:05:04 +0800940 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
941 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100942 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500943
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100944 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500945
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100946exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800947 mbedtls_test_message_socket_close(&server_context);
948 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200949 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500950}
951/* END_CASE */
952
953/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100954void ssl_message_mock_interleaved_one_way()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500955{
956 enum { MSGLEN = 10 };
957 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800958 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500959 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800960 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500961 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200962
963 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800964 mbedtls_test_message_socket_init(&server_context);
965 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500966
Yanray Wang862ef862023-03-14 11:05:04 +0800967 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
968 &client_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +0800969 &server,
970 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500971
Yanray Wang862ef862023-03-14 11:05:04 +0800972 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
973 &server_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +0800974 &client,
975 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500976
977 /* Fill up the buffer with structured data so that unwanted changes
978 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100979 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500980 message[i] = i & 0xFF;
981 }
Yanray Wangc4638492022-10-26 11:51:53 +0800982 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
983 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500984
985 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
986 * (to wrap around the buffer) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100987 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +0800988 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
989 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500990
Yanray Wangc4638492022-10-26 11:51:53 +0800991 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
992 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500993
Yanray Wangc4638492022-10-26 11:51:53 +0800994 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
995 MSGLEN) == MSGLEN);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100996 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
997 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500998 }
999
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001000 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +08001001 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1002 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001003
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001004 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001005 }
Yanray Wang862ef862023-03-14 11:05:04 +08001006 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1007 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001008 == MBEDTLS_ERR_SSL_WANT_READ);
1009exit:
Yanray Wangc4638492022-10-26 11:51:53 +08001010 mbedtls_test_message_socket_close(&server_context);
1011 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +02001012 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001013}
1014/* END_CASE */
1015
1016/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001017void ssl_message_mock_interleaved_two_ways()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001018{
1019 enum { MSGLEN = 10 };
1020 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08001021 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001022 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08001023 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001024 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +02001025
1026 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +08001027 mbedtls_test_message_socket_init(&server_context);
1028 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001029
Yanray Wang862ef862023-03-14 11:05:04 +08001030 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1031 &client_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +08001032 &server,
1033 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001034
Yanray Wang862ef862023-03-14 11:05:04 +08001035 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1036 &server_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +08001037 &client,
1038 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001039
1040 /* Fill up the buffer with structured data so that unwanted changes
1041 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001042 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001043 message[i] = i & 0xFF;
1044 }
Yanray Wangc4638492022-10-26 11:51:53 +08001045 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1046 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001047
1048 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
1049 * (to wrap around the buffer) both ways. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001050 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +08001051 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1052 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001053
Yanray Wangc4638492022-10-26 11:51:53 +08001054 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1055 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001056
Yanray Wangc4638492022-10-26 11:51:53 +08001057 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1058 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001059
Yanray Wangc4638492022-10-26 11:51:53 +08001060 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1061 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001062
Yanray Wangc4638492022-10-26 11:51:53 +08001063 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1064 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001065
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001066 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001067
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001068 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001069
Yanray Wangc4638492022-10-26 11:51:53 +08001070 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1071 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001072
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001073 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001074
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001075 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001076 }
1077
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001078 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +08001079 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1080 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001081
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001082 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1083 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001084
Yanray Wangc4638492022-10-26 11:51:53 +08001085 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1086 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001087
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001088 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1089 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001090 }
1091
Yanray Wang862ef862023-03-14 11:05:04 +08001092 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1093 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001094 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001095
Yanray Wang862ef862023-03-14 11:05:04 +08001096 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1097 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001098 == MBEDTLS_ERR_SSL_WANT_READ);
1099exit:
Yanray Wangc4638492022-10-26 11:51:53 +08001100 mbedtls_test_message_socket_close(&server_context);
1101 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +02001102 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001103}
1104/* END_CASE */
1105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001107void ssl_dtls_replay(data_t *prevs, data_t *new, int ret)
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001108{
Azim Khand30ca132017-06-09 04:32:58 +01001109 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001110 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001111 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001112
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001113 mbedtls_ssl_init(&ssl);
1114 mbedtls_ssl_config_init(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02001115 USE_PSA_INIT();
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02001116
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001117 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
1118 MBEDTLS_SSL_IS_CLIENT,
1119 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
1120 MBEDTLS_SSL_PRESET_DEFAULT) == 0);
1121 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001122
1123 /* Read previous record numbers */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001124 for (len = 0; len < prevs->len; len += 6) {
1125 memcpy(ssl.in_ctr + 2, prevs->x + len, 6);
1126 mbedtls_ssl_dtls_replay_update(&ssl);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001127 }
1128
1129 /* Check new number */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001130 memcpy(ssl.in_ctr + 2, new->x, 6);
1131 TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001132
Valerio Setti44570a52023-04-19 15:10:45 +02001133exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001134 mbedtls_ssl_free(&ssl);
1135 mbedtls_ssl_config_free(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02001136 USE_PSA_DONE();
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001137}
1138/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001139
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001140/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001141void ssl_set_hostname_twice(char *hostname0, char *hostname1)
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001142{
1143 mbedtls_ssl_context ssl;
Valerio Setti44570a52023-04-19 15:10:45 +02001144
1145 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001146 mbedtls_ssl_init(&ssl);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001147
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001148 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname0) == 0);
1149 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname1) == 0);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001150
Valerio Setti44570a52023-04-19 15:10:45 +02001151exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001152 mbedtls_ssl_free(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02001153 USE_PSA_DONE();
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001154}
Darryl Green11999bb2018-03-13 15:22:58 +00001155/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00001156
1157/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001158void ssl_crypt_record(int cipher_type, int hash_id,
1159 int etm, int tag_mode, int ver,
1160 int cid0_len, int cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00001161{
1162 /*
1163 * Test several record encryptions and decryptions
1164 * with plenty of space before and after the data
1165 * within the record buffer.
1166 */
1167
1168 int ret;
1169 int num_records = 16;
1170 mbedtls_ssl_context ssl; /* ONLY for debugging */
1171
1172 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001173 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001174 size_t const buflen = 512;
1175 mbedtls_record rec, rec_backup;
1176
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001177 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02001178 USE_PSA_INIT();
1179
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001180 mbedtls_ssl_transform_init(&t0);
1181 mbedtls_ssl_transform_init(&t1);
Yanray Wangc4638492022-10-26 11:51:53 +08001182 TEST_ASSERT(mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1183 etm, tag_mode, ver,
1184 (size_t) cid0_len,
1185 (size_t) cid1_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001186
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001187 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckera18d1322018-01-03 14:27:32 +00001188
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001189 while (num_records-- > 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001190 mbedtls_ssl_transform *t_dec, *t_enc;
1191 /* Take turns in who's sending and who's receiving. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001192 if (num_records % 3 == 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001193 t_dec = &t0;
1194 t_enc = &t1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001195 } else {
Hanno Beckera18d1322018-01-03 14:27:32 +00001196 t_dec = &t1;
1197 t_enc = &t0;
1198 }
1199
1200 /*
1201 * The record header affects the transformation in two ways:
1202 * 1) It determines the AEAD additional data
1203 * 2) The record counter sometimes determines the IV.
1204 *
1205 * Apart from that, the fields don't have influence.
1206 * In particular, it is currently not the responsibility
1207 * of ssl_encrypt/decrypt_buf to check if the transform
1208 * version matches the record version, or that the
1209 * type is sensible.
1210 */
1211
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001212 memset(rec.ctr, num_records, sizeof(rec.ctr));
Hanno Beckera18d1322018-01-03 14:27:32 +00001213 rec.type = 42;
1214 rec.ver[0] = num_records;
1215 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001216#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001217 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001218#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00001219
1220 rec.buf = buf;
1221 rec.buf_len = buflen;
1222 rec.data_offset = 16;
1223 /* Make sure to vary the length to exercise different
1224 * paddings. */
1225 rec.data_len = 1 + num_records;
1226
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001227 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckera18d1322018-01-03 14:27:32 +00001228
1229 /* Make a copy for later comparison */
1230 rec_backup = rec;
1231
1232 /* Encrypt record */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001233 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1234 mbedtls_test_rnd_std_rand, NULL);
1235 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1236 if (ret != 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001237 continue;
1238 }
1239
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001240#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001241 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001242 /* DTLS 1.2 + CID hides the real content type and
1243 * uses a special CID content type in the protected
1244 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001245 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001246 }
1247#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1248
1249#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001250 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001251 /* TLS 1.3 hides the real content type and
1252 * always uses Application Data as the content type
1253 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001254 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001255 }
1256#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1257
Hanno Beckera18d1322018-01-03 14:27:32 +00001258 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001259 ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec);
1260 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001261
1262 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001263 TEST_ASSERT(rec.type == rec_backup.type);
1264 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1265 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1266 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1267 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1268 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1269 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1270 rec_backup.buf + rec_backup.data_offset,
1271 rec.data_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001272 }
1273
Hanno Becker81e16a32019-03-01 11:21:44 +00001274exit:
1275
Hanno Beckera18d1322018-01-03 14:27:32 +00001276 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001277 mbedtls_ssl_free(&ssl);
1278 mbedtls_ssl_transform_free(&t0);
1279 mbedtls_ssl_transform_free(&t1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001280 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001281 USE_PSA_DONE();
Hanno Beckera18d1322018-01-03 14:27:32 +00001282}
1283/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001284
1285/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001286void ssl_crypt_record_small(int cipher_type, int hash_id,
1287 int etm, int tag_mode, int ver,
1288 int cid0_len, int cid1_len)
Hanno Beckerb3268da2018-01-05 15:20:24 +00001289{
1290 /*
1291 * Test pairs of encryption and decryption with an increasing
1292 * amount of space in the record buffer - in more detail:
1293 * 1) Try to encrypt with 0, 1, 2, ... bytes available
1294 * in front of the plaintext, and expect the encryption
1295 * to succeed starting from some offset. Always keep
1296 * enough space in the end of the buffer.
1297 * 2) Try to encrypt with 0, 1, 2, ... bytes available
1298 * at the end of the plaintext, and expect the encryption
1299 * to succeed starting from some offset. Always keep
1300 * enough space at the beginning of the buffer.
1301 * 3) Try to encrypt with 0, 1, 2, ... bytes available
1302 * both at the front and end of the plaintext,
1303 * and expect the encryption to succeed starting from
1304 * some offset.
1305 *
1306 * If encryption succeeds, check that decryption succeeds
1307 * and yields the original record.
1308 */
1309
1310 mbedtls_ssl_context ssl; /* ONLY for debugging */
1311
1312 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001313 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01001314 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001315 mbedtls_record rec, rec_backup;
1316
1317 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01001318 int mode; /* Mode 1, 2 or 3 as explained above */
1319 size_t offset; /* Available space at beginning/end/both */
1320 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001321
Hanno Beckerd856c822019-04-29 17:30:59 +01001322 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
1323 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001324
1325 int seen_success; /* Indicates if in the current mode we've
1326 * already seen a successful test. */
1327
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001328 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02001329 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001330 mbedtls_ssl_transform_init(&t0);
1331 mbedtls_ssl_transform_init(&t1);
Yanray Wangc4638492022-10-26 11:51:53 +08001332 TEST_ASSERT(mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1333 etm, tag_mode, ver,
1334 (size_t) cid0_len,
1335 (size_t) cid1_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001336
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001337 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001338
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001339 for (mode = 1; mode <= 3; mode++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001340 seen_success = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001341 for (offset = 0; offset <= threshold; offset++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001342 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01001343 t_dec = &t0;
1344 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001345
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001346 memset(rec.ctr, offset, sizeof(rec.ctr));
Hanno Beckerb3268da2018-01-05 15:20:24 +00001347 rec.type = 42;
1348 rec.ver[0] = offset;
1349 rec.ver[1] = offset;
1350 rec.buf = buf;
1351 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001352#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001353 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001354#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001355
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001356 switch (mode) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001357 case 1: /* Space in the beginning */
1358 rec.data_offset = offset;
1359 rec.data_len = buflen - offset - default_post_padding;
1360 break;
1361
1362 case 2: /* Space in the end */
1363 rec.data_offset = default_pre_padding;
1364 rec.data_len = buflen - default_pre_padding - offset;
1365 break;
1366
1367 case 3: /* Space in the beginning and end */
1368 rec.data_offset = offset;
1369 rec.data_len = buflen - 2 * offset;
1370 break;
1371
1372 default:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001373 TEST_ASSERT(0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001374 break;
1375 }
1376
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001377 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001378
1379 /* Make a copy for later comparison */
1380 rec_backup = rec;
1381
1382 /* Encrypt record */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001383 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1384 mbedtls_test_rnd_std_rand, NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001385
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001386 if ((mode == 1 || mode == 2) && seen_success) {
1387 TEST_ASSERT(ret == 0);
1388 } else {
1389 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1390 if (ret == 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001391 seen_success = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001392 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001393 }
1394
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001395 if (ret != 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001396 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001397 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001398
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001399#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001400 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001401 /* DTLS 1.2 + CID hides the real content type and
1402 * uses a special CID content type in the protected
1403 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001404 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001405 }
1406#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1407
1408#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001409 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001410 /* TLS 1.3 hides the real content type and
1411 * always uses Application Data as the content type
1412 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001413 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001414 }
1415#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1416
Hanno Beckerb3268da2018-01-05 15:20:24 +00001417 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001418 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001419
1420 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001421 TEST_ASSERT(rec.type == rec_backup.type);
1422 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1423 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1424 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1425 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1426 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1427 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1428 rec_backup.buf + rec_backup.data_offset,
1429 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001430 }
1431
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001432 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001433 }
1434
Hanno Becker81e16a32019-03-01 11:21:44 +00001435exit:
1436
Hanno Beckerb3268da2018-01-05 15:20:24 +00001437 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001438 mbedtls_ssl_free(&ssl);
1439 mbedtls_ssl_transform_free(&t0);
1440 mbedtls_ssl_transform_free(&t1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001441 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001442 USE_PSA_DONE();
Hanno Beckerb3268da2018-01-05 15:20:24 +00001443}
1444/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03001445
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02001446/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_AES_C:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001447void ssl_decrypt_non_etm_cbc(int cipher_type, int hash_id, int trunc_hmac,
1448 int length_selector)
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001449{
1450 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001451 * Test record decryption for CBC without EtM, focused on the verification
1452 * of padding and MAC.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001453 *
1454 * Actually depends on TLS >= 1.0 (SSL 3.0 computes the MAC differently),
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02001455 * and either AES, ARIA, Camellia or DES, but since the test framework
1456 * doesn't support alternation in dependency statements, just depend on
1457 * TLS 1.2 and AES.
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001458 *
1459 * The length_selector argument is interpreted as follows:
1460 * - if it's -1, the plaintext length is 0 and minimal padding is applied
1461 * - if it's -2, the plaintext length is 0 and maximal padding is applied
1462 * - otherwise it must be in [0, 255] and is padding_length from RFC 5246:
1463 * it's the length of the rest of the padding, that is, excluding the
1464 * byte that encodes the length. The minimal non-zero plaintext length
1465 * that gives this padding_length is automatically selected.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001466 */
1467 mbedtls_ssl_context ssl; /* ONLY for debugging */
1468 mbedtls_ssl_transform t0, t1;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001469 mbedtls_record rec, rec_save;
1470 unsigned char *buf = NULL, *buf_save = NULL;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001471 size_t buflen, olen = 0;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001472 size_t plaintext_len, block_size, i;
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001473 unsigned char padlen; /* excluding the padding_length byte */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001474 unsigned char add_data[13];
1475 unsigned char mac[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001476 int exp_ret;
Manuel Pégourié-Gonnard4adc04a2020-07-16 10:00:48 +02001477 const unsigned char pad_max_len = 255; /* Per the standard */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001478
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001479 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02001480 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001481 mbedtls_ssl_transform_init(&t0);
1482 mbedtls_ssl_transform_init(&t1);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001483
1484 /* Set up transforms with dummy keys */
Yanray Wangc4638492022-10-26 11:51:53 +08001485 TEST_ASSERT(mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1486 0, trunc_hmac,
1487 MBEDTLS_SSL_MINOR_VERSION_3,
1488 0, 0) == 0);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001489
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001490 /* Determine padding/plaintext length */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001491 TEST_ASSERT(length_selector >= -2 && length_selector <= 255);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001492 block_size = t0.ivlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001493 if (length_selector < 0) {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001494 plaintext_len = 0;
1495
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001496 /* Minimal padding
1497 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001498 padlen = block_size - (t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001499
1500 /* Maximal padding? */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001501 if (length_selector == -2) {
1502 padlen += block_size * ((pad_max_len - padlen) / block_size);
1503 }
1504 } else {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001505 padlen = length_selector;
1506
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001507 /* Minimal non-zero plaintext_length giving desired padding.
1508 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001509 plaintext_len = block_size - (padlen + t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001510 }
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001511
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001512 /* Prepare a buffer for record data */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001513 buflen = block_size
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001514 + plaintext_len
1515 + t0.maclen
1516 + padlen + 1;
1517 ASSERT_ALLOC(buf, buflen);
1518 ASSERT_ALLOC(buf_save, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001519
1520 /* Prepare a dummy record header */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001521 memset(rec.ctr, 0, sizeof(rec.ctr));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001522 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
1523 rec.ver[0] = MBEDTLS_SSL_MAJOR_VERSION_3;
1524 rec.ver[1] = MBEDTLS_SSL_MINOR_VERSION_3;
1525#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1526 rec.cid_len = 0;
1527#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1528
1529 /* Prepare dummy record content */
1530 rec.buf = buf;
1531 rec.buf_len = buflen;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001532 rec.data_offset = block_size;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001533 rec.data_len = plaintext_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001534 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001535
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001536 /* Serialized version of record header for MAC purposes */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001537 memcpy(add_data, rec.ctr, 8);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001538 add_data[8] = rec.type;
1539 add_data[9] = rec.ver[0];
1540 add_data[10] = rec.ver[1];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001541 add_data[11] = (rec.data_len >> 8) & 0xff;
1542 add_data[12] = (rec.data_len >> 0) & 0xff;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001543
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001544 /* Set dummy IV */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001545 memset(t0.iv_enc, 0x55, t0.ivlen);
1546 memcpy(rec.buf, t0.iv_enc, t0.ivlen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001547
1548 /*
1549 * Prepare a pre-encryption record (with MAC and padding), and save it.
1550 */
1551
1552 /* MAC with additional data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001553 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc, add_data, 13));
1554 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc,
1555 rec.buf + rec.data_offset,
1556 rec.data_len));
1557 TEST_EQUAL(0, mbedtls_md_hmac_finish(&t0.md_ctx_enc, mac));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001558
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001559 memcpy(rec.buf + rec.data_offset + rec.data_len, mac, t0.maclen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001560 rec.data_len += t0.maclen;
1561
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001562 /* Pad */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001563 memset(rec.buf + rec.data_offset + rec.data_len, padlen, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001564 rec.data_len += padlen + 1;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001565
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001566 /* Save correct pre-encryption record */
1567 rec_save = rec;
1568 rec_save.buf = buf_save;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001569 memcpy(buf_save, buf, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001570
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001571 /*
1572 * Encrypt and decrypt the correct record, expecting success
1573 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001574 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1575 t0.iv_enc, t0.ivlen,
1576 rec.buf + rec.data_offset, rec.data_len,
1577 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001578 rec.data_offset -= t0.ivlen;
1579 rec.data_len += t0.ivlen;
1580
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001581 TEST_EQUAL(0, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001582
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001583 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001584 * Modify each byte of the pre-encryption record before encrypting and
1585 * decrypting it, expecting failure every time.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001586 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001587 for (i = block_size; i < buflen; i++) {
1588 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001589
1590 /* Restore correct pre-encryption record */
1591 rec = rec_save;
1592 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001593 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001594
Manuel Pégourié-Gonnardb51f0442020-07-21 10:40:25 +02001595 /* Corrupt one byte of the data (could be plaintext, MAC or padding) */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001596 rec.buf[i] ^= 0x01;
1597
1598 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001599 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1600 t0.iv_enc, t0.ivlen,
1601 rec.buf + rec.data_offset, rec.data_len,
1602 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001603 rec.data_offset -= t0.ivlen;
1604 rec.data_len += t0.ivlen;
1605
1606 /* Decrypt and expect failure */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001607 TEST_EQUAL(MBEDTLS_ERR_SSL_INVALID_MAC,
1608 mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001609 }
1610
1611 /*
1612 * Use larger values of the padding bytes - with small buffers, this tests
1613 * the case where the announced padlen would be larger than the buffer
1614 * (and before that, than the buffer minus the size of the MAC), to make
1615 * sure our padding checking code does not perform any out-of-bounds reads
1616 * in this case. (With larger buffers, ie when the plaintext is long or
1617 * maximal length padding is used, this is less relevant but still doesn't
1618 * hurt to test.)
1619 *
1620 * (Start the loop with correct padding, just to double-check that record
1621 * saving did work, and that we're overwriting the correct bytes.)
1622 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001623 for (i = padlen; i <= pad_max_len; i++) {
1624 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001625
1626 /* Restore correct pre-encryption record */
1627 rec = rec_save;
1628 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001629 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001630
1631 /* Set padding bytes to new value */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001632 memset(buf + buflen - padlen - 1, i, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001633
1634 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001635 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1636 t0.iv_enc, t0.ivlen,
1637 rec.buf + rec.data_offset, rec.data_len,
1638 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001639 rec.data_offset -= t0.ivlen;
1640 rec.data_len += t0.ivlen;
1641
1642 /* Decrypt and expect failure except the first time */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001643 exp_ret = (i == padlen) ? 0 : MBEDTLS_ERR_SSL_INVALID_MAC;
1644 TEST_EQUAL(exp_ret, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001645 }
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001646
1647exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001648 mbedtls_ssl_free(&ssl);
1649 mbedtls_ssl_transform_free(&t0);
1650 mbedtls_ssl_transform_free(&t1);
1651 mbedtls_free(buf);
1652 mbedtls_free(buf_save);
Valerio Setti44570a52023-04-19 15:10:45 +02001653 USE_PSA_DONE();
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001654}
1655/* END_CASE */
1656
Hanno Becker39ff4922020-08-21 13:36:56 +01001657/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001658void ssl_tls1_3_hkdf_expand_label(int hash_alg,
1659 data_t *secret,
1660 int label_idx,
1661 data_t *ctx,
1662 int desired_length,
1663 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01001664{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001665 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01001666
Hanno Becker70d7fb02020-09-09 10:11:21 +01001667 unsigned char const *lbl = NULL;
1668 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001669#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1670 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001671 { \
1672 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001673 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001674 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001675 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001676#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001677 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01001678
1679 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001680 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1681 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001682
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001683 TEST_ASSERT(mbedtls_ssl_tls1_3_hkdf_expand_label(
1684 (mbedtls_md_type_t) hash_alg,
1685 secret->x, secret->len,
1686 lbl, lbl_len,
1687 ctx->x, ctx->len,
1688 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01001689
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001690 ASSERT_COMPARE(dst, (size_t) desired_length,
1691 expected->x, (size_t) expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001692}
1693/* END_CASE */
1694
Hanno Becker19498f82020-08-21 13:37:08 +01001695/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001696void ssl_tls1_3_traffic_key_generation(int hash_alg,
1697 data_t *server_secret,
1698 data_t *client_secret,
1699 int desired_iv_len,
1700 int desired_key_len,
1701 data_t *expected_server_write_key,
1702 data_t *expected_server_write_iv,
1703 data_t *expected_client_write_key,
1704 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01001705{
1706 mbedtls_ssl_key_set keys;
1707
1708 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001709 TEST_ASSERT(client_secret->len == server_secret->len);
Yanray Wang82b41492023-03-14 12:26:44 +08001710 TEST_ASSERT(
1711 expected_client_write_iv->len == expected_server_write_iv->len &&
1712 expected_client_write_iv->len == (size_t) desired_iv_len);
1713 TEST_ASSERT(
1714 expected_client_write_key->len == expected_server_write_key->len &&
1715 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001716
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001717 TEST_ASSERT(mbedtls_ssl_tls1_3_make_traffic_keys(
1718 (mbedtls_md_type_t) hash_alg,
1719 client_secret->x,
1720 server_secret->x,
1721 client_secret->len /* == server_secret->len */,
1722 desired_key_len, desired_iv_len,
1723 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01001724
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001725 ASSERT_COMPARE(keys.client_write_key,
1726 keys.key_len,
1727 expected_client_write_key->x,
1728 (size_t) desired_key_len);
1729 ASSERT_COMPARE(keys.server_write_key,
1730 keys.key_len,
1731 expected_server_write_key->x,
1732 (size_t) desired_key_len);
1733 ASSERT_COMPARE(keys.client_write_iv,
1734 keys.iv_len,
1735 expected_client_write_iv->x,
1736 (size_t) desired_iv_len);
1737 ASSERT_COMPARE(keys.server_write_iv,
1738 keys.iv_len,
1739 expected_server_write_iv->x,
1740 (size_t) desired_iv_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001741}
1742/* END_CASE */
1743
Hanno Beckere4849d12020-08-21 14:14:14 +01001744/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001745void ssl_tls1_3_derive_secret(int hash_alg,
1746 data_t *secret,
1747 int label_idx,
1748 data_t *ctx,
1749 int desired_length,
1750 int already_hashed,
1751 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01001752{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001753 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01001754
Hanno Becker70d7fb02020-09-09 10:11:21 +01001755 unsigned char const *lbl = NULL;
1756 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001757#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1758 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001759 { \
1760 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001761 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001762 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001763 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001764#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001765 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01001766
Hanno Beckere4849d12020-08-21 14:14:14 +01001767 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001768 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1769 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01001770
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001771 TEST_ASSERT(mbedtls_ssl_tls1_3_derive_secret(
1772 (mbedtls_md_type_t) hash_alg,
1773 secret->x, secret->len,
1774 lbl, lbl_len,
1775 ctx->x, ctx->len,
1776 already_hashed,
1777 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01001778
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001779 ASSERT_COMPARE(dst, desired_length,
1780 expected->x, desired_length);
Hanno Beckere4849d12020-08-21 14:14:14 +01001781}
1782/* END_CASE */
1783
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001784/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001785void ssl_tls1_3_key_evolution(int hash_alg,
1786 data_t *secret,
1787 data_t *input,
1788 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001789{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001790 unsigned char secret_new[MBEDTLS_MD_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001791
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001792 TEST_ASSERT(mbedtls_ssl_tls1_3_evolve_secret(
1793 (mbedtls_md_type_t) hash_alg,
1794 secret->len ? secret->x : NULL,
1795 input->len ? input->x : NULL, input->len,
1796 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001797
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001798 ASSERT_COMPARE(secret_new, (size_t) expected->len,
1799 expected->x, (size_t) expected->len);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001800}
1801/* END_CASE */
1802
Ron Eldor824ad7b2019-05-13 14:09:00 +03001803/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001804void ssl_tls_prf(int type, data_t *secret, data_t *random,
1805 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03001806{
1807 unsigned char *output;
1808
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001809 output = mbedtls_calloc(1, result_str->len);
1810 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03001811 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001812 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03001813
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001814 USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03001815
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001816 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
1817 label, random->x, random->len,
1818 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001819
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001820 if (exp_ret == 0) {
1821 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
1822 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001823 }
1824exit:
1825
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001826 mbedtls_free(output);
1827 USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03001828}
1829/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001830
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001831/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001832void ssl_serialize_session_save_load(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001833{
1834 mbedtls_ssl_session original, restored;
1835 unsigned char *buf = NULL;
1836 size_t len;
1837
1838 /*
1839 * Test that a save-load pair is the identity
1840 */
Valerio Setti44570a52023-04-19 15:10:45 +02001841 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001842 mbedtls_ssl_session_init(&original);
1843 mbedtls_ssl_session_init(&restored);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001844
1845 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001846 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1847 &original, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001848
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001849 /* Serialize it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001850 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
1851 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1852 TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL);
1853 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
1854 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001855
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001856 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001857 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001858
1859 /*
1860 * Make sure both session structures are identical
1861 */
1862#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001863 TEST_ASSERT(original.start == restored.start);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001864#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001865 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
1866 TEST_ASSERT(original.compression == restored.compression);
1867 TEST_ASSERT(original.id_len == restored.id_len);
1868 TEST_ASSERT(memcmp(original.id,
1869 restored.id, sizeof(original.id)) == 0);
1870 TEST_ASSERT(memcmp(original.master,
1871 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001872
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001873#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
1874 defined(MBEDTLS_CERTS_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001875#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001876 TEST_ASSERT((original.peer_cert == NULL) ==
1877 (restored.peer_cert == NULL));
1878 if (original.peer_cert != NULL) {
1879 TEST_ASSERT(original.peer_cert->raw.len ==
1880 restored.peer_cert->raw.len);
1881 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
1882 restored.peer_cert->raw.p,
1883 original.peer_cert->raw.len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001884 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001885#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001886 TEST_ASSERT(original.peer_cert_digest_type ==
1887 restored.peer_cert_digest_type);
1888 TEST_ASSERT(original.peer_cert_digest_len ==
1889 restored.peer_cert_digest_len);
1890 TEST_ASSERT((original.peer_cert_digest == NULL) ==
1891 (restored.peer_cert_digest == NULL));
1892 if (original.peer_cert_digest != NULL) {
1893 TEST_ASSERT(memcmp(original.peer_cert_digest,
1894 restored.peer_cert_digest,
1895 original.peer_cert_digest_len) == 0);
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001896 }
1897#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001898#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001899 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001900
1901#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001902 TEST_ASSERT(original.ticket_len == restored.ticket_len);
1903 if (original.ticket_len != 0) {
1904 TEST_ASSERT(original.ticket != NULL);
1905 TEST_ASSERT(restored.ticket != NULL);
1906 TEST_ASSERT(memcmp(original.ticket,
1907 restored.ticket, original.ticket_len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001908 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001909 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001910#endif
1911
1912#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001913 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001914#endif
1915
1916#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001917 TEST_ASSERT(original.trunc_hmac == restored.trunc_hmac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001918#endif
1919
1920#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001921 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001922#endif
1923
1924exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001925 mbedtls_ssl_session_free(&original);
1926 mbedtls_ssl_session_free(&restored);
1927 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001928 USE_PSA_DONE();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001929}
1930/* END_CASE */
1931
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02001932/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001933void ssl_serialize_session_load_save(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001934{
1935 mbedtls_ssl_session session;
1936 unsigned char *buf1 = NULL, *buf2 = NULL;
1937 size_t len0, len1, len2;
1938
1939 /*
1940 * Test that a load-save pair is the identity
1941 */
Valerio Setti44570a52023-04-19 15:10:45 +02001942 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001943 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001944
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001945 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001946 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1947 &session, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001948
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001949 /* Get desired buffer size for serializing */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001950 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
1951 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001952
1953 /* Allocate first buffer */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001954 buf1 = mbedtls_calloc(1, len0);
1955 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001956
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001957 /* Serialize to buffer and free live session */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001958 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
1959 == 0);
1960 TEST_ASSERT(len0 == len1);
1961 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001962
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001963 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001964 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001965
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001966 /* Allocate second buffer and serialize to it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001967 buf2 = mbedtls_calloc(1, len0);
1968 TEST_ASSERT(buf2 != NULL);
1969 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
1970 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001971
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001972 /* Make sure both serialized versions are identical */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001973 TEST_ASSERT(len1 == len2);
1974 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001975
1976exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001977 mbedtls_ssl_session_free(&session);
1978 mbedtls_free(buf1);
1979 mbedtls_free(buf2);
Valerio Setti44570a52023-04-19 15:10:45 +02001980 USE_PSA_DONE();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001981}
1982/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001983
1984/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001985void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001986{
1987 mbedtls_ssl_session session;
1988 unsigned char *buf = NULL;
1989 size_t good_len, bad_len, test_len;
1990
1991 /*
1992 * Test that session_save() fails cleanly on small buffers
1993 */
Valerio Setti44570a52023-04-19 15:10:45 +02001994 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001995 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001996
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001997 /* Prepare dummy session and get serialized size */
Yanray Wang862ef862023-03-14 11:05:04 +08001998 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1999 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002000 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2001 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002002
2003 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002004 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002005 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002006 mbedtls_free(buf);
2007 TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL);
2008 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
2009 &test_len)
2010 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2011 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002012 }
2013
2014exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002015 mbedtls_ssl_session_free(&session);
2016 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02002017 USE_PSA_DONE();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002018}
2019/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002020
2021/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002022void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002023{
2024 mbedtls_ssl_session session;
2025 unsigned char *good_buf = NULL, *bad_buf = NULL;
2026 size_t good_len, bad_len;
2027
2028 /*
2029 * Test that session_load() fails cleanly on small buffers
2030 */
Valerio Setti44570a52023-04-19 15:10:45 +02002031 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002032 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002033
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002034 /* Prepare serialized session data */
Yanray Wang862ef862023-03-14 11:05:04 +08002035 TEST_ASSERT(mbedtls_test_ssl_populate_session(
2036 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002037 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2038 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2039 TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL);
2040 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
2041 &good_len) == 0);
2042 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002043
2044 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002045 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002046 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002047 mbedtls_free(bad_buf);
2048 bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1);
2049 TEST_ASSERT(bad_buf != NULL);
2050 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002051
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002052 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
2053 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002054 }
2055
2056exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002057 mbedtls_ssl_session_free(&session);
2058 mbedtls_free(good_buf);
2059 mbedtls_free(bad_buf);
Valerio Setti44570a52023-04-19 15:10:45 +02002060 USE_PSA_DONE();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002061}
2062/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002063
Hanno Becker363b6462019-05-29 12:44:28 +01002064/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002065void ssl_session_serialize_version_check(int corrupt_major,
2066 int corrupt_minor,
2067 int corrupt_patch,
2068 int corrupt_config)
Hanno Becker861d0bb2019-05-21 16:39:30 +01002069{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002070 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01002071 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002072 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002073 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002074 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2075 corrupt_minor == 1,
2076 corrupt_patch == 1,
2077 corrupt_config == 1,
2078 corrupt_config == 1 };
2079
Valerio Setti44570a52023-04-19 15:10:45 +02002080 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002081 mbedtls_ssl_session_init(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002082
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002083 /* Infer length of serialized session. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002084 TEST_ASSERT(mbedtls_ssl_session_save(&session,
2085 serialized_session,
2086 sizeof(serialized_session),
2087 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002088
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002089 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002090
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002091 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002092 * de-serialize the session - double-check that. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002093 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2094 serialized_session,
2095 serialized_session_len) == 0);
2096 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002097
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002098 /* Go through the bytes in the serialized session header and
2099 * corrupt them bit-by-bit. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002100 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002101 int cur_bit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002102 unsigned char * const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002103
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002104 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002105 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002106 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002107
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002108 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002109 unsigned char const corrupted_bit = 0x1u << cur_bit;
2110 /* Modify a single bit in the serialized session. */
2111 *byte ^= corrupted_bit;
2112
2113 /* Attempt to deserialize */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002114 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2115 serialized_session,
2116 serialized_session_len) ==
2117 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002118
2119 /* Undo the change */
2120 *byte ^= corrupted_bit;
2121 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002122 }
Valerio Setti44570a52023-04-19 15:10:45 +02002123 USE_PSA_DONE();
Hanno Becker861d0bb2019-05-21 16:39:30 +01002124}
2125/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002126
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002127/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002128void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002129{
2130 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002131 mbedtls_test_ssl_endpoint ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002132 int ret = -1;
2133
Valerio Setti44570a52023-04-19 15:10:45 +02002134 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +08002135 ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, MBEDTLS_PK_RSA,
2136 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002137 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002138
Yanray Wangc4638492022-10-26 11:51:53 +08002139 ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, MBEDTLS_PK_RSA);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002140 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002141
Yanray Wangc4638492022-10-26 11:51:53 +08002142 ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, MBEDTLS_PK_RSA,
2143 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002144 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002145
2146exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002147 mbedtls_test_ssl_endpoint_free(&ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02002148 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002149}
2150/* END_CASE */
2151
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002152/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002153void move_handshake_to_state(int endpoint_type, int state, int need_pass)
2154{
2155 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002156 mbedtls_test_ssl_endpoint base_ep, second_ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002157 int ret = -1;
2158
Valerio Setti44570a52023-04-19 15:10:45 +02002159 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002160 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
2161 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Andrzej Kurek0d2982b2022-10-18 07:55:46 -04002162
Yanray Wang862ef862023-03-14 11:05:04 +08002163 ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type,
2164 MBEDTLS_PK_RSA,
Yanray Wangc4638492022-10-26 11:51:53 +08002165 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002166 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002167
Yanray Wang862ef862023-03-14 11:05:04 +08002168 ret = mbedtls_test_ssl_endpoint_init(
2169 &second_ep,
2170 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
2171 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
2172 MBEDTLS_PK_RSA, NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002173 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002174
Yanray Wangc4638492022-10-26 11:51:53 +08002175 ret = mbedtls_test_mock_socket_connect(&(base_ep.socket),
2176 &(second_ep.socket),
2177 BUFFSIZE);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002178 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002179
Yanray Wangc4638492022-10-26 11:51:53 +08002180 ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl),
2181 &(second_ep.ssl),
2182 state);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002183 if (need_pass) {
2184 TEST_ASSERT(ret == 0);
2185 TEST_ASSERT(base_ep.ssl.state == state);
2186 } else {
2187 TEST_ASSERT(ret != 0);
2188 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002189 }
2190
2191exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002192 mbedtls_test_ssl_endpoint_free(&base_ep, NULL);
2193 mbedtls_test_ssl_endpoint_free(&second_ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02002194 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002195}
2196/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002197
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002198/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002199void handshake_version(int dtls, int client_min_version, int client_max_version,
2200 int server_min_version, int server_max_version,
2201 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002202{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002203 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002204 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002205
Paul Elliottc8570442020-04-15 17:00:50 +01002206 options.client_min_version = client_min_version;
2207 options.client_max_version = client_max_version;
2208 options.server_min_version = server_min_version;
2209 options.server_max_version = server_max_version;
2210
2211 options.expected_negotiated_version = expected_negotiated_version;
2212
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002213 options.dtls = dtls;
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002214 /* By default, SSLv3.0 and TLSv1.0 use 1/n-1 splitting when sending data, so
2215 * the number of fragments will be twice as big. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002216 if (expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_0 ||
2217 expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_1) {
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002218 options.expected_cli_fragments = 2;
2219 options.expected_srv_fragments = 2;
Andrzej Kurek941962e2020-02-07 09:20:32 -05002220 }
Yanray Wangc4638492022-10-26 11:51:53 +08002221 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002222
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002223 /* The goto below is used to avoid an "unused label" warning.*/
2224 goto exit;
2225}
2226/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05002227
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002228/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002229void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002230{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002231 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002232 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002233
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002234 options.cipher = cipher;
2235 options.dtls = dtls;
2236 options.psk_str = psk_str;
2237 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05002238
Yanray Wangc4638492022-10-26 11:51:53 +08002239 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002240
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002241 /* The goto below is used to avoid an "unused label" warning.*/
2242 goto exit;
2243}
2244/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002245
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002246/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002247void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002248{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002249 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002250
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002251 /* The goto below is used to avoid an "unused label" warning.*/
2252 goto exit;
2253}
2254/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002255
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002256/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002257void app_data(int mfl, int cli_msg_len, int srv_msg_len,
2258 int expected_cli_fragments,
2259 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002260{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002261 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002262 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002263
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002264 options.mfl = mfl;
2265 options.cli_msg_len = cli_msg_len;
2266 options.srv_msg_len = srv_msg_len;
2267 options.expected_cli_fragments = expected_cli_fragments;
2268 options.expected_srv_fragments = expected_srv_fragments;
2269 options.dtls = dtls;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002270
Yanray Wangc4638492022-10-26 11:51:53 +08002271 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002272 /* The goto below is used to avoid an "unused label" warning.*/
2273 goto exit;
2274}
2275/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002276
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002277/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002278void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
2279 int expected_cli_fragments,
2280 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002281{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002282 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2283 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002284 /* The goto below is used to avoid an "unused label" warning.*/
2285 goto exit;
2286}
2287/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002288
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002289/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002290void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
2291 int expected_cli_fragments,
2292 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002293{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002294 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2295 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002296 /* The goto below is used to avoid an "unused label" warning.*/
2297 goto exit;
2298}
2299/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002300
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002301/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002302void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002303{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002304 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002305 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002306
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002307 options.serialize = 1;
2308 options.dtls = 1;
Yanray Wangc4638492022-10-26 11:51:53 +08002309 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002310 /* The goto below is used to avoid an "unused label" warning.*/
2311 goto exit;
2312}
2313/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002314
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002315/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED*/
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002316void handshake_fragmentation(int mfl,
2317 int expected_srv_hs_fragmentation,
2318 int expected_cli_hs_fragmentation)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002319{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002320 mbedtls_test_handshake_test_options options;
2321 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002322
2323 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
2324 srv_pattern.counter = 0;
2325 cli_pattern.counter = 0;
2326
Yanray Wangc4638492022-10-26 11:51:53 +08002327 mbedtls_test_init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002328 options.dtls = 1;
2329 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00002330 /* Set cipher to one using CBC so that record splitting can be tested */
2331 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002332 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
2333 options.srv_log_obj = &srv_pattern;
2334 options.cli_log_obj = &cli_pattern;
Yanray Wangc4638492022-10-26 11:51:53 +08002335 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
2336 options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002337
Yanray Wangc4638492022-10-26 11:51:53 +08002338 mbedtls_test_ssl_perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002339
2340 /* Test if the server received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002341 if (expected_srv_hs_fragmentation) {
2342 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002343 }
2344 /* Test if the client received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002345 if (expected_cli_hs_fragmentation) {
2346 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002347 }
2348}
2349/* END_CASE */
2350
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002351/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002352void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002353{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002354 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002355 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002356
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002357 options.renegotiate = 1;
2358 options.legacy_renegotiation = legacy_renegotiation;
2359 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002360
Yanray Wangc4638492022-10-26 11:51:53 +08002361 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002362 /* The goto below is used to avoid an "unused label" warning.*/
2363 goto exit;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002364}
2365/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002366
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002367/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002368void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
2369 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002370{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002371 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002372 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002373
2374 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04002375 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002376 options.renegotiate = renegotiation;
2377 options.legacy_renegotiation = legacy_renegotiation;
2378 options.serialize = serialize;
2379 options.dtls = dtls;
2380 options.resize_buffers = 1;
2381
Yanray Wangc4638492022-10-26 11:51:53 +08002382 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002383 /* The goto below is used to avoid an "unused label" warning.*/
2384 goto exit;
2385}
2386/* END_CASE */
2387
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002388/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002389void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002390{
Valerio Setti44570a52023-04-19 15:10:45 +02002391 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002392 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
2393 (char *) "");
Valerio Setti44570a52023-04-19 15:10:45 +02002394 USE_PSA_DONE();
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002395 /* The goto below is used to avoid an "unused label" warning.*/
2396 goto exit;
2397}
2398/* END_CASE */
2399
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002400/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002401void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
2402 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002403{
Valerio Setti44570a52023-04-19 15:10:45 +02002404 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002405 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Valerio Setti44570a52023-04-19 15:10:45 +02002406 USE_PSA_DONE();
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002407 /* The goto below is used to avoid an "unused label" warning.*/
2408 goto exit;
2409}
2410/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02002411
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002412/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_ECDSA_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002413void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002414{
2415 enum { BUFFSIZE = 17000 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002416 mbedtls_test_ssl_endpoint client, server;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002417 mbedtls_psa_stats_t stats;
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002418 size_t free_slots_before = -1;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002419
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002420 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP256R1,
2421 MBEDTLS_ECP_DP_NONE };
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002422 USE_PSA_INIT();
2423 mbedtls_platform_zeroize(&client, sizeof(client));
2424 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002425
2426 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek9cb14d42022-04-14 08:51:41 -04002427 * the raw key agreement. Flipping the first byte makes the
2428 * required 0x04 identifier invalid. */
Yanray Wangc4638492022-10-26 11:51:53 +08002429 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
2430 MBEDTLS_PK_ECDSA, NULL, NULL,
2431 NULL, curve_list), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002432
2433 /* Server side */
Yanray Wangc4638492022-10-26 11:51:53 +08002434 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
2435 MBEDTLS_PK_ECDSA, NULL, NULL,
2436 NULL, NULL), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002437
Yanray Wangc4638492022-10-26 11:51:53 +08002438 TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket),
2439 &(server.socket),
2440 BUFFSIZE), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002441
Yanray Wang862ef862023-03-14 11:05:04 +08002442 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2443 &(client.ssl), &(server.ssl),
2444 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002445 , 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002446
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002447 mbedtls_psa_get_stats(&stats);
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002448 /* Save the number of slots in use up to this point.
2449 * With PSA, one can be used for the ECDH private key. */
2450 free_slots_before = stats.empty_slots;
Andrzej Kurek99f67782022-03-31 07:17:18 -04002451
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002452 if (bad_server_ecdhe_key) {
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002453 /* Force a simulated bitflip in the server key. to make the
2454 * raw key agreement in ssl_write_client_key_exchange fail. */
2455 (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
2456 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002457
Yanray Wang862ef862023-03-14 11:05:04 +08002458 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2459 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER),
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002460 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002461
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002462 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002463
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002464 /* Make sure that the key slot is already destroyed in case of failure,
2465 * without waiting to close the connection. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002466 if (bad_server_ecdhe_key) {
2467 TEST_EQUAL(free_slots_before, stats.empty_slots);
2468 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002469
2470exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002471 mbedtls_test_ssl_endpoint_free(&client, NULL);
2472 mbedtls_test_ssl_endpoint_free(&server, NULL);
Andrzej Kurek99f67782022-03-31 07:17:18 -04002473
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002474 USE_PSA_DONE();
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002475}
2476/* END_CASE */
Andrzej Kurek862acb82022-06-06 13:08:23 -04002477
Andrzej Kurek3c036f52022-06-08 11:57:57 -04002478/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002479void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurek862acb82022-06-06 13:08:23 -04002480{
2481 mbedtls_ssl_context ssl;
2482 mbedtls_ssl_config conf;
2483 size_t len;
2484
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002485 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02002486 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002487 mbedtls_ssl_config_init(&conf);
2488 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
2489 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2490 MBEDTLS_SSL_PRESET_DEFAULT),
2491 0);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002492
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002493 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
2494 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
2495 ssl.cli_id_len,
2496 cookie->x, cookie->len,
2497 ssl.out_buf,
2498 MBEDTLS_SSL_OUT_CONTENT_LEN,
2499 &len),
2500 exp_ret);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002501
Valerio Setti44570a52023-04-19 15:10:45 +02002502exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002503 mbedtls_ssl_free(&ssl);
2504 mbedtls_ssl_config_free(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02002505 USE_PSA_DONE();
Andrzej Kurek862acb82022-06-06 13:08:23 -04002506}
2507/* END_CASE */