]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/sslapitest.c
Add a test for session cache handling
[thirdparty/openssl.git] / test / sslapitest.c
1 /*
2 * Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /*
11 * We need access to the deprecated low level HMAC APIs for legacy purposes
12 * when the deprecated calls are not hidden
13 */
14 #ifndef OPENSSL_NO_DEPRECATED_3_0
15 # define OPENSSL_SUPPRESS_DEPRECATED
16 #endif
17
18 #include <stdio.h>
19 #include <string.h>
20
21 #include <openssl/opensslconf.h>
22 #include <openssl/bio.h>
23 #include <openssl/crypto.h>
24 #include <openssl/ssl.h>
25 #include <openssl/ocsp.h>
26 #include <openssl/srp.h>
27 #include <openssl/txt_db.h>
28 #include <openssl/aes.h>
29 #include <openssl/rand.h>
30 #include <openssl/core_names.h>
31 #include <openssl/core_dispatch.h>
32 #include <openssl/provider.h>
33 #include <openssl/param_build.h>
34 #include <openssl/x509v3.h>
35 #include <openssl/dh.h>
36 #include <openssl/engine.h>
37
38 #include "helpers/ssltestlib.h"
39 #include "testutil.h"
40 #include "testutil/output.h"
41 #include "internal/nelem.h"
42 #include "internal/tlsgroups.h"
43 #include "internal/ktls.h"
44 #include "../ssl/ssl_local.h"
45 #include "../ssl/record/methods/recmethod_local.h"
46 #include "filterprov.h"
47
48 #undef OSSL_NO_USABLE_TLS1_3
49 #if defined(OPENSSL_NO_TLS1_3) \
50 || (defined(OPENSSL_NO_EC) && defined(OPENSSL_NO_DH))
51 /*
52 * If we don't have ec or dh then there are no built-in groups that are usable
53 * with TLSv1.3
54 */
55 # define OSSL_NO_USABLE_TLS1_3
56 #endif
57
58 /* Defined in tls-provider.c */
59 int tls_provider_init(const OSSL_CORE_HANDLE *handle,
60 const OSSL_DISPATCH *in,
61 const OSSL_DISPATCH **out,
62 void **provctx);
63
64 static OSSL_LIB_CTX *libctx = NULL;
65 static OSSL_PROVIDER *defctxnull = NULL;
66
67 #ifndef OSSL_NO_USABLE_TLS1_3
68
69 static SSL_SESSION *clientpsk = NULL;
70 static SSL_SESSION *serverpsk = NULL;
71 static const char *pskid = "Identity";
72 static const char *srvid;
73
74 static int use_session_cb(SSL *ssl, const EVP_MD *md, const unsigned char **id,
75 size_t *idlen, SSL_SESSION **sess);
76 static int find_session_cb(SSL *ssl, const unsigned char *identity,
77 size_t identity_len, SSL_SESSION **sess);
78
79 static int use_session_cb_cnt = 0;
80 static int find_session_cb_cnt = 0;
81 #endif
82
83 static char *certsdir = NULL;
84 static char *cert = NULL;
85 static char *privkey = NULL;
86 static char *cert2 = NULL;
87 static char *privkey2 = NULL;
88 static char *cert1024 = NULL;
89 static char *privkey1024 = NULL;
90 static char *cert3072 = NULL;
91 static char *privkey3072 = NULL;
92 static char *cert4096 = NULL;
93 static char *privkey4096 = NULL;
94 static char *cert8192 = NULL;
95 static char *privkey8192 = NULL;
96 static char *srpvfile = NULL;
97 static char *tmpfilename = NULL;
98 static char *dhfile = NULL;
99
100 static int is_fips = 0;
101 static int fips_ems_check = 0;
102
103 #define LOG_BUFFER_SIZE 2048
104 static char server_log_buffer[LOG_BUFFER_SIZE + 1] = {0};
105 static size_t server_log_buffer_index = 0;
106 static char client_log_buffer[LOG_BUFFER_SIZE + 1] = {0};
107 static size_t client_log_buffer_index = 0;
108 static int error_writing_log = 0;
109
110 #ifndef OPENSSL_NO_OCSP
111 static const unsigned char orespder[] = "Dummy OCSP Response";
112 static int ocsp_server_called = 0;
113 static int ocsp_client_called = 0;
114
115 static int cdummyarg = 1;
116 static X509 *ocspcert = NULL;
117 #endif
118
119 #define CLIENT_VERSION_LEN 2
120
121 /*
122 * This structure is used to validate that the correct number of log messages
123 * of various types are emitted when emitting secret logs.
124 */
125 struct sslapitest_log_counts {
126 unsigned int rsa_key_exchange_count;
127 unsigned int master_secret_count;
128 unsigned int client_early_secret_count;
129 unsigned int client_handshake_secret_count;
130 unsigned int server_handshake_secret_count;
131 unsigned int client_application_secret_count;
132 unsigned int server_application_secret_count;
133 unsigned int early_exporter_secret_count;
134 unsigned int exporter_secret_count;
135 };
136
137
138 static int hostname_cb(SSL *s, int *al, void *arg)
139 {
140 const char *hostname = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
141
142 if (hostname != NULL && (strcmp(hostname, "goodhost") == 0
143 || strcmp(hostname, "altgoodhost") == 0))
144 return SSL_TLSEXT_ERR_OK;
145
146 return SSL_TLSEXT_ERR_NOACK;
147 }
148
149 static void client_keylog_callback(const SSL *ssl, const char *line)
150 {
151 int line_length = strlen(line);
152
153 /* If the log doesn't fit, error out. */
154 if (client_log_buffer_index + line_length > sizeof(client_log_buffer) - 1) {
155 TEST_info("Client log too full");
156 error_writing_log = 1;
157 return;
158 }
159
160 strcat(client_log_buffer, line);
161 client_log_buffer_index += line_length;
162 client_log_buffer[client_log_buffer_index++] = '\n';
163 }
164
165 static void server_keylog_callback(const SSL *ssl, const char *line)
166 {
167 int line_length = strlen(line);
168
169 /* If the log doesn't fit, error out. */
170 if (server_log_buffer_index + line_length > sizeof(server_log_buffer) - 1) {
171 TEST_info("Server log too full");
172 error_writing_log = 1;
173 return;
174 }
175
176 strcat(server_log_buffer, line);
177 server_log_buffer_index += line_length;
178 server_log_buffer[server_log_buffer_index++] = '\n';
179 }
180
181 static int compare_hex_encoded_buffer(const char *hex_encoded,
182 size_t hex_length,
183 const uint8_t *raw,
184 size_t raw_length)
185 {
186 size_t i, j;
187 char hexed[3];
188
189 if (!TEST_size_t_eq(raw_length * 2, hex_length))
190 return 1;
191
192 for (i = j = 0; i < raw_length && j + 1 < hex_length; i++, j += 2) {
193 sprintf(hexed, "%02x", raw[i]);
194 if (!TEST_int_eq(hexed[0], hex_encoded[j])
195 || !TEST_int_eq(hexed[1], hex_encoded[j + 1]))
196 return 1;
197 }
198
199 return 0;
200 }
201
202 static int test_keylog_output(char *buffer, const SSL *ssl,
203 const SSL_SESSION *session,
204 struct sslapitest_log_counts *expected)
205 {
206 char *token = NULL;
207 unsigned char actual_client_random[SSL3_RANDOM_SIZE] = {0};
208 size_t client_random_size = SSL3_RANDOM_SIZE;
209 unsigned char actual_master_key[SSL_MAX_MASTER_KEY_LENGTH] = {0};
210 size_t master_key_size = SSL_MAX_MASTER_KEY_LENGTH;
211 unsigned int rsa_key_exchange_count = 0;
212 unsigned int master_secret_count = 0;
213 unsigned int client_early_secret_count = 0;
214 unsigned int client_handshake_secret_count = 0;
215 unsigned int server_handshake_secret_count = 0;
216 unsigned int client_application_secret_count = 0;
217 unsigned int server_application_secret_count = 0;
218 unsigned int early_exporter_secret_count = 0;
219 unsigned int exporter_secret_count = 0;
220
221 for (token = strtok(buffer, " \n"); token != NULL;
222 token = strtok(NULL, " \n")) {
223 if (strcmp(token, "RSA") == 0) {
224 /*
225 * Premaster secret. Tokens should be: 16 ASCII bytes of
226 * hex-encoded encrypted secret, then the hex-encoded pre-master
227 * secret.
228 */
229 if (!TEST_ptr(token = strtok(NULL, " \n")))
230 return 0;
231 if (!TEST_size_t_eq(strlen(token), 16))
232 return 0;
233 if (!TEST_ptr(token = strtok(NULL, " \n")))
234 return 0;
235 /*
236 * We can't sensibly check the log because the premaster secret is
237 * transient, and OpenSSL doesn't keep hold of it once the master
238 * secret is generated.
239 */
240 rsa_key_exchange_count++;
241 } else if (strcmp(token, "CLIENT_RANDOM") == 0) {
242 /*
243 * Master secret. Tokens should be: 64 ASCII bytes of hex-encoded
244 * client random, then the hex-encoded master secret.
245 */
246 client_random_size = SSL_get_client_random(ssl,
247 actual_client_random,
248 SSL3_RANDOM_SIZE);
249 if (!TEST_size_t_eq(client_random_size, SSL3_RANDOM_SIZE))
250 return 0;
251
252 if (!TEST_ptr(token = strtok(NULL, " \n")))
253 return 0;
254 if (!TEST_size_t_eq(strlen(token), 64))
255 return 0;
256 if (!TEST_false(compare_hex_encoded_buffer(token, 64,
257 actual_client_random,
258 client_random_size)))
259 return 0;
260
261 if (!TEST_ptr(token = strtok(NULL, " \n")))
262 return 0;
263 master_key_size = SSL_SESSION_get_master_key(session,
264 actual_master_key,
265 master_key_size);
266 if (!TEST_size_t_ne(master_key_size, 0))
267 return 0;
268 if (!TEST_false(compare_hex_encoded_buffer(token, strlen(token),
269 actual_master_key,
270 master_key_size)))
271 return 0;
272 master_secret_count++;
273 } else if (strcmp(token, "CLIENT_EARLY_TRAFFIC_SECRET") == 0
274 || strcmp(token, "CLIENT_HANDSHAKE_TRAFFIC_SECRET") == 0
275 || strcmp(token, "SERVER_HANDSHAKE_TRAFFIC_SECRET") == 0
276 || strcmp(token, "CLIENT_TRAFFIC_SECRET_0") == 0
277 || strcmp(token, "SERVER_TRAFFIC_SECRET_0") == 0
278 || strcmp(token, "EARLY_EXPORTER_SECRET") == 0
279 || strcmp(token, "EXPORTER_SECRET") == 0) {
280 /*
281 * TLSv1.3 secret. Tokens should be: 64 ASCII bytes of hex-encoded
282 * client random, and then the hex-encoded secret. In this case,
283 * we treat all of these secrets identically and then just
284 * distinguish between them when counting what we saw.
285 */
286 if (strcmp(token, "CLIENT_EARLY_TRAFFIC_SECRET") == 0)
287 client_early_secret_count++;
288 else if (strcmp(token, "CLIENT_HANDSHAKE_TRAFFIC_SECRET") == 0)
289 client_handshake_secret_count++;
290 else if (strcmp(token, "SERVER_HANDSHAKE_TRAFFIC_SECRET") == 0)
291 server_handshake_secret_count++;
292 else if (strcmp(token, "CLIENT_TRAFFIC_SECRET_0") == 0)
293 client_application_secret_count++;
294 else if (strcmp(token, "SERVER_TRAFFIC_SECRET_0") == 0)
295 server_application_secret_count++;
296 else if (strcmp(token, "EARLY_EXPORTER_SECRET") == 0)
297 early_exporter_secret_count++;
298 else if (strcmp(token, "EXPORTER_SECRET") == 0)
299 exporter_secret_count++;
300
301 client_random_size = SSL_get_client_random(ssl,
302 actual_client_random,
303 SSL3_RANDOM_SIZE);
304 if (!TEST_size_t_eq(client_random_size, SSL3_RANDOM_SIZE))
305 return 0;
306
307 if (!TEST_ptr(token = strtok(NULL, " \n")))
308 return 0;
309 if (!TEST_size_t_eq(strlen(token), 64))
310 return 0;
311 if (!TEST_false(compare_hex_encoded_buffer(token, 64,
312 actual_client_random,
313 client_random_size)))
314 return 0;
315
316 if (!TEST_ptr(token = strtok(NULL, " \n")))
317 return 0;
318 } else {
319 TEST_info("Unexpected token %s\n", token);
320 return 0;
321 }
322 }
323
324 /* Got what we expected? */
325 if (!TEST_size_t_eq(rsa_key_exchange_count,
326 expected->rsa_key_exchange_count)
327 || !TEST_size_t_eq(master_secret_count,
328 expected->master_secret_count)
329 || !TEST_size_t_eq(client_early_secret_count,
330 expected->client_early_secret_count)
331 || !TEST_size_t_eq(client_handshake_secret_count,
332 expected->client_handshake_secret_count)
333 || !TEST_size_t_eq(server_handshake_secret_count,
334 expected->server_handshake_secret_count)
335 || !TEST_size_t_eq(client_application_secret_count,
336 expected->client_application_secret_count)
337 || !TEST_size_t_eq(server_application_secret_count,
338 expected->server_application_secret_count)
339 || !TEST_size_t_eq(early_exporter_secret_count,
340 expected->early_exporter_secret_count)
341 || !TEST_size_t_eq(exporter_secret_count,
342 expected->exporter_secret_count))
343 return 0;
344 return 1;
345 }
346
347 #if !defined(OPENSSL_NO_TLS1_2) || defined(OSSL_NO_USABLE_TLS1_3)
348 static int test_keylog(void)
349 {
350 SSL_CTX *cctx = NULL, *sctx = NULL;
351 SSL *clientssl = NULL, *serverssl = NULL;
352 int testresult = 0;
353 struct sslapitest_log_counts expected;
354
355 /* Clean up logging space */
356 memset(&expected, 0, sizeof(expected));
357 memset(client_log_buffer, 0, sizeof(client_log_buffer));
358 memset(server_log_buffer, 0, sizeof(server_log_buffer));
359 client_log_buffer_index = 0;
360 server_log_buffer_index = 0;
361 error_writing_log = 0;
362
363 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
364 TLS_client_method(),
365 TLS1_VERSION, 0,
366 &sctx, &cctx, cert, privkey)))
367 return 0;
368
369 /* We cannot log the master secret for TLSv1.3, so we should forbid it. */
370 SSL_CTX_set_options(cctx, SSL_OP_NO_TLSv1_3);
371 SSL_CTX_set_options(sctx, SSL_OP_NO_TLSv1_3);
372
373 /* We also want to ensure that we use RSA-based key exchange. */
374 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "RSA")))
375 goto end;
376
377 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx) == NULL)
378 || !TEST_true(SSL_CTX_get_keylog_callback(sctx) == NULL))
379 goto end;
380 SSL_CTX_set_keylog_callback(cctx, client_keylog_callback);
381 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx)
382 == client_keylog_callback))
383 goto end;
384 SSL_CTX_set_keylog_callback(sctx, server_keylog_callback);
385 if (!TEST_true(SSL_CTX_get_keylog_callback(sctx)
386 == server_keylog_callback))
387 goto end;
388
389 /* Now do a handshake and check that the logs have been written to. */
390 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
391 &clientssl, NULL, NULL))
392 || !TEST_true(create_ssl_connection(serverssl, clientssl,
393 SSL_ERROR_NONE))
394 || !TEST_false(error_writing_log)
395 || !TEST_int_gt(client_log_buffer_index, 0)
396 || !TEST_int_gt(server_log_buffer_index, 0))
397 goto end;
398
399 /*
400 * Now we want to test that our output data was vaguely sensible. We
401 * do that by using strtok and confirming that we have more or less the
402 * data we expect. For both client and server, we expect to see one master
403 * secret. The client should also see an RSA key exchange.
404 */
405 expected.rsa_key_exchange_count = 1;
406 expected.master_secret_count = 1;
407 if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
408 SSL_get_session(clientssl), &expected)))
409 goto end;
410
411 expected.rsa_key_exchange_count = 0;
412 if (!TEST_true(test_keylog_output(server_log_buffer, serverssl,
413 SSL_get_session(serverssl), &expected)))
414 goto end;
415
416 testresult = 1;
417
418 end:
419 SSL_free(serverssl);
420 SSL_free(clientssl);
421 SSL_CTX_free(sctx);
422 SSL_CTX_free(cctx);
423
424 return testresult;
425 }
426 #endif
427
428 #ifndef OSSL_NO_USABLE_TLS1_3
429 static int test_keylog_no_master_key(void)
430 {
431 SSL_CTX *cctx = NULL, *sctx = NULL;
432 SSL *clientssl = NULL, *serverssl = NULL;
433 SSL_SESSION *sess = NULL;
434 int testresult = 0;
435 struct sslapitest_log_counts expected;
436 unsigned char buf[1];
437 size_t readbytes, written;
438
439 /* Clean up logging space */
440 memset(&expected, 0, sizeof(expected));
441 memset(client_log_buffer, 0, sizeof(client_log_buffer));
442 memset(server_log_buffer, 0, sizeof(server_log_buffer));
443 client_log_buffer_index = 0;
444 server_log_buffer_index = 0;
445 error_writing_log = 0;
446
447 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
448 TLS_client_method(), TLS1_VERSION, 0,
449 &sctx, &cctx, cert, privkey))
450 || !TEST_true(SSL_CTX_set_max_early_data(sctx,
451 SSL3_RT_MAX_PLAIN_LENGTH)))
452 return 0;
453
454 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx) == NULL)
455 || !TEST_true(SSL_CTX_get_keylog_callback(sctx) == NULL))
456 goto end;
457
458 SSL_CTX_set_keylog_callback(cctx, client_keylog_callback);
459 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx)
460 == client_keylog_callback))
461 goto end;
462
463 SSL_CTX_set_keylog_callback(sctx, server_keylog_callback);
464 if (!TEST_true(SSL_CTX_get_keylog_callback(sctx)
465 == server_keylog_callback))
466 goto end;
467
468 /* Now do a handshake and check that the logs have been written to. */
469 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
470 &clientssl, NULL, NULL))
471 || !TEST_true(create_ssl_connection(serverssl, clientssl,
472 SSL_ERROR_NONE))
473 || !TEST_false(error_writing_log))
474 goto end;
475
476 /*
477 * Now we want to test that our output data was vaguely sensible. For this
478 * test, we expect no CLIENT_RANDOM entry because it doesn't make sense for
479 * TLSv1.3, but we do expect both client and server to emit keys.
480 */
481 expected.client_handshake_secret_count = 1;
482 expected.server_handshake_secret_count = 1;
483 expected.client_application_secret_count = 1;
484 expected.server_application_secret_count = 1;
485 expected.exporter_secret_count = 1;
486 if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
487 SSL_get_session(clientssl), &expected))
488 || !TEST_true(test_keylog_output(server_log_buffer, serverssl,
489 SSL_get_session(serverssl),
490 &expected)))
491 goto end;
492
493 /* Terminate old session and resume with early data. */
494 sess = SSL_get1_session(clientssl);
495 SSL_shutdown(clientssl);
496 SSL_shutdown(serverssl);
497 SSL_free(serverssl);
498 SSL_free(clientssl);
499 serverssl = clientssl = NULL;
500
501 /* Reset key log */
502 memset(client_log_buffer, 0, sizeof(client_log_buffer));
503 memset(server_log_buffer, 0, sizeof(server_log_buffer));
504 client_log_buffer_index = 0;
505 server_log_buffer_index = 0;
506
507 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
508 &clientssl, NULL, NULL))
509 || !TEST_true(SSL_set_session(clientssl, sess))
510 /* Here writing 0 length early data is enough. */
511 || !TEST_true(SSL_write_early_data(clientssl, NULL, 0, &written))
512 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
513 &readbytes),
514 SSL_READ_EARLY_DATA_ERROR)
515 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
516 SSL_EARLY_DATA_ACCEPTED)
517 || !TEST_true(create_ssl_connection(serverssl, clientssl,
518 SSL_ERROR_NONE))
519 || !TEST_true(SSL_session_reused(clientssl)))
520 goto end;
521
522 /* In addition to the previous entries, expect early secrets. */
523 expected.client_early_secret_count = 1;
524 expected.early_exporter_secret_count = 1;
525 if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
526 SSL_get_session(clientssl), &expected))
527 || !TEST_true(test_keylog_output(server_log_buffer, serverssl,
528 SSL_get_session(serverssl),
529 &expected)))
530 goto end;
531
532 testresult = 1;
533
534 end:
535 SSL_SESSION_free(sess);
536 SSL_free(serverssl);
537 SSL_free(clientssl);
538 SSL_CTX_free(sctx);
539 SSL_CTX_free(cctx);
540
541 return testresult;
542 }
543 #endif
544
545 static int verify_retry_cb(X509_STORE_CTX *ctx, void *arg)
546 {
547 int res = X509_verify_cert(ctx);
548 int idx = SSL_get_ex_data_X509_STORE_CTX_idx();
549 SSL *ssl;
550
551 /* this should not happen but check anyway */
552 if (idx < 0
553 || (ssl = X509_STORE_CTX_get_ex_data(ctx, idx)) == NULL)
554 return 0;
555
556 if (res == 0 && X509_STORE_CTX_get_error(ctx) ==
557 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY)
558 /* indicate SSL_ERROR_WANT_RETRY_VERIFY */
559 return SSL_set_retry_verify(ssl);
560
561 return res;
562 }
563
564 static int test_client_cert_verify_cb(void)
565 {
566 /* server key, cert, chain, and root */
567 char *skey = test_mk_file_path(certsdir, "leaf.key");
568 char *leaf = test_mk_file_path(certsdir, "leaf.pem");
569 char *int2 = test_mk_file_path(certsdir, "subinterCA.pem");
570 char *int1 = test_mk_file_path(certsdir, "interCA.pem");
571 char *root = test_mk_file_path(certsdir, "rootCA.pem");
572 X509 *crt1 = NULL, *crt2 = NULL;
573 STACK_OF(X509) *server_chain;
574 SSL_CTX *cctx = NULL, *sctx = NULL;
575 SSL *clientssl = NULL, *serverssl = NULL;
576 int testresult = 0;
577
578 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
579 TLS_client_method(), TLS1_VERSION, 0,
580 &sctx, &cctx, NULL, NULL)))
581 goto end;
582 if (!TEST_int_eq(SSL_CTX_use_certificate_chain_file(sctx, leaf), 1)
583 || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(sctx, skey,
584 SSL_FILETYPE_PEM), 1)
585 || !TEST_int_eq(SSL_CTX_check_private_key(sctx), 1))
586 goto end;
587 if (!TEST_true(SSL_CTX_load_verify_locations(cctx, root, NULL)))
588 goto end;
589 SSL_CTX_set_verify(cctx, SSL_VERIFY_PEER, NULL);
590 SSL_CTX_set_cert_verify_callback(cctx, verify_retry_cb, NULL);
591 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
592 &clientssl, NULL, NULL)))
593 goto end;
594
595 /* attempt SSL_connect() with incomplete server chain */
596 if (!TEST_false(create_ssl_connection(serverssl, clientssl,
597 SSL_ERROR_WANT_RETRY_VERIFY)))
598 goto end;
599
600 /* application provides intermediate certs needed to verify server cert */
601 if (!TEST_ptr((crt1 = load_cert_pem(int1, libctx)))
602 || !TEST_ptr((crt2 = load_cert_pem(int2, libctx)))
603 || !TEST_ptr((server_chain = SSL_get_peer_cert_chain(clientssl))))
604 goto end;
605 /* add certs in reverse order to demonstrate real chain building */
606 if (!TEST_true(sk_X509_push(server_chain, crt1)))
607 goto end;
608 crt1 = NULL;
609 if (!TEST_true(sk_X509_push(server_chain, crt2)))
610 goto end;
611 crt2 = NULL;
612
613 /* continue SSL_connect(), must now succeed with completed server chain */
614 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
615 SSL_ERROR_NONE)))
616 goto end;
617
618 testresult = 1;
619
620 end:
621 X509_free(crt1);
622 X509_free(crt2);
623 if (clientssl != NULL) {
624 SSL_shutdown(clientssl);
625 SSL_free(clientssl);
626 }
627 if (serverssl != NULL) {
628 SSL_shutdown(serverssl);
629 SSL_free(serverssl);
630 }
631 SSL_CTX_free(sctx);
632 SSL_CTX_free(cctx);
633
634 OPENSSL_free(skey);
635 OPENSSL_free(leaf);
636 OPENSSL_free(int2);
637 OPENSSL_free(int1);
638 OPENSSL_free(root);
639
640 return testresult;
641 }
642
643 static int test_ssl_build_cert_chain(void)
644 {
645 int ret = 0;
646 SSL_CTX *ssl_ctx = NULL;
647 SSL *ssl = NULL;
648 char *skey = test_mk_file_path(certsdir, "leaf.key");
649 char *leaf_chain = test_mk_file_path(certsdir, "leaf-chain.pem");
650
651 if (!TEST_ptr(ssl_ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method())))
652 goto end;
653 if (!TEST_ptr(ssl = SSL_new(ssl_ctx)))
654 goto end;
655 /* leaf_chain contains leaf + subinterCA + interCA + rootCA */
656 if (!TEST_int_eq(SSL_use_certificate_chain_file(ssl, leaf_chain), 1)
657 || !TEST_int_eq(SSL_use_PrivateKey_file(ssl, skey, SSL_FILETYPE_PEM), 1)
658 || !TEST_int_eq(SSL_check_private_key(ssl), 1))
659 goto end;
660 if (!TEST_true(SSL_build_cert_chain(ssl, SSL_BUILD_CHAIN_FLAG_NO_ROOT
661 | SSL_BUILD_CHAIN_FLAG_CHECK)))
662 goto end;
663 ret = 1;
664 end:
665 SSL_free(ssl);
666 SSL_CTX_free(ssl_ctx);
667 OPENSSL_free(leaf_chain);
668 OPENSSL_free(skey);
669 return ret;
670 }
671
672 static int get_password_cb(char *buf, int size, int rw_flag, void *userdata)
673 {
674 static const char pass[] = "testpass";
675
676 if (!TEST_int_eq(size, PEM_BUFSIZE))
677 return -1;
678
679 memcpy(buf, pass, sizeof(pass) - 1);
680 return sizeof(pass) - 1;
681 }
682
683 static int test_ssl_ctx_build_cert_chain(void)
684 {
685 int ret = 0;
686 SSL_CTX *ctx = NULL;
687 char *skey = test_mk_file_path(certsdir, "leaf-encrypted.key");
688 char *leaf_chain = test_mk_file_path(certsdir, "leaf-chain.pem");
689
690 if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method())))
691 goto end;
692 SSL_CTX_set_default_passwd_cb(ctx, get_password_cb);
693 /* leaf_chain contains leaf + subinterCA + interCA + rootCA */
694 if (!TEST_int_eq(SSL_CTX_use_certificate_chain_file(ctx, leaf_chain), 1)
695 || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(ctx, skey,
696 SSL_FILETYPE_PEM), 1)
697 || !TEST_int_eq(SSL_CTX_check_private_key(ctx), 1))
698 goto end;
699 if (!TEST_true(SSL_CTX_build_cert_chain(ctx, SSL_BUILD_CHAIN_FLAG_NO_ROOT
700 | SSL_BUILD_CHAIN_FLAG_CHECK)))
701 goto end;
702 ret = 1;
703 end:
704 SSL_CTX_free(ctx);
705 OPENSSL_free(leaf_chain);
706 OPENSSL_free(skey);
707 return ret;
708 }
709
710 #ifndef OPENSSL_NO_TLS1_2
711 static int full_client_hello_callback(SSL *s, int *al, void *arg)
712 {
713 int *ctr = arg;
714 const unsigned char *p;
715 int *exts;
716 /* We only configure two ciphers, but the SCSV is added automatically. */
717 #ifdef OPENSSL_NO_EC
718 const unsigned char expected_ciphers[] = {0x00, 0x9d, 0x00, 0xff};
719 #else
720 const unsigned char expected_ciphers[] = {0x00, 0x9d, 0xc0,
721 0x2c, 0x00, 0xff};
722 #endif
723 const int expected_extensions[] = {
724 #ifndef OPENSSL_NO_EC
725 11, 10,
726 #endif
727 35, 22, 23, 13};
728 size_t len;
729
730 /* Make sure we can defer processing and get called back. */
731 if ((*ctr)++ == 0)
732 return SSL_CLIENT_HELLO_RETRY;
733
734 len = SSL_client_hello_get0_ciphers(s, &p);
735 if (!TEST_mem_eq(p, len, expected_ciphers, sizeof(expected_ciphers))
736 || !TEST_size_t_eq(
737 SSL_client_hello_get0_compression_methods(s, &p), 1)
738 || !TEST_int_eq(*p, 0))
739 return SSL_CLIENT_HELLO_ERROR;
740 if (!SSL_client_hello_get1_extensions_present(s, &exts, &len))
741 return SSL_CLIENT_HELLO_ERROR;
742 if (len != OSSL_NELEM(expected_extensions) ||
743 memcmp(exts, expected_extensions, len * sizeof(*exts)) != 0) {
744 printf("ClientHello callback expected extensions mismatch\n");
745 OPENSSL_free(exts);
746 return SSL_CLIENT_HELLO_ERROR;
747 }
748 OPENSSL_free(exts);
749 return SSL_CLIENT_HELLO_SUCCESS;
750 }
751
752 static int test_client_hello_cb(void)
753 {
754 SSL_CTX *cctx = NULL, *sctx = NULL;
755 SSL *clientssl = NULL, *serverssl = NULL;
756 int testctr = 0, testresult = 0;
757
758 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
759 TLS_client_method(), TLS1_VERSION, 0,
760 &sctx, &cctx, cert, privkey)))
761 goto end;
762 SSL_CTX_set_client_hello_cb(sctx, full_client_hello_callback, &testctr);
763
764 /* The gimpy cipher list we configure can't do TLS 1.3. */
765 SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
766
767 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
768 "AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384"))
769 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
770 &clientssl, NULL, NULL))
771 || !TEST_false(create_ssl_connection(serverssl, clientssl,
772 SSL_ERROR_WANT_CLIENT_HELLO_CB))
773 /*
774 * Passing a -1 literal is a hack since
775 * the real value was lost.
776 * */
777 || !TEST_int_eq(SSL_get_error(serverssl, -1),
778 SSL_ERROR_WANT_CLIENT_HELLO_CB)
779 || !TEST_true(create_ssl_connection(serverssl, clientssl,
780 SSL_ERROR_NONE)))
781 goto end;
782
783 testresult = 1;
784
785 end:
786 SSL_free(serverssl);
787 SSL_free(clientssl);
788 SSL_CTX_free(sctx);
789 SSL_CTX_free(cctx);
790
791 return testresult;
792 }
793
794 static int test_no_ems(void)
795 {
796 SSL_CTX *cctx = NULL, *sctx = NULL;
797 SSL *clientssl = NULL, *serverssl = NULL;
798 int testresult = 0, status;
799
800 if (!create_ssl_ctx_pair(libctx, TLS_server_method(), TLS_client_method(),
801 TLS1_VERSION, TLS1_2_VERSION,
802 &sctx, &cctx, cert, privkey)) {
803 printf("Unable to create SSL_CTX pair\n");
804 goto end;
805 }
806
807 SSL_CTX_set_options(sctx, SSL_OP_NO_EXTENDED_MASTER_SECRET);
808
809 if (!create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL, NULL)) {
810 printf("Unable to create SSL objects\n");
811 goto end;
812 }
813
814 status = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
815 if (fips_ems_check) {
816 if (status == 1) {
817 printf("When FIPS uses the EMS check a connection that doesn't use EMS should fail\n");
818 goto end;
819 }
820 } else {
821 if (!status) {
822 printf("Creating SSL connection failed\n");
823 goto end;
824 }
825 if (SSL_get_extms_support(serverssl)) {
826 printf("Server reports Extended Master Secret support\n");
827 goto end;
828 }
829 if (SSL_get_extms_support(clientssl)) {
830 printf("Client reports Extended Master Secret support\n");
831 goto end;
832 }
833 }
834 testresult = 1;
835
836 end:
837 SSL_free(serverssl);
838 SSL_free(clientssl);
839 SSL_CTX_free(sctx);
840 SSL_CTX_free(cctx);
841
842 return testresult;
843 }
844
845 /*
846 * Very focused test to exercise a single case in the server-side state
847 * machine, when the ChangeCipherState message needs to actually change
848 * from one cipher to a different cipher (i.e., not changing from null
849 * encryption to real encryption).
850 */
851 static int test_ccs_change_cipher(void)
852 {
853 SSL_CTX *cctx = NULL, *sctx = NULL;
854 SSL *clientssl = NULL, *serverssl = NULL;
855 SSL_SESSION *sess = NULL, *sesspre, *sesspost;
856 int testresult = 0;
857 int i;
858 unsigned char buf;
859 size_t readbytes;
860
861 /*
862 * Create a connection so we can resume and potentially (but not) use
863 * a different cipher in the second connection.
864 */
865 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
866 TLS_client_method(),
867 TLS1_VERSION, TLS1_2_VERSION,
868 &sctx, &cctx, cert, privkey))
869 || !TEST_true(SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET))
870 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
871 NULL, NULL))
872 || !TEST_true(SSL_set_cipher_list(clientssl, "AES128-GCM-SHA256"))
873 || !TEST_true(create_ssl_connection(serverssl, clientssl,
874 SSL_ERROR_NONE))
875 || !TEST_ptr(sesspre = SSL_get0_session(serverssl))
876 || !TEST_ptr(sess = SSL_get1_session(clientssl)))
877 goto end;
878
879 shutdown_ssl_connection(serverssl, clientssl);
880 serverssl = clientssl = NULL;
881
882 /* Resume, preferring a different cipher. Our server will force the
883 * same cipher to be used as the initial handshake. */
884 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
885 NULL, NULL))
886 || !TEST_true(SSL_set_session(clientssl, sess))
887 || !TEST_true(SSL_set_cipher_list(clientssl, "AES256-GCM-SHA384:AES128-GCM-SHA256"))
888 || !TEST_true(create_ssl_connection(serverssl, clientssl,
889 SSL_ERROR_NONE))
890 || !TEST_true(SSL_session_reused(clientssl))
891 || !TEST_true(SSL_session_reused(serverssl))
892 || !TEST_ptr(sesspost = SSL_get0_session(serverssl))
893 || !TEST_ptr_eq(sesspre, sesspost)
894 || !TEST_int_eq(TLS1_CK_RSA_WITH_AES_128_GCM_SHA256,
895 SSL_CIPHER_get_id(SSL_get_current_cipher(clientssl))))
896 goto end;
897 shutdown_ssl_connection(serverssl, clientssl);
898 serverssl = clientssl = NULL;
899
900 /*
901 * Now create a fresh connection and try to renegotiate a different
902 * cipher on it.
903 */
904 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
905 NULL, NULL))
906 || !TEST_true(SSL_set_cipher_list(clientssl, "AES128-GCM-SHA256"))
907 || !TEST_true(create_ssl_connection(serverssl, clientssl,
908 SSL_ERROR_NONE))
909 || !TEST_ptr(sesspre = SSL_get0_session(serverssl))
910 || !TEST_true(SSL_set_cipher_list(clientssl, "AES256-GCM-SHA384"))
911 || !TEST_true(SSL_renegotiate(clientssl))
912 || !TEST_true(SSL_renegotiate_pending(clientssl)))
913 goto end;
914 /* Actually drive the renegotiation. */
915 for (i = 0; i < 3; i++) {
916 if (SSL_read_ex(clientssl, &buf, sizeof(buf), &readbytes) > 0) {
917 if (!TEST_ulong_eq(readbytes, 0))
918 goto end;
919 } else if (!TEST_int_eq(SSL_get_error(clientssl, 0),
920 SSL_ERROR_WANT_READ)) {
921 goto end;
922 }
923 if (SSL_read_ex(serverssl, &buf, sizeof(buf), &readbytes) > 0) {
924 if (!TEST_ulong_eq(readbytes, 0))
925 goto end;
926 } else if (!TEST_int_eq(SSL_get_error(serverssl, 0),
927 SSL_ERROR_WANT_READ)) {
928 goto end;
929 }
930 }
931 /* sesspre and sesspost should be different since the cipher changed. */
932 if (!TEST_false(SSL_renegotiate_pending(clientssl))
933 || !TEST_false(SSL_session_reused(clientssl))
934 || !TEST_false(SSL_session_reused(serverssl))
935 || !TEST_ptr(sesspost = SSL_get0_session(serverssl))
936 || !TEST_ptr_ne(sesspre, sesspost)
937 || !TEST_int_eq(TLS1_CK_RSA_WITH_AES_256_GCM_SHA384,
938 SSL_CIPHER_get_id(SSL_get_current_cipher(clientssl))))
939 goto end;
940
941 shutdown_ssl_connection(serverssl, clientssl);
942 serverssl = clientssl = NULL;
943
944 testresult = 1;
945
946 end:
947 SSL_free(serverssl);
948 SSL_free(clientssl);
949 SSL_CTX_free(sctx);
950 SSL_CTX_free(cctx);
951 SSL_SESSION_free(sess);
952
953 return testresult;
954 }
955 #endif
956
957 static int execute_test_large_message(const SSL_METHOD *smeth,
958 const SSL_METHOD *cmeth,
959 int min_version, int max_version,
960 int read_ahead)
961 {
962 SSL_CTX *cctx = NULL, *sctx = NULL;
963 SSL *clientssl = NULL, *serverssl = NULL;
964 int testresult = 0;
965
966 if (!TEST_true(create_ssl_ctx_pair(libctx, smeth, cmeth, min_version,
967 max_version, &sctx, &cctx, cert,
968 privkey)))
969 goto end;
970
971 #ifdef OPENSSL_NO_DTLS1_2
972 if (smeth == DTLS_server_method()) {
973 /*
974 * Default sigalgs are SHA1 based in <DTLS1.2 which is in security
975 * level 0
976 */
977 if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
978 || !TEST_true(SSL_CTX_set_cipher_list(cctx,
979 "DEFAULT:@SECLEVEL=0")))
980 goto end;
981 }
982 #endif
983
984 if (read_ahead) {
985 /*
986 * Test that read_ahead works correctly when dealing with large
987 * records
988 */
989 SSL_CTX_set_read_ahead(cctx, 1);
990 }
991
992 if (!ssl_ctx_add_large_cert_chain(libctx, sctx, cert))
993 goto end;
994
995 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
996 NULL, NULL))
997 || !TEST_true(create_ssl_connection(serverssl, clientssl,
998 SSL_ERROR_NONE)))
999 goto end;
1000
1001 /*
1002 * Calling SSL_clear() first is not required but this tests that SSL_clear()
1003 * doesn't leak.
1004 */
1005 if (!TEST_true(SSL_clear(serverssl)))
1006 goto end;
1007
1008 testresult = 1;
1009 end:
1010 SSL_free(serverssl);
1011 SSL_free(clientssl);
1012 SSL_CTX_free(sctx);
1013 SSL_CTX_free(cctx);
1014
1015 return testresult;
1016 }
1017
1018 #if !defined(OPENSSL_NO_SOCK) && !defined(OPENSSL_NO_KTLS) && \
1019 !(defined(OSSL_NO_USABLE_TLS1_3) && defined(OPENSSL_NO_TLS1_2))
1020 /* sock must be connected */
1021 static int ktls_chk_platform(int sock)
1022 {
1023 if (!ktls_enable(sock))
1024 return 0;
1025 return 1;
1026 }
1027
1028 static int ping_pong_query(SSL *clientssl, SSL *serverssl)
1029 {
1030 static char count = 1;
1031 unsigned char cbuf[16000] = {0};
1032 unsigned char sbuf[16000];
1033 size_t err = 0;
1034 char crec_wseq_before[SEQ_NUM_SIZE];
1035 char crec_wseq_after[SEQ_NUM_SIZE];
1036 char crec_rseq_before[SEQ_NUM_SIZE];
1037 char crec_rseq_after[SEQ_NUM_SIZE];
1038 char srec_wseq_before[SEQ_NUM_SIZE];
1039 char srec_wseq_after[SEQ_NUM_SIZE];
1040 char srec_rseq_before[SEQ_NUM_SIZE];
1041 char srec_rseq_after[SEQ_NUM_SIZE];
1042 SSL_CONNECTION *clientsc, *serversc;
1043
1044 if (!TEST_ptr(clientsc = SSL_CONNECTION_FROM_SSL_ONLY(clientssl))
1045 || !TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1046 goto end;
1047
1048 cbuf[0] = count++;
1049 memcpy(crec_wseq_before, &clientsc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1050 memcpy(srec_wseq_before, &serversc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1051 memcpy(crec_rseq_before, &clientsc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1052 memcpy(srec_rseq_before, &serversc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1053
1054 if (!TEST_true(SSL_write(clientssl, cbuf, sizeof(cbuf)) == sizeof(cbuf)))
1055 goto end;
1056
1057 while ((err = SSL_read(serverssl, &sbuf, sizeof(sbuf))) != sizeof(sbuf)) {
1058 if (SSL_get_error(serverssl, err) != SSL_ERROR_WANT_READ) {
1059 goto end;
1060 }
1061 }
1062
1063 if (!TEST_true(SSL_write(serverssl, sbuf, sizeof(sbuf)) == sizeof(sbuf)))
1064 goto end;
1065
1066 while ((err = SSL_read(clientssl, &cbuf, sizeof(cbuf))) != sizeof(cbuf)) {
1067 if (SSL_get_error(clientssl, err) != SSL_ERROR_WANT_READ) {
1068 goto end;
1069 }
1070 }
1071
1072 memcpy(crec_wseq_after, &clientsc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1073 memcpy(srec_wseq_after, &serversc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1074 memcpy(crec_rseq_after, &clientsc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1075 memcpy(srec_rseq_after, &serversc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1076
1077 /* verify the payload */
1078 if (!TEST_mem_eq(cbuf, sizeof(cbuf), sbuf, sizeof(sbuf)))
1079 goto end;
1080
1081 /*
1082 * If ktls is used then kernel sequences are used instead of
1083 * OpenSSL sequences
1084 */
1085 if (!BIO_get_ktls_send(clientsc->wbio)) {
1086 if (!TEST_mem_ne(crec_wseq_before, SEQ_NUM_SIZE,
1087 crec_wseq_after, SEQ_NUM_SIZE))
1088 goto end;
1089 } else {
1090 if (!TEST_mem_eq(crec_wseq_before, SEQ_NUM_SIZE,
1091 crec_wseq_after, SEQ_NUM_SIZE))
1092 goto end;
1093 }
1094
1095 if (!BIO_get_ktls_send(serversc->wbio)) {
1096 if (!TEST_mem_ne(srec_wseq_before, SEQ_NUM_SIZE,
1097 srec_wseq_after, SEQ_NUM_SIZE))
1098 goto end;
1099 } else {
1100 if (!TEST_mem_eq(srec_wseq_before, SEQ_NUM_SIZE,
1101 srec_wseq_after, SEQ_NUM_SIZE))
1102 goto end;
1103 }
1104
1105 if (!BIO_get_ktls_recv(clientsc->wbio)) {
1106 if (!TEST_mem_ne(crec_rseq_before, SEQ_NUM_SIZE,
1107 crec_rseq_after, SEQ_NUM_SIZE))
1108 goto end;
1109 } else {
1110 if (!TEST_mem_eq(crec_rseq_before, SEQ_NUM_SIZE,
1111 crec_rseq_after, SEQ_NUM_SIZE))
1112 goto end;
1113 }
1114
1115 if (!BIO_get_ktls_recv(serversc->wbio)) {
1116 if (!TEST_mem_ne(srec_rseq_before, SEQ_NUM_SIZE,
1117 srec_rseq_after, SEQ_NUM_SIZE))
1118 goto end;
1119 } else {
1120 if (!TEST_mem_eq(srec_rseq_before, SEQ_NUM_SIZE,
1121 srec_rseq_after, SEQ_NUM_SIZE))
1122 goto end;
1123 }
1124
1125 return 1;
1126 end:
1127 return 0;
1128 }
1129
1130 static int execute_test_ktls(int cis_ktls, int sis_ktls,
1131 int tls_version, const char *cipher)
1132 {
1133 SSL_CTX *cctx = NULL, *sctx = NULL;
1134 SSL *clientssl = NULL, *serverssl = NULL;
1135 int ktls_used = 0, testresult = 0;
1136 int cfd = -1, sfd = -1;
1137 int rx_supported;
1138 SSL_CONNECTION *clientsc, *serversc;
1139 unsigned char *buf = NULL;
1140 const size_t bufsz = SSL3_RT_MAX_PLAIN_LENGTH + 16;
1141 int ret;
1142 size_t offset = 0, i;
1143
1144 if (!TEST_true(create_test_sockets(&cfd, &sfd, SOCK_STREAM, NULL)))
1145 goto end;
1146
1147 /* Skip this test if the platform does not support ktls */
1148 if (!ktls_chk_platform(cfd)) {
1149 testresult = TEST_skip("Kernel does not support KTLS");
1150 goto end;
1151 }
1152
1153 if (is_fips && strstr(cipher, "CHACHA") != NULL) {
1154 testresult = TEST_skip("CHACHA is not supported in FIPS");
1155 goto end;
1156 }
1157
1158 /* Create a session based on SHA-256 */
1159 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
1160 TLS_client_method(),
1161 tls_version, tls_version,
1162 &sctx, &cctx, cert, privkey)))
1163 goto end;
1164
1165 if (tls_version == TLS1_3_VERSION) {
1166 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, cipher))
1167 || !TEST_true(SSL_CTX_set_ciphersuites(sctx, cipher)))
1168 goto end;
1169 } else {
1170 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, cipher))
1171 || !TEST_true(SSL_CTX_set_cipher_list(sctx, cipher)))
1172 goto end;
1173 }
1174
1175 if (!TEST_true(create_ssl_objects2(sctx, cctx, &serverssl,
1176 &clientssl, sfd, cfd)))
1177 goto end;
1178
1179 if (!TEST_ptr(clientsc = SSL_CONNECTION_FROM_SSL_ONLY(clientssl))
1180 || !TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1181 goto end;
1182
1183 if (cis_ktls) {
1184 if (!TEST_true(SSL_set_options(clientssl, SSL_OP_ENABLE_KTLS)))
1185 goto end;
1186 }
1187
1188 if (sis_ktls) {
1189 if (!TEST_true(SSL_set_options(serverssl, SSL_OP_ENABLE_KTLS)))
1190 goto end;
1191 }
1192
1193 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
1194 goto end;
1195
1196 /*
1197 * The running kernel may not support a given cipher suite
1198 * or direction, so just check that KTLS isn't used when it
1199 * isn't enabled.
1200 */
1201 if (!cis_ktls) {
1202 if (!TEST_false(BIO_get_ktls_send(clientsc->wbio)))
1203 goto end;
1204 } else {
1205 if (BIO_get_ktls_send(clientsc->wbio))
1206 ktls_used = 1;
1207 }
1208
1209 if (!sis_ktls) {
1210 if (!TEST_false(BIO_get_ktls_send(serversc->wbio)))
1211 goto end;
1212 } else {
1213 if (BIO_get_ktls_send(serversc->wbio))
1214 ktls_used = 1;
1215 }
1216
1217 #if defined(OPENSSL_NO_KTLS_RX)
1218 rx_supported = 0;
1219 #else
1220 rx_supported = 1;
1221 #endif
1222 if (!cis_ktls || !rx_supported) {
1223 if (!TEST_false(BIO_get_ktls_recv(clientsc->rbio)))
1224 goto end;
1225 } else {
1226 if (BIO_get_ktls_send(clientsc->rbio))
1227 ktls_used = 1;
1228 }
1229
1230 if (!sis_ktls || !rx_supported) {
1231 if (!TEST_false(BIO_get_ktls_recv(serversc->rbio)))
1232 goto end;
1233 } else {
1234 if (BIO_get_ktls_send(serversc->rbio))
1235 ktls_used = 1;
1236 }
1237
1238 if ((cis_ktls || sis_ktls) && !ktls_used) {
1239 testresult = TEST_skip("KTLS not supported for %s cipher %s",
1240 tls_version == TLS1_3_VERSION ? "TLS 1.3" :
1241 "TLS 1.2", cipher);
1242 goto end;
1243 }
1244
1245 if (!TEST_true(ping_pong_query(clientssl, serverssl)))
1246 goto end;
1247
1248 buf = OPENSSL_zalloc(bufsz);
1249 if (!TEST_ptr(buf))
1250 goto end;
1251
1252 /*
1253 * Write some data that exceeds the maximum record length. KTLS may choose
1254 * to coalesce this data into a single buffer when we read it again.
1255 */
1256 while ((ret = SSL_write(clientssl, buf, bufsz)) != (int)bufsz) {
1257 if (!TEST_true(SSL_get_error(clientssl, ret) == SSL_ERROR_WANT_WRITE))
1258 goto end;
1259 }
1260
1261 /* Now check that we can read all the data we wrote */
1262 do {
1263 ret = SSL_read(serverssl, buf + offset, bufsz - offset);
1264 if (ret <= 0) {
1265 if (!TEST_true(SSL_get_error(serverssl, ret) == SSL_ERROR_WANT_READ))
1266 goto end;
1267 } else {
1268 offset += ret;
1269 }
1270 } while (offset < bufsz);
1271
1272 if (!TEST_true(offset == bufsz))
1273 goto end;
1274 for (i = 0; i < bufsz; i++)
1275 if (!TEST_true(buf[i] == 0))
1276 goto end;
1277
1278 testresult = 1;
1279 end:
1280 OPENSSL_free(buf);
1281 if (clientssl) {
1282 SSL_shutdown(clientssl);
1283 SSL_free(clientssl);
1284 }
1285 if (serverssl) {
1286 SSL_shutdown(serverssl);
1287 SSL_free(serverssl);
1288 }
1289 SSL_CTX_free(sctx);
1290 SSL_CTX_free(cctx);
1291 serverssl = clientssl = NULL;
1292 if (cfd != -1)
1293 close(cfd);
1294 if (sfd != -1)
1295 close(sfd);
1296 return testresult;
1297 }
1298
1299 #define SENDFILE_SZ (16 * 4096)
1300 #define SENDFILE_CHUNK (4 * 4096)
1301 #define min(a,b) ((a) > (b) ? (b) : (a))
1302
1303 static int execute_test_ktls_sendfile(int tls_version, const char *cipher,
1304 int zerocopy)
1305 {
1306 SSL_CTX *cctx = NULL, *sctx = NULL;
1307 SSL *clientssl = NULL, *serverssl = NULL;
1308 unsigned char *buf, *buf_dst;
1309 BIO *out = NULL, *in = NULL;
1310 int cfd = -1, sfd = -1, ffd, err;
1311 ssize_t chunk_size = 0;
1312 off_t chunk_off = 0;
1313 int testresult = 0;
1314 FILE *ffdp;
1315 SSL_CONNECTION *serversc;
1316
1317 buf = OPENSSL_zalloc(SENDFILE_SZ);
1318 buf_dst = OPENSSL_zalloc(SENDFILE_SZ);
1319 if (!TEST_ptr(buf) || !TEST_ptr(buf_dst)
1320 || !TEST_true(create_test_sockets(&cfd, &sfd, SOCK_STREAM, NULL)))
1321 goto end;
1322
1323 /* Skip this test if the platform does not support ktls */
1324 if (!ktls_chk_platform(sfd)) {
1325 testresult = TEST_skip("Kernel does not support KTLS");
1326 goto end;
1327 }
1328
1329 if (is_fips && strstr(cipher, "CHACHA") != NULL) {
1330 testresult = TEST_skip("CHACHA is not supported in FIPS");
1331 goto end;
1332 }
1333
1334 /* Create a session based on SHA-256 */
1335 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
1336 TLS_client_method(),
1337 tls_version, tls_version,
1338 &sctx, &cctx, cert, privkey)))
1339 goto end;
1340
1341 if (tls_version == TLS1_3_VERSION) {
1342 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, cipher))
1343 || !TEST_true(SSL_CTX_set_ciphersuites(sctx, cipher)))
1344 goto end;
1345 } else {
1346 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, cipher))
1347 || !TEST_true(SSL_CTX_set_cipher_list(sctx, cipher)))
1348 goto end;
1349 }
1350
1351 if (!TEST_true(create_ssl_objects2(sctx, cctx, &serverssl,
1352 &clientssl, sfd, cfd)))
1353 goto end;
1354
1355 if (!TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1356 goto end;
1357
1358 if (!TEST_true(SSL_set_options(serverssl, SSL_OP_ENABLE_KTLS)))
1359 goto end;
1360
1361 if (zerocopy) {
1362 if (!TEST_true(SSL_set_options(serverssl,
1363 SSL_OP_ENABLE_KTLS_TX_ZEROCOPY_SENDFILE)))
1364 goto end;
1365 }
1366
1367 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1368 SSL_ERROR_NONE)))
1369 goto end;
1370
1371 if (!BIO_get_ktls_send(serversc->wbio)) {
1372 testresult = TEST_skip("Failed to enable KTLS for %s cipher %s",
1373 tls_version == TLS1_3_VERSION ? "TLS 1.3" :
1374 "TLS 1.2", cipher);
1375 goto end;
1376 }
1377
1378 if (!TEST_int_gt(RAND_bytes_ex(libctx, buf, SENDFILE_SZ, 0), 0))
1379 goto end;
1380
1381 out = BIO_new_file(tmpfilename, "wb");
1382 if (!TEST_ptr(out))
1383 goto end;
1384
1385 if (BIO_write(out, buf, SENDFILE_SZ) != SENDFILE_SZ)
1386 goto end;
1387
1388 BIO_free(out);
1389 out = NULL;
1390 in = BIO_new_file(tmpfilename, "rb");
1391 BIO_get_fp(in, &ffdp);
1392 ffd = fileno(ffdp);
1393
1394 while (chunk_off < SENDFILE_SZ) {
1395 chunk_size = min(SENDFILE_CHUNK, SENDFILE_SZ - chunk_off);
1396 while ((err = SSL_sendfile(serverssl,
1397 ffd,
1398 chunk_off,
1399 chunk_size,
1400 0)) != chunk_size) {
1401 if (SSL_get_error(serverssl, err) != SSL_ERROR_WANT_WRITE)
1402 goto end;
1403 }
1404 while ((err = SSL_read(clientssl,
1405 buf_dst + chunk_off,
1406 chunk_size)) != chunk_size) {
1407 if (SSL_get_error(clientssl, err) != SSL_ERROR_WANT_READ)
1408 goto end;
1409 }
1410
1411 /* verify the payload */
1412 if (!TEST_mem_eq(buf_dst + chunk_off,
1413 chunk_size,
1414 buf + chunk_off,
1415 chunk_size))
1416 goto end;
1417
1418 chunk_off += chunk_size;
1419 }
1420
1421 testresult = 1;
1422 end:
1423 if (clientssl) {
1424 SSL_shutdown(clientssl);
1425 SSL_free(clientssl);
1426 }
1427 if (serverssl) {
1428 SSL_shutdown(serverssl);
1429 SSL_free(serverssl);
1430 }
1431 SSL_CTX_free(sctx);
1432 SSL_CTX_free(cctx);
1433 serverssl = clientssl = NULL;
1434 BIO_free(out);
1435 BIO_free(in);
1436 if (cfd != -1)
1437 close(cfd);
1438 if (sfd != -1)
1439 close(sfd);
1440 OPENSSL_free(buf);
1441 OPENSSL_free(buf_dst);
1442 return testresult;
1443 }
1444
1445 static struct ktls_test_cipher {
1446 int tls_version;
1447 const char *cipher;
1448 } ktls_test_ciphers[] = {
1449 # if !defined(OPENSSL_NO_TLS1_2)
1450 # ifdef OPENSSL_KTLS_AES_GCM_128
1451 { TLS1_2_VERSION, "AES128-GCM-SHA256" },
1452 # endif
1453 # ifdef OPENSSL_KTLS_AES_CCM_128
1454 { TLS1_2_VERSION, "AES128-CCM"},
1455 # endif
1456 # ifdef OPENSSL_KTLS_AES_GCM_256
1457 { TLS1_2_VERSION, "AES256-GCM-SHA384"},
1458 # endif
1459 # ifdef OPENSSL_KTLS_CHACHA20_POLY1305
1460 # ifndef OPENSSL_NO_EC
1461 { TLS1_2_VERSION, "ECDHE-RSA-CHACHA20-POLY1305"},
1462 # endif
1463 # endif
1464 # endif
1465 # if !defined(OSSL_NO_USABLE_TLS1_3)
1466 # ifdef OPENSSL_KTLS_AES_GCM_128
1467 { TLS1_3_VERSION, "TLS_AES_128_GCM_SHA256" },
1468 # endif
1469 # ifdef OPENSSL_KTLS_AES_CCM_128
1470 { TLS1_3_VERSION, "TLS_AES_128_CCM_SHA256" },
1471 # endif
1472 # ifdef OPENSSL_KTLS_AES_GCM_256
1473 { TLS1_3_VERSION, "TLS_AES_256_GCM_SHA384" },
1474 # endif
1475 # ifdef OPENSSL_KTLS_CHACHA20_POLY1305
1476 { TLS1_3_VERSION, "TLS_CHACHA20_POLY1305_SHA256" },
1477 # endif
1478 # endif
1479 };
1480
1481 #define NUM_KTLS_TEST_CIPHERS \
1482 (sizeof(ktls_test_ciphers) / sizeof(ktls_test_ciphers[0]))
1483
1484 static int test_ktls(int test)
1485 {
1486 struct ktls_test_cipher *cipher;
1487 int cis_ktls, sis_ktls;
1488
1489 OPENSSL_assert(test / 4 < (int)NUM_KTLS_TEST_CIPHERS);
1490 cipher = &ktls_test_ciphers[test / 4];
1491
1492 cis_ktls = (test & 1) != 0;
1493 sis_ktls = (test & 2) != 0;
1494
1495 return execute_test_ktls(cis_ktls, sis_ktls, cipher->tls_version,
1496 cipher->cipher);
1497 }
1498
1499 static int test_ktls_sendfile(int test)
1500 {
1501 struct ktls_test_cipher *cipher;
1502 int tst = test >> 1;
1503
1504 OPENSSL_assert(tst < (int)NUM_KTLS_TEST_CIPHERS);
1505 cipher = &ktls_test_ciphers[tst];
1506
1507 return execute_test_ktls_sendfile(cipher->tls_version, cipher->cipher,
1508 test & 1);
1509 }
1510 #endif
1511
1512 static int test_large_message_tls(void)
1513 {
1514 return execute_test_large_message(TLS_server_method(), TLS_client_method(),
1515 TLS1_VERSION, 0, 0);
1516 }
1517
1518 static int test_large_message_tls_read_ahead(void)
1519 {
1520 return execute_test_large_message(TLS_server_method(), TLS_client_method(),
1521 TLS1_VERSION, 0, 1);
1522 }
1523
1524 #ifndef OPENSSL_NO_DTLS
1525 static int test_large_message_dtls(void)
1526 {
1527 # ifdef OPENSSL_NO_DTLS1_2
1528 /* Not supported in the FIPS provider */
1529 if (is_fips)
1530 return 1;
1531 # endif
1532 /*
1533 * read_ahead is not relevant to DTLS because DTLS always acts as if
1534 * read_ahead is set.
1535 */
1536 return execute_test_large_message(DTLS_server_method(),
1537 DTLS_client_method(),
1538 DTLS1_VERSION, 0, 0);
1539 }
1540 #endif
1541
1542 /*
1543 * Test we can successfully send the maximum amount of application data. We
1544 * test each protocol version individually, each with and without EtM enabled.
1545 * TLSv1.3 doesn't use EtM so technically it is redundant to test both but it is
1546 * simpler this way. We also test all combinations with and without the
1547 * SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS option which affects the size of the
1548 * underlying buffer.
1549 */
1550 static int test_large_app_data(int tst)
1551 {
1552 SSL_CTX *cctx = NULL, *sctx = NULL;
1553 SSL *clientssl = NULL, *serverssl = NULL;
1554 int testresult = 0, prot;
1555 unsigned char *msg, *buf = NULL;
1556 size_t written, readbytes;
1557 const SSL_METHOD *smeth = TLS_server_method();
1558 const SSL_METHOD *cmeth = TLS_client_method();
1559
1560 switch (tst >> 2) {
1561 case 0:
1562 #ifndef OSSL_NO_USABLE_TLS1_3
1563 prot = TLS1_3_VERSION;
1564 break;
1565 #else
1566 return 1;
1567 #endif
1568
1569 case 1:
1570 #ifndef OPENSSL_NO_TLS1_2
1571 prot = TLS1_2_VERSION;
1572 break;
1573 #else
1574 return 1;
1575 #endif
1576
1577 case 2:
1578 #ifndef OPENSSL_NO_TLS1_1
1579 prot = TLS1_1_VERSION;
1580 break;
1581 #else
1582 return 1;
1583 #endif
1584
1585 case 3:
1586 #ifndef OPENSSL_NO_TLS1
1587 prot = TLS1_VERSION;
1588 break;
1589 #else
1590 return 1;
1591 #endif
1592
1593 case 4:
1594 #ifndef OPENSSL_NO_SSL3
1595 prot = SSL3_VERSION;
1596 break;
1597 #else
1598 return 1;
1599 #endif
1600
1601 case 5:
1602 #ifndef OPENSSL_NO_DTLS1_2
1603 prot = DTLS1_2_VERSION;
1604 smeth = DTLS_server_method();
1605 cmeth = DTLS_client_method();
1606 break;
1607 #else
1608 return 1;
1609 #endif
1610
1611 case 6:
1612 #ifndef OPENSSL_NO_DTLS1
1613 prot = DTLS1_VERSION;
1614 smeth = DTLS_server_method();
1615 cmeth = DTLS_client_method();
1616 break;
1617 #else
1618 return 1;
1619 #endif
1620
1621 default:
1622 /* Shouldn't happen */
1623 return 0;
1624 }
1625
1626 if ((prot < TLS1_2_VERSION || prot == DTLS1_VERSION) && is_fips)
1627 return 1;
1628
1629 /* Maximal sized message of zeros */
1630 msg = OPENSSL_zalloc(SSL3_RT_MAX_PLAIN_LENGTH);
1631 if (!TEST_ptr(msg))
1632 goto end;
1633
1634 buf = OPENSSL_malloc(SSL3_RT_MAX_PLAIN_LENGTH + 1);
1635 if (!TEST_ptr(buf))
1636 goto end;
1637 /* Set whole buffer to all bits set */
1638 memset(buf, 0xff, SSL3_RT_MAX_PLAIN_LENGTH + 1);
1639
1640 if (!TEST_true(create_ssl_ctx_pair(libctx, smeth, cmeth, prot, prot,
1641 &sctx, &cctx, cert, privkey)))
1642 goto end;
1643
1644 if (prot < TLS1_2_VERSION || prot == DTLS1_VERSION) {
1645 /* Older protocol versions need SECLEVEL=0 due to SHA1 usage */
1646 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "DEFAULT:@SECLEVEL=0"))
1647 || !TEST_true(SSL_CTX_set_cipher_list(sctx,
1648 "DEFAULT:@SECLEVEL=0")))
1649 goto end;
1650 }
1651
1652 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1653 &clientssl, NULL, NULL)))
1654 goto end;
1655
1656 if ((tst & 1) != 0) {
1657 /* Setting this option gives us a minimally sized underlying buffer */
1658 if (!TEST_true(SSL_set_options(serverssl,
1659 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
1660 || !TEST_true(SSL_set_options(clientssl,
1661 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)))
1662 goto end;
1663 }
1664
1665 if ((tst & 2) != 0) {
1666 /*
1667 * Setting this option means the MAC is added before encryption
1668 * giving us a larger record for the encryption process
1669 */
1670 if (!TEST_true(SSL_set_options(serverssl, SSL_OP_NO_ENCRYPT_THEN_MAC))
1671 || !TEST_true(SSL_set_options(clientssl,
1672 SSL_OP_NO_ENCRYPT_THEN_MAC)))
1673 goto end;
1674 }
1675
1676 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
1677 goto end;
1678
1679 if (!TEST_true(SSL_write_ex(clientssl, msg, SSL3_RT_MAX_PLAIN_LENGTH,
1680 &written))
1681 || !TEST_size_t_eq(written, SSL3_RT_MAX_PLAIN_LENGTH))
1682 goto end;
1683
1684 /* We provide a buffer slightly larger than what we are actually expecting */
1685 if (!TEST_true(SSL_read_ex(serverssl, buf, SSL3_RT_MAX_PLAIN_LENGTH + 1,
1686 &readbytes)))
1687 goto end;
1688
1689 if (!TEST_mem_eq(msg, written, buf, readbytes))
1690 goto end;
1691
1692 testresult = 1;
1693 end:
1694 OPENSSL_free(msg);
1695 OPENSSL_free(buf);
1696 SSL_free(serverssl);
1697 SSL_free(clientssl);
1698 SSL_CTX_free(sctx);
1699 SSL_CTX_free(cctx);
1700 return testresult;
1701 }
1702
1703 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3) \
1704 || !defined(OPENSSL_NO_DTLS)
1705 static int execute_cleanse_plaintext(const SSL_METHOD *smeth,
1706 const SSL_METHOD *cmeth,
1707 int min_version, int max_version)
1708 {
1709 size_t i;
1710 SSL_CTX *cctx = NULL, *sctx = NULL;
1711 SSL *clientssl = NULL, *serverssl = NULL;
1712 int testresult = 0;
1713 const unsigned char *zbuf;
1714 SSL_CONNECTION *serversc;
1715 TLS_RECORD *rr;
1716
1717 static unsigned char cbuf[16000];
1718 static unsigned char sbuf[16000];
1719
1720 if (!TEST_true(create_ssl_ctx_pair(libctx,
1721 smeth, cmeth,
1722 min_version, max_version,
1723 &sctx, &cctx, cert,
1724 privkey)))
1725 goto end;
1726
1727 # ifdef OPENSSL_NO_DTLS1_2
1728 if (smeth == DTLS_server_method()) {
1729 /* Not supported in the FIPS provider */
1730 if (is_fips) {
1731 testresult = 1;
1732 goto end;
1733 };
1734 /*
1735 * Default sigalgs are SHA1 based in <DTLS1.2 which is in security
1736 * level 0
1737 */
1738 if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
1739 || !TEST_true(SSL_CTX_set_cipher_list(cctx,
1740 "DEFAULT:@SECLEVEL=0")))
1741 goto end;
1742 }
1743 # endif
1744
1745 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
1746 NULL, NULL)))
1747 goto end;
1748
1749 if (!TEST_true(SSL_set_options(serverssl, SSL_OP_CLEANSE_PLAINTEXT)))
1750 goto end;
1751
1752 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1753 SSL_ERROR_NONE)))
1754 goto end;
1755
1756 for (i = 0; i < sizeof(cbuf); i++) {
1757 cbuf[i] = i & 0xff;
1758 }
1759
1760 if (!TEST_int_eq(SSL_write(clientssl, cbuf, sizeof(cbuf)), sizeof(cbuf)))
1761 goto end;
1762
1763 if (!TEST_int_eq(SSL_peek(serverssl, &sbuf, sizeof(sbuf)), sizeof(sbuf)))
1764 goto end;
1765
1766 if (!TEST_mem_eq(cbuf, sizeof(cbuf), sbuf, sizeof(sbuf)))
1767 goto end;
1768
1769 /*
1770 * Since we called SSL_peek(), we know the data in the record
1771 * layer is a plaintext record. We can gather the pointer to check
1772 * for zeroization after SSL_read().
1773 */
1774 if (!TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1775 goto end;
1776 rr = serversc->rlayer.tlsrecs;
1777
1778 zbuf = &rr->data[rr->off];
1779 if (!TEST_int_eq(rr->length, sizeof(cbuf)))
1780 goto end;
1781
1782 /*
1783 * After SSL_peek() the plaintext must still be stored in the
1784 * record.
1785 */
1786 if (!TEST_mem_eq(cbuf, sizeof(cbuf), zbuf, sizeof(cbuf)))
1787 goto end;
1788
1789 memset(sbuf, 0, sizeof(sbuf));
1790 if (!TEST_int_eq(SSL_read(serverssl, &sbuf, sizeof(sbuf)), sizeof(sbuf)))
1791 goto end;
1792
1793 if (!TEST_mem_eq(cbuf, sizeof(cbuf), sbuf, sizeof(cbuf)))
1794 goto end;
1795
1796 /* Check if rbuf is cleansed */
1797 memset(cbuf, 0, sizeof(cbuf));
1798 if (!TEST_mem_eq(cbuf, sizeof(cbuf), zbuf, sizeof(cbuf)))
1799 goto end;
1800
1801 testresult = 1;
1802 end:
1803 SSL_free(serverssl);
1804 SSL_free(clientssl);
1805 SSL_CTX_free(sctx);
1806 SSL_CTX_free(cctx);
1807
1808 return testresult;
1809 }
1810 #endif /*
1811 * !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
1812 * || !defined(OPENSSL_NO_DTLS)
1813 */
1814
1815 static int test_cleanse_plaintext(void)
1816 {
1817 #if !defined(OPENSSL_NO_TLS1_2)
1818 if (!TEST_true(execute_cleanse_plaintext(TLS_server_method(),
1819 TLS_client_method(),
1820 TLS1_2_VERSION,
1821 TLS1_2_VERSION)))
1822 return 0;
1823
1824 #endif
1825
1826 #if !defined(OSSL_NO_USABLE_TLS1_3)
1827 if (!TEST_true(execute_cleanse_plaintext(TLS_server_method(),
1828 TLS_client_method(),
1829 TLS1_3_VERSION,
1830 TLS1_3_VERSION)))
1831 return 0;
1832 #endif
1833
1834 #if !defined(OPENSSL_NO_DTLS)
1835
1836 if (!TEST_true(execute_cleanse_plaintext(DTLS_server_method(),
1837 DTLS_client_method(),
1838 DTLS1_VERSION,
1839 0)))
1840 return 0;
1841 #endif
1842 return 1;
1843 }
1844
1845 #ifndef OPENSSL_NO_OCSP
1846 static int ocsp_server_cb(SSL *s, void *arg)
1847 {
1848 int *argi = (int *)arg;
1849 unsigned char *copy = NULL;
1850 STACK_OF(OCSP_RESPID) *ids = NULL;
1851 OCSP_RESPID *id = NULL;
1852
1853 if (*argi == 2) {
1854 /* In this test we are expecting exactly 1 OCSP_RESPID */
1855 SSL_get_tlsext_status_ids(s, &ids);
1856 if (ids == NULL || sk_OCSP_RESPID_num(ids) != 1)
1857 return SSL_TLSEXT_ERR_ALERT_FATAL;
1858
1859 id = sk_OCSP_RESPID_value(ids, 0);
1860 if (id == NULL || !OCSP_RESPID_match_ex(id, ocspcert, libctx, NULL))
1861 return SSL_TLSEXT_ERR_ALERT_FATAL;
1862 } else if (*argi != 1) {
1863 return SSL_TLSEXT_ERR_ALERT_FATAL;
1864 }
1865
1866 if (!TEST_ptr(copy = OPENSSL_memdup(orespder, sizeof(orespder))))
1867 return SSL_TLSEXT_ERR_ALERT_FATAL;
1868
1869 if (!TEST_true(SSL_set_tlsext_status_ocsp_resp(s, copy,
1870 sizeof(orespder)))) {
1871 OPENSSL_free(copy);
1872 return SSL_TLSEXT_ERR_ALERT_FATAL;
1873 }
1874 ocsp_server_called = 1;
1875 return SSL_TLSEXT_ERR_OK;
1876 }
1877
1878 static int ocsp_client_cb(SSL *s, void *arg)
1879 {
1880 int *argi = (int *)arg;
1881 const unsigned char *respderin;
1882 size_t len;
1883
1884 if (*argi != 1 && *argi != 2)
1885 return 0;
1886
1887 len = SSL_get_tlsext_status_ocsp_resp(s, &respderin);
1888 if (!TEST_mem_eq(orespder, len, respderin, len))
1889 return 0;
1890
1891 ocsp_client_called = 1;
1892 return 1;
1893 }
1894
1895 static int test_tlsext_status_type(void)
1896 {
1897 SSL_CTX *cctx = NULL, *sctx = NULL;
1898 SSL *clientssl = NULL, *serverssl = NULL;
1899 int testresult = 0;
1900 STACK_OF(OCSP_RESPID) *ids = NULL;
1901 OCSP_RESPID *id = NULL;
1902 BIO *certbio = NULL;
1903
1904 if (!create_ssl_ctx_pair(libctx, TLS_server_method(), TLS_client_method(),
1905 TLS1_VERSION, 0,
1906 &sctx, &cctx, cert, privkey))
1907 return 0;
1908
1909 if (SSL_CTX_get_tlsext_status_type(cctx) != -1)
1910 goto end;
1911
1912 /* First just do various checks getting and setting tlsext_status_type */
1913
1914 clientssl = SSL_new(cctx);
1915 if (!TEST_int_eq(SSL_get_tlsext_status_type(clientssl), -1)
1916 || !TEST_true(SSL_set_tlsext_status_type(clientssl,
1917 TLSEXT_STATUSTYPE_ocsp))
1918 || !TEST_int_eq(SSL_get_tlsext_status_type(clientssl),
1919 TLSEXT_STATUSTYPE_ocsp))
1920 goto end;
1921
1922 SSL_free(clientssl);
1923 clientssl = NULL;
1924
1925 if (!SSL_CTX_set_tlsext_status_type(cctx, TLSEXT_STATUSTYPE_ocsp)
1926 || SSL_CTX_get_tlsext_status_type(cctx) != TLSEXT_STATUSTYPE_ocsp)
1927 goto end;
1928
1929 clientssl = SSL_new(cctx);
1930 if (SSL_get_tlsext_status_type(clientssl) != TLSEXT_STATUSTYPE_ocsp)
1931 goto end;
1932 SSL_free(clientssl);
1933 clientssl = NULL;
1934
1935 /*
1936 * Now actually do a handshake and check OCSP information is exchanged and
1937 * the callbacks get called
1938 */
1939 SSL_CTX_set_tlsext_status_cb(cctx, ocsp_client_cb);
1940 SSL_CTX_set_tlsext_status_arg(cctx, &cdummyarg);
1941 SSL_CTX_set_tlsext_status_cb(sctx, ocsp_server_cb);
1942 SSL_CTX_set_tlsext_status_arg(sctx, &cdummyarg);
1943 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1944 &clientssl, NULL, NULL))
1945 || !TEST_true(create_ssl_connection(serverssl, clientssl,
1946 SSL_ERROR_NONE))
1947 || !TEST_true(ocsp_client_called)
1948 || !TEST_true(ocsp_server_called))
1949 goto end;
1950 SSL_free(serverssl);
1951 SSL_free(clientssl);
1952 serverssl = NULL;
1953 clientssl = NULL;
1954
1955 /* Try again but this time force the server side callback to fail */
1956 ocsp_client_called = 0;
1957 ocsp_server_called = 0;
1958 cdummyarg = 0;
1959 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1960 &clientssl, NULL, NULL))
1961 /* This should fail because the callback will fail */
1962 || !TEST_false(create_ssl_connection(serverssl, clientssl,
1963 SSL_ERROR_NONE))
1964 || !TEST_false(ocsp_client_called)
1965 || !TEST_false(ocsp_server_called))
1966 goto end;
1967 SSL_free(serverssl);
1968 SSL_free(clientssl);
1969 serverssl = NULL;
1970 clientssl = NULL;
1971
1972 /*
1973 * This time we'll get the client to send an OCSP_RESPID that it will
1974 * accept.
1975 */
1976 ocsp_client_called = 0;
1977 ocsp_server_called = 0;
1978 cdummyarg = 2;
1979 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1980 &clientssl, NULL, NULL)))
1981 goto end;
1982
1983 /*
1984 * We'll just use any old cert for this test - it doesn't have to be an OCSP
1985 * specific one. We'll use the server cert.
1986 */
1987 if (!TEST_ptr(certbio = BIO_new_file(cert, "r"))
1988 || !TEST_ptr(id = OCSP_RESPID_new())
1989 || !TEST_ptr(ids = sk_OCSP_RESPID_new_null())
1990 || !TEST_ptr(ocspcert = X509_new_ex(libctx, NULL))
1991 || !TEST_ptr(PEM_read_bio_X509(certbio, &ocspcert, NULL, NULL))
1992 || !TEST_true(OCSP_RESPID_set_by_key_ex(id, ocspcert, libctx, NULL))
1993 || !TEST_true(sk_OCSP_RESPID_push(ids, id)))
1994 goto end;
1995 id = NULL;
1996 SSL_set_tlsext_status_ids(clientssl, ids);
1997 /* Control has been transferred */
1998 ids = NULL;
1999
2000 BIO_free(certbio);
2001 certbio = NULL;
2002
2003 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2004 SSL_ERROR_NONE))
2005 || !TEST_true(ocsp_client_called)
2006 || !TEST_true(ocsp_server_called))
2007 goto end;
2008
2009 testresult = 1;
2010
2011 end:
2012 SSL_free(serverssl);
2013 SSL_free(clientssl);
2014 SSL_CTX_free(sctx);
2015 SSL_CTX_free(cctx);
2016 sk_OCSP_RESPID_pop_free(ids, OCSP_RESPID_free);
2017 OCSP_RESPID_free(id);
2018 BIO_free(certbio);
2019 X509_free(ocspcert);
2020 ocspcert = NULL;
2021
2022 return testresult;
2023 }
2024 #endif
2025
2026 #if !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
2027 static int new_called, remove_called, get_called;
2028
2029 static int new_session_cb(SSL *ssl, SSL_SESSION *sess)
2030 {
2031 new_called++;
2032 /*
2033 * sess has been up-refed for us, but we don't actually need it so free it
2034 * immediately.
2035 */
2036 SSL_SESSION_free(sess);
2037 return 1;
2038 }
2039
2040 static void remove_session_cb(SSL_CTX *ctx, SSL_SESSION *sess)
2041 {
2042 remove_called++;
2043 }
2044
2045 static SSL_SESSION *get_sess_val = NULL;
2046
2047 static SSL_SESSION *get_session_cb(SSL *ssl, const unsigned char *id, int len,
2048 int *copy)
2049 {
2050 get_called++;
2051 *copy = 1;
2052 return get_sess_val;
2053 }
2054
2055 static int execute_test_session(int maxprot, int use_int_cache,
2056 int use_ext_cache, long s_options)
2057 {
2058 SSL_CTX *sctx = NULL, *cctx = NULL;
2059 SSL *serverssl1 = NULL, *clientssl1 = NULL;
2060 SSL *serverssl2 = NULL, *clientssl2 = NULL;
2061 # ifndef OPENSSL_NO_TLS1_1
2062 SSL *serverssl3 = NULL, *clientssl3 = NULL;
2063 # endif
2064 SSL_SESSION *sess1 = NULL, *sess2 = NULL;
2065 int testresult = 0, numnewsesstick = 1;
2066
2067 new_called = remove_called = 0;
2068
2069 /* TLSv1.3 sends 2 NewSessionTickets */
2070 if (maxprot == TLS1_3_VERSION)
2071 numnewsesstick = 2;
2072
2073 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
2074 TLS_client_method(), TLS1_VERSION, 0,
2075 &sctx, &cctx, cert, privkey)))
2076 return 0;
2077
2078 /*
2079 * Only allow the max protocol version so we can force a connection failure
2080 * later
2081 */
2082 SSL_CTX_set_min_proto_version(cctx, maxprot);
2083 SSL_CTX_set_max_proto_version(cctx, maxprot);
2084
2085 /* Set up session cache */
2086 if (use_ext_cache) {
2087 SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
2088 SSL_CTX_sess_set_remove_cb(cctx, remove_session_cb);
2089 }
2090 if (use_int_cache) {
2091 /* Also covers instance where both are set */
2092 SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT);
2093 } else {
2094 SSL_CTX_set_session_cache_mode(cctx,
2095 SSL_SESS_CACHE_CLIENT
2096 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2097 }
2098
2099 if (s_options) {
2100 SSL_CTX_set_options(sctx, s_options);
2101 }
2102
2103 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl1, &clientssl1,
2104 NULL, NULL))
2105 || !TEST_true(create_ssl_connection(serverssl1, clientssl1,
2106 SSL_ERROR_NONE))
2107 || !TEST_ptr(sess1 = SSL_get1_session(clientssl1)))
2108 goto end;
2109
2110 /* Should fail because it should already be in the cache */
2111 if (use_int_cache && !TEST_false(SSL_CTX_add_session(cctx, sess1)))
2112 goto end;
2113 if (use_ext_cache
2114 && (!TEST_int_eq(new_called, numnewsesstick)
2115
2116 || !TEST_int_eq(remove_called, 0)))
2117 goto end;
2118
2119 new_called = remove_called = 0;
2120 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
2121 &clientssl2, NULL, NULL))
2122 || !TEST_true(SSL_set_session(clientssl2, sess1))
2123 || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
2124 SSL_ERROR_NONE))
2125 || !TEST_true(SSL_session_reused(clientssl2)))
2126 goto end;
2127
2128 if (maxprot == TLS1_3_VERSION) {
2129 /*
2130 * In TLSv1.3 we should have created a new session even though we have
2131 * resumed. Since we attempted a resume we should also have removed the
2132 * old ticket from the cache so that we try to only use tickets once.
2133 */
2134 if (use_ext_cache
2135 && (!TEST_int_eq(new_called, 1)
2136 || !TEST_int_eq(remove_called, 1)))
2137 goto end;
2138 } else {
2139 /*
2140 * In TLSv1.2 we expect to have resumed so no sessions added or
2141 * removed.
2142 */
2143 if (use_ext_cache
2144 && (!TEST_int_eq(new_called, 0)
2145 || !TEST_int_eq(remove_called, 0)))
2146 goto end;
2147 }
2148
2149 SSL_SESSION_free(sess1);
2150 if (!TEST_ptr(sess1 = SSL_get1_session(clientssl2)))
2151 goto end;
2152 shutdown_ssl_connection(serverssl2, clientssl2);
2153 serverssl2 = clientssl2 = NULL;
2154
2155 new_called = remove_called = 0;
2156 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
2157 &clientssl2, NULL, NULL))
2158 || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
2159 SSL_ERROR_NONE)))
2160 goto end;
2161
2162 if (!TEST_ptr(sess2 = SSL_get1_session(clientssl2)))
2163 goto end;
2164
2165 if (use_ext_cache
2166 && (!TEST_int_eq(new_called, numnewsesstick)
2167 || !TEST_int_eq(remove_called, 0)))
2168 goto end;
2169
2170 new_called = remove_called = 0;
2171 /*
2172 * This should clear sess2 from the cache because it is a "bad" session.
2173 * See SSL_set_session() documentation.
2174 */
2175 if (!TEST_true(SSL_set_session(clientssl2, sess1)))
2176 goto end;
2177 if (use_ext_cache
2178 && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
2179 goto end;
2180 if (!TEST_ptr_eq(SSL_get_session(clientssl2), sess1))
2181 goto end;
2182
2183 if (use_int_cache) {
2184 /* Should succeeded because it should not already be in the cache */
2185 if (!TEST_true(SSL_CTX_add_session(cctx, sess2))
2186 || !TEST_true(SSL_CTX_remove_session(cctx, sess2)))
2187 goto end;
2188 }
2189
2190 new_called = remove_called = 0;
2191 /* This shouldn't be in the cache so should fail */
2192 if (!TEST_false(SSL_CTX_remove_session(cctx, sess2)))
2193 goto end;
2194
2195 if (use_ext_cache
2196 && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
2197 goto end;
2198
2199 # if !defined(OPENSSL_NO_TLS1_1)
2200 new_called = remove_called = 0;
2201 /* Force a connection failure */
2202 SSL_CTX_set_max_proto_version(sctx, TLS1_1_VERSION);
2203 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl3,
2204 &clientssl3, NULL, NULL))
2205 || !TEST_true(SSL_set_session(clientssl3, sess1))
2206 /* This should fail because of the mismatched protocol versions */
2207 || !TEST_false(create_ssl_connection(serverssl3, clientssl3,
2208 SSL_ERROR_NONE)))
2209 goto end;
2210
2211 /* We should have automatically removed the session from the cache */
2212 if (use_ext_cache
2213 && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
2214 goto end;
2215
2216 /* Should succeed because it should not already be in the cache */
2217 if (use_int_cache && !TEST_true(SSL_CTX_add_session(cctx, sess2)))
2218 goto end;
2219 # endif
2220
2221 /* Now do some tests for server side caching */
2222 if (use_ext_cache) {
2223 SSL_CTX_sess_set_new_cb(cctx, NULL);
2224 SSL_CTX_sess_set_remove_cb(cctx, NULL);
2225 SSL_CTX_sess_set_new_cb(sctx, new_session_cb);
2226 SSL_CTX_sess_set_remove_cb(sctx, remove_session_cb);
2227 SSL_CTX_sess_set_get_cb(sctx, get_session_cb);
2228 get_sess_val = NULL;
2229 }
2230
2231 SSL_CTX_set_session_cache_mode(cctx, 0);
2232 /* Internal caching is the default on the server side */
2233 if (!use_int_cache)
2234 SSL_CTX_set_session_cache_mode(sctx,
2235 SSL_SESS_CACHE_SERVER
2236 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2237
2238 SSL_free(serverssl1);
2239 SSL_free(clientssl1);
2240 serverssl1 = clientssl1 = NULL;
2241 SSL_free(serverssl2);
2242 SSL_free(clientssl2);
2243 serverssl2 = clientssl2 = NULL;
2244 SSL_SESSION_free(sess1);
2245 sess1 = NULL;
2246 SSL_SESSION_free(sess2);
2247 sess2 = NULL;
2248
2249 SSL_CTX_set_max_proto_version(sctx, maxprot);
2250 if (maxprot == TLS1_2_VERSION)
2251 SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET);
2252 new_called = remove_called = get_called = 0;
2253 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl1, &clientssl1,
2254 NULL, NULL))
2255 || !TEST_true(create_ssl_connection(serverssl1, clientssl1,
2256 SSL_ERROR_NONE))
2257 || !TEST_ptr(sess1 = SSL_get1_session(clientssl1))
2258 || !TEST_ptr(sess2 = SSL_get1_session(serverssl1)))
2259 goto end;
2260
2261 if (use_int_cache) {
2262 if (maxprot == TLS1_3_VERSION && !use_ext_cache) {
2263 /*
2264 * In TLSv1.3 it should not have been added to the internal cache,
2265 * except in the case where we also have an external cache (in that
2266 * case it gets added to the cache in order to generate remove
2267 * events after timeout).
2268 */
2269 if (!TEST_false(SSL_CTX_remove_session(sctx, sess2)))
2270 goto end;
2271 } else {
2272 /* Should fail because it should already be in the cache */
2273 if (!TEST_false(SSL_CTX_add_session(sctx, sess2)))
2274 goto end;
2275 }
2276 }
2277
2278 if (use_ext_cache) {
2279 SSL_SESSION *tmp = sess2;
2280
2281 if (!TEST_int_eq(new_called, numnewsesstick)
2282 || !TEST_int_eq(remove_called, 0)
2283 || !TEST_int_eq(get_called, 0))
2284 goto end;
2285 /*
2286 * Delete the session from the internal cache to force a lookup from
2287 * the external cache. We take a copy first because
2288 * SSL_CTX_remove_session() also marks the session as non-resumable.
2289 */
2290 if (use_int_cache && maxprot != TLS1_3_VERSION) {
2291 if (!TEST_ptr(tmp = SSL_SESSION_dup(sess2))
2292 || !TEST_true(sess2->owner != NULL)
2293 || !TEST_true(tmp->owner == NULL)
2294 || !TEST_true(SSL_CTX_remove_session(sctx, sess2)))
2295 goto end;
2296 SSL_SESSION_free(sess2);
2297 }
2298 sess2 = tmp;
2299 }
2300
2301 new_called = remove_called = get_called = 0;
2302 get_sess_val = sess2;
2303 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
2304 &clientssl2, NULL, NULL))
2305 || !TEST_true(SSL_set_session(clientssl2, sess1))
2306 || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
2307 SSL_ERROR_NONE))
2308 || !TEST_true(SSL_session_reused(clientssl2)))
2309 goto end;
2310
2311 if (use_ext_cache) {
2312 if (!TEST_int_eq(remove_called, 0))
2313 goto end;
2314
2315 if (maxprot == TLS1_3_VERSION) {
2316 if (!TEST_int_eq(new_called, 1)
2317 || !TEST_int_eq(get_called, 0))
2318 goto end;
2319 } else {
2320 if (!TEST_int_eq(new_called, 0)
2321 || !TEST_int_eq(get_called, 1))
2322 goto end;
2323 }
2324 }
2325 /*
2326 * Make a small cache, force out all other sessions but
2327 * sess2, try to add sess1, which should succeed. Then
2328 * make sure it's there by checking the owners. Despite
2329 * the timeouts, sess1 should have kicked out sess2
2330 */
2331
2332 /* Make sess1 expire before sess2 */
2333 if (!TEST_long_gt(SSL_SESSION_set_time(sess1, 1000), 0)
2334 || !TEST_long_gt(SSL_SESSION_set_timeout(sess1, 1000), 0)
2335 || !TEST_long_gt(SSL_SESSION_set_time(sess2, 2000), 0)
2336 || !TEST_long_gt(SSL_SESSION_set_timeout(sess2, 2000), 0))
2337 goto end;
2338
2339 if (!TEST_long_ne(SSL_CTX_sess_set_cache_size(sctx, 1), 0))
2340 goto end;
2341
2342 /* Don't care about results - cache should only be sess2 at end */
2343 SSL_CTX_add_session(sctx, sess1);
2344 SSL_CTX_add_session(sctx, sess2);
2345
2346 /* Now add sess1, and make sure it remains, despite timeout */
2347 if (!TEST_true(SSL_CTX_add_session(sctx, sess1))
2348 || !TEST_ptr(sess1->owner)
2349 || !TEST_ptr_null(sess2->owner))
2350 goto end;
2351
2352 testresult = 1;
2353
2354 end:
2355 SSL_free(serverssl1);
2356 SSL_free(clientssl1);
2357 SSL_free(serverssl2);
2358 SSL_free(clientssl2);
2359 # ifndef OPENSSL_NO_TLS1_1
2360 SSL_free(serverssl3);
2361 SSL_free(clientssl3);
2362 # endif
2363 SSL_SESSION_free(sess1);
2364 SSL_SESSION_free(sess2);
2365 SSL_CTX_free(sctx);
2366 SSL_CTX_free(cctx);
2367
2368 return testresult;
2369 }
2370 #endif /* !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2) */
2371
2372 static int test_session_with_only_int_cache(void)
2373 {
2374 #ifndef OSSL_NO_USABLE_TLS1_3
2375 if (!execute_test_session(TLS1_3_VERSION, 1, 0, 0))
2376 return 0;
2377 #endif
2378
2379 #ifndef OPENSSL_NO_TLS1_2
2380 return execute_test_session(TLS1_2_VERSION, 1, 0, 0);
2381 #else
2382 return 1;
2383 #endif
2384 }
2385
2386 static int test_session_with_only_ext_cache(void)
2387 {
2388 #ifndef OSSL_NO_USABLE_TLS1_3
2389 if (!execute_test_session(TLS1_3_VERSION, 0, 1, 0))
2390 return 0;
2391 #endif
2392
2393 #ifndef OPENSSL_NO_TLS1_2
2394 return execute_test_session(TLS1_2_VERSION, 0, 1, 0);
2395 #else
2396 return 1;
2397 #endif
2398 }
2399
2400 static int test_session_with_both_cache(void)
2401 {
2402 #ifndef OSSL_NO_USABLE_TLS1_3
2403 if (!execute_test_session(TLS1_3_VERSION, 1, 1, 0))
2404 return 0;
2405 #endif
2406
2407 #ifndef OPENSSL_NO_TLS1_2
2408 return execute_test_session(TLS1_2_VERSION, 1, 1, 0);
2409 #else
2410 return 1;
2411 #endif
2412 }
2413
2414 static int test_session_wo_ca_names(void)
2415 {
2416 #ifndef OSSL_NO_USABLE_TLS1_3
2417 if (!execute_test_session(TLS1_3_VERSION, 1, 0, SSL_OP_DISABLE_TLSEXT_CA_NAMES))
2418 return 0;
2419 #endif
2420
2421 #ifndef OPENSSL_NO_TLS1_2
2422 return execute_test_session(TLS1_2_VERSION, 1, 0, SSL_OP_DISABLE_TLSEXT_CA_NAMES);
2423 #else
2424 return 1;
2425 #endif
2426 }
2427
2428
2429 #ifndef OSSL_NO_USABLE_TLS1_3
2430 static SSL_SESSION *sesscache[6];
2431 static int do_cache;
2432
2433 static int new_cachesession_cb(SSL *ssl, SSL_SESSION *sess)
2434 {
2435 if (do_cache) {
2436 sesscache[new_called] = sess;
2437 } else {
2438 /* We don't need the reference to the session, so free it */
2439 SSL_SESSION_free(sess);
2440 }
2441 new_called++;
2442
2443 return 1;
2444 }
2445
2446 static int post_handshake_verify(SSL *sssl, SSL *cssl)
2447 {
2448 SSL_set_verify(sssl, SSL_VERIFY_PEER, NULL);
2449 if (!TEST_true(SSL_verify_client_post_handshake(sssl)))
2450 return 0;
2451
2452 /* Start handshake on the server and client */
2453 if (!TEST_int_eq(SSL_do_handshake(sssl), 1)
2454 || !TEST_int_le(SSL_read(cssl, NULL, 0), 0)
2455 || !TEST_int_le(SSL_read(sssl, NULL, 0), 0)
2456 || !TEST_true(create_ssl_connection(sssl, cssl,
2457 SSL_ERROR_NONE)))
2458 return 0;
2459
2460 return 1;
2461 }
2462
2463 static int setup_ticket_test(int stateful, int idx, SSL_CTX **sctx,
2464 SSL_CTX **cctx)
2465 {
2466 int sess_id_ctx = 1;
2467
2468 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
2469 TLS_client_method(), TLS1_VERSION, 0,
2470 sctx, cctx, cert, privkey))
2471 || !TEST_true(SSL_CTX_set_num_tickets(*sctx, idx))
2472 || !TEST_true(SSL_CTX_set_session_id_context(*sctx,
2473 (void *)&sess_id_ctx,
2474 sizeof(sess_id_ctx))))
2475 return 0;
2476
2477 if (stateful)
2478 SSL_CTX_set_options(*sctx, SSL_OP_NO_TICKET);
2479
2480 SSL_CTX_set_session_cache_mode(*cctx, SSL_SESS_CACHE_CLIENT
2481 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2482 SSL_CTX_sess_set_new_cb(*cctx, new_cachesession_cb);
2483
2484 return 1;
2485 }
2486
2487 static int check_resumption(int idx, SSL_CTX *sctx, SSL_CTX *cctx, int succ)
2488 {
2489 SSL *serverssl = NULL, *clientssl = NULL;
2490 int i;
2491
2492 /* Test that we can resume with all the tickets we got given */
2493 for (i = 0; i < idx * 2; i++) {
2494 new_called = 0;
2495 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2496 &clientssl, NULL, NULL))
2497 || !TEST_true(SSL_set_session(clientssl, sesscache[i])))
2498 goto end;
2499
2500 SSL_set_post_handshake_auth(clientssl, 1);
2501
2502 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2503 SSL_ERROR_NONE)))
2504 goto end;
2505
2506 /*
2507 * Following a successful resumption we only get 1 ticket. After a
2508 * failed one we should get idx tickets.
2509 */
2510 if (succ) {
2511 if (!TEST_true(SSL_session_reused(clientssl))
2512 || !TEST_int_eq(new_called, 1))
2513 goto end;
2514 } else {
2515 if (!TEST_false(SSL_session_reused(clientssl))
2516 || !TEST_int_eq(new_called, idx))
2517 goto end;
2518 }
2519
2520 new_called = 0;
2521 /* After a post-handshake authentication we should get 1 new ticket */
2522 if (succ
2523 && (!post_handshake_verify(serverssl, clientssl)
2524 || !TEST_int_eq(new_called, 1)))
2525 goto end;
2526
2527 SSL_shutdown(clientssl);
2528 SSL_shutdown(serverssl);
2529 SSL_free(serverssl);
2530 SSL_free(clientssl);
2531 serverssl = clientssl = NULL;
2532 SSL_SESSION_free(sesscache[i]);
2533 sesscache[i] = NULL;
2534 }
2535
2536 return 1;
2537
2538 end:
2539 SSL_free(clientssl);
2540 SSL_free(serverssl);
2541 return 0;
2542 }
2543
2544 static int test_tickets(int stateful, int idx)
2545 {
2546 SSL_CTX *sctx = NULL, *cctx = NULL;
2547 SSL *serverssl = NULL, *clientssl = NULL;
2548 int testresult = 0;
2549 size_t j;
2550
2551 /* idx is the test number, but also the number of tickets we want */
2552
2553 new_called = 0;
2554 do_cache = 1;
2555
2556 if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
2557 goto end;
2558
2559 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2560 &clientssl, NULL, NULL)))
2561 goto end;
2562
2563 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2564 SSL_ERROR_NONE))
2565 /* Check we got the number of tickets we were expecting */
2566 || !TEST_int_eq(idx, new_called))
2567 goto end;
2568
2569 SSL_shutdown(clientssl);
2570 SSL_shutdown(serverssl);
2571 SSL_free(serverssl);
2572 SSL_free(clientssl);
2573 SSL_CTX_free(sctx);
2574 SSL_CTX_free(cctx);
2575 clientssl = serverssl = NULL;
2576 sctx = cctx = NULL;
2577
2578 /*
2579 * Now we try to resume with the tickets we previously created. The
2580 * resumption attempt is expected to fail (because we're now using a new
2581 * SSL_CTX). We should see idx number of tickets issued again.
2582 */
2583
2584 /* Stop caching sessions - just count them */
2585 do_cache = 0;
2586
2587 if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
2588 goto end;
2589
2590 if (!check_resumption(idx, sctx, cctx, 0))
2591 goto end;
2592
2593 /* Start again with caching sessions */
2594 new_called = 0;
2595 do_cache = 1;
2596 SSL_CTX_free(sctx);
2597 SSL_CTX_free(cctx);
2598 sctx = cctx = NULL;
2599
2600 if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
2601 goto end;
2602
2603 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2604 &clientssl, NULL, NULL)))
2605 goto end;
2606
2607 SSL_set_post_handshake_auth(clientssl, 1);
2608
2609 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2610 SSL_ERROR_NONE))
2611 /* Check we got the number of tickets we were expecting */
2612 || !TEST_int_eq(idx, new_called))
2613 goto end;
2614
2615 /* After a post-handshake authentication we should get new tickets issued */
2616 if (!post_handshake_verify(serverssl, clientssl)
2617 || !TEST_int_eq(idx * 2, new_called))
2618 goto end;
2619
2620 SSL_shutdown(clientssl);
2621 SSL_shutdown(serverssl);
2622 SSL_free(serverssl);
2623 SSL_free(clientssl);
2624 serverssl = clientssl = NULL;
2625
2626 /* Stop caching sessions - just count them */
2627 do_cache = 0;
2628
2629 /*
2630 * Check we can resume with all the tickets we created. This time around the
2631 * resumptions should all be successful.
2632 */
2633 if (!check_resumption(idx, sctx, cctx, 1))
2634 goto end;
2635
2636 testresult = 1;
2637
2638 end:
2639 SSL_free(serverssl);
2640 SSL_free(clientssl);
2641 for (j = 0; j < OSSL_NELEM(sesscache); j++) {
2642 SSL_SESSION_free(sesscache[j]);
2643 sesscache[j] = NULL;
2644 }
2645 SSL_CTX_free(sctx);
2646 SSL_CTX_free(cctx);
2647
2648 return testresult;
2649 }
2650
2651 static int test_stateless_tickets(int idx)
2652 {
2653 return test_tickets(0, idx);
2654 }
2655
2656 static int test_stateful_tickets(int idx)
2657 {
2658 return test_tickets(1, idx);
2659 }
2660
2661 static int test_psk_tickets(void)
2662 {
2663 SSL_CTX *sctx = NULL, *cctx = NULL;
2664 SSL *serverssl = NULL, *clientssl = NULL;
2665 int testresult = 0;
2666 int sess_id_ctx = 1;
2667
2668 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
2669 TLS_client_method(), TLS1_VERSION, 0,
2670 &sctx, &cctx, NULL, NULL))
2671 || !TEST_true(SSL_CTX_set_session_id_context(sctx,
2672 (void *)&sess_id_ctx,
2673 sizeof(sess_id_ctx))))
2674 goto end;
2675
2676 SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT
2677 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2678 SSL_CTX_set_psk_use_session_callback(cctx, use_session_cb);
2679 SSL_CTX_set_psk_find_session_callback(sctx, find_session_cb);
2680 SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
2681 use_session_cb_cnt = 0;
2682 find_session_cb_cnt = 0;
2683 srvid = pskid;
2684 new_called = 0;
2685
2686 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
2687 NULL, NULL)))
2688 goto end;
2689 clientpsk = serverpsk = create_a_psk(clientssl, SHA384_DIGEST_LENGTH);
2690 if (!TEST_ptr(clientpsk))
2691 goto end;
2692 SSL_SESSION_up_ref(clientpsk);
2693
2694 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2695 SSL_ERROR_NONE))
2696 || !TEST_int_eq(1, find_session_cb_cnt)
2697 || !TEST_int_eq(1, use_session_cb_cnt)
2698 /* We should always get 1 ticket when using external PSK */
2699 || !TEST_int_eq(1, new_called))
2700 goto end;
2701
2702 testresult = 1;
2703
2704 end:
2705 SSL_free(serverssl);
2706 SSL_free(clientssl);
2707 SSL_CTX_free(sctx);
2708 SSL_CTX_free(cctx);
2709 SSL_SESSION_free(clientpsk);
2710 SSL_SESSION_free(serverpsk);
2711 clientpsk = serverpsk = NULL;
2712
2713 return testresult;
2714 }
2715
2716 static int test_extra_tickets(int idx)
2717 {
2718 SSL_CTX *sctx = NULL, *cctx = NULL;
2719 SSL *serverssl = NULL, *clientssl = NULL;
2720 BIO *bretry = BIO_new(bio_s_always_retry());
2721 BIO *tmp = NULL;
2722 int testresult = 0;
2723 int stateful = 0;
2724 size_t nbytes;
2725 unsigned char c, buf[1];
2726
2727 new_called = 0;
2728 do_cache = 1;
2729
2730 if (idx >= 3) {
2731 idx -= 3;
2732 stateful = 1;
2733 }
2734
2735 if (!TEST_ptr(bretry) || !setup_ticket_test(stateful, idx, &sctx, &cctx))
2736 goto end;
2737 SSL_CTX_sess_set_new_cb(sctx, new_session_cb);
2738 /* setup_ticket_test() uses new_cachesession_cb which we don't need. */
2739 SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
2740
2741 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2742 &clientssl, NULL, NULL)))
2743 goto end;
2744
2745 /*
2746 * Note that we have new_session_cb on both sctx and cctx, so new_called is
2747 * incremented by both client and server.
2748 */
2749 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2750 SSL_ERROR_NONE))
2751 /* Check we got the number of tickets we were expecting */
2752 || !TEST_int_eq(idx * 2, new_called)
2753 || !TEST_true(SSL_new_session_ticket(serverssl))
2754 || !TEST_true(SSL_new_session_ticket(serverssl))
2755 || !TEST_int_eq(idx * 2, new_called))
2756 goto end;
2757
2758 /* Now try a (real) write to actually send the tickets */
2759 c = '1';
2760 if (!TEST_true(SSL_write_ex(serverssl, &c, 1, &nbytes))
2761 || !TEST_size_t_eq(1, nbytes)
2762 || !TEST_int_eq(idx * 2 + 2, new_called)
2763 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2764 || !TEST_int_eq(idx * 2 + 4, new_called)
2765 || !TEST_int_eq(sizeof(buf), nbytes)
2766 || !TEST_int_eq(c, buf[0])
2767 || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes)))
2768 goto end;
2769
2770 /* Try with only requesting one new ticket, too */
2771 c = '2';
2772 new_called = 0;
2773 if (!TEST_true(SSL_new_session_ticket(serverssl))
2774 || !TEST_true(SSL_write_ex(serverssl, &c, sizeof(c), &nbytes))
2775 || !TEST_size_t_eq(sizeof(c), nbytes)
2776 || !TEST_int_eq(1, new_called)
2777 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2778 || !TEST_int_eq(2, new_called)
2779 || !TEST_size_t_eq(sizeof(buf), nbytes)
2780 || !TEST_int_eq(c, buf[0]))
2781 goto end;
2782
2783 /* Do it again but use dummy writes to drive the ticket generation */
2784 c = '3';
2785 new_called = 0;
2786 if (!TEST_true(SSL_new_session_ticket(serverssl))
2787 || !TEST_true(SSL_new_session_ticket(serverssl))
2788 || !TEST_true(SSL_write_ex(serverssl, &c, 0, &nbytes))
2789 || !TEST_size_t_eq(0, nbytes)
2790 || !TEST_int_eq(2, new_called)
2791 || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2792 || !TEST_int_eq(4, new_called))
2793 goto end;
2794
2795 /* Once more, but with SSL_do_handshake() to drive the ticket generation */
2796 c = '4';
2797 new_called = 0;
2798 if (!TEST_true(SSL_new_session_ticket(serverssl))
2799 || !TEST_true(SSL_new_session_ticket(serverssl))
2800 || !TEST_true(SSL_do_handshake(serverssl))
2801 || !TEST_int_eq(2, new_called)
2802 || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2803 || !TEST_int_eq(4, new_called))
2804 goto end;
2805
2806 /*
2807 * Use the always-retry BIO to exercise the logic that forces ticket
2808 * generation to wait until a record boundary.
2809 */
2810 c = '5';
2811 new_called = 0;
2812 tmp = SSL_get_wbio(serverssl);
2813 if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
2814 tmp = NULL;
2815 goto end;
2816 }
2817 SSL_set0_wbio(serverssl, bretry);
2818 bretry = NULL;
2819 if (!TEST_false(SSL_write_ex(serverssl, &c, 1, &nbytes))
2820 || !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_WANT_WRITE)
2821 || !TEST_size_t_eq(nbytes, 0))
2822 goto end;
2823 /* Restore a BIO that will let the write succeed */
2824 SSL_set0_wbio(serverssl, tmp);
2825 tmp = NULL;
2826 /*
2827 * These calls should just queue the request and not send anything
2828 * even if we explicitly try to hit the state machine.
2829 */
2830 if (!TEST_true(SSL_new_session_ticket(serverssl))
2831 || !TEST_true(SSL_new_session_ticket(serverssl))
2832 || !TEST_int_eq(0, new_called)
2833 || !TEST_true(SSL_do_handshake(serverssl))
2834 || !TEST_int_eq(0, new_called))
2835 goto end;
2836 /* Re-do the write; still no tickets sent */
2837 if (!TEST_true(SSL_write_ex(serverssl, &c, 1, &nbytes))
2838 || !TEST_size_t_eq(1, nbytes)
2839 || !TEST_int_eq(0, new_called)
2840 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2841 || !TEST_int_eq(0, new_called)
2842 || !TEST_int_eq(sizeof(buf), nbytes)
2843 || !TEST_int_eq(c, buf[0])
2844 || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes)))
2845 goto end;
2846 /* Even trying to hit the state machine now will still not send tickets */
2847 if (!TEST_true(SSL_do_handshake(serverssl))
2848 || !TEST_int_eq(0, new_called))
2849 goto end;
2850 /* Now the *next* write should send the tickets */
2851 c = '6';
2852 if (!TEST_true(SSL_write_ex(serverssl, &c, 1, &nbytes))
2853 || !TEST_size_t_eq(1, nbytes)
2854 || !TEST_int_eq(2, new_called)
2855 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2856 || !TEST_int_eq(4, new_called)
2857 || !TEST_int_eq(sizeof(buf), nbytes)
2858 || !TEST_int_eq(c, buf[0])
2859 || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes)))
2860 goto end;
2861
2862 SSL_shutdown(clientssl);
2863 SSL_shutdown(serverssl);
2864 testresult = 1;
2865
2866 end:
2867 BIO_free(bretry);
2868 BIO_free(tmp);
2869 SSL_free(serverssl);
2870 SSL_free(clientssl);
2871 SSL_CTX_free(sctx);
2872 SSL_CTX_free(cctx);
2873 clientssl = serverssl = NULL;
2874 sctx = cctx = NULL;
2875 return testresult;
2876 }
2877 #endif
2878
2879 #define USE_NULL 0
2880 #define USE_BIO_1 1
2881 #define USE_BIO_2 2
2882 #define USE_DEFAULT 3
2883
2884 #define CONNTYPE_CONNECTION_SUCCESS 0
2885 #define CONNTYPE_CONNECTION_FAIL 1
2886 #define CONNTYPE_NO_CONNECTION 2
2887
2888 #define TOTAL_NO_CONN_SSL_SET_BIO_TESTS (3 * 3 * 3 * 3)
2889 #define TOTAL_CONN_SUCCESS_SSL_SET_BIO_TESTS (2 * 2)
2890 #if !defined(OSSL_NO_USABLE_TLS1_3) && !defined(OPENSSL_NO_TLS1_2)
2891 # define TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS (2 * 2)
2892 #else
2893 # define TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS 0
2894 #endif
2895
2896 #define TOTAL_SSL_SET_BIO_TESTS TOTAL_NO_CONN_SSL_SET_BIO_TESTS \
2897 + TOTAL_CONN_SUCCESS_SSL_SET_BIO_TESTS \
2898 + TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS
2899
2900 static void setupbio(BIO **res, BIO *bio1, BIO *bio2, int type)
2901 {
2902 switch (type) {
2903 case USE_NULL:
2904 *res = NULL;
2905 break;
2906 case USE_BIO_1:
2907 *res = bio1;
2908 break;
2909 case USE_BIO_2:
2910 *res = bio2;
2911 break;
2912 }
2913 }
2914
2915
2916 /*
2917 * Tests calls to SSL_set_bio() under various conditions.
2918 *
2919 * For the first 3 * 3 * 3 * 3 = 81 tests we do 2 calls to SSL_set_bio() with
2920 * various combinations of valid BIOs or NULL being set for the rbio/wbio. We
2921 * then do more tests where we create a successful connection first using our
2922 * standard connection setup functions, and then call SSL_set_bio() with
2923 * various combinations of valid BIOs or NULL. We then repeat these tests
2924 * following a failed connection. In this last case we are looking to check that
2925 * SSL_set_bio() functions correctly in the case where s->bbio is not NULL.
2926 */
2927 static int test_ssl_set_bio(int idx)
2928 {
2929 SSL_CTX *sctx = NULL, *cctx = NULL;
2930 BIO *bio1 = NULL;
2931 BIO *bio2 = NULL;
2932 BIO *irbio = NULL, *iwbio = NULL, *nrbio = NULL, *nwbio = NULL;
2933 SSL *serverssl = NULL, *clientssl = NULL;
2934 int initrbio, initwbio, newrbio, newwbio, conntype;
2935 int testresult = 0;
2936
2937 if (idx < TOTAL_NO_CONN_SSL_SET_BIO_TESTS) {
2938 initrbio = idx % 3;
2939 idx /= 3;
2940 initwbio = idx % 3;
2941 idx /= 3;
2942 newrbio = idx % 3;
2943 idx /= 3;
2944 newwbio = idx % 3;
2945 conntype = CONNTYPE_NO_CONNECTION;
2946 } else {
2947 idx -= TOTAL_NO_CONN_SSL_SET_BIO_TESTS;
2948 initrbio = initwbio = USE_DEFAULT;
2949 newrbio = idx % 2;
2950 idx /= 2;
2951 newwbio = idx % 2;
2952 idx /= 2;
2953 conntype = idx % 2;
2954 }
2955
2956 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
2957 TLS_client_method(), TLS1_VERSION, 0,
2958 &sctx, &cctx, cert, privkey)))
2959 goto end;
2960
2961 if (conntype == CONNTYPE_CONNECTION_FAIL) {
2962 /*
2963 * We won't ever get here if either TLSv1.3 or TLSv1.2 is disabled
2964 * because we reduced the number of tests in the definition of
2965 * TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS to avoid this scenario. By setting
2966 * mismatched protocol versions we will force a connection failure.
2967 */
2968 SSL_CTX_set_min_proto_version(sctx, TLS1_3_VERSION);
2969 SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
2970 }
2971
2972 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
2973 NULL, NULL)))
2974 goto end;
2975
2976 if (initrbio == USE_BIO_1
2977 || initwbio == USE_BIO_1
2978 || newrbio == USE_BIO_1
2979 || newwbio == USE_BIO_1) {
2980 if (!TEST_ptr(bio1 = BIO_new(BIO_s_mem())))
2981 goto end;
2982 }
2983
2984 if (initrbio == USE_BIO_2
2985 || initwbio == USE_BIO_2
2986 || newrbio == USE_BIO_2
2987 || newwbio == USE_BIO_2) {
2988 if (!TEST_ptr(bio2 = BIO_new(BIO_s_mem())))
2989 goto end;
2990 }
2991
2992 if (initrbio != USE_DEFAULT) {
2993 setupbio(&irbio, bio1, bio2, initrbio);
2994 setupbio(&iwbio, bio1, bio2, initwbio);
2995 SSL_set_bio(clientssl, irbio, iwbio);
2996
2997 /*
2998 * We want to maintain our own refs to these BIO, so do an up ref for
2999 * each BIO that will have ownership transferred in the SSL_set_bio()
3000 * call
3001 */
3002 if (irbio != NULL)
3003 BIO_up_ref(irbio);
3004 if (iwbio != NULL && iwbio != irbio)
3005 BIO_up_ref(iwbio);
3006 }
3007
3008 if (conntype != CONNTYPE_NO_CONNECTION
3009 && !TEST_true(create_ssl_connection(serverssl, clientssl,
3010 SSL_ERROR_NONE)
3011 == (conntype == CONNTYPE_CONNECTION_SUCCESS)))
3012 goto end;
3013
3014 setupbio(&nrbio, bio1, bio2, newrbio);
3015 setupbio(&nwbio, bio1, bio2, newwbio);
3016
3017 /*
3018 * We will (maybe) transfer ownership again so do more up refs.
3019 * SSL_set_bio() has some really complicated ownership rules where BIOs have
3020 * already been set!
3021 */
3022 if (nrbio != NULL
3023 && nrbio != irbio
3024 && (nwbio != iwbio || nrbio != nwbio))
3025 BIO_up_ref(nrbio);
3026 if (nwbio != NULL
3027 && nwbio != nrbio
3028 && (nwbio != iwbio || (nwbio == iwbio && irbio == iwbio)))
3029 BIO_up_ref(nwbio);
3030
3031 SSL_set_bio(clientssl, nrbio, nwbio);
3032
3033 testresult = 1;
3034
3035 end:
3036 BIO_free(bio1);
3037 BIO_free(bio2);
3038
3039 /*
3040 * This test is checking that the ref counting for SSL_set_bio is correct.
3041 * If we get here and we did too many frees then we will fail in the above
3042 * functions.
3043 */
3044 SSL_free(serverssl);
3045 SSL_free(clientssl);
3046 SSL_CTX_free(sctx);
3047 SSL_CTX_free(cctx);
3048 return testresult;
3049 }
3050
3051 typedef enum { NO_BIO_CHANGE, CHANGE_RBIO, CHANGE_WBIO } bio_change_t;
3052
3053 static int execute_test_ssl_bio(int pop_ssl, bio_change_t change_bio)
3054 {
3055 BIO *sslbio = NULL, *membio1 = NULL, *membio2 = NULL;
3056 SSL_CTX *ctx;
3057 SSL *ssl = NULL;
3058 int testresult = 0;
3059
3060 if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_method()))
3061 || !TEST_ptr(ssl = SSL_new(ctx))
3062 || !TEST_ptr(sslbio = BIO_new(BIO_f_ssl()))
3063 || !TEST_ptr(membio1 = BIO_new(BIO_s_mem())))
3064 goto end;
3065
3066 BIO_set_ssl(sslbio, ssl, BIO_CLOSE);
3067
3068 /*
3069 * If anything goes wrong here then we could leak memory.
3070 */
3071 BIO_push(sslbio, membio1);
3072
3073 /* Verify changing the rbio/wbio directly does not cause leaks */
3074 if (change_bio != NO_BIO_CHANGE) {
3075 if (!TEST_ptr(membio2 = BIO_new(BIO_s_mem()))) {
3076 ssl = NULL;
3077 goto end;
3078 }
3079 if (change_bio == CHANGE_RBIO)
3080 SSL_set0_rbio(ssl, membio2);
3081 else
3082 SSL_set0_wbio(ssl, membio2);
3083 }
3084 ssl = NULL;
3085
3086 if (pop_ssl)
3087 BIO_pop(sslbio);
3088 else
3089 BIO_pop(membio1);
3090
3091 testresult = 1;
3092 end:
3093 BIO_free(membio1);
3094 BIO_free(sslbio);
3095 SSL_free(ssl);
3096 SSL_CTX_free(ctx);
3097
3098 return testresult;
3099 }
3100
3101 static int test_ssl_bio_pop_next_bio(void)
3102 {
3103 return execute_test_ssl_bio(0, NO_BIO_CHANGE);
3104 }
3105
3106 static int test_ssl_bio_pop_ssl_bio(void)
3107 {
3108 return execute_test_ssl_bio(1, NO_BIO_CHANGE);
3109 }
3110
3111 static int test_ssl_bio_change_rbio(void)
3112 {
3113 return execute_test_ssl_bio(0, CHANGE_RBIO);
3114 }
3115
3116 static int test_ssl_bio_change_wbio(void)
3117 {
3118 return execute_test_ssl_bio(0, CHANGE_WBIO);
3119 }
3120
3121 #if !defined(OPENSSL_NO_TLS1_2) || defined(OSSL_NO_USABLE_TLS1_3)
3122 typedef struct {
3123 /* The list of sig algs */
3124 const int *list;
3125 /* The length of the list */
3126 size_t listlen;
3127 /* A sigalgs list in string format */
3128 const char *liststr;
3129 /* Whether setting the list should succeed */
3130 int valid;
3131 /* Whether creating a connection with the list should succeed */
3132 int connsuccess;
3133 } sigalgs_list;
3134
3135 static const int validlist1[] = {NID_sha256, EVP_PKEY_RSA};
3136 # ifndef OPENSSL_NO_EC
3137 static const int validlist2[] = {NID_sha256, EVP_PKEY_RSA, NID_sha512, EVP_PKEY_EC};
3138 static const int validlist3[] = {NID_sha512, EVP_PKEY_EC};
3139 # endif
3140 static const int invalidlist1[] = {NID_undef, EVP_PKEY_RSA};
3141 static const int invalidlist2[] = {NID_sha256, NID_undef};
3142 static const int invalidlist3[] = {NID_sha256, EVP_PKEY_RSA, NID_sha256};
3143 static const int invalidlist4[] = {NID_sha256};
3144 static const sigalgs_list testsigalgs[] = {
3145 {validlist1, OSSL_NELEM(validlist1), NULL, 1, 1},
3146 # ifndef OPENSSL_NO_EC
3147 {validlist2, OSSL_NELEM(validlist2), NULL, 1, 1},
3148 {validlist3, OSSL_NELEM(validlist3), NULL, 1, 0},
3149 # endif
3150 {NULL, 0, "RSA+SHA256", 1, 1},
3151 {NULL, 0, "RSA+SHA256:?Invalid", 1, 1},
3152 # ifndef OPENSSL_NO_EC
3153 {NULL, 0, "RSA+SHA256:ECDSA+SHA512", 1, 1},
3154 {NULL, 0, "ECDSA+SHA512", 1, 0},
3155 # endif
3156 {invalidlist1, OSSL_NELEM(invalidlist1), NULL, 0, 0},
3157 {invalidlist2, OSSL_NELEM(invalidlist2), NULL, 0, 0},
3158 {invalidlist3, OSSL_NELEM(invalidlist3), NULL, 0, 0},
3159 {invalidlist4, OSSL_NELEM(invalidlist4), NULL, 0, 0},
3160 {NULL, 0, "RSA", 0, 0},
3161 {NULL, 0, "SHA256", 0, 0},
3162 {NULL, 0, "RSA+SHA256:SHA256", 0, 0},
3163 {NULL, 0, "Invalid", 0, 0}
3164 };
3165
3166 static int test_set_sigalgs(int idx)
3167 {
3168 SSL_CTX *cctx = NULL, *sctx = NULL;
3169 SSL *clientssl = NULL, *serverssl = NULL;
3170 int testresult = 0;
3171 const sigalgs_list *curr;
3172 int testctx;
3173
3174 /* Should never happen */
3175 if (!TEST_size_t_le((size_t)idx, OSSL_NELEM(testsigalgs) * 2))
3176 return 0;
3177
3178 testctx = ((size_t)idx < OSSL_NELEM(testsigalgs));
3179 curr = testctx ? &testsigalgs[idx]
3180 : &testsigalgs[idx - OSSL_NELEM(testsigalgs)];
3181
3182 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3183 TLS_client_method(), TLS1_VERSION, 0,
3184 &sctx, &cctx, cert, privkey)))
3185 return 0;
3186
3187 SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
3188
3189 if (testctx) {
3190 int ret;
3191
3192 if (curr->list != NULL)
3193 ret = SSL_CTX_set1_sigalgs(cctx, curr->list, curr->listlen);
3194 else
3195 ret = SSL_CTX_set1_sigalgs_list(cctx, curr->liststr);
3196
3197 if (!ret) {
3198 if (curr->valid)
3199 TEST_info("Failure setting sigalgs in SSL_CTX (%d)\n", idx);
3200 else
3201 testresult = 1;
3202 goto end;
3203 }
3204 if (!curr->valid) {
3205 TEST_info("Not-failed setting sigalgs in SSL_CTX (%d)\n", idx);
3206 goto end;
3207 }
3208 }
3209
3210 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3211 &clientssl, NULL, NULL)))
3212 goto end;
3213
3214 if (!testctx) {
3215 int ret;
3216
3217 if (curr->list != NULL)
3218 ret = SSL_set1_sigalgs(clientssl, curr->list, curr->listlen);
3219 else
3220 ret = SSL_set1_sigalgs_list(clientssl, curr->liststr);
3221 if (!ret) {
3222 if (curr->valid)
3223 TEST_info("Failure setting sigalgs in SSL (%d)\n", idx);
3224 else
3225 testresult = 1;
3226 goto end;
3227 }
3228 if (!curr->valid)
3229 goto end;
3230 }
3231
3232 if (!TEST_int_eq(create_ssl_connection(serverssl, clientssl,
3233 SSL_ERROR_NONE),
3234 curr->connsuccess))
3235 goto end;
3236
3237 testresult = 1;
3238
3239 end:
3240 SSL_free(serverssl);
3241 SSL_free(clientssl);
3242 SSL_CTX_free(sctx);
3243 SSL_CTX_free(cctx);
3244
3245 return testresult;
3246 }
3247 #endif
3248
3249 #ifndef OSSL_NO_USABLE_TLS1_3
3250 static int psk_client_cb_cnt = 0;
3251 static int psk_server_cb_cnt = 0;
3252
3253 static int use_session_cb(SSL *ssl, const EVP_MD *md, const unsigned char **id,
3254 size_t *idlen, SSL_SESSION **sess)
3255 {
3256 switch (++use_session_cb_cnt) {
3257 case 1:
3258 /* The first call should always have a NULL md */
3259 if (md != NULL)
3260 return 0;
3261 break;
3262
3263 case 2:
3264 /* The second call should always have an md */
3265 if (md == NULL)
3266 return 0;
3267 break;
3268
3269 default:
3270 /* We should only be called a maximum of twice */
3271 return 0;
3272 }
3273
3274 if (clientpsk != NULL)
3275 SSL_SESSION_up_ref(clientpsk);
3276
3277 *sess = clientpsk;
3278 *id = (const unsigned char *)pskid;
3279 *idlen = strlen(pskid);
3280
3281 return 1;
3282 }
3283
3284 #ifndef OPENSSL_NO_PSK
3285 static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *id,
3286 unsigned int max_id_len,
3287 unsigned char *psk,
3288 unsigned int max_psk_len)
3289 {
3290 unsigned int psklen = 0;
3291
3292 psk_client_cb_cnt++;
3293
3294 if (strlen(pskid) + 1 > max_id_len)
3295 return 0;
3296
3297 /* We should only ever be called a maximum of twice per connection */
3298 if (psk_client_cb_cnt > 2)
3299 return 0;
3300
3301 if (clientpsk == NULL)
3302 return 0;
3303
3304 /* We'll reuse the PSK we set up for TLSv1.3 */
3305 if (SSL_SESSION_get_master_key(clientpsk, NULL, 0) > max_psk_len)
3306 return 0;
3307 psklen = SSL_SESSION_get_master_key(clientpsk, psk, max_psk_len);
3308 strncpy(id, pskid, max_id_len);
3309
3310 return psklen;
3311 }
3312 #endif /* OPENSSL_NO_PSK */
3313
3314 static int find_session_cb(SSL *ssl, const unsigned char *identity,
3315 size_t identity_len, SSL_SESSION **sess)
3316 {
3317 find_session_cb_cnt++;
3318
3319 /* We should only ever be called a maximum of twice per connection */
3320 if (find_session_cb_cnt > 2)
3321 return 0;
3322
3323 if (serverpsk == NULL)
3324 return 0;
3325
3326 /* Identity should match that set by the client */
3327 if (strlen(srvid) != identity_len
3328 || strncmp(srvid, (const char *)identity, identity_len) != 0) {
3329 /* No PSK found, continue but without a PSK */
3330 *sess = NULL;
3331 return 1;
3332 }
3333
3334 SSL_SESSION_up_ref(serverpsk);
3335 *sess = serverpsk;
3336
3337 return 1;
3338 }
3339
3340 #ifndef OPENSSL_NO_PSK
3341 static unsigned int psk_server_cb(SSL *ssl, const char *identity,
3342 unsigned char *psk, unsigned int max_psk_len)
3343 {
3344 unsigned int psklen = 0;
3345
3346 psk_server_cb_cnt++;
3347
3348 /* We should only ever be called a maximum of twice per connection */
3349 if (find_session_cb_cnt > 2)
3350 return 0;
3351
3352 if (serverpsk == NULL)
3353 return 0;
3354
3355 /* Identity should match that set by the client */
3356 if (strcmp(srvid, identity) != 0) {
3357 return 0;
3358 }
3359
3360 /* We'll reuse the PSK we set up for TLSv1.3 */
3361 if (SSL_SESSION_get_master_key(serverpsk, NULL, 0) > max_psk_len)
3362 return 0;
3363 psklen = SSL_SESSION_get_master_key(serverpsk, psk, max_psk_len);
3364
3365 return psklen;
3366 }
3367 #endif /* OPENSSL_NO_PSK */
3368
3369 #define MSG1 "Hello"
3370 #define MSG2 "World."
3371 #define MSG3 "This"
3372 #define MSG4 "is"
3373 #define MSG5 "a"
3374 #define MSG6 "test"
3375 #define MSG7 "message."
3376
3377 static int artificial_ticket_time = 0;
3378
3379 static int ed_gen_cb(SSL *s, void *arg)
3380 {
3381 SSL_SESSION *sess = SSL_get0_session(s);
3382
3383 if (sess == NULL)
3384 return 0;
3385
3386 /*
3387 * Artificially give the ticket some age. Just do it for the number of
3388 * tickets we've been told to do.
3389 */
3390 if (artificial_ticket_time == 0)
3391 return 1;
3392 artificial_ticket_time--;
3393
3394 if (SSL_SESSION_set_time_ex(sess, SSL_SESSION_get_time_ex(sess) - 10) == 0)
3395 return 0;
3396
3397 return 1;
3398 }
3399
3400 /*
3401 * Helper method to setup objects for early data test. Caller frees objects on
3402 * error.
3403 */
3404 static int setupearly_data_test(SSL_CTX **cctx, SSL_CTX **sctx, SSL **clientssl,
3405 SSL **serverssl, SSL_SESSION **sess, int idx,
3406 size_t mdsize)
3407 {
3408 int artificial = (artificial_ticket_time > 0);
3409
3410 if (*sctx == NULL
3411 && !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3412 TLS_client_method(),
3413 TLS1_VERSION, 0,
3414 sctx, cctx, cert, privkey)))
3415 return 0;
3416
3417 if (artificial)
3418 SSL_CTX_set_session_ticket_cb(*sctx, ed_gen_cb, NULL, NULL);
3419
3420 if (!TEST_true(SSL_CTX_set_max_early_data(*sctx, SSL3_RT_MAX_PLAIN_LENGTH)))
3421 return 0;
3422
3423 if (idx == 1) {
3424 /* When idx == 1 we repeat the tests with read_ahead set */
3425 SSL_CTX_set_read_ahead(*cctx, 1);
3426 SSL_CTX_set_read_ahead(*sctx, 1);
3427 } else if (idx == 2) {
3428 /* When idx == 2 we are doing early_data with a PSK. Set up callbacks */
3429 SSL_CTX_set_psk_use_session_callback(*cctx, use_session_cb);
3430 SSL_CTX_set_psk_find_session_callback(*sctx, find_session_cb);
3431 use_session_cb_cnt = 0;
3432 find_session_cb_cnt = 0;
3433 srvid = pskid;
3434 }
3435
3436 if (!TEST_true(create_ssl_objects(*sctx, *cctx, serverssl, clientssl,
3437 NULL, NULL)))
3438 return 0;
3439
3440 /*
3441 * For one of the run throughs (doesn't matter which one), we'll try sending
3442 * some SNI data in the initial ClientHello. This will be ignored (because
3443 * there is no SNI cb set up by the server), so it should not impact
3444 * early_data.
3445 */
3446 if (idx == 1
3447 && !TEST_true(SSL_set_tlsext_host_name(*clientssl, "localhost")))
3448 return 0;
3449
3450 if (idx == 2) {
3451 clientpsk = create_a_psk(*clientssl, mdsize);
3452 if (!TEST_ptr(clientpsk)
3453 /*
3454 * We just choose an arbitrary value for max_early_data which
3455 * should be big enough for testing purposes.
3456 */
3457 || !TEST_true(SSL_SESSION_set_max_early_data(clientpsk,
3458 0x100))
3459 || !TEST_true(SSL_SESSION_up_ref(clientpsk))) {
3460 SSL_SESSION_free(clientpsk);
3461 clientpsk = NULL;
3462 return 0;
3463 }
3464 serverpsk = clientpsk;
3465
3466 if (sess != NULL) {
3467 if (!TEST_true(SSL_SESSION_up_ref(clientpsk))) {
3468 SSL_SESSION_free(clientpsk);
3469 SSL_SESSION_free(serverpsk);
3470 clientpsk = serverpsk = NULL;
3471 return 0;
3472 }
3473 *sess = clientpsk;
3474 }
3475 return 1;
3476 }
3477
3478 if (sess == NULL)
3479 return 1;
3480
3481 if (!TEST_true(create_ssl_connection(*serverssl, *clientssl,
3482 SSL_ERROR_NONE)))
3483 return 0;
3484
3485 *sess = SSL_get1_session(*clientssl);
3486 SSL_shutdown(*clientssl);
3487 SSL_shutdown(*serverssl);
3488 SSL_free(*serverssl);
3489 SSL_free(*clientssl);
3490 *serverssl = *clientssl = NULL;
3491
3492 /*
3493 * Artificially give the ticket some age to match the artificial age we
3494 * gave it on the server side
3495 */
3496 if (artificial
3497 && !TEST_time_t_gt(SSL_SESSION_set_time_ex(*sess,
3498 SSL_SESSION_get_time_ex(*sess) - 10), 0))
3499 return 0;
3500
3501 if (!TEST_true(create_ssl_objects(*sctx, *cctx, serverssl,
3502 clientssl, NULL, NULL))
3503 || !TEST_true(SSL_set_session(*clientssl, *sess)))
3504 return 0;
3505
3506 return 1;
3507 }
3508
3509 static int test_early_data_read_write(int idx)
3510 {
3511 SSL_CTX *cctx = NULL, *sctx = NULL;
3512 SSL *clientssl = NULL, *serverssl = NULL;
3513 int testresult = 0;
3514 SSL_SESSION *sess = NULL;
3515 unsigned char buf[20], data[1024];
3516 size_t readbytes, written, eoedlen, rawread, rawwritten;
3517 BIO *rbio;
3518
3519 /* Artificially give the next 2 tickets some age for non PSK sessions */
3520 if (idx != 2)
3521 artificial_ticket_time = 2;
3522 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3523 &serverssl, &sess, idx,
3524 SHA384_DIGEST_LENGTH))) {
3525 artificial_ticket_time = 0;
3526 goto end;
3527 }
3528 artificial_ticket_time = 0;
3529
3530 /* Write and read some early data */
3531 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3532 &written))
3533 || !TEST_size_t_eq(written, strlen(MSG1))
3534 || !TEST_int_eq(SSL_read_early_data(serverssl, buf,
3535 sizeof(buf), &readbytes),
3536 SSL_READ_EARLY_DATA_SUCCESS)
3537 || !TEST_mem_eq(MSG1, readbytes, buf, strlen(MSG1))
3538 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3539 SSL_EARLY_DATA_ACCEPTED))
3540 goto end;
3541
3542 /*
3543 * Server should be able to write data, and client should be able to
3544 * read it.
3545 */
3546 if (!TEST_true(SSL_write_early_data(serverssl, MSG2, strlen(MSG2),
3547 &written))
3548 || !TEST_size_t_eq(written, strlen(MSG2))
3549 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3550 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
3551 goto end;
3552
3553 /* Even after reading normal data, client should be able write early data */
3554 if (!TEST_true(SSL_write_early_data(clientssl, MSG3, strlen(MSG3),
3555 &written))
3556 || !TEST_size_t_eq(written, strlen(MSG3)))
3557 goto end;
3558
3559 /* Server should still be able read early data after writing data */
3560 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3561 &readbytes),
3562 SSL_READ_EARLY_DATA_SUCCESS)
3563 || !TEST_mem_eq(buf, readbytes, MSG3, strlen(MSG3)))
3564 goto end;
3565
3566 /* Write more data from server and read it from client */
3567 if (!TEST_true(SSL_write_early_data(serverssl, MSG4, strlen(MSG4),
3568 &written))
3569 || !TEST_size_t_eq(written, strlen(MSG4))
3570 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3571 || !TEST_mem_eq(buf, readbytes, MSG4, strlen(MSG4)))
3572 goto end;
3573
3574 /*
3575 * If client writes normal data it should mean writing early data is no
3576 * longer possible.
3577 */
3578 if (!TEST_true(SSL_write_ex(clientssl, MSG5, strlen(MSG5), &written))
3579 || !TEST_size_t_eq(written, strlen(MSG5))
3580 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
3581 SSL_EARLY_DATA_ACCEPTED))
3582 goto end;
3583
3584 /*
3585 * At this point the client has written EndOfEarlyData, ClientFinished and
3586 * normal (fully protected) data. We are going to cause a delay between the
3587 * arrival of EndOfEarlyData and ClientFinished. We read out all the data
3588 * in the read BIO, and then just put back the EndOfEarlyData message.
3589 */
3590 rbio = SSL_get_rbio(serverssl);
3591 if (!TEST_true(BIO_read_ex(rbio, data, sizeof(data), &rawread))
3592 || !TEST_size_t_lt(rawread, sizeof(data))
3593 || !TEST_size_t_gt(rawread, SSL3_RT_HEADER_LENGTH))
3594 goto end;
3595
3596 /* Record length is in the 4th and 5th bytes of the record header */
3597 eoedlen = SSL3_RT_HEADER_LENGTH + (data[3] << 8 | data[4]);
3598 if (!TEST_true(BIO_write_ex(rbio, data, eoedlen, &rawwritten))
3599 || !TEST_size_t_eq(rawwritten, eoedlen))
3600 goto end;
3601
3602 /* Server should be told that there is no more early data */
3603 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3604 &readbytes),
3605 SSL_READ_EARLY_DATA_FINISH)
3606 || !TEST_size_t_eq(readbytes, 0))
3607 goto end;
3608
3609 /*
3610 * Server has not finished init yet, so should still be able to write early
3611 * data.
3612 */
3613 if (!TEST_true(SSL_write_early_data(serverssl, MSG6, strlen(MSG6),
3614 &written))
3615 || !TEST_size_t_eq(written, strlen(MSG6)))
3616 goto end;
3617
3618 /* Push the ClientFinished and the normal data back into the server rbio */
3619 if (!TEST_true(BIO_write_ex(rbio, data + eoedlen, rawread - eoedlen,
3620 &rawwritten))
3621 || !TEST_size_t_eq(rawwritten, rawread - eoedlen))
3622 goto end;
3623
3624 /* Server should be able to read normal data */
3625 if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3626 || !TEST_size_t_eq(readbytes, strlen(MSG5)))
3627 goto end;
3628
3629 /* Client and server should not be able to write/read early data now */
3630 if (!TEST_false(SSL_write_early_data(clientssl, MSG6, strlen(MSG6),
3631 &written)))
3632 goto end;
3633 ERR_clear_error();
3634 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3635 &readbytes),
3636 SSL_READ_EARLY_DATA_ERROR))
3637 goto end;
3638 ERR_clear_error();
3639
3640 /* Client should be able to read the data sent by the server */
3641 if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3642 || !TEST_mem_eq(buf, readbytes, MSG6, strlen(MSG6)))
3643 goto end;
3644
3645 /*
3646 * Make sure we process the two NewSessionTickets. These arrive
3647 * post-handshake. We attempt reads which we do not expect to return any
3648 * data.
3649 */
3650 if (!TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3651 || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf),
3652 &readbytes)))
3653 goto end;
3654
3655 /* Server should be able to write normal data */
3656 if (!TEST_true(SSL_write_ex(serverssl, MSG7, strlen(MSG7), &written))
3657 || !TEST_size_t_eq(written, strlen(MSG7))
3658 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3659 || !TEST_mem_eq(buf, readbytes, MSG7, strlen(MSG7)))
3660 goto end;
3661
3662 SSL_SESSION_free(sess);
3663 sess = SSL_get1_session(clientssl);
3664 use_session_cb_cnt = 0;
3665 find_session_cb_cnt = 0;
3666
3667 SSL_shutdown(clientssl);
3668 SSL_shutdown(serverssl);
3669 SSL_free(serverssl);
3670 SSL_free(clientssl);
3671 serverssl = clientssl = NULL;
3672 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3673 &clientssl, NULL, NULL))
3674 || !TEST_true(SSL_set_session(clientssl, sess)))
3675 goto end;
3676
3677 /* Write and read some early data */
3678 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3679 &written))
3680 || !TEST_size_t_eq(written, strlen(MSG1))
3681 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3682 &readbytes),
3683 SSL_READ_EARLY_DATA_SUCCESS)
3684 || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1)))
3685 goto end;
3686
3687 if (!TEST_int_gt(SSL_connect(clientssl), 0)
3688 || !TEST_int_gt(SSL_accept(serverssl), 0))
3689 goto end;
3690
3691 /* Client and server should not be able to write/read early data now */
3692 if (!TEST_false(SSL_write_early_data(clientssl, MSG6, strlen(MSG6),
3693 &written)))
3694 goto end;
3695 ERR_clear_error();
3696 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3697 &readbytes),
3698 SSL_READ_EARLY_DATA_ERROR))
3699 goto end;
3700 ERR_clear_error();
3701
3702 /* Client and server should be able to write/read normal data */
3703 if (!TEST_true(SSL_write_ex(clientssl, MSG5, strlen(MSG5), &written))
3704 || !TEST_size_t_eq(written, strlen(MSG5))
3705 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3706 || !TEST_size_t_eq(readbytes, strlen(MSG5)))
3707 goto end;
3708
3709 testresult = 1;
3710
3711 end:
3712 SSL_SESSION_free(sess);
3713 SSL_SESSION_free(clientpsk);
3714 SSL_SESSION_free(serverpsk);
3715 clientpsk = serverpsk = NULL;
3716 SSL_free(serverssl);
3717 SSL_free(clientssl);
3718 SSL_CTX_free(sctx);
3719 SSL_CTX_free(cctx);
3720 return testresult;
3721 }
3722
3723 static int allow_ed_cb_called = 0;
3724
3725 static int allow_early_data_cb(SSL *s, void *arg)
3726 {
3727 int *usecb = (int *)arg;
3728
3729 allow_ed_cb_called++;
3730
3731 if (*usecb == 1)
3732 return 0;
3733
3734 return 1;
3735 }
3736
3737 /*
3738 * idx == 0: Standard early_data setup
3739 * idx == 1: early_data setup using read_ahead
3740 * usecb == 0: Don't use a custom early data callback
3741 * usecb == 1: Use a custom early data callback and reject the early data
3742 * usecb == 2: Use a custom early data callback and accept the early data
3743 * confopt == 0: Configure anti-replay directly
3744 * confopt == 1: Configure anti-replay using SSL_CONF
3745 */
3746 static int test_early_data_replay_int(int idx, int usecb, int confopt)
3747 {
3748 SSL_CTX *cctx = NULL, *sctx = NULL;
3749 SSL *clientssl = NULL, *serverssl = NULL;
3750 int testresult = 0;
3751 SSL_SESSION *sess = NULL;
3752 size_t readbytes, written;
3753 unsigned char buf[20];
3754
3755 allow_ed_cb_called = 0;
3756
3757 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3758 TLS_client_method(), TLS1_VERSION, 0,
3759 &sctx, &cctx, cert, privkey)))
3760 return 0;
3761
3762 if (usecb > 0) {
3763 if (confopt == 0) {
3764 SSL_CTX_set_options(sctx, SSL_OP_NO_ANTI_REPLAY);
3765 } else {
3766 SSL_CONF_CTX *confctx = SSL_CONF_CTX_new();
3767
3768 if (!TEST_ptr(confctx))
3769 goto end;
3770 SSL_CONF_CTX_set_flags(confctx, SSL_CONF_FLAG_FILE
3771 | SSL_CONF_FLAG_SERVER);
3772 SSL_CONF_CTX_set_ssl_ctx(confctx, sctx);
3773 if (!TEST_int_eq(SSL_CONF_cmd(confctx, "Options", "-AntiReplay"),
3774 2)) {
3775 SSL_CONF_CTX_free(confctx);
3776 goto end;
3777 }
3778 SSL_CONF_CTX_free(confctx);
3779 }
3780 SSL_CTX_set_allow_early_data_cb(sctx, allow_early_data_cb, &usecb);
3781 }
3782
3783 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3784 &serverssl, &sess, idx,
3785 SHA384_DIGEST_LENGTH)))
3786 goto end;
3787
3788 /*
3789 * The server is configured to accept early data. Create a connection to
3790 * "use up" the ticket
3791 */
3792 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
3793 || !TEST_true(SSL_session_reused(clientssl)))
3794 goto end;
3795
3796 SSL_shutdown(clientssl);
3797 SSL_shutdown(serverssl);
3798 SSL_free(serverssl);
3799 SSL_free(clientssl);
3800 serverssl = clientssl = NULL;
3801
3802 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3803 &clientssl, NULL, NULL))
3804 || !TEST_true(SSL_set_session(clientssl, sess)))
3805 goto end;
3806
3807 /* Write and read some early data */
3808 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3809 &written))
3810 || !TEST_size_t_eq(written, strlen(MSG1)))
3811 goto end;
3812
3813 if (usecb <= 1) {
3814 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3815 &readbytes),
3816 SSL_READ_EARLY_DATA_FINISH)
3817 /*
3818 * The ticket was reused, so the we should have rejected the
3819 * early data
3820 */
3821 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3822 SSL_EARLY_DATA_REJECTED))
3823 goto end;
3824 } else {
3825 /* In this case the callback decides to accept the early data */
3826 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3827 &readbytes),
3828 SSL_READ_EARLY_DATA_SUCCESS)
3829 || !TEST_mem_eq(MSG1, strlen(MSG1), buf, readbytes)
3830 /*
3831 * Server will have sent its flight so client can now send
3832 * end of early data and complete its half of the handshake
3833 */
3834 || !TEST_int_gt(SSL_connect(clientssl), 0)
3835 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3836 &readbytes),
3837 SSL_READ_EARLY_DATA_FINISH)
3838 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3839 SSL_EARLY_DATA_ACCEPTED))
3840 goto end;
3841 }
3842
3843 /* Complete the connection */
3844 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
3845 || !TEST_int_eq(SSL_session_reused(clientssl), (usecb > 0) ? 1 : 0)
3846 || !TEST_int_eq(allow_ed_cb_called, usecb > 0 ? 1 : 0))
3847 goto end;
3848
3849 testresult = 1;
3850
3851 end:
3852 SSL_SESSION_free(sess);
3853 SSL_SESSION_free(clientpsk);
3854 SSL_SESSION_free(serverpsk);
3855 clientpsk = serverpsk = NULL;
3856 SSL_free(serverssl);
3857 SSL_free(clientssl);
3858 SSL_CTX_free(sctx);
3859 SSL_CTX_free(cctx);
3860 return testresult;
3861 }
3862
3863 static int test_early_data_replay(int idx)
3864 {
3865 int ret = 1, usecb, confopt;
3866
3867 for (usecb = 0; usecb < 3; usecb++) {
3868 for (confopt = 0; confopt < 2; confopt++)
3869 ret &= test_early_data_replay_int(idx, usecb, confopt);
3870 }
3871
3872 return ret;
3873 }
3874
3875 static const char *ciphersuites[] = {
3876 "TLS_AES_128_CCM_8_SHA256",
3877 "TLS_AES_128_GCM_SHA256",
3878 "TLS_AES_256_GCM_SHA384",
3879 "TLS_AES_128_CCM_SHA256",
3880 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
3881 "TLS_CHACHA20_POLY1305_SHA256"
3882 #endif
3883 };
3884
3885 /*
3886 * Helper function to test that a server attempting to read early data can
3887 * handle a connection from a client where the early data should be skipped.
3888 * testtype: 0 == No HRR
3889 * testtype: 1 == HRR
3890 * testtype: 2 == HRR, invalid early_data sent after HRR
3891 * testtype: 3 == recv_max_early_data set to 0
3892 */
3893 static int early_data_skip_helper(int testtype, int cipher, int idx)
3894 {
3895 SSL_CTX *cctx = NULL, *sctx = NULL;
3896 SSL *clientssl = NULL, *serverssl = NULL;
3897 int testresult = 0;
3898 SSL_SESSION *sess = NULL;
3899 unsigned char buf[20];
3900 size_t readbytes, written;
3901
3902 if (is_fips && cipher == 4)
3903 return 1;
3904
3905 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3906 TLS_client_method(),
3907 TLS1_VERSION, 0,
3908 &sctx, &cctx, cert, privkey)))
3909 goto end;
3910
3911 if (cipher == 0) {
3912 SSL_CTX_set_security_level(sctx, 0);
3913 SSL_CTX_set_security_level(cctx, 0);
3914 }
3915
3916 if (!TEST_true(SSL_CTX_set_ciphersuites(sctx, ciphersuites[cipher]))
3917 || !TEST_true(SSL_CTX_set_ciphersuites(cctx, ciphersuites[cipher])))
3918 goto end;
3919
3920 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3921 &serverssl, &sess, idx,
3922 cipher == 2 ? SHA384_DIGEST_LENGTH
3923 : SHA256_DIGEST_LENGTH)))
3924 goto end;
3925
3926 if (testtype == 1 || testtype == 2) {
3927 /* Force an HRR to occur */
3928 #if defined(OPENSSL_NO_EC)
3929 if (!TEST_true(SSL_set1_groups_list(serverssl, "ffdhe3072")))
3930 goto end;
3931 #else
3932 if (!TEST_true(SSL_set1_groups_list(serverssl, "P-384")))
3933 goto end;
3934 #endif
3935 } else if (idx == 2) {
3936 /*
3937 * We force early_data rejection by ensuring the PSK identity is
3938 * unrecognised
3939 */
3940 srvid = "Dummy Identity";
3941 } else {
3942 /*
3943 * Deliberately corrupt the creation time. We take 20 seconds off the
3944 * time. It could be any value as long as it is not within tolerance.
3945 * This should mean the ticket is rejected.
3946 */
3947 if (!TEST_true(SSL_SESSION_set_time(sess, (long)(time(NULL) - 20))))
3948 goto end;
3949 }
3950
3951 if (testtype == 3
3952 && !TEST_true(SSL_set_recv_max_early_data(serverssl, 0)))
3953 goto end;
3954
3955 /* Write some early data */
3956 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3957 &written))
3958 || !TEST_size_t_eq(written, strlen(MSG1)))
3959 goto end;
3960
3961 /* Server should reject the early data */
3962 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3963 &readbytes),
3964 SSL_READ_EARLY_DATA_FINISH)
3965 || !TEST_size_t_eq(readbytes, 0)
3966 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3967 SSL_EARLY_DATA_REJECTED))
3968 goto end;
3969
3970 switch (testtype) {
3971 case 0:
3972 /* Nothing to do */
3973 break;
3974
3975 case 1:
3976 /*
3977 * Finish off the handshake. We perform the same writes and reads as
3978 * further down but we expect them to fail due to the incomplete
3979 * handshake.
3980 */
3981 if (!TEST_false(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
3982 || !TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf),
3983 &readbytes)))
3984 goto end;
3985 break;
3986
3987 case 2:
3988 {
3989 BIO *wbio = SSL_get_wbio(clientssl);
3990 /* A record that will appear as bad early_data */
3991 const unsigned char bad_early_data[] = {
3992 0x17, 0x03, 0x03, 0x00, 0x01, 0x00
3993 };
3994
3995 /*
3996 * We force the client to attempt a write. This will fail because
3997 * we're still in the handshake. It will cause the second
3998 * ClientHello to be sent.
3999 */
4000 if (!TEST_false(SSL_write_ex(clientssl, MSG2, strlen(MSG2),
4001 &written)))
4002 goto end;
4003
4004 /*
4005 * Inject some early_data after the second ClientHello. This should
4006 * cause the server to fail
4007 */
4008 if (!TEST_true(BIO_write_ex(wbio, bad_early_data,
4009 sizeof(bad_early_data), &written)))
4010 goto end;
4011 }
4012 /* fallthrough */
4013
4014 case 3:
4015 /*
4016 * This client has sent more early_data than we are willing to skip
4017 * (case 3) or sent invalid early_data (case 2) so the connection should
4018 * abort.
4019 */
4020 if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4021 || !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_SSL))
4022 goto end;
4023
4024 /* Connection has failed - nothing more to do */
4025 testresult = 1;
4026 goto end;
4027
4028 default:
4029 TEST_error("Invalid test type");
4030 goto end;
4031 }
4032
4033 ERR_clear_error();
4034 /*
4035 * Should be able to send normal data despite rejection of early data. The
4036 * early_data should be skipped.
4037 */
4038 if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
4039 || !TEST_size_t_eq(written, strlen(MSG2))
4040 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4041 SSL_EARLY_DATA_REJECTED)
4042 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4043 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4044 goto end;
4045
4046 /*
4047 * Failure to decrypt early data records should not leave spurious errors
4048 * on the error stack
4049 */
4050 if (!TEST_long_eq(ERR_peek_error(), 0))
4051 goto end;
4052
4053 testresult = 1;
4054
4055 end:
4056 SSL_SESSION_free(clientpsk);
4057 SSL_SESSION_free(serverpsk);
4058 clientpsk = serverpsk = NULL;
4059 SSL_SESSION_free(sess);
4060 SSL_free(serverssl);
4061 SSL_free(clientssl);
4062 SSL_CTX_free(sctx);
4063 SSL_CTX_free(cctx);
4064 return testresult;
4065 }
4066
4067 /*
4068 * Test that a server attempting to read early data can handle a connection
4069 * from a client where the early data is not acceptable.
4070 */
4071 static int test_early_data_skip(int idx)
4072 {
4073 return early_data_skip_helper(0,
4074 idx % OSSL_NELEM(ciphersuites),
4075 idx / OSSL_NELEM(ciphersuites));
4076 }
4077
4078 /*
4079 * Test that a server attempting to read early data can handle a connection
4080 * from a client where an HRR occurs.
4081 */
4082 static int test_early_data_skip_hrr(int idx)
4083 {
4084 return early_data_skip_helper(1,
4085 idx % OSSL_NELEM(ciphersuites),
4086 idx / OSSL_NELEM(ciphersuites));
4087 }
4088
4089 /*
4090 * Test that a server attempting to read early data can handle a connection
4091 * from a client where an HRR occurs and correctly fails if early_data is sent
4092 * after the HRR
4093 */
4094 static int test_early_data_skip_hrr_fail(int idx)
4095 {
4096 return early_data_skip_helper(2,
4097 idx % OSSL_NELEM(ciphersuites),
4098 idx / OSSL_NELEM(ciphersuites));
4099 }
4100
4101 /*
4102 * Test that a server attempting to read early data will abort if it tries to
4103 * skip over too much.
4104 */
4105 static int test_early_data_skip_abort(int idx)
4106 {
4107 return early_data_skip_helper(3,
4108 idx % OSSL_NELEM(ciphersuites),
4109 idx / OSSL_NELEM(ciphersuites));
4110 }
4111
4112 /*
4113 * Test that a server attempting to read early data can handle a connection
4114 * from a client that doesn't send any.
4115 */
4116 static int test_early_data_not_sent(int idx)
4117 {
4118 SSL_CTX *cctx = NULL, *sctx = NULL;
4119 SSL *clientssl = NULL, *serverssl = NULL;
4120 int testresult = 0;
4121 SSL_SESSION *sess = NULL;
4122 unsigned char buf[20];
4123 size_t readbytes, written;
4124
4125 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4126 &serverssl, &sess, idx,
4127 SHA384_DIGEST_LENGTH)))
4128 goto end;
4129
4130 /* Write some data - should block due to handshake with server */
4131 SSL_set_connect_state(clientssl);
4132 if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written)))
4133 goto end;
4134
4135 /* Server should detect that early data has not been sent */
4136 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4137 &readbytes),
4138 SSL_READ_EARLY_DATA_FINISH)
4139 || !TEST_size_t_eq(readbytes, 0)
4140 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4141 SSL_EARLY_DATA_NOT_SENT)
4142 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4143 SSL_EARLY_DATA_NOT_SENT))
4144 goto end;
4145
4146 /* Continue writing the message we started earlier */
4147 if (!TEST_true(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
4148 || !TEST_size_t_eq(written, strlen(MSG1))
4149 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4150 || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
4151 || !SSL_write_ex(serverssl, MSG2, strlen(MSG2), &written)
4152 || !TEST_size_t_eq(written, strlen(MSG2)))
4153 goto end;
4154
4155 if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
4156 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4157 goto end;
4158
4159 testresult = 1;
4160
4161 end:
4162 SSL_SESSION_free(sess);
4163 SSL_SESSION_free(clientpsk);
4164 SSL_SESSION_free(serverpsk);
4165 clientpsk = serverpsk = NULL;
4166 SSL_free(serverssl);
4167 SSL_free(clientssl);
4168 SSL_CTX_free(sctx);
4169 SSL_CTX_free(cctx);
4170 return testresult;
4171 }
4172
4173 static const char *servalpn;
4174
4175 static int alpn_select_cb(SSL *ssl, const unsigned char **out,
4176 unsigned char *outlen, const unsigned char *in,
4177 unsigned int inlen, void *arg)
4178 {
4179 unsigned int protlen = 0;
4180 const unsigned char *prot;
4181
4182 for (prot = in; prot < in + inlen; prot += protlen) {
4183 protlen = *prot++;
4184 if (in + inlen < prot + protlen)
4185 return SSL_TLSEXT_ERR_NOACK;
4186
4187 if (protlen == strlen(servalpn)
4188 && memcmp(prot, servalpn, protlen) == 0) {
4189 *out = prot;
4190 *outlen = protlen;
4191 return SSL_TLSEXT_ERR_OK;
4192 }
4193 }
4194
4195 return SSL_TLSEXT_ERR_NOACK;
4196 }
4197
4198 /* Test that a PSK can be used to send early_data */
4199 static int test_early_data_psk(int idx)
4200 {
4201 SSL_CTX *cctx = NULL, *sctx = NULL;
4202 SSL *clientssl = NULL, *serverssl = NULL;
4203 int testresult = 0;
4204 SSL_SESSION *sess = NULL;
4205 unsigned char alpnlist[] = {
4206 0x08, 'g', 'o', 'o', 'd', 'a', 'l', 'p', 'n', 0x07, 'b', 'a', 'd', 'a',
4207 'l', 'p', 'n'
4208 };
4209 #define GOODALPNLEN 9
4210 #define BADALPNLEN 8
4211 #define GOODALPN (alpnlist)
4212 #define BADALPN (alpnlist + GOODALPNLEN)
4213 int err = 0;
4214 unsigned char buf[20];
4215 size_t readbytes, written;
4216 int readearlyres = SSL_READ_EARLY_DATA_SUCCESS, connectres = 1;
4217 int edstatus = SSL_EARLY_DATA_ACCEPTED;
4218
4219 /* We always set this up with a final parameter of "2" for PSK */
4220 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4221 &serverssl, &sess, 2,
4222 SHA384_DIGEST_LENGTH)))
4223 goto end;
4224
4225 servalpn = "goodalpn";
4226
4227 /*
4228 * Note: There is no test for inconsistent SNI with late client detection.
4229 * This is because servers do not acknowledge SNI even if they are using
4230 * it in a resumption handshake - so it is not actually possible for a
4231 * client to detect a problem.
4232 */
4233 switch (idx) {
4234 case 0:
4235 /* Set inconsistent SNI (early client detection) */
4236 err = SSL_R_INCONSISTENT_EARLY_DATA_SNI;
4237 if (!TEST_true(SSL_SESSION_set1_hostname(sess, "goodhost"))
4238 || !TEST_true(SSL_set_tlsext_host_name(clientssl, "badhost")))
4239 goto end;
4240 break;
4241
4242 case 1:
4243 /* Set inconsistent ALPN (early client detection) */
4244 err = SSL_R_INCONSISTENT_EARLY_DATA_ALPN;
4245 /* SSL_set_alpn_protos returns 0 for success and 1 for failure */
4246 if (!TEST_true(SSL_SESSION_set1_alpn_selected(sess, GOODALPN,
4247 GOODALPNLEN))
4248 || !TEST_false(SSL_set_alpn_protos(clientssl, BADALPN,
4249 BADALPNLEN)))
4250 goto end;
4251 break;
4252
4253 case 2:
4254 /*
4255 * Set invalid protocol version. Technically this affects PSKs without
4256 * early_data too, but we test it here because it is similar to the
4257 * SNI/ALPN consistency tests.
4258 */
4259 err = SSL_R_BAD_PSK;
4260 if (!TEST_true(SSL_SESSION_set_protocol_version(sess, TLS1_2_VERSION)))
4261 goto end;
4262 break;
4263
4264 case 3:
4265 /*
4266 * Set inconsistent SNI (server side). In this case the connection
4267 * will succeed and accept early_data. In TLSv1.3 on the server side SNI
4268 * is associated with each handshake - not the session. Therefore it
4269 * should not matter that we used a different server name last time.
4270 */
4271 SSL_SESSION_free(serverpsk);
4272 serverpsk = SSL_SESSION_dup(clientpsk);
4273 if (!TEST_ptr(serverpsk)
4274 || !TEST_true(SSL_SESSION_set1_hostname(serverpsk, "badhost")))
4275 goto end;
4276 /* Fall through */
4277 case 4:
4278 /* Set consistent SNI */
4279 if (!TEST_true(SSL_SESSION_set1_hostname(sess, "goodhost"))
4280 || !TEST_true(SSL_set_tlsext_host_name(clientssl, "goodhost"))
4281 || !TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx,
4282 hostname_cb)))
4283 goto end;
4284 break;
4285
4286 case 5:
4287 /*
4288 * Set inconsistent ALPN (server detected). In this case the connection
4289 * will succeed but reject early_data.
4290 */
4291 servalpn = "badalpn";
4292 edstatus = SSL_EARLY_DATA_REJECTED;
4293 readearlyres = SSL_READ_EARLY_DATA_FINISH;
4294 /* Fall through */
4295 case 6:
4296 /*
4297 * Set consistent ALPN.
4298 * SSL_set_alpn_protos returns 0 for success and 1 for failure. It
4299 * accepts a list of protos (each one length prefixed).
4300 * SSL_set1_alpn_selected accepts a single protocol (not length
4301 * prefixed)
4302 */
4303 if (!TEST_true(SSL_SESSION_set1_alpn_selected(sess, GOODALPN + 1,
4304 GOODALPNLEN - 1))
4305 || !TEST_false(SSL_set_alpn_protos(clientssl, GOODALPN,
4306 GOODALPNLEN)))
4307 goto end;
4308
4309 SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb, NULL);
4310 break;
4311
4312 case 7:
4313 /* Set inconsistent ALPN (late client detection) */
4314 SSL_SESSION_free(serverpsk);
4315 serverpsk = SSL_SESSION_dup(clientpsk);
4316 if (!TEST_ptr(serverpsk)
4317 || !TEST_true(SSL_SESSION_set1_alpn_selected(clientpsk,
4318 BADALPN + 1,
4319 BADALPNLEN - 1))
4320 || !TEST_true(SSL_SESSION_set1_alpn_selected(serverpsk,
4321 GOODALPN + 1,
4322 GOODALPNLEN - 1))
4323 || !TEST_false(SSL_set_alpn_protos(clientssl, alpnlist,
4324 sizeof(alpnlist))))
4325 goto end;
4326 SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb, NULL);
4327 edstatus = SSL_EARLY_DATA_ACCEPTED;
4328 readearlyres = SSL_READ_EARLY_DATA_SUCCESS;
4329 /* SSL_connect() call should fail */
4330 connectres = -1;
4331 break;
4332
4333 default:
4334 TEST_error("Bad test index");
4335 goto end;
4336 }
4337
4338 SSL_set_connect_state(clientssl);
4339 if (err != 0) {
4340 if (!TEST_false(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4341 &written))
4342 || !TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_SSL)
4343 || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), err))
4344 goto end;
4345 } else {
4346 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4347 &written)))
4348 goto end;
4349
4350 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4351 &readbytes), readearlyres)
4352 || (readearlyres == SSL_READ_EARLY_DATA_SUCCESS
4353 && !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1)))
4354 || !TEST_int_eq(SSL_get_early_data_status(serverssl), edstatus)
4355 || !TEST_int_eq(SSL_connect(clientssl), connectres))
4356 goto end;
4357 }
4358
4359 testresult = 1;
4360
4361 end:
4362 SSL_SESSION_free(sess);
4363 SSL_SESSION_free(clientpsk);
4364 SSL_SESSION_free(serverpsk);
4365 clientpsk = serverpsk = NULL;
4366 SSL_free(serverssl);
4367 SSL_free(clientssl);
4368 SSL_CTX_free(sctx);
4369 SSL_CTX_free(cctx);
4370 return testresult;
4371 }
4372
4373 /*
4374 * Test TLSv1.3 PSK can be used to send early_data with all 5 ciphersuites
4375 * idx == 0: Test with TLS1_3_RFC_AES_128_GCM_SHA256
4376 * idx == 1: Test with TLS1_3_RFC_AES_256_GCM_SHA384
4377 * idx == 2: Test with TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
4378 * idx == 3: Test with TLS1_3_RFC_AES_128_CCM_SHA256
4379 * idx == 4: Test with TLS1_3_RFC_AES_128_CCM_8_SHA256
4380 */
4381 static int test_early_data_psk_with_all_ciphers(int idx)
4382 {
4383 SSL_CTX *cctx = NULL, *sctx = NULL;
4384 SSL *clientssl = NULL, *serverssl = NULL;
4385 int testresult = 0;
4386 SSL_SESSION *sess = NULL;
4387 unsigned char buf[20];
4388 size_t readbytes, written;
4389 const SSL_CIPHER *cipher;
4390 const char *cipher_str[] = {
4391 TLS1_3_RFC_AES_128_GCM_SHA256,
4392 TLS1_3_RFC_AES_256_GCM_SHA384,
4393 # if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
4394 TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
4395 # else
4396 NULL,
4397 # endif
4398 TLS1_3_RFC_AES_128_CCM_SHA256,
4399 TLS1_3_RFC_AES_128_CCM_8_SHA256
4400 };
4401 const unsigned char *cipher_bytes[] = {
4402 TLS13_AES_128_GCM_SHA256_BYTES,
4403 TLS13_AES_256_GCM_SHA384_BYTES,
4404 # if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
4405 TLS13_CHACHA20_POLY1305_SHA256_BYTES,
4406 # else
4407 NULL,
4408 # endif
4409 TLS13_AES_128_CCM_SHA256_BYTES,
4410 TLS13_AES_128_CCM_8_SHA256_BYTES
4411 };
4412
4413 if (cipher_str[idx] == NULL)
4414 return 1;
4415 /* Skip ChaCha20Poly1305 as currently FIPS module does not support it */
4416 if (idx == 2 && is_fips == 1)
4417 return 1;
4418
4419 /* We always set this up with a final parameter of "2" for PSK */
4420 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4421 &serverssl, &sess, 2,
4422 SHA384_DIGEST_LENGTH)))
4423 goto end;
4424
4425 if (idx == 4) {
4426 /* CCM8 ciphers are considered low security due to their short tag */
4427 SSL_set_security_level(clientssl, 0);
4428 SSL_set_security_level(serverssl, 0);
4429 }
4430
4431 if (!TEST_true(SSL_set_ciphersuites(clientssl, cipher_str[idx]))
4432 || !TEST_true(SSL_set_ciphersuites(serverssl, cipher_str[idx])))
4433 goto end;
4434
4435 /*
4436 * 'setupearly_data_test' creates only one instance of SSL_SESSION
4437 * and assigns to both client and server with incremented reference
4438 * and the same instance is updated in 'sess'.
4439 * So updating ciphersuite in 'sess' which will get reflected in
4440 * PSK handshake using psk use sess and find sess cb.
4441 */
4442 cipher = SSL_CIPHER_find(clientssl, cipher_bytes[idx]);
4443 if (!TEST_ptr(cipher) || !TEST_true(SSL_SESSION_set_cipher(sess, cipher)))
4444 goto end;
4445
4446 SSL_set_connect_state(clientssl);
4447 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4448 &written)))
4449 goto end;
4450
4451 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4452 &readbytes),
4453 SSL_READ_EARLY_DATA_SUCCESS)
4454 || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
4455 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4456 SSL_EARLY_DATA_ACCEPTED)
4457 || !TEST_int_eq(SSL_connect(clientssl), 1)
4458 || !TEST_int_eq(SSL_accept(serverssl), 1))
4459 goto end;
4460
4461 /* Send some normal data from client to server */
4462 if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
4463 || !TEST_size_t_eq(written, strlen(MSG2)))
4464 goto end;
4465
4466 if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4467 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4468 goto end;
4469
4470 testresult = 1;
4471 end:
4472 SSL_SESSION_free(sess);
4473 SSL_SESSION_free(clientpsk);
4474 SSL_SESSION_free(serverpsk);
4475 clientpsk = serverpsk = NULL;
4476 if (clientssl != NULL)
4477 SSL_shutdown(clientssl);
4478 if (serverssl != NULL)
4479 SSL_shutdown(serverssl);
4480 SSL_free(serverssl);
4481 SSL_free(clientssl);
4482 SSL_CTX_free(sctx);
4483 SSL_CTX_free(cctx);
4484 return testresult;
4485 }
4486
4487 /*
4488 * Test that a server that doesn't try to read early data can handle a
4489 * client sending some.
4490 */
4491 static int test_early_data_not_expected(int idx)
4492 {
4493 SSL_CTX *cctx = NULL, *sctx = NULL;
4494 SSL *clientssl = NULL, *serverssl = NULL;
4495 int testresult = 0;
4496 SSL_SESSION *sess = NULL;
4497 unsigned char buf[20];
4498 size_t readbytes, written;
4499
4500 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4501 &serverssl, &sess, idx,
4502 SHA384_DIGEST_LENGTH)))
4503 goto end;
4504
4505 /* Write some early data */
4506 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4507 &written)))
4508 goto end;
4509
4510 /*
4511 * Server should skip over early data and then block waiting for client to
4512 * continue handshake
4513 */
4514 if (!TEST_int_le(SSL_accept(serverssl), 0)
4515 || !TEST_int_gt(SSL_connect(clientssl), 0)
4516 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4517 SSL_EARLY_DATA_REJECTED)
4518 || !TEST_int_gt(SSL_accept(serverssl), 0)
4519 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4520 SSL_EARLY_DATA_REJECTED))
4521 goto end;
4522
4523 /* Send some normal data from client to server */
4524 if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
4525 || !TEST_size_t_eq(written, strlen(MSG2)))
4526 goto end;
4527
4528 if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4529 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4530 goto end;
4531
4532 testresult = 1;
4533
4534 end:
4535 SSL_SESSION_free(sess);
4536 SSL_SESSION_free(clientpsk);
4537 SSL_SESSION_free(serverpsk);
4538 clientpsk = serverpsk = NULL;
4539 SSL_free(serverssl);
4540 SSL_free(clientssl);
4541 SSL_CTX_free(sctx);
4542 SSL_CTX_free(cctx);
4543 return testresult;
4544 }
4545
4546
4547 # ifndef OPENSSL_NO_TLS1_2
4548 /*
4549 * Test that a server attempting to read early data can handle a connection
4550 * from a TLSv1.2 client.
4551 */
4552 static int test_early_data_tls1_2(int idx)
4553 {
4554 SSL_CTX *cctx = NULL, *sctx = NULL;
4555 SSL *clientssl = NULL, *serverssl = NULL;
4556 int testresult = 0;
4557 unsigned char buf[20];
4558 size_t readbytes, written;
4559
4560 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4561 &serverssl, NULL, idx,
4562 SHA384_DIGEST_LENGTH)))
4563 goto end;
4564
4565 /* Write some data - should block due to handshake with server */
4566 SSL_set_max_proto_version(clientssl, TLS1_2_VERSION);
4567 SSL_set_connect_state(clientssl);
4568 if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written)))
4569 goto end;
4570
4571 /*
4572 * Server should do TLSv1.2 handshake. First it will block waiting for more
4573 * messages from client after ServerDone. Then SSL_read_early_data should
4574 * finish and detect that early data has not been sent
4575 */
4576 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4577 &readbytes),
4578 SSL_READ_EARLY_DATA_ERROR))
4579 goto end;
4580
4581 /*
4582 * Continue writing the message we started earlier. Will still block waiting
4583 * for the CCS/Finished from server
4584 */
4585 if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
4586 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4587 &readbytes),
4588 SSL_READ_EARLY_DATA_FINISH)
4589 || !TEST_size_t_eq(readbytes, 0)
4590 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4591 SSL_EARLY_DATA_NOT_SENT))
4592 goto end;
4593
4594 /* Continue writing the message we started earlier */
4595 if (!TEST_true(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
4596 || !TEST_size_t_eq(written, strlen(MSG1))
4597 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4598 SSL_EARLY_DATA_NOT_SENT)
4599 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4600 || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
4601 || !TEST_true(SSL_write_ex(serverssl, MSG2, strlen(MSG2), &written))
4602 || !TEST_size_t_eq(written, strlen(MSG2))
4603 || !SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes)
4604 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4605 goto end;
4606
4607 testresult = 1;
4608
4609 end:
4610 SSL_SESSION_free(clientpsk);
4611 SSL_SESSION_free(serverpsk);
4612 clientpsk = serverpsk = NULL;
4613 SSL_free(serverssl);
4614 SSL_free(clientssl);
4615 SSL_CTX_free(sctx);
4616 SSL_CTX_free(cctx);
4617
4618 return testresult;
4619 }
4620 # endif /* OPENSSL_NO_TLS1_2 */
4621
4622 /*
4623 * Test configuring the TLSv1.3 ciphersuites
4624 *
4625 * Test 0: Set a default ciphersuite in the SSL_CTX (no explicit cipher_list)
4626 * Test 1: Set a non-default ciphersuite in the SSL_CTX (no explicit cipher_list)
4627 * Test 2: Set a default ciphersuite in the SSL (no explicit cipher_list)
4628 * Test 3: Set a non-default ciphersuite in the SSL (no explicit cipher_list)
4629 * Test 4: Set a default ciphersuite in the SSL_CTX (SSL_CTX cipher_list)
4630 * Test 5: Set a non-default ciphersuite in the SSL_CTX (SSL_CTX cipher_list)
4631 * Test 6: Set a default ciphersuite in the SSL (SSL_CTX cipher_list)
4632 * Test 7: Set a non-default ciphersuite in the SSL (SSL_CTX cipher_list)
4633 * Test 8: Set a default ciphersuite in the SSL (SSL cipher_list)
4634 * Test 9: Set a non-default ciphersuite in the SSL (SSL cipher_list)
4635 */
4636 static int test_set_ciphersuite(int idx)
4637 {
4638 SSL_CTX *cctx = NULL, *sctx = NULL;
4639 SSL *clientssl = NULL, *serverssl = NULL;
4640 int testresult = 0;
4641
4642 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
4643 TLS_client_method(), TLS1_VERSION, 0,
4644 &sctx, &cctx, cert, privkey))
4645 || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
4646 "TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256")))
4647 goto end;
4648
4649 if (idx >=4 && idx <= 7) {
4650 /* SSL_CTX explicit cipher list */
4651 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "AES256-GCM-SHA384")))
4652 goto end;
4653 }
4654
4655 if (idx == 0 || idx == 4) {
4656 /* Default ciphersuite */
4657 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
4658 "TLS_AES_128_GCM_SHA256")))
4659 goto end;
4660 } else if (idx == 1 || idx == 5) {
4661 /* Non default ciphersuite */
4662 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
4663 "TLS_AES_128_CCM_SHA256")))
4664 goto end;
4665 }
4666
4667 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
4668 &clientssl, NULL, NULL)))
4669 goto end;
4670
4671 if (idx == 8 || idx == 9) {
4672 /* SSL explicit cipher list */
4673 if (!TEST_true(SSL_set_cipher_list(clientssl, "AES256-GCM-SHA384")))
4674 goto end;
4675 }
4676
4677 if (idx == 2 || idx == 6 || idx == 8) {
4678 /* Default ciphersuite */
4679 if (!TEST_true(SSL_set_ciphersuites(clientssl,
4680 "TLS_AES_128_GCM_SHA256")))
4681 goto end;
4682 } else if (idx == 3 || idx == 7 || idx == 9) {
4683 /* Non default ciphersuite */
4684 if (!TEST_true(SSL_set_ciphersuites(clientssl,
4685 "TLS_AES_128_CCM_SHA256")))
4686 goto end;
4687 }
4688
4689 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
4690 goto end;
4691
4692 testresult = 1;
4693
4694 end:
4695 SSL_free(serverssl);
4696 SSL_free(clientssl);
4697 SSL_CTX_free(sctx);
4698 SSL_CTX_free(cctx);
4699
4700 return testresult;
4701 }
4702
4703 static int test_ciphersuite_change(void)
4704 {
4705 SSL_CTX *cctx = NULL, *sctx = NULL;
4706 SSL *clientssl = NULL, *serverssl = NULL;
4707 SSL_SESSION *clntsess = NULL;
4708 int testresult = 0;
4709 const SSL_CIPHER *aes_128_gcm_sha256 = NULL;
4710
4711 /* Create a session based on SHA-256 */
4712 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
4713 TLS_client_method(), TLS1_VERSION, 0,
4714 &sctx, &cctx, cert, privkey))
4715 || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
4716 "TLS_AES_128_GCM_SHA256:"
4717 "TLS_AES_256_GCM_SHA384:"
4718 "TLS_AES_128_CCM_SHA256"))
4719 || !TEST_true(SSL_CTX_set_ciphersuites(cctx,
4720 "TLS_AES_128_GCM_SHA256")))
4721 goto end;
4722
4723 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4724 NULL, NULL))
4725 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4726 SSL_ERROR_NONE)))
4727 goto end;
4728
4729 clntsess = SSL_get1_session(clientssl);
4730 /* Save for later */
4731 aes_128_gcm_sha256 = SSL_SESSION_get0_cipher(clntsess);
4732 SSL_shutdown(clientssl);
4733 SSL_shutdown(serverssl);
4734 SSL_free(serverssl);
4735 SSL_free(clientssl);
4736 serverssl = clientssl = NULL;
4737
4738 /* Check we can resume a session with a different SHA-256 ciphersuite */
4739 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
4740 "TLS_AES_128_CCM_SHA256"))
4741 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
4742 &clientssl, NULL, NULL))
4743 || !TEST_true(SSL_set_session(clientssl, clntsess))
4744 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4745 SSL_ERROR_NONE))
4746 || !TEST_true(SSL_session_reused(clientssl)))
4747 goto end;
4748
4749 SSL_SESSION_free(clntsess);
4750 clntsess = SSL_get1_session(clientssl);
4751 SSL_shutdown(clientssl);
4752 SSL_shutdown(serverssl);
4753 SSL_free(serverssl);
4754 SSL_free(clientssl);
4755 serverssl = clientssl = NULL;
4756
4757 /*
4758 * Check attempting to resume a SHA-256 session with no SHA-256 ciphersuites
4759 * succeeds but does not resume.
4760 */
4761 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, "TLS_AES_256_GCM_SHA384"))
4762 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4763 NULL, NULL))
4764 || !TEST_true(SSL_set_session(clientssl, clntsess))
4765 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4766 SSL_ERROR_SSL))
4767 || !TEST_false(SSL_session_reused(clientssl)))
4768 goto end;
4769
4770 SSL_SESSION_free(clntsess);
4771 clntsess = NULL;
4772 SSL_shutdown(clientssl);
4773 SSL_shutdown(serverssl);
4774 SSL_free(serverssl);
4775 SSL_free(clientssl);
4776 serverssl = clientssl = NULL;
4777
4778 /* Create a session based on SHA384 */
4779 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, "TLS_AES_256_GCM_SHA384"))
4780 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
4781 &clientssl, NULL, NULL))
4782 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4783 SSL_ERROR_NONE)))
4784 goto end;
4785
4786 clntsess = SSL_get1_session(clientssl);
4787 SSL_shutdown(clientssl);
4788 SSL_shutdown(serverssl);
4789 SSL_free(serverssl);
4790 SSL_free(clientssl);
4791 serverssl = clientssl = NULL;
4792
4793 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
4794 "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384"))
4795 || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
4796 "TLS_AES_256_GCM_SHA384"))
4797 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4798 NULL, NULL))
4799 || !TEST_true(SSL_set_session(clientssl, clntsess))
4800 /*
4801 * We use SSL_ERROR_WANT_READ below so that we can pause the
4802 * connection after the initial ClientHello has been sent to
4803 * enable us to make some session changes.
4804 */
4805 || !TEST_false(create_ssl_connection(serverssl, clientssl,
4806 SSL_ERROR_WANT_READ)))
4807 goto end;
4808
4809 /* Trick the client into thinking this session is for a different digest */
4810 clntsess->cipher = aes_128_gcm_sha256;
4811 clntsess->cipher_id = clntsess->cipher->id;
4812
4813 /*
4814 * Continue the previously started connection. Server has selected a SHA-384
4815 * ciphersuite, but client thinks the session is for SHA-256, so it should
4816 * bail out.
4817 */
4818 if (!TEST_false(create_ssl_connection(serverssl, clientssl,
4819 SSL_ERROR_SSL))
4820 || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()),
4821 SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED))
4822 goto end;
4823
4824 testresult = 1;
4825
4826 end:
4827 SSL_SESSION_free(clntsess);
4828 SSL_free(serverssl);
4829 SSL_free(clientssl);
4830 SSL_CTX_free(sctx);
4831 SSL_CTX_free(cctx);
4832
4833 return testresult;
4834 }
4835
4836 /*
4837 * Test TLSv1.3 Key exchange
4838 * Test 0 = Test all ECDHE Key exchange with TLSv1.3 client and server
4839 * Test 1 = Test NID_X9_62_prime256v1 with TLSv1.3 client and server
4840 * Test 2 = Test NID_secp384r1 with TLSv1.3 client and server
4841 * Test 3 = Test NID_secp521r1 with TLSv1.3 client and server
4842 * Test 4 = Test NID_X25519 with TLSv1.3 client and server
4843 * Test 5 = Test NID_X448 with TLSv1.3 client and server
4844 * Test 6 = Test all FFDHE Key exchange with TLSv1.3 client and server
4845 * Test 7 = Test NID_ffdhe2048 with TLSv1.3 client and server
4846 * Test 8 = Test NID_ffdhe3072 with TLSv1.3 client and server
4847 * Test 9 = Test NID_ffdhe4096 with TLSv1.3 client and server
4848 * Test 10 = Test NID_ffdhe6144 with TLSv1.3 client and server
4849 * Test 11 = Test NID_ffdhe8192 with TLSv1.3 client and server
4850 * Test 12 = Test all ECDHE with TLSv1.2 client and server
4851 * Test 13 = Test all FFDHE with TLSv1.2 client and server
4852 */
4853 # ifndef OPENSSL_NO_EC
4854 static int ecdhe_kexch_groups[] = {NID_X9_62_prime256v1, NID_secp384r1,
4855 NID_secp521r1,
4856 # ifndef OPENSSL_NO_ECX
4857 NID_X25519, NID_X448
4858 # endif
4859 };
4860 # endif
4861 # ifndef OPENSSL_NO_DH
4862 static int ffdhe_kexch_groups[] = {NID_ffdhe2048, NID_ffdhe3072, NID_ffdhe4096,
4863 NID_ffdhe6144, NID_ffdhe8192};
4864 # endif
4865 static int test_key_exchange(int idx)
4866 {
4867 SSL_CTX *sctx = NULL, *cctx = NULL;
4868 SSL *serverssl = NULL, *clientssl = NULL;
4869 int testresult = 0;
4870 int kexch_alg;
4871 int *kexch_groups = &kexch_alg;
4872 int kexch_groups_size = 1;
4873 int max_version = TLS1_3_VERSION;
4874 char *kexch_name0 = NULL;
4875
4876 switch (idx) {
4877 # ifndef OPENSSL_NO_EC
4878 # ifndef OPENSSL_NO_TLS1_2
4879 case 12:
4880 max_version = TLS1_2_VERSION;
4881 # endif
4882 /* Fall through */
4883 case 0:
4884 kexch_groups = ecdhe_kexch_groups;
4885 kexch_groups_size = OSSL_NELEM(ecdhe_kexch_groups);
4886 kexch_name0 = "secp256r1";
4887 break;
4888 case 1:
4889 kexch_alg = NID_X9_62_prime256v1;
4890 kexch_name0 = "secp256r1";
4891 break;
4892 case 2:
4893 kexch_alg = NID_secp384r1;
4894 kexch_name0 = "secp384r1";
4895 break;
4896 case 3:
4897 kexch_alg = NID_secp521r1;
4898 kexch_name0 = "secp521r1";
4899 break;
4900 # ifndef OPENSSL_NO_ECX
4901 case 4:
4902 kexch_alg = NID_X25519;
4903 kexch_name0 = "x25519";
4904 break;
4905 case 5:
4906 kexch_alg = NID_X448;
4907 kexch_name0 = "x448";
4908 break;
4909 # endif
4910 # endif
4911 # ifndef OPENSSL_NO_DH
4912 # ifndef OPENSSL_NO_TLS1_2
4913 case 13:
4914 max_version = TLS1_2_VERSION;
4915 kexch_name0 = "ffdhe2048";
4916 # endif
4917 /* Fall through */
4918 case 6:
4919 kexch_groups = ffdhe_kexch_groups;
4920 kexch_groups_size = OSSL_NELEM(ffdhe_kexch_groups);
4921 kexch_name0 = "ffdhe2048";
4922 break;
4923 case 7:
4924 kexch_alg = NID_ffdhe2048;
4925 kexch_name0 = "ffdhe2048";
4926 break;
4927 case 8:
4928 kexch_alg = NID_ffdhe3072;
4929 kexch_name0 = "ffdhe3072";
4930 break;
4931 case 9:
4932 kexch_alg = NID_ffdhe4096;
4933 kexch_name0 = "ffdhe4096";
4934 break;
4935 case 10:
4936 kexch_alg = NID_ffdhe6144;
4937 kexch_name0 = "ffdhe6144";
4938 break;
4939 case 11:
4940 kexch_alg = NID_ffdhe8192;
4941 kexch_name0 = "ffdhe8192";
4942 break;
4943 # endif
4944 default:
4945 /* We're skipping this test */
4946 return 1;
4947 }
4948
4949 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
4950 TLS_client_method(), TLS1_VERSION,
4951 max_version, &sctx, &cctx, cert,
4952 privkey)))
4953 goto end;
4954
4955 if (!TEST_true(SSL_CTX_set_ciphersuites(sctx,
4956 TLS1_3_RFC_AES_128_GCM_SHA256)))
4957 goto end;
4958
4959 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
4960 TLS1_3_RFC_AES_128_GCM_SHA256)))
4961 goto end;
4962
4963 if (!TEST_true(SSL_CTX_set_cipher_list(sctx,
4964 TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":"
4965 TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256))
4966 || !TEST_true(SSL_CTX_set_dh_auto(sctx, 1)))
4967 goto end;
4968
4969 /*
4970 * Must include an EC ciphersuite so that we send supported groups in
4971 * TLSv1.2
4972 */
4973 # ifndef OPENSSL_NO_TLS1_2
4974 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
4975 TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":"
4976 TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256)))
4977 goto end;
4978 # endif
4979
4980 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4981 NULL, NULL)))
4982 goto end;
4983
4984 if (!TEST_true(SSL_set1_groups(serverssl, kexch_groups, kexch_groups_size))
4985 || !TEST_true(SSL_set1_groups(clientssl, kexch_groups, kexch_groups_size)))
4986 goto end;
4987
4988 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
4989 goto end;
4990
4991 /*
4992 * If Handshake succeeds the negotiated kexch alg should be the first one in
4993 * configured, except in the case of FFDHE groups (idx 13), which are
4994 * TLSv1.3 only so we expect no shared group to exist.
4995 */
4996 if (!TEST_int_eq(SSL_get_shared_group(serverssl, 0),
4997 idx == 13 ? 0 : kexch_groups[0]))
4998 goto end;
4999
5000 if (!TEST_str_eq(SSL_group_to_name(serverssl, kexch_groups[0]),
5001 kexch_name0))
5002 goto end;
5003
5004 /* We don't implement RFC 7919 named groups for TLS 1.2. */
5005 if (idx != 13) {
5006 if (!TEST_str_eq(SSL_get0_group_name(serverssl), kexch_name0)
5007 || !TEST_str_eq(SSL_get0_group_name(clientssl), kexch_name0))
5008 goto end;
5009 if (!TEST_int_eq(SSL_get_negotiated_group(serverssl), kexch_groups[0]))
5010 goto end;
5011 if (!TEST_int_eq(SSL_get_negotiated_group(clientssl), kexch_groups[0]))
5012 goto end;
5013 }
5014
5015 testresult = 1;
5016 end:
5017 SSL_free(serverssl);
5018 SSL_free(clientssl);
5019 SSL_CTX_free(sctx);
5020 SSL_CTX_free(cctx);
5021 return testresult;
5022 }
5023
5024 # if !defined(OPENSSL_NO_TLS1_2) \
5025 && !defined(OPENSSL_NO_EC) \
5026 && !defined(OPENSSL_NO_DH)
5027 static int set_ssl_groups(SSL *serverssl, SSL *clientssl, int clientmulti,
5028 int isecdhe, int idx)
5029 {
5030 int kexch_alg;
5031 int *kexch_groups = &kexch_alg;
5032 int numec, numff;
5033
5034 numec = OSSL_NELEM(ecdhe_kexch_groups);
5035 numff = OSSL_NELEM(ffdhe_kexch_groups);
5036 if (isecdhe)
5037 kexch_alg = ecdhe_kexch_groups[idx];
5038 else
5039 kexch_alg = ffdhe_kexch_groups[idx];
5040
5041 if (clientmulti) {
5042 if (!TEST_true(SSL_set1_groups(serverssl, kexch_groups, 1)))
5043 return 0;
5044 if (isecdhe) {
5045 if (!TEST_true(SSL_set1_groups(clientssl, ecdhe_kexch_groups,
5046 numec)))
5047 return 0;
5048 } else {
5049 if (!TEST_true(SSL_set1_groups(clientssl, ffdhe_kexch_groups,
5050 numff)))
5051 return 0;
5052 }
5053 } else {
5054 if (!TEST_true(SSL_set1_groups(clientssl, kexch_groups, 1)))
5055 return 0;
5056 if (isecdhe) {
5057 if (!TEST_true(SSL_set1_groups(serverssl, ecdhe_kexch_groups,
5058 numec)))
5059 return 0;
5060 } else {
5061 if (!TEST_true(SSL_set1_groups(serverssl, ffdhe_kexch_groups,
5062 numff)))
5063 return 0;
5064 }
5065 }
5066 return 1;
5067 }
5068
5069 /*-
5070 * Test the SSL_get_negotiated_group() API across a battery of scenarios.
5071 * Run through both the ECDHE and FFDHE group lists used in the previous
5072 * test, for both TLS 1.2 and TLS 1.3, negotiating each group in turn,
5073 * confirming the expected result; then perform a resumption handshake
5074 * while offering the same group list, and another resumption handshake
5075 * offering a different group list. The returned value should be the
5076 * negotiated group for the initial handshake; for TLS 1.3 resumption
5077 * handshakes the returned value will be negotiated on the resumption
5078 * handshake itself, but for TLS 1.2 resumption handshakes the value will
5079 * be cached in the session from the original handshake, regardless of what
5080 * was offered in the resumption ClientHello.
5081 *
5082 * Using E for the number of EC groups and F for the number of FF groups:
5083 * E tests of ECDHE with TLS 1.3, server only has one group
5084 * F tests of FFDHE with TLS 1.3, server only has one group
5085 * E tests of ECDHE with TLS 1.2, server only has one group
5086 * F tests of FFDHE with TLS 1.2, server only has one group
5087 * E tests of ECDHE with TLS 1.3, client sends only one group
5088 * F tests of FFDHE with TLS 1.3, client sends only one group
5089 * E tests of ECDHE with TLS 1.2, client sends only one group
5090 * F tests of FFDHE with TLS 1.2, client sends only one group
5091 */
5092 static int test_negotiated_group(int idx)
5093 {
5094 int clientmulti, istls13, isecdhe, numec, numff, numgroups;
5095 int expectednid;
5096 SSL_CTX *sctx = NULL, *cctx = NULL;
5097 SSL *serverssl = NULL, *clientssl = NULL;
5098 SSL_SESSION *origsess = NULL;
5099 int testresult = 0;
5100 int kexch_alg;
5101 int max_version = TLS1_3_VERSION;
5102
5103 numec = OSSL_NELEM(ecdhe_kexch_groups);
5104 numff = OSSL_NELEM(ffdhe_kexch_groups);
5105 numgroups = numec + numff;
5106 clientmulti = (idx < 2 * numgroups);
5107 idx = idx % (2 * numgroups);
5108 istls13 = (idx < numgroups);
5109 idx = idx % numgroups;
5110 isecdhe = (idx < numec);
5111 if (!isecdhe)
5112 idx -= numec;
5113 /* Now 'idx' is an index into ecdhe_kexch_groups or ffdhe_kexch_groups */
5114 if (isecdhe)
5115 kexch_alg = ecdhe_kexch_groups[idx];
5116 else
5117 kexch_alg = ffdhe_kexch_groups[idx];
5118 /* We expect nothing for the unimplemented TLS 1.2 FFDHE named groups */
5119 if (!istls13 && !isecdhe)
5120 expectednid = NID_undef;
5121 else
5122 expectednid = kexch_alg;
5123
5124 if (!istls13)
5125 max_version = TLS1_2_VERSION;
5126
5127 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5128 TLS_client_method(), TLS1_VERSION,
5129 max_version, &sctx, &cctx, cert,
5130 privkey)))
5131 goto end;
5132
5133 /*
5134 * Force (EC)DHE ciphers for TLS 1.2.
5135 * Be sure to enable auto tmp DH so that FFDHE can succeed.
5136 */
5137 if (!TEST_true(SSL_CTX_set_cipher_list(sctx,
5138 TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":"
5139 TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256))
5140 || !TEST_true(SSL_CTX_set_dh_auto(sctx, 1)))
5141 goto end;
5142 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
5143 TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":"
5144 TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256)))
5145 goto end;
5146
5147 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5148 NULL, NULL)))
5149 goto end;
5150
5151 if (!TEST_true(set_ssl_groups(serverssl, clientssl, clientmulti, isecdhe,
5152 idx)))
5153 goto end;
5154
5155 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
5156 goto end;
5157
5158 /* Initial handshake; always the configured one */
5159 if (!TEST_uint_eq(SSL_get_negotiated_group(clientssl), expectednid)
5160 || !TEST_uint_eq(SSL_get_negotiated_group(serverssl), expectednid))
5161 goto end;
5162
5163 if (!TEST_ptr((origsess = SSL_get1_session(clientssl))))
5164 goto end;
5165
5166 SSL_shutdown(clientssl);
5167 SSL_shutdown(serverssl);
5168 SSL_free(serverssl);
5169 SSL_free(clientssl);
5170 serverssl = clientssl = NULL;
5171
5172 /* First resumption attempt; use the same config as initial handshake */
5173 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5174 NULL, NULL))
5175 || !TEST_true(SSL_set_session(clientssl, origsess))
5176 || !TEST_true(set_ssl_groups(serverssl, clientssl, clientmulti,
5177 isecdhe, idx)))
5178 goto end;
5179
5180 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5181 || !TEST_true(SSL_session_reused(clientssl)))
5182 goto end;
5183
5184 /* Still had better agree, since nothing changed... */
5185 if (!TEST_uint_eq(SSL_get_negotiated_group(clientssl), expectednid)
5186 || !TEST_uint_eq(SSL_get_negotiated_group(serverssl), expectednid))
5187 goto end;
5188
5189 SSL_shutdown(clientssl);
5190 SSL_shutdown(serverssl);
5191 SSL_free(serverssl);
5192 SSL_free(clientssl);
5193 serverssl = clientssl = NULL;
5194
5195 /*-
5196 * Second resumption attempt
5197 * The party that picks one group changes it, which we effectuate by
5198 * changing 'idx' and updating what we expect.
5199 */
5200 if (idx == 0)
5201 idx = 1;
5202 else
5203 idx--;
5204 if (istls13) {
5205 if (isecdhe)
5206 expectednid = ecdhe_kexch_groups[idx];
5207 else
5208 expectednid = ffdhe_kexch_groups[idx];
5209 /* Verify that we are changing what we expect. */
5210 if (!TEST_int_ne(expectednid, kexch_alg))
5211 goto end;
5212 } else {
5213 /* TLS 1.2 only supports named groups for ECDHE. */
5214 if (isecdhe)
5215 expectednid = kexch_alg;
5216 else
5217 expectednid = 0;
5218 }
5219 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5220 NULL, NULL))
5221 || !TEST_true(SSL_set_session(clientssl, origsess))
5222 || !TEST_true(set_ssl_groups(serverssl, clientssl, clientmulti,
5223 isecdhe, idx)))
5224 goto end;
5225
5226 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5227 || !TEST_true(SSL_session_reused(clientssl)))
5228 goto end;
5229
5230 /* Check that we get what we expected */
5231 if (!TEST_uint_eq(SSL_get_negotiated_group(clientssl), expectednid)
5232 || !TEST_uint_eq(SSL_get_negotiated_group(serverssl), expectednid))
5233 goto end;
5234
5235 testresult = 1;
5236 end:
5237 SSL_free(serverssl);
5238 SSL_free(clientssl);
5239 SSL_CTX_free(sctx);
5240 SSL_CTX_free(cctx);
5241 SSL_SESSION_free(origsess);
5242 return testresult;
5243 }
5244 # endif /* !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_DH) */
5245
5246 /*
5247 * Test TLSv1.3 Cipher Suite
5248 * Test 0 = Set TLS1.3 cipher on context
5249 * Test 1 = Set TLS1.3 cipher on SSL
5250 * Test 2 = Set TLS1.3 and TLS1.2 cipher on context
5251 * Test 3 = Set TLS1.3 and TLS1.2 cipher on SSL
5252 */
5253 static int test_tls13_ciphersuite(int idx)
5254 {
5255 SSL_CTX *sctx = NULL, *cctx = NULL;
5256 SSL *serverssl = NULL, *clientssl = NULL;
5257 static const struct {
5258 const char *ciphername;
5259 int fipscapable;
5260 int low_security;
5261 } t13_ciphers[] = {
5262 { TLS1_3_RFC_AES_128_GCM_SHA256, 1, 0 },
5263 { TLS1_3_RFC_AES_256_GCM_SHA384, 1, 0 },
5264 { TLS1_3_RFC_AES_128_CCM_SHA256, 1, 0 },
5265 # if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
5266 { TLS1_3_RFC_CHACHA20_POLY1305_SHA256, 0, 0 },
5267 { TLS1_3_RFC_AES_256_GCM_SHA384
5268 ":" TLS1_3_RFC_CHACHA20_POLY1305_SHA256, 0, 0 },
5269 # endif
5270 /* CCM8 ciphers are considered low security due to their short tag */
5271 { TLS1_3_RFC_AES_128_CCM_8_SHA256
5272 ":" TLS1_3_RFC_AES_128_CCM_SHA256, 1, 1 }
5273 };
5274 const char *t13_cipher = NULL;
5275 const char *t12_cipher = NULL;
5276 const char *negotiated_scipher;
5277 const char *negotiated_ccipher;
5278 int set_at_ctx = 0;
5279 int set_at_ssl = 0;
5280 int testresult = 0;
5281 int max_ver;
5282 size_t i;
5283
5284 switch (idx) {
5285 case 0:
5286 set_at_ctx = 1;
5287 break;
5288 case 1:
5289 set_at_ssl = 1;
5290 break;
5291 case 2:
5292 set_at_ctx = 1;
5293 t12_cipher = TLS1_TXT_RSA_WITH_AES_128_SHA256;
5294 break;
5295 case 3:
5296 set_at_ssl = 1;
5297 t12_cipher = TLS1_TXT_RSA_WITH_AES_128_SHA256;
5298 break;
5299 }
5300
5301 for (max_ver = TLS1_2_VERSION; max_ver <= TLS1_3_VERSION; max_ver++) {
5302 # ifdef OPENSSL_NO_TLS1_2
5303 if (max_ver == TLS1_2_VERSION)
5304 continue;
5305 # endif
5306 for (i = 0; i < OSSL_NELEM(t13_ciphers); i++) {
5307 if (is_fips && !t13_ciphers[i].fipscapable)
5308 continue;
5309 t13_cipher = t13_ciphers[i].ciphername;
5310 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5311 TLS_client_method(),
5312 TLS1_VERSION, max_ver,
5313 &sctx, &cctx, cert, privkey)))
5314 goto end;
5315
5316 if (t13_ciphers[i].low_security) {
5317 SSL_CTX_set_security_level(sctx, 0);
5318 SSL_CTX_set_security_level(cctx, 0);
5319 }
5320
5321 if (set_at_ctx) {
5322 if (!TEST_true(SSL_CTX_set_ciphersuites(sctx, t13_cipher))
5323 || !TEST_true(SSL_CTX_set_ciphersuites(cctx, t13_cipher)))
5324 goto end;
5325 if (t12_cipher != NULL) {
5326 if (!TEST_true(SSL_CTX_set_cipher_list(sctx, t12_cipher))
5327 || !TEST_true(SSL_CTX_set_cipher_list(cctx,
5328 t12_cipher)))
5329 goto end;
5330 }
5331 }
5332
5333 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5334 &clientssl, NULL, NULL)))
5335 goto end;
5336
5337 if (set_at_ssl) {
5338 if (!TEST_true(SSL_set_ciphersuites(serverssl, t13_cipher))
5339 || !TEST_true(SSL_set_ciphersuites(clientssl, t13_cipher)))
5340 goto end;
5341 if (t12_cipher != NULL) {
5342 if (!TEST_true(SSL_set_cipher_list(serverssl, t12_cipher))
5343 || !TEST_true(SSL_set_cipher_list(clientssl,
5344 t12_cipher)))
5345 goto end;
5346 }
5347 }
5348
5349 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
5350 SSL_ERROR_NONE)))
5351 goto end;
5352
5353 negotiated_scipher = SSL_CIPHER_get_name(SSL_get_current_cipher(
5354 serverssl));
5355 negotiated_ccipher = SSL_CIPHER_get_name(SSL_get_current_cipher(
5356 clientssl));
5357 if (!TEST_str_eq(negotiated_scipher, negotiated_ccipher))
5358 goto end;
5359
5360 /*
5361 * TEST_strn_eq is used below because t13_cipher can contain
5362 * multiple ciphersuites
5363 */
5364 if (max_ver == TLS1_3_VERSION
5365 && !TEST_strn_eq(t13_cipher, negotiated_scipher,
5366 strlen(negotiated_scipher)))
5367 goto end;
5368
5369 # ifndef OPENSSL_NO_TLS1_2
5370 /* Below validation is not done when t12_cipher is NULL */
5371 if (max_ver == TLS1_2_VERSION && t12_cipher != NULL
5372 && !TEST_str_eq(t12_cipher, negotiated_scipher))
5373 goto end;
5374 # endif
5375
5376 SSL_free(serverssl);
5377 serverssl = NULL;
5378 SSL_free(clientssl);
5379 clientssl = NULL;
5380 SSL_CTX_free(sctx);
5381 sctx = NULL;
5382 SSL_CTX_free(cctx);
5383 cctx = NULL;
5384 }
5385 }
5386
5387 testresult = 1;
5388 end:
5389 SSL_free(serverssl);
5390 SSL_free(clientssl);
5391 SSL_CTX_free(sctx);
5392 SSL_CTX_free(cctx);
5393 return testresult;
5394 }
5395
5396 /*
5397 * Test TLSv1.3 PSKs
5398 * Test 0 = Test new style callbacks
5399 * Test 1 = Test both new and old style callbacks
5400 * Test 2 = Test old style callbacks
5401 * Test 3 = Test old style callbacks with no certificate
5402 */
5403 static int test_tls13_psk(int idx)
5404 {
5405 SSL_CTX *sctx = NULL, *cctx = NULL;
5406 SSL *serverssl = NULL, *clientssl = NULL;
5407 const SSL_CIPHER *cipher = NULL;
5408 const unsigned char key[] = {
5409 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
5410 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
5411 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
5412 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
5413 };
5414 int testresult = 0;
5415
5416 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5417 TLS_client_method(), TLS1_VERSION, 0,
5418 &sctx, &cctx, idx == 3 ? NULL : cert,
5419 idx == 3 ? NULL : privkey)))
5420 goto end;
5421
5422 if (idx != 3) {
5423 /*
5424 * We use a ciphersuite with SHA256 to ease testing old style PSK
5425 * callbacks which will always default to SHA256. This should not be
5426 * necessary if we have no cert/priv key. In that case the server should
5427 * prefer SHA256 automatically.
5428 */
5429 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
5430 "TLS_AES_128_GCM_SHA256")))
5431 goto end;
5432 } else {
5433 /*
5434 * As noted above the server should prefer SHA256 automatically. However
5435 * we are careful not to offer TLS_CHACHA20_POLY1305_SHA256 so this same
5436 * code works even if we are testing with only the FIPS provider loaded.
5437 */
5438 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
5439 "TLS_AES_256_GCM_SHA384:"
5440 "TLS_AES_128_GCM_SHA256")))
5441 goto end;
5442 }
5443
5444 /*
5445 * Test 0: New style callbacks only
5446 * Test 1: New and old style callbacks (only the new ones should be used)
5447 * Test 2: Old style callbacks only
5448 */
5449 if (idx == 0 || idx == 1) {
5450 SSL_CTX_set_psk_use_session_callback(cctx, use_session_cb);
5451 SSL_CTX_set_psk_find_session_callback(sctx, find_session_cb);
5452 }
5453 #ifndef OPENSSL_NO_PSK
5454 if (idx >= 1) {
5455 SSL_CTX_set_psk_client_callback(cctx, psk_client_cb);
5456 SSL_CTX_set_psk_server_callback(sctx, psk_server_cb);
5457 }
5458 #endif
5459 srvid = pskid;
5460 use_session_cb_cnt = 0;
5461 find_session_cb_cnt = 0;
5462 psk_client_cb_cnt = 0;
5463 psk_server_cb_cnt = 0;
5464
5465 if (idx != 3) {
5466 /*
5467 * Check we can create a connection if callback decides not to send a
5468 * PSK
5469 */
5470 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5471 NULL, NULL))
5472 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5473 SSL_ERROR_NONE))
5474 || !TEST_false(SSL_session_reused(clientssl))
5475 || !TEST_false(SSL_session_reused(serverssl)))
5476 goto end;
5477
5478 if (idx == 0 || idx == 1) {
5479 if (!TEST_true(use_session_cb_cnt == 1)
5480 || !TEST_true(find_session_cb_cnt == 0)
5481 /*
5482 * If no old style callback then below should be 0
5483 * otherwise 1
5484 */
5485 || !TEST_true(psk_client_cb_cnt == idx)
5486 || !TEST_true(psk_server_cb_cnt == 0))
5487 goto end;
5488 } else {
5489 if (!TEST_true(use_session_cb_cnt == 0)
5490 || !TEST_true(find_session_cb_cnt == 0)
5491 || !TEST_true(psk_client_cb_cnt == 1)
5492 || !TEST_true(psk_server_cb_cnt == 0))
5493 goto end;
5494 }
5495
5496 shutdown_ssl_connection(serverssl, clientssl);
5497 serverssl = clientssl = NULL;
5498 use_session_cb_cnt = psk_client_cb_cnt = 0;
5499 }
5500
5501 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5502 NULL, NULL)))
5503 goto end;
5504
5505 /* Create the PSK */
5506 cipher = SSL_CIPHER_find(clientssl, TLS13_AES_128_GCM_SHA256_BYTES);
5507 clientpsk = SSL_SESSION_new();
5508 if (!TEST_ptr(clientpsk)
5509 || !TEST_ptr(cipher)
5510 || !TEST_true(SSL_SESSION_set1_master_key(clientpsk, key,
5511 sizeof(key)))
5512 || !TEST_true(SSL_SESSION_set_cipher(clientpsk, cipher))
5513 || !TEST_true(SSL_SESSION_set_protocol_version(clientpsk,
5514 TLS1_3_VERSION))
5515 || !TEST_true(SSL_SESSION_up_ref(clientpsk)))
5516 goto end;
5517 serverpsk = clientpsk;
5518
5519 /* Check we can create a connection and the PSK is used */
5520 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5521 || !TEST_true(SSL_session_reused(clientssl))
5522 || !TEST_true(SSL_session_reused(serverssl)))
5523 goto end;
5524
5525 if (idx == 0 || idx == 1) {
5526 if (!TEST_true(use_session_cb_cnt == 1)
5527 || !TEST_true(find_session_cb_cnt == 1)
5528 || !TEST_true(psk_client_cb_cnt == 0)
5529 || !TEST_true(psk_server_cb_cnt == 0))
5530 goto end;
5531 } else {
5532 if (!TEST_true(use_session_cb_cnt == 0)
5533 || !TEST_true(find_session_cb_cnt == 0)
5534 || !TEST_true(psk_client_cb_cnt == 1)
5535 || !TEST_true(psk_server_cb_cnt == 1))
5536 goto end;
5537 }
5538
5539 shutdown_ssl_connection(serverssl, clientssl);
5540 serverssl = clientssl = NULL;
5541 use_session_cb_cnt = find_session_cb_cnt = 0;
5542 psk_client_cb_cnt = psk_server_cb_cnt = 0;
5543
5544 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5545 NULL, NULL)))
5546 goto end;
5547
5548 /* Force an HRR */
5549 #if defined(OPENSSL_NO_EC)
5550 if (!TEST_true(SSL_set1_groups_list(serverssl, "ffdhe3072")))
5551 goto end;
5552 #else
5553 if (!TEST_true(SSL_set1_groups_list(serverssl, "P-384")))
5554 goto end;
5555 #endif
5556
5557 /*
5558 * Check we can create a connection, the PSK is used and the callbacks are
5559 * called twice.
5560 */
5561 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5562 || !TEST_true(SSL_session_reused(clientssl))
5563 || !TEST_true(SSL_session_reused(serverssl)))
5564 goto end;
5565
5566 if (idx == 0 || idx == 1) {
5567 if (!TEST_true(use_session_cb_cnt == 2)
5568 || !TEST_true(find_session_cb_cnt == 2)
5569 || !TEST_true(psk_client_cb_cnt == 0)
5570 || !TEST_true(psk_server_cb_cnt == 0))
5571 goto end;
5572 } else {
5573 if (!TEST_true(use_session_cb_cnt == 0)
5574 || !TEST_true(find_session_cb_cnt == 0)
5575 || !TEST_true(psk_client_cb_cnt == 2)
5576 || !TEST_true(psk_server_cb_cnt == 2))
5577 goto end;
5578 }
5579
5580 shutdown_ssl_connection(serverssl, clientssl);
5581 serverssl = clientssl = NULL;
5582 use_session_cb_cnt = find_session_cb_cnt = 0;
5583 psk_client_cb_cnt = psk_server_cb_cnt = 0;
5584
5585 if (idx != 3) {
5586 /*
5587 * Check that if the server rejects the PSK we can still connect, but with
5588 * a full handshake
5589 */
5590 srvid = "Dummy Identity";
5591 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5592 NULL, NULL))
5593 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5594 SSL_ERROR_NONE))
5595 || !TEST_false(SSL_session_reused(clientssl))
5596 || !TEST_false(SSL_session_reused(serverssl)))
5597 goto end;
5598
5599 if (idx == 0 || idx == 1) {
5600 if (!TEST_true(use_session_cb_cnt == 1)
5601 || !TEST_true(find_session_cb_cnt == 1)
5602 || !TEST_true(psk_client_cb_cnt == 0)
5603 /*
5604 * If no old style callback then below should be 0
5605 * otherwise 1
5606 */
5607 || !TEST_true(psk_server_cb_cnt == idx))
5608 goto end;
5609 } else {
5610 if (!TEST_true(use_session_cb_cnt == 0)
5611 || !TEST_true(find_session_cb_cnt == 0)
5612 || !TEST_true(psk_client_cb_cnt == 1)
5613 || !TEST_true(psk_server_cb_cnt == 1))
5614 goto end;
5615 }
5616
5617 shutdown_ssl_connection(serverssl, clientssl);
5618 serverssl = clientssl = NULL;
5619 }
5620 testresult = 1;
5621
5622 end:
5623 SSL_SESSION_free(clientpsk);
5624 SSL_SESSION_free(serverpsk);
5625 clientpsk = serverpsk = NULL;
5626 SSL_free(serverssl);
5627 SSL_free(clientssl);
5628 SSL_CTX_free(sctx);
5629 SSL_CTX_free(cctx);
5630 return testresult;
5631 }
5632
5633 #ifndef OSSL_NO_USABLE_TLS1_3
5634 /*
5635 * Test TLS1.3 connection establishment succeeds with various configurations of
5636 * the options `SSL_OP_ALLOW_NO_DHE_KEX` and `SSL_OP_PREFER_NO_DHE_KEX`.
5637 * The verification of whether the right KEX mode is chosen is not covered by
5638 * this test but by `test_tls13kexmodes`.
5639 *
5640 * Tests (idx & 1): Server has `SSL_OP_ALLOW_NO_DHE_KEX` set.
5641 * Tests (idx & 2): Server has `SSL_OP_PREFER_NO_DHE_KEX` set.
5642 * Tests (idx & 4): Client has `SSL_OP_ALLOW_NO_DHE_KEX` set.
5643 */
5644 static int test_tls13_no_dhe_kex(const int idx)
5645 {
5646 SSL_CTX *sctx = NULL, *cctx = NULL;
5647 SSL *serverssl = NULL, *clientssl = NULL;
5648 int testresult = 0;
5649 size_t j;
5650 SSL_SESSION *saved_session;
5651
5652 int server_allow_no_dhe = (idx & 1) != 0;
5653 int server_prefer_no_dhe = (idx & 2) != 0;
5654 int client_allow_no_dhe = (idx & 4) != 0;
5655
5656 uint64_t server_options = 0
5657 | (server_allow_no_dhe ? SSL_OP_ALLOW_NO_DHE_KEX : 0)
5658 | (server_prefer_no_dhe ? SSL_OP_PREFER_NO_DHE_KEX : 0);
5659
5660 uint64_t client_options = 0
5661 | (client_allow_no_dhe ? SSL_OP_ALLOW_NO_DHE_KEX : 0);
5662
5663 new_called = 0;
5664 do_cache = 1;
5665
5666 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5667 TLS_client_method(), TLS1_3_VERSION, 0,
5668 &sctx, &cctx, cert, privkey)))
5669 goto end;
5670
5671 SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT
5672 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
5673
5674 SSL_CTX_set_options(sctx, server_options);
5675 SSL_CTX_set_options(cctx, client_options);
5676
5677 SSL_CTX_sess_set_new_cb(cctx, new_cachesession_cb);
5678
5679 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5680 &clientssl, NULL, NULL)))
5681 goto end;
5682
5683 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
5684 SSL_ERROR_NONE))
5685 /* Check we got the number of tickets we were expecting */
5686 || !TEST_int_eq(2, new_called))
5687 goto end;
5688
5689 /* We'll reuse the last ticket. */
5690 saved_session = sesscache[new_called - 1];
5691
5692 SSL_shutdown(clientssl);
5693 SSL_shutdown(serverssl);
5694 SSL_free(serverssl);
5695 SSL_free(clientssl);
5696 SSL_CTX_free(cctx);
5697 clientssl = serverssl = NULL;
5698 cctx = NULL;
5699
5700 /*
5701 * Now we resume with the last ticket we created.
5702 */
5703
5704 /* The server context already exists, so we only create the client. */
5705 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5706 TLS_client_method(), TLS1_3_VERSION, 0,
5707 NULL, &cctx, cert, privkey)))
5708 goto end;
5709
5710 SSL_CTX_set_options(cctx, client_options);
5711
5712 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5713 &clientssl, NULL, NULL))
5714 || !TEST_true(SSL_set_session(clientssl, saved_session)))
5715 goto end;
5716
5717 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
5718 SSL_ERROR_NONE)))
5719 goto end;
5720
5721 /*
5722 * Make sure, the session was resumed.
5723 */
5724 if (!TEST_true(SSL_session_reused(clientssl)))
5725 goto end;
5726
5727 SSL_shutdown(clientssl);
5728 SSL_shutdown(serverssl);
5729
5730 testresult = 1;
5731
5732 end:
5733 SSL_free(serverssl);
5734 SSL_free(clientssl);
5735 for (j = 0; j < OSSL_NELEM(sesscache); j++) {
5736 SSL_SESSION_free(sesscache[j]);
5737 sesscache[j] = NULL;
5738 }
5739 SSL_CTX_free(sctx);
5740 SSL_CTX_free(cctx);
5741
5742 return testresult;
5743 }
5744 #endif /* OSSL_NO_USABLE_TLS1_3 */
5745
5746 static unsigned char cookie_magic_value[] = "cookie magic";
5747
5748 static int generate_cookie_callback(SSL *ssl, unsigned char *cookie,
5749 unsigned int *cookie_len)
5750 {
5751 /*
5752 * Not suitable as a real cookie generation function but good enough for
5753 * testing!
5754 */
5755 memcpy(cookie, cookie_magic_value, sizeof(cookie_magic_value) - 1);
5756 *cookie_len = sizeof(cookie_magic_value) - 1;
5757
5758 return 1;
5759 }
5760
5761 static int verify_cookie_callback(SSL *ssl, const unsigned char *cookie,
5762 unsigned int cookie_len)
5763 {
5764 if (cookie_len == sizeof(cookie_magic_value) - 1
5765 && memcmp(cookie, cookie_magic_value, cookie_len) == 0)
5766 return 1;
5767
5768 return 0;
5769 }
5770
5771 static int generate_stateless_cookie_callback(SSL *ssl, unsigned char *cookie,
5772 size_t *cookie_len)
5773 {
5774 unsigned int temp;
5775 int res = generate_cookie_callback(ssl, cookie, &temp);
5776 *cookie_len = temp;
5777 return res;
5778 }
5779
5780 static int verify_stateless_cookie_callback(SSL *ssl, const unsigned char *cookie,
5781 size_t cookie_len)
5782 {
5783 return verify_cookie_callback(ssl, cookie, cookie_len);
5784 }
5785
5786 static int test_stateless(void)
5787 {
5788 SSL_CTX *sctx = NULL, *cctx = NULL;
5789 SSL *serverssl = NULL, *clientssl = NULL;
5790 int testresult = 0;
5791
5792 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5793 TLS_client_method(), TLS1_VERSION, 0,
5794 &sctx, &cctx, cert, privkey)))
5795 goto end;
5796
5797 /* The arrival of CCS messages can confuse the test */
5798 SSL_CTX_clear_options(cctx, SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
5799
5800 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5801 NULL, NULL))
5802 /* Send the first ClientHello */
5803 || !TEST_false(create_ssl_connection(serverssl, clientssl,
5804 SSL_ERROR_WANT_READ))
5805 /*
5806 * This should fail with a -1 return because we have no callbacks
5807 * set up
5808 */
5809 || !TEST_int_eq(SSL_stateless(serverssl), -1))
5810 goto end;
5811
5812 /* Fatal error so abandon the connection from this client */
5813 SSL_free(clientssl);
5814 clientssl = NULL;
5815
5816 /* Set up the cookie generation and verification callbacks */
5817 SSL_CTX_set_stateless_cookie_generate_cb(sctx, generate_stateless_cookie_callback);
5818 SSL_CTX_set_stateless_cookie_verify_cb(sctx, verify_stateless_cookie_callback);
5819
5820 /*
5821 * Create a new connection from the client (we can reuse the server SSL
5822 * object).
5823 */
5824 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5825 NULL, NULL))
5826 /* Send the first ClientHello */
5827 || !TEST_false(create_ssl_connection(serverssl, clientssl,
5828 SSL_ERROR_WANT_READ))
5829 /* This should fail because there is no cookie */
5830 || !TEST_int_eq(SSL_stateless(serverssl), 0))
5831 goto end;
5832
5833 /* Abandon the connection from this client */
5834 SSL_free(clientssl);
5835 clientssl = NULL;
5836
5837 /*
5838 * Now create a connection from a new client but with the same server SSL
5839 * object
5840 */
5841 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5842 NULL, NULL))
5843 /* Send the first ClientHello */
5844 || !TEST_false(create_ssl_connection(serverssl, clientssl,
5845 SSL_ERROR_WANT_READ))
5846 /* This should fail because there is no cookie */
5847 || !TEST_int_eq(SSL_stateless(serverssl), 0)
5848 /* Send the second ClientHello */
5849 || !TEST_false(create_ssl_connection(serverssl, clientssl,
5850 SSL_ERROR_WANT_READ))
5851 /* This should succeed because a cookie is now present */
5852 || !TEST_int_eq(SSL_stateless(serverssl), 1)
5853 /* Complete the connection */
5854 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5855 SSL_ERROR_NONE)))
5856 goto end;
5857
5858 shutdown_ssl_connection(serverssl, clientssl);
5859 serverssl = clientssl = NULL;
5860 testresult = 1;
5861
5862 end:
5863 SSL_free(serverssl);
5864 SSL_free(clientssl);
5865 SSL_CTX_free(sctx);
5866 SSL_CTX_free(cctx);
5867 return testresult;
5868
5869 }
5870 #endif /* OSSL_NO_USABLE_TLS1_3 */
5871
5872 static int clntaddoldcb = 0;
5873 static int clntparseoldcb = 0;
5874 static int srvaddoldcb = 0;
5875 static int srvparseoldcb = 0;
5876 static int clntaddnewcb = 0;
5877 static int clntparsenewcb = 0;
5878 static int srvaddnewcb = 0;
5879 static int srvparsenewcb = 0;
5880 static int snicb = 0;
5881
5882 #define TEST_EXT_TYPE1 0xff00
5883
5884 static int old_add_cb(SSL *s, unsigned int ext_type, const unsigned char **out,
5885 size_t *outlen, int *al, void *add_arg)
5886 {
5887 int *server = (int *)add_arg;
5888 unsigned char *data;
5889
5890 if (SSL_is_server(s))
5891 srvaddoldcb++;
5892 else
5893 clntaddoldcb++;
5894
5895 if (*server != SSL_is_server(s)
5896 || (data = OPENSSL_malloc(sizeof(*data))) == NULL)
5897 return -1;
5898
5899 *data = 1;
5900 *out = data;
5901 *outlen = sizeof(char);
5902 return 1;
5903 }
5904
5905 static void old_free_cb(SSL *s, unsigned int ext_type, const unsigned char *out,
5906 void *add_arg)
5907 {
5908 OPENSSL_free((unsigned char *)out);
5909 }
5910
5911 static int old_parse_cb(SSL *s, unsigned int ext_type, const unsigned char *in,
5912 size_t inlen, int *al, void *parse_arg)
5913 {
5914 int *server = (int *)parse_arg;
5915
5916 if (SSL_is_server(s))
5917 srvparseoldcb++;
5918 else
5919 clntparseoldcb++;
5920
5921 if (*server != SSL_is_server(s)
5922 || inlen != sizeof(char)
5923 || *in != 1)
5924 return -1;
5925
5926 return 1;
5927 }
5928
5929 static int new_add_cb(SSL *s, unsigned int ext_type, unsigned int context,
5930 const unsigned char **out, size_t *outlen, X509 *x,
5931 size_t chainidx, int *al, void *add_arg)
5932 {
5933 int *server = (int *)add_arg;
5934 unsigned char *data;
5935
5936 if (SSL_is_server(s))
5937 srvaddnewcb++;
5938 else
5939 clntaddnewcb++;
5940
5941 if (*server != SSL_is_server(s)
5942 || (data = OPENSSL_malloc(sizeof(*data))) == NULL)
5943 return -1;
5944
5945 *data = 1;
5946 *out = data;
5947 *outlen = sizeof(*data);
5948 return 1;
5949 }
5950
5951 static void new_free_cb(SSL *s, unsigned int ext_type, unsigned int context,
5952 const unsigned char *out, void *add_arg)
5953 {
5954 OPENSSL_free((unsigned char *)out);
5955 }
5956
5957 static int new_parse_cb(SSL *s, unsigned int ext_type, unsigned int context,
5958 const unsigned char *in, size_t inlen, X509 *x,
5959 size_t chainidx, int *al, void *parse_arg)
5960 {
5961 int *server = (int *)parse_arg;
5962
5963 if (SSL_is_server(s))
5964 srvparsenewcb++;
5965 else
5966 clntparsenewcb++;
5967
5968 if (*server != SSL_is_server(s)
5969 || inlen != sizeof(char) || *in != 1)
5970 return -1;
5971
5972 return 1;
5973 }
5974
5975 static int sni_cb(SSL *s, int *al, void *arg)
5976 {
5977 SSL_CTX *ctx = (SSL_CTX *)arg;
5978
5979 if (SSL_set_SSL_CTX(s, ctx) == NULL) {
5980 *al = SSL_AD_INTERNAL_ERROR;
5981 return SSL_TLSEXT_ERR_ALERT_FATAL;
5982 }
5983 snicb++;
5984 return SSL_TLSEXT_ERR_OK;
5985 }
5986
5987 static int verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx)
5988 {
5989 return 1;
5990 }
5991
5992 /*
5993 * Custom call back tests.
5994 * Test 0: Old style callbacks in TLSv1.2
5995 * Test 1: New style callbacks in TLSv1.2
5996 * Test 2: New style callbacks in TLSv1.2 with SNI
5997 * Test 3: New style callbacks in TLSv1.3. Extensions in CH and EE
5998 * Test 4: New style callbacks in TLSv1.3. Extensions in CH, SH, EE, Cert + NST
5999 * Test 5: New style callbacks in TLSv1.3. Extensions in CR + Client Cert
6000 */
6001 static int test_custom_exts(int tst)
6002 {
6003 SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
6004 SSL *clientssl = NULL, *serverssl = NULL;
6005 int testresult = 0;
6006 static int server = 1;
6007 static int client = 0;
6008 SSL_SESSION *sess = NULL;
6009 unsigned int context;
6010
6011 #if defined(OPENSSL_NO_TLS1_2) && !defined(OSSL_NO_USABLE_TLS1_3)
6012 /* Skip tests for TLSv1.2 and below in this case */
6013 if (tst < 3)
6014 return 1;
6015 #endif
6016
6017 /* Reset callback counters */
6018 clntaddoldcb = clntparseoldcb = srvaddoldcb = srvparseoldcb = 0;
6019 clntaddnewcb = clntparsenewcb = srvaddnewcb = srvparsenewcb = 0;
6020 snicb = 0;
6021
6022 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6023 TLS_client_method(), TLS1_VERSION, 0,
6024 &sctx, &cctx, cert, privkey)))
6025 goto end;
6026
6027 if (tst == 2
6028 && !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), NULL,
6029 TLS1_VERSION, 0,
6030 &sctx2, NULL, cert, privkey)))
6031 goto end;
6032
6033
6034 if (tst < 3) {
6035 SSL_CTX_set_options(cctx, SSL_OP_NO_TLSv1_3);
6036 SSL_CTX_set_options(sctx, SSL_OP_NO_TLSv1_3);
6037 if (sctx2 != NULL)
6038 SSL_CTX_set_options(sctx2, SSL_OP_NO_TLSv1_3);
6039 }
6040
6041 if (tst == 5) {
6042 context = SSL_EXT_TLS1_3_CERTIFICATE_REQUEST
6043 | SSL_EXT_TLS1_3_CERTIFICATE;
6044 SSL_CTX_set_verify(sctx,
6045 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
6046 verify_cb);
6047 if (!TEST_int_eq(SSL_CTX_use_certificate_file(cctx, cert,
6048 SSL_FILETYPE_PEM), 1)
6049 || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(cctx, privkey,
6050 SSL_FILETYPE_PEM), 1)
6051 || !TEST_int_eq(SSL_CTX_check_private_key(cctx), 1))
6052 goto end;
6053 } else if (tst == 4) {
6054 context = SSL_EXT_CLIENT_HELLO
6055 | SSL_EXT_TLS1_2_SERVER_HELLO
6056 | SSL_EXT_TLS1_3_SERVER_HELLO
6057 | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS
6058 | SSL_EXT_TLS1_3_CERTIFICATE
6059 | SSL_EXT_TLS1_3_NEW_SESSION_TICKET;
6060 } else {
6061 context = SSL_EXT_CLIENT_HELLO
6062 | SSL_EXT_TLS1_2_SERVER_HELLO
6063 | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS;
6064 }
6065
6066 /* Create a client side custom extension */
6067 if (tst == 0) {
6068 if (!TEST_true(SSL_CTX_add_client_custom_ext(cctx, TEST_EXT_TYPE1,
6069 old_add_cb, old_free_cb,
6070 &client, old_parse_cb,
6071 &client)))
6072 goto end;
6073 } else {
6074 if (!TEST_true(SSL_CTX_add_custom_ext(cctx, TEST_EXT_TYPE1, context,
6075 new_add_cb, new_free_cb,
6076 &client, new_parse_cb, &client)))
6077 goto end;
6078 }
6079
6080 /* Should not be able to add duplicates */
6081 if (!TEST_false(SSL_CTX_add_client_custom_ext(cctx, TEST_EXT_TYPE1,
6082 old_add_cb, old_free_cb,
6083 &client, old_parse_cb,
6084 &client))
6085 || !TEST_false(SSL_CTX_add_custom_ext(cctx, TEST_EXT_TYPE1,
6086 context, new_add_cb,
6087 new_free_cb, &client,
6088 new_parse_cb, &client)))
6089 goto end;
6090
6091 /* Create a server side custom extension */
6092 if (tst == 0) {
6093 if (!TEST_true(SSL_CTX_add_server_custom_ext(sctx, TEST_EXT_TYPE1,
6094 old_add_cb, old_free_cb,
6095 &server, old_parse_cb,
6096 &server)))
6097 goto end;
6098 } else {
6099 if (!TEST_true(SSL_CTX_add_custom_ext(sctx, TEST_EXT_TYPE1, context,
6100 new_add_cb, new_free_cb,
6101 &server, new_parse_cb, &server)))
6102 goto end;
6103 if (sctx2 != NULL
6104 && !TEST_true(SSL_CTX_add_custom_ext(sctx2, TEST_EXT_TYPE1,
6105 context, new_add_cb,
6106 new_free_cb, &server,
6107 new_parse_cb, &server)))
6108 goto end;
6109 }
6110
6111 /* Should not be able to add duplicates */
6112 if (!TEST_false(SSL_CTX_add_server_custom_ext(sctx, TEST_EXT_TYPE1,
6113 old_add_cb, old_free_cb,
6114 &server, old_parse_cb,
6115 &server))
6116 || !TEST_false(SSL_CTX_add_custom_ext(sctx, TEST_EXT_TYPE1,
6117 context, new_add_cb,
6118 new_free_cb, &server,
6119 new_parse_cb, &server)))
6120 goto end;
6121
6122 if (tst == 2) {
6123 /* Set up SNI */
6124 if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
6125 || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
6126 goto end;
6127 }
6128
6129 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
6130 &clientssl, NULL, NULL))
6131 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6132 SSL_ERROR_NONE)))
6133 goto end;
6134
6135 if (tst == 0) {
6136 if (clntaddoldcb != 1
6137 || clntparseoldcb != 1
6138 || srvaddoldcb != 1
6139 || srvparseoldcb != 1)
6140 goto end;
6141 } else if (tst == 1 || tst == 2 || tst == 3) {
6142 if (clntaddnewcb != 1
6143 || clntparsenewcb != 1
6144 || srvaddnewcb != 1
6145 || srvparsenewcb != 1
6146 || (tst != 2 && snicb != 0)
6147 || (tst == 2 && snicb != 1))
6148 goto end;
6149 } else if (tst == 5) {
6150 if (clntaddnewcb != 1
6151 || clntparsenewcb != 1
6152 || srvaddnewcb != 1
6153 || srvparsenewcb != 1)
6154 goto end;
6155 } else {
6156 /* In this case there 2 NewSessionTicket messages created */
6157 if (clntaddnewcb != 1
6158 || clntparsenewcb != 5
6159 || srvaddnewcb != 5
6160 || srvparsenewcb != 1)
6161 goto end;
6162 }
6163
6164 sess = SSL_get1_session(clientssl);
6165 SSL_shutdown(clientssl);
6166 SSL_shutdown(serverssl);
6167 SSL_free(serverssl);
6168 SSL_free(clientssl);
6169 serverssl = clientssl = NULL;
6170
6171 if (tst == 3 || tst == 5) {
6172 /* We don't bother with the resumption aspects for these tests */
6173 testresult = 1;
6174 goto end;
6175 }
6176
6177 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6178 NULL, NULL))
6179 || !TEST_true(SSL_set_session(clientssl, sess))
6180 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6181 SSL_ERROR_NONE)))
6182 goto end;
6183
6184 /*
6185 * For a resumed session we expect to add the ClientHello extension. For the
6186 * old style callbacks we ignore it on the server side because they set
6187 * SSL_EXT_IGNORE_ON_RESUMPTION. The new style callbacks do not ignore
6188 * them.
6189 */
6190 if (tst == 0) {
6191 if (clntaddoldcb != 2
6192 || clntparseoldcb != 1
6193 || srvaddoldcb != 1
6194 || srvparseoldcb != 1)
6195 goto end;
6196 } else if (tst == 1 || tst == 2 || tst == 3) {
6197 if (clntaddnewcb != 2
6198 || clntparsenewcb != 2
6199 || srvaddnewcb != 2
6200 || srvparsenewcb != 2)
6201 goto end;
6202 } else {
6203 /*
6204 * No Certificate message extensions in the resumption handshake,
6205 * 2 NewSessionTickets in the initial handshake, 1 in the resumption
6206 */
6207 if (clntaddnewcb != 2
6208 || clntparsenewcb != 8
6209 || srvaddnewcb != 8
6210 || srvparsenewcb != 2)
6211 goto end;
6212 }
6213
6214 testresult = 1;
6215
6216 end:
6217 SSL_SESSION_free(sess);
6218 SSL_free(serverssl);
6219 SSL_free(clientssl);
6220 SSL_CTX_free(sctx2);
6221 SSL_CTX_free(sctx);
6222 SSL_CTX_free(cctx);
6223 return testresult;
6224 }
6225
6226 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OSSL_NO_USABLE_TLS1_3)
6227
6228 #define SYNTHV1CONTEXT (SSL_EXT_TLS1_2_AND_BELOW_ONLY \
6229 | SSL_EXT_CLIENT_HELLO \
6230 | SSL_EXT_TLS1_2_SERVER_HELLO \
6231 | SSL_EXT_IGNORE_ON_RESUMPTION)
6232
6233 #define TLS13CONTEXT (SSL_EXT_TLS1_3_CERTIFICATE \
6234 | SSL_EXT_TLS1_2_SERVER_HELLO \
6235 | SSL_EXT_CLIENT_HELLO)
6236
6237 #define SERVERINFO_CUSTOM \
6238 0x00, (char)TLSEXT_TYPE_signed_certificate_timestamp, \
6239 0x00, 0x03, \
6240 0x04, 0x05, 0x06 \
6241
6242 static const unsigned char serverinfo_custom_tls13[] = {
6243 0x00, 0x00, (TLS13CONTEXT >> 8) & 0xff, TLS13CONTEXT & 0xff,
6244 SERVERINFO_CUSTOM
6245 };
6246 static const unsigned char serverinfo_custom_v2[] = {
6247 0x00, 0x00, (SYNTHV1CONTEXT >> 8) & 0xff, SYNTHV1CONTEXT & 0xff,
6248 SERVERINFO_CUSTOM
6249 };
6250 static const unsigned char serverinfo_custom_v1[] = {
6251 SERVERINFO_CUSTOM
6252 };
6253 static const size_t serverinfo_custom_tls13_len = sizeof(serverinfo_custom_tls13);
6254 static const size_t serverinfo_custom_v2_len = sizeof(serverinfo_custom_v2);
6255 static const size_t serverinfo_custom_v1_len = sizeof(serverinfo_custom_v1);
6256
6257 static int serverinfo_custom_parse_cb(SSL *s, unsigned int ext_type,
6258 unsigned int context,
6259 const unsigned char *in,
6260 size_t inlen, X509 *x,
6261 size_t chainidx, int *al,
6262 void *parse_arg)
6263 {
6264 const size_t len = serverinfo_custom_v1_len;
6265 const unsigned char *si = &serverinfo_custom_v1[len - 3];
6266 int *p_cb_result = (int*)parse_arg;
6267 *p_cb_result = TEST_mem_eq(in, inlen, si, 3);
6268 return 1;
6269 }
6270
6271 static int test_serverinfo_custom(const int idx)
6272 {
6273 SSL_CTX *sctx = NULL, *cctx = NULL;
6274 SSL *clientssl = NULL, *serverssl = NULL;
6275 int testresult = 0;
6276 int cb_result = 0;
6277
6278 /*
6279 * Following variables are set in the switch statement
6280 * according to the test iteration.
6281 * Default values do not make much sense: test would fail with them.
6282 */
6283 int serverinfo_version = 0;
6284 int protocol_version = 0;
6285 unsigned int extension_context = 0;
6286 const unsigned char *si = NULL;
6287 size_t si_len = 0;
6288
6289 const int call_use_serverinfo_ex = idx > 0;
6290 switch (idx) {
6291 case 0: /* FALLTHROUGH */
6292 case 1:
6293 serverinfo_version = SSL_SERVERINFOV1;
6294 protocol_version = TLS1_2_VERSION;
6295 extension_context = SYNTHV1CONTEXT;
6296 si = serverinfo_custom_v1;
6297 si_len = serverinfo_custom_v1_len;
6298 break;
6299 case 2:
6300 serverinfo_version = SSL_SERVERINFOV2;
6301 protocol_version = TLS1_2_VERSION;
6302 extension_context = SYNTHV1CONTEXT;
6303 si = serverinfo_custom_v2;
6304 si_len = serverinfo_custom_v2_len;
6305 break;
6306 case 3:
6307 serverinfo_version = SSL_SERVERINFOV2;
6308 protocol_version = TLS1_3_VERSION;
6309 extension_context = TLS13CONTEXT;
6310 si = serverinfo_custom_tls13;
6311 si_len = serverinfo_custom_tls13_len;
6312 break;
6313 }
6314
6315 if (!TEST_true(create_ssl_ctx_pair(libctx,
6316 TLS_method(),
6317 TLS_method(),
6318 protocol_version,
6319 protocol_version,
6320 &sctx, &cctx, cert, privkey)))
6321 goto end;
6322
6323 if (call_use_serverinfo_ex) {
6324 if (!TEST_true(SSL_CTX_use_serverinfo_ex(sctx, serverinfo_version,
6325 si, si_len)))
6326 goto end;
6327 } else {
6328 if (!TEST_true(SSL_CTX_use_serverinfo(sctx, si, si_len)))
6329 goto end;
6330 }
6331
6332 if (!TEST_true(SSL_CTX_add_custom_ext(cctx, TLSEXT_TYPE_signed_certificate_timestamp,
6333 extension_context,
6334 NULL, NULL, NULL,
6335 serverinfo_custom_parse_cb,
6336 &cb_result))
6337 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6338 NULL, NULL))
6339 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6340 SSL_ERROR_NONE))
6341 || !TEST_int_eq(SSL_do_handshake(clientssl), 1))
6342 goto end;
6343
6344 if (!TEST_true(cb_result))
6345 goto end;
6346
6347 testresult = 1;
6348
6349 end:
6350 SSL_free(serverssl);
6351 SSL_free(clientssl);
6352 SSL_CTX_free(sctx);
6353 SSL_CTX_free(cctx);
6354
6355 return testresult;
6356 }
6357 #endif
6358
6359 /*
6360 * Test that SSL_export_keying_material() produces expected results. There are
6361 * no test vectors so all we do is test that both sides of the communication
6362 * produce the same results for different protocol versions.
6363 */
6364 #define SMALL_LABEL_LEN 10
6365 #define LONG_LABEL_LEN 249
6366 static int test_export_key_mat(int tst)
6367 {
6368 int testresult = 0;
6369 SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
6370 SSL *clientssl = NULL, *serverssl = NULL;
6371 const char label[LONG_LABEL_LEN + 1] = "test label";
6372 const unsigned char context[] = "context";
6373 const unsigned char *emptycontext = NULL;
6374 unsigned char longcontext[1280];
6375 int test_longcontext = fips_provider_version_ge(libctx, 3, 3, 0);
6376 unsigned char ckeymat1[80], ckeymat2[80], ckeymat3[80], ckeymat4[80];
6377 unsigned char skeymat1[80], skeymat2[80], skeymat3[80], skeymat4[80];
6378 size_t labellen;
6379 const int protocols[] = {
6380 TLS1_VERSION,
6381 TLS1_1_VERSION,
6382 TLS1_2_VERSION,
6383 TLS1_3_VERSION,
6384 TLS1_3_VERSION,
6385 TLS1_3_VERSION
6386 };
6387
6388 #ifdef OPENSSL_NO_TLS1
6389 if (tst == 0)
6390 return 1;
6391 #endif
6392 #ifdef OPENSSL_NO_TLS1_1
6393 if (tst == 1)
6394 return 1;
6395 #endif
6396 if (is_fips && (tst == 0 || tst == 1))
6397 return 1;
6398 #ifdef OPENSSL_NO_TLS1_2
6399 if (tst == 2)
6400 return 1;
6401 #endif
6402 #ifdef OSSL_NO_USABLE_TLS1_3
6403 if (tst >= 3)
6404 return 1;
6405 #endif
6406 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6407 TLS_client_method(), TLS1_VERSION, 0,
6408 &sctx, &cctx, cert, privkey)))
6409 goto end;
6410
6411 OPENSSL_assert(tst >= 0 && (size_t)tst < OSSL_NELEM(protocols));
6412 SSL_CTX_set_max_proto_version(cctx, protocols[tst]);
6413 SSL_CTX_set_min_proto_version(cctx, protocols[tst]);
6414 if ((protocols[tst] < TLS1_2_VERSION) &&
6415 (!SSL_CTX_set_cipher_list(cctx, "DEFAULT:@SECLEVEL=0")
6416 || !SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0")))
6417 goto end;
6418
6419 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
6420 NULL)))
6421 goto end;
6422
6423 /*
6424 * Premature call of SSL_export_keying_material should just fail.
6425 */
6426 if (!TEST_int_le(SSL_export_keying_material(clientssl, ckeymat1,
6427 sizeof(ckeymat1), label,
6428 SMALL_LABEL_LEN + 1, context,
6429 sizeof(context) - 1, 1), 0))
6430 goto end;
6431
6432 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
6433 SSL_ERROR_NONE)))
6434 goto end;
6435
6436 if (tst == 5) {
6437 /*
6438 * TLSv1.3 imposes a maximum label len of 249 bytes. Check we fail if we
6439 * go over that.
6440 */
6441 if (!TEST_int_le(SSL_export_keying_material(clientssl, ckeymat1,
6442 sizeof(ckeymat1), label,
6443 LONG_LABEL_LEN + 1, context,
6444 sizeof(context) - 1, 1), 0))
6445 goto end;
6446
6447 testresult = 1;
6448 goto end;
6449 } else if (tst == 4) {
6450 labellen = LONG_LABEL_LEN;
6451 } else {
6452 labellen = SMALL_LABEL_LEN;
6453 }
6454
6455 memset(longcontext, 1, sizeof(longcontext));
6456
6457 if (!TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat1,
6458 sizeof(ckeymat1), label,
6459 labellen, context,
6460 sizeof(context) - 1, 1), 1)
6461 || !TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat2,
6462 sizeof(ckeymat2), label,
6463 labellen,
6464 emptycontext,
6465 0, 1), 1)
6466 || !TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat3,
6467 sizeof(ckeymat3), label,
6468 labellen,
6469 NULL, 0, 0), 1)
6470 || (test_longcontext
6471 && !TEST_int_eq(SSL_export_keying_material(clientssl,
6472 ckeymat4,
6473 sizeof(ckeymat4), label,
6474 labellen,
6475 longcontext,
6476 sizeof(longcontext), 1),
6477 1))
6478 || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat1,
6479 sizeof(skeymat1), label,
6480 labellen,
6481 context,
6482 sizeof(context) -1, 1),
6483 1)
6484 || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat2,
6485 sizeof(skeymat2), label,
6486 labellen,
6487 emptycontext,
6488 0, 1), 1)
6489 || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat3,
6490 sizeof(skeymat3), label,
6491 labellen,
6492 NULL, 0, 0), 1)
6493 || (test_longcontext
6494 && !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat4,
6495 sizeof(skeymat4), label,
6496 labellen,
6497 longcontext,
6498 sizeof(longcontext), 1),
6499 1))
6500 /*
6501 * Check that both sides created the same key material with the
6502 * same context.
6503 */
6504 || !TEST_mem_eq(ckeymat1, sizeof(ckeymat1), skeymat1,
6505 sizeof(skeymat1))
6506 /*
6507 * Check that both sides created the same key material with an
6508 * empty context.
6509 */
6510 || !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), skeymat2,
6511 sizeof(skeymat2))
6512 /*
6513 * Check that both sides created the same key material without a
6514 * context.
6515 */
6516 || !TEST_mem_eq(ckeymat3, sizeof(ckeymat3), skeymat3,
6517 sizeof(skeymat3))
6518 /*
6519 * Check that both sides created the same key material with a
6520 * long context.
6521 */
6522 || (test_longcontext
6523 && !TEST_mem_eq(ckeymat4, sizeof(ckeymat4), skeymat4,
6524 sizeof(skeymat4)))
6525 /* Different contexts should produce different results */
6526 || !TEST_mem_ne(ckeymat1, sizeof(ckeymat1), ckeymat2,
6527 sizeof(ckeymat2)))
6528 goto end;
6529
6530 /*
6531 * Check that an empty context and no context produce different results in
6532 * protocols less than TLSv1.3. In TLSv1.3 they should be the same.
6533 */
6534 if ((tst < 3 && !TEST_mem_ne(ckeymat2, sizeof(ckeymat2), ckeymat3,
6535 sizeof(ckeymat3)))
6536 || (tst >= 3 && !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), ckeymat3,
6537 sizeof(ckeymat3))))
6538 goto end;
6539
6540 testresult = 1;
6541
6542 end:
6543 SSL_free(serverssl);
6544 SSL_free(clientssl);
6545 SSL_CTX_free(sctx2);
6546 SSL_CTX_free(sctx);
6547 SSL_CTX_free(cctx);
6548
6549 return testresult;
6550 }
6551
6552 #ifndef OSSL_NO_USABLE_TLS1_3
6553 /*
6554 * Test that SSL_export_keying_material_early() produces expected
6555 * results. There are no test vectors so all we do is test that both
6556 * sides of the communication produce the same results for different
6557 * protocol versions.
6558 */
6559 static int test_export_key_mat_early(int idx)
6560 {
6561 static const char label[] = "test label";
6562 static const unsigned char context[] = "context";
6563 int testresult = 0;
6564 SSL_CTX *cctx = NULL, *sctx = NULL;
6565 SSL *clientssl = NULL, *serverssl = NULL;
6566 SSL_SESSION *sess = NULL;
6567 const unsigned char *emptycontext = NULL;
6568 unsigned char ckeymat1[80], ckeymat2[80];
6569 unsigned char skeymat1[80], skeymat2[80];
6570 unsigned char buf[1];
6571 size_t readbytes, written;
6572
6573 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl, &serverssl,
6574 &sess, idx, SHA384_DIGEST_LENGTH)))
6575 goto end;
6576
6577 /* Here writing 0 length early data is enough. */
6578 if (!TEST_true(SSL_write_early_data(clientssl, NULL, 0, &written))
6579 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
6580 &readbytes),
6581 SSL_READ_EARLY_DATA_ERROR)
6582 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
6583 SSL_EARLY_DATA_ACCEPTED))
6584 goto end;
6585
6586 if (!TEST_int_eq(SSL_export_keying_material_early(
6587 clientssl, ckeymat1, sizeof(ckeymat1), label,
6588 sizeof(label) - 1, context, sizeof(context) - 1), 1)
6589 || !TEST_int_eq(SSL_export_keying_material_early(
6590 clientssl, ckeymat2, sizeof(ckeymat2), label,
6591 sizeof(label) - 1, emptycontext, 0), 1)
6592 || !TEST_int_eq(SSL_export_keying_material_early(
6593 serverssl, skeymat1, sizeof(skeymat1), label,
6594 sizeof(label) - 1, context, sizeof(context) - 1), 1)
6595 || !TEST_int_eq(SSL_export_keying_material_early(
6596 serverssl, skeymat2, sizeof(skeymat2), label,
6597 sizeof(label) - 1, emptycontext, 0), 1)
6598 /*
6599 * Check that both sides created the same key material with the
6600 * same context.
6601 */
6602 || !TEST_mem_eq(ckeymat1, sizeof(ckeymat1), skeymat1,
6603 sizeof(skeymat1))
6604 /*
6605 * Check that both sides created the same key material with an
6606 * empty context.
6607 */
6608 || !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), skeymat2,
6609 sizeof(skeymat2))
6610 /* Different contexts should produce different results */
6611 || !TEST_mem_ne(ckeymat1, sizeof(ckeymat1), ckeymat2,
6612 sizeof(ckeymat2)))
6613 goto end;
6614
6615 testresult = 1;
6616
6617 end:
6618 SSL_SESSION_free(sess);
6619 SSL_SESSION_free(clientpsk);
6620 SSL_SESSION_free(serverpsk);
6621 clientpsk = serverpsk = NULL;
6622 SSL_free(serverssl);
6623 SSL_free(clientssl);
6624 SSL_CTX_free(sctx);
6625 SSL_CTX_free(cctx);
6626
6627 return testresult;
6628 }
6629
6630 #define NUM_KEY_UPDATE_MESSAGES 40
6631 /*
6632 * Test KeyUpdate.
6633 */
6634 static int test_key_update(void)
6635 {
6636 SSL_CTX *cctx = NULL, *sctx = NULL;
6637 SSL *clientssl = NULL, *serverssl = NULL;
6638 int testresult = 0, i, j;
6639 char buf[20];
6640 static char *mess = "A test message";
6641
6642 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6643 TLS_client_method(),
6644 TLS1_3_VERSION,
6645 0,
6646 &sctx, &cctx, cert, privkey))
6647 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6648 NULL, NULL))
6649 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6650 SSL_ERROR_NONE)))
6651 goto end;
6652
6653 for (j = 0; j < 2; j++) {
6654 /* Send lots of KeyUpdate messages */
6655 for (i = 0; i < NUM_KEY_UPDATE_MESSAGES; i++) {
6656 if (!TEST_true(SSL_key_update(clientssl,
6657 (j == 0)
6658 ? SSL_KEY_UPDATE_NOT_REQUESTED
6659 : SSL_KEY_UPDATE_REQUESTED))
6660 || !TEST_true(SSL_do_handshake(clientssl)))
6661 goto end;
6662 }
6663
6664 /* Check that sending and receiving app data is ok */
6665 if (!TEST_int_eq(SSL_write(clientssl, mess, strlen(mess)), strlen(mess))
6666 || !TEST_int_eq(SSL_read(serverssl, buf, sizeof(buf)),
6667 strlen(mess)))
6668 goto end;
6669
6670 if (!TEST_int_eq(SSL_write(serverssl, mess, strlen(mess)), strlen(mess))
6671 || !TEST_int_eq(SSL_read(clientssl, buf, sizeof(buf)),
6672 strlen(mess)))
6673 goto end;
6674 }
6675
6676 testresult = 1;
6677
6678 end:
6679 SSL_free(serverssl);
6680 SSL_free(clientssl);
6681 SSL_CTX_free(sctx);
6682 SSL_CTX_free(cctx);
6683
6684 return testresult;
6685 }
6686
6687 /*
6688 * Test we can handle a KeyUpdate (update requested) message while
6689 * write data is pending in peer.
6690 * Test 0: Client sends KeyUpdate while Server is writing
6691 * Test 1: Server sends KeyUpdate while Client is writing
6692 */
6693 static int test_key_update_peer_in_write(int tst)
6694 {
6695 SSL_CTX *cctx = NULL, *sctx = NULL;
6696 SSL *clientssl = NULL, *serverssl = NULL;
6697 int testresult = 0;
6698 char buf[20];
6699 static char *mess = "A test message";
6700 BIO *bretry = BIO_new(bio_s_always_retry());
6701 BIO *tmp = NULL;
6702 SSL *peerupdate = NULL, *peerwrite = NULL;
6703
6704 if (!TEST_ptr(bretry)
6705 || !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6706 TLS_client_method(),
6707 TLS1_3_VERSION,
6708 0,
6709 &sctx, &cctx, cert, privkey))
6710 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6711 NULL, NULL))
6712 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6713 SSL_ERROR_NONE)))
6714 goto end;
6715
6716 peerupdate = tst == 0 ? clientssl : serverssl;
6717 peerwrite = tst == 0 ? serverssl : clientssl;
6718
6719 if (!TEST_true(SSL_key_update(peerupdate, SSL_KEY_UPDATE_REQUESTED))
6720 || !TEST_int_eq(SSL_do_handshake(peerupdate), 1))
6721 goto end;
6722
6723 /* Swap the writing endpoint's write BIO to force a retry */
6724 tmp = SSL_get_wbio(peerwrite);
6725 if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
6726 tmp = NULL;
6727 goto end;
6728 }
6729 SSL_set0_wbio(peerwrite, bretry);
6730 bretry = NULL;
6731
6732 /* Write data that we know will fail with SSL_ERROR_WANT_WRITE */
6733 if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), -1)
6734 || !TEST_int_eq(SSL_get_error(peerwrite, 0), SSL_ERROR_WANT_WRITE)
6735 || !TEST_true(SSL_want_write(peerwrite))
6736 || !TEST_true(SSL_net_write_desired(peerwrite)))
6737 goto end;
6738
6739 /* Reinstate the original writing endpoint's write BIO */
6740 SSL_set0_wbio(peerwrite, tmp);
6741 tmp = NULL;
6742
6743 /* Now read some data - we will read the key update */
6744 if (!TEST_int_eq(SSL_read(peerwrite, buf, sizeof(buf)), -1)
6745 || !TEST_int_eq(SSL_get_error(peerwrite, 0), SSL_ERROR_WANT_READ)
6746 || !TEST_true(SSL_want_read(peerwrite))
6747 || !TEST_true(SSL_net_read_desired(peerwrite)))
6748 goto end;
6749
6750 /*
6751 * Complete the write we started previously and read it from the other
6752 * endpoint
6753 */
6754 if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), strlen(mess))
6755 || !TEST_int_eq(SSL_read(peerupdate, buf, sizeof(buf)), strlen(mess)))
6756 goto end;
6757
6758 /* Write more data to ensure we send the KeyUpdate message back */
6759 if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), strlen(mess))
6760 || !TEST_int_eq(SSL_read(peerupdate, buf, sizeof(buf)), strlen(mess)))
6761 goto end;
6762
6763 if (!TEST_false(SSL_net_read_desired(peerwrite))
6764 || !TEST_false(SSL_net_write_desired(peerwrite))
6765 || !TEST_int_eq(SSL_want(peerwrite), SSL_NOTHING))
6766 goto end;
6767
6768 testresult = 1;
6769
6770 end:
6771 SSL_free(serverssl);
6772 SSL_free(clientssl);
6773 SSL_CTX_free(sctx);
6774 SSL_CTX_free(cctx);
6775 BIO_free(bretry);
6776 BIO_free(tmp);
6777
6778 return testresult;
6779 }
6780
6781 /*
6782 * Test we can handle a KeyUpdate (update requested) message while
6783 * peer read data is pending after peer accepted keyupdate(the msg header
6784 * had been read 5 bytes).
6785 * Test 0: Client sends KeyUpdate while Server is reading
6786 * Test 1: Server sends KeyUpdate while Client is reading
6787 */
6788 static int test_key_update_peer_in_read(int tst)
6789 {
6790 SSL_CTX *cctx = NULL, *sctx = NULL;
6791 SSL *clientssl = NULL, *serverssl = NULL;
6792 int testresult = 0;
6793 char prbuf[515], lwbuf[515] = {0};
6794 static char *mess = "A test message";
6795 BIO *lbio = NULL, *pbio = NULL;
6796 SSL *local = NULL, *peer = NULL;
6797
6798 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6799 TLS_client_method(),
6800 TLS1_3_VERSION,
6801 0,
6802 &sctx, &cctx, cert, privkey))
6803 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6804 NULL, NULL))
6805 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6806 SSL_ERROR_NONE)))
6807 goto end;
6808
6809 local = tst == 0 ? clientssl : serverssl;
6810 peer = tst == 0 ? serverssl : clientssl;
6811
6812 if (!TEST_int_eq(BIO_new_bio_pair(&lbio, 512, &pbio, 512), 1))
6813 goto end;
6814
6815 SSL_set_bio(local, lbio, lbio);
6816 SSL_set_bio(peer, pbio, pbio);
6817
6818 /*
6819 * we first write keyupdate msg then appdata in local
6820 * write data in local will fail with SSL_ERROR_WANT_WRITE,because
6821 * lwbuf app data msg size + key updata msg size > 512(the size of
6822 * the bio pair buffer)
6823 */
6824 if (!TEST_true(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
6825 || !TEST_int_eq(SSL_write(local, lwbuf, sizeof(lwbuf)), -1)
6826 || !TEST_int_eq(SSL_get_error(local, -1), SSL_ERROR_WANT_WRITE))
6827 goto end;
6828
6829 /*
6830 * first read keyupdate msg in peer in peer
6831 * then read appdata that we know will fail with SSL_ERROR_WANT_READ
6832 */
6833 if (!TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), -1)
6834 || !TEST_int_eq(SSL_get_error(peer, -1), SSL_ERROR_WANT_READ))
6835 goto end;
6836
6837 /* Now write some data in peer - we will write the key update */
6838 if (!TEST_int_eq(SSL_write(peer, mess, strlen(mess)), strlen(mess)))
6839 goto end;
6840
6841 /*
6842 * write data in local previously that we will complete
6843 * read data in peer previously that we will complete
6844 */
6845 if (!TEST_int_eq(SSL_write(local, lwbuf, sizeof(lwbuf)), sizeof(lwbuf))
6846 || !TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), sizeof(prbuf)))
6847 goto end;
6848
6849 /* check that sending and receiving appdata ok */
6850 if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess))
6851 || !TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), strlen(mess)))
6852 goto end;
6853
6854 testresult = 1;
6855
6856 end:
6857 SSL_free(serverssl);
6858 SSL_free(clientssl);
6859 SSL_CTX_free(sctx);
6860 SSL_CTX_free(cctx);
6861
6862 return testresult;
6863 }
6864
6865 /*
6866 * Test we can't send a KeyUpdate (update requested) message while
6867 * local write data is pending.
6868 * Test 0: Client sends KeyUpdate while Client is writing
6869 * Test 1: Server sends KeyUpdate while Server is writing
6870 */
6871 static int test_key_update_local_in_write(int tst)
6872 {
6873 SSL_CTX *cctx = NULL, *sctx = NULL;
6874 SSL *clientssl = NULL, *serverssl = NULL;
6875 int testresult = 0;
6876 char buf[20];
6877 static char *mess = "A test message";
6878 BIO *bretry = BIO_new(bio_s_always_retry());
6879 BIO *tmp = NULL;
6880 SSL *local = NULL, *peer = NULL;
6881
6882 if (!TEST_ptr(bretry)
6883 || !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6884 TLS_client_method(),
6885 TLS1_3_VERSION,
6886 0,
6887 &sctx, &cctx, cert, privkey))
6888 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6889 NULL, NULL))
6890 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6891 SSL_ERROR_NONE)))
6892 goto end;
6893
6894 local = tst == 0 ? clientssl : serverssl;
6895 peer = tst == 0 ? serverssl : clientssl;
6896
6897 /* Swap the writing endpoint's write BIO to force a retry */
6898 tmp = SSL_get_wbio(local);
6899 if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
6900 tmp = NULL;
6901 goto end;
6902 }
6903 SSL_set0_wbio(local, bretry);
6904 bretry = NULL;
6905
6906 /* write data in local will fail with SSL_ERROR_WANT_WRITE */
6907 if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), -1)
6908 || !TEST_int_eq(SSL_get_error(local, -1), SSL_ERROR_WANT_WRITE))
6909 goto end;
6910
6911 /* Reinstate the original writing endpoint's write BIO */
6912 SSL_set0_wbio(local, tmp);
6913 tmp = NULL;
6914
6915 /* SSL_key_update will fail, because writing in local*/
6916 if (!TEST_false(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
6917 || !TEST_int_eq(ERR_GET_REASON(ERR_peek_error()), SSL_R_BAD_WRITE_RETRY))
6918 goto end;
6919
6920 ERR_clear_error();
6921 /* write data in local previously that we will complete */
6922 if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess)))
6923 goto end;
6924
6925 /* SSL_key_update will succeed because there is no pending write data */
6926 if (!TEST_true(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
6927 || !TEST_int_eq(SSL_do_handshake(local), 1))
6928 goto end;
6929
6930 /*
6931 * we write some appdata in local
6932 * read data in peer - we will read the keyupdate msg
6933 */
6934 if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess))
6935 || !TEST_int_eq(SSL_read(peer, buf, sizeof(buf)), strlen(mess)))
6936 goto end;
6937
6938 /* Write more peer more data to ensure we send the keyupdate message back */
6939 if (!TEST_int_eq(SSL_write(peer, mess, strlen(mess)), strlen(mess))
6940 || !TEST_int_eq(SSL_read(local, buf, sizeof(buf)), strlen(mess)))
6941 goto end;
6942
6943 testresult = 1;
6944
6945 end:
6946 SSL_free(serverssl);
6947 SSL_free(clientssl);
6948 SSL_CTX_free(sctx);
6949 SSL_CTX_free(cctx);
6950 BIO_free(bretry);
6951 BIO_free(tmp);
6952
6953 return testresult;
6954 }
6955
6956 /*
6957 * Test we can handle a KeyUpdate (update requested) message while
6958 * local read data is pending(the msg header had been read 5 bytes).
6959 * Test 0: Client sends KeyUpdate while Client is reading
6960 * Test 1: Server sends KeyUpdate while Server is reading
6961 */
6962 static int test_key_update_local_in_read(int tst)
6963 {
6964 SSL_CTX *cctx = NULL, *sctx = NULL;
6965 SSL *clientssl = NULL, *serverssl = NULL;
6966 int testresult = 0;
6967 char lrbuf[515], pwbuf[515] = {0}, prbuf[20];
6968 static char *mess = "A test message";
6969 BIO *lbio = NULL, *pbio = NULL;
6970 SSL *local = NULL, *peer = NULL;
6971
6972 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6973 TLS_client_method(),
6974 TLS1_3_VERSION,
6975 0,
6976 &sctx, &cctx, cert, privkey))
6977 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6978 NULL, NULL))
6979 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6980 SSL_ERROR_NONE)))
6981 goto end;
6982
6983 local = tst == 0 ? clientssl : serverssl;
6984 peer = tst == 0 ? serverssl : clientssl;
6985
6986 if (!TEST_int_eq(BIO_new_bio_pair(&lbio, 512, &pbio, 512), 1))
6987 goto end;
6988
6989 SSL_set_bio(local, lbio, lbio);
6990 SSL_set_bio(peer, pbio, pbio);
6991
6992 /* write app data in peer will fail with SSL_ERROR_WANT_WRITE */
6993 if (!TEST_int_eq(SSL_write(peer, pwbuf, sizeof(pwbuf)), -1)
6994 || !TEST_int_eq(SSL_get_error(peer, -1), SSL_ERROR_WANT_WRITE))
6995 goto end;
6996
6997 /* read appdata in local will fail with SSL_ERROR_WANT_READ */
6998 if (!TEST_int_eq(SSL_read(local, lrbuf, sizeof(lrbuf)), -1)
6999 || !TEST_int_eq(SSL_get_error(local, -1), SSL_ERROR_WANT_READ))
7000 goto end;
7001
7002 /* SSL_do_handshake will send keyupdate msg */
7003 if (!TEST_true(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
7004 || !TEST_int_eq(SSL_do_handshake(local), 1))
7005 goto end;
7006
7007 /*
7008 * write data in peer previously that we will complete
7009 * read data in local previously that we will complete
7010 */
7011 if (!TEST_int_eq(SSL_write(peer, pwbuf, sizeof(pwbuf)), sizeof(pwbuf))
7012 || !TEST_int_eq(SSL_read(local, lrbuf, sizeof(lrbuf)), sizeof(lrbuf)))
7013 goto end;
7014
7015 /*
7016 * write data in local
7017 * read data in peer - we will read the key update
7018 */
7019 if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess))
7020 || !TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), strlen(mess)))
7021 goto end;
7022
7023 /* Write more peer data to ensure we send the keyupdate message back */
7024 if (!TEST_int_eq(SSL_write(peer, mess, strlen(mess)), strlen(mess))
7025 || !TEST_int_eq(SSL_read(local, lrbuf, sizeof(lrbuf)), strlen(mess)))
7026 goto end;
7027
7028 testresult = 1;
7029
7030 end:
7031 SSL_free(serverssl);
7032 SSL_free(clientssl);
7033 SSL_CTX_free(sctx);
7034 SSL_CTX_free(cctx);
7035
7036 return testresult;
7037 }
7038 #endif /* OSSL_NO_USABLE_TLS1_3 */
7039
7040 /*
7041 * Test clearing a connection via SSL_clear(), or resetting it via
7042 * SSL_set_connect_state()/SSL_set_accept_state()
7043 * Test 0: SSL_set_connect_state, TLSv1.3
7044 * Test 1: SSL_set_connect_state, TLSv1.2
7045 * Test 2: SSL_set_accept_state, TLSv1.3
7046 * Test 3: SSL_set_accept_state, TLSv1.2
7047 * Test 4: SSL_clear (client), TLSv1.3
7048 * Test 5: SSL_clear (client), TLSv1.2
7049 * Test 6: SSL_clear (server), TLSv1.3
7050 * Test 7: SSL_clear (server), TLSv1.2
7051 */
7052 static int test_ssl_clear(int idx)
7053 {
7054 SSL_CTX *cctx = NULL, *sctx = NULL;
7055 SSL *clientssl = NULL, *serverssl = NULL;
7056 SSL *writer, *reader;
7057 int testresult = 0;
7058 int tls12test, servertest, cleartest;
7059 size_t written, readbytes;
7060 const char *msg = "Hello World";
7061 unsigned char buf[5];
7062
7063 tls12test = idx & 1;
7064 idx >>= 1;
7065 servertest = idx & 1;
7066 idx >>= 1;
7067 cleartest = idx & 1;
7068
7069 #ifdef OPENSSL_NO_TLS1_2
7070 if (tls12test == 1)
7071 return TEST_skip("No TLSv1.2 in this build");
7072 #endif
7073
7074 /* Create an initial connection */
7075 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7076 TLS_client_method(), TLS1_VERSION, 0,
7077 &sctx, &cctx, cert, privkey))
7078 || (tls12test
7079 && !TEST_true(SSL_CTX_set_max_proto_version(cctx,
7080 TLS1_2_VERSION)))
7081 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
7082 &clientssl, NULL, NULL))
7083 || !TEST_true(create_ssl_connection(serverssl, clientssl,
7084 SSL_ERROR_NONE)))
7085 goto end;
7086
7087 if (servertest) {
7088 writer = clientssl;
7089 reader = serverssl;
7090 } else {
7091 writer = serverssl;
7092 reader = clientssl;
7093 }
7094
7095 /* Write some data */
7096 if (!TEST_true(SSL_write_ex(writer, msg, strlen(msg), &written))
7097 || written != strlen(msg))
7098 goto end;
7099
7100 /*
7101 * Read a partial record. The remaining buffered data should be cleared by
7102 * the subsequent clear/reset
7103 */
7104 if (!TEST_true(SSL_read_ex(reader, buf, sizeof(buf), &readbytes))
7105 || readbytes != sizeof(buf))
7106 goto end;
7107
7108 SSL_shutdown(clientssl);
7109 SSL_shutdown(serverssl);
7110
7111 /* Reset/clear one SSL object in order to reuse it. We free the other one */
7112 if (servertest) {
7113 if (cleartest) {
7114 if (!TEST_true(SSL_clear(serverssl)))
7115 goto end;
7116 } else {
7117 SSL_set_accept_state(serverssl);
7118 }
7119 /*
7120 * A peculiarity of SSL_clear() is that it does not clear the session.
7121 * This is intended behaviour so that a client can create a new
7122 * connection and reuse the session. But this doesn't make much sense
7123 * on the server side - and causes incorrect behaviour due to the
7124 * handshake failing (even though the documentation does say SSL_clear()
7125 * is supposed to work on the server side). We clear the session
7126 * explicitly - although note that the documentation for
7127 * SSL_set_session() says that its only useful for clients!
7128 */
7129 if (!TEST_true(SSL_set_session(serverssl, NULL)))
7130 goto end;
7131 SSL_free(clientssl);
7132 clientssl = NULL;
7133 } else {
7134 if (cleartest) {
7135 if (!TEST_true(SSL_clear(clientssl)))
7136 goto end;
7137 } else {
7138 SSL_set_connect_state(clientssl);
7139 }
7140 SSL_free(serverssl);
7141 serverssl = NULL;
7142 }
7143
7144 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7145 NULL, NULL))
7146 || !TEST_true(create_ssl_connection(serverssl, clientssl,
7147 SSL_ERROR_NONE))
7148 || !TEST_true(servertest || SSL_session_reused(clientssl)))
7149 goto end;
7150
7151 SSL_shutdown(clientssl);
7152 SSL_shutdown(serverssl);
7153
7154 testresult = 1;
7155
7156 end:
7157 SSL_free(serverssl);
7158 SSL_free(clientssl);
7159 SSL_CTX_free(sctx);
7160 SSL_CTX_free(cctx);
7161
7162 return testresult;
7163 }
7164
7165 /* Parse CH and retrieve any MFL extension value if present */
7166 static int get_MFL_from_client_hello(BIO *bio, int *mfl_codemfl_code)
7167 {
7168 long len;
7169 unsigned char *data;
7170 PACKET pkt, pkt2, pkt3;
7171 unsigned int MFL_code = 0, type = 0;
7172
7173 if (!TEST_uint_gt(len = BIO_get_mem_data(bio, (char **) &data), 0))
7174 goto end;
7175
7176 memset(&pkt, 0, sizeof(pkt));
7177 memset(&pkt2, 0, sizeof(pkt2));
7178 memset(&pkt3, 0, sizeof(pkt3));
7179
7180 if (!TEST_long_gt(len, 0)
7181 || !TEST_true(PACKET_buf_init(&pkt, data, len))
7182 /* Skip the record header */
7183 || !PACKET_forward(&pkt, SSL3_RT_HEADER_LENGTH)
7184 /* Skip the handshake message header */
7185 || !TEST_true(PACKET_forward(&pkt, SSL3_HM_HEADER_LENGTH))
7186 /* Skip client version and random */
7187 || !TEST_true(PACKET_forward(&pkt, CLIENT_VERSION_LEN
7188 + SSL3_RANDOM_SIZE))
7189 /* Skip session id */
7190 || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &pkt2))
7191 /* Skip ciphers */
7192 || !TEST_true(PACKET_get_length_prefixed_2(&pkt, &pkt2))
7193 /* Skip compression */
7194 || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &pkt2))
7195 /* Extensions len */
7196 || !TEST_true(PACKET_as_length_prefixed_2(&pkt, &pkt2)))
7197 goto end;
7198
7199 /* Loop through all extensions */
7200 while (PACKET_remaining(&pkt2)) {
7201 if (!TEST_true(PACKET_get_net_2(&pkt2, &type))
7202 || !TEST_true(PACKET_get_length_prefixed_2(&pkt2, &pkt3)))
7203 goto end;
7204
7205 if (type == TLSEXT_TYPE_max_fragment_length) {
7206 if (!TEST_uint_ne(PACKET_remaining(&pkt3), 0)
7207 || !TEST_true(PACKET_get_1(&pkt3, &MFL_code)))
7208 goto end;
7209
7210 *mfl_codemfl_code = MFL_code;
7211 return 1;
7212 }
7213 }
7214
7215 end:
7216 return 0;
7217 }
7218
7219 /* Maximum-Fragment-Length TLS extension mode to test */
7220 static const unsigned char max_fragment_len_test[] = {
7221 TLSEXT_max_fragment_length_512,
7222 TLSEXT_max_fragment_length_1024,
7223 TLSEXT_max_fragment_length_2048,
7224 TLSEXT_max_fragment_length_4096
7225 };
7226
7227 static int test_max_fragment_len_ext(int idx_tst)
7228 {
7229 SSL_CTX *ctx = NULL;
7230 SSL *con = NULL;
7231 int testresult = 0, MFL_mode = 0;
7232 BIO *rbio, *wbio;
7233
7234 if (!TEST_true(create_ssl_ctx_pair(libctx, NULL, TLS_client_method(),
7235 TLS1_VERSION, 0, NULL, &ctx, NULL,
7236 NULL)))
7237 return 0;
7238
7239 if (!TEST_true(SSL_CTX_set_tlsext_max_fragment_length(
7240 ctx, max_fragment_len_test[idx_tst])))
7241 goto end;
7242
7243 con = SSL_new(ctx);
7244 if (!TEST_ptr(con))
7245 goto end;
7246
7247 rbio = BIO_new(BIO_s_mem());
7248 wbio = BIO_new(BIO_s_mem());
7249 if (!TEST_ptr(rbio)|| !TEST_ptr(wbio)) {
7250 BIO_free(rbio);
7251 BIO_free(wbio);
7252 goto end;
7253 }
7254
7255 SSL_set_bio(con, rbio, wbio);
7256
7257 if (!TEST_int_le(SSL_connect(con), 0)) {
7258 /* This shouldn't succeed because we don't have a server! */
7259 goto end;
7260 }
7261
7262 if (!TEST_true(get_MFL_from_client_hello(wbio, &MFL_mode)))
7263 /* no MFL in client hello */
7264 goto end;
7265 if (!TEST_true(max_fragment_len_test[idx_tst] == MFL_mode))
7266 goto end;
7267
7268 testresult = 1;
7269
7270 end:
7271 SSL_free(con);
7272 SSL_CTX_free(ctx);
7273
7274 return testresult;
7275 }
7276
7277 #ifndef OSSL_NO_USABLE_TLS1_3
7278 static int test_pha_key_update(void)
7279 {
7280 SSL_CTX *cctx = NULL, *sctx = NULL;
7281 SSL *clientssl = NULL, *serverssl = NULL;
7282 int testresult = 0;
7283
7284 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7285 TLS_client_method(), TLS1_VERSION, 0,
7286 &sctx, &cctx, cert, privkey)))
7287 return 0;
7288
7289 if (!TEST_true(SSL_CTX_set_min_proto_version(sctx, TLS1_3_VERSION))
7290 || !TEST_true(SSL_CTX_set_max_proto_version(sctx, TLS1_3_VERSION))
7291 || !TEST_true(SSL_CTX_set_min_proto_version(cctx, TLS1_3_VERSION))
7292 || !TEST_true(SSL_CTX_set_max_proto_version(cctx, TLS1_3_VERSION)))
7293 goto end;
7294
7295 SSL_CTX_set_post_handshake_auth(cctx, 1);
7296
7297 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7298 NULL, NULL)))
7299 goto end;
7300
7301 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
7302 SSL_ERROR_NONE)))
7303 goto end;
7304
7305 SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
7306 if (!TEST_true(SSL_verify_client_post_handshake(serverssl)))
7307 goto end;
7308
7309 if (!TEST_true(SSL_key_update(clientssl, SSL_KEY_UPDATE_NOT_REQUESTED)))
7310 goto end;
7311
7312 /* Start handshake on the server */
7313 if (!TEST_int_eq(SSL_do_handshake(serverssl), 1))
7314 goto end;
7315
7316 /* Starts with SSL_connect(), but it's really just SSL_do_handshake() */
7317 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
7318 SSL_ERROR_NONE)))
7319 goto end;
7320
7321 SSL_shutdown(clientssl);
7322 SSL_shutdown(serverssl);
7323
7324 testresult = 1;
7325
7326 end:
7327 SSL_free(serverssl);
7328 SSL_free(clientssl);
7329 SSL_CTX_free(sctx);
7330 SSL_CTX_free(cctx);
7331 return testresult;
7332 }
7333 #endif
7334
7335 #if !defined(OPENSSL_NO_SRP) && !defined(OPENSSL_NO_TLS1_2)
7336
7337 static SRP_VBASE *vbase = NULL;
7338
7339 static int ssl_srp_cb(SSL *s, int *ad, void *arg)
7340 {
7341 int ret = SSL3_AL_FATAL;
7342 char *username;
7343 SRP_user_pwd *user = NULL;
7344
7345 username = SSL_get_srp_username(s);
7346 if (username == NULL) {
7347 *ad = SSL_AD_INTERNAL_ERROR;
7348 goto err;
7349 }
7350
7351 user = SRP_VBASE_get1_by_user(vbase, username);
7352 if (user == NULL) {
7353 *ad = SSL_AD_INTERNAL_ERROR;
7354 goto err;
7355 }
7356
7357 if (SSL_set_srp_server_param(s, user->N, user->g, user->s, user->v,
7358 user->info) <= 0) {
7359 *ad = SSL_AD_INTERNAL_ERROR;
7360 goto err;
7361 }
7362
7363 ret = 0;
7364
7365 err:
7366 SRP_user_pwd_free(user);
7367 return ret;
7368 }
7369
7370 static int create_new_vfile(char *userid, char *password, const char *filename)
7371 {
7372 char *gNid = NULL;
7373 OPENSSL_STRING *row = OPENSSL_zalloc(sizeof(row) * (DB_NUMBER + 1));
7374 TXT_DB *db = NULL;
7375 int ret = 0;
7376 BIO *out = NULL, *dummy = BIO_new_mem_buf("", 0);
7377 size_t i;
7378
7379 if (!TEST_ptr(dummy) || !TEST_ptr(row))
7380 goto end;
7381
7382 gNid = SRP_create_verifier_ex(userid, password, &row[DB_srpsalt],
7383 &row[DB_srpverifier], NULL, NULL, libctx, NULL);
7384 if (!TEST_ptr(gNid))
7385 goto end;
7386
7387 /*
7388 * The only way to create an empty TXT_DB is to provide a BIO with no data
7389 * in it!
7390 */
7391 db = TXT_DB_read(dummy, DB_NUMBER);
7392 if (!TEST_ptr(db))
7393 goto end;
7394
7395 out = BIO_new_file(filename, "w");
7396 if (!TEST_ptr(out))
7397 goto end;
7398
7399 row[DB_srpid] = OPENSSL_strdup(userid);
7400 row[DB_srptype] = OPENSSL_strdup("V");
7401 row[DB_srpgN] = OPENSSL_strdup(gNid);
7402
7403 if (!TEST_ptr(row[DB_srpid])
7404 || !TEST_ptr(row[DB_srptype])
7405 || !TEST_ptr(row[DB_srpgN])
7406 || !TEST_true(TXT_DB_insert(db, row)))
7407 goto end;
7408
7409 row = NULL;
7410
7411 if (TXT_DB_write(out, db) <= 0)
7412 goto end;
7413
7414 ret = 1;
7415 end:
7416 if (row != NULL) {
7417 for (i = 0; i < DB_NUMBER; i++)
7418 OPENSSL_free(row[i]);
7419 }
7420 OPENSSL_free(row);
7421 BIO_free(dummy);
7422 BIO_free(out);
7423 TXT_DB_free(db);
7424
7425 return ret;
7426 }
7427
7428 static int create_new_vbase(char *userid, char *password)
7429 {
7430 BIGNUM *verifier = NULL, *salt = NULL;
7431 const SRP_gN *lgN = NULL;
7432 SRP_user_pwd *user_pwd = NULL;
7433 int ret = 0;
7434
7435 lgN = SRP_get_default_gN(NULL);
7436 if (!TEST_ptr(lgN))
7437 goto end;
7438
7439 if (!TEST_true(SRP_create_verifier_BN_ex(userid, password, &salt, &verifier,
7440 lgN->N, lgN->g, libctx, NULL)))
7441 goto end;
7442
7443 user_pwd = OPENSSL_zalloc(sizeof(*user_pwd));
7444 if (!TEST_ptr(user_pwd))
7445 goto end;
7446
7447 user_pwd->N = lgN->N;
7448 user_pwd->g = lgN->g;
7449 user_pwd->id = OPENSSL_strdup(userid);
7450 if (!TEST_ptr(user_pwd->id))
7451 goto end;
7452
7453 user_pwd->v = verifier;
7454 user_pwd->s = salt;
7455 verifier = salt = NULL;
7456
7457 if (sk_SRP_user_pwd_insert(vbase->users_pwd, user_pwd, 0) == 0)
7458 goto end;
7459 user_pwd = NULL;
7460
7461 ret = 1;
7462 end:
7463 SRP_user_pwd_free(user_pwd);
7464 BN_free(salt);
7465 BN_free(verifier);
7466
7467 return ret;
7468 }
7469
7470 /*
7471 * SRP tests
7472 *
7473 * Test 0: Simple successful SRP connection, new vbase
7474 * Test 1: Connection failure due to bad password, new vbase
7475 * Test 2: Simple successful SRP connection, vbase loaded from existing file
7476 * Test 3: Connection failure due to bad password, vbase loaded from existing
7477 * file
7478 * Test 4: Simple successful SRP connection, vbase loaded from new file
7479 * Test 5: Connection failure due to bad password, vbase loaded from new file
7480 */
7481 static int test_srp(int tst)
7482 {
7483 char *userid = "test", *password = "password", *tstsrpfile;
7484 SSL_CTX *cctx = NULL, *sctx = NULL;
7485 SSL *clientssl = NULL, *serverssl = NULL;
7486 int ret, testresult = 0;
7487
7488 vbase = SRP_VBASE_new(NULL);
7489 if (!TEST_ptr(vbase))
7490 goto end;
7491
7492 if (tst == 0 || tst == 1) {
7493 if (!TEST_true(create_new_vbase(userid, password)))
7494 goto end;
7495 } else {
7496 if (tst == 4 || tst == 5) {
7497 if (!TEST_true(create_new_vfile(userid, password, tmpfilename)))
7498 goto end;
7499 tstsrpfile = tmpfilename;
7500 } else {
7501 tstsrpfile = srpvfile;
7502 }
7503 if (!TEST_int_eq(SRP_VBASE_init(vbase, tstsrpfile), SRP_NO_ERROR))
7504 goto end;
7505 }
7506
7507 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7508 TLS_client_method(), TLS1_VERSION, 0,
7509 &sctx, &cctx, cert, privkey)))
7510 goto end;
7511
7512 if (!TEST_int_gt(SSL_CTX_set_srp_username_callback(sctx, ssl_srp_cb), 0)
7513 || !TEST_true(SSL_CTX_set_cipher_list(cctx, "SRP-AES-128-CBC-SHA"))
7514 || !TEST_true(SSL_CTX_set_max_proto_version(sctx, TLS1_2_VERSION))
7515 || !TEST_true(SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION))
7516 || !TEST_int_gt(SSL_CTX_set_srp_username(cctx, userid), 0))
7517 goto end;
7518
7519 if (tst % 2 == 1) {
7520 if (!TEST_int_gt(SSL_CTX_set_srp_password(cctx, "badpass"), 0))
7521 goto end;
7522 } else {
7523 if (!TEST_int_gt(SSL_CTX_set_srp_password(cctx, password), 0))
7524 goto end;
7525 }
7526
7527 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7528 NULL, NULL)))
7529 goto end;
7530
7531 ret = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
7532 if (ret) {
7533 if (!TEST_true(tst % 2 == 0))
7534 goto end;
7535 } else {
7536 if (!TEST_true(tst % 2 == 1))
7537 goto end;
7538 }
7539
7540 testresult = 1;
7541
7542 end:
7543 SRP_VBASE_free(vbase);
7544 vbase = NULL;
7545 SSL_free(serverssl);
7546 SSL_free(clientssl);
7547 SSL_CTX_free(sctx);
7548 SSL_CTX_free(cctx);
7549
7550 return testresult;
7551 }
7552 #endif
7553
7554 static int info_cb_failed = 0;
7555 static int info_cb_offset = 0;
7556 static int info_cb_this_state = -1;
7557
7558 static struct info_cb_states_st {
7559 int where;
7560 const char *statestr;
7561 } info_cb_states[][60] = {
7562 {
7563 /* TLSv1.2 server followed by resumption */
7564 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7565 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
7566 {SSL_CB_LOOP, "TWSC"}, {SSL_CB_LOOP, "TWSKE"}, {SSL_CB_LOOP, "TWSD"},
7567 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWSD"}, {SSL_CB_LOOP, "TRCKE"},
7568 {SSL_CB_LOOP, "TRCCS"}, {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWST"},
7569 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
7570 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
7571 {SSL_CB_ALERT, NULL}, {SSL_CB_HANDSHAKE_START, NULL},
7572 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TRCH"},
7573 {SSL_CB_LOOP, "TWSH"}, {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
7574 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_LOOP, "TRCCS"},
7575 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
7576 {SSL_CB_EXIT, NULL}, {0, NULL},
7577 }, {
7578 /* TLSv1.2 client followed by resumption */
7579 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7580 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWCH"},
7581 {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TRSC"}, {SSL_CB_LOOP, "TRSKE"},
7582 {SSL_CB_LOOP, "TRSD"}, {SSL_CB_LOOP, "TWCKE"}, {SSL_CB_LOOP, "TWCCS"},
7583 {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWFIN"},
7584 {SSL_CB_LOOP, "TRST"}, {SSL_CB_LOOP, "TRCCS"}, {SSL_CB_LOOP, "TRFIN"},
7585 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL}, {SSL_CB_ALERT, NULL},
7586 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7587 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWCH"},
7588 {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TRCCS"}, {SSL_CB_LOOP, "TRFIN"},
7589 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
7590 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL}, {0, NULL},
7591 }, {
7592 /* TLSv1.3 server followed by resumption */
7593 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7594 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
7595 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWSC"},
7596 {SSL_CB_LOOP, "TWSCV"}, {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_LOOP, "TED"},
7597 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TED"}, {SSL_CB_LOOP, "TRFIN"},
7598 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_LOOP, "TWST"},
7599 {SSL_CB_LOOP, "TWST"}, {SSL_CB_EXIT, NULL}, {SSL_CB_ALERT, NULL},
7600 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7601 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
7602 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWFIN"},
7603 {SSL_CB_LOOP, "TED"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TED"},
7604 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
7605 {SSL_CB_LOOP, "TWST"}, {SSL_CB_EXIT, NULL}, {0, NULL},
7606 }, {
7607 /* TLSv1.3 client followed by resumption */
7608 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7609 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWCH"},
7610 {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"}, {SSL_CB_LOOP, "TRSC"},
7611 {SSL_CB_LOOP, "TRSCV"}, {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWCCS"},
7612 {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
7613 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "SSLOK"},
7614 {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK"},
7615 {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL},
7616 {SSL_CB_ALERT, NULL}, {SSL_CB_HANDSHAKE_START, NULL},
7617 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL},
7618 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"},
7619 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
7620 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
7621 {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "TRST"},
7622 {SSL_CB_EXIT, NULL}, {0, NULL},
7623 }, {
7624 /* TLSv1.3 server, early_data */
7625 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7626 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
7627 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWFIN"},
7628 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
7629 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "TED"},
7630 {SSL_CB_LOOP, "TED"}, {SSL_CB_LOOP, "TWEOED"}, {SSL_CB_LOOP, "TRFIN"},
7631 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_LOOP, "TWST"},
7632 {SSL_CB_EXIT, NULL}, {0, NULL},
7633 }, {
7634 /* TLSv1.3 client, early_data */
7635 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7636 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_LOOP, "TWCCS"},
7637 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
7638 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "TED"},
7639 {SSL_CB_LOOP, "TED"}, {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"},
7640 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TPEDE"}, {SSL_CB_LOOP, "TWEOED"},
7641 {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
7642 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "SSLOK"},
7643 {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL}, {0, NULL},
7644 }, {
7645 /* TLSv1.3 server, certificate compression, followed by resumption */
7646 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7647 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
7648 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWSCC"},
7649 {SSL_CB_LOOP, "TWSCV"}, {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_LOOP, "TED"},
7650 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TED"}, {SSL_CB_LOOP, "TRFIN"},
7651 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_LOOP, "TWST"},
7652 {SSL_CB_LOOP, "TWST"}, {SSL_CB_EXIT, NULL}, {SSL_CB_ALERT, NULL},
7653 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7654 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
7655 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWFIN"},
7656 {SSL_CB_LOOP, "TED"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TED"},
7657 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
7658 {SSL_CB_LOOP, "TWST"}, {SSL_CB_EXIT, NULL}, {0, NULL},
7659 }, {
7660 /* TLSv1.3 client, certificate compression, followed by resumption */
7661 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT"},
7662 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWCH"},
7663 {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"}, {SSL_CB_LOOP, "TRSCC"},
7664 {SSL_CB_LOOP, "TRSCV"}, {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWCCS"},
7665 {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
7666 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "SSLOK"},
7667 {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK"},
7668 {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL},
7669 {SSL_CB_ALERT, NULL}, {SSL_CB_HANDSHAKE_START, NULL},
7670 {SSL_CB_LOOP, "PINIT"}, {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL},
7671 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"},
7672 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
7673 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
7674 {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "SSLOK"}, {SSL_CB_LOOP, "TRST"},
7675 {SSL_CB_EXIT, NULL}, {0, NULL},
7676 }, {
7677 {0, NULL},
7678 }
7679 };
7680
7681 static void sslapi_info_callback(const SSL *s, int where, int ret)
7682 {
7683 struct info_cb_states_st *state = info_cb_states[info_cb_offset];
7684
7685 /* We do not ever expect a connection to fail in this test */
7686 if (!TEST_false(ret == 0)) {
7687 info_cb_failed = 1;
7688 return;
7689 }
7690
7691 /*
7692 * Do some sanity checks. We never expect these things to happen in this
7693 * test
7694 */
7695 if (!TEST_false((SSL_is_server(s) && (where & SSL_ST_CONNECT) != 0))
7696 || !TEST_false(!SSL_is_server(s) && (where & SSL_ST_ACCEPT) != 0)
7697 || !TEST_int_ne(state[++info_cb_this_state].where, 0)) {
7698 info_cb_failed = 1;
7699 return;
7700 }
7701
7702 /* Now check we're in the right state */
7703 if (!TEST_true((where & state[info_cb_this_state].where) != 0)) {
7704 info_cb_failed = 1;
7705 return;
7706 }
7707 if ((where & SSL_CB_LOOP) != 0
7708 && !TEST_int_eq(strcmp(SSL_state_string(s),
7709 state[info_cb_this_state].statestr), 0)) {
7710 info_cb_failed = 1;
7711 return;
7712 }
7713
7714 /*
7715 * Check that, if we've got SSL_CB_HANDSHAKE_DONE we are not in init
7716 */
7717 if ((where & SSL_CB_HANDSHAKE_DONE)
7718 && SSL_in_init((SSL *)s) != 0) {
7719 info_cb_failed = 1;
7720 return;
7721 }
7722 }
7723
7724 /*
7725 * Test the info callback gets called when we expect it to.
7726 *
7727 * Test 0: TLSv1.2, server
7728 * Test 1: TLSv1.2, client
7729 * Test 2: TLSv1.3, server
7730 * Test 3: TLSv1.3, client
7731 * Test 4: TLSv1.3, server, early_data
7732 * Test 5: TLSv1.3, client, early_data
7733 * Test 6: TLSv1.3, server, compressed certificate
7734 * Test 7: TLSv1.3, client, compressed certificate
7735 */
7736 static int test_info_callback(int tst)
7737 {
7738 SSL_CTX *cctx = NULL, *sctx = NULL;
7739 SSL *clientssl = NULL, *serverssl = NULL;
7740 SSL_SESSION *clntsess = NULL;
7741 int testresult = 0;
7742 int tlsvers;
7743
7744 if (tst < 2) {
7745 /* We need either ECDHE or DHE for the TLSv1.2 test to work */
7746 #if !defined(OPENSSL_NO_TLS1_2) && (!defined(OPENSSL_NO_EC) \
7747 || !defined(OPENSSL_NO_DH))
7748 tlsvers = TLS1_2_VERSION;
7749 #else
7750 return 1;
7751 #endif
7752 } else {
7753 #ifndef OSSL_NO_USABLE_TLS1_3
7754 tlsvers = TLS1_3_VERSION;
7755 #else
7756 return 1;
7757 #endif
7758 }
7759
7760 /* Reset globals */
7761 info_cb_failed = 0;
7762 info_cb_this_state = -1;
7763 info_cb_offset = tst;
7764
7765 #ifndef OSSL_NO_USABLE_TLS1_3
7766 if (tst >= 4 && tst < 6) {
7767 SSL_SESSION *sess = NULL;
7768 size_t written, readbytes;
7769 unsigned char buf[80];
7770
7771 /* early_data tests */
7772 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
7773 &serverssl, &sess, 0,
7774 SHA384_DIGEST_LENGTH)))
7775 goto end;
7776
7777 /* We don't actually need this reference */
7778 SSL_SESSION_free(sess);
7779
7780 SSL_set_info_callback((tst % 2) == 0 ? serverssl : clientssl,
7781 sslapi_info_callback);
7782
7783 /* Write and read some early data and then complete the connection */
7784 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
7785 &written))
7786 || !TEST_size_t_eq(written, strlen(MSG1))
7787 || !TEST_int_eq(SSL_read_early_data(serverssl, buf,
7788 sizeof(buf), &readbytes),
7789 SSL_READ_EARLY_DATA_SUCCESS)
7790 || !TEST_mem_eq(MSG1, readbytes, buf, strlen(MSG1))
7791 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
7792 SSL_EARLY_DATA_ACCEPTED)
7793 || !TEST_true(create_ssl_connection(serverssl, clientssl,
7794 SSL_ERROR_NONE))
7795 || !TEST_false(info_cb_failed))
7796 goto end;
7797
7798 testresult = 1;
7799 goto end;
7800 }
7801 #endif
7802
7803 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7804 TLS_client_method(),
7805 tlsvers, tlsvers, &sctx, &cctx, cert,
7806 privkey)))
7807 goto end;
7808
7809 if (!TEST_true(SSL_CTX_set_dh_auto(sctx, 1)))
7810 goto end;
7811
7812 /*
7813 * For even numbered tests we check the server callbacks. For odd numbers we
7814 * check the client.
7815 */
7816 SSL_CTX_set_info_callback((tst % 2) == 0 ? sctx : cctx,
7817 sslapi_info_callback);
7818 if (tst >= 6) {
7819 if (!SSL_CTX_compress_certs(sctx, 0))
7820 goto end;
7821 }
7822
7823 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
7824 &clientssl, NULL, NULL))
7825 || !TEST_true(create_ssl_connection(serverssl, clientssl,
7826 SSL_ERROR_NONE))
7827 || !TEST_false(info_cb_failed))
7828 goto end;
7829
7830
7831
7832 clntsess = SSL_get1_session(clientssl);
7833 SSL_shutdown(clientssl);
7834 SSL_shutdown(serverssl);
7835 SSL_free(serverssl);
7836 SSL_free(clientssl);
7837 serverssl = clientssl = NULL;
7838
7839 /* Now do a resumption */
7840 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
7841 NULL))
7842 || !TEST_true(SSL_set_session(clientssl, clntsess))
7843 || !TEST_true(create_ssl_connection(serverssl, clientssl,
7844 SSL_ERROR_NONE))
7845 || !TEST_true(SSL_session_reused(clientssl))
7846 || !TEST_false(info_cb_failed))
7847 goto end;
7848
7849 testresult = 1;
7850
7851 end:
7852 SSL_free(serverssl);
7853 SSL_free(clientssl);
7854 SSL_SESSION_free(clntsess);
7855 SSL_CTX_free(sctx);
7856 SSL_CTX_free(cctx);
7857 return testresult;
7858 }
7859
7860 static int test_ssl_pending(int tst)
7861 {
7862 SSL_CTX *cctx = NULL, *sctx = NULL;
7863 SSL *clientssl = NULL, *serverssl = NULL;
7864 int testresult = 0;
7865 char msg[] = "A test message";
7866 char buf[5];
7867 size_t written, readbytes;
7868
7869 if (tst == 0) {
7870 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7871 TLS_client_method(),
7872 TLS1_VERSION, 0,
7873 &sctx, &cctx, cert, privkey)))
7874 goto end;
7875 } else {
7876 #ifndef OPENSSL_NO_DTLS
7877 if (!TEST_true(create_ssl_ctx_pair(libctx, DTLS_server_method(),
7878 DTLS_client_method(),
7879 DTLS1_VERSION, 0,
7880 &sctx, &cctx, cert, privkey)))
7881 goto end;
7882
7883 # ifdef OPENSSL_NO_DTLS1_2
7884 /* Not supported in the FIPS provider */
7885 if (is_fips) {
7886 testresult = 1;
7887 goto end;
7888 };
7889 /*
7890 * Default sigalgs are SHA1 based in <DTLS1.2 which is in security
7891 * level 0
7892 */
7893 if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
7894 || !TEST_true(SSL_CTX_set_cipher_list(cctx,
7895 "DEFAULT:@SECLEVEL=0")))
7896 goto end;
7897 # endif
7898 #else
7899 return 1;
7900 #endif
7901 }
7902
7903 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7904 NULL, NULL))
7905 || !TEST_true(create_ssl_connection(serverssl, clientssl,
7906 SSL_ERROR_NONE)))
7907 goto end;
7908
7909 if (!TEST_int_eq(SSL_pending(clientssl), 0)
7910 || !TEST_false(SSL_has_pending(clientssl))
7911 || !TEST_int_eq(SSL_pending(serverssl), 0)
7912 || !TEST_false(SSL_has_pending(serverssl))
7913 || !TEST_true(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
7914 || !TEST_size_t_eq(written, sizeof(msg))
7915 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
7916 || !TEST_size_t_eq(readbytes, sizeof(buf))
7917 || !TEST_int_eq(SSL_pending(clientssl), (int)(written - readbytes))
7918 || !TEST_true(SSL_has_pending(clientssl)))
7919 goto end;
7920
7921 testresult = 1;
7922
7923 end:
7924 SSL_free(serverssl);
7925 SSL_free(clientssl);
7926 SSL_CTX_free(sctx);
7927 SSL_CTX_free(cctx);
7928
7929 return testresult;
7930 }
7931
7932 static struct {
7933 unsigned int maxprot;
7934 const char *clntciphers;
7935 const char *clnttls13ciphers;
7936 const char *srvrciphers;
7937 const char *srvrtls13ciphers;
7938 const char *shared;
7939 const char *fipsshared;
7940 } shared_ciphers_data[] = {
7941 /*
7942 * We can't establish a connection (even in TLSv1.1) with these ciphersuites if
7943 * TLSv1.3 is enabled but TLSv1.2 is disabled.
7944 */
7945 #if defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
7946 {
7947 TLS1_2_VERSION,
7948 "AES128-SHA:AES256-SHA",
7949 NULL,
7950 "AES256-SHA:DHE-RSA-AES128-SHA",
7951 NULL,
7952 "AES256-SHA",
7953 "AES256-SHA"
7954 },
7955 # if !defined(OPENSSL_NO_CHACHA) \
7956 && !defined(OPENSSL_NO_POLY1305) \
7957 && !defined(OPENSSL_NO_EC)
7958 {
7959 TLS1_2_VERSION,
7960 "AES128-SHA:ECDHE-RSA-CHACHA20-POLY1305",
7961 NULL,
7962 "AES128-SHA:ECDHE-RSA-CHACHA20-POLY1305",
7963 NULL,
7964 "AES128-SHA:ECDHE-RSA-CHACHA20-POLY1305",
7965 "AES128-SHA"
7966 },
7967 # endif
7968 {
7969 TLS1_2_VERSION,
7970 "AES128-SHA:DHE-RSA-AES128-SHA:AES256-SHA",
7971 NULL,
7972 "AES128-SHA:DHE-RSA-AES256-SHA:AES256-SHA",
7973 NULL,
7974 "AES128-SHA:AES256-SHA",
7975 "AES128-SHA:AES256-SHA"
7976 },
7977 {
7978 TLS1_2_VERSION,
7979 "AES128-SHA:AES256-SHA",
7980 NULL,
7981 "AES128-SHA:DHE-RSA-AES128-SHA",
7982 NULL,
7983 "AES128-SHA",
7984 "AES128-SHA"
7985 },
7986 #endif
7987 /*
7988 * This test combines TLSv1.3 and TLSv1.2 ciphersuites so they must both be
7989 * enabled.
7990 */
7991 #if !defined(OSSL_NO_USABLE_TLS1_3) && !defined(OPENSSL_NO_TLS1_2) \
7992 && !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
7993 {
7994 TLS1_3_VERSION,
7995 "AES128-SHA:AES256-SHA",
7996 NULL,
7997 "AES256-SHA:AES128-SHA256",
7998 NULL,
7999 "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:"
8000 "TLS_AES_128_GCM_SHA256:AES256-SHA",
8001 "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:AES256-SHA"
8002 },
8003 #endif
8004 #ifndef OSSL_NO_USABLE_TLS1_3
8005 {
8006 TLS1_3_VERSION,
8007 "AES128-SHA",
8008 "TLS_AES_256_GCM_SHA384",
8009 "AES256-SHA",
8010 "TLS_AES_256_GCM_SHA384",
8011 "TLS_AES_256_GCM_SHA384",
8012 "TLS_AES_256_GCM_SHA384"
8013 },
8014 #endif
8015 };
8016
8017 static int int_test_ssl_get_shared_ciphers(int tst, int clnt)
8018 {
8019 SSL_CTX *cctx = NULL, *sctx = NULL;
8020 SSL *clientssl = NULL, *serverssl = NULL;
8021 int testresult = 0;
8022 char buf[1024];
8023 OSSL_LIB_CTX *tmplibctx = OSSL_LIB_CTX_new();
8024
8025 if (!TEST_ptr(tmplibctx))
8026 goto end;
8027
8028 /*
8029 * Regardless of whether we're testing with the FIPS provider loaded into
8030 * libctx, we want one peer to always use the full set of ciphersuites
8031 * available. Therefore we use a separate libctx with the default provider
8032 * loaded into it. We run the same tests twice - once with the client side
8033 * having the full set of ciphersuites and once with the server side.
8034 */
8035 if (clnt) {
8036 cctx = SSL_CTX_new_ex(tmplibctx, NULL, TLS_client_method());
8037 if (!TEST_ptr(cctx))
8038 goto end;
8039 } else {
8040 sctx = SSL_CTX_new_ex(tmplibctx, NULL, TLS_server_method());
8041 if (!TEST_ptr(sctx))
8042 goto end;
8043 }
8044
8045 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8046 TLS_client_method(),
8047 TLS1_VERSION,
8048 shared_ciphers_data[tst].maxprot,
8049 &sctx, &cctx, cert, privkey)))
8050 goto end;
8051
8052 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
8053 shared_ciphers_data[tst].clntciphers))
8054 || (shared_ciphers_data[tst].clnttls13ciphers != NULL
8055 && !TEST_true(SSL_CTX_set_ciphersuites(cctx,
8056 shared_ciphers_data[tst].clnttls13ciphers)))
8057 || !TEST_true(SSL_CTX_set_cipher_list(sctx,
8058 shared_ciphers_data[tst].srvrciphers))
8059 || (shared_ciphers_data[tst].srvrtls13ciphers != NULL
8060 && !TEST_true(SSL_CTX_set_ciphersuites(sctx,
8061 shared_ciphers_data[tst].srvrtls13ciphers))))
8062 goto end;
8063
8064
8065 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8066 NULL, NULL))
8067 || !TEST_true(create_ssl_connection(serverssl, clientssl,
8068 SSL_ERROR_NONE)))
8069 goto end;
8070
8071 if (!TEST_ptr(SSL_get_shared_ciphers(serverssl, buf, sizeof(buf)))
8072 || !TEST_int_eq(strcmp(buf,
8073 is_fips
8074 ? shared_ciphers_data[tst].fipsshared
8075 : shared_ciphers_data[tst].shared),
8076 0)) {
8077 TEST_info("Shared ciphers are: %s\n", buf);
8078 goto end;
8079 }
8080
8081 testresult = 1;
8082
8083 end:
8084 SSL_free(serverssl);
8085 SSL_free(clientssl);
8086 SSL_CTX_free(sctx);
8087 SSL_CTX_free(cctx);
8088 OSSL_LIB_CTX_free(tmplibctx);
8089
8090 return testresult;
8091 }
8092
8093 static int test_ssl_get_shared_ciphers(int tst)
8094 {
8095 return int_test_ssl_get_shared_ciphers(tst, 0)
8096 && int_test_ssl_get_shared_ciphers(tst, 1);
8097 }
8098
8099
8100 static const char *appdata = "Hello World";
8101 static int gen_tick_called, dec_tick_called, tick_key_cb_called;
8102 static int tick_key_renew = 0;
8103 static SSL_TICKET_RETURN tick_dec_ret = SSL_TICKET_RETURN_ABORT;
8104
8105 static int gen_tick_cb(SSL *s, void *arg)
8106 {
8107 gen_tick_called = 1;
8108
8109 return SSL_SESSION_set1_ticket_appdata(SSL_get_session(s), appdata,
8110 strlen(appdata));
8111 }
8112
8113 static SSL_TICKET_RETURN dec_tick_cb(SSL *s, SSL_SESSION *ss,
8114 const unsigned char *keyname,
8115 size_t keyname_length,
8116 SSL_TICKET_STATUS status,
8117 void *arg)
8118 {
8119 void *tickdata;
8120 size_t tickdlen;
8121
8122 dec_tick_called = 1;
8123
8124 if (status == SSL_TICKET_EMPTY)
8125 return SSL_TICKET_RETURN_IGNORE_RENEW;
8126
8127 if (!TEST_true(status == SSL_TICKET_SUCCESS
8128 || status == SSL_TICKET_SUCCESS_RENEW))
8129 return SSL_TICKET_RETURN_ABORT;
8130
8131 if (!TEST_true(SSL_SESSION_get0_ticket_appdata(ss, &tickdata,
8132 &tickdlen))
8133 || !TEST_size_t_eq(tickdlen, strlen(appdata))
8134 || !TEST_int_eq(memcmp(tickdata, appdata, tickdlen), 0))
8135 return SSL_TICKET_RETURN_ABORT;
8136
8137 if (tick_key_cb_called) {
8138 /* Don't change what the ticket key callback wanted to do */
8139 switch (status) {
8140 case SSL_TICKET_NO_DECRYPT:
8141 return SSL_TICKET_RETURN_IGNORE_RENEW;
8142
8143 case SSL_TICKET_SUCCESS:
8144 return SSL_TICKET_RETURN_USE;
8145
8146 case SSL_TICKET_SUCCESS_RENEW:
8147 return SSL_TICKET_RETURN_USE_RENEW;
8148
8149 default:
8150 return SSL_TICKET_RETURN_ABORT;
8151 }
8152 }
8153 return tick_dec_ret;
8154
8155 }
8156
8157 #ifndef OPENSSL_NO_DEPRECATED_3_0
8158 static int tick_key_cb(SSL *s, unsigned char key_name[16],
8159 unsigned char iv[EVP_MAX_IV_LENGTH], EVP_CIPHER_CTX *ctx,
8160 HMAC_CTX *hctx, int enc)
8161 {
8162 const unsigned char tick_aes_key[16] = "0123456789abcdef";
8163 const unsigned char tick_hmac_key[16] = "0123456789abcdef";
8164 EVP_CIPHER *aes128cbc;
8165 EVP_MD *sha256;
8166 int ret;
8167
8168 tick_key_cb_called = 1;
8169
8170 if (tick_key_renew == -1)
8171 return 0;
8172
8173 aes128cbc = EVP_CIPHER_fetch(libctx, "AES-128-CBC", NULL);
8174 if (!TEST_ptr(aes128cbc))
8175 return 0;
8176 sha256 = EVP_MD_fetch(libctx, "SHA-256", NULL);
8177 if (!TEST_ptr(sha256)) {
8178 EVP_CIPHER_free(aes128cbc);
8179 return 0;
8180 }
8181
8182 memset(iv, 0, AES_BLOCK_SIZE);
8183 memset(key_name, 0, 16);
8184 if (aes128cbc == NULL
8185 || sha256 == NULL
8186 || !EVP_CipherInit_ex(ctx, aes128cbc, NULL, tick_aes_key, iv, enc)
8187 || !HMAC_Init_ex(hctx, tick_hmac_key, sizeof(tick_hmac_key), sha256,
8188 NULL))
8189 ret = -1;
8190 else
8191 ret = tick_key_renew ? 2 : 1;
8192
8193 EVP_CIPHER_free(aes128cbc);
8194 EVP_MD_free(sha256);
8195
8196 return ret;
8197 }
8198 #endif
8199
8200 static int tick_key_evp_cb(SSL *s, unsigned char key_name[16],
8201 unsigned char iv[EVP_MAX_IV_LENGTH],
8202 EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx, int enc)
8203 {
8204 const unsigned char tick_aes_key[16] = "0123456789abcdef";
8205 unsigned char tick_hmac_key[16] = "0123456789abcdef";
8206 OSSL_PARAM params[2];
8207 EVP_CIPHER *aes128cbc;
8208 int ret;
8209
8210 tick_key_cb_called = 1;
8211
8212 if (tick_key_renew == -1)
8213 return 0;
8214
8215 aes128cbc = EVP_CIPHER_fetch(libctx, "AES-128-CBC", NULL);
8216 if (!TEST_ptr(aes128cbc))
8217 return 0;
8218
8219 memset(iv, 0, AES_BLOCK_SIZE);
8220 memset(key_name, 0, 16);
8221 params[0] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
8222 "SHA256", 0);
8223 params[1] = OSSL_PARAM_construct_end();
8224 if (aes128cbc == NULL
8225 || !EVP_CipherInit_ex(ctx, aes128cbc, NULL, tick_aes_key, iv, enc)
8226 || !EVP_MAC_init(hctx, tick_hmac_key, sizeof(tick_hmac_key),
8227 params))
8228 ret = -1;
8229 else
8230 ret = tick_key_renew ? 2 : 1;
8231
8232 EVP_CIPHER_free(aes128cbc);
8233
8234 return ret;
8235 }
8236
8237 /*
8238 * Test the various ticket callbacks
8239 * Test 0: TLSv1.2, no ticket key callback, no ticket, no renewal
8240 * Test 1: TLSv1.3, no ticket key callback, no ticket, no renewal
8241 * Test 2: TLSv1.2, no ticket key callback, no ticket, renewal
8242 * Test 3: TLSv1.3, no ticket key callback, no ticket, renewal
8243 * Test 4: TLSv1.2, no ticket key callback, ticket, no renewal
8244 * Test 5: TLSv1.3, no ticket key callback, ticket, no renewal
8245 * Test 6: TLSv1.2, no ticket key callback, ticket, renewal
8246 * Test 7: TLSv1.3, no ticket key callback, ticket, renewal
8247 * Test 8: TLSv1.2, old ticket key callback, ticket, no renewal
8248 * Test 9: TLSv1.3, old ticket key callback, ticket, no renewal
8249 * Test 10: TLSv1.2, old ticket key callback, ticket, renewal
8250 * Test 11: TLSv1.3, old ticket key callback, ticket, renewal
8251 * Test 12: TLSv1.2, old ticket key callback, no ticket
8252 * Test 13: TLSv1.3, old ticket key callback, no ticket
8253 * Test 14: TLSv1.2, ticket key callback, ticket, no renewal
8254 * Test 15: TLSv1.3, ticket key callback, ticket, no renewal
8255 * Test 16: TLSv1.2, ticket key callback, ticket, renewal
8256 * Test 17: TLSv1.3, ticket key callback, ticket, renewal
8257 * Test 18: TLSv1.2, ticket key callback, no ticket
8258 * Test 19: TLSv1.3, ticket key callback, no ticket
8259 */
8260 static int test_ticket_callbacks(int tst)
8261 {
8262 SSL_CTX *cctx = NULL, *sctx = NULL;
8263 SSL *clientssl = NULL, *serverssl = NULL;
8264 SSL_SESSION *clntsess = NULL;
8265 int testresult = 0;
8266
8267 #ifdef OPENSSL_NO_TLS1_2
8268 if (tst % 2 == 0)
8269 return 1;
8270 #endif
8271 #ifdef OSSL_NO_USABLE_TLS1_3
8272 if (tst % 2 == 1)
8273 return 1;
8274 #endif
8275 #ifdef OPENSSL_NO_DEPRECATED_3_0
8276 if (tst >= 8 && tst <= 13)
8277 return 1;
8278 #endif
8279
8280 gen_tick_called = dec_tick_called = tick_key_cb_called = 0;
8281
8282 /* Which tests the ticket key callback should request renewal for */
8283
8284 if (tst == 10 || tst == 11 || tst == 16 || tst == 17)
8285 tick_key_renew = 1;
8286 else if (tst == 12 || tst == 13 || tst == 18 || tst == 19)
8287 tick_key_renew = -1; /* abort sending the ticket/0-length ticket */
8288 else
8289 tick_key_renew = 0;
8290
8291 /* Which tests the decrypt ticket callback should request renewal for */
8292 switch (tst) {
8293 case 0:
8294 case 1:
8295 tick_dec_ret = SSL_TICKET_RETURN_IGNORE;
8296 break;
8297
8298 case 2:
8299 case 3:
8300 tick_dec_ret = SSL_TICKET_RETURN_IGNORE_RENEW;
8301 break;
8302
8303 case 4:
8304 case 5:
8305 tick_dec_ret = SSL_TICKET_RETURN_USE;
8306 break;
8307
8308 case 6:
8309 case 7:
8310 tick_dec_ret = SSL_TICKET_RETURN_USE_RENEW;
8311 break;
8312
8313 default:
8314 tick_dec_ret = SSL_TICKET_RETURN_ABORT;
8315 }
8316
8317 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8318 TLS_client_method(),
8319 TLS1_VERSION,
8320 ((tst % 2) == 0) ? TLS1_2_VERSION
8321 : TLS1_3_VERSION,
8322 &sctx, &cctx, cert, privkey)))
8323 goto end;
8324
8325 /*
8326 * We only want sessions to resume from tickets - not the session cache. So
8327 * switch the cache off.
8328 */
8329 if (!TEST_true(SSL_CTX_set_session_cache_mode(sctx, SSL_SESS_CACHE_OFF)))
8330 goto end;
8331
8332 if (!TEST_true(SSL_CTX_set_session_ticket_cb(sctx, gen_tick_cb, dec_tick_cb,
8333 NULL)))
8334 goto end;
8335
8336 if (tst >= 14) {
8337 if (!TEST_true(SSL_CTX_set_tlsext_ticket_key_evp_cb(sctx, tick_key_evp_cb)))
8338 goto end;
8339 #ifndef OPENSSL_NO_DEPRECATED_3_0
8340 } else if (tst >= 8) {
8341 if (!TEST_true(SSL_CTX_set_tlsext_ticket_key_cb(sctx, tick_key_cb)))
8342 goto end;
8343 #endif
8344 }
8345
8346 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8347 NULL, NULL))
8348 || !TEST_true(create_ssl_connection(serverssl, clientssl,
8349 SSL_ERROR_NONE)))
8350 goto end;
8351
8352 /*
8353 * The decrypt ticket key callback in TLSv1.2 should be called even though
8354 * we have no ticket yet, because it gets called with a status of
8355 * SSL_TICKET_EMPTY (the client indicates support for tickets but does not
8356 * actually send any ticket data). This does not happen in TLSv1.3 because
8357 * it is not valid to send empty ticket data in TLSv1.3.
8358 */
8359 if (!TEST_int_eq(gen_tick_called, 1)
8360 || !TEST_int_eq(dec_tick_called, ((tst % 2) == 0) ? 1 : 0))
8361 goto end;
8362
8363 gen_tick_called = dec_tick_called = 0;
8364
8365 clntsess = SSL_get1_session(clientssl);
8366 SSL_shutdown(clientssl);
8367 SSL_shutdown(serverssl);
8368 SSL_free(serverssl);
8369 SSL_free(clientssl);
8370 serverssl = clientssl = NULL;
8371
8372 /* Now do a resumption */
8373 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
8374 NULL))
8375 || !TEST_true(SSL_set_session(clientssl, clntsess))
8376 || !TEST_true(create_ssl_connection(serverssl, clientssl,
8377 SSL_ERROR_NONE)))
8378 goto end;
8379
8380 if (tick_dec_ret == SSL_TICKET_RETURN_IGNORE
8381 || tick_dec_ret == SSL_TICKET_RETURN_IGNORE_RENEW
8382 || tick_key_renew == -1) {
8383 if (!TEST_false(SSL_session_reused(clientssl)))
8384 goto end;
8385 } else {
8386 if (!TEST_true(SSL_session_reused(clientssl)))
8387 goto end;
8388 }
8389
8390 if (!TEST_int_eq(gen_tick_called,
8391 (tick_key_renew
8392 || tick_dec_ret == SSL_TICKET_RETURN_IGNORE_RENEW
8393 || tick_dec_ret == SSL_TICKET_RETURN_USE_RENEW)
8394 ? 1 : 0)
8395 /* There is no ticket to decrypt in tests 13 and 19 */
8396 || !TEST_int_eq(dec_tick_called, (tst == 13 || tst == 19) ? 0 : 1))
8397 goto end;
8398
8399 testresult = 1;
8400
8401 end:
8402 SSL_SESSION_free(clntsess);
8403 SSL_free(serverssl);
8404 SSL_free(clientssl);
8405 SSL_CTX_free(sctx);
8406 SSL_CTX_free(cctx);
8407
8408 return testresult;
8409 }
8410
8411 /*
8412 * Test incorrect shutdown.
8413 * Test 0: client does not shutdown properly,
8414 * server does not set SSL_OP_IGNORE_UNEXPECTED_EOF,
8415 * server should get SSL_ERROR_SSL
8416 * Test 1: client does not shutdown properly,
8417 * server sets SSL_OP_IGNORE_UNEXPECTED_EOF,
8418 * server should get SSL_ERROR_ZERO_RETURN
8419 */
8420 static int test_incorrect_shutdown(int tst)
8421 {
8422 SSL_CTX *cctx = NULL, *sctx = NULL;
8423 SSL *clientssl = NULL, *serverssl = NULL;
8424 int testresult = 0;
8425 char buf[80];
8426 BIO *c2s;
8427
8428 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8429 TLS_client_method(), 0, 0,
8430 &sctx, &cctx, cert, privkey)))
8431 goto end;
8432
8433 if (tst == 1)
8434 SSL_CTX_set_options(sctx, SSL_OP_IGNORE_UNEXPECTED_EOF);
8435
8436 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8437 NULL, NULL)))
8438 goto end;
8439
8440 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
8441 SSL_ERROR_NONE)))
8442 goto end;
8443
8444 c2s = SSL_get_rbio(serverssl);
8445 BIO_set_mem_eof_return(c2s, 0);
8446
8447 if (!TEST_false(SSL_read(serverssl, buf, sizeof(buf))))
8448 goto end;
8449
8450 if (tst == 0 && !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_SSL) )
8451 goto end;
8452 if (tst == 1 && !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_ZERO_RETURN) )
8453 goto end;
8454
8455 testresult = 1;
8456
8457 end:
8458 SSL_free(serverssl);
8459 SSL_free(clientssl);
8460 SSL_CTX_free(sctx);
8461 SSL_CTX_free(cctx);
8462
8463 return testresult;
8464 }
8465
8466 /*
8467 * Test bi-directional shutdown.
8468 * Test 0: TLSv1.2
8469 * Test 1: TLSv1.2, server continues to read/write after client shutdown
8470 * Test 2: TLSv1.3, no pending NewSessionTicket messages
8471 * Test 3: TLSv1.3, pending NewSessionTicket messages
8472 * Test 4: TLSv1.3, server continues to read/write after client shutdown, server
8473 * sends key update, client reads it
8474 * Test 5: TLSv1.3, server continues to read/write after client shutdown, server
8475 * sends CertificateRequest, client reads and ignores it
8476 * Test 6: TLSv1.3, server continues to read/write after client shutdown, client
8477 * doesn't read it
8478 */
8479 static int test_shutdown(int tst)
8480 {
8481 SSL_CTX *cctx = NULL, *sctx = NULL;
8482 SSL *clientssl = NULL, *serverssl = NULL;
8483 int testresult = 0;
8484 char msg[] = "A test message";
8485 char buf[80];
8486 size_t written, readbytes;
8487 SSL_SESSION *sess;
8488
8489 #ifdef OPENSSL_NO_TLS1_2
8490 if (tst <= 1)
8491 return 1;
8492 #endif
8493 #ifdef OSSL_NO_USABLE_TLS1_3
8494 if (tst >= 2)
8495 return 1;
8496 #endif
8497
8498 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8499 TLS_client_method(),
8500 TLS1_VERSION,
8501 (tst <= 1) ? TLS1_2_VERSION
8502 : TLS1_3_VERSION,
8503 &sctx, &cctx, cert, privkey)))
8504 goto end;
8505
8506 if (tst == 5)
8507 SSL_CTX_set_post_handshake_auth(cctx, 1);
8508
8509 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8510 NULL, NULL)))
8511 goto end;
8512
8513 if (tst == 3) {
8514 if (!TEST_true(create_bare_ssl_connection(serverssl, clientssl,
8515 SSL_ERROR_NONE, 1, 0))
8516 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
8517 || !TEST_false(SSL_SESSION_is_resumable(sess)))
8518 goto end;
8519 } else if (!TEST_true(create_ssl_connection(serverssl, clientssl,
8520 SSL_ERROR_NONE))
8521 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
8522 || !TEST_true(SSL_SESSION_is_resumable(sess))) {
8523 goto end;
8524 }
8525
8526 if (!TEST_int_eq(SSL_shutdown(clientssl), 0))
8527 goto end;
8528
8529 if (tst >= 4) {
8530 /*
8531 * Reading on the server after the client has sent close_notify should
8532 * fail and provide SSL_ERROR_ZERO_RETURN
8533 */
8534 if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
8535 || !TEST_int_eq(SSL_get_error(serverssl, 0),
8536 SSL_ERROR_ZERO_RETURN)
8537 || !TEST_int_eq(SSL_get_shutdown(serverssl),
8538 SSL_RECEIVED_SHUTDOWN)
8539 /*
8540 * Even though we're shutdown on receive we should still be
8541 * able to write.
8542 */
8543 || !TEST_true(SSL_write(serverssl, msg, sizeof(msg))))
8544 goto end;
8545 if (tst == 4
8546 && !TEST_true(SSL_key_update(serverssl,
8547 SSL_KEY_UPDATE_REQUESTED)))
8548 goto end;
8549 if (tst == 5) {
8550 SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
8551 if (!TEST_true(SSL_verify_client_post_handshake(serverssl)))
8552 goto end;
8553 }
8554 if ((tst == 4 || tst == 5)
8555 && !TEST_true(SSL_write(serverssl, msg, sizeof(msg))))
8556 goto end;
8557 if (!TEST_int_eq(SSL_shutdown(serverssl), 1))
8558 goto end;
8559 if (tst == 4 || tst == 5) {
8560 /* Should still be able to read data from server */
8561 if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf),
8562 &readbytes))
8563 || !TEST_size_t_eq(readbytes, sizeof(msg))
8564 || !TEST_int_eq(memcmp(msg, buf, readbytes), 0)
8565 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf),
8566 &readbytes))
8567 || !TEST_size_t_eq(readbytes, sizeof(msg))
8568 || !TEST_int_eq(memcmp(msg, buf, readbytes), 0))
8569 goto end;
8570 }
8571 }
8572
8573 /* Writing on the client after sending close_notify shouldn't be possible */
8574 if (!TEST_false(SSL_write_ex(clientssl, msg, sizeof(msg), &written)))
8575 goto end;
8576
8577 if (tst < 4) {
8578 /*
8579 * For these tests the client has sent close_notify but it has not yet
8580 * been received by the server. The server has not sent close_notify
8581 * yet.
8582 */
8583 if (!TEST_int_eq(SSL_shutdown(serverssl), 0)
8584 /*
8585 * Writing on the server after sending close_notify shouldn't
8586 * be possible.
8587 */
8588 || !TEST_false(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
8589 || !TEST_int_eq(SSL_shutdown(clientssl), 1)
8590 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
8591 || !TEST_true(SSL_SESSION_is_resumable(sess))
8592 || !TEST_int_eq(SSL_shutdown(serverssl), 1))
8593 goto end;
8594 } else if (tst == 4 || tst == 5) {
8595 /*
8596 * In this test the client has sent close_notify and it has been
8597 * received by the server which has responded with a close_notify. The
8598 * client needs to read the close_notify sent by the server.
8599 */
8600 if (!TEST_int_eq(SSL_shutdown(clientssl), 1)
8601 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
8602 || !TEST_true(SSL_SESSION_is_resumable(sess)))
8603 goto end;
8604 } else {
8605 /*
8606 * tst == 6
8607 *
8608 * The client has sent close_notify and is expecting a close_notify
8609 * back, but instead there is application data first. The shutdown
8610 * should fail with a fatal error.
8611 */
8612 if (!TEST_int_eq(SSL_shutdown(clientssl), -1)
8613 || !TEST_int_eq(SSL_get_error(clientssl, -1), SSL_ERROR_SSL))
8614 goto end;
8615 }
8616
8617 testresult = 1;
8618
8619 end:
8620 SSL_free(serverssl);
8621 SSL_free(clientssl);
8622 SSL_CTX_free(sctx);
8623 SSL_CTX_free(cctx);
8624
8625 return testresult;
8626 }
8627
8628 /*
8629 * Test that sending close_notify alerts works correctly in the case of a
8630 * retryable write failure.
8631 */
8632 static int test_async_shutdown(void)
8633 {
8634 SSL_CTX *cctx = NULL, *sctx = NULL;
8635 SSL *clientssl = NULL, *serverssl = NULL;
8636 int testresult = 0;
8637 BIO *bretry = BIO_new(bio_s_always_retry()), *tmp = NULL;
8638
8639 if (!TEST_ptr(bretry))
8640 goto end;
8641
8642 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8643 TLS_client_method(),
8644 0, 0,
8645 &sctx, &cctx, cert, privkey)))
8646 goto end;
8647
8648 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
8649 NULL)))
8650 goto end;
8651
8652 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
8653 goto end;
8654
8655 /* Close write side of clientssl */
8656 if (!TEST_int_eq(SSL_shutdown(clientssl), 0))
8657 goto end;
8658
8659 tmp = SSL_get_wbio(serverssl);
8660 if (!TEST_true(BIO_up_ref(tmp))) {
8661 tmp = NULL;
8662 goto end;
8663 }
8664 SSL_set0_wbio(serverssl, bretry);
8665 bretry = NULL;
8666
8667 /* First server shutdown should fail because of a retrable write failure */
8668 if (!TEST_int_eq(SSL_shutdown(serverssl), -1)
8669 || !TEST_int_eq(SSL_get_error(serverssl, -1), SSL_ERROR_WANT_WRITE))
8670 goto end;
8671
8672 /* Second server shutdown should fail for the same reason */
8673 if (!TEST_int_eq(SSL_shutdown(serverssl), -1)
8674 || !TEST_int_eq(SSL_get_error(serverssl, -1), SSL_ERROR_WANT_WRITE))
8675 goto end;
8676
8677 SSL_set0_wbio(serverssl, tmp);
8678 tmp = NULL;
8679
8680 /* Third server shutdown should send close_notify */
8681 if (!TEST_int_eq(SSL_shutdown(serverssl), 0))
8682 goto end;
8683
8684 /* Fourth server shutdown should read close_notify from client and finish */
8685 if (!TEST_int_eq(SSL_shutdown(serverssl), 1))
8686 goto end;
8687
8688 /* Client should also successfully fully shutdown */
8689 if (!TEST_int_eq(SSL_shutdown(clientssl), 1))
8690 goto end;
8691
8692 testresult = 1;
8693 end:
8694 SSL_free(serverssl);
8695 SSL_free(clientssl);
8696 SSL_CTX_free(sctx);
8697 SSL_CTX_free(cctx);
8698 BIO_free(bretry);
8699 BIO_free(tmp);
8700
8701 return testresult;
8702 }
8703
8704 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
8705 static int cert_cb_cnt;
8706
8707 static int cert_cb(SSL *s, void *arg)
8708 {
8709 SSL_CTX *ctx = (SSL_CTX *)arg;
8710 BIO *in = NULL;
8711 EVP_PKEY *pkey = NULL;
8712 X509 *x509 = NULL, *rootx = NULL;
8713 STACK_OF(X509) *chain = NULL;
8714 char *rootfile = NULL, *ecdsacert = NULL, *ecdsakey = NULL;
8715 int ret = 0;
8716
8717 if (cert_cb_cnt == 0) {
8718 /* Suspend the handshake */
8719 cert_cb_cnt++;
8720 return -1;
8721 } else if (cert_cb_cnt == 1) {
8722 /*
8723 * Update the SSL_CTX, set the certificate and private key and then
8724 * continue the handshake normally.
8725 */
8726 if (ctx != NULL && !TEST_ptr(SSL_set_SSL_CTX(s, ctx)))
8727 return 0;
8728
8729 if (!TEST_true(SSL_use_certificate_file(s, cert, SSL_FILETYPE_PEM))
8730 || !TEST_true(SSL_use_PrivateKey_file(s, privkey,
8731 SSL_FILETYPE_PEM))
8732 || !TEST_true(SSL_check_private_key(s)))
8733 return 0;
8734 cert_cb_cnt++;
8735 return 1;
8736 } else if (cert_cb_cnt == 3) {
8737 int rv;
8738
8739 rootfile = test_mk_file_path(certsdir, "rootcert.pem");
8740 ecdsacert = test_mk_file_path(certsdir, "server-ecdsa-cert.pem");
8741 ecdsakey = test_mk_file_path(certsdir, "server-ecdsa-key.pem");
8742 if (!TEST_ptr(rootfile) || !TEST_ptr(ecdsacert) || !TEST_ptr(ecdsakey))
8743 goto out;
8744 chain = sk_X509_new_null();
8745 if (!TEST_ptr(chain))
8746 goto out;
8747 if (!TEST_ptr(in = BIO_new(BIO_s_file()))
8748 || !TEST_int_gt(BIO_read_filename(in, rootfile), 0)
8749 || !TEST_ptr(rootx = X509_new_ex(libctx, NULL))
8750 || !TEST_ptr(PEM_read_bio_X509(in, &rootx, NULL, NULL))
8751 || !TEST_true(sk_X509_push(chain, rootx)))
8752 goto out;
8753 rootx = NULL;
8754 BIO_free(in);
8755 if (!TEST_ptr(in = BIO_new(BIO_s_file()))
8756 || !TEST_int_gt(BIO_read_filename(in, ecdsacert), 0)
8757 || !TEST_ptr(x509 = X509_new_ex(libctx, NULL))
8758 || !TEST_ptr(PEM_read_bio_X509(in, &x509, NULL, NULL)))
8759 goto out;
8760 BIO_free(in);
8761 if (!TEST_ptr(in = BIO_new(BIO_s_file()))
8762 || !TEST_int_gt(BIO_read_filename(in, ecdsakey), 0)
8763 || !TEST_ptr(pkey = PEM_read_bio_PrivateKey_ex(in, NULL,
8764 NULL, NULL,
8765 libctx, NULL)))
8766 goto out;
8767 rv = SSL_check_chain(s, x509, pkey, chain);
8768 /*
8769 * If the cert doesn't show as valid here (e.g., because we don't
8770 * have any shared sigalgs), then we will not set it, and there will
8771 * be no certificate at all on the SSL or SSL_CTX. This, in turn,
8772 * will cause tls_choose_sigalgs() to fail the connection.
8773 */
8774 if ((rv & (CERT_PKEY_VALID | CERT_PKEY_CA_SIGNATURE))
8775 == (CERT_PKEY_VALID | CERT_PKEY_CA_SIGNATURE)) {
8776 if (!SSL_use_cert_and_key(s, x509, pkey, NULL, 1))
8777 goto out;
8778 }
8779
8780 ret = 1;
8781 }
8782
8783 /* Abort the handshake */
8784 out:
8785 OPENSSL_free(ecdsacert);
8786 OPENSSL_free(ecdsakey);
8787 OPENSSL_free(rootfile);
8788 BIO_free(in);
8789 EVP_PKEY_free(pkey);
8790 X509_free(x509);
8791 X509_free(rootx);
8792 OSSL_STACK_OF_X509_free(chain);
8793 return ret;
8794 }
8795
8796 /*
8797 * Test the certificate callback.
8798 * Test 0: Callback fails
8799 * Test 1: Success - no SSL_set_SSL_CTX() in the callback
8800 * Test 2: Success - SSL_set_SSL_CTX() in the callback
8801 * Test 3: Success - Call SSL_check_chain from the callback
8802 * Test 4: Failure - SSL_check_chain fails from callback due to bad cert in the
8803 * chain
8804 * Test 5: Failure - SSL_check_chain fails from callback due to bad ee cert
8805 */
8806 static int test_cert_cb_int(int prot, int tst)
8807 {
8808 SSL_CTX *cctx = NULL, *sctx = NULL, *snictx = NULL;
8809 SSL *clientssl = NULL, *serverssl = NULL;
8810 int testresult = 0, ret;
8811
8812 #ifdef OPENSSL_NO_EC
8813 /* We use an EC cert in these tests, so we skip in a no-ec build */
8814 if (tst >= 3)
8815 return 1;
8816 #endif
8817
8818 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8819 TLS_client_method(),
8820 TLS1_VERSION,
8821 prot,
8822 &sctx, &cctx, NULL, NULL)))
8823 goto end;
8824
8825 if (tst == 0)
8826 cert_cb_cnt = -1;
8827 else if (tst >= 3)
8828 cert_cb_cnt = 3;
8829 else
8830 cert_cb_cnt = 0;
8831
8832 if (tst == 2) {
8833 snictx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
8834 if (!TEST_ptr(snictx))
8835 goto end;
8836 }
8837
8838 SSL_CTX_set_cert_cb(sctx, cert_cb, snictx);
8839
8840 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8841 NULL, NULL)))
8842 goto end;
8843
8844 if (tst == 4) {
8845 /*
8846 * We cause SSL_check_chain() to fail by specifying sig_algs that
8847 * the chain doesn't meet (the root uses an RSA cert)
8848 */
8849 if (!TEST_true(SSL_set1_sigalgs_list(clientssl,
8850 "ecdsa_secp256r1_sha256")))
8851 goto end;
8852 } else if (tst == 5) {
8853 /*
8854 * We cause SSL_check_chain() to fail by specifying sig_algs that
8855 * the ee cert doesn't meet (the ee uses an ECDSA cert)
8856 */
8857 if (!TEST_true(SSL_set1_sigalgs_list(clientssl,
8858 "rsa_pss_rsae_sha256:rsa_pkcs1_sha256")))
8859 goto end;
8860 }
8861
8862 ret = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
8863 if (!TEST_true(tst == 0 || tst == 4 || tst == 5 ? !ret : ret)
8864 || (tst > 0
8865 && !TEST_int_eq((cert_cb_cnt - 2) * (cert_cb_cnt - 3), 0))) {
8866 goto end;
8867 }
8868
8869 testresult = 1;
8870
8871 end:
8872 SSL_free(serverssl);
8873 SSL_free(clientssl);
8874 SSL_CTX_free(sctx);
8875 SSL_CTX_free(cctx);
8876 SSL_CTX_free(snictx);
8877
8878 return testresult;
8879 }
8880 #endif
8881
8882 static int test_cert_cb(int tst)
8883 {
8884 int testresult = 1;
8885
8886 #ifndef OPENSSL_NO_TLS1_2
8887 testresult &= test_cert_cb_int(TLS1_2_VERSION, tst);
8888 #endif
8889 #ifndef OSSL_NO_USABLE_TLS1_3
8890 testresult &= test_cert_cb_int(TLS1_3_VERSION, tst);
8891 #endif
8892
8893 return testresult;
8894 }
8895
8896 static int client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
8897 {
8898 X509 *xcert;
8899 EVP_PKEY *privpkey;
8900 BIO *in = NULL;
8901 BIO *priv_in = NULL;
8902
8903 /* Check that SSL_get0_peer_certificate() returns something sensible */
8904 if (!TEST_ptr(SSL_get0_peer_certificate(ssl)))
8905 return 0;
8906
8907 in = BIO_new_file(cert, "r");
8908 if (!TEST_ptr(in))
8909 return 0;
8910
8911 if (!TEST_ptr(xcert = X509_new_ex(libctx, NULL))
8912 || !TEST_ptr(PEM_read_bio_X509(in, &xcert, NULL, NULL))
8913 || !TEST_ptr(priv_in = BIO_new_file(privkey, "r"))
8914 || !TEST_ptr(privpkey = PEM_read_bio_PrivateKey_ex(priv_in, NULL,
8915 NULL, NULL,
8916 libctx, NULL)))
8917 goto err;
8918
8919 *x509 = xcert;
8920 *pkey = privpkey;
8921
8922 BIO_free(in);
8923 BIO_free(priv_in);
8924 return 1;
8925 err:
8926 X509_free(xcert);
8927 BIO_free(in);
8928 BIO_free(priv_in);
8929 return 0;
8930 }
8931
8932 static int test_client_cert_cb(int tst)
8933 {
8934 SSL_CTX *cctx = NULL, *sctx = NULL;
8935 SSL *clientssl = NULL, *serverssl = NULL;
8936 int testresult = 0;
8937
8938 #ifdef OPENSSL_NO_TLS1_2
8939 if (tst == 0)
8940 return 1;
8941 #endif
8942 #ifdef OSSL_NO_USABLE_TLS1_3
8943 if (tst == 1)
8944 return 1;
8945 #endif
8946
8947 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8948 TLS_client_method(),
8949 TLS1_VERSION,
8950 tst == 0 ? TLS1_2_VERSION
8951 : TLS1_3_VERSION,
8952 &sctx, &cctx, cert, privkey)))
8953 goto end;
8954
8955 /*
8956 * Test that setting a client_cert_cb results in a client certificate being
8957 * sent.
8958 */
8959 SSL_CTX_set_client_cert_cb(cctx, client_cert_cb);
8960 SSL_CTX_set_verify(sctx,
8961 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
8962 verify_cb);
8963
8964 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8965 NULL, NULL))
8966 || !TEST_true(create_ssl_connection(serverssl, clientssl,
8967 SSL_ERROR_NONE)))
8968 goto end;
8969
8970 testresult = 1;
8971
8972 end:
8973 SSL_free(serverssl);
8974 SSL_free(clientssl);
8975 SSL_CTX_free(sctx);
8976 SSL_CTX_free(cctx);
8977
8978 return testresult;
8979 }
8980
8981 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
8982 /*
8983 * Test setting certificate authorities on both client and server.
8984 *
8985 * Test 0: SSL_CTX_set0_CA_list() only
8986 * Test 1: Both SSL_CTX_set0_CA_list() and SSL_CTX_set_client_CA_list()
8987 * Test 2: Only SSL_CTX_set_client_CA_list()
8988 */
8989 static int test_ca_names_int(int prot, int tst)
8990 {
8991 SSL_CTX *cctx = NULL, *sctx = NULL;
8992 SSL *clientssl = NULL, *serverssl = NULL;
8993 int testresult = 0;
8994 size_t i;
8995 X509_NAME *name[] = { NULL, NULL, NULL, NULL };
8996 char *strnames[] = { "Jack", "Jill", "John", "Joanne" };
8997 STACK_OF(X509_NAME) *sk1 = NULL, *sk2 = NULL;
8998 const STACK_OF(X509_NAME) *sktmp = NULL;
8999
9000 for (i = 0; i < OSSL_NELEM(name); i++) {
9001 name[i] = X509_NAME_new();
9002 if (!TEST_ptr(name[i])
9003 || !TEST_true(X509_NAME_add_entry_by_txt(name[i], "CN",
9004 MBSTRING_ASC,
9005 (unsigned char *)
9006 strnames[i],
9007 -1, -1, 0)))
9008 goto end;
9009 }
9010
9011 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9012 TLS_client_method(),
9013 TLS1_VERSION,
9014 prot,
9015 &sctx, &cctx, cert, privkey)))
9016 goto end;
9017
9018 SSL_CTX_set_verify(sctx, SSL_VERIFY_PEER, NULL);
9019
9020 if (tst == 0 || tst == 1) {
9021 if (!TEST_ptr(sk1 = sk_X509_NAME_new_null())
9022 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[0])))
9023 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[1])))
9024 || !TEST_ptr(sk2 = sk_X509_NAME_new_null())
9025 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[0])))
9026 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[1]))))
9027 goto end;
9028
9029 SSL_CTX_set0_CA_list(sctx, sk1);
9030 SSL_CTX_set0_CA_list(cctx, sk2);
9031 sk1 = sk2 = NULL;
9032 }
9033 if (tst == 1 || tst == 2) {
9034 if (!TEST_ptr(sk1 = sk_X509_NAME_new_null())
9035 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[2])))
9036 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[3])))
9037 || !TEST_ptr(sk2 = sk_X509_NAME_new_null())
9038 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[2])))
9039 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[3]))))
9040 goto end;
9041
9042 SSL_CTX_set_client_CA_list(sctx, sk1);
9043 SSL_CTX_set_client_CA_list(cctx, sk2);
9044 sk1 = sk2 = NULL;
9045 }
9046
9047 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9048 NULL, NULL))
9049 || !TEST_true(create_ssl_connection(serverssl, clientssl,
9050 SSL_ERROR_NONE)))
9051 goto end;
9052
9053 /*
9054 * We only expect certificate authorities to have been sent to the server
9055 * if we are using TLSv1.3 and SSL_set0_CA_list() was used
9056 */
9057 sktmp = SSL_get0_peer_CA_list(serverssl);
9058 if (prot == TLS1_3_VERSION
9059 && (tst == 0 || tst == 1)) {
9060 if (!TEST_ptr(sktmp)
9061 || !TEST_int_eq(sk_X509_NAME_num(sktmp), 2)
9062 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 0),
9063 name[0]), 0)
9064 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 1),
9065 name[1]), 0))
9066 goto end;
9067 } else if (!TEST_ptr_null(sktmp)) {
9068 goto end;
9069 }
9070
9071 /*
9072 * In all tests we expect certificate authorities to have been sent to the
9073 * client. However, SSL_set_client_CA_list() should override
9074 * SSL_set0_CA_list()
9075 */
9076 sktmp = SSL_get0_peer_CA_list(clientssl);
9077 if (!TEST_ptr(sktmp)
9078 || !TEST_int_eq(sk_X509_NAME_num(sktmp), 2)
9079 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 0),
9080 name[tst == 0 ? 0 : 2]), 0)
9081 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 1),
9082 name[tst == 0 ? 1 : 3]), 0))
9083 goto end;
9084
9085 testresult = 1;
9086
9087 end:
9088 SSL_free(serverssl);
9089 SSL_free(clientssl);
9090 SSL_CTX_free(sctx);
9091 SSL_CTX_free(cctx);
9092 for (i = 0; i < OSSL_NELEM(name); i++)
9093 X509_NAME_free(name[i]);
9094 sk_X509_NAME_pop_free(sk1, X509_NAME_free);
9095 sk_X509_NAME_pop_free(sk2, X509_NAME_free);
9096
9097 return testresult;
9098 }
9099 #endif
9100
9101 static int test_ca_names(int tst)
9102 {
9103 int testresult = 1;
9104
9105 #ifndef OPENSSL_NO_TLS1_2
9106 testresult &= test_ca_names_int(TLS1_2_VERSION, tst);
9107 #endif
9108 #ifndef OSSL_NO_USABLE_TLS1_3
9109 testresult &= test_ca_names_int(TLS1_3_VERSION, tst);
9110 #endif
9111
9112 return testresult;
9113 }
9114
9115 #ifndef OPENSSL_NO_TLS1_2
9116 static const char *multiblock_cipherlist_data[]=
9117 {
9118 "AES128-SHA",
9119 "AES128-SHA256",
9120 "AES256-SHA",
9121 "AES256-SHA256",
9122 };
9123
9124 /* Reduce the fragment size - so the multiblock test buffer can be small */
9125 # define MULTIBLOCK_FRAGSIZE 512
9126
9127 static int test_multiblock_write(int test_index)
9128 {
9129 static const char *fetchable_ciphers[]=
9130 {
9131 "AES-128-CBC-HMAC-SHA1",
9132 "AES-128-CBC-HMAC-SHA256",
9133 "AES-256-CBC-HMAC-SHA1",
9134 "AES-256-CBC-HMAC-SHA256"
9135 };
9136 const char *cipherlist = multiblock_cipherlist_data[test_index];
9137 const SSL_METHOD *smeth = TLS_server_method();
9138 const SSL_METHOD *cmeth = TLS_client_method();
9139 int min_version = TLS1_VERSION;
9140 int max_version = TLS1_2_VERSION; /* Don't select TLS1_3 */
9141 SSL_CTX *cctx = NULL, *sctx = NULL;
9142 SSL *clientssl = NULL, *serverssl = NULL;
9143 int testresult = 0;
9144
9145 /*
9146 * Choose a buffer large enough to perform a multi-block operation
9147 * i.e: write_len >= 4 * frag_size
9148 * 9 * is chosen so that multiple multiblocks are used + some leftover.
9149 */
9150 unsigned char msg[MULTIBLOCK_FRAGSIZE * 9];
9151 unsigned char buf[sizeof(msg)], *p = buf;
9152 size_t readbytes, written, len;
9153 EVP_CIPHER *ciph = NULL;
9154
9155 /*
9156 * Check if the cipher exists before attempting to use it since it only has
9157 * a hardware specific implementation.
9158 */
9159 ciph = EVP_CIPHER_fetch(libctx, fetchable_ciphers[test_index], "");
9160 if (ciph == NULL) {
9161 TEST_skip("Multiblock cipher is not available for %s", cipherlist);
9162 return 1;
9163 }
9164 EVP_CIPHER_free(ciph);
9165
9166 /* Set up a buffer with some data that will be sent to the client */
9167 RAND_bytes(msg, sizeof(msg));
9168
9169 if (!TEST_true(create_ssl_ctx_pair(libctx, smeth, cmeth, min_version,
9170 max_version, &sctx, &cctx, cert,
9171 privkey)))
9172 goto end;
9173
9174 if (!TEST_true(SSL_CTX_set_max_send_fragment(sctx, MULTIBLOCK_FRAGSIZE)))
9175 goto end;
9176
9177 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9178 NULL, NULL)))
9179 goto end;
9180
9181 /* settings to force it to use AES-CBC-HMAC_SHA */
9182 SSL_set_options(serverssl, SSL_OP_NO_ENCRYPT_THEN_MAC);
9183 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, cipherlist)))
9184 goto end;
9185
9186 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9187 goto end;
9188
9189 if (!TEST_true(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
9190 || !TEST_size_t_eq(written, sizeof(msg)))
9191 goto end;
9192
9193 len = written;
9194 while (len > 0) {
9195 if (!TEST_true(SSL_read_ex(clientssl, p, MULTIBLOCK_FRAGSIZE, &readbytes)))
9196 goto end;
9197 p += readbytes;
9198 len -= readbytes;
9199 }
9200 if (!TEST_mem_eq(msg, sizeof(msg), buf, sizeof(buf)))
9201 goto end;
9202
9203 testresult = 1;
9204 end:
9205 SSL_free(serverssl);
9206 SSL_free(clientssl);
9207 SSL_CTX_free(sctx);
9208 SSL_CTX_free(cctx);
9209
9210 return testresult;
9211 }
9212 #endif /* OPENSSL_NO_TLS1_2 */
9213
9214 static int test_session_timeout(int test)
9215 {
9216 /*
9217 * Test session ordering and timeout
9218 * Can't explicitly test performance of the new code,
9219 * but can test to see if the ordering of the sessions
9220 * are correct, and they are removed as expected
9221 */
9222 SSL_SESSION *early = NULL;
9223 SSL_SESSION *middle = NULL;
9224 SSL_SESSION *late = NULL;
9225 SSL_CTX *ctx;
9226 int testresult = 0;
9227 long now = (long)time(NULL);
9228 #define TIMEOUT 10
9229
9230 if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_method()))
9231 || !TEST_ptr(early = SSL_SESSION_new())
9232 || !TEST_ptr(middle = SSL_SESSION_new())
9233 || !TEST_ptr(late = SSL_SESSION_new()))
9234 goto end;
9235
9236 /* assign unique session ids */
9237 early->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
9238 memset(early->session_id, 1, SSL3_SSL_SESSION_ID_LENGTH);
9239 middle->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
9240 memset(middle->session_id, 2, SSL3_SSL_SESSION_ID_LENGTH);
9241 late->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
9242 memset(late->session_id, 3, SSL3_SSL_SESSION_ID_LENGTH);
9243
9244 if (!TEST_int_eq(SSL_CTX_add_session(ctx, early), 1)
9245 || !TEST_int_eq(SSL_CTX_add_session(ctx, middle), 1)
9246 || !TEST_int_eq(SSL_CTX_add_session(ctx, late), 1))
9247 goto end;
9248
9249 /* Make sure they are all added */
9250 if (!TEST_ptr(early->prev)
9251 || !TEST_ptr(middle->prev)
9252 || !TEST_ptr(late->prev))
9253 goto end;
9254
9255 if (!TEST_int_ne(SSL_SESSION_set_time(early, now - 10), 0)
9256 || !TEST_int_ne(SSL_SESSION_set_time(middle, now), 0)
9257 || !TEST_int_ne(SSL_SESSION_set_time(late, now + 10), 0))
9258 goto end;
9259
9260 if (!TEST_int_ne(SSL_SESSION_set_timeout(early, TIMEOUT), 0)
9261 || !TEST_int_ne(SSL_SESSION_set_timeout(middle, TIMEOUT), 0)
9262 || !TEST_int_ne(SSL_SESSION_set_timeout(late, TIMEOUT), 0))
9263 goto end;
9264
9265 /* Make sure they are all still there */
9266 if (!TEST_ptr(early->prev)
9267 || !TEST_ptr(middle->prev)
9268 || !TEST_ptr(late->prev))
9269 goto end;
9270
9271 /* Make sure they are in the expected order */
9272 if (!TEST_ptr_eq(late->next, middle)
9273 || !TEST_ptr_eq(middle->next, early)
9274 || !TEST_ptr_eq(early->prev, middle)
9275 || !TEST_ptr_eq(middle->prev, late))
9276 goto end;
9277
9278 /* This should remove "early" */
9279 SSL_CTX_flush_sessions(ctx, now + TIMEOUT - 1);
9280 if (!TEST_ptr_null(early->prev)
9281 || !TEST_ptr(middle->prev)
9282 || !TEST_ptr(late->prev))
9283 goto end;
9284
9285 /* This should remove "middle" */
9286 SSL_CTX_flush_sessions(ctx, now + TIMEOUT + 1);
9287 if (!TEST_ptr_null(early->prev)
9288 || !TEST_ptr_null(middle->prev)
9289 || !TEST_ptr(late->prev))
9290 goto end;
9291
9292 /* This should remove "late" */
9293 SSL_CTX_flush_sessions(ctx, now + TIMEOUT + 11);
9294 if (!TEST_ptr_null(early->prev)
9295 || !TEST_ptr_null(middle->prev)
9296 || !TEST_ptr_null(late->prev))
9297 goto end;
9298
9299 /* Add them back in again */
9300 if (!TEST_int_eq(SSL_CTX_add_session(ctx, early), 1)
9301 || !TEST_int_eq(SSL_CTX_add_session(ctx, middle), 1)
9302 || !TEST_int_eq(SSL_CTX_add_session(ctx, late), 1))
9303 goto end;
9304
9305 /* Make sure they are all added */
9306 if (!TEST_ptr(early->prev)
9307 || !TEST_ptr(middle->prev)
9308 || !TEST_ptr(late->prev))
9309 goto end;
9310
9311 /* This should remove all of them */
9312 SSL_CTX_flush_sessions(ctx, 0);
9313 if (!TEST_ptr_null(early->prev)
9314 || !TEST_ptr_null(middle->prev)
9315 || !TEST_ptr_null(late->prev))
9316 goto end;
9317
9318 (void)SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_UPDATE_TIME
9319 | SSL_CTX_get_session_cache_mode(ctx));
9320
9321 /* make sure |now| is NOT equal to the current time */
9322 now -= 10;
9323 if (!TEST_int_ne(SSL_SESSION_set_time(early, now), 0)
9324 || !TEST_int_eq(SSL_CTX_add_session(ctx, early), 1)
9325 || !TEST_long_ne(SSL_SESSION_get_time(early), now))
9326 goto end;
9327
9328 testresult = 1;
9329 end:
9330 SSL_CTX_free(ctx);
9331 SSL_SESSION_free(early);
9332 SSL_SESSION_free(middle);
9333 SSL_SESSION_free(late);
9334 return testresult;
9335 }
9336
9337 /*
9338 * Test 0: Client sets servername and server acknowledges it (TLSv1.2)
9339 * Test 1: Client sets servername and server does not acknowledge it (TLSv1.2)
9340 * Test 2: Client sets inconsistent servername on resumption (TLSv1.2)
9341 * Test 3: Client does not set servername on initial handshake (TLSv1.2)
9342 * Test 4: Client does not set servername on resumption handshake (TLSv1.2)
9343 * Test 5: Client sets servername and server acknowledges it (TLSv1.3)
9344 * Test 6: Client sets servername and server does not acknowledge it (TLSv1.3)
9345 * Test 7: Client sets inconsistent servername on resumption (TLSv1.3)
9346 * Test 8: Client does not set servername on initial handshake(TLSv1.3)
9347 * Test 9: Client does not set servername on resumption handshake (TLSv1.3)
9348 */
9349 static int test_servername(int tst)
9350 {
9351 SSL_CTX *cctx = NULL, *sctx = NULL;
9352 SSL *clientssl = NULL, *serverssl = NULL;
9353 int testresult = 0;
9354 SSL_SESSION *sess = NULL;
9355 const char *sexpectedhost = NULL, *cexpectedhost = NULL;
9356
9357 #ifdef OPENSSL_NO_TLS1_2
9358 if (tst <= 4)
9359 return 1;
9360 #endif
9361 #ifdef OSSL_NO_USABLE_TLS1_3
9362 if (tst >= 5)
9363 return 1;
9364 #endif
9365
9366 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9367 TLS_client_method(),
9368 TLS1_VERSION,
9369 (tst <= 4) ? TLS1_2_VERSION
9370 : TLS1_3_VERSION,
9371 &sctx, &cctx, cert, privkey))
9372 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9373 NULL, NULL)))
9374 goto end;
9375
9376 if (tst != 1 && tst != 6) {
9377 if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx,
9378 hostname_cb)))
9379 goto end;
9380 }
9381
9382 if (tst != 3 && tst != 8) {
9383 if (!TEST_true(SSL_set_tlsext_host_name(clientssl, "goodhost")))
9384 goto end;
9385 sexpectedhost = cexpectedhost = "goodhost";
9386 }
9387
9388 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9389 goto end;
9390
9391 if (!TEST_str_eq(SSL_get_servername(clientssl, TLSEXT_NAMETYPE_host_name),
9392 cexpectedhost)
9393 || !TEST_str_eq(SSL_get_servername(serverssl,
9394 TLSEXT_NAMETYPE_host_name),
9395 sexpectedhost))
9396 goto end;
9397
9398 /* Now repeat with a resumption handshake */
9399
9400 if (!TEST_int_eq(SSL_shutdown(clientssl), 0)
9401 || !TEST_ptr_ne(sess = SSL_get1_session(clientssl), NULL)
9402 || !TEST_true(SSL_SESSION_is_resumable(sess))
9403 || !TEST_int_eq(SSL_shutdown(serverssl), 0))
9404 goto end;
9405
9406 SSL_free(clientssl);
9407 SSL_free(serverssl);
9408 clientssl = serverssl = NULL;
9409
9410 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
9411 NULL)))
9412 goto end;
9413
9414 if (!TEST_true(SSL_set_session(clientssl, sess)))
9415 goto end;
9416
9417 sexpectedhost = cexpectedhost = "goodhost";
9418 if (tst == 2 || tst == 7) {
9419 /* Set an inconsistent hostname */
9420 if (!TEST_true(SSL_set_tlsext_host_name(clientssl, "altgoodhost")))
9421 goto end;
9422 /*
9423 * In TLSv1.2 we expect the hostname from the original handshake, in
9424 * TLSv1.3 we expect the hostname from this handshake
9425 */
9426 if (tst == 7)
9427 sexpectedhost = cexpectedhost = "altgoodhost";
9428
9429 if (!TEST_str_eq(SSL_get_servername(clientssl,
9430 TLSEXT_NAMETYPE_host_name),
9431 "altgoodhost"))
9432 goto end;
9433 } else if (tst == 4 || tst == 9) {
9434 /*
9435 * A TLSv1.3 session does not associate a session with a servername,
9436 * but a TLSv1.2 session does.
9437 */
9438 if (tst == 9)
9439 sexpectedhost = cexpectedhost = NULL;
9440
9441 if (!TEST_str_eq(SSL_get_servername(clientssl,
9442 TLSEXT_NAMETYPE_host_name),
9443 cexpectedhost))
9444 goto end;
9445 } else {
9446 if (!TEST_true(SSL_set_tlsext_host_name(clientssl, "goodhost")))
9447 goto end;
9448 /*
9449 * In a TLSv1.2 resumption where the hostname was not acknowledged
9450 * we expect the hostname on the server to be empty. On the client we
9451 * return what was requested in this case.
9452 *
9453 * Similarly if the client didn't set a hostname on an original TLSv1.2
9454 * session but is now, the server hostname will be empty, but the client
9455 * is as we set it.
9456 */
9457 if (tst == 1 || tst == 3)
9458 sexpectedhost = NULL;
9459
9460 if (!TEST_str_eq(SSL_get_servername(clientssl,
9461 TLSEXT_NAMETYPE_host_name),
9462 "goodhost"))
9463 goto end;
9464 }
9465
9466 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9467 goto end;
9468
9469 if (!TEST_true(SSL_session_reused(clientssl))
9470 || !TEST_true(SSL_session_reused(serverssl))
9471 || !TEST_str_eq(SSL_get_servername(clientssl,
9472 TLSEXT_NAMETYPE_host_name),
9473 cexpectedhost)
9474 || !TEST_str_eq(SSL_get_servername(serverssl,
9475 TLSEXT_NAMETYPE_host_name),
9476 sexpectedhost))
9477 goto end;
9478
9479 testresult = 1;
9480
9481 end:
9482 SSL_SESSION_free(sess);
9483 SSL_free(serverssl);
9484 SSL_free(clientssl);
9485 SSL_CTX_free(sctx);
9486 SSL_CTX_free(cctx);
9487
9488 return testresult;
9489 }
9490
9491 static int test_unknown_sigalgs_groups(void)
9492 {
9493 int ret = 0;
9494 SSL_CTX *ctx = NULL;
9495
9496 if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method())))
9497 goto end;
9498
9499 if (!TEST_int_gt(SSL_CTX_set1_sigalgs_list(ctx,
9500 "RSA+SHA256:?nonexistent:?RSA+SHA512"),
9501 0))
9502 goto end;
9503 if (!TEST_size_t_eq(ctx->cert->conf_sigalgslen, 2)
9504 || !TEST_int_eq(ctx->cert->conf_sigalgs[0], TLSEXT_SIGALG_rsa_pkcs1_sha256)
9505 || !TEST_int_eq(ctx->cert->conf_sigalgs[1], TLSEXT_SIGALG_rsa_pkcs1_sha512))
9506 goto end;
9507
9508 if (!TEST_int_gt(SSL_CTX_set1_client_sigalgs_list(ctx,
9509 "RSA+SHA256:?nonexistent:?RSA+SHA512"),
9510 0))
9511 goto end;
9512 if (!TEST_size_t_eq(ctx->cert->client_sigalgslen, 2)
9513 || !TEST_int_eq(ctx->cert->client_sigalgs[0], TLSEXT_SIGALG_rsa_pkcs1_sha256)
9514 || !TEST_int_eq(ctx->cert->client_sigalgs[1], TLSEXT_SIGALG_rsa_pkcs1_sha512))
9515 goto end;
9516
9517 if (!TEST_int_le(SSL_CTX_set1_groups_list(ctx,
9518 "nonexistent"),
9519 0))
9520 goto end;
9521
9522 if (!TEST_int_le(SSL_CTX_set1_groups_list(ctx,
9523 "?nonexistent1:?nonexistent2:?nonexistent3"),
9524 0))
9525 goto end;
9526
9527 #ifndef OPENSSL_NO_EC
9528 if (!TEST_int_le(SSL_CTX_set1_groups_list(ctx,
9529 "P-256:nonexistent"),
9530 0))
9531 goto end;
9532
9533 if (!TEST_int_gt(SSL_CTX_set1_groups_list(ctx,
9534 "P-384:?nonexistent:?P-521"),
9535 0))
9536 goto end;
9537 if (!TEST_size_t_eq(ctx->ext.supportedgroups_len, 2)
9538 || !TEST_int_eq(ctx->ext.supportedgroups[0], OSSL_TLS_GROUP_ID_secp384r1)
9539 || !TEST_int_eq(ctx->ext.supportedgroups[1], OSSL_TLS_GROUP_ID_secp521r1))
9540 goto end;
9541 #endif
9542
9543 ret = 1;
9544 end:
9545 SSL_CTX_free(ctx);
9546 return ret;
9547 }
9548
9549 #if !defined(OPENSSL_NO_EC) \
9550 && (!defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2))
9551 /*
9552 * Test that if signature algorithms are not available, then we do not offer or
9553 * accept them.
9554 * Test 0: Two RSA sig algs available: both RSA sig algs shared
9555 * Test 1: The client only has SHA2-256: only SHA2-256 algorithms shared
9556 * Test 2: The server only has SHA2-256: only SHA2-256 algorithms shared
9557 * Test 3: An RSA and an ECDSA sig alg available: both sig algs shared
9558 * Test 4: The client only has an ECDSA sig alg: only ECDSA algorithms shared
9559 * Test 5: The server only has an ECDSA sig alg: only ECDSA algorithms shared
9560 */
9561 static int test_sigalgs_available(int idx)
9562 {
9563 SSL_CTX *cctx = NULL, *sctx = NULL;
9564 SSL *clientssl = NULL, *serverssl = NULL;
9565 int testresult = 0;
9566 OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
9567 OSSL_LIB_CTX *clientctx = libctx, *serverctx = libctx;
9568 OSSL_PROVIDER *filterprov = NULL;
9569 int sig, hash;
9570
9571 if (!TEST_ptr(tmpctx))
9572 goto end;
9573
9574 if (idx != 0 && idx != 3) {
9575 if (!TEST_true(OSSL_PROVIDER_add_builtin(tmpctx, "filter",
9576 filter_provider_init)))
9577 goto end;
9578
9579 filterprov = OSSL_PROVIDER_load(tmpctx, "filter");
9580 if (!TEST_ptr(filterprov))
9581 goto end;
9582
9583 if (idx < 3) {
9584 /*
9585 * Only enable SHA2-256 so rsa_pss_rsae_sha384 should not be offered
9586 * or accepted for the peer that uses this libctx. Note that libssl
9587 * *requires* SHA2-256 to be available so we cannot disable that. We
9588 * also need SHA1 for our certificate.
9589 */
9590 if (!TEST_true(filter_provider_set_filter(OSSL_OP_DIGEST,
9591 "SHA2-256:SHA1")))
9592 goto end;
9593 } else {
9594 if (!TEST_true(filter_provider_set_filter(OSSL_OP_SIGNATURE,
9595 "ECDSA"))
9596 # ifdef OPENSSL_NO_ECX
9597 || !TEST_true(filter_provider_set_filter(OSSL_OP_KEYMGMT, "EC"))
9598 # else
9599 || !TEST_true(filter_provider_set_filter(OSSL_OP_KEYMGMT,
9600 "EC:X25519:X448"))
9601 # endif
9602 )
9603 goto end;
9604 }
9605
9606 if (idx == 1 || idx == 4)
9607 clientctx = tmpctx;
9608 else
9609 serverctx = tmpctx;
9610 }
9611
9612 cctx = SSL_CTX_new_ex(clientctx, NULL, TLS_client_method());
9613 sctx = SSL_CTX_new_ex(serverctx, NULL, TLS_server_method());
9614 if (!TEST_ptr(cctx) || !TEST_ptr(sctx))
9615 goto end;
9616
9617 if (idx != 5) {
9618 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9619 TLS_client_method(),
9620 TLS1_VERSION,
9621 0,
9622 &sctx, &cctx, cert, privkey)))
9623 goto end;
9624 } else {
9625 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9626 TLS_client_method(),
9627 TLS1_VERSION,
9628 0,
9629 &sctx, &cctx, cert2, privkey2)))
9630 goto end;
9631 }
9632
9633 /* Ensure we only use TLSv1.2 ciphersuites based on SHA256 */
9634 if (idx < 4) {
9635 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
9636 "ECDHE-RSA-AES128-GCM-SHA256")))
9637 goto end;
9638 } else {
9639 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
9640 "ECDHE-ECDSA-AES128-GCM-SHA256")))
9641 goto end;
9642 }
9643
9644 if (idx < 3) {
9645 if (!SSL_CTX_set1_sigalgs_list(cctx,
9646 "rsa_pss_rsae_sha384"
9647 ":rsa_pss_rsae_sha256")
9648 || !SSL_CTX_set1_sigalgs_list(sctx,
9649 "rsa_pss_rsae_sha384"
9650 ":rsa_pss_rsae_sha256"))
9651 goto end;
9652 } else {
9653 if (!SSL_CTX_set1_sigalgs_list(cctx, "rsa_pss_rsae_sha256:ECDSA+SHA256")
9654 || !SSL_CTX_set1_sigalgs_list(sctx,
9655 "rsa_pss_rsae_sha256:ECDSA+SHA256"))
9656 goto end;
9657 }
9658
9659 if (idx != 5
9660 && (!TEST_int_eq(SSL_CTX_use_certificate_file(sctx, cert2,
9661 SSL_FILETYPE_PEM), 1)
9662 || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(sctx,
9663 privkey2,
9664 SSL_FILETYPE_PEM), 1)
9665 || !TEST_int_eq(SSL_CTX_check_private_key(sctx), 1)))
9666 goto end;
9667
9668 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9669 NULL, NULL)))
9670 goto end;
9671
9672 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9673 goto end;
9674
9675 /* For tests 0 and 3 we expect 2 shared sigalgs, otherwise exactly 1 */
9676 if (!TEST_int_eq(SSL_get_shared_sigalgs(serverssl, 0, &sig, &hash, NULL,
9677 NULL, NULL),
9678 (idx == 0 || idx == 3) ? 2 : 1))
9679 goto end;
9680
9681 if (!TEST_int_eq(hash, idx == 0 ? NID_sha384 : NID_sha256))
9682 goto end;
9683
9684 if (!TEST_int_eq(sig, (idx == 4 || idx == 5) ? EVP_PKEY_EC
9685 : NID_rsassaPss))
9686 goto end;
9687
9688 testresult = filter_provider_check_clean_finish();
9689
9690 end:
9691 SSL_free(serverssl);
9692 SSL_free(clientssl);
9693 SSL_CTX_free(sctx);
9694 SSL_CTX_free(cctx);
9695 OSSL_PROVIDER_unload(filterprov);
9696 OSSL_LIB_CTX_free(tmpctx);
9697
9698 return testresult;
9699 }
9700 #endif /*
9701 * !defined(OPENSSL_NO_EC) \
9702 * && (!defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2))
9703 */
9704
9705 #ifndef OPENSSL_NO_TLS1_3
9706 /* This test can run in TLSv1.3 even if ec and dh are disabled */
9707 static int test_pluggable_group(int idx)
9708 {
9709 SSL_CTX *cctx = NULL, *sctx = NULL;
9710 SSL *clientssl = NULL, *serverssl = NULL;
9711 int testresult = 0;
9712 OSSL_PROVIDER *tlsprov = OSSL_PROVIDER_load(libctx, "tls-provider");
9713 /* Check that we are not impacted by a provider without any groups */
9714 OSSL_PROVIDER *legacyprov = OSSL_PROVIDER_load(libctx, "legacy");
9715 const char *group_name = idx == 0 ? "xorkemgroup" : "xorgroup";
9716
9717 if (!TEST_ptr(tlsprov))
9718 goto end;
9719
9720 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9721 TLS_client_method(),
9722 TLS1_3_VERSION,
9723 TLS1_3_VERSION,
9724 &sctx, &cctx, cert, privkey))
9725 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9726 NULL, NULL)))
9727 goto end;
9728
9729 /* ensure GROUPLIST_INCREMENT (=40) logic triggers: */
9730 if (!TEST_true(SSL_set1_groups_list(serverssl, "xorgroup:xorkemgroup:dummy1:dummy2:dummy3:dummy4:dummy5:dummy6:dummy7:dummy8:dummy9:dummy10:dummy11:dummy12:dummy13:dummy14:dummy15:dummy16:dummy17:dummy18:dummy19:dummy20:dummy21:dummy22:dummy23:dummy24:dummy25:dummy26:dummy27:dummy28:dummy29:dummy30:dummy31:dummy32:dummy33:dummy34:dummy35:dummy36:dummy37:dummy38:dummy39:dummy40:dummy41:dummy42:dummy43"))
9731 /* removing a single algorithm from the list makes the test pass */
9732 || !TEST_true(SSL_set1_groups_list(clientssl, group_name)))
9733 goto end;
9734
9735 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9736 goto end;
9737
9738 if (!TEST_str_eq(group_name,
9739 SSL_group_to_name(serverssl, SSL_get_shared_group(serverssl, 0))))
9740 goto end;
9741
9742 if (!TEST_str_eq(group_name, SSL_get0_group_name(serverssl))
9743 || !TEST_str_eq(group_name, SSL_get0_group_name(clientssl)))
9744 goto end;
9745
9746 testresult = 1;
9747
9748 end:
9749 SSL_free(serverssl);
9750 SSL_free(clientssl);
9751 SSL_CTX_free(sctx);
9752 SSL_CTX_free(cctx);
9753 OSSL_PROVIDER_unload(tlsprov);
9754 OSSL_PROVIDER_unload(legacyprov);
9755
9756 return testresult;
9757 }
9758
9759 /*
9760 * This function triggers encode, decode and sign functions
9761 * of the artificial "xorhmacsig" algorithm implemented in tls-provider
9762 * creating private key and certificate files for use in TLS testing.
9763 */
9764 static int create_cert_key(int idx, char *certfilename, char *privkeyfilename)
9765 {
9766 EVP_PKEY_CTX *evpctx = EVP_PKEY_CTX_new_from_name(libctx,
9767 (idx == 0) ? "xorhmacsig" : "xorhmacsha2sig", NULL);
9768 EVP_PKEY *pkey = NULL;
9769 X509 *x509 = X509_new();
9770 X509_NAME *name = NULL;
9771 BIO *keybio = NULL, *certbio = NULL;
9772 int ret = 1;
9773
9774 if (!TEST_ptr(evpctx)
9775 || !TEST_true(EVP_PKEY_keygen_init(evpctx))
9776 || !TEST_true(EVP_PKEY_generate(evpctx, &pkey))
9777 || !TEST_ptr(pkey)
9778 || !TEST_ptr(x509)
9779 || !TEST_true(ASN1_INTEGER_set(X509_get_serialNumber(x509), 1))
9780 || !TEST_true(X509_gmtime_adj(X509_getm_notBefore(x509), 0))
9781 || !TEST_true(X509_gmtime_adj(X509_getm_notAfter(x509), 31536000L))
9782 || !TEST_true(X509_set_pubkey(x509, pkey))
9783 || !TEST_ptr(name = X509_get_subject_name(x509))
9784 || !TEST_true(X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC,
9785 (unsigned char *)"CH", -1, -1, 0))
9786 || !TEST_true(X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC,
9787 (unsigned char *)"test.org", -1, -1, 0))
9788 || !TEST_true(X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
9789 (unsigned char *)"localhost", -1, -1, 0))
9790 || !TEST_true(X509_set_issuer_name(x509, name))
9791 || !TEST_true(X509_sign(x509, pkey, EVP_sha1()))
9792 || !TEST_ptr(keybio = BIO_new_file(privkeyfilename, "wb"))
9793 || !TEST_true(PEM_write_bio_PrivateKey(keybio, pkey, NULL, NULL, 0, NULL, NULL))
9794 || !TEST_ptr(certbio = BIO_new_file(certfilename, "wb"))
9795 || !TEST_true(PEM_write_bio_X509(certbio, x509)))
9796 ret = 0;
9797
9798 EVP_PKEY_free(pkey);
9799 X509_free(x509);
9800 EVP_PKEY_CTX_free(evpctx);
9801 BIO_free(keybio);
9802 BIO_free(certbio);
9803 return ret;
9804 }
9805
9806 /*
9807 * Test that signature algorithms loaded via the provider interface can
9808 * correctly establish a TLS (1.3) connection.
9809 * Test 0: Signature algorithm with built-in hashing functionality: "xorhmacsig"
9810 * Test 1: Signature algorithm using external SHA2 hashing: "xorhmacsha2sig"
9811 * Test 2: Test 0 using RPK
9812 * Test 3: Test 1 using RPK
9813 */
9814 static int test_pluggable_signature(int idx)
9815 {
9816 static const unsigned char cert_type_rpk[] = { TLSEXT_cert_type_rpk, TLSEXT_cert_type_x509 };
9817 SSL_CTX *cctx = NULL, *sctx = NULL;
9818 SSL *clientssl = NULL, *serverssl = NULL;
9819 int testresult = 0;
9820 OSSL_PROVIDER *tlsprov = OSSL_PROVIDER_load(libctx, "tls-provider");
9821 OSSL_PROVIDER *defaultprov = OSSL_PROVIDER_load(libctx, "default");
9822 char *certfilename = "tls-prov-cert.pem";
9823 char *privkeyfilename = "tls-prov-key.pem";
9824 int sigidx = idx % 2;
9825 int rpkidx = idx / 2;
9826
9827 /* create key and certificate for the different algorithm types */
9828 if (!TEST_ptr(tlsprov)
9829 || !TEST_true(create_cert_key(sigidx, certfilename, privkeyfilename)))
9830 goto end;
9831
9832 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9833 TLS_client_method(),
9834 TLS1_3_VERSION,
9835 TLS1_3_VERSION,
9836 &sctx, &cctx, certfilename, privkeyfilename))
9837 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9838 NULL, NULL)))
9839 goto end;
9840
9841 /* Enable RPK for server cert */
9842 if (rpkidx) {
9843 if (!TEST_true(SSL_set1_server_cert_type(serverssl, cert_type_rpk, sizeof(cert_type_rpk)))
9844 || !TEST_true(SSL_set1_server_cert_type(clientssl, cert_type_rpk, sizeof(cert_type_rpk))))
9845 goto end;
9846 }
9847
9848 /* This is necessary to pass minimal setup w/o other groups configured */
9849 if (!TEST_true(SSL_set1_groups_list(serverssl, "xorgroup"))
9850 || !TEST_true(SSL_set1_groups_list(clientssl, "xorgroup")))
9851 goto end;
9852
9853 /*
9854 * If this connection gets established, it must have been completed
9855 * via the tls-provider-implemented "hmacsig" algorithm, testing
9856 * both sign and verify functions during handshake.
9857 */
9858 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9859 goto end;
9860
9861 /* If using RPK, make sure we got one */
9862 if (rpkidx && !TEST_long_eq(SSL_get_verify_result(clientssl), X509_V_ERR_RPK_UNTRUSTED))
9863 goto end;
9864
9865 testresult = 1;
9866
9867 end:
9868 SSL_free(serverssl);
9869 SSL_free(clientssl);
9870 SSL_CTX_free(sctx);
9871 SSL_CTX_free(cctx);
9872 OSSL_PROVIDER_unload(tlsprov);
9873 OSSL_PROVIDER_unload(defaultprov);
9874
9875 return testresult;
9876 }
9877 #endif
9878
9879 #ifndef OPENSSL_NO_TLS1_2
9880 static int test_ssl_dup(void)
9881 {
9882 SSL_CTX *cctx = NULL, *sctx = NULL;
9883 SSL *clientssl = NULL, *serverssl = NULL, *client2ssl = NULL;
9884 int testresult = 0;
9885 BIO *rbio = NULL, *wbio = NULL;
9886
9887 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9888 TLS_client_method(),
9889 0,
9890 0,
9891 &sctx, &cctx, cert, privkey)))
9892 goto end;
9893
9894 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9895 NULL, NULL)))
9896 goto end;
9897
9898 if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION))
9899 || !TEST_true(SSL_set_max_proto_version(clientssl, TLS1_2_VERSION)))
9900 goto end;
9901
9902 client2ssl = SSL_dup(clientssl);
9903 rbio = SSL_get_rbio(clientssl);
9904 if (!TEST_ptr(rbio)
9905 || !TEST_true(BIO_up_ref(rbio)))
9906 goto end;
9907 SSL_set0_rbio(client2ssl, rbio);
9908 rbio = NULL;
9909
9910 wbio = SSL_get_wbio(clientssl);
9911 if (!TEST_ptr(wbio) || !TEST_true(BIO_up_ref(wbio)))
9912 goto end;
9913 SSL_set0_wbio(client2ssl, wbio);
9914 rbio = NULL;
9915
9916 if (!TEST_ptr(client2ssl)
9917 /* Handshake not started so pointers should be different */
9918 || !TEST_ptr_ne(clientssl, client2ssl))
9919 goto end;
9920
9921 if (!TEST_int_eq(SSL_get_min_proto_version(client2ssl), TLS1_2_VERSION)
9922 || !TEST_int_eq(SSL_get_max_proto_version(client2ssl), TLS1_2_VERSION))
9923 goto end;
9924
9925 if (!TEST_true(create_ssl_connection(serverssl, client2ssl, SSL_ERROR_NONE)))
9926 goto end;
9927
9928 SSL_free(clientssl);
9929 clientssl = SSL_dup(client2ssl);
9930 if (!TEST_ptr(clientssl)
9931 /* Handshake has finished so pointers should be the same */
9932 || !TEST_ptr_eq(clientssl, client2ssl))
9933 goto end;
9934
9935 testresult = 1;
9936
9937 end:
9938 SSL_free(serverssl);
9939 SSL_free(clientssl);
9940 SSL_free(client2ssl);
9941 SSL_CTX_free(sctx);
9942 SSL_CTX_free(cctx);
9943
9944 return testresult;
9945 }
9946
9947 # ifndef OPENSSL_NO_DH
9948
9949 static EVP_PKEY *tmp_dh_params = NULL;
9950
9951 /* Helper function for the test_set_tmp_dh() tests */
9952 static EVP_PKEY *get_tmp_dh_params(void)
9953 {
9954 if (tmp_dh_params == NULL) {
9955 BIGNUM *p = NULL;
9956 OSSL_PARAM_BLD *tmpl = NULL;
9957 EVP_PKEY_CTX *pctx = NULL;
9958 OSSL_PARAM *params = NULL;
9959 EVP_PKEY *dhpkey = NULL;
9960
9961 p = BN_get_rfc3526_prime_2048(NULL);
9962 if (!TEST_ptr(p))
9963 goto end;
9964
9965 pctx = EVP_PKEY_CTX_new_from_name(libctx, "DH", NULL);
9966 if (!TEST_ptr(pctx)
9967 || !TEST_int_eq(EVP_PKEY_fromdata_init(pctx), 1))
9968 goto end;
9969
9970 tmpl = OSSL_PARAM_BLD_new();
9971 if (!TEST_ptr(tmpl)
9972 || !TEST_true(OSSL_PARAM_BLD_push_BN(tmpl,
9973 OSSL_PKEY_PARAM_FFC_P,
9974 p))
9975 || !TEST_true(OSSL_PARAM_BLD_push_uint(tmpl,
9976 OSSL_PKEY_PARAM_FFC_G,
9977 2)))
9978 goto end;
9979
9980 params = OSSL_PARAM_BLD_to_param(tmpl);
9981 if (!TEST_ptr(params)
9982 || !TEST_int_eq(EVP_PKEY_fromdata(pctx, &dhpkey,
9983 EVP_PKEY_KEY_PARAMETERS,
9984 params), 1))
9985 goto end;
9986
9987 tmp_dh_params = dhpkey;
9988 end:
9989 BN_free(p);
9990 EVP_PKEY_CTX_free(pctx);
9991 OSSL_PARAM_BLD_free(tmpl);
9992 OSSL_PARAM_free(params);
9993 }
9994
9995 if (tmp_dh_params != NULL && !EVP_PKEY_up_ref(tmp_dh_params))
9996 return NULL;
9997
9998 return tmp_dh_params;
9999 }
10000
10001 # ifndef OPENSSL_NO_DEPRECATED_3_0
10002 /* Callback used by test_set_tmp_dh() */
10003 static DH *tmp_dh_callback(SSL *s, int is_export, int keylen)
10004 {
10005 EVP_PKEY *dhpkey = get_tmp_dh_params();
10006 DH *ret = NULL;
10007
10008 if (!TEST_ptr(dhpkey))
10009 return NULL;
10010
10011 /*
10012 * libssl does not free the returned DH, so we free it now knowing that even
10013 * after we free dhpkey, there will still be a reference to the owning
10014 * EVP_PKEY in tmp_dh_params, and so the DH object will live for the length
10015 * of time we need it for.
10016 */
10017 ret = EVP_PKEY_get1_DH(dhpkey);
10018 DH_free(ret);
10019
10020 EVP_PKEY_free(dhpkey);
10021
10022 return ret;
10023 }
10024 # endif
10025
10026 /*
10027 * Test the various methods for setting temporary DH parameters
10028 *
10029 * Test 0: Default (no auto) setting
10030 * Test 1: Explicit SSL_CTX auto off
10031 * Test 2: Explicit SSL auto off
10032 * Test 3: Explicit SSL_CTX auto on
10033 * Test 4: Explicit SSL auto on
10034 * Test 5: Explicit SSL_CTX auto off, custom DH params via EVP_PKEY
10035 * Test 6: Explicit SSL auto off, custom DH params via EVP_PKEY
10036 *
10037 * The following are testing deprecated APIs, so we only run them if available
10038 * Test 7: Explicit SSL_CTX auto off, custom DH params via DH
10039 * Test 8: Explicit SSL auto off, custom DH params via DH
10040 * Test 9: Explicit SSL_CTX auto off, custom DH params via callback
10041 * Test 10: Explicit SSL auto off, custom DH params via callback
10042 */
10043 static int test_set_tmp_dh(int idx)
10044 {
10045 SSL_CTX *cctx = NULL, *sctx = NULL;
10046 SSL *clientssl = NULL, *serverssl = NULL;
10047 int testresult = 0;
10048 int dhauto = (idx == 3 || idx == 4) ? 1 : 0;
10049 int expected = (idx <= 2) ? 0 : 1;
10050 EVP_PKEY *dhpkey = NULL;
10051 # ifndef OPENSSL_NO_DEPRECATED_3_0
10052 DH *dh = NULL;
10053 # else
10054
10055 if (idx >= 7)
10056 return 1;
10057 # endif
10058
10059 if (idx >= 5 && idx <= 8) {
10060 dhpkey = get_tmp_dh_params();
10061 if (!TEST_ptr(dhpkey))
10062 goto end;
10063 }
10064 # ifndef OPENSSL_NO_DEPRECATED_3_0
10065 if (idx == 7 || idx == 8) {
10066 dh = EVP_PKEY_get1_DH(dhpkey);
10067 if (!TEST_ptr(dh))
10068 goto end;
10069 }
10070 # endif
10071
10072 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10073 TLS_client_method(),
10074 0,
10075 0,
10076 &sctx, &cctx, cert, privkey)))
10077 goto end;
10078
10079 if ((idx & 1) == 1) {
10080 if (!TEST_true(SSL_CTX_set_dh_auto(sctx, dhauto)))
10081 goto end;
10082 }
10083
10084 if (idx == 5) {
10085 if (!TEST_true(SSL_CTX_set0_tmp_dh_pkey(sctx, dhpkey)))
10086 goto end;
10087 dhpkey = NULL;
10088 }
10089 # ifndef OPENSSL_NO_DEPRECATED_3_0
10090 else if (idx == 7) {
10091 if (!TEST_true(SSL_CTX_set_tmp_dh(sctx, dh)))
10092 goto end;
10093 } else if (idx == 9) {
10094 SSL_CTX_set_tmp_dh_callback(sctx, tmp_dh_callback);
10095 }
10096 # endif
10097
10098 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10099 NULL, NULL)))
10100 goto end;
10101
10102 if ((idx & 1) == 0 && idx != 0) {
10103 if (!TEST_true(SSL_set_dh_auto(serverssl, dhauto)))
10104 goto end;
10105 }
10106 if (idx == 6) {
10107 if (!TEST_true(SSL_set0_tmp_dh_pkey(serverssl, dhpkey)))
10108 goto end;
10109 dhpkey = NULL;
10110 }
10111 # ifndef OPENSSL_NO_DEPRECATED_3_0
10112 else if (idx == 8) {
10113 if (!TEST_true(SSL_set_tmp_dh(serverssl, dh)))
10114 goto end;
10115 } else if (idx == 10) {
10116 SSL_set_tmp_dh_callback(serverssl, tmp_dh_callback);
10117 }
10118 # endif
10119
10120 if (!TEST_true(SSL_set_min_proto_version(serverssl, TLS1_2_VERSION))
10121 || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
10122 || !TEST_true(SSL_set_cipher_list(serverssl, "DHE-RSA-AES128-SHA")))
10123 goto end;
10124
10125 /*
10126 * If autoon then we should succeed. Otherwise we expect failure because
10127 * there are no parameters
10128 */
10129 if (!TEST_int_eq(create_ssl_connection(serverssl, clientssl,
10130 SSL_ERROR_NONE), expected))
10131 goto end;
10132
10133 testresult = 1;
10134
10135 end:
10136 # ifndef OPENSSL_NO_DEPRECATED_3_0
10137 DH_free(dh);
10138 # endif
10139 SSL_free(serverssl);
10140 SSL_free(clientssl);
10141 SSL_CTX_free(sctx);
10142 SSL_CTX_free(cctx);
10143 EVP_PKEY_free(dhpkey);
10144
10145 return testresult;
10146 }
10147
10148 /*
10149 * Test the auto DH keys are appropriately sized
10150 */
10151 static int test_dh_auto(int idx)
10152 {
10153 SSL_CTX *cctx = SSL_CTX_new_ex(libctx, NULL, TLS_client_method());
10154 SSL_CTX *sctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
10155 SSL *clientssl = NULL, *serverssl = NULL;
10156 int testresult = 0;
10157 EVP_PKEY *tmpkey = NULL;
10158 char *thiscert = NULL, *thiskey = NULL;
10159 size_t expdhsize = 0;
10160 const char *ciphersuite = "DHE-RSA-AES128-SHA";
10161
10162 if (!TEST_ptr(sctx) || !TEST_ptr(cctx))
10163 goto end;
10164
10165 switch (idx) {
10166 case 0:
10167 /* The FIPS provider doesn't support this DH size - so we ignore it */
10168 if (is_fips) {
10169 testresult = 1;
10170 goto end;
10171 }
10172 thiscert = cert1024;
10173 thiskey = privkey1024;
10174 expdhsize = 1024;
10175 SSL_CTX_set_security_level(sctx, 1);
10176 SSL_CTX_set_security_level(cctx, 1);
10177 break;
10178 case 1:
10179 /* 2048 bit prime */
10180 thiscert = cert;
10181 thiskey = privkey;
10182 expdhsize = 2048;
10183 break;
10184 case 2:
10185 thiscert = cert3072;
10186 thiskey = privkey3072;
10187 expdhsize = 3072;
10188 break;
10189 case 3:
10190 thiscert = cert4096;
10191 thiskey = privkey4096;
10192 expdhsize = 4096;
10193 break;
10194 case 4:
10195 thiscert = cert8192;
10196 thiskey = privkey8192;
10197 expdhsize = 8192;
10198 break;
10199 /* No certificate cases */
10200 case 5:
10201 /* The FIPS provider doesn't support this DH size - so we ignore it */
10202 if (is_fips) {
10203 testresult = 1;
10204 goto end;
10205 }
10206 ciphersuite = "ADH-AES128-SHA256:@SECLEVEL=0";
10207 expdhsize = 1024;
10208 break;
10209 case 6:
10210 ciphersuite = "ADH-AES256-SHA256:@SECLEVEL=0";
10211 expdhsize = 3072;
10212 break;
10213 default:
10214 TEST_error("Invalid text index");
10215 goto end;
10216 }
10217
10218 if (!TEST_true(create_ssl_ctx_pair(libctx, NULL,
10219 NULL,
10220 0,
10221 0,
10222 &sctx, &cctx, thiscert, thiskey)))
10223 goto end;
10224
10225 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10226 NULL, NULL)))
10227 goto end;
10228
10229 if (!TEST_true(SSL_set_dh_auto(serverssl, 1))
10230 || !TEST_true(SSL_set_min_proto_version(serverssl, TLS1_2_VERSION))
10231 || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
10232 || !TEST_true(SSL_set_cipher_list(serverssl, ciphersuite))
10233 || !TEST_true(SSL_set_cipher_list(clientssl, ciphersuite)))
10234 goto end;
10235
10236 /*
10237 * Send the server's first flight. At this point the server has created the
10238 * temporary DH key but hasn't finished using it yet. Once used it is
10239 * removed, so we cannot test it.
10240 */
10241 if (!TEST_int_le(SSL_connect(clientssl), 0)
10242 || !TEST_int_le(SSL_accept(serverssl), 0))
10243 goto end;
10244
10245 if (!TEST_int_gt(SSL_get_tmp_key(serverssl, &tmpkey), 0))
10246 goto end;
10247 if (!TEST_size_t_eq(EVP_PKEY_get_bits(tmpkey), expdhsize))
10248 goto end;
10249
10250 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10251 goto end;
10252
10253 testresult = 1;
10254
10255 end:
10256 SSL_free(serverssl);
10257 SSL_free(clientssl);
10258 SSL_CTX_free(sctx);
10259 SSL_CTX_free(cctx);
10260 EVP_PKEY_free(tmpkey);
10261
10262 return testresult;
10263
10264 }
10265 # endif /* OPENSSL_NO_DH */
10266 #endif /* OPENSSL_NO_TLS1_2 */
10267
10268 #ifndef OSSL_NO_USABLE_TLS1_3
10269 /*
10270 * Test that setting an SNI callback works with TLSv1.3. Specifically we check
10271 * that it works even without a certificate configured for the original
10272 * SSL_CTX
10273 */
10274 static int test_sni_tls13(void)
10275 {
10276 SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
10277 SSL *clientssl = NULL, *serverssl = NULL;
10278 int testresult = 0;
10279
10280 /* Reset callback counter */
10281 snicb = 0;
10282
10283 /* Create an initial SSL_CTX with no certificate configured */
10284 sctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
10285 if (!TEST_ptr(sctx))
10286 goto end;
10287 /* Require TLSv1.3 as a minimum */
10288 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10289 TLS_client_method(), TLS1_3_VERSION, 0,
10290 &sctx2, &cctx, cert, privkey)))
10291 goto end;
10292
10293 /* Set up SNI */
10294 if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
10295 || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
10296 goto end;
10297
10298 /*
10299 * Connection should still succeed because the final SSL_CTX has the right
10300 * certificates configured.
10301 */
10302 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
10303 &clientssl, NULL, NULL))
10304 || !TEST_true(create_ssl_connection(serverssl, clientssl,
10305 SSL_ERROR_NONE)))
10306 goto end;
10307
10308 /* We should have had the SNI callback called exactly once */
10309 if (!TEST_int_eq(snicb, 1))
10310 goto end;
10311
10312 testresult = 1;
10313
10314 end:
10315 SSL_free(serverssl);
10316 SSL_free(clientssl);
10317 SSL_CTX_free(sctx2);
10318 SSL_CTX_free(sctx);
10319 SSL_CTX_free(cctx);
10320 return testresult;
10321 }
10322
10323 /*
10324 * Test that the lifetime hint of a TLSv1.3 ticket is no more than 1 week
10325 * 0 = TLSv1.2
10326 * 1 = TLSv1.3
10327 */
10328 static int test_ticket_lifetime(int idx)
10329 {
10330 SSL_CTX *cctx = NULL, *sctx = NULL;
10331 SSL *clientssl = NULL, *serverssl = NULL;
10332 int testresult = 0;
10333 int version = TLS1_3_VERSION;
10334
10335 #define ONE_WEEK_SEC (7 * 24 * 60 * 60)
10336 #define TWO_WEEK_SEC (2 * ONE_WEEK_SEC)
10337
10338 if (idx == 0) {
10339 #ifdef OPENSSL_NO_TLS1_2
10340 return TEST_skip("TLS 1.2 is disabled.");
10341 #else
10342 version = TLS1_2_VERSION;
10343 #endif
10344 }
10345
10346 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10347 TLS_client_method(), version, version,
10348 &sctx, &cctx, cert, privkey)))
10349 goto end;
10350
10351 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
10352 &clientssl, NULL, NULL)))
10353 goto end;
10354
10355 /*
10356 * Set the timeout to be more than 1 week
10357 * make sure the returned value is the default
10358 */
10359 if (!TEST_long_eq(SSL_CTX_set_timeout(sctx, TWO_WEEK_SEC),
10360 SSL_get_default_timeout(serverssl)))
10361 goto end;
10362
10363 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10364 goto end;
10365
10366 if (idx == 0) {
10367 /* TLSv1.2 uses the set value */
10368 if (!TEST_ulong_eq(SSL_SESSION_get_ticket_lifetime_hint(SSL_get_session(clientssl)), TWO_WEEK_SEC))
10369 goto end;
10370 } else {
10371 /* TLSv1.3 uses the limited value */
10372 if (!TEST_ulong_le(SSL_SESSION_get_ticket_lifetime_hint(SSL_get_session(clientssl)), ONE_WEEK_SEC))
10373 goto end;
10374 }
10375 testresult = 1;
10376
10377 end:
10378 SSL_free(serverssl);
10379 SSL_free(clientssl);
10380 SSL_CTX_free(sctx);
10381 SSL_CTX_free(cctx);
10382 return testresult;
10383 }
10384 #endif
10385 /*
10386 * Test that setting an ALPN does not violate RFC
10387 */
10388 static int test_set_alpn(void)
10389 {
10390 SSL_CTX *ctx = NULL;
10391 SSL *ssl = NULL;
10392 int testresult = 0;
10393
10394 unsigned char bad0[] = { 0x00, 'b', 'a', 'd' };
10395 unsigned char good[] = { 0x04, 'g', 'o', 'o', 'd' };
10396 unsigned char bad1[] = { 0x01, 'b', 'a', 'd' };
10397 unsigned char bad2[] = { 0x03, 'b', 'a', 'd', 0x00};
10398 unsigned char bad3[] = { 0x03, 'b', 'a', 'd', 0x01, 'b', 'a', 'd'};
10399 unsigned char bad4[] = { 0x03, 'b', 'a', 'd', 0x06, 'b', 'a', 'd'};
10400
10401 /* Create an initial SSL_CTX with no certificate configured */
10402 ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
10403 if (!TEST_ptr(ctx))
10404 goto end;
10405
10406 /* the set_alpn functions return 0 (false) on success, non-zero (true) on failure */
10407 if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, NULL, 2)))
10408 goto end;
10409 if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, good, 0)))
10410 goto end;
10411 if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, good, sizeof(good))))
10412 goto end;
10413 if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, good, 1)))
10414 goto end;
10415 if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad0, sizeof(bad0))))
10416 goto end;
10417 if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad1, sizeof(bad1))))
10418 goto end;
10419 if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad2, sizeof(bad2))))
10420 goto end;
10421 if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad3, sizeof(bad3))))
10422 goto end;
10423 if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad4, sizeof(bad4))))
10424 goto end;
10425
10426 ssl = SSL_new(ctx);
10427 if (!TEST_ptr(ssl))
10428 goto end;
10429
10430 if (!TEST_false(SSL_set_alpn_protos(ssl, NULL, 2)))
10431 goto end;
10432 if (!TEST_false(SSL_set_alpn_protos(ssl, good, 0)))
10433 goto end;
10434 if (!TEST_false(SSL_set_alpn_protos(ssl, good, sizeof(good))))
10435 goto end;
10436 if (!TEST_true(SSL_set_alpn_protos(ssl, good, 1)))
10437 goto end;
10438 if (!TEST_true(SSL_set_alpn_protos(ssl, bad0, sizeof(bad0))))
10439 goto end;
10440 if (!TEST_true(SSL_set_alpn_protos(ssl, bad1, sizeof(bad1))))
10441 goto end;
10442 if (!TEST_true(SSL_set_alpn_protos(ssl, bad2, sizeof(bad2))))
10443 goto end;
10444 if (!TEST_true(SSL_set_alpn_protos(ssl, bad3, sizeof(bad3))))
10445 goto end;
10446 if (!TEST_true(SSL_set_alpn_protos(ssl, bad4, sizeof(bad4))))
10447 goto end;
10448
10449 testresult = 1;
10450
10451 end:
10452 SSL_free(ssl);
10453 SSL_CTX_free(ctx);
10454 return testresult;
10455 }
10456
10457 /*
10458 * Test SSL_CTX_set1_verify/chain_cert_store and SSL_CTX_get_verify/chain_cert_store.
10459 */
10460 static int test_set_verify_cert_store_ssl_ctx(void)
10461 {
10462 SSL_CTX *ctx = NULL;
10463 int testresult = 0;
10464 X509_STORE *store = NULL, *new_store = NULL,
10465 *cstore = NULL, *new_cstore = NULL;
10466
10467 /* Create an initial SSL_CTX. */
10468 ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
10469 if (!TEST_ptr(ctx))
10470 goto end;
10471
10472 /* Retrieve verify store pointer. */
10473 if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
10474 goto end;
10475
10476 /* Retrieve chain store pointer. */
10477 if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
10478 goto end;
10479
10480 /* We haven't set any yet, so this should be NULL. */
10481 if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
10482 goto end;
10483
10484 /* Create stores. We use separate stores so pointers are different. */
10485 new_store = X509_STORE_new();
10486 if (!TEST_ptr(new_store))
10487 goto end;
10488
10489 new_cstore = X509_STORE_new();
10490 if (!TEST_ptr(new_cstore))
10491 goto end;
10492
10493 /* Set stores. */
10494 if (!TEST_true(SSL_CTX_set1_verify_cert_store(ctx, new_store)))
10495 goto end;
10496
10497 if (!TEST_true(SSL_CTX_set1_chain_cert_store(ctx, new_cstore)))
10498 goto end;
10499
10500 /* Should be able to retrieve the same pointer. */
10501 if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
10502 goto end;
10503
10504 if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
10505 goto end;
10506
10507 if (!TEST_ptr_eq(store, new_store) || !TEST_ptr_eq(cstore, new_cstore))
10508 goto end;
10509
10510 /* Should be able to unset again. */
10511 if (!TEST_true(SSL_CTX_set1_verify_cert_store(ctx, NULL)))
10512 goto end;
10513
10514 if (!TEST_true(SSL_CTX_set1_chain_cert_store(ctx, NULL)))
10515 goto end;
10516
10517 /* Should now be NULL. */
10518 if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
10519 goto end;
10520
10521 if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
10522 goto end;
10523
10524 if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
10525 goto end;
10526
10527 testresult = 1;
10528
10529 end:
10530 X509_STORE_free(new_store);
10531 X509_STORE_free(new_cstore);
10532 SSL_CTX_free(ctx);
10533 return testresult;
10534 }
10535
10536 /*
10537 * Test SSL_set1_verify/chain_cert_store and SSL_get_verify/chain_cert_store.
10538 */
10539 static int test_set_verify_cert_store_ssl(void)
10540 {
10541 SSL_CTX *ctx = NULL;
10542 SSL *ssl = NULL;
10543 int testresult = 0;
10544 X509_STORE *store = NULL, *new_store = NULL,
10545 *cstore = NULL, *new_cstore = NULL;
10546
10547 /* Create an initial SSL_CTX. */
10548 ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
10549 if (!TEST_ptr(ctx))
10550 goto end;
10551
10552 /* Create an SSL object. */
10553 ssl = SSL_new(ctx);
10554 if (!TEST_ptr(ssl))
10555 goto end;
10556
10557 /* Retrieve verify store pointer. */
10558 if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
10559 goto end;
10560
10561 /* Retrieve chain store pointer. */
10562 if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
10563 goto end;
10564
10565 /* We haven't set any yet, so this should be NULL. */
10566 if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
10567 goto end;
10568
10569 /* Create stores. We use separate stores so pointers are different. */
10570 new_store = X509_STORE_new();
10571 if (!TEST_ptr(new_store))
10572 goto end;
10573
10574 new_cstore = X509_STORE_new();
10575 if (!TEST_ptr(new_cstore))
10576 goto end;
10577
10578 /* Set stores. */
10579 if (!TEST_true(SSL_set1_verify_cert_store(ssl, new_store)))
10580 goto end;
10581
10582 if (!TEST_true(SSL_set1_chain_cert_store(ssl, new_cstore)))
10583 goto end;
10584
10585 /* Should be able to retrieve the same pointer. */
10586 if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
10587 goto end;
10588
10589 if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
10590 goto end;
10591
10592 if (!TEST_ptr_eq(store, new_store) || !TEST_ptr_eq(cstore, new_cstore))
10593 goto end;
10594
10595 /* Should be able to unset again. */
10596 if (!TEST_true(SSL_set1_verify_cert_store(ssl, NULL)))
10597 goto end;
10598
10599 if (!TEST_true(SSL_set1_chain_cert_store(ssl, NULL)))
10600 goto end;
10601
10602 /* Should now be NULL. */
10603 if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
10604 goto end;
10605
10606 if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
10607 goto end;
10608
10609 if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
10610 goto end;
10611
10612 testresult = 1;
10613
10614 end:
10615 X509_STORE_free(new_store);
10616 X509_STORE_free(new_cstore);
10617 SSL_free(ssl);
10618 SSL_CTX_free(ctx);
10619 return testresult;
10620 }
10621
10622
10623 static int test_inherit_verify_param(void)
10624 {
10625 int testresult = 0;
10626
10627 SSL_CTX *ctx = NULL;
10628 X509_VERIFY_PARAM *cp = NULL;
10629 SSL *ssl = NULL;
10630 X509_VERIFY_PARAM *sp = NULL;
10631 int hostflags = X509_CHECK_FLAG_NEVER_CHECK_SUBJECT;
10632
10633 ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
10634 if (!TEST_ptr(ctx))
10635 goto end;
10636
10637 cp = SSL_CTX_get0_param(ctx);
10638 if (!TEST_ptr(cp))
10639 goto end;
10640 if (!TEST_int_eq(X509_VERIFY_PARAM_get_hostflags(cp), 0))
10641 goto end;
10642
10643 X509_VERIFY_PARAM_set_hostflags(cp, hostflags);
10644
10645 ssl = SSL_new(ctx);
10646 if (!TEST_ptr(ssl))
10647 goto end;
10648
10649 sp = SSL_get0_param(ssl);
10650 if (!TEST_ptr(sp))
10651 goto end;
10652 if (!TEST_int_eq(X509_VERIFY_PARAM_get_hostflags(sp), hostflags))
10653 goto end;
10654
10655 testresult = 1;
10656
10657 end:
10658 SSL_free(ssl);
10659 SSL_CTX_free(ctx);
10660
10661 return testresult;
10662 }
10663
10664 static int test_load_dhfile(void)
10665 {
10666 #ifndef OPENSSL_NO_DH
10667 int testresult = 0;
10668
10669 SSL_CTX *ctx = NULL;
10670 SSL_CONF_CTX *cctx = NULL;
10671
10672 if (dhfile == NULL)
10673 return 1;
10674
10675 if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_client_method()))
10676 || !TEST_ptr(cctx = SSL_CONF_CTX_new()))
10677 goto end;
10678
10679 SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);
10680 SSL_CONF_CTX_set_flags(cctx,
10681 SSL_CONF_FLAG_CERTIFICATE
10682 | SSL_CONF_FLAG_SERVER
10683 | SSL_CONF_FLAG_FILE);
10684
10685 if (!TEST_int_eq(SSL_CONF_cmd(cctx, "DHParameters", dhfile), 2))
10686 goto end;
10687
10688 testresult = 1;
10689 end:
10690 SSL_CONF_CTX_free(cctx);
10691 SSL_CTX_free(ctx);
10692
10693 return testresult;
10694 #else
10695 return TEST_skip("DH not supported by this build");
10696 #endif
10697 }
10698
10699 #ifndef OSSL_NO_USABLE_TLS1_3
10700 /* Test that read_ahead works across a key change */
10701 static int test_read_ahead_key_change(void)
10702 {
10703 SSL_CTX *cctx = NULL, *sctx = NULL;
10704 SSL *clientssl = NULL, *serverssl = NULL;
10705 int testresult = 0;
10706 char *msg = "Hello World";
10707 size_t written, readbytes;
10708 char buf[80];
10709 int i;
10710
10711 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10712 TLS_client_method(), TLS1_3_VERSION, 0,
10713 &sctx, &cctx, cert, privkey)))
10714 goto end;
10715
10716 SSL_CTX_set_read_ahead(sctx, 1);
10717
10718 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
10719 &clientssl, NULL, NULL)))
10720 goto end;
10721
10722 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10723 goto end;
10724
10725 /* Write some data, send a key update, write more data */
10726 if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
10727 || !TEST_size_t_eq(written, strlen(msg)))
10728 goto end;
10729
10730 if (!TEST_true(SSL_key_update(clientssl, SSL_KEY_UPDATE_NOT_REQUESTED)))
10731 goto end;
10732
10733 if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
10734 || !TEST_size_t_eq(written, strlen(msg)))
10735 goto end;
10736
10737 /*
10738 * Since read_ahead is on the first read below should read the record with
10739 * the first app data, the second record with the key update message, and
10740 * the third record with the app data all in one go. We should be able to
10741 * still process the read_ahead data correctly even though it crosses
10742 * epochs
10743 */
10744 for (i = 0; i < 2; i++) {
10745 if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf) - 1,
10746 &readbytes)))
10747 goto end;
10748
10749 buf[readbytes] = '\0';
10750 if (!TEST_str_eq(buf, msg))
10751 goto end;
10752 }
10753
10754 testresult = 1;
10755
10756 end:
10757 SSL_free(serverssl);
10758 SSL_free(clientssl);
10759 SSL_CTX_free(sctx);
10760 SSL_CTX_free(cctx);
10761 return testresult;
10762 }
10763
10764 static size_t record_pad_cb(SSL *s, int type, size_t len, void *arg)
10765 {
10766 int *called = arg;
10767
10768 switch ((*called)++) {
10769 case 0:
10770 /* Add some padding to first record */
10771 return 512;
10772 case 1:
10773 /* Maximally pad the second record */
10774 return SSL3_RT_MAX_PLAIN_LENGTH - len;
10775 case 2:
10776 /*
10777 * Exceeding the maximum padding should be fine. It should just pad to
10778 * the maximum anyway
10779 */
10780 return SSL3_RT_MAX_PLAIN_LENGTH + 1 - len;
10781 case 3:
10782 /*
10783 * Very large padding should also be ok. Should just pad to the maximum
10784 * allowed
10785 */
10786 return SIZE_MAX;
10787 default:
10788 return 0;
10789 }
10790 }
10791
10792 /*
10793 * Test that setting record padding in TLSv1.3 works as expected
10794 * Test 0: Record padding callback on the SSL_CTX
10795 * Test 1: Record padding callback on the SSL
10796 * Test 2: Record block padding on the SSL_CTX
10797 * Test 3: Record block padding on the SSL
10798 */
10799 static int test_tls13_record_padding(int idx)
10800 {
10801 SSL_CTX *cctx = NULL, *sctx = NULL;
10802 SSL *clientssl = NULL, *serverssl = NULL;
10803 int testresult = 0;
10804 char *msg = "Hello World";
10805 size_t written, readbytes;
10806 char buf[80];
10807 int i;
10808 int called = 0;
10809
10810 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10811 TLS_client_method(), TLS1_3_VERSION, 0,
10812 &sctx, &cctx, cert, privkey)))
10813 goto end;
10814
10815 if (idx == 0) {
10816 SSL_CTX_set_record_padding_callback(cctx, record_pad_cb);
10817 SSL_CTX_set_record_padding_callback_arg(cctx, &called);
10818 if (!TEST_ptr_eq(SSL_CTX_get_record_padding_callback_arg(cctx), &called))
10819 goto end;
10820 } else if (idx == 2) {
10821 /* Exceeding the max plain length should fail */
10822 if (!TEST_false(SSL_CTX_set_block_padding(cctx,
10823 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
10824 goto end;
10825 if (!TEST_true(SSL_CTX_set_block_padding(cctx, 512)))
10826 goto end;
10827 }
10828
10829 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
10830 &clientssl, NULL, NULL)))
10831 goto end;
10832
10833 if (idx == 1) {
10834 SSL_set_record_padding_callback(clientssl, record_pad_cb);
10835 SSL_set_record_padding_callback_arg(clientssl, &called);
10836 if (!TEST_ptr_eq(SSL_get_record_padding_callback_arg(clientssl), &called))
10837 goto end;
10838 } else if (idx == 3) {
10839 /* Exceeding the max plain length should fail */
10840 if (!TEST_false(SSL_set_block_padding(clientssl,
10841 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
10842 goto end;
10843 if (!TEST_true(SSL_set_block_padding(clientssl, 512)))
10844 goto end;
10845 }
10846
10847 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10848 goto end;
10849
10850 called = 0;
10851 /*
10852 * Write some data, then check we can read it. Do this four times to check
10853 * we can continue to write and read padded data after the initial record
10854 * padding has been added. We don't actually check that the padding has
10855 * been applied to the record - just that we can continue to communicate
10856 * normally and that the callback has been called (if appropriate).
10857 */
10858 for (i = 0; i < 4; i++) {
10859 if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
10860 || !TEST_size_t_eq(written, strlen(msg)))
10861 goto end;
10862
10863 if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf) - 1,
10864 &readbytes))
10865 || !TEST_size_t_eq(written, readbytes))
10866 goto end;
10867
10868 buf[readbytes] = '\0';
10869 if (!TEST_str_eq(buf, msg))
10870 goto end;
10871 }
10872
10873 if ((idx == 0 || idx == 1) && !TEST_int_eq(called, 4))
10874 goto end;
10875
10876 testresult = 1;
10877 end:
10878 SSL_free(serverssl);
10879 SSL_free(clientssl);
10880 SSL_CTX_free(sctx);
10881 SSL_CTX_free(cctx);
10882 return testresult;
10883 }
10884 #endif /* OSSL_NO_USABLE_TLS1_3 */
10885
10886 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
10887
10888 static ENGINE *load_dasync(void)
10889 {
10890 ENGINE *e;
10891
10892 if (!TEST_ptr(e = ENGINE_by_id("dasync")))
10893 return NULL;
10894
10895 if (!TEST_true(ENGINE_init(e))) {
10896 ENGINE_free(e);
10897 return NULL;
10898 }
10899
10900 if (!TEST_true(ENGINE_register_ciphers(e))) {
10901 ENGINE_free(e);
10902 return NULL;
10903 }
10904
10905 return e;
10906 }
10907
10908 /*
10909 * Test TLSv1.2 with a pipeline capable cipher. TLSv1.3 and DTLS do not
10910 * support this yet. The only pipeline capable cipher that we have is in the
10911 * dasync engine (providers don't support this yet), so we have to use
10912 * deprecated APIs for this test.
10913 *
10914 * Test 0: Client has pipelining enabled, server does not
10915 * Test 1: Server has pipelining enabled, client does not
10916 * Test 2: Client has pipelining enabled, server does not: not enough data to
10917 * fill all the pipelines
10918 * Test 3: Client has pipelining enabled, server does not: not enough data to
10919 * fill all the pipelines by more than a full pipeline's worth
10920 * Test 4: Client has pipelining enabled, server does not: more data than all
10921 * the available pipelines can take
10922 * Test 5: Client has pipelining enabled, server does not: Maximum size pipeline
10923 * Test 6: Repeat of test 0, but the engine is loaded late (after the SSL_CTX
10924 * is created)
10925 */
10926 static int test_pipelining(int idx)
10927 {
10928 SSL_CTX *cctx = NULL, *sctx = NULL;
10929 SSL *clientssl = NULL, *serverssl = NULL, *peera, *peerb;
10930 int testresult = 0, numreads;
10931 /* A 55 byte message */
10932 unsigned char *msg = (unsigned char *)
10933 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123";
10934 size_t written, readbytes, offset, msglen, fragsize = 10, numpipes = 5;
10935 size_t expectedreads;
10936 unsigned char *buf = NULL;
10937 ENGINE *e = NULL;
10938
10939 if (idx != 6) {
10940 e = load_dasync();
10941 if (e == NULL)
10942 return 0;
10943 }
10944
10945 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10946 TLS_client_method(), 0,
10947 TLS1_2_VERSION, &sctx, &cctx, cert,
10948 privkey)))
10949 goto end;
10950
10951 if (idx == 6) {
10952 e = load_dasync();
10953 if (e == NULL)
10954 goto end;
10955 /* Now act like test 0 */
10956 idx = 0;
10957 }
10958
10959 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
10960 &clientssl, NULL, NULL)))
10961 goto end;
10962
10963 if (!TEST_true(SSL_set_cipher_list(clientssl, "AES128-SHA")))
10964 goto end;
10965
10966 /* peera is always configured for pipelining, while peerb is not. */
10967 if (idx == 1) {
10968 peera = serverssl;
10969 peerb = clientssl;
10970
10971 } else {
10972 peera = clientssl;
10973 peerb = serverssl;
10974 }
10975
10976 if (idx == 5) {
10977 numpipes = 2;
10978 /* Maximum allowed fragment size */
10979 fragsize = SSL3_RT_MAX_PLAIN_LENGTH;
10980 msglen = fragsize * numpipes;
10981 msg = OPENSSL_malloc(msglen);
10982 if (!TEST_ptr(msg))
10983 goto end;
10984 if (!TEST_int_gt(RAND_bytes_ex(libctx, msg, msglen, 0), 0))
10985 goto end;
10986 } else if (idx == 4) {
10987 msglen = 55;
10988 } else {
10989 msglen = 50;
10990 }
10991 if (idx == 2)
10992 msglen -= 2; /* Send 2 less bytes */
10993 else if (idx == 3)
10994 msglen -= 12; /* Send 12 less bytes */
10995
10996 buf = OPENSSL_malloc(msglen);
10997 if (!TEST_ptr(buf))
10998 goto end;
10999
11000 if (idx == 5) {
11001 /*
11002 * Test that setting a split send fragment longer than the maximum
11003 * allowed fails
11004 */
11005 if (!TEST_false(SSL_set_split_send_fragment(peera, fragsize + 1)))
11006 goto end;
11007 }
11008
11009 /*
11010 * In the normal case. We have 5 pipelines with 10 bytes per pipeline
11011 * (50 bytes in total). This is a ridiculously small number of bytes -
11012 * but sufficient for our purposes
11013 */
11014 if (!TEST_true(SSL_set_max_pipelines(peera, numpipes))
11015 || !TEST_true(SSL_set_split_send_fragment(peera, fragsize)))
11016 goto end;
11017
11018 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11019 goto end;
11020
11021 /* Write some data from peera to peerb */
11022 if (!TEST_true(SSL_write_ex(peera, msg, msglen, &written))
11023 || !TEST_size_t_eq(written, msglen))
11024 goto end;
11025
11026 /*
11027 * If the pipelining code worked, then we expect all |numpipes| pipelines to
11028 * have been used - except in test 3 where only |numpipes - 1| pipelines
11029 * will be used. This will result in |numpipes| records (|numpipes - 1| for
11030 * test 3) having been sent to peerb. Since peerb is not using read_ahead we
11031 * expect this to be read in |numpipes| or |numpipes - 1| separate
11032 * SSL_read_ex calls. In the case of test 4, there is then one additional
11033 * read for left over data that couldn't fit in the previous pipelines
11034 */
11035 for (offset = 0, numreads = 0;
11036 offset < msglen;
11037 offset += readbytes, numreads++) {
11038 if (!TEST_true(SSL_read_ex(peerb, buf + offset,
11039 msglen - offset, &readbytes)))
11040 goto end;
11041 }
11042
11043 expectedreads = idx == 4 ? numpipes + 1
11044 : (idx == 3 ? numpipes - 1 : numpipes);
11045 if (!TEST_mem_eq(msg, msglen, buf, offset)
11046 || !TEST_int_eq(numreads, expectedreads))
11047 goto end;
11048
11049 /*
11050 * Write some data from peerb to peera. We do this in up to |numpipes + 1|
11051 * chunks to exercise the read pipelining code on peera.
11052 */
11053 for (offset = 0; offset < msglen; offset += fragsize) {
11054 size_t sendlen = msglen - offset;
11055
11056 if (sendlen > fragsize)
11057 sendlen = fragsize;
11058 if (!TEST_true(SSL_write_ex(peerb, msg + offset, sendlen, &written))
11059 || !TEST_size_t_eq(written, sendlen))
11060 goto end;
11061 }
11062
11063 /*
11064 * The data was written in |numpipes|, |numpipes - 1| or |numpipes + 1|
11065 * separate chunks (depending on which test we are running). If the
11066 * pipelining is working then we expect peera to read up to numpipes chunks
11067 * and process them in parallel, giving back the complete result in a single
11068 * call to SSL_read_ex
11069 */
11070 if (!TEST_true(SSL_read_ex(peera, buf, msglen, &readbytes))
11071 || !TEST_size_t_le(readbytes, msglen))
11072 goto end;
11073
11074 if (idx == 4) {
11075 size_t readbytes2;
11076
11077 if (!TEST_true(SSL_read_ex(peera, buf + readbytes,
11078 msglen - readbytes, &readbytes2)))
11079 goto end;
11080 readbytes += readbytes2;
11081 if (!TEST_size_t_le(readbytes, msglen))
11082 goto end;
11083 }
11084
11085 if (!TEST_mem_eq(msg, msglen, buf, readbytes))
11086 goto end;
11087
11088 testresult = 1;
11089 end:
11090 SSL_free(serverssl);
11091 SSL_free(clientssl);
11092 SSL_CTX_free(sctx);
11093 SSL_CTX_free(cctx);
11094 if (e != NULL) {
11095 ENGINE_unregister_ciphers(e);
11096 ENGINE_finish(e);
11097 ENGINE_free(e);
11098 }
11099 OPENSSL_free(buf);
11100 if (fragsize == SSL3_RT_MAX_PLAIN_LENGTH)
11101 OPENSSL_free(msg);
11102 return testresult;
11103 }
11104 #endif /* !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE) */
11105
11106 static int check_version_string(SSL *s, int version)
11107 {
11108 const char *verstr = NULL;
11109
11110 switch (version) {
11111 case SSL3_VERSION:
11112 verstr = "SSLv3";
11113 break;
11114 case TLS1_VERSION:
11115 verstr = "TLSv1";
11116 break;
11117 case TLS1_1_VERSION:
11118 verstr = "TLSv1.1";
11119 break;
11120 case TLS1_2_VERSION:
11121 verstr = "TLSv1.2";
11122 break;
11123 case TLS1_3_VERSION:
11124 verstr = "TLSv1.3";
11125 break;
11126 case DTLS1_VERSION:
11127 verstr = "DTLSv1";
11128 break;
11129 case DTLS1_2_VERSION:
11130 verstr = "DTLSv1.2";
11131 }
11132
11133 return TEST_str_eq(verstr, SSL_get_version(s));
11134 }
11135
11136 /*
11137 * Test that SSL_version, SSL_get_version, SSL_is_quic, SSL_is_tls and
11138 * SSL_is_dtls return the expected results for a (D)TLS connection. Compare with
11139 * test_version() in quicapitest.c which does the same thing for QUIC
11140 * connections.
11141 */
11142 static int test_version(int idx)
11143 {
11144 SSL_CTX *cctx = NULL, *sctx = NULL;
11145 SSL *clientssl = NULL, *serverssl = NULL;
11146 int testresult = 0, version;
11147 const SSL_METHOD *servmeth = TLS_server_method();
11148 const SSL_METHOD *clientmeth = TLS_client_method();
11149
11150 switch (idx) {
11151 #if !defined(OPENSSL_NO_SSL3)
11152 case 0:
11153 version = SSL3_VERSION;
11154 break;
11155 #endif
11156 #if !defined(OPENSSL_NO_TLS1)
11157 case 1:
11158 version = TLS1_VERSION;
11159 break;
11160 #endif
11161 #if !defined(OPENSSL_NO_TLS1_2)
11162 case 2:
11163 version = TLS1_2_VERSION;
11164 break;
11165 #endif
11166 #if !defined(OSSL_NO_USABLE_TLS1_3)
11167 case 3:
11168 version = TLS1_3_VERSION;
11169 break;
11170 #endif
11171 #if !defined(OPENSSL_NO_DTLS1)
11172 case 4:
11173 version = DTLS1_VERSION;
11174 break;
11175 #endif
11176 #if !defined(OPENSSL_NO_DTLS1_2)
11177 case 5:
11178 version = DTLS1_2_VERSION;
11179 break;
11180 #endif
11181 /*
11182 * NB we do not support QUIC in this test. That is covered by quicapitest.c
11183 * We also don't support DTLS1_BAD_VER since we have no server support for
11184 * that.
11185 */
11186 default:
11187 TEST_skip("Unsupported protocol version");
11188 return 1;
11189 }
11190
11191 if (is_fips
11192 && (version == SSL3_VERSION
11193 || version == TLS1_VERSION
11194 || version == DTLS1_VERSION)) {
11195 TEST_skip("Protocol version not supported with FIPS");
11196 return 1;
11197 }
11198
11199 #if !defined(OPENSSL_NO_DTLS)
11200 if (version == DTLS1_VERSION || version == DTLS1_2_VERSION) {
11201 servmeth = DTLS_server_method();
11202 clientmeth = DTLS_client_method();
11203 }
11204 #endif
11205
11206 if (!TEST_true(create_ssl_ctx_pair(libctx, servmeth, clientmeth, version,
11207 version, &sctx, &cctx, cert, privkey)))
11208 goto end;
11209
11210 if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
11211 || !TEST_true(SSL_CTX_set_cipher_list(cctx,
11212 "DEFAULT:@SECLEVEL=0")))
11213 goto end;
11214
11215 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11216 &clientssl, NULL, NULL)))
11217 goto end;
11218
11219 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11220 goto end;
11221
11222 if (!TEST_int_eq(SSL_version(serverssl), version)
11223 || !TEST_int_eq(SSL_version(clientssl), version)
11224 || !TEST_true(check_version_string(serverssl, version))
11225 || !TEST_true(check_version_string(clientssl, version)))
11226 goto end;
11227
11228 if (version == DTLS1_VERSION || version == DTLS1_2_VERSION) {
11229 if (!TEST_true(SSL_is_dtls(serverssl))
11230 || !TEST_true(SSL_is_dtls(clientssl))
11231 || !TEST_false(SSL_is_tls(serverssl))
11232 || !TEST_false(SSL_is_tls(clientssl))
11233 || !TEST_false(SSL_is_quic(serverssl))
11234 || !TEST_false(SSL_is_quic(clientssl)))
11235 goto end;
11236 } else {
11237 if (!TEST_true(SSL_is_tls(serverssl))
11238 || !TEST_true(SSL_is_tls(clientssl))
11239 || !TEST_false(SSL_is_dtls(serverssl))
11240 || !TEST_false(SSL_is_dtls(clientssl))
11241 || !TEST_false(SSL_is_quic(serverssl))
11242 || !TEST_false(SSL_is_quic(clientssl)))
11243 goto end;
11244 }
11245
11246 testresult = 1;
11247 end:
11248 SSL_free(serverssl);
11249 SSL_free(clientssl);
11250 SSL_CTX_free(sctx);
11251 SSL_CTX_free(cctx);
11252 return testresult;
11253 }
11254
11255 /*
11256 * Test that the SSL_rstate_string*() APIs return sane results
11257 */
11258 static int test_rstate_string(void)
11259 {
11260 SSL_CTX *cctx = NULL, *sctx = NULL;
11261 SSL *clientssl = NULL, *serverssl = NULL;
11262 int testresult = 0, version;
11263 const SSL_METHOD *servmeth = TLS_server_method();
11264 const SSL_METHOD *clientmeth = TLS_client_method();
11265 size_t written, readbytes;
11266 unsigned char buf[2];
11267 unsigned char dummyheader[SSL3_RT_HEADER_LENGTH] = {
11268 SSL3_RT_APPLICATION_DATA,
11269 TLS1_2_VERSION_MAJOR,
11270 0, /* To be filled in later */
11271 0,
11272 1
11273 };
11274
11275 if (!TEST_true(create_ssl_ctx_pair(libctx, servmeth, clientmeth, 0,
11276 0, &sctx, &cctx, cert, privkey)))
11277 goto end;
11278
11279 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11280 &clientssl, NULL, NULL)))
11281 goto end;
11282
11283 if (!TEST_str_eq(SSL_rstate_string(serverssl), "RH")
11284 || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read header"))
11285 goto end;
11286
11287 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11288 goto end;
11289
11290 if (!TEST_str_eq(SSL_rstate_string(serverssl), "RH")
11291 || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read header"))
11292 goto end;
11293
11294 /* Fill in the correct version for the record header */
11295 version = SSL_version(serverssl);
11296 if (version == TLS1_3_VERSION)
11297 version = TLS1_2_VERSION;
11298 dummyheader[2] = version & 0xff;
11299
11300 /*
11301 * Send a dummy header. If we continued to read the body as well this
11302 * would fail with a bad record mac, but we're not going to go that far.
11303 */
11304 if (!TEST_true(BIO_write_ex(SSL_get_rbio(serverssl), dummyheader,
11305 sizeof(dummyheader), &written))
11306 || !TEST_size_t_eq(written, SSL3_RT_HEADER_LENGTH))
11307 goto end;
11308
11309 if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes)))
11310 goto end;
11311
11312 if (!TEST_str_eq(SSL_rstate_string(serverssl), "RB")
11313 || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read body"))
11314 goto end;
11315
11316 testresult = 1;
11317 end:
11318 SSL_free(serverssl);
11319 SSL_free(clientssl);
11320 SSL_CTX_free(sctx);
11321 SSL_CTX_free(cctx);
11322 return testresult;
11323 }
11324
11325 /*
11326 * Force a write retry during handshaking. We test various combinations of
11327 * scenarios. We test a large certificate message which will fill the buffering
11328 * BIO used in the handshake. We try with client auth on and off. Finally we
11329 * also try a BIO that indicates retry via a 0 return. BIO_write() is documented
11330 * to indicate retry via -1 - but sometimes BIOs don't do that.
11331 *
11332 * Test 0: Standard certificate message
11333 * Test 1: Large certificate message
11334 * Test 2: Standard cert, verify peer
11335 * Test 3: Large cert, verify peer
11336 * Test 4: Standard cert, BIO returns 0 on retry
11337 * Test 5: Large cert, BIO returns 0 on retry
11338 * Test 6: Standard cert, verify peer, BIO returns 0 on retry
11339 * Test 7: Large cert, verify peer, BIO returns 0 on retry
11340 * Test 8-15: Repeat of above with TLSv1.2
11341 */
11342 static int test_handshake_retry(int idx)
11343 {
11344 SSL_CTX *cctx = NULL, *sctx = NULL;
11345 SSL *clientssl = NULL, *serverssl = NULL;
11346 int testresult = 0;
11347 BIO *tmp = NULL, *bretry = BIO_new(bio_s_always_retry());
11348 int maxversion = 0;
11349
11350 if (!TEST_ptr(bretry))
11351 goto end;
11352
11353 #ifndef OPENSSL_NO_TLS1_2
11354 if ((idx & 8) == 8)
11355 maxversion = TLS1_2_VERSION;
11356 #else
11357 if ((idx & 8) == 8)
11358 return TEST_skip("No TLSv1.2");
11359 #endif
11360
11361 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11362 TLS_client_method(), 0, maxversion,
11363 &sctx, &cctx, cert, privkey)))
11364 goto end;
11365
11366 /*
11367 * Add a large amount of data to fill the buffering BIO used by the SSL
11368 * object
11369 */
11370 if ((idx & 1) == 1 && !ssl_ctx_add_large_cert_chain(libctx, sctx, cert))
11371 goto end;
11372
11373 /*
11374 * We don't actually configure a client cert, but neither do we fail if one
11375 * isn't present.
11376 */
11377 if ((idx & 2) == 2)
11378 SSL_CTX_set_verify(sctx, SSL_VERIFY_PEER, NULL);
11379
11380 if ((idx & 4) == 4)
11381 set_always_retry_err_val(0);
11382
11383 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11384 &clientssl, NULL, NULL)))
11385 goto end;
11386
11387 tmp = SSL_get_wbio(serverssl);
11388 if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
11389 tmp = NULL;
11390 goto end;
11391 }
11392 SSL_set0_wbio(serverssl, bretry);
11393 bretry = NULL;
11394
11395 if (!TEST_int_eq(SSL_connect(clientssl), -1))
11396 goto end;
11397
11398 if (!TEST_int_eq(SSL_accept(serverssl), -1)
11399 || !TEST_int_eq(SSL_get_error(serverssl, -1), SSL_ERROR_WANT_WRITE))
11400 goto end;
11401
11402 /* Restore a BIO that will let the write succeed */
11403 SSL_set0_wbio(serverssl, tmp);
11404 tmp = NULL;
11405
11406 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11407 goto end;
11408
11409 testresult = 1;
11410 end:
11411 SSL_free(serverssl);
11412 SSL_free(clientssl);
11413 SSL_CTX_free(sctx);
11414 SSL_CTX_free(cctx);
11415 BIO_free(bretry);
11416 BIO_free(tmp);
11417 set_always_retry_err_val(-1);
11418 return testresult;
11419 }
11420
11421 /*
11422 * Test that receiving retries when writing application data works as expected
11423 */
11424 static int test_data_retry(void)
11425 {
11426 SSL_CTX *cctx = NULL, *sctx = NULL;
11427 SSL *clientssl = NULL, *serverssl = NULL;
11428 int testresult = 0;
11429 unsigned char inbuf[1200], outbuf[1200];
11430 size_t i;
11431 BIO *tmp = NULL;
11432 BIO *bretry = BIO_new(bio_s_maybe_retry());
11433 size_t written, readbytes, totread = 0;
11434
11435 if (!TEST_ptr(bretry))
11436 goto end;
11437
11438 for (i = 0; i < sizeof(inbuf); i++)
11439 inbuf[i] = (unsigned char)(0xff & i);
11440 memset(outbuf, 0, sizeof(outbuf));
11441
11442 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11443 TLS_client_method(), 0, 0, &sctx, &cctx,
11444 cert, privkey)))
11445 goto end;
11446
11447 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
11448 NULL)))
11449 goto end;
11450
11451 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11452 goto end;
11453
11454 /* Smallest possible max send fragment is 512 */
11455 if (!TEST_true(SSL_set_max_send_fragment(clientssl, 512)))
11456 goto end;
11457
11458 tmp = SSL_get_wbio(clientssl);
11459 if (!TEST_ptr(tmp))
11460 goto end;
11461 if (!TEST_true(BIO_up_ref(tmp)))
11462 goto end;
11463 BIO_push(bretry, tmp);
11464 tmp = NULL;
11465 SSL_set0_wbio(clientssl, bretry);
11466 if (!BIO_up_ref(bretry)) {
11467 bretry = NULL;
11468 goto end;
11469 }
11470
11471 for (i = 0; i < 3; i++) {
11472 /* We expect this call to make no progress and indicate retry */
11473 if (!TEST_false(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
11474 goto end;
11475 if (!TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_WRITE))
11476 goto end;
11477
11478 /* Allow one write to progress, but the next one to signal retry */
11479 if (!TEST_true(BIO_ctrl(bretry, MAYBE_RETRY_CTRL_SET_RETRY_AFTER_CNT, 1,
11480 NULL)))
11481 goto end;
11482
11483 if (i == 2)
11484 break;
11485
11486 /*
11487 * This call will hopefully make progress but will still indicate retry
11488 * because there is more data than will fit into a single record.
11489 */
11490 if (!TEST_false(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
11491 goto end;
11492 if (!TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_WRITE))
11493 goto end;
11494 }
11495
11496 /* The final call should write the last chunk of data and succeed */
11497 if (!TEST_true(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
11498 goto end;
11499 /* Read all the data available */
11500 while (SSL_read_ex(serverssl, outbuf + totread, sizeof(outbuf) - totread,
11501 &readbytes))
11502 totread += readbytes;
11503 if (!TEST_mem_eq(inbuf, sizeof(inbuf), outbuf, totread))
11504 goto end;
11505
11506 testresult = 1;
11507 end:
11508 SSL_free(serverssl);
11509 SSL_free(clientssl);
11510 SSL_CTX_free(sctx);
11511 SSL_CTX_free(cctx);
11512 BIO_free_all(bretry);
11513 BIO_free(tmp);
11514 return testresult;
11515 }
11516
11517 /*
11518 * Test multiple resumptions and cache size handling
11519 * Test 0: TLSv1.3 (max_early_data set)
11520 * Test 1: TLSv1.3 (SSL_OP_NO_TICKET set)
11521 * Test 2: TLSv1.3 (max_early_data and SSL_OP_NO_TICKET set)
11522 * Test 3: TLSv1.2
11523 */
11524 static int test_multi_resume(int idx)
11525 {
11526 SSL_CTX *sctx = NULL, *cctx = NULL;
11527 SSL *serverssl = NULL, *clientssl = NULL;
11528 SSL_SESSION *sess = NULL;
11529 int max_version = TLS1_3_VERSION;
11530 int i, testresult = 0;
11531
11532 if (idx == 3)
11533 max_version = TLS1_2_VERSION;
11534
11535 if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11536 TLS_client_method(), TLS1_VERSION,
11537 max_version, &sctx, &cctx, cert,
11538 privkey)))
11539 goto end;
11540
11541 /*
11542 * TLSv1.3 only uses a session cache if either max_early_data > 0 (used for
11543 * replay protection), or if SSL_OP_NO_TICKET is in use
11544 */
11545 if (idx == 0 || idx == 2) {
11546 if (!TEST_true(SSL_CTX_set_max_early_data(sctx, 1024)))
11547 goto end;
11548 }
11549 if (idx == 1 || idx == 2)
11550 SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET);
11551
11552 SSL_CTX_sess_set_cache_size(sctx, 5);
11553
11554 for (i = 0; i < 30; i++) {
11555 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11556 NULL, NULL))
11557 || !TEST_true(SSL_set_session(clientssl, sess)))
11558 goto end;
11559
11560 /*
11561 * Recreate a bug where dynamically changing the max_early_data value
11562 * can cause sessions in the session cache which cannot be deleted.
11563 */
11564 if ((idx == 0 || idx == 2) && (i % 3) == 2)
11565 SSL_set_max_early_data(serverssl, 0);
11566
11567 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11568 goto end;
11569
11570 if (sess == NULL || (idx == 0 && (i % 3) == 2)) {
11571 if (!TEST_false(SSL_session_reused(clientssl)))
11572 goto end;
11573 } else {
11574 if (!TEST_true(SSL_session_reused(clientssl)))
11575 goto end;
11576 }
11577 SSL_SESSION_free(sess);
11578
11579 /* Do a full handshake, followed by two resumptions */
11580 if ((i % 3) == 2) {
11581 sess = NULL;
11582 } else {
11583 if (!TEST_ptr((sess = SSL_get1_session(clientssl))))
11584 goto end;
11585 }
11586
11587 SSL_shutdown(clientssl);
11588 SSL_shutdown(serverssl);
11589 SSL_free(serverssl);
11590 SSL_free(clientssl);
11591 serverssl = clientssl = NULL;
11592 }
11593
11594 /* We should never exceed the session cache size limit */
11595 if (!TEST_long_le(SSL_CTX_sess_number(sctx), 5))
11596 goto end;
11597
11598 testresult = 1;
11599 end:
11600 SSL_free(serverssl);
11601 SSL_free(clientssl);
11602 SSL_CTX_free(sctx);
11603 SSL_CTX_free(cctx);
11604 SSL_SESSION_free(sess);
11605 return testresult;
11606 }
11607
11608 OPT_TEST_DECLARE_USAGE("certfile privkeyfile srpvfile tmpfile provider config dhfile\n")
11609
11610 int setup_tests(void)
11611 {
11612 char *modulename;
11613 char *configfile;
11614
11615 libctx = OSSL_LIB_CTX_new();
11616 if (!TEST_ptr(libctx))
11617 return 0;
11618
11619 defctxnull = OSSL_PROVIDER_load(NULL, "null");
11620
11621 /*
11622 * Verify that the default and fips providers in the default libctx are not
11623 * available
11624 */
11625 if (!TEST_false(OSSL_PROVIDER_available(NULL, "default"))
11626 || !TEST_false(OSSL_PROVIDER_available(NULL, "fips")))
11627 return 0;
11628
11629 if (!test_skip_common_options()) {
11630 TEST_error("Error parsing test options\n");
11631 return 0;
11632 }
11633
11634 if (!TEST_ptr(certsdir = test_get_argument(0))
11635 || !TEST_ptr(srpvfile = test_get_argument(1))
11636 || !TEST_ptr(tmpfilename = test_get_argument(2))
11637 || !TEST_ptr(modulename = test_get_argument(3))
11638 || !TEST_ptr(configfile = test_get_argument(4))
11639 || !TEST_ptr(dhfile = test_get_argument(5)))
11640 return 0;
11641
11642 if (!TEST_true(OSSL_LIB_CTX_load_config(libctx, configfile)))
11643 return 0;
11644
11645 /* Check we have the expected provider available */
11646 if (!TEST_true(OSSL_PROVIDER_available(libctx, modulename)))
11647 return 0;
11648
11649 /* Check the default provider is not available */
11650 if (strcmp(modulename, "default") != 0
11651 && !TEST_false(OSSL_PROVIDER_available(libctx, "default")))
11652 return 0;
11653
11654 if (strcmp(modulename, "fips") == 0) {
11655 OSSL_PROVIDER *prov = NULL;
11656 OSSL_PARAM params[2];
11657
11658 is_fips = 1;
11659
11660 prov = OSSL_PROVIDER_load(libctx, "fips");
11661 if (prov != NULL) {
11662 /* Query the fips provider to check if the check ems option is enabled */
11663 params[0] =
11664 OSSL_PARAM_construct_int(OSSL_PROV_PARAM_TLS1_PRF_EMS_CHECK,
11665 &fips_ems_check);
11666 params[1] = OSSL_PARAM_construct_end();
11667 OSSL_PROVIDER_get_params(prov, params);
11668 OSSL_PROVIDER_unload(prov);
11669 }
11670 }
11671
11672 /*
11673 * We add, but don't load the test "tls-provider". We'll load it when we
11674 * need it.
11675 */
11676 if (!TEST_true(OSSL_PROVIDER_add_builtin(libctx, "tls-provider",
11677 tls_provider_init)))
11678 return 0;
11679
11680
11681 if (getenv("OPENSSL_TEST_GETCOUNTS") != NULL) {
11682 #ifdef OPENSSL_NO_CRYPTO_MDEBUG
11683 TEST_error("not supported in this build");
11684 return 0;
11685 #else
11686 int i, mcount, rcount, fcount;
11687
11688 for (i = 0; i < 4; i++)
11689 test_export_key_mat(i);
11690 CRYPTO_get_alloc_counts(&mcount, &rcount, &fcount);
11691 test_printf_stdout("malloc %d realloc %d free %d\n",
11692 mcount, rcount, fcount);
11693 return 1;
11694 #endif
11695 }
11696
11697 cert = test_mk_file_path(certsdir, "servercert.pem");
11698 if (cert == NULL)
11699 goto err;
11700
11701 privkey = test_mk_file_path(certsdir, "serverkey.pem");
11702 if (privkey == NULL)
11703 goto err;
11704
11705 cert2 = test_mk_file_path(certsdir, "server-ecdsa-cert.pem");
11706 if (cert2 == NULL)
11707 goto err;
11708
11709 privkey2 = test_mk_file_path(certsdir, "server-ecdsa-key.pem");
11710 if (privkey2 == NULL)
11711 goto err;
11712
11713 cert1024 = test_mk_file_path(certsdir, "ee-cert-1024.pem");
11714 if (cert1024 == NULL)
11715 goto err;
11716
11717 privkey1024 = test_mk_file_path(certsdir, "ee-key-1024.pem");
11718 if (privkey1024 == NULL)
11719 goto err;
11720
11721 cert3072 = test_mk_file_path(certsdir, "ee-cert-3072.pem");
11722 if (cert3072 == NULL)
11723 goto err;
11724
11725 privkey3072 = test_mk_file_path(certsdir, "ee-key-3072.pem");
11726 if (privkey3072 == NULL)
11727 goto err;
11728
11729 cert4096 = test_mk_file_path(certsdir, "ee-cert-4096.pem");
11730 if (cert4096 == NULL)
11731 goto err;
11732
11733 privkey4096 = test_mk_file_path(certsdir, "ee-key-4096.pem");
11734 if (privkey4096 == NULL)
11735 goto err;
11736
11737 cert8192 = test_mk_file_path(certsdir, "ee-cert-8192.pem");
11738 if (cert8192 == NULL)
11739 goto err;
11740
11741 privkey8192 = test_mk_file_path(certsdir, "ee-key-8192.pem");
11742 if (privkey8192 == NULL)
11743 goto err;
11744
11745 if (fips_ems_check) {
11746 #ifndef OPENSSL_NO_TLS1_2
11747 ADD_TEST(test_no_ems);
11748 #endif
11749 return 1;
11750 }
11751 #if !defined(OPENSSL_NO_KTLS) && !defined(OPENSSL_NO_SOCK)
11752 # if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
11753 ADD_ALL_TESTS(test_ktls, NUM_KTLS_TEST_CIPHERS * 4);
11754 ADD_ALL_TESTS(test_ktls_sendfile, NUM_KTLS_TEST_CIPHERS * 2);
11755 # endif
11756 #endif
11757 ADD_TEST(test_large_message_tls);
11758 ADD_TEST(test_large_message_tls_read_ahead);
11759 #ifndef OPENSSL_NO_DTLS
11760 ADD_TEST(test_large_message_dtls);
11761 #endif
11762 ADD_ALL_TESTS(test_large_app_data, 28);
11763 ADD_TEST(test_cleanse_plaintext);
11764 #ifndef OPENSSL_NO_OCSP
11765 ADD_TEST(test_tlsext_status_type);
11766 #endif
11767 ADD_TEST(test_session_with_only_int_cache);
11768 ADD_TEST(test_session_with_only_ext_cache);
11769 ADD_TEST(test_session_with_both_cache);
11770 ADD_TEST(test_session_wo_ca_names);
11771 #ifndef OSSL_NO_USABLE_TLS1_3
11772 ADD_ALL_TESTS(test_stateful_tickets, 3);
11773 ADD_ALL_TESTS(test_stateless_tickets, 3);
11774 ADD_TEST(test_psk_tickets);
11775 ADD_ALL_TESTS(test_extra_tickets, 6);
11776 #endif
11777 ADD_ALL_TESTS(test_ssl_set_bio, TOTAL_SSL_SET_BIO_TESTS);
11778 ADD_TEST(test_ssl_bio_pop_next_bio);
11779 ADD_TEST(test_ssl_bio_pop_ssl_bio);
11780 ADD_TEST(test_ssl_bio_change_rbio);
11781 ADD_TEST(test_ssl_bio_change_wbio);
11782 #if !defined(OPENSSL_NO_TLS1_2) || defined(OSSL_NO_USABLE_TLS1_3)
11783 ADD_ALL_TESTS(test_set_sigalgs, OSSL_NELEM(testsigalgs) * 2);
11784 ADD_TEST(test_keylog);
11785 #endif
11786 #ifndef OSSL_NO_USABLE_TLS1_3
11787 ADD_TEST(test_keylog_no_master_key);
11788 #endif
11789 ADD_TEST(test_client_cert_verify_cb);
11790 ADD_TEST(test_ssl_build_cert_chain);
11791 ADD_TEST(test_ssl_ctx_build_cert_chain);
11792 #ifndef OPENSSL_NO_TLS1_2
11793 ADD_TEST(test_client_hello_cb);
11794 ADD_TEST(test_no_ems);
11795 ADD_TEST(test_ccs_change_cipher);
11796 #endif
11797 #ifndef OSSL_NO_USABLE_TLS1_3
11798 ADD_ALL_TESTS(test_early_data_read_write, 6);
11799 /*
11800 * We don't do replay tests for external PSK. Replay protection isn't used
11801 * in that scenario.
11802 */
11803 ADD_ALL_TESTS(test_early_data_replay, 2);
11804 ADD_ALL_TESTS(test_early_data_skip, OSSL_NELEM(ciphersuites) * 3);
11805 ADD_ALL_TESTS(test_early_data_skip_hrr, OSSL_NELEM(ciphersuites) * 3);
11806 ADD_ALL_TESTS(test_early_data_skip_hrr_fail, OSSL_NELEM(ciphersuites) * 3);
11807 ADD_ALL_TESTS(test_early_data_skip_abort, OSSL_NELEM(ciphersuites) * 3);
11808 ADD_ALL_TESTS(test_early_data_not_sent, 3);
11809 ADD_ALL_TESTS(test_early_data_psk, 8);
11810 ADD_ALL_TESTS(test_early_data_psk_with_all_ciphers, 5);
11811 ADD_ALL_TESTS(test_early_data_not_expected, 3);
11812 # ifndef OPENSSL_NO_TLS1_2
11813 ADD_ALL_TESTS(test_early_data_tls1_2, 3);
11814 # endif
11815 #endif
11816 #ifndef OSSL_NO_USABLE_TLS1_3
11817 ADD_ALL_TESTS(test_set_ciphersuite, 10);
11818 ADD_TEST(test_ciphersuite_change);
11819 ADD_ALL_TESTS(test_tls13_ciphersuite, 4);
11820 # ifdef OPENSSL_NO_PSK
11821 ADD_ALL_TESTS(test_tls13_psk, 1);
11822 # else
11823 ADD_ALL_TESTS(test_tls13_psk, 4);
11824 # endif /* OPENSSL_NO_PSK */
11825 #ifndef OSSL_NO_USABLE_TLS1_3
11826 ADD_ALL_TESTS(test_tls13_no_dhe_kex, 8);
11827 #endif /* OSSL_NO_USABLE_TLS1_3 */
11828 # ifndef OPENSSL_NO_TLS1_2
11829 /* Test with both TLSv1.3 and 1.2 versions */
11830 ADD_ALL_TESTS(test_key_exchange, 14);
11831 # if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_DH)
11832 ADD_ALL_TESTS(test_negotiated_group,
11833 4 * (OSSL_NELEM(ecdhe_kexch_groups)
11834 + OSSL_NELEM(ffdhe_kexch_groups)));
11835 # endif
11836 # else
11837 /* Test with only TLSv1.3 versions */
11838 ADD_ALL_TESTS(test_key_exchange, 12);
11839 # endif
11840 ADD_ALL_TESTS(test_custom_exts, 6);
11841 ADD_TEST(test_stateless);
11842 ADD_TEST(test_pha_key_update);
11843 #else
11844 ADD_ALL_TESTS(test_custom_exts, 3);
11845 #endif
11846 ADD_ALL_TESTS(test_export_key_mat, 6);
11847 #ifndef OSSL_NO_USABLE_TLS1_3
11848 ADD_ALL_TESTS(test_export_key_mat_early, 3);
11849 ADD_TEST(test_key_update);
11850 ADD_ALL_TESTS(test_key_update_peer_in_write, 2);
11851 ADD_ALL_TESTS(test_key_update_peer_in_read, 2);
11852 ADD_ALL_TESTS(test_key_update_local_in_write, 2);
11853 ADD_ALL_TESTS(test_key_update_local_in_read, 2);
11854 #endif
11855 ADD_ALL_TESTS(test_ssl_clear, 8);
11856 ADD_ALL_TESTS(test_max_fragment_len_ext, OSSL_NELEM(max_fragment_len_test));
11857 #if !defined(OPENSSL_NO_SRP) && !defined(OPENSSL_NO_TLS1_2)
11858 ADD_ALL_TESTS(test_srp, 6);
11859 #endif
11860 #if !defined(OPENSSL_NO_COMP_ALG)
11861 /* Add compression case */
11862 ADD_ALL_TESTS(test_info_callback, 8);
11863 #else
11864 ADD_ALL_TESTS(test_info_callback, 6);
11865 #endif
11866 ADD_ALL_TESTS(test_ssl_pending, 2);
11867 ADD_ALL_TESTS(test_ssl_get_shared_ciphers, OSSL_NELEM(shared_ciphers_data));
11868 ADD_ALL_TESTS(test_ticket_callbacks, 20);
11869 ADD_ALL_TESTS(test_shutdown, 7);
11870 ADD_TEST(test_async_shutdown);
11871 ADD_ALL_TESTS(test_incorrect_shutdown, 2);
11872 ADD_ALL_TESTS(test_cert_cb, 6);
11873 ADD_ALL_TESTS(test_client_cert_cb, 2);
11874 ADD_ALL_TESTS(test_ca_names, 3);
11875 #ifndef OPENSSL_NO_TLS1_2
11876 ADD_ALL_TESTS(test_multiblock_write, OSSL_NELEM(multiblock_cipherlist_data));
11877 #endif
11878 ADD_ALL_TESTS(test_servername, 10);
11879 ADD_TEST(test_unknown_sigalgs_groups);
11880 #if !defined(OPENSSL_NO_EC) \
11881 && (!defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2))
11882 ADD_ALL_TESTS(test_sigalgs_available, 6);
11883 #endif
11884 #ifndef OPENSSL_NO_TLS1_3
11885 ADD_ALL_TESTS(test_pluggable_group, 2);
11886 ADD_ALL_TESTS(test_pluggable_signature, 4);
11887 #endif
11888 #ifndef OPENSSL_NO_TLS1_2
11889 ADD_TEST(test_ssl_dup);
11890 # ifndef OPENSSL_NO_DH
11891 ADD_ALL_TESTS(test_set_tmp_dh, 11);
11892 ADD_ALL_TESTS(test_dh_auto, 7);
11893 # endif
11894 #endif
11895 #ifndef OSSL_NO_USABLE_TLS1_3
11896 ADD_TEST(test_sni_tls13);
11897 ADD_ALL_TESTS(test_ticket_lifetime, 2);
11898 #endif
11899 ADD_TEST(test_inherit_verify_param);
11900 ADD_TEST(test_set_alpn);
11901 ADD_TEST(test_set_verify_cert_store_ssl_ctx);
11902 ADD_TEST(test_set_verify_cert_store_ssl);
11903 ADD_ALL_TESTS(test_session_timeout, 1);
11904 ADD_TEST(test_load_dhfile);
11905 #ifndef OSSL_NO_USABLE_TLS1_3
11906 ADD_TEST(test_read_ahead_key_change);
11907 ADD_ALL_TESTS(test_tls13_record_padding, 4);
11908 #endif
11909 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OSSL_NO_USABLE_TLS1_3)
11910 ADD_ALL_TESTS(test_serverinfo_custom, 4);
11911 #endif
11912 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
11913 ADD_ALL_TESTS(test_pipelining, 7);
11914 #endif
11915 ADD_ALL_TESTS(test_version, 6);
11916 ADD_TEST(test_rstate_string);
11917 ADD_ALL_TESTS(test_handshake_retry, 16);
11918 ADD_TEST(test_data_retry);
11919 ADD_ALL_TESTS(test_multi_resume, 4);
11920 return 1;
11921
11922 err:
11923 OPENSSL_free(cert);
11924 OPENSSL_free(privkey);
11925 OPENSSL_free(cert2);
11926 OPENSSL_free(privkey2);
11927 return 0;
11928 }
11929
11930 void cleanup_tests(void)
11931 {
11932 # if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DH)
11933 EVP_PKEY_free(tmp_dh_params);
11934 #endif
11935 OPENSSL_free(cert);
11936 OPENSSL_free(privkey);
11937 OPENSSL_free(cert2);
11938 OPENSSL_free(privkey2);
11939 OPENSSL_free(cert1024);
11940 OPENSSL_free(privkey1024);
11941 OPENSSL_free(cert3072);
11942 OPENSSL_free(privkey3072);
11943 OPENSSL_free(cert4096);
11944 OPENSSL_free(privkey4096);
11945 OPENSSL_free(cert8192);
11946 OPENSSL_free(privkey8192);
11947 bio_s_mempacket_test_free();
11948 bio_s_always_retry_free();
11949 bio_s_maybe_retry_free();
11950 OSSL_PROVIDER_unload(defctxnull);
11951 OSSL_LIB_CTX_free(libctx);
11952 }