blob: d1feabed8136db14c0e617e269507d263490bbf3 [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 Peskine56081de2023-07-20 22:18:23 +02001388 if (ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
1389 /* It's ok if the output buffer is too small. We do insist
1390 * on at least one mode succeeding; this is tracked by
1391 * seen_success. */
Hanno Beckerb3268da2018-01-05 15:20:24 +00001392 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001393 }
Hanno Beckerb3268da2018-01-05 15:20:24 +00001394
Gilles Peskine56081de2023-07-20 22:18:23 +02001395 TEST_EQUAL(ret, 0);
1396 seen_success = 1;
1397
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001398#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001399 if (rec.cid_len != 0) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001400 /* DTLS 1.2 + CID hides the real content type and
1401 * uses a special CID content type in the protected
1402 * record. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001403 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001404 }
1405#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1406
1407#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001408 if (t_enc->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001409 /* TLS 1.3 hides the real content type and
1410 * always uses Application Data as the content type
1411 * for protected records. Double-check this. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001412 TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
Hanno Beckerb2713ab2020-05-07 14:54:22 +01001413 }
1414#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1415
Hanno Beckerb3268da2018-01-05 15:20:24 +00001416 /* Decrypt record with t_dec */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001417 TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001418
1419 /* Compare results */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001420 TEST_ASSERT(rec.type == rec_backup.type);
1421 TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
1422 TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
1423 TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
1424 TEST_ASSERT(rec.data_len == rec_backup.data_len);
1425 TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
1426 TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
1427 rec_backup.buf + rec_backup.data_offset,
1428 rec.data_len) == 0);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001429 }
1430
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001431 TEST_ASSERT(seen_success == 1);
Hanno Beckerb3268da2018-01-05 15:20:24 +00001432 }
1433
Hanno Becker81e16a32019-03-01 11:21:44 +00001434exit:
1435
Hanno Beckerb3268da2018-01-05 15:20:24 +00001436 /* Cleanup */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001437 mbedtls_ssl_free(&ssl);
1438 mbedtls_ssl_transform_free(&t0);
1439 mbedtls_ssl_transform_free(&t1);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001440 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001441 USE_PSA_DONE();
Hanno Beckerb3268da2018-01-05 15:20:24 +00001442}
1443/* END_CASE */
Ron Eldor824ad7b2019-05-13 14:09:00 +03001444
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02001445/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_AES_C:MBEDTLS_SSL_PROTO_TLS1_2 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001446void ssl_decrypt_non_etm_cbc(int cipher_type, int hash_id, int trunc_hmac,
1447 int length_selector)
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001448{
1449 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001450 * Test record decryption for CBC without EtM, focused on the verification
1451 * of padding and MAC.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001452 *
1453 * Actually depends on TLS >= 1.0 (SSL 3.0 computes the MAC differently),
Manuel Pégourié-Gonnard913a2042020-07-09 10:02:41 +02001454 * and either AES, ARIA, Camellia or DES, but since the test framework
1455 * doesn't support alternation in dependency statements, just depend on
1456 * TLS 1.2 and AES.
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001457 *
1458 * The length_selector argument is interpreted as follows:
1459 * - if it's -1, the plaintext length is 0 and minimal padding is applied
1460 * - if it's -2, the plaintext length is 0 and maximal padding is applied
1461 * - otherwise it must be in [0, 255] and is padding_length from RFC 5246:
1462 * it's the length of the rest of the padding, that is, excluding the
1463 * byte that encodes the length. The minimal non-zero plaintext length
1464 * that gives this padding_length is automatically selected.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001465 */
1466 mbedtls_ssl_context ssl; /* ONLY for debugging */
1467 mbedtls_ssl_transform t0, t1;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001468 mbedtls_record rec, rec_save;
1469 unsigned char *buf = NULL, *buf_save = NULL;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001470 size_t buflen, olen = 0;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001471 size_t plaintext_len, block_size, i;
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001472 unsigned char padlen; /* excluding the padding_length byte */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001473 unsigned char add_data[13];
1474 unsigned char mac[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001475 int exp_ret;
Manuel Pégourié-Gonnard4adc04a2020-07-16 10:00:48 +02001476 const unsigned char pad_max_len = 255; /* Per the standard */
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001477
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001478 mbedtls_ssl_init(&ssl);
1479 mbedtls_ssl_transform_init(&t0);
1480 mbedtls_ssl_transform_init(&t1);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001481 USE_PSA_INIT();
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001482
1483 /* Set up transforms with dummy keys */
Yanray Wangc4638492022-10-26 11:51:53 +08001484 TEST_ASSERT(mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
1485 0, trunc_hmac,
1486 MBEDTLS_SSL_MINOR_VERSION_3,
1487 0, 0) == 0);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001488
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001489 /* Determine padding/plaintext length */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001490 TEST_ASSERT(length_selector >= -2 && length_selector <= 255);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001491 block_size = t0.ivlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001492 if (length_selector < 0) {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001493 plaintext_len = 0;
1494
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001495 /* Minimal padding
1496 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001497 padlen = block_size - (t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001498
1499 /* Maximal padding? */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001500 if (length_selector == -2) {
1501 padlen += block_size * ((pad_max_len - padlen) / block_size);
1502 }
1503 } else {
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001504 padlen = length_selector;
1505
Manuel Pégourié-Gonnarde55653f2020-07-22 11:42:57 +02001506 /* Minimal non-zero plaintext_length giving desired padding.
1507 * The +1 is for the padding_length byte, not counted in padlen. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001508 plaintext_len = block_size - (padlen + t0.maclen + 1) % block_size;
Manuel Pégourié-Gonnard864abbf2020-07-21 10:37:14 +02001509 }
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001510
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001511 /* Prepare a buffer for record data */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001512 buflen = block_size
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001513 + plaintext_len
1514 + t0.maclen
1515 + padlen + 1;
1516 ASSERT_ALLOC(buf, buflen);
1517 ASSERT_ALLOC(buf_save, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001518
1519 /* Prepare a dummy record header */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001520 memset(rec.ctr, 0, sizeof(rec.ctr));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001521 rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
1522 rec.ver[0] = MBEDTLS_SSL_MAJOR_VERSION_3;
1523 rec.ver[1] = MBEDTLS_SSL_MINOR_VERSION_3;
1524#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1525 rec.cid_len = 0;
1526#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1527
1528 /* Prepare dummy record content */
1529 rec.buf = buf;
1530 rec.buf_len = buflen;
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001531 rec.data_offset = block_size;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001532 rec.data_len = plaintext_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001533 memset(rec.buf + rec.data_offset, 42, rec.data_len);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001534
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001535 /* Serialized version of record header for MAC purposes */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001536 memcpy(add_data, rec.ctr, 8);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001537 add_data[8] = rec.type;
1538 add_data[9] = rec.ver[0];
1539 add_data[10] = rec.ver[1];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001540 add_data[11] = (rec.data_len >> 8) & 0xff;
1541 add_data[12] = (rec.data_len >> 0) & 0xff;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001542
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001543 /* Set dummy IV */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001544 memset(t0.iv_enc, 0x55, t0.ivlen);
1545 memcpy(rec.buf, t0.iv_enc, t0.ivlen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001546
1547 /*
1548 * Prepare a pre-encryption record (with MAC and padding), and save it.
1549 */
1550
1551 /* MAC with additional data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001552 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc, add_data, 13));
1553 TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc,
1554 rec.buf + rec.data_offset,
1555 rec.data_len));
1556 TEST_EQUAL(0, mbedtls_md_hmac_finish(&t0.md_ctx_enc, mac));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001557
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001558 memcpy(rec.buf + rec.data_offset + rec.data_len, mac, t0.maclen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001559 rec.data_len += t0.maclen;
1560
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001561 /* Pad */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001562 memset(rec.buf + rec.data_offset + rec.data_len, padlen, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001563 rec.data_len += padlen + 1;
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001564
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001565 /* Save correct pre-encryption record */
1566 rec_save = rec;
1567 rec_save.buf = buf_save;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001568 memcpy(buf_save, buf, buflen);
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001569
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001570 /*
1571 * Encrypt and decrypt the correct record, expecting success
1572 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001573 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1574 t0.iv_enc, t0.ivlen,
1575 rec.buf + rec.data_offset, rec.data_len,
1576 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001577 rec.data_offset -= t0.ivlen;
1578 rec.data_len += t0.ivlen;
1579
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001580 TEST_EQUAL(0, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001581
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001582 /*
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001583 * Modify each byte of the pre-encryption record before encrypting and
1584 * decrypting it, expecting failure every time.
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001585 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001586 for (i = block_size; i < buflen; i++) {
1587 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001588
1589 /* Restore correct pre-encryption record */
1590 rec = rec_save;
1591 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001592 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001593
Manuel Pégourié-Gonnardb51f0442020-07-21 10:40:25 +02001594 /* Corrupt one byte of the data (could be plaintext, MAC or padding) */
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001595 rec.buf[i] ^= 0x01;
1596
1597 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001598 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1599 t0.iv_enc, t0.ivlen,
1600 rec.buf + rec.data_offset, rec.data_len,
1601 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001602 rec.data_offset -= t0.ivlen;
1603 rec.data_len += t0.ivlen;
1604
1605 /* Decrypt and expect failure */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001606 TEST_EQUAL(MBEDTLS_ERR_SSL_INVALID_MAC,
1607 mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001608 }
1609
1610 /*
1611 * Use larger values of the padding bytes - with small buffers, this tests
1612 * the case where the announced padlen would be larger than the buffer
1613 * (and before that, than the buffer minus the size of the MAC), to make
1614 * sure our padding checking code does not perform any out-of-bounds reads
1615 * in this case. (With larger buffers, ie when the plaintext is long or
1616 * maximal length padding is used, this is less relevant but still doesn't
1617 * hurt to test.)
1618 *
1619 * (Start the loop with correct padding, just to double-check that record
1620 * saving did work, and that we're overwriting the correct bytes.)
1621 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001622 for (i = padlen; i <= pad_max_len; i++) {
1623 mbedtls_test_set_step(i);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001624
1625 /* Restore correct pre-encryption record */
1626 rec = rec_save;
1627 rec.buf = buf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001628 memcpy(buf, buf_save, buflen);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001629
1630 /* Set padding bytes to new value */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001631 memset(buf + buflen - padlen - 1, i, padlen + 1);
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001632
1633 /* Encrypt */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001634 TEST_EQUAL(0, mbedtls_cipher_crypt(&t0.cipher_ctx_enc,
1635 t0.iv_enc, t0.ivlen,
1636 rec.buf + rec.data_offset, rec.data_len,
1637 rec.buf + rec.data_offset, &olen));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001638 rec.data_offset -= t0.ivlen;
1639 rec.data_len += t0.ivlen;
1640
1641 /* Decrypt and expect failure except the first time */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001642 exp_ret = (i == padlen) ? 0 : MBEDTLS_ERR_SSL_INVALID_MAC;
1643 TEST_EQUAL(exp_ret, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
Manuel Pégourié-Gonnard527c1ff2020-07-07 10:43:37 +02001644 }
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001645
1646exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001647 mbedtls_ssl_free(&ssl);
1648 mbedtls_ssl_transform_free(&t0);
1649 mbedtls_ssl_transform_free(&t1);
1650 mbedtls_free(buf);
1651 mbedtls_free(buf_save);
Valerio Setti44570a52023-04-19 15:10:45 +02001652 USE_PSA_DONE();
Manuel Pégourié-Gonnard0ac01a12020-07-03 12:49:10 +02001653}
1654/* END_CASE */
1655
Hanno Becker39ff4922020-08-21 13:36:56 +01001656/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001657void ssl_tls1_3_hkdf_expand_label(int hash_alg,
1658 data_t *secret,
1659 int label_idx,
1660 data_t *ctx,
1661 int desired_length,
1662 data_t *expected)
Hanno Becker39ff4922020-08-21 13:36:56 +01001663{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001664 unsigned char dst[100];
Hanno Becker39ff4922020-08-21 13:36:56 +01001665
Hanno Becker70d7fb02020-09-09 10:11:21 +01001666 unsigned char const *lbl = NULL;
1667 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001668#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1669 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001670 { \
1671 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001672 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001673 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001674 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001675#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001676 TEST_ASSERT(lbl != NULL);
Hanno Becker39ff4922020-08-21 13:36:56 +01001677
1678 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001679 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1680 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001681
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001682 TEST_ASSERT(mbedtls_ssl_tls1_3_hkdf_expand_label(
1683 (mbedtls_md_type_t) hash_alg,
1684 secret->x, secret->len,
1685 lbl, lbl_len,
1686 ctx->x, ctx->len,
1687 dst, desired_length) == 0);
Hanno Becker39ff4922020-08-21 13:36:56 +01001688
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001689 ASSERT_COMPARE(dst, (size_t) desired_length,
1690 expected->x, (size_t) expected->len);
Hanno Becker39ff4922020-08-21 13:36:56 +01001691}
1692/* END_CASE */
1693
Hanno Becker19498f82020-08-21 13:37:08 +01001694/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001695void ssl_tls1_3_traffic_key_generation(int hash_alg,
1696 data_t *server_secret,
1697 data_t *client_secret,
1698 int desired_iv_len,
1699 int desired_key_len,
1700 data_t *expected_server_write_key,
1701 data_t *expected_server_write_iv,
1702 data_t *expected_client_write_key,
1703 data_t *expected_client_write_iv)
Hanno Becker19498f82020-08-21 13:37:08 +01001704{
1705 mbedtls_ssl_key_set keys;
1706
1707 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001708 TEST_ASSERT(client_secret->len == server_secret->len);
Yanray Wang82b41492023-03-14 12:26:44 +08001709 TEST_ASSERT(
1710 expected_client_write_iv->len == expected_server_write_iv->len &&
1711 expected_client_write_iv->len == (size_t) desired_iv_len);
1712 TEST_ASSERT(
1713 expected_client_write_key->len == expected_server_write_key->len &&
1714 expected_client_write_key->len == (size_t) desired_key_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001715
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001716 TEST_ASSERT(mbedtls_ssl_tls1_3_make_traffic_keys(
1717 (mbedtls_md_type_t) hash_alg,
1718 client_secret->x,
1719 server_secret->x,
1720 client_secret->len /* == server_secret->len */,
1721 desired_key_len, desired_iv_len,
1722 &keys) == 0);
Hanno Becker19498f82020-08-21 13:37:08 +01001723
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001724 ASSERT_COMPARE(keys.client_write_key,
1725 keys.key_len,
1726 expected_client_write_key->x,
1727 (size_t) desired_key_len);
1728 ASSERT_COMPARE(keys.server_write_key,
1729 keys.key_len,
1730 expected_server_write_key->x,
1731 (size_t) desired_key_len);
1732 ASSERT_COMPARE(keys.client_write_iv,
1733 keys.iv_len,
1734 expected_client_write_iv->x,
1735 (size_t) desired_iv_len);
1736 ASSERT_COMPARE(keys.server_write_iv,
1737 keys.iv_len,
1738 expected_server_write_iv->x,
1739 (size_t) desired_iv_len);
Hanno Becker19498f82020-08-21 13:37:08 +01001740}
1741/* END_CASE */
1742
Hanno Beckere4849d12020-08-21 14:14:14 +01001743/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001744void ssl_tls1_3_derive_secret(int hash_alg,
1745 data_t *secret,
1746 int label_idx,
1747 data_t *ctx,
1748 int desired_length,
1749 int already_hashed,
1750 data_t *expected)
Hanno Beckere4849d12020-08-21 14:14:14 +01001751{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001752 unsigned char dst[100];
Hanno Beckere4849d12020-08-21 14:14:14 +01001753
Hanno Becker70d7fb02020-09-09 10:11:21 +01001754 unsigned char const *lbl = NULL;
1755 size_t lbl_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001756#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
1757 if (label_idx == (int) tls1_3_label_ ## name) \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001758 { \
1759 lbl = mbedtls_ssl_tls1_3_labels.name; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001760 lbl_len = sizeof(mbedtls_ssl_tls1_3_labels.name); \
Hanno Becker70d7fb02020-09-09 10:11:21 +01001761 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001762 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Becker70d7fb02020-09-09 10:11:21 +01001763#undef MBEDTLS_SSL_TLS1_3_LABEL
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001764 TEST_ASSERT(lbl != NULL);
Hanno Becker70d7fb02020-09-09 10:11:21 +01001765
Hanno Beckere4849d12020-08-21 14:14:14 +01001766 /* Check sanity of test parameters. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001767 TEST_ASSERT((size_t) desired_length <= sizeof(dst));
1768 TEST_ASSERT((size_t) desired_length == expected->len);
Hanno Beckere4849d12020-08-21 14:14:14 +01001769
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001770 TEST_ASSERT(mbedtls_ssl_tls1_3_derive_secret(
1771 (mbedtls_md_type_t) hash_alg,
1772 secret->x, secret->len,
1773 lbl, lbl_len,
1774 ctx->x, ctx->len,
1775 already_hashed,
1776 dst, desired_length) == 0);
Hanno Beckere4849d12020-08-21 14:14:14 +01001777
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001778 ASSERT_COMPARE(dst, desired_length,
1779 expected->x, desired_length);
Hanno Beckere4849d12020-08-21 14:14:14 +01001780}
1781/* END_CASE */
1782
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001783/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001784void ssl_tls1_3_key_evolution(int hash_alg,
1785 data_t *secret,
1786 data_t *input,
1787 data_t *expected)
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001788{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001789 unsigned char secret_new[MBEDTLS_MD_MAX_SIZE];
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001790
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001791 TEST_ASSERT(mbedtls_ssl_tls1_3_evolve_secret(
1792 (mbedtls_md_type_t) hash_alg,
1793 secret->len ? secret->x : NULL,
1794 input->len ? input->x : NULL, input->len,
1795 secret_new) == 0);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001796
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001797 ASSERT_COMPARE(secret_new, (size_t) expected->len,
1798 expected->x, (size_t) expected->len);
Hanno Becker2d2c3eb2020-08-20 14:54:24 +01001799}
1800/* END_CASE */
1801
Ron Eldor824ad7b2019-05-13 14:09:00 +03001802/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001803void ssl_tls_prf(int type, data_t *secret, data_t *random,
1804 char *label, data_t *result_str, int exp_ret)
Ron Eldor824ad7b2019-05-13 14:09:00 +03001805{
1806 unsigned char *output;
1807
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001808 output = mbedtls_calloc(1, result_str->len);
1809 if (output == NULL) {
Ron Eldor824ad7b2019-05-13 14:09:00 +03001810 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001811 }
Ron Eldor824ad7b2019-05-13 14:09:00 +03001812
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001813 USE_PSA_INIT();
Ron Eldor6b9b1b82019-05-15 17:04:33 +03001814
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001815 TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
1816 label, random->x, random->len,
1817 output, result_str->len) == exp_ret);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001818
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001819 if (exp_ret == 0) {
1820 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
1821 result_str->len, result_str->len) == 0);
Ron Eldor824ad7b2019-05-13 14:09:00 +03001822 }
1823exit:
1824
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001825 mbedtls_free(output);
1826 USE_PSA_DONE();
Ron Eldor824ad7b2019-05-13 14:09:00 +03001827}
1828/* END_CASE */
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001829
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001830/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001831void ssl_serialize_session_save_load(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001832{
1833 mbedtls_ssl_session original, restored;
1834 unsigned char *buf = NULL;
1835 size_t len;
1836
1837 /*
1838 * Test that a save-load pair is the identity
1839 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001840 mbedtls_ssl_session_init(&original);
1841 mbedtls_ssl_session_init(&restored);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001842 USE_PSA_INIT();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001843
1844 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001845 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1846 &original, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001847
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001848 /* Serialize it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001849 TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
1850 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
1851 TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL);
1852 TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
1853 == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001854
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001855 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001856 TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001857
1858 /*
1859 * Make sure both session structures are identical
1860 */
1861#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001862 TEST_ASSERT(original.start == restored.start);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001863#endif
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001864 TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
1865 TEST_ASSERT(original.compression == restored.compression);
1866 TEST_ASSERT(original.id_len == restored.id_len);
1867 TEST_ASSERT(memcmp(original.id,
1868 restored.id, sizeof(original.id)) == 0);
1869 TEST_ASSERT(memcmp(original.master,
1870 restored.master, sizeof(original.master)) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001871
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001872#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \
1873 defined(MBEDTLS_CERTS_C)
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001874#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001875 TEST_ASSERT((original.peer_cert == NULL) ==
1876 (restored.peer_cert == NULL));
1877 if (original.peer_cert != NULL) {
1878 TEST_ASSERT(original.peer_cert->raw.len ==
1879 restored.peer_cert->raw.len);
1880 TEST_ASSERT(memcmp(original.peer_cert->raw.p,
1881 restored.peer_cert->raw.p,
1882 original.peer_cert->raw.len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001883 }
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001884#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001885 TEST_ASSERT(original.peer_cert_digest_type ==
1886 restored.peer_cert_digest_type);
1887 TEST_ASSERT(original.peer_cert_digest_len ==
1888 restored.peer_cert_digest_len);
1889 TEST_ASSERT((original.peer_cert_digest == NULL) ==
1890 (restored.peer_cert_digest == NULL));
1891 if (original.peer_cert_digest != NULL) {
1892 TEST_ASSERT(memcmp(original.peer_cert_digest,
1893 restored.peer_cert_digest,
1894 original.peer_cert_digest_len) == 0);
Manuel Pégourié-Gonnardee13a732019-07-29 13:00:39 +02001895 }
1896#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine33d03fe2023-02-01 18:37:49 +01001897#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && MBEDTLS_CERTS_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001898 TEST_ASSERT(original.verify_result == restored.verify_result);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001899
1900#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001901 TEST_ASSERT(original.ticket_len == restored.ticket_len);
1902 if (original.ticket_len != 0) {
1903 TEST_ASSERT(original.ticket != NULL);
1904 TEST_ASSERT(restored.ticket != NULL);
1905 TEST_ASSERT(memcmp(original.ticket,
1906 restored.ticket, original.ticket_len) == 0);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001907 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001908 TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001909#endif
1910
1911#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001912 TEST_ASSERT(original.mfl_code == restored.mfl_code);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001913#endif
1914
1915#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001916 TEST_ASSERT(original.trunc_hmac == restored.trunc_hmac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001917#endif
1918
1919#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001920 TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001921#endif
1922
1923exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001924 mbedtls_ssl_session_free(&original);
1925 mbedtls_ssl_session_free(&restored);
1926 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02001927 USE_PSA_DONE();
Manuel Pégourié-Gonnardf9deaec2019-05-24 09:41:39 +02001928}
1929/* END_CASE */
1930
Manuel Pégourié-Gonnardaa755832019-06-03 10:53:47 +02001931/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001932void ssl_serialize_session_load_save(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001933{
1934 mbedtls_ssl_session session;
1935 unsigned char *buf1 = NULL, *buf2 = NULL;
1936 size_t len0, len1, len2;
1937
1938 /*
1939 * Test that a load-save pair is the identity
1940 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001941 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001942 USE_PSA_INIT();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001943
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001944 /* Prepare a dummy session to work on */
Yanray Wang862ef862023-03-14 11:05:04 +08001945 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1946 &session, ticket_len, crt_file) == 0);
Manuel Pégourié-Gonnard3caa6ca2019-05-23 10:06:14 +02001947
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001948 /* Get desired buffer size for serializing */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001949 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
1950 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001951
1952 /* Allocate first buffer */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001953 buf1 = mbedtls_calloc(1, len0);
1954 TEST_ASSERT(buf1 != NULL);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001955
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001956 /* Serialize to buffer and free live session */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001957 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
1958 == 0);
1959 TEST_ASSERT(len0 == len1);
1960 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001961
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001962 /* Restore session from serialized data */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001963 TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001964
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001965 /* Allocate second buffer and serialize to it */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001966 buf2 = mbedtls_calloc(1, len0);
1967 TEST_ASSERT(buf2 != NULL);
1968 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
1969 == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001970
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001971 /* Make sure both serialized versions are identical */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001972 TEST_ASSERT(len1 == len2);
1973 TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001974
1975exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001976 mbedtls_ssl_session_free(&session);
1977 mbedtls_free(buf1);
1978 mbedtls_free(buf2);
Valerio Setti44570a52023-04-19 15:10:45 +02001979 USE_PSA_DONE();
Manuel Pégourié-Gonnard6eac11b2019-05-23 09:30:55 +02001980}
1981/* END_CASE */
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001982
1983/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001984void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001985{
1986 mbedtls_ssl_session session;
1987 unsigned char *buf = NULL;
1988 size_t good_len, bad_len, test_len;
1989
1990 /*
1991 * Test that session_save() fails cleanly on small buffers
1992 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001993 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02001994 USE_PSA_INIT();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02001995
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02001996 /* Prepare dummy session and get serialized size */
Yanray Wang862ef862023-03-14 11:05:04 +08001997 TEST_ASSERT(mbedtls_test_ssl_populate_session(
1998 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001999 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2000 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002001
2002 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002003 for (bad_len = 1; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002004 /* Allocate exact size so that asan/valgrind can detect any overwrite */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002005 mbedtls_free(buf);
2006 TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL);
2007 TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
2008 &test_len)
2009 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2010 TEST_ASSERT(test_len == good_len);
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002011 }
2012
2013exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002014 mbedtls_ssl_session_free(&session);
2015 mbedtls_free(buf);
Valerio Setti44570a52023-04-19 15:10:45 +02002016 USE_PSA_DONE();
Manuel Pégourié-Gonnardf5fa0aa2019-05-23 10:38:11 +02002017}
2018/* END_CASE */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002019
2020/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002021void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002022{
2023 mbedtls_ssl_session session;
2024 unsigned char *good_buf = NULL, *bad_buf = NULL;
2025 size_t good_len, bad_len;
2026
2027 /*
2028 * Test that session_load() fails cleanly on small buffers
2029 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002030 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02002031 USE_PSA_INIT();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002032
Manuel Pégourié-Gonnard686adb42019-06-03 09:55:16 +02002033 /* Prepare serialized session data */
Yanray Wang862ef862023-03-14 11:05:04 +08002034 TEST_ASSERT(mbedtls_test_ssl_populate_session(
2035 &session, ticket_len, crt_file) == 0);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002036 TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
2037 == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2038 TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL);
2039 TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
2040 &good_len) == 0);
2041 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002042
2043 /* Try all possible bad lengths */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002044 for (bad_len = 0; bad_len < good_len; bad_len++) {
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002045 /* Allocate exact size so that asan/valgrind can detect any overread */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002046 mbedtls_free(bad_buf);
2047 bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1);
2048 TEST_ASSERT(bad_buf != NULL);
2049 memcpy(bad_buf, good_buf, bad_len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002050
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002051 TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
2052 == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002053 }
2054
2055exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002056 mbedtls_ssl_session_free(&session);
2057 mbedtls_free(good_buf);
2058 mbedtls_free(bad_buf);
Valerio Setti44570a52023-04-19 15:10:45 +02002059 USE_PSA_DONE();
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02002060}
2061/* END_CASE */
Hanno Becker861d0bb2019-05-21 16:39:30 +01002062
Hanno Becker363b6462019-05-29 12:44:28 +01002063/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002064void ssl_session_serialize_version_check(int corrupt_major,
2065 int corrupt_minor,
2066 int corrupt_patch,
2067 int corrupt_config)
Hanno Becker861d0bb2019-05-21 16:39:30 +01002068{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002069 unsigned char serialized_session[2048];
Hanno Becker363b6462019-05-29 12:44:28 +01002070 size_t serialized_session_len;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002071 unsigned cur_byte;
Hanno Becker861d0bb2019-05-21 16:39:30 +01002072 mbedtls_ssl_session session;
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002073 uint8_t should_corrupt_byte[] = { corrupt_major == 1,
2074 corrupt_minor == 1,
2075 corrupt_patch == 1,
2076 corrupt_config == 1,
2077 corrupt_config == 1 };
2078
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002079 mbedtls_ssl_session_init(&session);
Valerio Setti89ae9b62023-04-27 17:22:54 +02002080 USE_PSA_INIT();
Hanno Becker861d0bb2019-05-21 16:39:30 +01002081
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002082 /* Infer length of serialized session. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002083 TEST_ASSERT(mbedtls_ssl_session_save(&session,
2084 serialized_session,
2085 sizeof(serialized_session),
2086 &serialized_session_len) == 0);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002087
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002088 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002089
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002090 /* Without any modification, we should be able to successfully
Hanno Becker363b6462019-05-29 12:44:28 +01002091 * de-serialize the session - double-check that. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002092 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2093 serialized_session,
2094 serialized_session_len) == 0);
2095 mbedtls_ssl_session_free(&session);
Hanno Becker861d0bb2019-05-21 16:39:30 +01002096
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002097 /* Go through the bytes in the serialized session header and
2098 * corrupt them bit-by-bit. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002099 for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002100 int cur_bit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002101 unsigned char * const byte = &serialized_session[cur_byte];
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002102
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002103 if (should_corrupt_byte[cur_byte] == 0) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002104 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002105 }
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002106
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002107 for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002108 unsigned char const corrupted_bit = 0x1u << cur_bit;
2109 /* Modify a single bit in the serialized session. */
2110 *byte ^= corrupted_bit;
2111
2112 /* Attempt to deserialize */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002113 TEST_ASSERT(mbedtls_ssl_session_load(&session,
2114 serialized_session,
2115 serialized_session_len) ==
2116 MBEDTLS_ERR_SSL_VERSION_MISMATCH);
Hanno Beckerfe1275e2019-05-29 12:45:21 +01002117
2118 /* Undo the change */
2119 *byte ^= corrupted_bit;
2120 }
Hanno Becker861d0bb2019-05-21 16:39:30 +01002121 }
Valerio Setti44570a52023-04-19 15:10:45 +02002122 USE_PSA_DONE();
Hanno Becker861d0bb2019-05-21 16:39:30 +01002123}
2124/* END_CASE */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002125
Gilles Peskine1fc71162023-07-20 20:04:00 +02002126/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:!MBEDTLS_TEST_NULL_ENTROPY:!MBEDTLS_PSA_INJECT_ENTROPY:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002127void mbedtls_endpoint_sanity(int endpoint_type)
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002128{
2129 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002130 mbedtls_test_ssl_endpoint ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002131 int ret = -1;
2132
Valerio Setti44570a52023-04-19 15:10:45 +02002133 USE_PSA_INIT();
Yanray Wangc4638492022-10-26 11:51:53 +08002134 ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, MBEDTLS_PK_RSA,
2135 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002136 TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002137
Yanray Wangc4638492022-10-26 11:51:53 +08002138 ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, MBEDTLS_PK_RSA);
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_init(&ep, endpoint_type, MBEDTLS_PK_RSA,
2142 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002143 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002144
2145exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002146 mbedtls_test_ssl_endpoint_free(&ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02002147 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002148}
2149/* END_CASE */
2150
Gilles Peskine1fc71162023-07-20 20:04:00 +02002151/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_ENTROPY_C:!MBEDTLS_TEST_NULL_ENTROPY:!MBEDTLS_PSA_INJECT_ENTROPY:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C */
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002152void move_handshake_to_state(int endpoint_type, int state, int need_pass)
2153{
2154 enum { BUFFSIZE = 1024 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002155 mbedtls_test_ssl_endpoint base_ep, second_ep;
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002156 int ret = -1;
2157
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002158 mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
2159 mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
Andrzej Kurek0d2982b2022-10-18 07:55:46 -04002160
Yanray Wang862ef862023-03-14 11:05:04 +08002161 ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type,
2162 MBEDTLS_PK_RSA,
Yanray Wangc4638492022-10-26 11:51:53 +08002163 NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002164 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002165
Yanray Wang862ef862023-03-14 11:05:04 +08002166 ret = mbedtls_test_ssl_endpoint_init(
2167 &second_ep,
2168 (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
2169 MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
2170 MBEDTLS_PK_RSA, NULL, NULL, NULL, NULL);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002171 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002172
Valerio Setti89ae9b62023-04-27 17:22:54 +02002173 USE_PSA_INIT();
2174
Yanray Wangc4638492022-10-26 11:51:53 +08002175 ret = mbedtls_test_mock_socket_connect(&(base_ep.socket),
2176 &(second_ep.socket),
2177 BUFFSIZE);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002178 TEST_ASSERT(ret == 0);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002179
Yanray Wangc4638492022-10-26 11:51:53 +08002180 ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl),
2181 &(second_ep.ssl),
2182 state);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002183 if (need_pass) {
2184 TEST_ASSERT(ret == 0);
2185 TEST_ASSERT(base_ep.ssl.state == state);
2186 } else {
2187 TEST_ASSERT(ret != 0);
2188 TEST_ASSERT(base_ep.ssl.state != state);
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002189 }
2190
2191exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002192 mbedtls_test_ssl_endpoint_free(&base_ep, NULL);
2193 mbedtls_test_ssl_endpoint_free(&second_ep, NULL);
Valerio Setti44570a52023-04-19 15:10:45 +02002194 USE_PSA_DONE();
Piotr Nowicki2a1f1782020-01-13 09:42:10 +01002195}
2196/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002197
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002198/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002199void handshake_version(int dtls, int client_min_version, int client_max_version,
2200 int server_min_version, int server_max_version,
2201 int expected_negotiated_version)
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002202{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002203 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002204 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002205
Paul Elliottc8570442020-04-15 17:00:50 +01002206 options.client_min_version = client_min_version;
2207 options.client_max_version = client_max_version;
2208 options.server_min_version = server_min_version;
2209 options.server_max_version = server_max_version;
2210
2211 options.expected_negotiated_version = expected_negotiated_version;
2212
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002213 options.dtls = dtls;
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002214 /* By default, SSLv3.0 and TLSv1.0 use 1/n-1 splitting when sending data, so
2215 * the number of fragments will be twice as big. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002216 if (expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_0 ||
2217 expected_negotiated_version == MBEDTLS_SSL_MINOR_VERSION_1) {
Piotr Nowicki438bf3b2020-03-10 12:59:10 +01002218 options.expected_cli_fragments = 2;
2219 options.expected_srv_fragments = 2;
Andrzej Kurek941962e2020-02-07 09:20:32 -05002220 }
Yanray Wangc4638492022-10-26 11:51:53 +08002221 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002222
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002223 /* The goto below is used to avoid an "unused label" warning.*/
2224 goto exit;
2225}
2226/* END_CASE */
Andrzej Kurek9e9efdc2020-02-26 05:25:23 -05002227
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002228/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002229void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002230{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002231 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002232 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002233
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002234 options.cipher = cipher;
2235 options.dtls = dtls;
2236 options.psk_str = psk_str;
2237 options.pk_alg = pk_alg;
Andrzej Kurekcc5169c2020-02-04 09:04:56 -05002238
Yanray Wangc4638492022-10-26 11:51:53 +08002239 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002240
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002241 /* The goto below is used to avoid an "unused label" warning.*/
2242 goto exit;
2243}
2244/* END_CASE */
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002245
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002246/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002247void handshake_cipher(char *cipher, int pk_alg, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002248{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002249 test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002250
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002251 /* The goto below is used to avoid an "unused label" warning.*/
2252 goto exit;
2253}
2254/* END_CASE */
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002255
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002256/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002257void app_data(int mfl, int cli_msg_len, int srv_msg_len,
2258 int expected_cli_fragments,
2259 int expected_srv_fragments, int dtls)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002260{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002261 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002262 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002263
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002264 options.mfl = mfl;
2265 options.cli_msg_len = cli_msg_len;
2266 options.srv_msg_len = srv_msg_len;
2267 options.expected_cli_fragments = expected_cli_fragments;
2268 options.expected_srv_fragments = expected_srv_fragments;
2269 options.dtls = dtls;
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002270
Yanray Wangc4638492022-10-26 11:51:53 +08002271 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002272 /* The goto below is used to avoid an "unused label" warning.*/
2273 goto exit;
2274}
2275/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002276
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002277/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002278void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
2279 int expected_cli_fragments,
2280 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002281{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002282 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2283 expected_srv_fragments, 0);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002284 /* The goto below is used to avoid an "unused label" warning.*/
2285 goto exit;
2286}
2287/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002288
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002289/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002290void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
2291 int expected_cli_fragments,
2292 int expected_srv_fragments)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002293{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002294 test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
2295 expected_srv_fragments, 1);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002296 /* The goto below is used to avoid an "unused label" warning.*/
2297 goto exit;
2298}
2299/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002300
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002301/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002302void handshake_serialization()
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002303{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002304 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002305 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002306
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002307 options.serialize = 1;
2308 options.dtls = 1;
Yanray Wangc4638492022-10-26 11:51:53 +08002309 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002310 /* The goto below is used to avoid an "unused label" warning.*/
2311 goto exit;
2312}
2313/* END_CASE */
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002314
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002315/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED*/
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002316void handshake_fragmentation(int mfl,
2317 int expected_srv_hs_fragmentation,
2318 int expected_cli_hs_fragmentation)
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002319{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002320 mbedtls_test_handshake_test_options options;
2321 mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002322
2323 srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
2324 srv_pattern.counter = 0;
2325 cli_pattern.counter = 0;
2326
Yanray Wangc4638492022-10-26 11:51:53 +08002327 mbedtls_test_init_handshake_options(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002328 options.dtls = 1;
2329 options.mfl = mfl;
Darryl Greenaad82f92019-12-02 10:53:11 +00002330 /* Set cipher to one using CBC so that record splitting can be tested */
2331 options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002332 options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
2333 options.srv_log_obj = &srv_pattern;
2334 options.cli_log_obj = &cli_pattern;
Yanray Wangc4638492022-10-26 11:51:53 +08002335 options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
2336 options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002337
Yanray Wangc4638492022-10-26 11:51:53 +08002338 mbedtls_test_ssl_perform_handshake(&options);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002339
2340 /* Test if the server received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002341 if (expected_srv_hs_fragmentation) {
2342 TEST_ASSERT(srv_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002343 }
2344 /* Test if the client received a fragmented handshake */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002345 if (expected_cli_hs_fragmentation) {
2346 TEST_ASSERT(cli_pattern.counter >= 1);
Piotr Nowickibde7ee82020-02-21 10:59:50 +01002347 }
2348}
2349/* END_CASE */
2350
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002351/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002352void renegotiation(int legacy_renegotiation)
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002353{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002354 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002355 mbedtls_test_init_handshake_options(&options);
Andrzej Kurekda2b6782020-02-12 07:56:36 -05002356
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002357 options.renegotiate = 1;
2358 options.legacy_renegotiation = legacy_renegotiation;
2359 options.dtls = 1;
Andrzej Kurek316da1f2020-02-26 09:03:47 -05002360
Yanray Wangc4638492022-10-26 11:51:53 +08002361 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek8a6ff152020-02-26 09:10:14 -05002362 /* The goto below is used to avoid an "unused label" warning.*/
2363 goto exit;
Andrzej Kurekf40daa32020-02-04 09:00:01 -05002364}
2365/* END_CASE */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002366
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002367/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002368void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
2369 int serialize, int dtls, char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002370{
Yanray Wangabfdcd82022-10-25 16:44:13 +08002371 mbedtls_test_handshake_test_options options;
Yanray Wangc4638492022-10-26 11:51:53 +08002372 mbedtls_test_init_handshake_options(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002373
2374 options.mfl = mfl;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04002375 options.cipher = cipher;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002376 options.renegotiate = renegotiation;
2377 options.legacy_renegotiation = legacy_renegotiation;
2378 options.serialize = serialize;
2379 options.dtls = dtls;
2380 options.resize_buffers = 1;
2381
Yanray Wangc4638492022-10-26 11:51:53 +08002382 mbedtls_test_ssl_perform_handshake(&options);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002383 /* The goto below is used to avoid an "unused label" warning.*/
2384 goto exit;
2385}
2386/* END_CASE */
2387
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002388/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:!MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C:MBEDTLS_SHA256_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002389void resize_buffers_serialize_mfl(int mfl)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002390{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002391 test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
2392 (char *) "");
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002393 /* The goto below is used to avoid an "unused label" warning.*/
2394 goto exit;
2395}
2396/* END_CASE */
2397
Gilles Peskine33d03fe2023-02-01 18:37:49 +01002398/* 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 +01002399void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
2400 char *cipher)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002401{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002402 test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002403 /* The goto below is used to avoid an "unused label" warning.*/
2404 goto exit;
2405}
2406/* END_CASE */
Manuel Pégourié-Gonnard045f0942020-07-02 11:34:02 +02002407
Gilles Peskine1fc71162023-07-20 20:04:00 +02002408/* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED:MBEDTLS_CERTS_C:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_ENTROPY_C:!MBEDTLS_TEST_NULL_ENTROPY:!MBEDTLS_PSA_INJECT_ENTROPY:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_CTR_DRBG_C:MBEDTLS_ECP_C:MBEDTLS_ECDSA_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002409void raw_key_agreement_fail(int bad_server_ecdhe_key)
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002410{
2411 enum { BUFFSIZE = 17000 };
Yanray Wangabfdcd82022-10-25 16:44:13 +08002412 mbedtls_test_ssl_endpoint client, server;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002413 mbedtls_psa_stats_t stats;
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002414 size_t free_slots_before = -1;
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002415
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002416 mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP256R1,
2417 MBEDTLS_ECP_DP_NONE };
Valerio Setti89ae9b62023-04-27 17:22:54 +02002418
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002419 mbedtls_platform_zeroize(&client, sizeof(client));
2420 mbedtls_platform_zeroize(&server, sizeof(server));
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002421
2422 /* Client side, force SECP256R1 to make one key bitflip fail
Andrzej Kurek9cb14d42022-04-14 08:51:41 -04002423 * the raw key agreement. Flipping the first byte makes the
2424 * required 0x04 identifier invalid. */
Yanray Wangc4638492022-10-26 11:51:53 +08002425 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
2426 MBEDTLS_PK_ECDSA, NULL, NULL,
2427 NULL, curve_list), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002428
2429 /* Server side */
Yanray Wangc4638492022-10-26 11:51:53 +08002430 TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
2431 MBEDTLS_PK_ECDSA, NULL, NULL,
2432 NULL, NULL), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002433
Valerio Setti89ae9b62023-04-27 17:22:54 +02002434 USE_PSA_INIT();
2435
Yanray Wangc4638492022-10-26 11:51:53 +08002436 TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket),
2437 &(server.socket),
2438 BUFFSIZE), 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002439
Yanray Wang862ef862023-03-14 11:05:04 +08002440 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2441 &(client.ssl), &(server.ssl),
2442 MBEDTLS_SSL_CLIENT_KEY_EXCHANGE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002443 , 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002444
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002445 mbedtls_psa_get_stats(&stats);
Andrzej Kurek2582ba32022-03-31 06:30:54 -04002446 /* Save the number of slots in use up to this point.
2447 * With PSA, one can be used for the ECDH private key. */
2448 free_slots_before = stats.empty_slots;
Andrzej Kurek99f67782022-03-31 07:17:18 -04002449
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002450 if (bad_server_ecdhe_key) {
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002451 /* Force a simulated bitflip in the server key. to make the
2452 * raw key agreement in ssl_write_client_key_exchange fail. */
2453 (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
2454 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002455
Yanray Wang862ef862023-03-14 11:05:04 +08002456 TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2457 &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER),
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002458 bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002459
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002460 mbedtls_psa_get_stats(&stats);
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002461
Gilles Peskine6dd489c2022-04-15 05:54:40 -04002462 /* Make sure that the key slot is already destroyed in case of failure,
2463 * without waiting to close the connection. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002464 if (bad_server_ecdhe_key) {
2465 TEST_EQUAL(free_slots_before, stats.empty_slots);
2466 }
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002467
2468exit:
Yanray Wangc4638492022-10-26 11:51:53 +08002469 mbedtls_test_ssl_endpoint_free(&client, NULL);
2470 mbedtls_test_ssl_endpoint_free(&server, NULL);
Andrzej Kurek99f67782022-03-31 07:17:18 -04002471
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002472 USE_PSA_DONE();
Andrzej Kurekb4eedf72022-04-15 05:41:14 -04002473}
2474/* END_CASE */
Andrzej Kurek862acb82022-06-06 13:08:23 -04002475
Andrzej Kurek3c036f52022-06-08 11:57:57 -04002476/* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002477void cookie_parsing(data_t *cookie, int exp_ret)
Andrzej Kurek862acb82022-06-06 13:08:23 -04002478{
2479 mbedtls_ssl_context ssl;
2480 mbedtls_ssl_config conf;
2481 size_t len;
2482
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002483 mbedtls_ssl_init(&ssl);
Valerio Setti44570a52023-04-19 15:10:45 +02002484 USE_PSA_INIT();
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002485 mbedtls_ssl_config_init(&conf);
2486 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
2487 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
2488 MBEDTLS_SSL_PRESET_DEFAULT),
2489 0);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002490
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002491 TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
2492 TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
2493 ssl.cli_id_len,
2494 cookie->x, cookie->len,
2495 ssl.out_buf,
2496 MBEDTLS_SSL_OUT_CONTENT_LEN,
2497 &len),
2498 exp_ret);
Andrzej Kurek862acb82022-06-06 13:08:23 -04002499
Valerio Setti44570a52023-04-19 15:10:45 +02002500exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002501 mbedtls_ssl_free(&ssl);
2502 mbedtls_ssl_config_free(&conf);
Valerio Setti44570a52023-04-19 15:10:45 +02002503 USE_PSA_DONE();
Andrzej Kurek862acb82022-06-06 13:08:23 -04002504}
2505/* END_CASE */