blob: bc999f10a71eda44c528aa2be96c60e2bfdc07bd [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 }
150 ASSERT_ALLOC(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 }
164 ASSERT_ALLOC(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 Peskine1b6c09a2023-01-11 14:52:35 +01001388 if ((mode == 1 || mode == 2) && seen_success) {
1389 TEST_ASSERT(ret == 0);
1390 } else {
1391 TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1392 if (ret == 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001393 seen_success = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001394 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001395 }
1396
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001397 if (ret != 0) {
Hanno Beckerb3268da2018-01-05 15:20:24 +00001398 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001399 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001400
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001401#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001402 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001403 /* DTLS 1.2 + CID hides the real content type and
1404 * uses a special CID content type in the protected
1405 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001406 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001407 }
1408#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1409
1410#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001411 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001412 /* TLS 1.3 hides the real content type and
1413 * always uses Application Data as the content type
1414 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001415 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001416 }
1417#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1418
Hanno Beckerb3268da2018-01-05 15:20:24 +00001419 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001420 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001421
1422 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001423 TEST_ASSERT(rec.type == rec_backup.type);
1424 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1425 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1426 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1427 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1428 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1429 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1430 rec_backup.buf + rec_backup.data_offset,
1431 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001432 }
1433
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001434 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001435 }
1436
Hanno Becker81e16a32019-03-01 11:21:44 +00001437exit:
1438
Hanno Beckerb3268da2018-01-05 15:20:24 +00001439 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001440 mbedtls_ssl_free(&ssl);
1441 mbedtls_ssl_transform_free(&t0);
1442 mbedtls_ssl_transform_free(&t1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001443 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001444 USE_PSA_DONE();
Hanno Beckerb3268da2018-01-05 15:20:24 +00001445}
1446/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03001447
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02001448/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_AES_C:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001449void ssl_decrypt_non_etm_cbc(int cipher_type, int hash_id, int trunc_hmac,
1450 int length_selector)
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001451{
1452 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001453 * Test record decryption for CBC without EtM, focused on the verification
1454 * of padding and MAC.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001455 *
1456 * Actually depends on TLS >= 1.0 (SSL 3.0 computes the MAC differently),
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02001457 * and either AES, ARIA, Camellia or DES, but since the test framework
1458 * doesn't support alternation in dependency statements, just depend on
1459 * TLS 1.2 and AES.
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001460 *
1461 * The length_selector argument is interpreted as follows:
1462 * - if it's -1, the plaintext length is 0 and minimal padding is applied
1463 * - if it's -2, the plaintext length is 0 and maximal padding is applied
1464 * - otherwise it must be in [0, 255] and is padding_length from RFC 5246:
1465 * it's the length of the rest of the padding, that is, excluding the
1466 * byte that encodes the length. The minimal non-zero plaintext length
1467 * that gives this padding_length is automatically selected.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001468 */
1469 mbedtls_ssl_context ssl; /* ONLY for debugging */
1470 mbedtls_ssl_transform t0, t1;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001471 mbedtls_record rec, rec_save;
1472 unsigned char *buf = NULL, *buf_save = NULL;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001473 size_t buflen, olen = 0;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001474 size_t plaintext_len, block_size, i;
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001475 unsigned char padlen; /* excluding the padding_length byte */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001476 unsigned char add_data[13];
1477 unsigned char mac[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001478 int exp_ret;
Manuel Pégourié-Gonnard4adc04a2020-07-16 10:00:48 +02001479 const unsigned char pad_max_len = 255; /* Per the standard */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001480
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001481 mbedtls_ssl_init(&ssl);
1482 mbedtls_ssl_transform_init(&t0);
1483 mbedtls_ssl_transform_init(&t1);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001484 USE_PSA_INIT();
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001485
1486 /* Set up transforms with dummy keys */
Yanray Wangc4638492022-10-26 11:51:53 +08001487 TEST_ASSERT(mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1488 0, trunc_hmac,
1489 MBEDTLS_SSL_MINOR_VERSION_3,
1490 0, 0) == 0);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001491
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001492 /* Determine padding/plaintext length */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001493 TEST_ASSERT(length_selector >= -2 && length_selector <= 255);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001494 block_size = t0.ivlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001495 if (length_selector < 0) {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001496 plaintext_len = 0;
1497
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001498 /* Minimal padding
1499 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001500 padlen = block_size - (t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001501
1502 /* Maximal padding? */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001503 if (length_selector == -2) {
1504 padlen += block_size * ((pad_max_len - padlen) / block_size);
1505 }
1506 } else {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001507 padlen = length_selector;
1508
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001509 /* Minimal non-zero plaintext_length giving desired padding.
1510 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001511 plaintext_len = block_size - (padlen + t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001512 }
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001513
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001514 /* Prepare a buffer for record data */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001515 buflen = block_size
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001516 + plaintext_len
1517 + t0.maclen
1518 + padlen + 1;
1519 ASSERT_ALLOC(buf, buflen);
1520 ASSERT_ALLOC(buf_save, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001521
1522 /* Prepare a dummy record header */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001523 memset(rec.ctr, 0, sizeof(rec.ctr));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001524 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
1525 rec.ver[0] = MBEDTLS_SSL_MAJOR_VERSION_3;
1526 rec.ver[1] = MBEDTLS_SSL_MINOR_VERSION_3;
1527#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1528 rec.cid_len = 0;
1529#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1530
1531 /* Prepare dummy record content */
1532 rec.buf = buf;
1533 rec.buf_len = buflen;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001534 rec.data_offset = block_size;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001535 rec.data_len = plaintext_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001536 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001537
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001538 /* Serialized version of record header for MAC purposes */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001539 memcpy(add_data, rec.ctr, 8);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001540 add_data[8] = rec.type;
1541 add_data[9] = rec.ver[0];
1542 add_data[10] = rec.ver[1];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001543 add_data[11] = (rec.data_len >> 8) & 0xff;
1544 add_data[12] = (rec.data_len >> 0) & 0xff;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001545
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001546 /* Set dummy IV */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001547 memset(t0.iv_enc, 0x55, t0.ivlen);
1548 memcpy(rec.buf, t0.iv_enc, t0.ivlen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001549
1550 /*
1551 * Prepare a pre-encryption record (with MAC and padding), and save it.
1552 */
1553
1554 /* MAC with additional data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001555 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc, add_data, 13));
1556 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc,
1557 rec.buf + rec.data_offset,
1558 rec.data_len));
1559 TEST_EQUAL(0, mbedtls_md_hmac_finish(&t0.md_ctx_enc, mac));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001560
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001561 memcpy(rec.buf + rec.data_offset + rec.data_len, mac, t0.maclen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001562 rec.data_len += t0.maclen;
1563
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001564 /* Pad */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001565 memset(rec.buf + rec.data_offset + rec.data_len, padlen, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001566 rec.data_len += padlen + 1;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001567
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001568 /* Save correct pre-encryption record */
1569 rec_save = rec;
1570 rec_save.buf = buf_save;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001571 memcpy(buf_save, buf, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001572
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001573 /*
1574 * Encrypt and decrypt the correct record, expecting success
1575 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001576 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1577 t0.iv_enc, t0.ivlen,
1578 rec.buf + rec.data_offset, rec.data_len,
1579 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001580 rec.data_offset -= t0.ivlen;
1581 rec.data_len += t0.ivlen;
1582
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001583 TEST_EQUAL(0, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001584
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001585 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001586 * Modify each byte of the pre-encryption record before encrypting and
1587 * decrypting it, expecting failure every time.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001588 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001589 for (i = block_size; i < buflen; i++) {
1590 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001591
1592 /* Restore correct pre-encryption record */
1593 rec = rec_save;
1594 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001595 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001596
Manuel Pégourié-Gonnardb51f0442020-07-21 10:40:25 +02001597 /* Corrupt one byte of the data (could be plaintext, MAC or padding) */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001598 rec.buf[i] ^= 0x01;
1599
1600 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001601 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1602 t0.iv_enc, t0.ivlen,
1603 rec.buf + rec.data_offset, rec.data_len,
1604 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001605 rec.data_offset -= t0.ivlen;
1606 rec.data_len += t0.ivlen;
1607
1608 /* Decrypt and expect failure */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001609 TEST_EQUAL(MBEDTLS_ERR_SSL_INVALID_MAC,
1610 mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001611 }
1612
1613 /*
1614 * Use larger values of the padding bytes - with small buffers, this tests
1615 * the case where the announced padlen would be larger than the buffer
1616 * (and before that, than the buffer minus the size of the MAC), to make
1617 * sure our padding checking code does not perform any out-of-bounds reads
1618 * in this case. (With larger buffers, ie when the plaintext is long or
1619 * maximal length padding is used, this is less relevant but still doesn't
1620 * hurt to test.)
1621 *
1622 * (Start the loop with correct padding, just to double-check that record
1623 * saving did work, and that we're overwriting the correct bytes.)
1624 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001625 for (i = padlen; i <= pad_max_len; i++) {
1626 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001627
1628 /* Restore correct pre-encryption record */
1629 rec = rec_save;
1630 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001631 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001632
1633 /* Set padding bytes to new value */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001634 memset(buf + buflen - padlen - 1, i, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001635
1636 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001637 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1638 t0.iv_enc, t0.ivlen,
1639 rec.buf + rec.data_offset, rec.data_len,
1640 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001641 rec.data_offset -= t0.ivlen;
1642 rec.data_len += t0.ivlen;
1643
1644 /* Decrypt and expect failure except the first time */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001645 exp_ret = (i == padlen) ? 0 : MBEDTLS_ERR_SSL_INVALID_MAC;
1646 TEST_EQUAL(exp_ret, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001647 }
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001648
1649exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001650 mbedtls_ssl_free(&ssl);
1651 mbedtls_ssl_transform_free(&t0);
1652 mbedtls_ssl_transform_free(&t1);
1653 mbedtls_free(buf);
1654 mbedtls_free(buf_save);
Valerio Setti44570a52023-04-19 15:10:45 +02001655 USE_PSA_DONE();
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001656}
1657/* END_CASE */
1658
Hanno Becker39ff4922020-08-21 13:36:56 +01001659/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001660void ssl_tls1_3_hkdf_expand_label(int hash_alg,
1661 data_t *secret,
1662 int label_idx,
1663 data_t *ctx,
1664 int desired_length,
1665 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01001666{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001667 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01001668
Hanno Becker70d7fb02020-09-09 10:11:21 +01001669 unsigned char const *lbl = NULL;
1670 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001671#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1672 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001673 { \
1674 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001675 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001676 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001677 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001678#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001679 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01001680
1681 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001682 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1683 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001684
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001685 TEST_ASSERT(mbedtls_ssl_tls1_3_hkdf_expand_label(
1686 (mbedtls_md_type_t) hash_alg,
1687 secret->x, secret->len,
1688 lbl, lbl_len,
1689 ctx->x, ctx->len,
1690 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01001691
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001692 ASSERT_COMPARE(dst, (size_t) desired_length,
1693 expected->x, (size_t) expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001694}
1695/* END_CASE */
1696
Hanno Becker19498f82020-08-21 13:37:08 +01001697/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001698void ssl_tls1_3_traffic_key_generation(int hash_alg,
1699 data_t *server_secret,
1700 data_t *client_secret,
1701 int desired_iv_len,
1702 int desired_key_len,
1703 data_t *expected_server_write_key,
1704 data_t *expected_server_write_iv,
1705 data_t *expected_client_write_key,
1706 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01001707{
1708 mbedtls_ssl_key_set keys;
1709
1710 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001711 TEST_ASSERT(client_secret->len == server_secret->len);
Yanray Wang82b41492023-03-14 12:26:44 +08001712 TEST_ASSERT(
1713 expected_client_write_iv->len == expected_server_write_iv->len &&
1714 expected_client_write_iv->len == (size_t) desired_iv_len);
1715 TEST_ASSERT(
1716 expected_client_write_key->len == expected_server_write_key->len &&
1717 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001718
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001719 TEST_ASSERT(mbedtls_ssl_tls1_3_make_traffic_keys(
1720 (mbedtls_md_type_t) hash_alg,
1721 client_secret->x,
1722 server_secret->x,
1723 client_secret->len /* == server_secret->len */,
1724 desired_key_len, desired_iv_len,
1725 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01001726
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001727 ASSERT_COMPARE(keys.client_write_key,
1728 keys.key_len,
1729 expected_client_write_key->x,
1730 (size_t) desired_key_len);
1731 ASSERT_COMPARE(keys.server_write_key,
1732 keys.key_len,
1733 expected_server_write_key->x,
1734 (size_t) desired_key_len);
1735 ASSERT_COMPARE(keys.client_write_iv,
1736 keys.iv_len,
1737 expected_client_write_iv->x,
1738 (size_t) desired_iv_len);
1739 ASSERT_COMPARE(keys.server_write_iv,
1740 keys.iv_len,
1741 expected_server_write_iv->x,
1742 (size_t) desired_iv_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001743}
1744/* END_CASE */
1745
Hanno Beckere4849d12020-08-21 14:14:14 +01001746/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001747void ssl_tls1_3_derive_secret(int hash_alg,
1748 data_t *secret,
1749 int label_idx,
1750 data_t *ctx,
1751 int desired_length,
1752 int already_hashed,
1753 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01001754{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001755 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01001756
Hanno Becker70d7fb02020-09-09 10:11:21 +01001757 unsigned char const *lbl = NULL;
1758 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001759#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1760 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001761 { \
1762 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001763 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001764 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001765 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001766#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001767 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01001768
Hanno Beckere4849d12020-08-21 14:14:14 +01001769 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001770 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1771 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01001772
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001773 TEST_ASSERT(mbedtls_ssl_tls1_3_derive_secret(
1774 (mbedtls_md_type_t) hash_alg,
1775 secret->x, secret->len,
1776 lbl, lbl_len,
1777 ctx->x, ctx->len,
1778 already_hashed,
1779 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01001780
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001781 ASSERT_COMPARE(dst, desired_length,
1782 expected->x, desired_length);
Hanno Beckere4849d12020-08-21 14:14:14 +01001783}
1784/* END_CASE */
1785
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001786/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001787void ssl_tls1_3_key_evolution(int hash_alg,
1788 data_t *secret,
1789 data_t *input,
1790 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001791{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001792 unsigned char secret_new[MBEDTLS_MD_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001793
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001794 TEST_ASSERT(mbedtls_ssl_tls1_3_evolve_secret(
1795 (mbedtls_md_type_t) hash_alg,
1796 secret->len ? secret->x : NULL,
1797 input->len ? input->x : NULL, input->len,
1798 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001799
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001800 ASSERT_COMPARE(secret_new, (size_t) expected->len,
1801 expected->x, (size_t) expected->len);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001802}
1803/* END_CASE */
1804
Ron Eldor824ad7b2019-05-13 14:09:00 +03001805/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001806void ssl_tls_prf(int type, data_t *secret, data_t *random,
1807 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03001808{
1809 unsigned char *output;
1810
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001811 output = mbedtls_calloc(1, result_str->len);
1812 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03001813 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001814 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03001815
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001816 USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03001817
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001818 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
1819 label, random->x, random->len,
1820 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001821
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001822 if (exp_ret == 0) {
1823 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
1824 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001825 }
1826exit:
1827
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001828 mbedtls_free(output);
1829 USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03001830}
1831/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001832
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001833/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001834void ssl_serialize_session_save_load(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001835{
1836 mbedtls_ssl_session original, restored;
1837 unsigned char *buf = NULL;
1838 size_t len;
1839
1840 /*
1841 * Test that a save-load pair is the identity
1842 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001843 mbedtls_ssl_session_init(&original);
1844 mbedtls_ssl_session_init(&restored);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001845 USE_PSA_INIT();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001846
1847 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001848 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1849 &original, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001850
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001851 /* Serialize it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001852 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
1853 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1854 TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL);
1855 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
1856 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001857
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001858 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001859 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001860
1861 /*
1862 * Make sure both session structures are identical
1863 */
1864#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001865 TEST_ASSERT(original.start == restored.start);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001866#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001867 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
1868 TEST_ASSERT(original.compression == restored.compression);
1869 TEST_ASSERT(original.id_len == restored.id_len);
1870 TEST_ASSERT(memcmp(original.id,
1871 restored.id, sizeof(original.id)) == 0);
1872 TEST_ASSERT(memcmp(original.master,
1873 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001874
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001875#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
1876 defined(MBEDTLS_CERTS_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001877#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001878 TEST_ASSERT((original.peer_cert == NULL) ==
1879 (restored.peer_cert == NULL));
1880 if (original.peer_cert != NULL) {
1881 TEST_ASSERT(original.peer_cert->raw.len ==
1882 restored.peer_cert->raw.len);
1883 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
1884 restored.peer_cert->raw.p,
1885 original.peer_cert->raw.len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001886 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001887#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001888 TEST_ASSERT(original.peer_cert_digest_type ==
1889 restored.peer_cert_digest_type);
1890 TEST_ASSERT(original.peer_cert_digest_len ==
1891 restored.peer_cert_digest_len);
1892 TEST_ASSERT((original.peer_cert_digest == NULL) ==
1893 (restored.peer_cert_digest == NULL));
1894 if (original.peer_cert_digest != NULL) {
1895 TEST_ASSERT(memcmp(original.peer_cert_digest,
1896 restored.peer_cert_digest,
1897 original.peer_cert_digest_len) == 0);
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001898 }
1899#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001900#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001901 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001902
1903#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001904 TEST_ASSERT(original.ticket_len == restored.ticket_len);
1905 if (original.ticket_len != 0) {
1906 TEST_ASSERT(original.ticket != NULL);
1907 TEST_ASSERT(restored.ticket != NULL);
1908 TEST_ASSERT(memcmp(original.ticket,
1909 restored.ticket, original.ticket_len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001910 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001911 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001912#endif
1913
1914#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001915 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001916#endif
1917
1918#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001919 TEST_ASSERT(original.trunc_hmac == restored.trunc_hmac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001920#endif
1921
1922#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001923 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001924#endif
1925
1926exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001927 mbedtls_ssl_session_free(&original);
1928 mbedtls_ssl_session_free(&restored);
1929 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001930 USE_PSA_DONE();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001931}
1932/* END_CASE */
1933
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02001934/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001935void ssl_serialize_session_load_save(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001936{
1937 mbedtls_ssl_session session;
1938 unsigned char *buf1 = NULL, *buf2 = NULL;
1939 size_t len0, len1, len2;
1940
1941 /*
1942 * Test that a load-save pair is the identity
1943 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001944 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001945 USE_PSA_INIT();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001946
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001947 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001948 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1949 &session, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001950
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001951 /* Get desired buffer size for serializing */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001952 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
1953 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001954
1955 /* Allocate first buffer */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001956 buf1 = mbedtls_calloc(1, len0);
1957 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001958
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001959 /* Serialize to buffer and free live session */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001960 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
1961 == 0);
1962 TEST_ASSERT(len0 == len1);
1963 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001964
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001965 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001966 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001967
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001968 /* Allocate second buffer and serialize to it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001969 buf2 = mbedtls_calloc(1, len0);
1970 TEST_ASSERT(buf2 != NULL);
1971 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
1972 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001973
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001974 /* Make sure both serialized versions are identical */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001975 TEST_ASSERT(len1 == len2);
1976 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001977
1978exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001979 mbedtls_ssl_session_free(&session);
1980 mbedtls_free(buf1);
1981 mbedtls_free(buf2);
Valerio Setti44570a52023-04-19 15:10:45 +02001982 USE_PSA_DONE();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001983}
1984/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001985
1986/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001987void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001988{
1989 mbedtls_ssl_session session;
1990 unsigned char *buf = NULL;
1991 size_t good_len, bad_len, test_len;
1992
1993 /*
1994 * Test that session_save() fails cleanly on small buffers
1995 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001996 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001997 USE_PSA_INIT();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001998
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001999 /* Prepare dummy session and get serialized size */
Yanray Wang862ef862023-03-14 11:05:04 +08002000 TEST_ASSERT(mbedtls_test_ssl_populate_session(
2001 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002002 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2003 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002004
2005 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002006 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002007 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002008 mbedtls_free(buf);
2009 TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL);
2010 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
2011 &test_len)
2012 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2013 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002014 }
2015
2016exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002017 mbedtls_ssl_session_free(&session);
2018 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02002019 USE_PSA_DONE();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002020}
2021/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002022
2023/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002024void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002025{
2026 mbedtls_ssl_session session;
2027 unsigned char *good_buf = NULL, *bad_buf = NULL;
2028 size_t good_len, bad_len;
2029
2030 /*
2031 * Test that session_load() fails cleanly on small buffers
2032 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002033 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02002034 USE_PSA_INIT();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002035
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002036 /* Prepare serialized session data */
Yanray Wang862ef862023-03-14 11:05:04 +08002037 TEST_ASSERT(mbedtls_test_ssl_populate_session(
2038 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002039 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2040 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2041 TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL);
2042 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
2043 &good_len) == 0);
2044 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002045
2046 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002047 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002048 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002049 mbedtls_free(bad_buf);
2050 bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1);
2051 TEST_ASSERT(bad_buf != NULL);
2052 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002053
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002054 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
2055 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002056 }
2057
2058exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002059 mbedtls_ssl_session_free(&session);
2060 mbedtls_free(good_buf);
2061 mbedtls_free(bad_buf);
Valerio Setti44570a52023-04-19 15:10:45 +02002062 USE_PSA_DONE();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002063}
2064/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002065
Hanno Becker363b6462019-05-29 12:44:28 +01002066/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002067void ssl_session_serialize_version_check(int corrupt_major,
2068 int corrupt_minor,
2069 int corrupt_patch,
2070 int corrupt_config)
Hanno Becker861d0bb2019-05-21 16:39:30 +01002071{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002072 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01002073 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002074 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002075 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002076 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2077 corrupt_minor == 1,
2078 corrupt_patch == 1,
2079 corrupt_config == 1,
2080 corrupt_config == 1 };
2081
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002082 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02002083 USE_PSA_INIT();
Hanno Becker861d0bb2019-05-21 16:39:30 +01002084
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002085 /* Infer length of serialized session. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002086 TEST_ASSERT(mbedtls_ssl_session_save(&session,
2087 serialized_session,
2088 sizeof(serialized_session),
2089 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002090
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002091 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002092
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002093 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002094 * de-serialize the session - double-check that. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002095 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2096 serialized_session,
2097 serialized_session_len) == 0);
2098 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002099
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002100 /* Go through the bytes in the serialized session header and
2101 * corrupt them bit-by-bit. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002102 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002103 int cur_bit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002104 unsigned char * const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002105
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002106 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002107 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002108 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002109
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002110 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002111 unsigned char const corrupted_bit = 0x1u << cur_bit;
2112 /* Modify a single bit in the serialized session. */
2113 *byte ^= corrupted_bit;
2114
2115 /* Attempt to deserialize */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002116 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2117 serialized_session,
2118 serialized_session_len) ==
2119 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002120
2121 /* Undo the change */
2122 *byte ^= corrupted_bit;
2123 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002124 }
Valerio Setti44570a52023-04-19 15:10:45 +02002125 USE_PSA_DONE();
Hanno Becker861d0bb2019-05-21 16:39:30 +01002126}
2127/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002128
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002129/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002130void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002131{
2132 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002133 mbedtls_test_ssl_endpoint ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002134 int ret = -1;
2135
Valerio Setti44570a52023-04-19 15:10:45 +02002136 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +08002137 ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, MBEDTLS_PK_RSA,
2138 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002139 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002140
Yanray Wangc4638492022-10-26 11:51:53 +08002141 ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, MBEDTLS_PK_RSA);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002142 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002143
Yanray Wangc4638492022-10-26 11:51:53 +08002144 ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, MBEDTLS_PK_RSA,
2145 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002146 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002147
2148exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002149 mbedtls_test_ssl_endpoint_free(&ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02002150 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002151}
2152/* END_CASE */
2153
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002154/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002155void move_handshake_to_state(int endpoint_type, int state, int need_pass)
2156{
2157 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002158 mbedtls_test_ssl_endpoint base_ep, second_ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002159 int ret = -1;
2160
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002161 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
2162 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Andrzej Kurek0d2982b2022-10-18 07:55:46 -04002163
Yanray Wang862ef862023-03-14 11:05:04 +08002164 ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type,
2165 MBEDTLS_PK_RSA,
Yanray Wangc4638492022-10-26 11:51:53 +08002166 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002167 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002168
Yanray Wang862ef862023-03-14 11:05:04 +08002169 ret = mbedtls_test_ssl_endpoint_init(
2170 &second_ep,
2171 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
2172 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
2173 MBEDTLS_PK_RSA, NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002174 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002175
Valerio Setti89ae9b62023-04-27 17:22:54 +02002176 USE_PSA_INIT();
2177
Yanray Wangc4638492022-10-26 11:51:53 +08002178 ret = mbedtls_test_mock_socket_connect(&(base_ep.socket),
2179 &(second_ep.socket),
2180 BUFFSIZE);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002181 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002182
Yanray Wangc4638492022-10-26 11:51:53 +08002183 ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl),
2184 &(second_ep.ssl),
2185 state);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002186 if (need_pass) {
2187 TEST_ASSERT(ret == 0);
2188 TEST_ASSERT(base_ep.ssl.state == state);
2189 } else {
2190 TEST_ASSERT(ret != 0);
2191 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002192 }
2193
2194exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002195 mbedtls_test_ssl_endpoint_free(&base_ep, NULL);
2196 mbedtls_test_ssl_endpoint_free(&second_ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02002197 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002198}
2199/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002200
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002201/* 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 +01002202void handshake_version(int dtls, int client_min_version, int client_max_version,
2203 int server_min_version, int server_max_version,
2204 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002205{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002206 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002207 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002208
Paul Elliottc8570442020-04-15 17:00:50 +01002209 options.client_min_version = client_min_version;
2210 options.client_max_version = client_max_version;
2211 options.server_min_version = server_min_version;
2212 options.server_max_version = server_max_version;
2213
2214 options.expected_negotiated_version = expected_negotiated_version;
2215
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002216 options.dtls = dtls;
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002217 /* By default, SSLv3.0 and TLSv1.0 use 1/n-1 splitting when sending data, so
2218 * the number of fragments will be twice as big. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002219 if (expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_0 ||
2220 expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_1) {
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002221 options.expected_cli_fragments = 2;
2222 options.expected_srv_fragments = 2;
Andrzej Kurek941962e2020-02-07 09:20:32 -05002223 }
Yanray Wangc4638492022-10-26 11:51:53 +08002224 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002225
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002226 /* The goto below is used to avoid an "unused label" warning.*/
2227 goto exit;
2228}
2229/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05002230
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002231/* 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 +01002232void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002233{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002234 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002235 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002236
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002237 options.cipher = cipher;
2238 options.dtls = dtls;
2239 options.psk_str = psk_str;
2240 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05002241
Yanray Wangc4638492022-10-26 11:51:53 +08002242 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002243
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002244 /* The goto below is used to avoid an "unused label" warning.*/
2245 goto exit;
2246}
2247/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002248
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002249/* 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 +01002250void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002251{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002252 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002253
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002254 /* The goto below is used to avoid an "unused label" warning.*/
2255 goto exit;
2256}
2257/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002258
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002259/* 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 +01002260void app_data(int mfl, int cli_msg_len, int srv_msg_len,
2261 int expected_cli_fragments,
2262 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002263{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002264 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002265 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002266
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002267 options.mfl = mfl;
2268 options.cli_msg_len = cli_msg_len;
2269 options.srv_msg_len = srv_msg_len;
2270 options.expected_cli_fragments = expected_cli_fragments;
2271 options.expected_srv_fragments = expected_srv_fragments;
2272 options.dtls = dtls;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002273
Yanray Wangc4638492022-10-26 11:51:53 +08002274 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002275 /* The goto below is used to avoid an "unused label" warning.*/
2276 goto exit;
2277}
2278/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002279
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002280/* 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 +01002281void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
2282 int expected_cli_fragments,
2283 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002284{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002285 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2286 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002287 /* The goto below is used to avoid an "unused label" warning.*/
2288 goto exit;
2289}
2290/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002291
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002292/* 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 +01002293void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
2294 int expected_cli_fragments,
2295 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002296{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002297 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2298 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002299 /* The goto below is used to avoid an "unused label" warning.*/
2300 goto exit;
2301}
2302/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002303
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002304/* 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 +01002305void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002306{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002307 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002308 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002309
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002310 options.serialize = 1;
2311 options.dtls = 1;
Yanray Wangc4638492022-10-26 11:51:53 +08002312 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002313 /* The goto below is used to avoid an "unused label" warning.*/
2314 goto exit;
2315}
2316/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002317
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002318/* 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 +01002319void handshake_fragmentation(int mfl,
2320 int expected_srv_hs_fragmentation,
2321 int expected_cli_hs_fragmentation)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002322{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002323 mbedtls_test_handshake_test_options options;
2324 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002325
2326 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
2327 srv_pattern.counter = 0;
2328 cli_pattern.counter = 0;
2329
Yanray Wangc4638492022-10-26 11:51:53 +08002330 mbedtls_test_init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002331 options.dtls = 1;
2332 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00002333 /* Set cipher to one using CBC so that record splitting can be tested */
2334 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002335 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
2336 options.srv_log_obj = &srv_pattern;
2337 options.cli_log_obj = &cli_pattern;
Yanray Wangc4638492022-10-26 11:51:53 +08002338 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
2339 options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002340
Yanray Wangc4638492022-10-26 11:51:53 +08002341 mbedtls_test_ssl_perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002342
2343 /* Test if the server received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002344 if (expected_srv_hs_fragmentation) {
2345 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002346 }
2347 /* Test if the client received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002348 if (expected_cli_hs_fragmentation) {
2349 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002350 }
2351}
2352/* END_CASE */
2353
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002354/* 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 +01002355void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002356{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002357 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002358 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002359
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002360 options.renegotiate = 1;
2361 options.legacy_renegotiation = legacy_renegotiation;
2362 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002363
Yanray Wangc4638492022-10-26 11:51:53 +08002364 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002365 /* The goto below is used to avoid an "unused label" warning.*/
2366 goto exit;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002367}
2368/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002369
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002370/* 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 +01002371void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
2372 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002373{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002374 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002375 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002376
2377 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04002378 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002379 options.renegotiate = renegotiation;
2380 options.legacy_renegotiation = legacy_renegotiation;
2381 options.serialize = serialize;
2382 options.dtls = dtls;
2383 options.resize_buffers = 1;
2384
Yanray Wangc4638492022-10-26 11:51:53 +08002385 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002386 /* The goto below is used to avoid an "unused label" warning.*/
2387 goto exit;
2388}
2389/* END_CASE */
2390
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002391/* 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 +01002392void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002393{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002394 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
2395 (char *) "");
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002396 /* The goto below is used to avoid an "unused label" warning.*/
2397 goto exit;
2398}
2399/* END_CASE */
2400
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002401/* 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 +01002402void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
2403 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002404{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002405 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002406 /* The goto below is used to avoid an "unused label" warning.*/
2407 goto exit;
2408}
2409/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02002410
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002411/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_ECDSA_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002412void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002413{
2414 enum { BUFFSIZE = 17000 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002415 mbedtls_test_ssl_endpoint client, server;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002416 mbedtls_psa_stats_t stats;
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002417 size_t free_slots_before = -1;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002418
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002419 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP256R1,
2420 MBEDTLS_ECP_DP_NONE };
Valerio Setti89ae9b62023-04-27 17:22:54 +02002421
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002422 mbedtls_platform_zeroize(&client, sizeof(client));
2423 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002424
2425 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek9cb14d42022-04-14 08:51:41 -04002426 * the raw key agreement. Flipping the first byte makes the
2427 * required 0x04 identifier invalid. */
Yanray Wangc4638492022-10-26 11:51:53 +08002428 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
2429 MBEDTLS_PK_ECDSA, NULL, NULL,
2430 NULL, curve_list), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002431
2432 /* Server side */
Yanray Wangc4638492022-10-26 11:51:53 +08002433 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
2434 MBEDTLS_PK_ECDSA, NULL, NULL,
2435 NULL, NULL), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002436
Valerio Setti89ae9b62023-04-27 17:22:54 +02002437 USE_PSA_INIT();
2438
Yanray Wangc4638492022-10-26 11:51:53 +08002439 TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket),
2440 &(server.socket),
2441 BUFFSIZE), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002442
Yanray Wang862ef862023-03-14 11:05:04 +08002443 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2444 &(client.ssl), &(server.ssl),
2445 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002446 , 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002447
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002448 mbedtls_psa_get_stats(&stats);
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002449 /* Save the number of slots in use up to this point.
2450 * With PSA, one can be used for the ECDH private key. */
2451 free_slots_before = stats.empty_slots;
Andrzej Kurek99f67782022-03-31 07:17:18 -04002452
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002453 if (bad_server_ecdhe_key) {
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002454 /* Force a simulated bitflip in the server key. to make the
2455 * raw key agreement in ssl_write_client_key_exchange fail. */
2456 (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
2457 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002458
Yanray Wang862ef862023-03-14 11:05:04 +08002459 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2460 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER),
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002461 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002462
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002463 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002464
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002465 /* Make sure that the key slot is already destroyed in case of failure,
2466 * without waiting to close the connection. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002467 if (bad_server_ecdhe_key) {
2468 TEST_EQUAL(free_slots_before, stats.empty_slots);
2469 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002470
2471exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002472 mbedtls_test_ssl_endpoint_free(&client, NULL);
2473 mbedtls_test_ssl_endpoint_free(&server, NULL);
Andrzej Kurek99f67782022-03-31 07:17:18 -04002474
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002475 USE_PSA_DONE();
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002476}
2477/* END_CASE */
Andrzej Kurek862acb82022-06-06 13:08:23 -04002478
Andrzej Kurek3c036f52022-06-08 11:57:57 -04002479/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002480void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurek862acb82022-06-06 13:08:23 -04002481{
2482 mbedtls_ssl_context ssl;
2483 mbedtls_ssl_config conf;
2484 size_t len;
2485
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002486 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02002487 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002488 mbedtls_ssl_config_init(&conf);
2489 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
2490 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2491 MBEDTLS_SSL_PRESET_DEFAULT),
2492 0);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002493
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002494 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
2495 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
2496 ssl.cli_id_len,
2497 cookie->x, cookie->len,
2498 ssl.out_buf,
2499 MBEDTLS_SSL_OUT_CONTENT_LEN,
2500 &len),
2501 exp_ret);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002502
Valerio Setti44570a52023-04-19 15:10:45 +02002503exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002504 mbedtls_ssl_free(&ssl);
2505 mbedtls_ssl_config_free(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02002506 USE_PSA_DONE();
Andrzej Kurek862acb82022-06-06 13:08:23 -04002507}
2508/* END_CASE */