blob: 0a35aa97342d271ef226320a99341e992b6ea9f8 [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
Valerio Setti8388fdd2023-04-28 12:27:14 +02008#define SSL_MESSAGE_QUEUE_INIT { NULL, 0, 0, 0 }
9
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +020010/* END_HEADER */
11
12/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020013 * depends_on:MBEDTLS_SSL_TLS_C
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +020014 * END_DEPENDENCIES
15 */
16
Janos Follath6264e662019-11-26 11:11:15 +000017/* BEGIN_CASE */
18void test_callback_buffer_sanity()
19{
20 enum { MSGLEN = 10 };
Yanray Wangabfdcd82022-10-25 16:44:13 +080021 mbedtls_test_ssl_buffer buf;
Janos Follath6264e662019-11-26 11:11:15 +000022 unsigned char input[MSGLEN];
23 unsigned char output[MSGLEN];
24
Valerio Setti44570a52023-04-19 15:10:45 +020025 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010026 memset(input, 0, sizeof(input));
Janos Follath6264e662019-11-26 11:11:15 +000027
28 /* Make sure calling put and get on NULL buffer results in error. */
Yanray Wangc4638492022-10-26 11:51:53 +080029 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, input, sizeof(input))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010030 == -1);
Yanray Wangc4638492022-10-26 11:51:53 +080031 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, output, sizeof(output))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010032 == -1);
Yanray Wang862ef862023-03-14 11:05:04 +080033 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, sizeof(input))
34 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -050035
Yanray Wangc4638492022-10-26 11:51:53 +080036 TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, 0) == -1);
37 TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +000038
39 /* Make sure calling put and get on a buffer that hasn't been set up results
Shaun Case0e7791f2021-12-20 21:14:10 -080040 * in error. */
Yanray Wangc4638492022-10-26 11:51:53 +080041 mbedtls_test_ssl_buffer_init(&buf);
Janos Follath6264e662019-11-26 11:11:15 +000042
Yanray Wang862ef862023-03-14 11:05:04 +080043 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
44 == -1);
Yanray Wangc4638492022-10-26 11:51:53 +080045 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, sizeof(output))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010046 == -1);
Yanray Wang862ef862023-03-14 11:05:04 +080047 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
48 == -1);
Andrzej Kurekf7774142020-01-22 06:34:59 -050049
Yanray Wangc4638492022-10-26 11:51:53 +080050 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == -1);
51 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == -1);
Janos Follath6264e662019-11-26 11:11:15 +000052
Andrzej Kurekf7774142020-01-22 06:34:59 -050053 /* Make sure calling put and get on NULL input only results in
54 * error if the length is not zero, and that a NULL output is valid for data
55 * dropping.
56 */
Janos Follath6264e662019-11-26 11:11:15 +000057
Yanray Wangc4638492022-10-26 11:51:53 +080058 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, sizeof(input)) == 0);
Janos Follath6264e662019-11-26 11:11:15 +000059
Yanray Wang862ef862023-03-14 11:05:04 +080060 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
61 == -1);
Yanray Wangc4638492022-10-26 11:51:53 +080062 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, sizeof(output))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010063 == 0);
Yanray Wangc4638492022-10-26 11:51:53 +080064 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == 0);
65 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == 0);
Janos Follath6264e662019-11-26 11:11:15 +000066
Piotr Nowickifb437d72020-01-13 16:59:12 +010067 /* Make sure calling put several times in the row is safe */
68
Yanray Wangc4638492022-10-26 11:51:53 +080069 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010070 == sizeof(input));
Yanray Wangc4638492022-10-26 11:51:53 +080071 TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, 2) == 2);
72 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 1) == 1);
73 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 1);
74 TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 0);
Piotr Nowickifb437d72020-01-13 16:59:12 +010075
76
Janos Follath6264e662019-11-26 11:11:15 +000077exit:
Yanray Wangc4638492022-10-26 11:51:53 +080078 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti44570a52023-04-19 15:10:45 +020079 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +000080}
81/* END_CASE */
82
83/*
Yanray Wangabfdcd82022-10-25 16:44:13 +080084 * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is
Janos Follath6264e662019-11-26 11:11:15 +000085 * correct and works as expected.
86 *
87 * That is
88 * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
89 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
90 * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
91 * bytes.
92 * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
93 * - All of the bytes we got match the bytes we put in in a FIFO manner.
94 */
95
96/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010097void test_callback_buffer(int size, int put1, int put1_ret,
98 int get1, int get1_ret, int put2, int put2_ret,
99 int get2, int get2_ret)
Janos Follath6264e662019-11-26 11:11:15 +0000100{
101 enum { ROUNDS = 2 };
102 size_t put[ROUNDS];
103 int put_ret[ROUNDS];
104 size_t get[ROUNDS];
105 int get_ret[ROUNDS];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800106 mbedtls_test_ssl_buffer buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100107 unsigned char *input = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000108 size_t input_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100109 unsigned char *output = NULL;
Janos Follath6264e662019-11-26 11:11:15 +0000110 size_t output_len;
Janos Follath031827f2019-11-27 11:12:14 +0000111 size_t i, j, written, read;
Janos Follath6264e662019-11-26 11:11:15 +0000112
Yanray Wangc4638492022-10-26 11:51:53 +0800113 mbedtls_test_ssl_buffer_init(&buf);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200114 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800115 TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, size) == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000116
117 /* Check the sanity of input parameters and initialise local variables. That
118 * is, ensure that the amount of data is not negative and that we are not
119 * expecting more to put or get than we actually asked for. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100120 TEST_ASSERT(put1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000121 put[0] = put1;
122 put_ret[0] = put1_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100123 TEST_ASSERT(put1_ret <= put1);
124 TEST_ASSERT(put2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000125 put[1] = put2;
126 put_ret[1] = put2_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100127 TEST_ASSERT(put2_ret <= put2);
Janos Follath6264e662019-11-26 11:11:15 +0000128
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100129 TEST_ASSERT(get1 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000130 get[0] = get1;
131 get_ret[0] = get1_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100132 TEST_ASSERT(get1_ret <= get1);
133 TEST_ASSERT(get2 >= 0);
Janos Follath6264e662019-11-26 11:11:15 +0000134 get[1] = get2;
135 get_ret[1] = get2_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100136 TEST_ASSERT(get2_ret <= get2);
Janos Follath6264e662019-11-26 11:11:15 +0000137
138 input_len = 0;
139 /* Calculate actual input and output lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100140 for (j = 0; j < ROUNDS; j++) {
141 if (put_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000142 input_len += put_ret[j];
143 }
144 }
145 /* In order to always have a valid pointer we always allocate at least 1
146 * byte. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100147 if (input_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000148 input_len = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100149 }
Tom Cosgrove30ceb232023-09-04 11:20:19 +0100150 TEST_CALLOC(input, input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000151
152 output_len = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100153 for (j = 0; j < ROUNDS; j++) {
154 if (get_ret[j] > 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000155 output_len += get_ret[j];
156 }
157 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100158 TEST_ASSERT(output_len <= input_len);
Janos Follath6264e662019-11-26 11:11:15 +0000159 /* In order to always have a valid pointer we always allocate at least 1
160 * byte. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100161 if (output_len == 0) {
Janos Follath6264e662019-11-26 11:11:15 +0000162 output_len = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100163 }
Tom Cosgrove30ceb232023-09-04 11:20:19 +0100164 TEST_CALLOC(output, output_len);
Janos Follath6264e662019-11-26 11:11:15 +0000165
166 /* Fill up the buffer with structured data so that unwanted changes
167 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100168 for (i = 0; i < input_len; i++) {
Janos Follath6264e662019-11-26 11:11:15 +0000169 input[i] = i & 0xFF;
170 }
171
172 written = read = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100173 for (j = 0; j < ROUNDS; j++) {
Yanray Wangc4638492022-10-26 11:51:53 +0800174 TEST_ASSERT(put_ret[j] == mbedtls_test_ssl_buffer_put(&buf,
175 input + written, put[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000176 written += put_ret[j];
Yanray Wangc4638492022-10-26 11:51:53 +0800177 TEST_ASSERT(get_ret[j] == mbedtls_test_ssl_buffer_get(&buf,
178 output + read, get[j]));
Janos Follath6264e662019-11-26 11:11:15 +0000179 read += get_ret[j];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100180 TEST_ASSERT(read <= written);
181 if (get_ret[j] > 0) {
182 TEST_ASSERT(memcmp(output + read - get_ret[j],
183 input + read - get_ret[j], get_ret[j])
184 == 0);
Janos Follath6264e662019-11-26 11:11:15 +0000185 }
186 }
187
188exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100189 mbedtls_free(input);
190 mbedtls_free(output);
Yanray Wangc4638492022-10-26 11:51:53 +0800191 mbedtls_test_ssl_buffer_free(&buf);
Valerio Setti44570a52023-04-19 15:10:45 +0200192 USE_PSA_DONE();
Janos Follath6264e662019-11-26 11:11:15 +0000193}
194/* END_CASE */
195
Janos Follath031827f2019-11-27 11:12:14 +0000196/*
Yanray Wang862ef862023-03-14 11:05:04 +0800197 * Test if the implementation of `mbedtls_test_mock_socket` related
198 * I/O functions is correct and works as expected on unconnected sockets.
Janos Follathc673c2c2019-12-02 15:47:26 +0000199 */
200
201/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100202void ssl_mock_sanity()
Janos Follathc673c2c2019-12-02 15:47:26 +0000203{
204 enum { MSGLEN = 105 };
Paul Elliott95457862021-11-24 16:54:26 +0000205 unsigned char message[MSGLEN] = { 0 };
206 unsigned char received[MSGLEN] = { 0 };
Yanray Wangabfdcd82022-10-25 16:44:13 +0800207 mbedtls_test_mock_socket socket;
Janos Follathc673c2c2019-12-02 15:47:26 +0000208
Yanray Wangd02c3172023-03-15 16:02:29 +0800209 mbedtls_test_mock_socket_init(&socket);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200210 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800211 TEST_ASSERT(mbedtls_test_mock_tcp_send_b(&socket, message, MSGLEN) < 0);
212 mbedtls_test_mock_socket_close(&socket);
Yanray Wangd02c3172023-03-15 16:02:29 +0800213 mbedtls_test_mock_socket_init(&socket);
Yanray Wangc4638492022-10-26 11:51:53 +0800214 TEST_ASSERT(mbedtls_test_mock_tcp_recv_b(&socket, received, MSGLEN) < 0);
215 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000216
Yanray Wangd02c3172023-03-15 16:02:29 +0800217 mbedtls_test_mock_socket_init(&socket);
Yanray Wangc4638492022-10-26 11:51:53 +0800218 TEST_ASSERT(mbedtls_test_mock_tcp_send_nb(&socket, message, MSGLEN) < 0);
219 mbedtls_test_mock_socket_close(&socket);
Yanray Wangd02c3172023-03-15 16:02:29 +0800220 mbedtls_test_mock_socket_init(&socket);
Yanray Wangc4638492022-10-26 11:51:53 +0800221 TEST_ASSERT(mbedtls_test_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0);
222 mbedtls_test_mock_socket_close(&socket);
Janos Follathc673c2c2019-12-02 15:47:26 +0000223
224exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800225 mbedtls_test_mock_socket_close(&socket);
Valerio Setti44570a52023-04-19 15:10:45 +0200226 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000227}
228/* END_CASE */
229
230/*
Yanray Wang862ef862023-03-14 11:05:04 +0800231 * Test if the implementation of `mbedtls_test_mock_socket` related functions
232 * can send a single message from the client to the server.
Janos Follath031827f2019-11-27 11:12:14 +0000233 */
234
235/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100236void ssl_mock_tcp(int blocking)
Janos Follath031827f2019-11-27 11:12:14 +0000237{
Janos Follathc673c2c2019-12-02 15:47:26 +0000238 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100239 enum { BUFLEN = MSGLEN / 5 };
Janos Follathc673c2c2019-12-02 15:47:26 +0000240 unsigned char message[MSGLEN];
241 unsigned char received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800242 mbedtls_test_mock_socket client;
243 mbedtls_test_mock_socket server;
Janos Follathc673c2c2019-12-02 15:47:26 +0000244 size_t written, read;
245 int send_ret, recv_ret;
246 mbedtls_ssl_send_t *send;
247 mbedtls_ssl_recv_t *recv;
Janos Follathc673c2c2019-12-02 15:47:26 +0000248 unsigned i;
249
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100250 if (blocking == 0) {
Yanray Wangc4638492022-10-26 11:51:53 +0800251 send = mbedtls_test_mock_tcp_send_nb;
252 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100253 } else {
Yanray Wangc4638492022-10-26 11:51:53 +0800254 send = mbedtls_test_mock_tcp_send_b;
255 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follathc673c2c2019-12-02 15:47:26 +0000256 }
257
Yanray Wangd02c3172023-03-15 16:02:29 +0800258 mbedtls_test_mock_socket_init(&client);
259 mbedtls_test_mock_socket_init(&server);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200260 USE_PSA_INIT();
Janos Follathc673c2c2019-12-02 15:47:26 +0000261
262 /* Fill up the buffer with structured data so that unwanted changes
263 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100264 for (i = 0; i < MSGLEN; i++) {
Janos Follathc673c2c2019-12-02 15:47:26 +0000265 message[i] = i & 0xFF;
266 }
267
268 /* Make sure that sending a message takes a few iterations. */
Yanray Wangc4638492022-10-26 11:51:53 +0800269 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server, BUFLEN));
Janos Follathc673c2c2019-12-02 15:47:26 +0000270
271 /* Send the message to the server */
272 send_ret = recv_ret = 1;
273 written = read = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100274 while (send_ret != 0 || recv_ret != 0) {
275 send_ret = send(&client, message + written, MSGLEN - written);
Janos Follathc673c2c2019-12-02 15:47:26 +0000276
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100277 TEST_ASSERT(send_ret >= 0);
278 TEST_ASSERT(send_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100279 written += send_ret;
280
281 /* If the buffer is full we can test blocking and non-blocking send */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100282 if (send_ret == BUFLEN) {
283 int blocking_ret = send(&client, message, 1);
284 if (blocking) {
285 TEST_ASSERT(blocking_ret == 0);
286 } else {
287 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100288 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000289 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000290
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100291 recv_ret = recv(&server, received + read, MSGLEN - read);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100292
293 /* The result depends on whether any data was sent */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100294 if (send_ret > 0) {
295 TEST_ASSERT(recv_ret > 0);
296 TEST_ASSERT(recv_ret <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100297 read += recv_ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100298 } else if (blocking) {
299 TEST_ASSERT(recv_ret == 0);
300 } else {
301 TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100302 recv_ret = 0;
Janos Follathc673c2c2019-12-02 15:47:26 +0000303 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100304
305 /* If the buffer is empty we can test blocking and non-blocking read */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100306 if (recv_ret == BUFLEN) {
307 int blocking_ret = recv(&server, received, 1);
308 if (blocking) {
309 TEST_ASSERT(blocking_ret == 0);
310 } else {
311 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100312 }
313 }
Janos Follathc673c2c2019-12-02 15:47:26 +0000314 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100315 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Janos Follathc673c2c2019-12-02 15:47:26 +0000316
317exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800318 mbedtls_test_mock_socket_close(&client);
319 mbedtls_test_mock_socket_close(&server);
Valerio Setti44570a52023-04-19 15:10:45 +0200320 USE_PSA_DONE();
Janos Follathc673c2c2019-12-02 15:47:26 +0000321}
322/* END_CASE */
323
324/*
Yanray Wang862ef862023-03-14 11:05:04 +0800325 * Test if the implementation of `mbedtls_test_mock_socket` related functions
326 * can send messages in both direction at the same time (with the I/O calls
Janos Follathc673c2c2019-12-02 15:47:26 +0000327 * interleaving).
328 */
329
330/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100331void ssl_mock_tcp_interleaving(int blocking)
Janos Follathc673c2c2019-12-02 15:47:26 +0000332{
Janos Follath031827f2019-11-27 11:12:14 +0000333 enum { ROUNDS = 2 };
334 enum { MSGLEN = 105 };
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100335 enum { BUFLEN = MSGLEN / 5 };
Janos Follath031827f2019-11-27 11:12:14 +0000336 unsigned char message[ROUNDS][MSGLEN];
337 unsigned char received[ROUNDS][MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800338 mbedtls_test_mock_socket client;
339 mbedtls_test_mock_socket server;
Janos Follath031827f2019-11-27 11:12:14 +0000340 size_t written[ROUNDS];
341 size_t read[ROUNDS];
342 int send_ret[ROUNDS];
343 int recv_ret[ROUNDS];
344 unsigned i, j, progress;
Janos Follath3766ba52019-11-27 13:31:42 +0000345 mbedtls_ssl_send_t *send;
346 mbedtls_ssl_recv_t *recv;
Janos Follath3766ba52019-11-27 13:31:42 +0000347
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100348 if (blocking == 0) {
Yanray Wangc4638492022-10-26 11:51:53 +0800349 send = mbedtls_test_mock_tcp_send_nb;
350 recv = mbedtls_test_mock_tcp_recv_nb;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100351 } else {
Yanray Wangc4638492022-10-26 11:51:53 +0800352 send = mbedtls_test_mock_tcp_send_b;
353 recv = mbedtls_test_mock_tcp_recv_b;
Janos Follath3766ba52019-11-27 13:31:42 +0000354 }
Janos Follath031827f2019-11-27 11:12:14 +0000355
Yanray Wangd02c3172023-03-15 16:02:29 +0800356 mbedtls_test_mock_socket_init(&client);
357 mbedtls_test_mock_socket_init(&server);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200358 USE_PSA_INIT();
Janos Follath031827f2019-11-27 11:12:14 +0000359
360 /* Fill up the buffers with structured data so that unwanted changes
361 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100362 for (i = 0; i < ROUNDS; i++) {
363 for (j = 0; j < MSGLEN; j++) {
364 message[i][j] = (i * MSGLEN + j) & 0xFF;
Janos Follath031827f2019-11-27 11:12:14 +0000365 }
366 }
367
Janos Follath031827f2019-11-27 11:12:14 +0000368 /* Make sure that sending a message takes a few iterations. */
Yanray Wang862ef862023-03-14 11:05:04 +0800369 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
370 BUFLEN));
Janos Follath031827f2019-11-27 11:12:14 +0000371
Janos Follath031827f2019-11-27 11:12:14 +0000372 /* Send the message from both sides, interleaving. */
373 progress = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100374 for (i = 0; i < ROUNDS; i++) {
Janos Follath031827f2019-11-27 11:12:14 +0000375 written[i] = 0;
376 read[i] = 0;
377 }
378 /* This loop does not stop as long as there was a successful write or read
379 * of at least one byte on either side. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100380 while (progress != 0) {
Yanray Wangabfdcd82022-10-25 16:44:13 +0800381 mbedtls_test_mock_socket *socket;
Janos Follath031827f2019-11-27 11:12:14 +0000382
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100383 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100384 /* First sending is from the client */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100385 socket = (i % 2 == 0) ? (&client) : (&server);
Janos Follath031827f2019-11-27 11:12:14 +0000386
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100387 send_ret[i] = send(socket, message[i] + written[i],
388 MSGLEN - written[i]);
389 TEST_ASSERT(send_ret[i] >= 0);
390 TEST_ASSERT(send_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100391 written[i] += send_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000392
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100393 /* If the buffer is full we can test blocking and non-blocking
394 * send */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100395 if (send_ret[i] == BUFLEN) {
396 int blocking_ret = send(socket, message[i], 1);
397 if (blocking) {
398 TEST_ASSERT(blocking_ret == 0);
399 } else {
400 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100401 }
402 }
Janos Follath3766ba52019-11-27 13:31:42 +0000403 }
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100404
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100405 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100406 /* First receiving is from the server */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100407 socket = (i % 2 == 0) ? (&server) : (&client);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100408
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100409 recv_ret[i] = recv(socket, received[i] + read[i],
410 MSGLEN - read[i]);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100411
412 /* The result depends on whether any data was sent */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100413 if (send_ret[i] > 0) {
414 TEST_ASSERT(recv_ret[i] > 0);
415 TEST_ASSERT(recv_ret[i] <= BUFLEN);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100416 read[i] += recv_ret[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100417 } else if (blocking) {
418 TEST_ASSERT(recv_ret[i] == 0);
419 } else {
420 TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100421 recv_ret[i] = 0;
422 }
423
424 /* If the buffer is empty we can test blocking and non-blocking
425 * read */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100426 if (recv_ret[i] == BUFLEN) {
427 int blocking_ret = recv(socket, received[i], 1);
428 if (blocking) {
429 TEST_ASSERT(blocking_ret == 0);
430 } else {
431 TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100432 }
433 }
Janos Follath3766ba52019-11-27 13:31:42 +0000434 }
Janos Follath031827f2019-11-27 11:12:14 +0000435
436 progress = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100437 for (i = 0; i < ROUNDS; i++) {
Piotr Nowicki890b5ca2020-01-15 16:19:07 +0100438 progress += send_ret[i] + recv_ret[i];
Janos Follath031827f2019-11-27 11:12:14 +0000439 }
440 }
441
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100442 for (i = 0; i < ROUNDS; i++) {
443 TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0);
444 }
Janos Follath031827f2019-11-27 11:12:14 +0000445
446exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800447 mbedtls_test_mock_socket_close(&client);
448 mbedtls_test_mock_socket_close(&server);
Valerio Setti44570a52023-04-19 15:10:45 +0200449 USE_PSA_DONE();
Janos Follath031827f2019-11-27 11:12:14 +0000450}
451/* END_CASE */
452
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500453/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100454void ssl_message_queue_sanity()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500455{
Valerio Setti8388fdd2023-04-28 12:27:14 +0200456 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500457
Valerio Setti44570a52023-04-19 15:10:45 +0200458 USE_PSA_INIT();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500459 /* Trying to push/pull to an empty queue */
Yanray Wangc4638492022-10-26 11:51:53 +0800460 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(NULL, 1)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100461 == MBEDTLS_TEST_ERROR_ARG_NULL);
Yanray Wangc4638492022-10-26 11:51:53 +0800462 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(NULL, 1)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100463 == MBEDTLS_TEST_ERROR_ARG_NULL);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500464
Yanray Wangc4638492022-10-26 11:51:53 +0800465 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100466 TEST_ASSERT(queue.capacity == 3);
467 TEST_ASSERT(queue.num == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500468
469exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800470 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200471 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500472}
473/* END_CASE */
474
475/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100476void ssl_message_queue_basic()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500477{
Valerio Setti8388fdd2023-04-28 12:27:14 +0200478 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500479
Valerio Setti44570a52023-04-19 15:10:45 +0200480 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800481 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500482
483 /* Sanity test - 3 pushes and 3 pops with sufficient space */
Yanray Wangc4638492022-10-26 11:51:53 +0800484 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100485 TEST_ASSERT(queue.capacity == 3);
486 TEST_ASSERT(queue.num == 1);
Yanray Wangc4638492022-10-26 11:51:53 +0800487 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100488 TEST_ASSERT(queue.capacity == 3);
489 TEST_ASSERT(queue.num == 2);
Yanray Wangc4638492022-10-26 11:51:53 +0800490 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100491 TEST_ASSERT(queue.capacity == 3);
492 TEST_ASSERT(queue.num == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500493
Yanray Wangc4638492022-10-26 11:51:53 +0800494 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
495 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
496 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500497
498exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800499 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200500 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500501}
502/* END_CASE */
503
504/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100505void ssl_message_queue_overflow_underflow()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500506{
Valerio Setti8388fdd2023-04-28 12:27:14 +0200507 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500508
Valerio Setti44570a52023-04-19 15:10:45 +0200509 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800510 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500511
512 /* 4 pushes (last one with an error), 4 pops (last one with an error) */
Yanray Wangc4638492022-10-26 11:51:53 +0800513 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
514 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
515 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
516 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100517 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500518
Yanray Wangc4638492022-10-26 11:51:53 +0800519 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
520 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
521 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500522
Yanray Wangc4638492022-10-26 11:51:53 +0800523 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100524 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500525
526exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800527 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200528 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500529}
530/* END_CASE */
531
532/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100533void ssl_message_queue_interleaved()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500534{
Valerio Setti8388fdd2023-04-28 12:27:14 +0200535 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500536
Valerio Setti44570a52023-04-19 15:10:45 +0200537 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800538 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500539
540 /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
541 * (to wrap around the buffer) */
Yanray Wangc4638492022-10-26 11:51:53 +0800542 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
543 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_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_pop_info(&queue, 1) == 1);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500546
Yanray Wangc4638492022-10-26 11:51:53 +0800547 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
548 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) == 3);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500549
Yanray Wangc4638492022-10-26 11:51:53 +0800550 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
551 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500552
Yanray Wangc4638492022-10-26 11:51:53 +0800553 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 5) == 5);
554 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 8) == 8);
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, 3) == 3);
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, 5) == 5);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500559
Yanray Wangc4638492022-10-26 11:51:53 +0800560 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 8) == 8);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500561
562exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800563 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200564 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500565}
566/* END_CASE */
567
568/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100569void ssl_message_queue_insufficient_buffer()
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500570{
Valerio Setti8388fdd2023-04-28 12:27:14 +0200571 mbedtls_test_ssl_message_queue queue = SSL_MESSAGE_QUEUE_INIT;
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500572 size_t message_len = 10;
573 size_t buffer_len = 5;
574
Valerio Setti44570a52023-04-19 15:10:45 +0200575 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +0800576 TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 1) == 0);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500577
578 /* Popping without a sufficient buffer */
Yanray Wangc4638492022-10-26 11:51:53 +0800579 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, message_len)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100580 == (int) message_len);
Yanray Wangc4638492022-10-26 11:51:53 +0800581 TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, buffer_len)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100582 == (int) buffer_len);
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500583exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800584 mbedtls_test_ssl_message_queue_free(&queue);
Valerio Setti44570a52023-04-19 15:10:45 +0200585 USE_PSA_DONE();
Andrzej Kurek13719cd2020-01-22 06:36:39 -0500586}
587/* END_CASE */
588
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500589/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100590void ssl_message_mock_uninitialized()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500591{
592 enum { MSGLEN = 10 };
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100593 unsigned char message[MSGLEN] = { 0 }, received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800594 mbedtls_test_mock_socket client, server;
595 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500596 mbedtls_test_message_socket_context server_context, client_context;
Yanray Wangc4638492022-10-26 11:51:53 +0800597 mbedtls_test_message_socket_init(&server_context);
598 mbedtls_test_message_socket_init(&client_context);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500599
Valerio Setti44570a52023-04-19 15:10:45 +0200600 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500601 /* Send with a NULL context */
Yanray Wangc4638492022-10-26 11:51:53 +0800602 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(NULL, message, MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100603 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500604
Yanray Wangc4638492022-10-26 11:51:53 +0800605 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(NULL, message, MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100606 == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500607
Yanray Wang862ef862023-03-14 11:05:04 +0800608 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
609 &client_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800610 &server,
611 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500612
Yanray Wang862ef862023-03-14 11:05:04 +0800613 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
614 &server_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800615 &client,
616 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500617
Yanray Wang862ef862023-03-14 11:05:04 +0800618 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
619 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100620 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500621
Yanray Wang862ef862023-03-14 11:05:04 +0800622 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
623 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100624 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500625
626 /* Push directly to a queue to later simulate a disconnected behavior */
Yanray Wang862ef862023-03-14 11:05:04 +0800627 TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&server_queue,
628 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100629 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500630
631 /* Test if there's an error when trying to read from a disconnected
632 * socket */
Yanray Wang862ef862023-03-14 11:05:04 +0800633 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
634 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100635 == MBEDTLS_TEST_ERROR_RECV_FAILED);
636exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800637 mbedtls_test_message_socket_close(&server_context);
638 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200639 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500640}
641/* END_CASE */
642
643/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100644void ssl_message_mock_basic()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500645{
646 enum { MSGLEN = 10 };
647 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800648 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500649 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800650 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500651 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200652
Yanray Wangc4638492022-10-26 11:51:53 +0800653 mbedtls_test_message_socket_init(&server_context);
654 mbedtls_test_message_socket_init(&client_context);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200655 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500656
Yanray Wang862ef862023-03-14 11:05:04 +0800657 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
658 &client_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800659 &server,
660 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500661
Yanray Wang862ef862023-03-14 11:05:04 +0800662 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
663 &server_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800664 &client,
665 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500666
667 /* Fill up the buffer with structured data so that unwanted changes
668 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100669 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500670 message[i] = i & 0xFF;
671 }
Yanray Wangc4638492022-10-26 11:51:53 +0800672 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
673 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500674
675 /* Send the message to the server */
Yanray Wangc4638492022-10-26 11:51:53 +0800676 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800677 MSGLEN)
678 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500679
680 /* Read from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800681 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
682 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100683 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500684
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100685 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
686 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500687
688 /* Send the message to the client */
Yanray Wangc4638492022-10-26 11:51:53 +0800689 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
690 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500691
692 /* Read from the client */
Yanray Wang862ef862023-03-14 11:05:04 +0800693 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
694 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100695 == MSGLEN);
696 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500697
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100698exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800699 mbedtls_test_message_socket_close(&server_context);
700 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200701 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500702}
703/* END_CASE */
704
705/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100706void ssl_message_mock_queue_overflow_underflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500707{
708 enum { MSGLEN = 10 };
709 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800710 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500711 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800712 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500713 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200714
Yanray Wangc4638492022-10-26 11:51:53 +0800715 mbedtls_test_message_socket_init(&server_context);
716 mbedtls_test_message_socket_init(&client_context);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200717 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500718
Yanray Wang862ef862023-03-14 11:05:04 +0800719 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
720 &client_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800721 &server,
722 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500723
Yanray Wang862ef862023-03-14 11:05:04 +0800724 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
725 &server_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800726 &client,
727 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500728
729 /* Fill up the buffer with structured data so that unwanted changes
730 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100731 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500732 message[i] = i & 0xFF;
733 }
Yanray Wangc4638492022-10-26 11:51:53 +0800734 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
735 MSGLEN*2));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500736
737 /* Send three message to the server, last one with an error */
Yanray Wangc4638492022-10-26 11:51:53 +0800738 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800739 MSGLEN - 1)
740 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500741
Yanray Wangc4638492022-10-26 11:51:53 +0800742 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800743 MSGLEN)
744 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500745
Yanray Wangc4638492022-10-26 11:51:53 +0800746 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
747 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100748 == MBEDTLS_ERR_SSL_WANT_WRITE);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500749
750 /* Read three messages from the server, last one with an error */
Yanray Wangc4638492022-10-26 11:51:53 +0800751 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
Yanray Wang862ef862023-03-14 11:05:04 +0800752 MSGLEN - 1)
753 == MSGLEN - 1);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500754
Yanray Wang862ef862023-03-14 11:05:04 +0800755 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
756 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100757 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500758
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100759 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500760
Yanray Wang862ef862023-03-14 11:05:04 +0800761 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
762 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100763 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500764
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100765exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800766 mbedtls_test_message_socket_close(&server_context);
767 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200768 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500769}
770/* END_CASE */
771
772/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100773void ssl_message_mock_socket_overflow()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500774{
775 enum { MSGLEN = 10 };
776 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800777 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500778 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800779 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500780 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200781
Yanray Wangc4638492022-10-26 11:51:53 +0800782 mbedtls_test_message_socket_init(&server_context);
783 mbedtls_test_message_socket_init(&client_context);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200784 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500785
Yanray Wang862ef862023-03-14 11:05:04 +0800786 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
787 &client_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800788 &server,
789 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500790
Yanray Wang862ef862023-03-14 11:05:04 +0800791 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
792 &server_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800793 &client,
794 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500795
796 /* Fill up the buffer with structured data so that unwanted changes
797 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100798 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500799 message[i] = i & 0xFF;
800 }
Yanray Wangc4638492022-10-26 11:51:53 +0800801 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
802 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500803
804 /* Send two message to the server, second one with an error */
Yanray Wangc4638492022-10-26 11:51:53 +0800805 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800806 MSGLEN)
807 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500808
Yanray Wangc4638492022-10-26 11:51:53 +0800809 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
810 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100811 == MBEDTLS_TEST_ERROR_SEND_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500812
813 /* Read the only message from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800814 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
815 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100816 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500817
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100818 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500819
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100820exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800821 mbedtls_test_message_socket_close(&server_context);
822 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200823 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500824}
825/* END_CASE */
826
827/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100828void ssl_message_mock_truncated()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500829{
830 enum { MSGLEN = 10 };
831 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800832 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500833 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800834 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500835 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200836
Yanray Wangc4638492022-10-26 11:51:53 +0800837 mbedtls_test_message_socket_init(&server_context);
838 mbedtls_test_message_socket_init(&client_context);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200839 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500840
Yanray Wang862ef862023-03-14 11:05:04 +0800841 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
842 &client_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800843 &server,
844 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500845
Yanray Wang862ef862023-03-14 11:05:04 +0800846 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
847 &server_queue, 2,
Yanray Wangc4638492022-10-26 11:51:53 +0800848 &client,
849 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500850
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100851 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500852 /* Fill up the buffer with structured data so that unwanted changes
853 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100854 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500855 message[i] = i & 0xFF;
856 }
Yanray Wangc4638492022-10-26 11:51:53 +0800857 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
858 2 * MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500859
860 /* Send two messages to the server, the second one small enough to fit in the
861 * receiver's buffer. */
Yanray Wangc4638492022-10-26 11:51:53 +0800862 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800863 MSGLEN)
864 == MSGLEN);
Yanray Wangc4638492022-10-26 11:51:53 +0800865 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800866 MSGLEN / 2)
867 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500868 /* Read a truncated message from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800869 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
870 MSGLEN/2)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100871 == MSGLEN/2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500872
873 /* Test that the first half of the message is valid, and second one isn't */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100874 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
875 TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2)
876 != 0);
877 memset(received, 0, MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500878
879 /* Read a full message from the server */
Yanray Wang862ef862023-03-14 11:05:04 +0800880 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
881 MSGLEN/2)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100882 == MSGLEN / 2);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500883
884 /* Test that the first half of the message is valid */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100885 TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500886
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100887exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800888 mbedtls_test_message_socket_close(&server_context);
889 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200890 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500891}
892/* END_CASE */
893
894/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100895void ssl_message_mock_socket_read_error()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500896{
897 enum { MSGLEN = 10 };
898 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800899 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500900 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800901 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500902 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200903
Yanray Wangc4638492022-10-26 11:51:53 +0800904 mbedtls_test_message_socket_init(&server_context);
905 mbedtls_test_message_socket_init(&client_context);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200906 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500907
Yanray Wang862ef862023-03-14 11:05:04 +0800908 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
909 &client_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800910 &server,
911 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500912
Yanray Wang862ef862023-03-14 11:05:04 +0800913 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
914 &server_queue, 1,
Yanray Wangc4638492022-10-26 11:51:53 +0800915 &client,
916 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500917
918 /* Fill up the buffer with structured data so that unwanted changes
919 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100920 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500921 message[i] = i & 0xFF;
922 }
Yanray Wangc4638492022-10-26 11:51:53 +0800923 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
924 MSGLEN));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500925
Yanray Wangc4638492022-10-26 11:51:53 +0800926 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
Yanray Wang862ef862023-03-14 11:05:04 +0800927 MSGLEN)
928 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500929
930 /* Force a read error by disconnecting the socket by hand */
931 server.status = 0;
Yanray Wang862ef862023-03-14 11:05:04 +0800932 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
933 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100934 == MBEDTLS_TEST_ERROR_RECV_FAILED);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500935 /* Return to a valid state */
936 server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
937
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100938 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500939
940 /* Test that even though the server tried to read once disconnected, the
941 * continuity is preserved */
Yanray Wang862ef862023-03-14 11:05:04 +0800942 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
943 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100944 == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500945
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100946 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500947
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100948exit:
Yanray Wangc4638492022-10-26 11:51:53 +0800949 mbedtls_test_message_socket_close(&server_context);
950 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +0200951 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500952}
953/* END_CASE */
954
955/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100956void ssl_message_mock_interleaved_one_way()
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500957{
958 enum { MSGLEN = 10 };
959 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +0800960 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500961 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +0800962 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500963 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +0200964
Yanray Wangc4638492022-10-26 11:51:53 +0800965 mbedtls_test_message_socket_init(&server_context);
966 mbedtls_test_message_socket_init(&client_context);
Valerio Setti89ae9b62023-04-27 17:22:54 +0200967 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500968
Yanray Wang862ef862023-03-14 11:05:04 +0800969 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
970 &client_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +0800971 &server,
972 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500973
Yanray Wang862ef862023-03-14 11:05:04 +0800974 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
975 &server_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +0800976 &client,
977 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500978
979 /* Fill up the buffer with structured data so that unwanted changes
980 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100981 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500982 message[i] = i & 0xFF;
983 }
Yanray Wangc4638492022-10-26 11:51:53 +0800984 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
985 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500986
987 /* Interleaved test - [2 sends, 1 read] twice, and then two reads
988 * (to wrap around the buffer) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100989 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +0800990 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
991 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500992
Yanray Wangc4638492022-10-26 11:51:53 +0800993 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
994 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -0500995
Yanray Wangc4638492022-10-26 11:51:53 +0800996 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
997 MSGLEN) == MSGLEN);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100998 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
999 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001000 }
1001
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001002 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +08001003 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1004 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001005
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001006 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001007 }
Yanray Wang862ef862023-03-14 11:05:04 +08001008 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1009 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001010 == MBEDTLS_ERR_SSL_WANT_READ);
1011exit:
Yanray Wangc4638492022-10-26 11:51:53 +08001012 mbedtls_test_message_socket_close(&server_context);
1013 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +02001014 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001015}
1016/* END_CASE */
1017
1018/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001019void ssl_message_mock_interleaved_two_ways()
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001020{
1021 enum { MSGLEN = 10 };
1022 unsigned char message[MSGLEN], received[MSGLEN];
Yanray Wangabfdcd82022-10-25 16:44:13 +08001023 mbedtls_test_mock_socket client, server;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001024 unsigned i;
Yanray Wangabfdcd82022-10-25 16:44:13 +08001025 mbedtls_test_ssl_message_queue server_queue, client_queue;
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001026 mbedtls_test_message_socket_context server_context, client_context;
Valerio Setti44570a52023-04-19 15:10:45 +02001027
Yanray Wangc4638492022-10-26 11:51:53 +08001028 mbedtls_test_message_socket_init(&server_context);
1029 mbedtls_test_message_socket_init(&client_context);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001030 USE_PSA_INIT();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001031
Yanray Wang862ef862023-03-14 11:05:04 +08001032 TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
1033 &client_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +08001034 &server,
1035 &server_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001036
Yanray Wang862ef862023-03-14 11:05:04 +08001037 TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
1038 &server_queue, 3,
Yanray Wangc4638492022-10-26 11:51:53 +08001039 &client,
1040 &client_context) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001041
1042 /* Fill up the buffer with structured data so that unwanted changes
1043 * can be detected */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001044 for (i = 0; i < MSGLEN; i++) {
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001045 message[i] = i & 0xFF;
1046 }
Yanray Wangc4638492022-10-26 11:51:53 +08001047 TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
1048 MSGLEN*3));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001049
1050 /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
1051 * (to wrap around the buffer) both ways. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001052 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +08001053 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1054 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001055
Yanray Wangc4638492022-10-26 11:51:53 +08001056 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
1057 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001058
Yanray Wangc4638492022-10-26 11:51:53 +08001059 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1060 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001061
Yanray Wangc4638492022-10-26 11:51:53 +08001062 TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
1063 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001064
Yanray Wangc4638492022-10-26 11:51:53 +08001065 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1066 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001067
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001068 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001069
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001070 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001071
Yanray Wangc4638492022-10-26 11:51:53 +08001072 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1073 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001074
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001075 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001076
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001077 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001078 }
1079
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001080 for (i = 0; i < 2; i++) {
Yanray Wangc4638492022-10-26 11:51:53 +08001081 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1082 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001083
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001084 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1085 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001086
Yanray Wangc4638492022-10-26 11:51:53 +08001087 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1088 MSGLEN) == MSGLEN);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001089
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001090 TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
1091 memset(received, 0, sizeof(received));
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001092 }
1093
Yanray Wang862ef862023-03-14 11:05:04 +08001094 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
1095 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001096 == MBEDTLS_ERR_SSL_WANT_READ);
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001097
Yanray Wang862ef862023-03-14 11:05:04 +08001098 TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
1099 MSGLEN)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001100 == MBEDTLS_ERR_SSL_WANT_READ);
1101exit:
Yanray Wangc4638492022-10-26 11:51:53 +08001102 mbedtls_test_message_socket_close(&server_context);
1103 mbedtls_test_message_socket_close(&client_context);
Valerio Setti44570a52023-04-19 15:10:45 +02001104 USE_PSA_DONE();
Andrzej Kurekbc483de2020-01-22 03:40:00 -05001105}
1106/* END_CASE */
1107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001108/* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001109void ssl_dtls_replay(data_t *prevs, data_t *new, int ret)
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001110{
Azim Khand30ca132017-06-09 04:32:58 +01001111 uint32_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001112 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001113 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001114
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001115 mbedtls_ssl_init(&ssl);
1116 mbedtls_ssl_config_init(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02001117 USE_PSA_INIT();
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02001118
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001119 TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
1120 MBEDTLS_SSL_IS_CLIENT,
1121 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
1122 MBEDTLS_SSL_PRESET_DEFAULT) == 0);
1123 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001124
1125 /* Read previous record numbers */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001126 for (len = 0; len < prevs->len; len += 6) {
1127 memcpy(ssl.in_ctr + 2, prevs->x + len, 6);
1128 mbedtls_ssl_dtls_replay_update(&ssl);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001129 }
1130
1131 /* Check new number */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001132 memcpy(ssl.in_ctr + 2, new->x, 6);
1133 TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret);
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001134
Valerio Setti44570a52023-04-19 15:10:45 +02001135exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001136 mbedtls_ssl_free(&ssl);
1137 mbedtls_ssl_config_free(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02001138 USE_PSA_DONE();
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02001139}
1140/* END_CASE */
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001141
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001142/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001143void ssl_set_hostname_twice(char *hostname0, char *hostname1)
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001144{
1145 mbedtls_ssl_context ssl;
Valerio Setti44570a52023-04-19 15:10:45 +02001146
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001147 mbedtls_ssl_init(&ssl);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001148 USE_PSA_INIT();
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001149
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001150 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname0) == 0);
1151 TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname1) == 0);
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001152
Valerio Setti44570a52023-04-19 15:10:45 +02001153exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001154 mbedtls_ssl_free(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02001155 USE_PSA_DONE();
Hanno Beckerb25c0c72017-05-05 11:24:30 +01001156}
Darryl Green11999bb2018-03-13 15:22:58 +00001157/* END_CASE */
Hanno Beckera18d1322018-01-03 14:27:32 +00001158
1159/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001160void ssl_crypt_record(int cipher_type, int hash_id,
1161 int etm, int tag_mode, int ver,
1162 int cid0_len, int cid1_len)
Hanno Beckera18d1322018-01-03 14:27:32 +00001163{
1164 /*
1165 * Test several record encryptions and decryptions
1166 * with plenty of space before and after the data
1167 * within the record buffer.
1168 */
1169
1170 int ret;
1171 int num_records = 16;
1172 mbedtls_ssl_context ssl; /* ONLY for debugging */
1173
1174 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001175 unsigned char *buf = NULL;
Hanno Beckera18d1322018-01-03 14:27:32 +00001176 size_t const buflen = 512;
1177 mbedtls_record rec, rec_backup;
1178
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001179 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02001180 USE_PSA_INIT();
1181
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001182 mbedtls_ssl_transform_init(&t0);
1183 mbedtls_ssl_transform_init(&t1);
Yanray Wangc4638492022-10-26 11:51:53 +08001184 TEST_ASSERT(mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1185 etm, tag_mode, ver,
1186 (size_t) cid0_len,
1187 (size_t) cid1_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001188
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001189 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckera18d1322018-01-03 14:27:32 +00001190
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001191 while (num_records-- > 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001192 mbedtls_ssl_transform *t_dec, *t_enc;
1193 /* Take turns in who's sending and who's receiving. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001194 if (num_records % 3 == 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001195 t_dec = &t0;
1196 t_enc = &t1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001197 } else {
Hanno Beckera18d1322018-01-03 14:27:32 +00001198 t_dec = &t1;
1199 t_enc = &t0;
1200 }
1201
1202 /*
1203 * The record header affects the transformation in two ways:
1204 * 1) It determines the AEAD additional data
1205 * 2) The record counter sometimes determines the IV.
1206 *
1207 * Apart from that, the fields don't have influence.
1208 * In particular, it is currently not the responsibility
1209 * of ssl_encrypt/decrypt_buf to check if the transform
1210 * version matches the record version, or that the
1211 * type is sensible.
1212 */
1213
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001214 memset(rec.ctr, num_records, sizeof(rec.ctr));
Hanno Beckera18d1322018-01-03 14:27:32 +00001215 rec.type = 42;
1216 rec.ver[0] = num_records;
1217 rec.ver[1] = num_records;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001218#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001219 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001220#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera18d1322018-01-03 14:27:32 +00001221
1222 rec.buf = buf;
1223 rec.buf_len = buflen;
1224 rec.data_offset = 16;
1225 /* Make sure to vary the length to exercise different
1226 * paddings. */
1227 rec.data_len = 1 + num_records;
1228
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001229 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckera18d1322018-01-03 14:27:32 +00001230
1231 /* Make a copy for later comparison */
1232 rec_backup = rec;
1233
1234 /* Encrypt record */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001235 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1236 mbedtls_test_rnd_std_rand, NULL);
1237 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1238 if (ret != 0) {
Hanno Beckera18d1322018-01-03 14:27:32 +00001239 continue;
1240 }
1241
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001242#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001243 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001244 /* DTLS 1.2 + CID hides the real content type and
1245 * uses a special CID content type in the protected
1246 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001247 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001248 }
1249#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1250
1251#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001252 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001253 /* TLS 1.3 hides the real content type and
1254 * always uses Application Data as the content type
1255 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001256 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001257 }
1258#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1259
Hanno Beckera18d1322018-01-03 14:27:32 +00001260 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001261 ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec);
1262 TEST_ASSERT(ret == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001263
1264 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001265 TEST_ASSERT(rec.type == rec_backup.type);
1266 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1267 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1268 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1269 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1270 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1271 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1272 rec_backup.buf + rec_backup.data_offset,
1273 rec.data_len) == 0);
Hanno Beckera18d1322018-01-03 14:27:32 +00001274 }
1275
Hanno Becker81e16a32019-03-01 11:21:44 +00001276exit:
1277
Hanno Beckera18d1322018-01-03 14:27:32 +00001278 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001279 mbedtls_ssl_free(&ssl);
1280 mbedtls_ssl_transform_free(&t0);
1281 mbedtls_ssl_transform_free(&t1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001282 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001283 USE_PSA_DONE();
Hanno Beckera18d1322018-01-03 14:27:32 +00001284}
1285/* END_CASE */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001286
1287/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001288void ssl_crypt_record_small(int cipher_type, int hash_id,
1289 int etm, int tag_mode, int ver,
1290 int cid0_len, int cid1_len)
Hanno Beckerb3268da2018-01-05 15:20:24 +00001291{
1292 /*
1293 * Test pairs of encryption and decryption with an increasing
1294 * amount of space in the record buffer - in more detail:
1295 * 1) Try to encrypt with 0, 1, 2, ... bytes available
1296 * in front of the plaintext, and expect the encryption
1297 * to succeed starting from some offset. Always keep
1298 * enough space in the end of the buffer.
1299 * 2) Try to encrypt with 0, 1, 2, ... bytes available
1300 * at the end of the plaintext, and expect the encryption
1301 * to succeed starting from some offset. Always keep
1302 * enough space at the beginning of the buffer.
1303 * 3) Try to encrypt with 0, 1, 2, ... bytes available
1304 * both at the front and end of the plaintext,
1305 * and expect the encryption to succeed starting from
1306 * some offset.
1307 *
1308 * If encryption succeeds, check that decryption succeeds
1309 * and yields the original record.
1310 */
1311
1312 mbedtls_ssl_context ssl; /* ONLY for debugging */
1313
1314 mbedtls_ssl_transform t0, t1;
Hanno Becker81e16a32019-03-01 11:21:44 +00001315 unsigned char *buf = NULL;
Hanno Beckerd856c822019-04-29 17:30:59 +01001316 size_t const buflen = 256;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001317 mbedtls_record rec, rec_backup;
1318
1319 int ret;
Hanno Beckerd856c822019-04-29 17:30:59 +01001320 int mode; /* Mode 1, 2 or 3 as explained above */
1321 size_t offset; /* Available space at beginning/end/both */
1322 size_t threshold = 96; /* Maximum offset to test against */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001323
Hanno Beckerd856c822019-04-29 17:30:59 +01001324 size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
1325 size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001326
1327 int seen_success; /* Indicates if in the current mode we've
1328 * already seen a successful test. */
1329
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001330 mbedtls_ssl_init(&ssl);
1331 mbedtls_ssl_transform_init(&t0);
1332 mbedtls_ssl_transform_init(&t1);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001333 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +08001334 TEST_ASSERT(mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1335 etm, tag_mode, ver,
1336 (size_t) cid0_len,
1337 (size_t) cid1_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001338
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001339 TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001340
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001341 for (mode = 1; mode <= 3; mode++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001342 seen_success = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001343 for (offset = 0; offset <= threshold; offset++) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001344 mbedtls_ssl_transform *t_dec, *t_enc;
Hanno Becker6c87b3f2019-04-29 17:24:44 +01001345 t_dec = &t0;
1346 t_enc = &t1;
Hanno Beckerb3268da2018-01-05 15:20:24 +00001347
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001348 memset(rec.ctr, offset, sizeof(rec.ctr));
Hanno Beckerb3268da2018-01-05 15:20:24 +00001349 rec.type = 42;
1350 rec.ver[0] = offset;
1351 rec.ver[1] = offset;
1352 rec.buf = buf;
1353 rec.buf_len = buflen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001354#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerd856c822019-04-29 17:30:59 +01001355 rec.cid_len = 0;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001356#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001357
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001358 switch (mode) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001359 case 1: /* Space in the beginning */
1360 rec.data_offset = offset;
1361 rec.data_len = buflen - offset - default_post_padding;
1362 break;
1363
1364 case 2: /* Space in the end */
1365 rec.data_offset = default_pre_padding;
1366 rec.data_len = buflen - default_pre_padding - offset;
1367 break;
1368
1369 case 3: /* Space in the beginning and end */
1370 rec.data_offset = offset;
1371 rec.data_len = buflen - 2 * offset;
1372 break;
1373
1374 default:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001375 TEST_ASSERT(0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001376 break;
1377 }
1378
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001379 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001380
1381 /* Make a copy for later comparison */
1382 rec_backup = rec;
1383
1384 /* Encrypt record */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001385 ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
1386 mbedtls_test_rnd_std_rand, NULL);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001387
Gilles Peskine56081de2023-07-20 22:18:23 +02001388 if (ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
1389 /* It's ok if the output buffer is too small. We do insist
1390 * on at least one mode succeeding; this is tracked by
1391 * seen_success. */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001392 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001393 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001394
Gilles Peskine56081de2023-07-20 22:18:23 +02001395 TEST_EQUAL(ret, 0);
1396 seen_success = 1;
1397
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001398#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001399 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001400 /* DTLS 1.2 + CID hides the real content type and
1401 * uses a special CID content type in the protected
1402 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001403 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001404 }
1405#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1406
1407#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001408 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001409 /* TLS 1.3 hides the real content type and
1410 * always uses Application Data as the content type
1411 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001412 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001413 }
1414#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1415
Hanno Beckerb3268da2018-01-05 15:20:24 +00001416 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001417 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001418
1419 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001420 TEST_ASSERT(rec.type == rec_backup.type);
1421 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1422 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1423 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1424 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1425 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1426 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1427 rec_backup.buf + rec_backup.data_offset,
1428 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001429 }
1430
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001431 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001432 }
1433
Hanno Becker81e16a32019-03-01 11:21:44 +00001434exit:
1435
Hanno Beckerb3268da2018-01-05 15:20:24 +00001436 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001437 mbedtls_ssl_free(&ssl);
1438 mbedtls_ssl_transform_free(&t0);
1439 mbedtls_ssl_transform_free(&t1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001440 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001441 USE_PSA_DONE();
Hanno Beckerb3268da2018-01-05 15:20:24 +00001442}
1443/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03001444
Hanno Becker39ff4922020-08-21 13:36:56 +01001445/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001446void ssl_tls1_3_hkdf_expand_label(int hash_alg,
1447 data_t *secret,
1448 int label_idx,
1449 data_t *ctx,
1450 int desired_length,
1451 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01001452{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001453 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01001454
Hanno Becker70d7fb02020-09-09 10:11:21 +01001455 unsigned char const *lbl = NULL;
1456 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001457#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1458 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001459 { \
1460 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001461 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001462 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001463 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001464#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001465 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01001466
1467 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001468 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1469 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001470
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001471 TEST_ASSERT(mbedtls_ssl_tls1_3_hkdf_expand_label(
1472 (mbedtls_md_type_t) hash_alg,
1473 secret->x, secret->len,
1474 lbl, lbl_len,
1475 ctx->x, ctx->len,
1476 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01001477
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001478 TEST_MEMORY_COMPARE(dst, (size_t) desired_length,
Tom Cosgrovea240fe32023-09-04 11:29:39 +01001479 expected->x, (size_t) expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001480}
1481/* END_CASE */
1482
Hanno Becker19498f82020-08-21 13:37:08 +01001483/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001484void ssl_tls1_3_traffic_key_generation(int hash_alg,
1485 data_t *server_secret,
1486 data_t *client_secret,
1487 int desired_iv_len,
1488 int desired_key_len,
1489 data_t *expected_server_write_key,
1490 data_t *expected_server_write_iv,
1491 data_t *expected_client_write_key,
1492 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01001493{
1494 mbedtls_ssl_key_set keys;
1495
1496 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001497 TEST_ASSERT(client_secret->len == server_secret->len);
Yanray Wang82b41492023-03-14 12:26:44 +08001498 TEST_ASSERT(
1499 expected_client_write_iv->len == expected_server_write_iv->len &&
1500 expected_client_write_iv->len == (size_t) desired_iv_len);
1501 TEST_ASSERT(
1502 expected_client_write_key->len == expected_server_write_key->len &&
1503 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001504
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001505 TEST_ASSERT(mbedtls_ssl_tls1_3_make_traffic_keys(
1506 (mbedtls_md_type_t) hash_alg,
1507 client_secret->x,
1508 server_secret->x,
1509 client_secret->len /* == server_secret->len */,
1510 desired_key_len, desired_iv_len,
1511 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01001512
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001513 TEST_MEMORY_COMPARE(keys.client_write_key,
Tom Cosgrovea240fe32023-09-04 11:29:39 +01001514 keys.key_len,
1515 expected_client_write_key->x,
1516 (size_t) desired_key_len);
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001517 TEST_MEMORY_COMPARE(keys.server_write_key,
Tom Cosgrovea240fe32023-09-04 11:29:39 +01001518 keys.key_len,
1519 expected_server_write_key->x,
1520 (size_t) desired_key_len);
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001521 TEST_MEMORY_COMPARE(keys.client_write_iv,
Tom Cosgrovea240fe32023-09-04 11:29:39 +01001522 keys.iv_len,
1523 expected_client_write_iv->x,
1524 (size_t) desired_iv_len);
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001525 TEST_MEMORY_COMPARE(keys.server_write_iv,
Tom Cosgrovea240fe32023-09-04 11:29:39 +01001526 keys.iv_len,
1527 expected_server_write_iv->x,
1528 (size_t) desired_iv_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001529}
1530/* END_CASE */
1531
Hanno Beckere4849d12020-08-21 14:14:14 +01001532/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001533void ssl_tls1_3_derive_secret(int hash_alg,
1534 data_t *secret,
1535 int label_idx,
1536 data_t *ctx,
1537 int desired_length,
1538 int already_hashed,
1539 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01001540{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001541 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01001542
Hanno Becker70d7fb02020-09-09 10:11:21 +01001543 unsigned char const *lbl = NULL;
1544 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001545#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1546 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001547 { \
1548 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001549 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001550 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001551 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001552#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001553 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01001554
Hanno Beckere4849d12020-08-21 14:14:14 +01001555 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001556 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1557 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01001558
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001559 TEST_ASSERT(mbedtls_ssl_tls1_3_derive_secret(
1560 (mbedtls_md_type_t) hash_alg,
1561 secret->x, secret->len,
1562 lbl, lbl_len,
1563 ctx->x, ctx->len,
1564 already_hashed,
1565 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01001566
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001567 TEST_MEMORY_COMPARE(dst, desired_length,
Tom Cosgrovea240fe32023-09-04 11:29:39 +01001568 expected->x, desired_length);
Hanno Beckere4849d12020-08-21 14:14:14 +01001569}
1570/* END_CASE */
1571
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001572/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001573void ssl_tls1_3_key_evolution(int hash_alg,
1574 data_t *secret,
1575 data_t *input,
1576 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001577{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001578 unsigned char secret_new[MBEDTLS_MD_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001579
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001580 TEST_ASSERT(mbedtls_ssl_tls1_3_evolve_secret(
1581 (mbedtls_md_type_t) hash_alg,
1582 secret->len ? secret->x : NULL,
1583 input->len ? input->x : NULL, input->len,
1584 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001585
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001586 TEST_MEMORY_COMPARE(secret_new, (size_t) expected->len,
Tom Cosgrovea240fe32023-09-04 11:29:39 +01001587 expected->x, (size_t) expected->len);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001588}
1589/* END_CASE */
1590
Ron Eldor824ad7b2019-05-13 14:09:00 +03001591/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001592void ssl_tls_prf(int type, data_t *secret, data_t *random,
1593 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03001594{
1595 unsigned char *output;
1596
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001597 output = mbedtls_calloc(1, result_str->len);
1598 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03001599 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001600 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03001601
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001602 USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03001603
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001604 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
1605 label, random->x, random->len,
1606 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001607
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001608 if (exp_ret == 0) {
1609 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
1610 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001611 }
1612exit:
1613
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001614 mbedtls_free(output);
1615 USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03001616}
1617/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001618
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001619/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001620void ssl_serialize_session_save_load(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001621{
1622 mbedtls_ssl_session original, restored;
1623 unsigned char *buf = NULL;
1624 size_t len;
1625
1626 /*
1627 * Test that a save-load pair is the identity
1628 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001629 mbedtls_ssl_session_init(&original);
1630 mbedtls_ssl_session_init(&restored);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001631 USE_PSA_INIT();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001632
1633 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001634 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1635 &original, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001636
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001637 /* Serialize it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001638 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
1639 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1640 TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL);
1641 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
1642 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001643
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001644 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001645 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001646
1647 /*
1648 * Make sure both session structures are identical
1649 */
1650#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001651 TEST_ASSERT(original.start == restored.start);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001652#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001653 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
1654 TEST_ASSERT(original.compression == restored.compression);
1655 TEST_ASSERT(original.id_len == restored.id_len);
1656 TEST_ASSERT(memcmp(original.id,
1657 restored.id, sizeof(original.id)) == 0);
1658 TEST_ASSERT(memcmp(original.master,
1659 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001660
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001661#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
1662 defined(MBEDTLS_CERTS_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001663#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001664 TEST_ASSERT((original.peer_cert == NULL) ==
1665 (restored.peer_cert == NULL));
1666 if (original.peer_cert != NULL) {
1667 TEST_ASSERT(original.peer_cert->raw.len ==
1668 restored.peer_cert->raw.len);
1669 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
1670 restored.peer_cert->raw.p,
1671 original.peer_cert->raw.len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001672 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001673#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001674 TEST_ASSERT(original.peer_cert_digest_type ==
1675 restored.peer_cert_digest_type);
1676 TEST_ASSERT(original.peer_cert_digest_len ==
1677 restored.peer_cert_digest_len);
1678 TEST_ASSERT((original.peer_cert_digest == NULL) ==
1679 (restored.peer_cert_digest == NULL));
1680 if (original.peer_cert_digest != NULL) {
1681 TEST_ASSERT(memcmp(original.peer_cert_digest,
1682 restored.peer_cert_digest,
1683 original.peer_cert_digest_len) == 0);
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001684 }
1685#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001686#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001687 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001688
1689#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001690 TEST_ASSERT(original.ticket_len == restored.ticket_len);
1691 if (original.ticket_len != 0) {
1692 TEST_ASSERT(original.ticket != NULL);
1693 TEST_ASSERT(restored.ticket != NULL);
1694 TEST_ASSERT(memcmp(original.ticket,
1695 restored.ticket, original.ticket_len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001696 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001697 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001698#endif
1699
1700#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001701 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001702#endif
1703
1704#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001705 TEST_ASSERT(original.trunc_hmac == restored.trunc_hmac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001706#endif
1707
1708#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001709 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001710#endif
1711
1712exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001713 mbedtls_ssl_session_free(&original);
1714 mbedtls_ssl_session_free(&restored);
1715 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001716 USE_PSA_DONE();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001717}
1718/* END_CASE */
1719
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02001720/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001721void ssl_serialize_session_load_save(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001722{
1723 mbedtls_ssl_session session;
1724 unsigned char *buf1 = NULL, *buf2 = NULL;
1725 size_t len0, len1, len2;
1726
1727 /*
1728 * Test that a load-save pair is the identity
1729 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001730 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001731 USE_PSA_INIT();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001732
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001733 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001734 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1735 &session, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001736
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001737 /* Get desired buffer size for serializing */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001738 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
1739 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001740
1741 /* Allocate first buffer */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001742 buf1 = mbedtls_calloc(1, len0);
1743 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001744
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001745 /* Serialize to buffer and free live session */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001746 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
1747 == 0);
1748 TEST_ASSERT(len0 == len1);
1749 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001750
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001751 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001752 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001753
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001754 /* Allocate second buffer and serialize to it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001755 buf2 = mbedtls_calloc(1, len0);
1756 TEST_ASSERT(buf2 != NULL);
1757 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
1758 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001759
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001760 /* Make sure both serialized versions are identical */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001761 TEST_ASSERT(len1 == len2);
1762 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001763
1764exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001765 mbedtls_ssl_session_free(&session);
1766 mbedtls_free(buf1);
1767 mbedtls_free(buf2);
Valerio Setti44570a52023-04-19 15:10:45 +02001768 USE_PSA_DONE();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001769}
1770/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001771
1772/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001773void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001774{
1775 mbedtls_ssl_session session;
1776 unsigned char *buf = NULL;
1777 size_t good_len, bad_len, test_len;
1778
1779 /*
1780 * Test that session_save() fails cleanly on small buffers
1781 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001782 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001783 USE_PSA_INIT();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001784
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001785 /* Prepare dummy session and get serialized size */
Yanray Wang862ef862023-03-14 11:05:04 +08001786 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1787 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001788 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
1789 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001790
1791 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001792 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001793 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001794 mbedtls_free(buf);
1795 TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL);
1796 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
1797 &test_len)
1798 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1799 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001800 }
1801
1802exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001803 mbedtls_ssl_session_free(&session);
1804 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001805 USE_PSA_DONE();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001806}
1807/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001808
1809/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001810void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001811{
1812 mbedtls_ssl_session session;
1813 unsigned char *good_buf = NULL, *bad_buf = NULL;
1814 size_t good_len, bad_len;
1815
1816 /*
1817 * Test that session_load() fails cleanly on small buffers
1818 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001819 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001820 USE_PSA_INIT();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001821
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001822 /* Prepare serialized session data */
Yanray Wang862ef862023-03-14 11:05:04 +08001823 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1824 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001825 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
1826 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1827 TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL);
1828 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
1829 &good_len) == 0);
1830 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001831
1832 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001833 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001834 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001835 mbedtls_free(bad_buf);
1836 bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1);
1837 TEST_ASSERT(bad_buf != NULL);
1838 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001839
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001840 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
1841 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001842 }
1843
1844exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001845 mbedtls_ssl_session_free(&session);
1846 mbedtls_free(good_buf);
1847 mbedtls_free(bad_buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001848 USE_PSA_DONE();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02001849}
1850/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01001851
Hanno Becker363b6462019-05-29 12:44:28 +01001852/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001853void ssl_session_serialize_version_check(int corrupt_major,
1854 int corrupt_minor,
1855 int corrupt_patch,
1856 int corrupt_config)
Hanno Becker861d0bb2019-05-21 16:39:30 +01001857{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001858 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01001859 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001860 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01001861 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001862 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
1863 corrupt_minor == 1,
1864 corrupt_patch == 1,
1865 corrupt_config == 1,
1866 corrupt_config == 1 };
1867
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001868 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001869 USE_PSA_INIT();
Hanno Becker861d0bb2019-05-21 16:39:30 +01001870
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001871 /* Infer length of serialized session. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001872 TEST_ASSERT(mbedtls_ssl_session_save(&session,
1873 serialized_session,
1874 sizeof(serialized_session),
1875 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01001876
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001877 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01001878
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001879 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01001880 * de-serialize the session - double-check that. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001881 TEST_ASSERT(mbedtls_ssl_session_load(&session,
1882 serialized_session,
1883 serialized_session_len) == 0);
1884 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01001885
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001886 /* Go through the bytes in the serialized session header and
1887 * corrupt them bit-by-bit. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001888 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001889 int cur_bit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001890 unsigned char * const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001891
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001892 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001893 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001894 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001895
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001896 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001897 unsigned char const corrupted_bit = 0x1u << cur_bit;
1898 /* Modify a single bit in the serialized session. */
1899 *byte ^= corrupted_bit;
1900
1901 /* Attempt to deserialize */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001902 TEST_ASSERT(mbedtls_ssl_session_load(&session,
1903 serialized_session,
1904 serialized_session_len) ==
1905 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01001906
1907 /* Undo the change */
1908 *byte ^= corrupted_bit;
1909 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01001910 }
Valerio Setti44570a52023-04-19 15:10:45 +02001911 USE_PSA_DONE();
Hanno Becker861d0bb2019-05-21 16:39:30 +01001912}
1913/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001914
Gilles Peskine1fc71162023-07-20 20:04:00 +02001915/* 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_TEST_NULL_ENTROPY:!MBEDTLS_PSA_INJECT_ENTROPY:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001916void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001917{
1918 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08001919 mbedtls_test_ssl_endpoint ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001920 int ret = -1;
1921
Valerio Setti44570a52023-04-19 15:10:45 +02001922 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +08001923 ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, MBEDTLS_PK_RSA,
1924 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001925 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001926
Yanray Wangc4638492022-10-26 11:51:53 +08001927 ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, MBEDTLS_PK_RSA);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001928 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001929
Yanray Wangc4638492022-10-26 11:51:53 +08001930 ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, MBEDTLS_PK_RSA,
1931 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001932 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001933
1934exit:
Yanray Wangc4638492022-10-26 11:51:53 +08001935 mbedtls_test_ssl_endpoint_free(&ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02001936 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001937}
1938/* END_CASE */
1939
Gilles Peskine1fc71162023-07-20 20:04:00 +02001940/* 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_TEST_NULL_ENTROPY:!MBEDTLS_PSA_INJECT_ENTROPY:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001941void move_handshake_to_state(int endpoint_type, int state, int need_pass)
1942{
1943 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08001944 mbedtls_test_ssl_endpoint base_ep, second_ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001945 int ret = -1;
1946
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001947 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
1948 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Andrzej Kurek0d2982b2022-10-18 07:55:46 -04001949
Yanray Wang862ef862023-03-14 11:05:04 +08001950 ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type,
1951 MBEDTLS_PK_RSA,
Yanray Wangc4638492022-10-26 11:51:53 +08001952 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001953 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001954
Yanray Wang862ef862023-03-14 11:05:04 +08001955 ret = mbedtls_test_ssl_endpoint_init(
1956 &second_ep,
1957 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
1958 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
1959 MBEDTLS_PK_RSA, NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001960 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001961
Valerio Setti89ae9b62023-04-27 17:22:54 +02001962 USE_PSA_INIT();
1963
Yanray Wangc4638492022-10-26 11:51:53 +08001964 ret = mbedtls_test_mock_socket_connect(&(base_ep.socket),
1965 &(second_ep.socket),
1966 BUFFSIZE);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001967 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001968
Yanray Wangc4638492022-10-26 11:51:53 +08001969 ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl),
1970 &(second_ep.ssl),
1971 state);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001972 if (need_pass) {
1973 TEST_ASSERT(ret == 0);
1974 TEST_ASSERT(base_ep.ssl.state == state);
1975 } else {
1976 TEST_ASSERT(ret != 0);
1977 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001978 }
1979
1980exit:
Yanray Wangc4638492022-10-26 11:51:53 +08001981 mbedtls_test_ssl_endpoint_free(&base_ep, NULL);
1982 mbedtls_test_ssl_endpoint_free(&second_ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02001983 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01001984}
1985/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001986
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001987/* 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 +01001988void handshake_version(int dtls, int client_min_version, int client_max_version,
1989 int server_min_version, int server_max_version,
1990 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05001991{
Yanray Wangabfdcd82022-10-25 16:44:13 +08001992 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08001993 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05001994
Paul Elliottc8570442020-04-15 17:00:50 +01001995 options.client_min_version = client_min_version;
1996 options.client_max_version = client_max_version;
1997 options.server_min_version = server_min_version;
1998 options.server_max_version = server_max_version;
1999
2000 options.expected_negotiated_version = expected_negotiated_version;
2001
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002002 options.dtls = dtls;
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002003 /* By default, SSLv3.0 and TLSv1.0 use 1/n-1 splitting when sending data, so
2004 * the number of fragments will be twice as big. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002005 if (expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_0 ||
2006 expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_1) {
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002007 options.expected_cli_fragments = 2;
2008 options.expected_srv_fragments = 2;
Andrzej Kurek941962e2020-02-07 09:20:32 -05002009 }
Yanray Wangc4638492022-10-26 11:51:53 +08002010 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002011
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002012 /* The goto below is used to avoid an "unused label" warning.*/
2013 goto exit;
2014}
2015/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05002016
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002017/* 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 +01002018void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002019{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002020 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002021 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002022
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002023 options.cipher = cipher;
2024 options.dtls = dtls;
2025 options.psk_str = psk_str;
2026 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05002027
Yanray Wangc4638492022-10-26 11:51:53 +08002028 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002029
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002030 /* The goto below is used to avoid an "unused label" warning.*/
2031 goto exit;
2032}
2033/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002034
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002035/* 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 +01002036void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002037{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002038 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002039
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002040 /* The goto below is used to avoid an "unused label" warning.*/
2041 goto exit;
2042}
2043/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002044
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002045/* 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 +01002046void app_data(int mfl, int cli_msg_len, int srv_msg_len,
2047 int expected_cli_fragments,
2048 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002049{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002050 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002051 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002052
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002053 options.mfl = mfl;
2054 options.cli_msg_len = cli_msg_len;
2055 options.srv_msg_len = srv_msg_len;
2056 options.expected_cli_fragments = expected_cli_fragments;
2057 options.expected_srv_fragments = expected_srv_fragments;
2058 options.dtls = dtls;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002059
Yanray Wangc4638492022-10-26 11:51:53 +08002060 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002061 /* The goto below is used to avoid an "unused label" warning.*/
2062 goto exit;
2063}
2064/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002065
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002066/* 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 +01002067void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
2068 int expected_cli_fragments,
2069 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002070{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002071 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2072 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002073 /* The goto below is used to avoid an "unused label" warning.*/
2074 goto exit;
2075}
2076/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002077
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002078/* 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 +01002079void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
2080 int expected_cli_fragments,
2081 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002082{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002083 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2084 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002085 /* The goto below is used to avoid an "unused label" warning.*/
2086 goto exit;
2087}
2088/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002089
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002090/* 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 +01002091void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002092{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002093 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002094 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002095
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002096 options.serialize = 1;
2097 options.dtls = 1;
Yanray Wangc4638492022-10-26 11:51:53 +08002098 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002099 /* The goto below is used to avoid an "unused label" warning.*/
2100 goto exit;
2101}
2102/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002103
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002104/* 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 +01002105void handshake_fragmentation(int mfl,
2106 int expected_srv_hs_fragmentation,
2107 int expected_cli_hs_fragmentation)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002108{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002109 mbedtls_test_handshake_test_options options;
2110 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002111
2112 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
2113 srv_pattern.counter = 0;
2114 cli_pattern.counter = 0;
2115
Yanray Wangc4638492022-10-26 11:51:53 +08002116 mbedtls_test_init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002117 options.dtls = 1;
2118 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00002119 /* Set cipher to one using CBC so that record splitting can be tested */
2120 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002121 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
2122 options.srv_log_obj = &srv_pattern;
2123 options.cli_log_obj = &cli_pattern;
Yanray Wangc4638492022-10-26 11:51:53 +08002124 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
2125 options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002126
Yanray Wangc4638492022-10-26 11:51:53 +08002127 mbedtls_test_ssl_perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002128
2129 /* Test if the server received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002130 if (expected_srv_hs_fragmentation) {
2131 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002132 }
2133 /* Test if the client received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002134 if (expected_cli_hs_fragmentation) {
2135 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002136 }
2137}
2138/* END_CASE */
2139
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002140/* 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 +01002141void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002142{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002143 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002144 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002145
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002146 options.renegotiate = 1;
2147 options.legacy_renegotiation = legacy_renegotiation;
2148 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002149
Yanray Wangc4638492022-10-26 11:51:53 +08002150 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002151 /* The goto below is used to avoid an "unused label" warning.*/
2152 goto exit;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002153}
2154/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002155
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002156/* 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 +01002157void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
2158 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002159{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002160 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002161 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002162
2163 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04002164 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002165 options.renegotiate = renegotiation;
2166 options.legacy_renegotiation = legacy_renegotiation;
2167 options.serialize = serialize;
2168 options.dtls = dtls;
2169 options.resize_buffers = 1;
2170
Yanray Wangc4638492022-10-26 11:51:53 +08002171 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002172 /* The goto below is used to avoid an "unused label" warning.*/
2173 goto exit;
2174}
2175/* END_CASE */
2176
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002177/* 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 +01002178void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002179{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002180 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
2181 (char *) "");
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002182 /* The goto below is used to avoid an "unused label" warning.*/
2183 goto exit;
2184}
2185/* END_CASE */
2186
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002187/* 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 +01002188void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
2189 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002190{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002191 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002192 /* The goto below is used to avoid an "unused label" warning.*/
2193 goto exit;
2194}
2195/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02002196
Gilles Peskine1fc71162023-07-20 20:04:00 +02002197/* 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_TEST_NULL_ENTROPY:!MBEDTLS_PSA_INJECT_ENTROPY: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 +01002198void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002199{
2200 enum { BUFFSIZE = 17000 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002201 mbedtls_test_ssl_endpoint client, server;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002202 mbedtls_psa_stats_t stats;
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002203 size_t free_slots_before = -1;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002204
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002205 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP256R1,
2206 MBEDTLS_ECP_DP_NONE };
Valerio Setti89ae9b62023-04-27 17:22:54 +02002207
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002208 mbedtls_platform_zeroize(&client, sizeof(client));
2209 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002210
2211 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek9cb14d42022-04-14 08:51:41 -04002212 * the raw key agreement. Flipping the first byte makes the
2213 * required 0x04 identifier invalid. */
Yanray Wangc4638492022-10-26 11:51:53 +08002214 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
2215 MBEDTLS_PK_ECDSA, NULL, NULL,
2216 NULL, curve_list), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002217
2218 /* Server side */
Yanray Wangc4638492022-10-26 11:51:53 +08002219 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
2220 MBEDTLS_PK_ECDSA, NULL, NULL,
2221 NULL, NULL), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002222
Valerio Setti89ae9b62023-04-27 17:22:54 +02002223 USE_PSA_INIT();
2224
Yanray Wangc4638492022-10-26 11:51:53 +08002225 TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket),
2226 &(server.socket),
2227 BUFFSIZE), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002228
Yanray Wang862ef862023-03-14 11:05:04 +08002229 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2230 &(client.ssl), &(server.ssl),
2231 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002232 , 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002233
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002234 mbedtls_psa_get_stats(&stats);
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002235 /* Save the number of slots in use up to this point.
2236 * With PSA, one can be used for the ECDH private key. */
2237 free_slots_before = stats.empty_slots;
Andrzej Kurek99f67782022-03-31 07:17:18 -04002238
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002239 if (bad_server_ecdhe_key) {
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002240 /* Force a simulated bitflip in the server key. to make the
2241 * raw key agreement in ssl_write_client_key_exchange fail. */
2242 (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
2243 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002244
Yanray Wang862ef862023-03-14 11:05:04 +08002245 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2246 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER),
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002247 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002248
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002249 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002250
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002251 /* Make sure that the key slot is already destroyed in case of failure,
2252 * without waiting to close the connection. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002253 if (bad_server_ecdhe_key) {
2254 TEST_EQUAL(free_slots_before, stats.empty_slots);
2255 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002256
2257exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002258 mbedtls_test_ssl_endpoint_free(&client, NULL);
2259 mbedtls_test_ssl_endpoint_free(&server, NULL);
Andrzej Kurek99f67782022-03-31 07:17:18 -04002260
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002261 USE_PSA_DONE();
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002262}
2263/* END_CASE */
Andrzej Kurek862acb82022-06-06 13:08:23 -04002264
Andrzej Kurek3c036f52022-06-08 11:57:57 -04002265/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002266void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurek862acb82022-06-06 13:08:23 -04002267{
2268 mbedtls_ssl_context ssl;
2269 mbedtls_ssl_config conf;
2270 size_t len;
2271
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002272 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02002273 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002274 mbedtls_ssl_config_init(&conf);
2275 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
2276 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2277 MBEDTLS_SSL_PRESET_DEFAULT),
2278 0);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002279
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002280 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
2281 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
2282 ssl.cli_id_len,
2283 cookie->x, cookie->len,
2284 ssl.out_buf,
2285 MBEDTLS_SSL_OUT_CONTENT_LEN,
2286 &len),
2287 exp_ret);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002288
Valerio Setti44570a52023-04-19 15:10:45 +02002289exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002290 mbedtls_ssl_free(&ssl);
2291 mbedtls_ssl_config_free(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02002292 USE_PSA_DONE();
Andrzej Kurek862acb82022-06-06 13:08:23 -04002293}
2294/* END_CASE */