xref: /freebsd/crypto/openssl/test/sslapitest.c (revision f9bc005b8ef3b507a5ecbc2d7fe4411ef70eff38)
1 /*
2  * Copyright 2016-2026 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 "internal/ssl_unwrap.h"
45 #include "../ssl/ssl_local.h"
46 #include "../ssl/record/methods/recmethod_local.h"
47 #include "filterprov.h"
48 
49 #undef OSSL_NO_USABLE_TLS1_3
50 #if defined(OPENSSL_NO_TLS1_3) \
51     || (defined(OPENSSL_NO_EC) && defined(OPENSSL_NO_DH))
52 /*
53  * If we don't have ec or dh then there are no built-in groups that are usable
54  * with TLSv1.3
55  */
56 #define OSSL_NO_USABLE_TLS1_3
57 #endif
58 
59 /* Defined in tls-provider.c */
60 int tls_provider_init(const OSSL_CORE_HANDLE *handle,
61     const OSSL_DISPATCH *in,
62     const OSSL_DISPATCH **out,
63     void **provctx);
64 
65 static OSSL_LIB_CTX *libctx = NULL;
66 static OSSL_PROVIDER *defctxnull = NULL;
67 
68 #ifndef OSSL_NO_USABLE_TLS1_3
69 
70 static SSL_SESSION *clientpsk = NULL;
71 static SSL_SESSION *serverpsk = NULL;
72 static const char *pskid = "Identity";
73 static const char *srvid;
74 
75 static int use_session_cb(SSL *ssl, const EVP_MD *md, const unsigned char **id,
76     size_t *idlen, SSL_SESSION **sess);
77 static int find_session_cb(SSL *ssl, const unsigned char *identity,
78     size_t identity_len, SSL_SESSION **sess);
79 
80 static int use_session_cb_cnt = 0;
81 static int find_session_cb_cnt = 0;
82 static int end_of_early_data = 0;
83 #endif
84 
85 static char *certsdir = NULL;
86 static char *cert = NULL;
87 static char *privkey = NULL;
88 static char *cert2 = NULL;
89 static char *privkey2 = NULL;
90 static char *cert1024 = NULL;
91 static char *privkey1024 = NULL;
92 static char *cert3072 = NULL;
93 static char *privkey3072 = NULL;
94 static char *cert4096 = NULL;
95 static char *privkey4096 = NULL;
96 static char *cert8192 = NULL;
97 static char *privkey8192 = NULL;
98 static char *srpvfile = NULL;
99 static char *tmpfilename = NULL;
100 static char *dhfile = NULL;
101 static char *datadir = NULL;
102 
103 static int is_fips = 0;
104 static int fips_ems_check = 0;
105 
106 #define LOG_BUFFER_SIZE 2048
107 static char server_log_buffer[LOG_BUFFER_SIZE + 1] = { 0 };
108 static size_t server_log_buffer_index = 0;
109 static char client_log_buffer[LOG_BUFFER_SIZE + 1] = { 0 };
110 static size_t client_log_buffer_index = 0;
111 static int error_writing_log = 0;
112 
113 #ifndef OPENSSL_NO_OCSP
114 static const unsigned char orespder[] = "Dummy OCSP Response";
115 static int ocsp_server_called = 0;
116 static int ocsp_client_called = 0;
117 
118 static int cdummyarg = 1;
119 static X509 *ocspcert = NULL;
120 #endif
121 
122 #define CLIENT_VERSION_LEN 2
123 
124 /* The ssltrace test assumes some options are switched on/off */
125 #if !defined(OPENSSL_NO_SSL_TRACE)                                \
126     && defined(OPENSSL_NO_BROTLI) && defined(OPENSSL_NO_ZSTD)     \
127     && !defined(OPENSSL_NO_ECX) && !defined(OPENSSL_NO_DH)        \
128     && !defined(OPENSSL_NO_ML_DSA) && !defined(OPENSSL_NO_ML_KEM) \
129     && !defined(OPENSSL_NO_TLS1_3)
130 #define DO_SSL_TRACE_TEST
131 #endif
132 
133 /*
134  * This structure is used to validate that the correct number of log messages
135  * of various types are emitted when emitting secret logs.
136  */
137 struct sslapitest_log_counts {
138     unsigned int rsa_key_exchange_count;
139     unsigned int master_secret_count;
140     unsigned int client_early_secret_count;
141     unsigned int client_handshake_secret_count;
142     unsigned int server_handshake_secret_count;
143     unsigned int client_application_secret_count;
144     unsigned int server_application_secret_count;
145     unsigned int early_exporter_secret_count;
146     unsigned int exporter_secret_count;
147 };
148 
149 static int hostname_cb(SSL *s, int *al, void *arg)
150 {
151     const char *hostname = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
152 
153     if (hostname != NULL && (strcmp(hostname, "goodhost") == 0 || strcmp(hostname, "altgoodhost") == 0))
154         return SSL_TLSEXT_ERR_OK;
155 
156     return SSL_TLSEXT_ERR_NOACK;
157 }
158 
159 static void client_keylog_callback(const SSL *ssl, const char *line)
160 {
161     int line_length = strlen(line);
162 
163     /* If the log doesn't fit, error out. */
164     if (client_log_buffer_index + line_length > sizeof(client_log_buffer) - 1) {
165         TEST_info("Client log too full");
166         error_writing_log = 1;
167         return;
168     }
169 
170     strcat(client_log_buffer, line);
171     client_log_buffer_index += line_length;
172     client_log_buffer[client_log_buffer_index++] = '\n';
173 }
174 
175 static void server_keylog_callback(const SSL *ssl, const char *line)
176 {
177     int line_length = strlen(line);
178 
179     /* If the log doesn't fit, error out. */
180     if (server_log_buffer_index + line_length > sizeof(server_log_buffer) - 1) {
181         TEST_info("Server log too full");
182         error_writing_log = 1;
183         return;
184     }
185 
186     strcat(server_log_buffer, line);
187     server_log_buffer_index += line_length;
188     server_log_buffer[server_log_buffer_index++] = '\n';
189 }
190 
191 static int compare_hex_encoded_buffer(const char *hex_encoded,
192     size_t hex_length,
193     const uint8_t *raw,
194     size_t raw_length)
195 {
196     size_t i, j;
197     char hexed[3];
198 
199     if (!TEST_size_t_eq(raw_length * 2, hex_length))
200         return 1;
201 
202     for (i = j = 0; i < raw_length && j + 1 < hex_length; i++, j += 2) {
203         BIO_snprintf(hexed, sizeof(hexed), "%02x", raw[i]);
204         if (!TEST_int_eq(hexed[0], hex_encoded[j])
205             || !TEST_int_eq(hexed[1], hex_encoded[j + 1]))
206             return 1;
207     }
208 
209     return 0;
210 }
211 
212 static int test_keylog_output(char *buffer, const SSL *ssl,
213     const SSL_SESSION *session,
214     struct sslapitest_log_counts *expected)
215 {
216     char *token = NULL;
217     unsigned char actual_client_random[SSL3_RANDOM_SIZE] = { 0 };
218     size_t client_random_size = SSL3_RANDOM_SIZE;
219     unsigned char actual_master_key[SSL_MAX_MASTER_KEY_LENGTH] = { 0 };
220     size_t master_key_size = SSL_MAX_MASTER_KEY_LENGTH;
221     unsigned int rsa_key_exchange_count = 0;
222     unsigned int master_secret_count = 0;
223     unsigned int client_early_secret_count = 0;
224     unsigned int client_handshake_secret_count = 0;
225     unsigned int server_handshake_secret_count = 0;
226     unsigned int client_application_secret_count = 0;
227     unsigned int server_application_secret_count = 0;
228     unsigned int early_exporter_secret_count = 0;
229     unsigned int exporter_secret_count = 0;
230 
231     for (token = strtok(buffer, " \n"); token != NULL;
232         token = strtok(NULL, " \n")) {
233         if (strcmp(token, "RSA") == 0) {
234             /*
235              * Premaster secret. Tokens should be: 16 ASCII bytes of
236              * hex-encoded encrypted secret, then the hex-encoded pre-master
237              * secret.
238              */
239             if (!TEST_ptr(token = strtok(NULL, " \n")))
240                 return 0;
241             if (!TEST_size_t_eq(strlen(token), 16))
242                 return 0;
243             if (!TEST_ptr(token = strtok(NULL, " \n")))
244                 return 0;
245             /*
246              * We can't sensibly check the log because the premaster secret is
247              * transient, and OpenSSL doesn't keep hold of it once the master
248              * secret is generated.
249              */
250             rsa_key_exchange_count++;
251         } else if (strcmp(token, "CLIENT_RANDOM") == 0) {
252             /*
253              * Master secret. Tokens should be: 64 ASCII bytes of hex-encoded
254              * client random, then the hex-encoded master secret.
255              */
256             client_random_size = SSL_get_client_random(ssl,
257                 actual_client_random,
258                 SSL3_RANDOM_SIZE);
259             if (!TEST_size_t_eq(client_random_size, SSL3_RANDOM_SIZE))
260                 return 0;
261 
262             if (!TEST_ptr(token = strtok(NULL, " \n")))
263                 return 0;
264             if (!TEST_size_t_eq(strlen(token), 64))
265                 return 0;
266             if (!TEST_false(compare_hex_encoded_buffer(token, 64,
267                     actual_client_random,
268                     client_random_size)))
269                 return 0;
270 
271             if (!TEST_ptr(token = strtok(NULL, " \n")))
272                 return 0;
273             master_key_size = SSL_SESSION_get_master_key(session,
274                 actual_master_key,
275                 master_key_size);
276             if (!TEST_size_t_ne(master_key_size, 0))
277                 return 0;
278             if (!TEST_false(compare_hex_encoded_buffer(token, strlen(token),
279                     actual_master_key,
280                     master_key_size)))
281                 return 0;
282             master_secret_count++;
283         } else if (strcmp(token, "CLIENT_EARLY_TRAFFIC_SECRET") == 0
284             || strcmp(token, "CLIENT_HANDSHAKE_TRAFFIC_SECRET") == 0
285             || strcmp(token, "SERVER_HANDSHAKE_TRAFFIC_SECRET") == 0
286             || strcmp(token, "CLIENT_TRAFFIC_SECRET_0") == 0
287             || strcmp(token, "SERVER_TRAFFIC_SECRET_0") == 0
288             || strcmp(token, "EARLY_EXPORTER_SECRET") == 0
289             || strcmp(token, "EXPORTER_SECRET") == 0) {
290             /*
291              * TLSv1.3 secret. Tokens should be: 64 ASCII bytes of hex-encoded
292              * client random, and then the hex-encoded secret. In this case,
293              * we treat all of these secrets identically and then just
294              * distinguish between them when counting what we saw.
295              */
296             if (strcmp(token, "CLIENT_EARLY_TRAFFIC_SECRET") == 0)
297                 client_early_secret_count++;
298             else if (strcmp(token, "CLIENT_HANDSHAKE_TRAFFIC_SECRET") == 0)
299                 client_handshake_secret_count++;
300             else if (strcmp(token, "SERVER_HANDSHAKE_TRAFFIC_SECRET") == 0)
301                 server_handshake_secret_count++;
302             else if (strcmp(token, "CLIENT_TRAFFIC_SECRET_0") == 0)
303                 client_application_secret_count++;
304             else if (strcmp(token, "SERVER_TRAFFIC_SECRET_0") == 0)
305                 server_application_secret_count++;
306             else if (strcmp(token, "EARLY_EXPORTER_SECRET") == 0)
307                 early_exporter_secret_count++;
308             else if (strcmp(token, "EXPORTER_SECRET") == 0)
309                 exporter_secret_count++;
310 
311             client_random_size = SSL_get_client_random(ssl,
312                 actual_client_random,
313                 SSL3_RANDOM_SIZE);
314             if (!TEST_size_t_eq(client_random_size, SSL3_RANDOM_SIZE))
315                 return 0;
316 
317             if (!TEST_ptr(token = strtok(NULL, " \n")))
318                 return 0;
319             if (!TEST_size_t_eq(strlen(token), 64))
320                 return 0;
321             if (!TEST_false(compare_hex_encoded_buffer(token, 64,
322                     actual_client_random,
323                     client_random_size)))
324                 return 0;
325 
326             if (!TEST_ptr(token = strtok(NULL, " \n")))
327                 return 0;
328         } else {
329             TEST_info("Unexpected token %s\n", token);
330             return 0;
331         }
332     }
333 
334     /* Got what we expected? */
335     if (!TEST_size_t_eq(rsa_key_exchange_count,
336             expected->rsa_key_exchange_count)
337         || !TEST_size_t_eq(master_secret_count,
338             expected->master_secret_count)
339         || !TEST_size_t_eq(client_early_secret_count,
340             expected->client_early_secret_count)
341         || !TEST_size_t_eq(client_handshake_secret_count,
342             expected->client_handshake_secret_count)
343         || !TEST_size_t_eq(server_handshake_secret_count,
344             expected->server_handshake_secret_count)
345         || !TEST_size_t_eq(client_application_secret_count,
346             expected->client_application_secret_count)
347         || !TEST_size_t_eq(server_application_secret_count,
348             expected->server_application_secret_count)
349         || !TEST_size_t_eq(early_exporter_secret_count,
350             expected->early_exporter_secret_count)
351         || !TEST_size_t_eq(exporter_secret_count,
352             expected->exporter_secret_count))
353         return 0;
354     return 1;
355 }
356 
357 #if !defined(OPENSSL_NO_TLS1_2) || defined(OSSL_NO_USABLE_TLS1_3)
358 static int test_keylog(void)
359 {
360     SSL_CTX *cctx = NULL, *sctx = NULL;
361     SSL *clientssl = NULL, *serverssl = NULL;
362     int testresult = 0;
363     struct sslapitest_log_counts expected;
364 
365     /* Clean up logging space */
366     memset(&expected, 0, sizeof(expected));
367     memset(client_log_buffer, 0, sizeof(client_log_buffer));
368     memset(server_log_buffer, 0, sizeof(server_log_buffer));
369     client_log_buffer_index = 0;
370     server_log_buffer_index = 0;
371     error_writing_log = 0;
372 
373     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
374             TLS_client_method(),
375             TLS1_VERSION, 0,
376             &sctx, &cctx, cert, privkey)))
377         return 0;
378 
379     /* We cannot log the master secret for TLSv1.3, so we should forbid it. */
380     SSL_CTX_set_options(cctx, SSL_OP_NO_TLSv1_3);
381     SSL_CTX_set_options(sctx, SSL_OP_NO_TLSv1_3);
382 
383     /* We also want to ensure that we use RSA-based key exchange. */
384     if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "RSA")))
385         goto end;
386 
387     if (!TEST_true(SSL_CTX_get_keylog_callback(cctx) == NULL)
388         || !TEST_true(SSL_CTX_get_keylog_callback(sctx) == NULL))
389         goto end;
390     SSL_CTX_set_keylog_callback(cctx, client_keylog_callback);
391     if (!TEST_true(SSL_CTX_get_keylog_callback(cctx)
392             == client_keylog_callback))
393         goto end;
394     SSL_CTX_set_keylog_callback(sctx, server_keylog_callback);
395     if (!TEST_true(SSL_CTX_get_keylog_callback(sctx)
396             == server_keylog_callback))
397         goto end;
398 
399     /* Now do a handshake and check that the logs have been written to. */
400     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
401             &clientssl, NULL, NULL))
402         || !TEST_true(create_ssl_connection(serverssl, clientssl,
403             SSL_ERROR_NONE))
404         || !TEST_false(error_writing_log)
405         || !TEST_int_gt(client_log_buffer_index, 0)
406         || !TEST_int_gt(server_log_buffer_index, 0))
407         goto end;
408 
409     /*
410      * Now we want to test that our output data was vaguely sensible. We
411      * do that by using strtok and confirming that we have more or less the
412      * data we expect. For both client and server, we expect to see one master
413      * secret. The client should also see an RSA key exchange.
414      */
415     expected.rsa_key_exchange_count = 1;
416     expected.master_secret_count = 1;
417     if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
418             SSL_get_session(clientssl), &expected)))
419         goto end;
420 
421     expected.rsa_key_exchange_count = 0;
422     if (!TEST_true(test_keylog_output(server_log_buffer, serverssl,
423             SSL_get_session(serverssl), &expected)))
424         goto end;
425 
426     testresult = 1;
427 
428 end:
429     SSL_free(serverssl);
430     SSL_free(clientssl);
431     SSL_CTX_free(sctx);
432     SSL_CTX_free(cctx);
433 
434     return testresult;
435 }
436 #endif
437 
438 #ifndef OSSL_NO_USABLE_TLS1_3
439 static int test_keylog_no_master_key(void)
440 {
441     SSL_CTX *cctx = NULL, *sctx = NULL;
442     SSL *clientssl = NULL, *serverssl = NULL;
443     SSL_SESSION *sess = NULL;
444     int testresult = 0;
445     struct sslapitest_log_counts expected;
446     unsigned char buf[1];
447     size_t readbytes, written;
448 
449     /* Clean up logging space */
450     memset(&expected, 0, sizeof(expected));
451     memset(client_log_buffer, 0, sizeof(client_log_buffer));
452     memset(server_log_buffer, 0, sizeof(server_log_buffer));
453     client_log_buffer_index = 0;
454     server_log_buffer_index = 0;
455     error_writing_log = 0;
456 
457     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
458             TLS_client_method(), TLS1_VERSION, 0,
459             &sctx, &cctx, cert, privkey))
460         || !TEST_true(SSL_CTX_set_max_early_data(sctx,
461             SSL3_RT_MAX_PLAIN_LENGTH)))
462         return 0;
463 
464     if (!TEST_true(SSL_CTX_get_keylog_callback(cctx) == NULL)
465         || !TEST_true(SSL_CTX_get_keylog_callback(sctx) == NULL))
466         goto end;
467 
468     SSL_CTX_set_keylog_callback(cctx, client_keylog_callback);
469     if (!TEST_true(SSL_CTX_get_keylog_callback(cctx)
470             == client_keylog_callback))
471         goto end;
472 
473     SSL_CTX_set_keylog_callback(sctx, server_keylog_callback);
474     if (!TEST_true(SSL_CTX_get_keylog_callback(sctx)
475             == server_keylog_callback))
476         goto end;
477 
478     /* Now do a handshake and check that the logs have been written to. */
479     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
480             &clientssl, NULL, NULL))
481         || !TEST_true(create_ssl_connection(serverssl, clientssl,
482             SSL_ERROR_NONE))
483         || !TEST_false(error_writing_log))
484         goto end;
485 
486     /*
487      * Now we want to test that our output data was vaguely sensible. For this
488      * test, we expect no CLIENT_RANDOM entry because it doesn't make sense for
489      * TLSv1.3, but we do expect both client and server to emit keys.
490      */
491     expected.client_handshake_secret_count = 1;
492     expected.server_handshake_secret_count = 1;
493     expected.client_application_secret_count = 1;
494     expected.server_application_secret_count = 1;
495     expected.exporter_secret_count = 1;
496     if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
497             SSL_get_session(clientssl), &expected))
498         || !TEST_true(test_keylog_output(server_log_buffer, serverssl,
499             SSL_get_session(serverssl),
500             &expected)))
501         goto end;
502 
503     /* Terminate old session and resume with early data. */
504     sess = SSL_get1_session(clientssl);
505     SSL_shutdown(clientssl);
506     SSL_shutdown(serverssl);
507     SSL_free(serverssl);
508     SSL_free(clientssl);
509     serverssl = clientssl = NULL;
510 
511     /* Reset key log */
512     memset(client_log_buffer, 0, sizeof(client_log_buffer));
513     memset(server_log_buffer, 0, sizeof(server_log_buffer));
514     client_log_buffer_index = 0;
515     server_log_buffer_index = 0;
516 
517     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
518             &clientssl, NULL, NULL))
519         || !TEST_true(SSL_set_session(clientssl, sess))
520         /* Here writing 0 length early data is enough. */
521         || !TEST_true(SSL_write_early_data(clientssl, NULL, 0, &written))
522         || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
523                             &readbytes),
524             SSL_READ_EARLY_DATA_ERROR)
525         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
526             SSL_EARLY_DATA_ACCEPTED)
527         || !TEST_true(create_ssl_connection(serverssl, clientssl,
528             SSL_ERROR_NONE))
529         || !TEST_true(SSL_session_reused(clientssl)))
530         goto end;
531 
532     /* In addition to the previous entries, expect early secrets. */
533     expected.client_early_secret_count = 1;
534     expected.early_exporter_secret_count = 1;
535     if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
536             SSL_get_session(clientssl), &expected))
537         || !TEST_true(test_keylog_output(server_log_buffer, serverssl,
538             SSL_get_session(serverssl),
539             &expected)))
540         goto end;
541 
542     testresult = 1;
543 
544 end:
545     SSL_SESSION_free(sess);
546     SSL_free(serverssl);
547     SSL_free(clientssl);
548     SSL_CTX_free(sctx);
549     SSL_CTX_free(cctx);
550 
551     return testresult;
552 }
553 #endif
554 
555 static int verify_retry_cb(X509_STORE_CTX *ctx, void *arg)
556 {
557     int res = X509_verify_cert(ctx);
558     int idx = SSL_get_ex_data_X509_STORE_CTX_idx();
559     SSL *ssl;
560 
561     /* this should not happen but check anyway */
562     if (idx < 0
563         || (ssl = X509_STORE_CTX_get_ex_data(ctx, idx)) == NULL)
564         return 0;
565 
566     if (res == 0 && X509_STORE_CTX_get_error(ctx) == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY)
567         /* indicate SSL_ERROR_WANT_RETRY_VERIFY */
568         return SSL_set_retry_verify(ssl);
569 
570     return res;
571 }
572 
573 static int test_client_cert_verify_cb(void)
574 {
575     /* server key, cert, chain, and root */
576     char *skey = test_mk_file_path(certsdir, "leaf.key");
577     char *leaf = test_mk_file_path(certsdir, "leaf.pem");
578     char *int2 = test_mk_file_path(certsdir, "subinterCA.pem");
579     char *int1 = test_mk_file_path(certsdir, "interCA.pem");
580     char *root = test_mk_file_path(certsdir, "rootCA.pem");
581     X509 *crt1 = NULL, *crt2 = NULL;
582     STACK_OF(X509) *server_chain;
583     SSL_CTX *cctx = NULL, *sctx = NULL;
584     SSL *clientssl = NULL, *serverssl = NULL;
585     int testresult = 0;
586 
587     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
588             TLS_client_method(), TLS1_VERSION, 0,
589             &sctx, &cctx, NULL, NULL)))
590         goto end;
591     if (!TEST_int_eq(SSL_CTX_use_certificate_chain_file(sctx, leaf), 1)
592         || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(sctx, skey,
593                             SSL_FILETYPE_PEM),
594             1)
595         || !TEST_int_eq(SSL_CTX_check_private_key(sctx), 1))
596         goto end;
597     if (!TEST_true(SSL_CTX_load_verify_locations(cctx, root, NULL)))
598         goto end;
599     SSL_CTX_set_verify(cctx, SSL_VERIFY_PEER, NULL);
600     SSL_CTX_set_cert_verify_callback(cctx, verify_retry_cb, NULL);
601     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
602             &clientssl, NULL, NULL)))
603         goto end;
604 
605     /* attempt SSL_connect() with incomplete server chain */
606     if (!TEST_false(create_ssl_connection(serverssl, clientssl,
607             SSL_ERROR_WANT_RETRY_VERIFY)))
608         goto end;
609 
610     /* application provides intermediate certs needed to verify server cert */
611     if (!TEST_ptr((crt1 = load_cert_pem(int1, libctx)))
612         || !TEST_ptr((crt2 = load_cert_pem(int2, libctx)))
613         || !TEST_ptr((server_chain = SSL_get_peer_cert_chain(clientssl))))
614         goto end;
615     /* add certs in reverse order to demonstrate real chain building */
616     if (!TEST_true(sk_X509_push(server_chain, crt1)))
617         goto end;
618     crt1 = NULL;
619     if (!TEST_true(sk_X509_push(server_chain, crt2)))
620         goto end;
621     crt2 = NULL;
622 
623     /* continue SSL_connect(), must now succeed with completed server chain */
624     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
625             SSL_ERROR_NONE)))
626         goto end;
627 
628     testresult = 1;
629 
630 end:
631     X509_free(crt1);
632     X509_free(crt2);
633     if (clientssl != NULL) {
634         SSL_shutdown(clientssl);
635         SSL_free(clientssl);
636     }
637     if (serverssl != NULL) {
638         SSL_shutdown(serverssl);
639         SSL_free(serverssl);
640     }
641     SSL_CTX_free(sctx);
642     SSL_CTX_free(cctx);
643 
644     OPENSSL_free(skey);
645     OPENSSL_free(leaf);
646     OPENSSL_free(int2);
647     OPENSSL_free(int1);
648     OPENSSL_free(root);
649 
650     return testresult;
651 }
652 
653 static int test_ssl_build_cert_chain(void)
654 {
655     int ret = 0;
656     SSL_CTX *ssl_ctx = NULL;
657     SSL *ssl = NULL;
658     char *skey = test_mk_file_path(certsdir, "leaf.key");
659     char *leaf_chain = test_mk_file_path(certsdir, "leaf-chain.pem");
660 
661     if (!TEST_ptr(ssl_ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method())))
662         goto end;
663     if (!TEST_ptr(ssl = SSL_new(ssl_ctx)))
664         goto end;
665     /* leaf_chain contains leaf + subinterCA + interCA + rootCA */
666     if (!TEST_int_eq(SSL_use_certificate_chain_file(ssl, leaf_chain), 1)
667         || !TEST_int_eq(SSL_use_PrivateKey_file(ssl, skey, SSL_FILETYPE_PEM), 1)
668         || !TEST_int_eq(SSL_check_private_key(ssl), 1))
669         goto end;
670     if (!TEST_true(SSL_build_cert_chain(ssl, SSL_BUILD_CHAIN_FLAG_NO_ROOT | SSL_BUILD_CHAIN_FLAG_CHECK)))
671         goto end;
672     ret = 1;
673 end:
674     SSL_free(ssl);
675     SSL_CTX_free(ssl_ctx);
676     OPENSSL_free(leaf_chain);
677     OPENSSL_free(skey);
678     return ret;
679 }
680 
681 static int get_password_cb(char *buf, int size, int rw_flag, void *userdata)
682 {
683     static const char pass[] = "testpass";
684 
685     if (!TEST_int_eq(size, PEM_BUFSIZE))
686         return -1;
687 
688     memcpy(buf, pass, sizeof(pass) - 1);
689     return sizeof(pass) - 1;
690 }
691 
692 static int test_ssl_ctx_build_cert_chain(void)
693 {
694     int ret = 0;
695     SSL_CTX *ctx = NULL;
696     char *skey = test_mk_file_path(certsdir, "leaf-encrypted.key");
697     char *leaf_chain = test_mk_file_path(certsdir, "leaf-chain.pem");
698 
699     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method())))
700         goto end;
701     SSL_CTX_set_default_passwd_cb(ctx, get_password_cb);
702     /* leaf_chain contains leaf + subinterCA + interCA + rootCA */
703     if (!TEST_int_eq(SSL_CTX_use_certificate_chain_file(ctx, leaf_chain), 1)
704         || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(ctx, skey,
705                             SSL_FILETYPE_PEM),
706             1)
707         || !TEST_int_eq(SSL_CTX_check_private_key(ctx), 1))
708         goto end;
709     if (!TEST_true(SSL_CTX_build_cert_chain(ctx, SSL_BUILD_CHAIN_FLAG_NO_ROOT | SSL_BUILD_CHAIN_FLAG_CHECK)))
710         goto end;
711     ret = 1;
712 end:
713     SSL_CTX_free(ctx);
714     OPENSSL_free(leaf_chain);
715     OPENSSL_free(skey);
716     return ret;
717 }
718 
719 #ifndef OPENSSL_NO_TLS1_2
720 static int full_client_hello_callback(SSL *s, int *al, void *arg)
721 {
722     int *ctr = arg;
723     const unsigned char *p;
724     int *exts;
725 #ifdef OPENSSL_NO_EC
726     const unsigned char expected_ciphers[] = { 0x00, 0x9d };
727 #else
728     const unsigned char expected_ciphers[] = { 0x00, 0x9d, 0xc0,
729         0x2c };
730 #endif
731     const int expected_extensions[] = {
732         65281,
733 #ifndef OPENSSL_NO_EC
734         11, 10,
735 #endif
736         35, 22, 23, 13
737     };
738     size_t len;
739 
740     /* Make sure we can defer processing and get called back. */
741     if ((*ctr)++ == 0)
742         return SSL_CLIENT_HELLO_RETRY;
743 
744     len = SSL_client_hello_get0_ciphers(s, &p);
745     if (!TEST_mem_eq(p, len, expected_ciphers, sizeof(expected_ciphers))
746         || !TEST_size_t_eq(
747             SSL_client_hello_get0_compression_methods(s, &p), 1)
748         || !TEST_int_eq(*p, 0))
749         return SSL_CLIENT_HELLO_ERROR;
750     if (!SSL_client_hello_get1_extensions_present(s, &exts, &len))
751         return SSL_CLIENT_HELLO_ERROR;
752     if (len != OSSL_NELEM(expected_extensions) || memcmp(exts, expected_extensions, len * sizeof(*exts)) != 0) {
753         printf("ClientHello callback expected extensions mismatch\n");
754         OPENSSL_free(exts);
755         return SSL_CLIENT_HELLO_ERROR;
756     }
757     OPENSSL_free(exts);
758     return SSL_CLIENT_HELLO_SUCCESS;
759 }
760 
761 static int test_client_hello_cb(void)
762 {
763     SSL_CTX *cctx = NULL, *sctx = NULL;
764     SSL *clientssl = NULL, *serverssl = NULL;
765     int testctr = 0, testresult = 0;
766 
767     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
768             TLS_client_method(), TLS1_VERSION, 0,
769             &sctx, &cctx, cert, privkey)))
770         goto end;
771     SSL_CTX_set_client_hello_cb(sctx, full_client_hello_callback, &testctr);
772 
773     /* The gimpy cipher list we configure can't do TLS 1.3. */
774     SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
775     /* Avoid problems where the default seclevel has been changed */
776     SSL_CTX_set_security_level(cctx, 2);
777     if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
778             "AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384"))
779         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
780             &clientssl, NULL, NULL))
781         || !TEST_false(create_ssl_connection(serverssl, clientssl,
782             SSL_ERROR_WANT_CLIENT_HELLO_CB))
783         /*
784          * Passing a -1 literal is a hack since
785          * the real value was lost.
786          * */
787         || !TEST_int_eq(SSL_get_error(serverssl, -1),
788             SSL_ERROR_WANT_CLIENT_HELLO_CB)
789         || !TEST_true(create_ssl_connection(serverssl, clientssl,
790             SSL_ERROR_NONE)))
791         goto end;
792 
793     testresult = 1;
794 
795 end:
796     SSL_free(serverssl);
797     SSL_free(clientssl);
798     SSL_CTX_free(sctx);
799     SSL_CTX_free(cctx);
800 
801     return testresult;
802 }
803 
804 static int test_no_ems(void)
805 {
806     SSL_CTX *cctx = NULL, *sctx = NULL;
807     SSL *clientssl = NULL, *serverssl = NULL;
808     int testresult = 0, status;
809 
810     if (!create_ssl_ctx_pair(libctx, TLS_server_method(), TLS_client_method(),
811             TLS1_VERSION, TLS1_2_VERSION,
812             &sctx, &cctx, cert, privkey)) {
813         printf("Unable to create SSL_CTX pair\n");
814         goto end;
815     }
816 
817     SSL_CTX_set_options(sctx, SSL_OP_NO_EXTENDED_MASTER_SECRET);
818 
819     if (!create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL, NULL)) {
820         printf("Unable to create SSL objects\n");
821         goto end;
822     }
823 
824     status = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
825     if (fips_ems_check) {
826         if (status == 1) {
827             printf("When FIPS uses the EMS check a connection that doesn't use EMS should fail\n");
828             goto end;
829         }
830     } else {
831         if (!status) {
832             printf("Creating SSL connection failed\n");
833             goto end;
834         }
835         if (SSL_get_extms_support(serverssl)) {
836             printf("Server reports Extended Master Secret support\n");
837             goto end;
838         }
839         if (SSL_get_extms_support(clientssl)) {
840             printf("Client reports Extended Master Secret support\n");
841             goto end;
842         }
843     }
844     testresult = 1;
845 
846 end:
847     SSL_free(serverssl);
848     SSL_free(clientssl);
849     SSL_CTX_free(sctx);
850     SSL_CTX_free(cctx);
851 
852     return testresult;
853 }
854 
855 /*
856  * Very focused test to exercise a single case in the server-side state
857  * machine, when the ChangeCipherState message needs to actually change
858  * from one cipher to a different cipher (i.e., not changing from null
859  * encryption to real encryption).
860  */
861 static int test_ccs_change_cipher(void)
862 {
863     SSL_CTX *cctx = NULL, *sctx = NULL;
864     SSL *clientssl = NULL, *serverssl = NULL;
865     SSL_SESSION *sess = NULL, *sesspre, *sesspost;
866     int testresult = 0;
867     int i;
868     unsigned char buf;
869     size_t readbytes;
870 
871     /*
872      * Create a connection so we can resume and potentially (but not) use
873      * a different cipher in the second connection.
874      */
875     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
876             TLS_client_method(),
877             TLS1_VERSION, TLS1_2_VERSION,
878             &sctx, &cctx, cert, privkey))
879         || !TEST_true(SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET))
880         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
881             NULL, NULL))
882         || !TEST_true(SSL_set_cipher_list(clientssl, "AES128-GCM-SHA256"))
883         || !TEST_true(create_ssl_connection(serverssl, clientssl,
884             SSL_ERROR_NONE))
885         || !TEST_ptr(sesspre = SSL_get0_session(serverssl))
886         || !TEST_ptr(sess = SSL_get1_session(clientssl)))
887         goto end;
888 
889     shutdown_ssl_connection(serverssl, clientssl);
890     serverssl = clientssl = NULL;
891 
892     /* Resume, preferring a different cipher. Our server will force the
893      * same cipher to be used as the initial handshake. */
894     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
895             NULL, NULL))
896         || !TEST_true(SSL_set_session(clientssl, sess))
897         || !TEST_true(SSL_set_cipher_list(clientssl, "AES256-GCM-SHA384:AES128-GCM-SHA256"))
898         || !TEST_true(create_ssl_connection(serverssl, clientssl,
899             SSL_ERROR_NONE))
900         || !TEST_true(SSL_session_reused(clientssl))
901         || !TEST_true(SSL_session_reused(serverssl))
902         || !TEST_ptr(sesspost = SSL_get0_session(serverssl))
903         || !TEST_ptr_eq(sesspre, sesspost)
904         || !TEST_int_eq(TLS1_CK_RSA_WITH_AES_128_GCM_SHA256,
905             SSL_CIPHER_get_id(SSL_get_current_cipher(clientssl))))
906         goto end;
907     shutdown_ssl_connection(serverssl, clientssl);
908     serverssl = clientssl = NULL;
909 
910     /*
911      * Now create a fresh connection and try to renegotiate a different
912      * cipher on it.
913      */
914     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
915             NULL, NULL))
916         || !TEST_true(SSL_set_cipher_list(clientssl, "AES128-GCM-SHA256"))
917         || !TEST_true(create_ssl_connection(serverssl, clientssl,
918             SSL_ERROR_NONE))
919         || !TEST_ptr(sesspre = SSL_get0_session(serverssl))
920         || !TEST_true(SSL_set_cipher_list(clientssl, "AES256-GCM-SHA384"))
921         || !TEST_true(SSL_renegotiate(clientssl))
922         || !TEST_true(SSL_renegotiate_pending(clientssl)))
923         goto end;
924     /* Actually drive the renegotiation. */
925     for (i = 0; i < 3; i++) {
926         if (SSL_read_ex(clientssl, &buf, sizeof(buf), &readbytes) > 0) {
927             if (!TEST_ulong_eq(readbytes, 0))
928                 goto end;
929         } else if (!TEST_int_eq(SSL_get_error(clientssl, 0),
930                        SSL_ERROR_WANT_READ)) {
931             goto end;
932         }
933         if (SSL_read_ex(serverssl, &buf, sizeof(buf), &readbytes) > 0) {
934             if (!TEST_ulong_eq(readbytes, 0))
935                 goto end;
936         } else if (!TEST_int_eq(SSL_get_error(serverssl, 0),
937                        SSL_ERROR_WANT_READ)) {
938             goto end;
939         }
940     }
941     /* sesspre and sesspost should be different since the cipher changed. */
942     if (!TEST_false(SSL_renegotiate_pending(clientssl))
943         || !TEST_false(SSL_session_reused(clientssl))
944         || !TEST_false(SSL_session_reused(serverssl))
945         || !TEST_ptr(sesspost = SSL_get0_session(serverssl))
946         || !TEST_ptr_ne(sesspre, sesspost)
947         || !TEST_int_eq(TLS1_CK_RSA_WITH_AES_256_GCM_SHA384,
948             SSL_CIPHER_get_id(SSL_get_current_cipher(clientssl))))
949         goto end;
950 
951     shutdown_ssl_connection(serverssl, clientssl);
952     serverssl = clientssl = NULL;
953 
954     testresult = 1;
955 
956 end:
957     SSL_free(serverssl);
958     SSL_free(clientssl);
959     SSL_CTX_free(sctx);
960     SSL_CTX_free(cctx);
961     SSL_SESSION_free(sess);
962 
963     return testresult;
964 }
965 #endif
966 
967 static int execute_test_large_message(const SSL_METHOD *smeth,
968     const SSL_METHOD *cmeth,
969     int min_version, int max_version,
970     int read_ahead)
971 {
972     SSL_CTX *cctx = NULL, *sctx = NULL;
973     SSL *clientssl = NULL, *serverssl = NULL;
974     int testresult = 0;
975 
976     if (!TEST_true(create_ssl_ctx_pair(libctx, smeth, cmeth, min_version,
977             max_version, &sctx, &cctx, cert,
978             privkey)))
979         goto end;
980 
981 #ifdef OPENSSL_NO_DTLS1_2
982     if (smeth == DTLS_server_method()) {
983         /*
984          * Default sigalgs are SHA1 based in <DTLS1.2 which is in security
985          * level 0
986          */
987         if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
988             || !TEST_true(SSL_CTX_set_cipher_list(cctx,
989                 "DEFAULT:@SECLEVEL=0")))
990             goto end;
991     }
992 #endif
993 
994     if (read_ahead) {
995         /*
996          * Test that read_ahead works correctly when dealing with large
997          * records
998          */
999         SSL_CTX_set_read_ahead(cctx, 1);
1000     }
1001 
1002     if (!ssl_ctx_add_large_cert_chain(libctx, sctx, cert))
1003         goto end;
1004 
1005     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
1006             NULL, NULL))
1007         || !TEST_true(create_ssl_connection(serverssl, clientssl,
1008             SSL_ERROR_NONE)))
1009         goto end;
1010 
1011     /*
1012      * Calling SSL_clear() first is not required but this tests that SSL_clear()
1013      * doesn't leak.
1014      */
1015     if (!TEST_true(SSL_clear(serverssl)))
1016         goto end;
1017 
1018     testresult = 1;
1019 end:
1020     SSL_free(serverssl);
1021     SSL_free(clientssl);
1022     SSL_CTX_free(sctx);
1023     SSL_CTX_free(cctx);
1024 
1025     return testresult;
1026 }
1027 
1028 #if !defined(OPENSSL_NO_SOCK) && !defined(OPENSSL_NO_KTLS) && !(defined(OSSL_NO_USABLE_TLS1_3) && defined(OPENSSL_NO_TLS1_2))
1029 /* sock must be connected */
1030 static int ktls_chk_platform(int sock)
1031 {
1032     if (!ktls_enable(sock))
1033         return 0;
1034     return 1;
1035 }
1036 
1037 static int ping_pong_query(SSL *clientssl, SSL *serverssl)
1038 {
1039     static char count = 1;
1040     unsigned char cbuf[16000] = { 0 };
1041     unsigned char sbuf[16000];
1042     size_t err = 0;
1043     char crec_wseq_before[SEQ_NUM_SIZE];
1044     char crec_wseq_after[SEQ_NUM_SIZE];
1045     char crec_rseq_before[SEQ_NUM_SIZE];
1046     char crec_rseq_after[SEQ_NUM_SIZE];
1047     char srec_wseq_before[SEQ_NUM_SIZE];
1048     char srec_wseq_after[SEQ_NUM_SIZE];
1049     char srec_rseq_before[SEQ_NUM_SIZE];
1050     char srec_rseq_after[SEQ_NUM_SIZE];
1051     SSL_CONNECTION *clientsc, *serversc;
1052 
1053     if (!TEST_ptr(clientsc = SSL_CONNECTION_FROM_SSL_ONLY(clientssl))
1054         || !TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1055         goto end;
1056 
1057     cbuf[0] = count++;
1058     memcpy(crec_wseq_before, &clientsc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1059     memcpy(srec_wseq_before, &serversc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1060     memcpy(crec_rseq_before, &clientsc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1061     memcpy(srec_rseq_before, &serversc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1062 
1063     if (!TEST_true(SSL_write(clientssl, cbuf, sizeof(cbuf)) == sizeof(cbuf)))
1064         goto end;
1065 
1066     while ((err = SSL_read(serverssl, &sbuf, sizeof(sbuf))) != sizeof(sbuf)) {
1067         if (SSL_get_error(serverssl, err) != SSL_ERROR_WANT_READ) {
1068             goto end;
1069         }
1070     }
1071 
1072     if (!TEST_true(SSL_write(serverssl, sbuf, sizeof(sbuf)) == sizeof(sbuf)))
1073         goto end;
1074 
1075     while ((err = SSL_read(clientssl, &cbuf, sizeof(cbuf))) != sizeof(cbuf)) {
1076         if (SSL_get_error(clientssl, err) != SSL_ERROR_WANT_READ) {
1077             goto end;
1078         }
1079     }
1080 
1081     memcpy(crec_wseq_after, &clientsc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1082     memcpy(srec_wseq_after, &serversc->rlayer.wrl->sequence, SEQ_NUM_SIZE);
1083     memcpy(crec_rseq_after, &clientsc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1084     memcpy(srec_rseq_after, &serversc->rlayer.rrl->sequence, SEQ_NUM_SIZE);
1085 
1086     /* verify the payload */
1087     if (!TEST_mem_eq(cbuf, sizeof(cbuf), sbuf, sizeof(sbuf)))
1088         goto end;
1089 
1090     /*
1091      * If ktls is used then kernel sequences are used instead of
1092      * OpenSSL sequences
1093      */
1094     if (!BIO_get_ktls_send(clientsc->wbio)) {
1095         if (!TEST_mem_ne(crec_wseq_before, SEQ_NUM_SIZE,
1096                 crec_wseq_after, SEQ_NUM_SIZE))
1097             goto end;
1098     } else {
1099         if (!TEST_mem_eq(crec_wseq_before, SEQ_NUM_SIZE,
1100                 crec_wseq_after, SEQ_NUM_SIZE))
1101             goto end;
1102     }
1103 
1104     if (!BIO_get_ktls_send(serversc->wbio)) {
1105         if (!TEST_mem_ne(srec_wseq_before, SEQ_NUM_SIZE,
1106                 srec_wseq_after, SEQ_NUM_SIZE))
1107             goto end;
1108     } else {
1109         if (!TEST_mem_eq(srec_wseq_before, SEQ_NUM_SIZE,
1110                 srec_wseq_after, SEQ_NUM_SIZE))
1111             goto end;
1112     }
1113 
1114     if (!BIO_get_ktls_recv(clientsc->wbio)) {
1115         if (!TEST_mem_ne(crec_rseq_before, SEQ_NUM_SIZE,
1116                 crec_rseq_after, SEQ_NUM_SIZE))
1117             goto end;
1118     } else {
1119         if (!TEST_mem_eq(crec_rseq_before, SEQ_NUM_SIZE,
1120                 crec_rseq_after, SEQ_NUM_SIZE))
1121             goto end;
1122     }
1123 
1124     if (!BIO_get_ktls_recv(serversc->wbio)) {
1125         if (!TEST_mem_ne(srec_rseq_before, SEQ_NUM_SIZE,
1126                 srec_rseq_after, SEQ_NUM_SIZE))
1127             goto end;
1128     } else {
1129         if (!TEST_mem_eq(srec_rseq_before, SEQ_NUM_SIZE,
1130                 srec_rseq_after, SEQ_NUM_SIZE))
1131             goto end;
1132     }
1133 
1134     return 1;
1135 end:
1136     return 0;
1137 }
1138 
1139 static int execute_test_ktls(int cis_ktls, int sis_ktls,
1140     int tls_version, const char *cipher)
1141 {
1142     SSL_CTX *cctx = NULL, *sctx = NULL;
1143     SSL *clientssl = NULL, *serverssl = NULL;
1144     int ktls_used = 0, testresult = 0;
1145     int cfd = -1, sfd = -1;
1146     int rx_supported;
1147     SSL_CONNECTION *clientsc, *serversc;
1148     unsigned char *buf = NULL;
1149     const size_t bufsz = SSL3_RT_MAX_PLAIN_LENGTH + 16;
1150     int ret;
1151     size_t offset = 0, i;
1152 
1153     if (!TEST_true(create_test_sockets(&cfd, &sfd, SOCK_STREAM, NULL)))
1154         goto end;
1155 
1156     /* Skip this test if the platform does not support ktls */
1157     if (!ktls_chk_platform(cfd)) {
1158         testresult = TEST_skip("Kernel does not support KTLS");
1159         goto end;
1160     }
1161 
1162     if (is_fips && strstr(cipher, "CHACHA") != NULL) {
1163         testresult = TEST_skip("CHACHA is not supported in FIPS");
1164         goto end;
1165     }
1166 
1167     /* Create a session based on SHA-256 */
1168     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
1169             TLS_client_method(),
1170             tls_version, tls_version,
1171             &sctx, &cctx, cert, privkey)))
1172         goto end;
1173 
1174     if (tls_version == TLS1_3_VERSION) {
1175         if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, cipher))
1176             || !TEST_true(SSL_CTX_set_ciphersuites(sctx, cipher)))
1177             goto end;
1178     } else {
1179         if (!TEST_true(SSL_CTX_set_cipher_list(cctx, cipher))
1180             || !TEST_true(SSL_CTX_set_cipher_list(sctx, cipher)))
1181             goto end;
1182     }
1183 
1184     if (!TEST_true(create_ssl_objects2(sctx, cctx, &serverssl,
1185             &clientssl, sfd, cfd)))
1186         goto end;
1187 
1188     if (!TEST_ptr(clientsc = SSL_CONNECTION_FROM_SSL_ONLY(clientssl))
1189         || !TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1190         goto end;
1191 
1192     if (cis_ktls) {
1193         if (!TEST_true(SSL_set_options(clientssl, SSL_OP_ENABLE_KTLS)))
1194             goto end;
1195     }
1196 
1197     if (sis_ktls) {
1198         if (!TEST_true(SSL_set_options(serverssl, SSL_OP_ENABLE_KTLS)))
1199             goto end;
1200     }
1201 
1202     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
1203         goto end;
1204 
1205     /*
1206      * The running kernel may not support a given cipher suite
1207      * or direction, so just check that KTLS isn't used when it
1208      * isn't enabled.
1209      */
1210     if (!cis_ktls) {
1211         if (!TEST_false(BIO_get_ktls_send(clientsc->wbio)))
1212             goto end;
1213     } else {
1214         if (BIO_get_ktls_send(clientsc->wbio))
1215             ktls_used = 1;
1216     }
1217 
1218     if (!sis_ktls) {
1219         if (!TEST_false(BIO_get_ktls_send(serversc->wbio)))
1220             goto end;
1221     } else {
1222         if (BIO_get_ktls_send(serversc->wbio))
1223             ktls_used = 1;
1224     }
1225 
1226 #if defined(OPENSSL_NO_KTLS_RX)
1227     rx_supported = 0;
1228 #else
1229     rx_supported = 1;
1230 #endif
1231     if (!cis_ktls || !rx_supported) {
1232         if (!TEST_false(BIO_get_ktls_recv(clientsc->rbio)))
1233             goto end;
1234     } else {
1235         if (BIO_get_ktls_send(clientsc->rbio))
1236             ktls_used = 1;
1237     }
1238 
1239     if (!sis_ktls || !rx_supported) {
1240         if (!TEST_false(BIO_get_ktls_recv(serversc->rbio)))
1241             goto end;
1242     } else {
1243         if (BIO_get_ktls_send(serversc->rbio))
1244             ktls_used = 1;
1245     }
1246 
1247     if ((cis_ktls || sis_ktls) && !ktls_used) {
1248         testresult = TEST_skip("KTLS not supported for %s cipher %s",
1249             tls_version == TLS1_3_VERSION ? "TLS 1.3" : "TLS 1.2", cipher);
1250         goto end;
1251     }
1252 
1253     if (!TEST_true(ping_pong_query(clientssl, serverssl)))
1254         goto end;
1255 
1256     buf = OPENSSL_zalloc(bufsz);
1257     if (!TEST_ptr(buf))
1258         goto end;
1259 
1260     /*
1261      * Write some data that exceeds the maximum record length. KTLS may choose
1262      * to coalesce this data into a single buffer when we read it again.
1263      */
1264     while ((ret = SSL_write(clientssl, buf, bufsz)) != (int)bufsz) {
1265         if (!TEST_true(SSL_get_error(clientssl, ret) == SSL_ERROR_WANT_WRITE))
1266             goto end;
1267     }
1268 
1269     /* Now check that we can read all the data we wrote */
1270     do {
1271         ret = SSL_read(serverssl, buf + offset, bufsz - offset);
1272         if (ret <= 0) {
1273             if (!TEST_true(SSL_get_error(serverssl, ret) == SSL_ERROR_WANT_READ))
1274                 goto end;
1275         } else {
1276             offset += ret;
1277         }
1278     } while (offset < bufsz);
1279 
1280     if (!TEST_true(offset == bufsz))
1281         goto end;
1282     for (i = 0; i < bufsz; i++)
1283         if (!TEST_true(buf[i] == 0))
1284             goto end;
1285 
1286     testresult = 1;
1287 end:
1288     OPENSSL_free(buf);
1289     if (clientssl) {
1290         SSL_shutdown(clientssl);
1291         SSL_free(clientssl);
1292     }
1293     if (serverssl) {
1294         SSL_shutdown(serverssl);
1295         SSL_free(serverssl);
1296     }
1297     SSL_CTX_free(sctx);
1298     SSL_CTX_free(cctx);
1299     serverssl = clientssl = NULL;
1300     if (cfd != -1)
1301         close(cfd);
1302     if (sfd != -1)
1303         close(sfd);
1304     return testresult;
1305 }
1306 
1307 #define SENDFILE_SZ (16 * 4096)
1308 #define SENDFILE_CHUNK (4 * 4096)
1309 #define min(a, b) ((a) > (b) ? (b) : (a))
1310 
1311 static int execute_test_ktls_sendfile(int tls_version, const char *cipher,
1312     int zerocopy)
1313 {
1314     SSL_CTX *cctx = NULL, *sctx = NULL;
1315     SSL *clientssl = NULL, *serverssl = NULL;
1316     unsigned char *buf, *buf_dst;
1317     BIO *out = NULL, *in = NULL;
1318     int cfd = -1, sfd = -1, ffd, err;
1319     ssize_t chunk_size = 0;
1320     off_t chunk_off = 0;
1321     int testresult = 0;
1322     FILE *ffdp;
1323     SSL_CONNECTION *serversc;
1324 
1325     buf = OPENSSL_zalloc(SENDFILE_SZ);
1326     buf_dst = OPENSSL_zalloc(SENDFILE_SZ);
1327     if (!TEST_ptr(buf) || !TEST_ptr(buf_dst)
1328         || !TEST_true(create_test_sockets(&cfd, &sfd, SOCK_STREAM, NULL)))
1329         goto end;
1330 
1331     /* Skip this test if the platform does not support ktls */
1332     if (!ktls_chk_platform(sfd)) {
1333         testresult = TEST_skip("Kernel does not support KTLS");
1334         goto end;
1335     }
1336 
1337     if (is_fips && strstr(cipher, "CHACHA") != NULL) {
1338         testresult = TEST_skip("CHACHA is not supported in FIPS");
1339         goto end;
1340     }
1341 
1342     /* Create a session based on SHA-256 */
1343     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
1344             TLS_client_method(),
1345             tls_version, tls_version,
1346             &sctx, &cctx, cert, privkey)))
1347         goto end;
1348 
1349     if (tls_version == TLS1_3_VERSION) {
1350         if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, cipher))
1351             || !TEST_true(SSL_CTX_set_ciphersuites(sctx, cipher)))
1352             goto end;
1353     } else {
1354         if (!TEST_true(SSL_CTX_set_cipher_list(cctx, cipher))
1355             || !TEST_true(SSL_CTX_set_cipher_list(sctx, cipher)))
1356             goto end;
1357     }
1358 
1359     if (!TEST_true(create_ssl_objects2(sctx, cctx, &serverssl,
1360             &clientssl, sfd, cfd)))
1361         goto end;
1362 
1363     if (!TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1364         goto end;
1365 
1366     if (!TEST_true(SSL_set_options(serverssl, SSL_OP_ENABLE_KTLS)))
1367         goto end;
1368 
1369     if (zerocopy) {
1370         if (!TEST_true(SSL_set_options(serverssl,
1371                 SSL_OP_ENABLE_KTLS_TX_ZEROCOPY_SENDFILE)))
1372             goto end;
1373     }
1374 
1375     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1376             SSL_ERROR_NONE)))
1377         goto end;
1378 
1379     if (!BIO_get_ktls_send(serversc->wbio)) {
1380         testresult = TEST_skip("Failed to enable KTLS for %s cipher %s",
1381             tls_version == TLS1_3_VERSION ? "TLS 1.3" : "TLS 1.2", cipher);
1382         goto end;
1383     }
1384 
1385     if (!TEST_int_gt(RAND_bytes_ex(libctx, buf, SENDFILE_SZ, 0), 0))
1386         goto end;
1387 
1388     out = BIO_new_file(tmpfilename, "wb");
1389     if (!TEST_ptr(out))
1390         goto end;
1391 
1392     if (BIO_write(out, buf, SENDFILE_SZ) != SENDFILE_SZ)
1393         goto end;
1394 
1395     BIO_free(out);
1396     out = NULL;
1397     in = BIO_new_file(tmpfilename, "rb");
1398     BIO_get_fp(in, &ffdp);
1399     ffd = fileno(ffdp);
1400 
1401     while (chunk_off < SENDFILE_SZ) {
1402         chunk_size = min(SENDFILE_CHUNK, SENDFILE_SZ - chunk_off);
1403         while ((err = SSL_sendfile(serverssl,
1404                     ffd,
1405                     chunk_off,
1406                     chunk_size,
1407                     0))
1408             != chunk_size) {
1409             if (SSL_get_error(serverssl, err) != SSL_ERROR_WANT_WRITE)
1410                 goto end;
1411         }
1412         while ((err = SSL_read(clientssl,
1413                     buf_dst + chunk_off,
1414                     chunk_size))
1415             != chunk_size) {
1416             if (SSL_get_error(clientssl, err) != SSL_ERROR_WANT_READ)
1417                 goto end;
1418         }
1419 
1420         /* verify the payload */
1421         if (!TEST_mem_eq(buf_dst + chunk_off,
1422                 chunk_size,
1423                 buf + chunk_off,
1424                 chunk_size))
1425             goto end;
1426 
1427         chunk_off += chunk_size;
1428     }
1429 
1430     testresult = 1;
1431 end:
1432     if (clientssl) {
1433         SSL_shutdown(clientssl);
1434         SSL_free(clientssl);
1435     }
1436     if (serverssl) {
1437         SSL_shutdown(serverssl);
1438         SSL_free(serverssl);
1439     }
1440     SSL_CTX_free(sctx);
1441     SSL_CTX_free(cctx);
1442     serverssl = clientssl = NULL;
1443     BIO_free(out);
1444     BIO_free(in);
1445     if (cfd != -1)
1446         close(cfd);
1447     if (sfd != -1)
1448         close(sfd);
1449     OPENSSL_free(buf);
1450     OPENSSL_free(buf_dst);
1451     return testresult;
1452 }
1453 
1454 #ifndef OSSL_NO_USABLE_TLS1_3
1455 /*
1456  * Test kTLS with SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER: retry SSL_write() after
1457  * SSL_ERROR_WANT_WRITE using a different buffer pointer (same content) and
1458  * verify that the data arrives intact.
1459  */
1460 static int test_ktls_moving_write_buffer(void)
1461 {
1462     SSL_CTX *cctx = NULL, *sctx = NULL;
1463     SSL *clientssl = NULL, *serverssl = NULL;
1464     BIO *bio_retry = NULL, *bio_orig = NULL;
1465     int testresult = 0, cfd = -1, sfd = -1;
1466     unsigned char *buf_orig = NULL, *buf_retry = NULL;
1467     unsigned char outbuf[1024];
1468     const size_t bufsz = sizeof(outbuf);
1469     size_t written, readbytes, totread = 0, i;
1470 
1471     /* kTLS requires real sockets */
1472     if (!TEST_true(create_test_sockets(&cfd, &sfd, SOCK_STREAM, NULL)))
1473         goto end;
1474 
1475     /* Skip if the kernel does not support kTLS */
1476     if (!ktls_chk_platform(cfd)) {
1477         testresult = TEST_skip("Kernel does not support KTLS");
1478         goto end;
1479     }
1480 
1481     if (!TEST_true(create_ssl_ctx_pair(libctx,
1482             TLS_server_method(), TLS_client_method(),
1483             TLS1_3_VERSION, TLS1_3_VERSION,
1484             &sctx, &cctx, cert, privkey)))
1485         goto end;
1486 
1487     if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, "TLS_AES_128_GCM_SHA256"))
1488         || !TEST_true(SSL_CTX_set_ciphersuites(sctx, "TLS_AES_128_GCM_SHA256")))
1489         goto end;
1490 
1491     if (!TEST_true(create_ssl_objects2(sctx, cctx, &serverssl,
1492             &clientssl, sfd, cfd)))
1493         goto end;
1494 
1495     /* Enable kTLS on the writing side (client) */
1496     if (!TEST_true(SSL_set_options(clientssl, SSL_OP_ENABLE_KTLS)))
1497         goto end;
1498 
1499     SSL_set_mode(clientssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
1500     SSL_set_mode(clientssl, SSL_MODE_ENABLE_PARTIAL_WRITE);
1501 
1502     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
1503         goto end;
1504 
1505     /* Get a reference to the original BIO to replace it later. */
1506     bio_orig = SSL_get_wbio(clientssl);
1507     if (!TEST_ptr(bio_orig) || !TEST_true(BIO_up_ref(bio_orig))) {
1508         bio_orig = NULL;
1509         goto end;
1510     }
1511 
1512     /* Skip if kTLS TX was not activated for this cipher */
1513     if (!BIO_get_ktls_send(bio_orig)) {
1514         testresult = TEST_skip("kTLS send not supported");
1515         goto end;
1516     }
1517 
1518     /* Swap write BIO to force WANT_WRITE */
1519     bio_retry = BIO_new(bio_s_always_retry());
1520     if (!TEST_ptr(bio_retry))
1521         goto end;
1522 
1523     SSL_set0_wbio(clientssl, bio_retry);
1524     bio_retry = NULL; /* ownership transferred to clientssl */
1525 
1526     /* Allocate two buffers with identical content but different addresses */
1527     buf_orig = OPENSSL_malloc(bufsz);
1528     buf_retry = OPENSSL_malloc(bufsz);
1529     if (!TEST_ptr(buf_orig) || !TEST_ptr(buf_retry))
1530         goto end;
1531 
1532     for (i = 0; i < bufsz; i++)
1533         buf_orig[i] = buf_retry[i] = (unsigned char)(i & 0xff);
1534 
1535     /* First write attempt - will fail with WANT_WRITE */
1536     if (!TEST_false(SSL_write_ex(clientssl, buf_orig, bufsz, &written))
1537         || !TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_WRITE))
1538         goto end;
1539 
1540     /* Restore the real socket BIO so the retry can actually send data */
1541     SSL_set0_wbio(clientssl, bio_orig);
1542     bio_orig = NULL;
1543 
1544     /* Poison and free the original buffer */
1545     memset(buf_orig, 0xDE, bufsz);
1546     OPENSSL_free(buf_orig);
1547     buf_orig = NULL;
1548 
1549     /* Retry with a different buffer pointer */
1550     if (!TEST_true(SSL_write_ex(clientssl, buf_retry, bufsz, &written)))
1551         goto end;
1552 
1553     /* Read the data on the server side */
1554     totread = 0;
1555     while (totread < bufsz) {
1556         if (!SSL_read_ex(serverssl, outbuf + totread, bufsz - totread,
1557                 &readbytes)) {
1558             if (!TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_WANT_READ))
1559                 goto end;
1560         } else {
1561             totread += readbytes;
1562         }
1563     }
1564 
1565     /* Verify data integrity */
1566     if (!TEST_mem_eq(buf_retry, bufsz, outbuf, totread))
1567         goto end;
1568 
1569     testresult = 1;
1570 end:
1571     OPENSSL_free(buf_orig);
1572     OPENSSL_free(buf_retry);
1573     if (clientssl != NULL) {
1574         SSL_shutdown(clientssl);
1575         SSL_free(clientssl);
1576     }
1577     if (serverssl != NULL) {
1578         SSL_shutdown(serverssl);
1579         SSL_free(serverssl);
1580     }
1581     SSL_CTX_free(sctx);
1582     SSL_CTX_free(cctx);
1583     BIO_free_all(bio_orig);
1584     if (cfd != -1)
1585         close(cfd);
1586     if (sfd != -1)
1587         close(sfd);
1588     return testresult;
1589 }
1590 #endif /* !defined(OSSL_NO_USABLE_TLS1_3) */
1591 
1592 static struct ktls_test_cipher {
1593     int tls_version;
1594     const char *cipher;
1595 } ktls_test_ciphers[] = {
1596 #if !defined(OPENSSL_NO_TLS1_2)
1597 #ifdef OPENSSL_KTLS_AES_GCM_128
1598     { TLS1_2_VERSION, "AES128-GCM-SHA256" },
1599 #endif
1600 #ifdef OPENSSL_KTLS_AES_CCM_128
1601     { TLS1_2_VERSION, "AES128-CCM" },
1602 #endif
1603 #ifdef OPENSSL_KTLS_AES_GCM_256
1604     { TLS1_2_VERSION, "AES256-GCM-SHA384" },
1605 #endif
1606 #ifdef OPENSSL_KTLS_CHACHA20_POLY1305
1607 #ifndef OPENSSL_NO_EC
1608     { TLS1_2_VERSION, "ECDHE-RSA-CHACHA20-POLY1305" },
1609 #endif
1610 #endif
1611 #endif
1612 #if !defined(OSSL_NO_USABLE_TLS1_3)
1613 #ifdef OPENSSL_KTLS_AES_GCM_128
1614     { TLS1_3_VERSION, "TLS_AES_128_GCM_SHA256" },
1615 #endif
1616 #ifdef OPENSSL_KTLS_AES_CCM_128
1617     { TLS1_3_VERSION, "TLS_AES_128_CCM_SHA256" },
1618 #endif
1619 #ifdef OPENSSL_KTLS_AES_GCM_256
1620     { TLS1_3_VERSION, "TLS_AES_256_GCM_SHA384" },
1621 #endif
1622 #ifdef OPENSSL_KTLS_CHACHA20_POLY1305
1623     { TLS1_3_VERSION, "TLS_CHACHA20_POLY1305_SHA256" },
1624 #endif
1625 #endif
1626 };
1627 
1628 #define NUM_KTLS_TEST_CIPHERS OSSL_NELEM(ktls_test_ciphers)
1629 
1630 static int test_ktls(int test)
1631 {
1632     struct ktls_test_cipher *cipher;
1633     int cis_ktls, sis_ktls;
1634 
1635     OPENSSL_assert(test / 4 < (int)NUM_KTLS_TEST_CIPHERS);
1636     cipher = &ktls_test_ciphers[test / 4];
1637 
1638     cis_ktls = (test & 1) != 0;
1639     sis_ktls = (test & 2) != 0;
1640 
1641     return execute_test_ktls(cis_ktls, sis_ktls, cipher->tls_version,
1642         cipher->cipher);
1643 }
1644 
1645 static int test_ktls_sendfile(int test)
1646 {
1647     struct ktls_test_cipher *cipher;
1648     int tst = test >> 1;
1649 
1650     OPENSSL_assert(tst < (int)NUM_KTLS_TEST_CIPHERS);
1651     cipher = &ktls_test_ciphers[tst];
1652 
1653     return execute_test_ktls_sendfile(cipher->tls_version, cipher->cipher,
1654         test & 1);
1655 }
1656 #endif
1657 
1658 static int test_large_message_tls(void)
1659 {
1660     return execute_test_large_message(TLS_server_method(), TLS_client_method(),
1661         TLS1_VERSION, 0, 0);
1662 }
1663 
1664 static int test_large_message_tls_read_ahead(void)
1665 {
1666     return execute_test_large_message(TLS_server_method(), TLS_client_method(),
1667         TLS1_VERSION, 0, 1);
1668 }
1669 
1670 #ifndef OPENSSL_NO_DTLS
1671 static int test_large_message_dtls(void)
1672 {
1673 #ifdef OPENSSL_NO_DTLS1_2
1674     /* Not supported in the FIPS provider */
1675     if (is_fips)
1676         return 1;
1677 #endif
1678     /*
1679      * read_ahead is not relevant to DTLS because DTLS always acts as if
1680      * read_ahead is set.
1681      */
1682     return execute_test_large_message(DTLS_server_method(),
1683         DTLS_client_method(),
1684         DTLS1_VERSION, 0, 0);
1685 }
1686 #endif
1687 
1688 /*
1689  * Test we can successfully send the maximum amount of application data. We
1690  * test each protocol version individually, each with and without EtM enabled.
1691  * TLSv1.3 doesn't use EtM so technically it is redundant to test both but it is
1692  * simpler this way. We also test all combinations with and without the
1693  * SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS option which affects the size of the
1694  * underlying buffer.
1695  */
1696 static int test_large_app_data(int tst)
1697 {
1698     SSL_CTX *cctx = NULL, *sctx = NULL;
1699     SSL *clientssl = NULL, *serverssl = NULL;
1700     int testresult = 0, prot;
1701     unsigned char *msg, *buf = NULL;
1702     size_t written, readbytes;
1703     const SSL_METHOD *smeth = TLS_server_method();
1704     const SSL_METHOD *cmeth = TLS_client_method();
1705 
1706     switch (tst >> 2) {
1707     case 0:
1708 #ifndef OSSL_NO_USABLE_TLS1_3
1709         prot = TLS1_3_VERSION;
1710         break;
1711 #else
1712         return TEST_skip("TLS 1.3 not supported");
1713 #endif
1714 
1715     case 1:
1716 #ifndef OPENSSL_NO_TLS1_2
1717         prot = TLS1_2_VERSION;
1718         break;
1719 #else
1720         return TEST_skip("TLS 1.2 not supported");
1721 #endif
1722 
1723     case 2:
1724 #ifndef OPENSSL_NO_TLS1_1
1725         prot = TLS1_1_VERSION;
1726         break;
1727 #else
1728         return TEST_skip("TLS 1.1 not supported");
1729 #endif
1730 
1731     case 3:
1732 #ifndef OPENSSL_NO_TLS1
1733         prot = TLS1_VERSION;
1734         break;
1735 #else
1736         return TEST_skip("TLS 1 not supported");
1737 #endif
1738 
1739     case 4:
1740 #ifndef OPENSSL_NO_SSL3
1741         prot = SSL3_VERSION;
1742         break;
1743 #else
1744         return TEST_skip("SSL 3 not supported");
1745 #endif
1746 
1747     case 5:
1748 #ifndef OPENSSL_NO_DTLS1_2
1749         prot = DTLS1_2_VERSION;
1750         smeth = DTLS_server_method();
1751         cmeth = DTLS_client_method();
1752         break;
1753 #else
1754         return TEST_skip("DTLS 1.2 not supported");
1755 #endif
1756 
1757     case 6:
1758 #ifndef OPENSSL_NO_DTLS1
1759         if (is_fips)
1760             return TEST_skip("DTLS 1 not supported by FIPS provider");
1761         prot = DTLS1_VERSION;
1762         smeth = DTLS_server_method();
1763         cmeth = DTLS_client_method();
1764         break;
1765 #else
1766         return TEST_skip("DTLS 1 not supported");
1767 #endif
1768 
1769     default:
1770         /* Shouldn't happen */
1771         return 0;
1772     }
1773 
1774     if (is_fips && prot < TLS1_2_VERSION)
1775         return TEST_skip("TLS versions < 1.2 not supported by FIPS provider");
1776 
1777     /* Maximal sized message of zeros */
1778     msg = OPENSSL_zalloc(SSL3_RT_MAX_PLAIN_LENGTH);
1779     if (!TEST_ptr(msg))
1780         goto end;
1781 
1782     buf = OPENSSL_malloc(SSL3_RT_MAX_PLAIN_LENGTH + 1);
1783     if (!TEST_ptr(buf))
1784         goto end;
1785     /* Set whole buffer to all bits set */
1786     memset(buf, 0xff, SSL3_RT_MAX_PLAIN_LENGTH + 1);
1787 
1788     if (!TEST_true(create_ssl_ctx_pair(libctx, smeth, cmeth, prot, prot,
1789             &sctx, &cctx, cert, privkey)))
1790         goto end;
1791 
1792     if (prot < TLS1_2_VERSION || prot == DTLS1_VERSION) {
1793         /* Older protocol versions need SECLEVEL=0 due to SHA1 usage */
1794         if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "DEFAULT:@SECLEVEL=0"))
1795             || !TEST_true(SSL_CTX_set_cipher_list(sctx,
1796                 "DEFAULT:@SECLEVEL=0")))
1797             goto end;
1798     }
1799 
1800     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1801             &clientssl, NULL, NULL)))
1802         goto end;
1803 
1804     if ((tst & 1) != 0) {
1805         /* Setting this option gives us a minimally sized underlying buffer */
1806         if (!TEST_true(SSL_set_options(serverssl,
1807                 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
1808             || !TEST_true(SSL_set_options(clientssl,
1809                 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)))
1810             goto end;
1811     }
1812 
1813     if ((tst & 2) != 0) {
1814         /*
1815          * Setting this option means the MAC is added before encryption
1816          * giving us a larger record for the encryption process
1817          */
1818         if (!TEST_true(SSL_set_options(serverssl, SSL_OP_NO_ENCRYPT_THEN_MAC))
1819             || !TEST_true(SSL_set_options(clientssl,
1820                 SSL_OP_NO_ENCRYPT_THEN_MAC)))
1821             goto end;
1822     }
1823 
1824     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
1825         goto end;
1826 
1827     if (!TEST_true(SSL_write_ex(clientssl, msg, SSL3_RT_MAX_PLAIN_LENGTH,
1828             &written))
1829         || !TEST_size_t_eq(written, SSL3_RT_MAX_PLAIN_LENGTH))
1830         goto end;
1831 
1832     /* We provide a buffer slightly larger than what we are actually expecting */
1833     if (!TEST_true(SSL_read_ex(serverssl, buf, SSL3_RT_MAX_PLAIN_LENGTH + 1,
1834             &readbytes)))
1835         goto end;
1836 
1837     if (!TEST_mem_eq(msg, written, buf, readbytes))
1838         goto end;
1839 
1840     testresult = 1;
1841 end:
1842     OPENSSL_free(msg);
1843     OPENSSL_free(buf);
1844     SSL_free(serverssl);
1845     SSL_free(clientssl);
1846     SSL_CTX_free(sctx);
1847     SSL_CTX_free(cctx);
1848     return testresult;
1849 }
1850 
1851 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3) \
1852     || !defined(OPENSSL_NO_DTLS)
1853 static int execute_cleanse_plaintext(const SSL_METHOD *smeth,
1854     const SSL_METHOD *cmeth,
1855     int min_version, int max_version)
1856 {
1857     size_t i;
1858     SSL_CTX *cctx = NULL, *sctx = NULL;
1859     SSL *clientssl = NULL, *serverssl = NULL;
1860     int testresult = 0;
1861     const unsigned char *zbuf;
1862     SSL_CONNECTION *serversc;
1863     TLS_RECORD *rr;
1864 
1865     static unsigned char cbuf[16000];
1866     static unsigned char sbuf[16000];
1867 
1868     if (!TEST_true(create_ssl_ctx_pair(libctx,
1869             smeth, cmeth,
1870             min_version, max_version,
1871             &sctx, &cctx, cert,
1872             privkey)))
1873         goto end;
1874 
1875 #ifdef OPENSSL_NO_DTLS1_2
1876     if (smeth == DTLS_server_method()) {
1877         /* Not supported in the FIPS provider */
1878         if (is_fips) {
1879             testresult = 1;
1880             goto end;
1881         };
1882         /*
1883          * Default sigalgs are SHA1 based in <DTLS1.2 which is in security
1884          * level 0
1885          */
1886         if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
1887             || !TEST_true(SSL_CTX_set_cipher_list(cctx,
1888                 "DEFAULT:@SECLEVEL=0")))
1889             goto end;
1890     }
1891 #endif
1892 
1893     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
1894             NULL, NULL)))
1895         goto end;
1896 
1897     if (!TEST_true(SSL_set_options(serverssl, SSL_OP_CLEANSE_PLAINTEXT)))
1898         goto end;
1899 
1900     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1901             SSL_ERROR_NONE)))
1902         goto end;
1903 
1904     for (i = 0; i < sizeof(cbuf); i++) {
1905         cbuf[i] = i & 0xff;
1906     }
1907 
1908     if (!TEST_int_eq(SSL_write(clientssl, cbuf, sizeof(cbuf)), sizeof(cbuf)))
1909         goto end;
1910 
1911     if (!TEST_int_eq(SSL_peek(serverssl, &sbuf, sizeof(sbuf)), sizeof(sbuf)))
1912         goto end;
1913 
1914     if (!TEST_mem_eq(cbuf, sizeof(cbuf), sbuf, sizeof(sbuf)))
1915         goto end;
1916 
1917     /*
1918      * Since we called SSL_peek(), we know the data in the record
1919      * layer is a plaintext record. We can gather the pointer to check
1920      * for zeroization after SSL_read().
1921      */
1922     if (!TEST_ptr(serversc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
1923         goto end;
1924     rr = serversc->rlayer.tlsrecs;
1925 
1926     zbuf = &rr->data[rr->off];
1927     if (!TEST_int_eq(rr->length, sizeof(cbuf)))
1928         goto end;
1929 
1930     /*
1931      * After SSL_peek() the plaintext must still be stored in the
1932      * record.
1933      */
1934     if (!TEST_mem_eq(cbuf, sizeof(cbuf), zbuf, sizeof(cbuf)))
1935         goto end;
1936 
1937     memset(sbuf, 0, sizeof(sbuf));
1938     if (!TEST_int_eq(SSL_read(serverssl, &sbuf, sizeof(sbuf)), sizeof(sbuf)))
1939         goto end;
1940 
1941     if (!TEST_mem_eq(cbuf, sizeof(cbuf), sbuf, sizeof(cbuf)))
1942         goto end;
1943 
1944     /* Check if rbuf is cleansed */
1945     memset(cbuf, 0, sizeof(cbuf));
1946     if (!TEST_mem_eq(cbuf, sizeof(cbuf), zbuf, sizeof(cbuf)))
1947         goto end;
1948 
1949     testresult = 1;
1950 end:
1951     SSL_free(serverssl);
1952     SSL_free(clientssl);
1953     SSL_CTX_free(sctx);
1954     SSL_CTX_free(cctx);
1955 
1956     return testresult;
1957 }
1958 #endif /*                                                                \
1959         * !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3) \
1960         * || !defined(OPENSSL_NO_DTLS)                                   \
1961         */
1962 
1963 static int test_cleanse_plaintext(void)
1964 {
1965 #if !defined(OPENSSL_NO_TLS1_2)
1966     if (!TEST_true(execute_cleanse_plaintext(TLS_server_method(),
1967             TLS_client_method(),
1968             TLS1_2_VERSION,
1969             TLS1_2_VERSION)))
1970         return 0;
1971 
1972 #endif
1973 
1974 #if !defined(OSSL_NO_USABLE_TLS1_3)
1975     if (!TEST_true(execute_cleanse_plaintext(TLS_server_method(),
1976             TLS_client_method(),
1977             TLS1_3_VERSION,
1978             TLS1_3_VERSION)))
1979         return 0;
1980 #endif
1981 
1982 #if !defined(OPENSSL_NO_DTLS)
1983 
1984     if (!TEST_true(execute_cleanse_plaintext(DTLS_server_method(),
1985             DTLS_client_method(),
1986             DTLS1_VERSION,
1987             0)))
1988         return 0;
1989 #endif
1990     return 1;
1991 }
1992 
1993 #ifndef OPENSSL_NO_OCSP
1994 static int ocsp_server_cb(SSL *s, void *arg)
1995 {
1996     int *argi = (int *)arg;
1997     unsigned char *copy = NULL;
1998     STACK_OF(OCSP_RESPID) *ids = NULL;
1999     OCSP_RESPID *id = NULL;
2000 
2001     if (*argi == 2) {
2002         /* In this test we are expecting exactly 1 OCSP_RESPID */
2003         SSL_get_tlsext_status_ids(s, &ids);
2004         if (ids == NULL || sk_OCSP_RESPID_num(ids) != 1)
2005             return SSL_TLSEXT_ERR_ALERT_FATAL;
2006 
2007         id = sk_OCSP_RESPID_value(ids, 0);
2008         if (id == NULL || !OCSP_RESPID_match_ex(id, ocspcert, libctx, NULL))
2009             return SSL_TLSEXT_ERR_ALERT_FATAL;
2010     } else if (*argi != 1) {
2011         return SSL_TLSEXT_ERR_ALERT_FATAL;
2012     }
2013 
2014     if (!TEST_ptr(copy = OPENSSL_memdup(orespder, sizeof(orespder))))
2015         return SSL_TLSEXT_ERR_ALERT_FATAL;
2016 
2017     if (!TEST_true(SSL_set_tlsext_status_ocsp_resp(s, copy,
2018             sizeof(orespder)))) {
2019         OPENSSL_free(copy);
2020         return SSL_TLSEXT_ERR_ALERT_FATAL;
2021     }
2022     ocsp_server_called = 1;
2023     return SSL_TLSEXT_ERR_OK;
2024 }
2025 
2026 static int ocsp_client_cb(SSL *s, void *arg)
2027 {
2028     int *argi = (int *)arg;
2029     const unsigned char *respderin;
2030     size_t len;
2031 
2032     if (*argi != 1 && *argi != 2)
2033         return 0;
2034 
2035     len = SSL_get_tlsext_status_ocsp_resp(s, &respderin);
2036     if (!TEST_mem_eq(orespder, len, respderin, len))
2037         return 0;
2038 
2039     ocsp_client_called = 1;
2040     return 1;
2041 }
2042 
2043 static int test_tlsext_status_type(void)
2044 {
2045     SSL_CTX *cctx = NULL, *sctx = NULL;
2046     SSL *clientssl = NULL, *serverssl = NULL;
2047     int testresult = 0;
2048     STACK_OF(OCSP_RESPID) *ids = NULL;
2049     OCSP_RESPID *id = NULL;
2050     BIO *certbio = NULL;
2051 
2052     if (!create_ssl_ctx_pair(libctx, TLS_server_method(), TLS_client_method(),
2053             TLS1_VERSION, 0,
2054             &sctx, &cctx, cert, privkey))
2055         return 0;
2056 
2057     if (SSL_CTX_get_tlsext_status_type(cctx) != -1)
2058         goto end;
2059 
2060     /* First just do various checks getting and setting tlsext_status_type */
2061 
2062     clientssl = SSL_new(cctx);
2063     if (!TEST_ptr(clientssl))
2064         goto end;
2065     if (!TEST_int_eq(SSL_get_tlsext_status_type(clientssl), -1)
2066         || !TEST_true(SSL_set_tlsext_status_type(clientssl,
2067             TLSEXT_STATUSTYPE_ocsp))
2068         || !TEST_int_eq(SSL_get_tlsext_status_type(clientssl),
2069             TLSEXT_STATUSTYPE_ocsp))
2070         goto end;
2071 
2072     SSL_free(clientssl);
2073     clientssl = NULL;
2074 
2075     if (!SSL_CTX_set_tlsext_status_type(cctx, TLSEXT_STATUSTYPE_ocsp)
2076         || SSL_CTX_get_tlsext_status_type(cctx) != TLSEXT_STATUSTYPE_ocsp)
2077         goto end;
2078 
2079     clientssl = SSL_new(cctx);
2080     if (!TEST_ptr(clientssl))
2081         goto end;
2082     if (SSL_get_tlsext_status_type(clientssl) != TLSEXT_STATUSTYPE_ocsp)
2083         goto end;
2084     SSL_free(clientssl);
2085     clientssl = NULL;
2086 
2087     /*
2088      * Now actually do a handshake and check OCSP information is exchanged and
2089      * the callbacks get called
2090      */
2091     SSL_CTX_set_tlsext_status_cb(cctx, ocsp_client_cb);
2092     SSL_CTX_set_tlsext_status_arg(cctx, &cdummyarg);
2093     SSL_CTX_set_tlsext_status_cb(sctx, ocsp_server_cb);
2094     SSL_CTX_set_tlsext_status_arg(sctx, &cdummyarg);
2095     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2096             &clientssl, NULL, NULL))
2097         || !TEST_true(create_ssl_connection(serverssl, clientssl,
2098             SSL_ERROR_NONE))
2099         || !TEST_true(ocsp_client_called)
2100         || !TEST_true(ocsp_server_called))
2101         goto end;
2102     SSL_free(serverssl);
2103     SSL_free(clientssl);
2104     serverssl = NULL;
2105     clientssl = NULL;
2106 
2107     /* Try again but this time force the server side callback to fail */
2108     ocsp_client_called = 0;
2109     ocsp_server_called = 0;
2110     cdummyarg = 0;
2111     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2112             &clientssl, NULL, NULL))
2113         /* This should fail because the callback will fail */
2114         || !TEST_false(create_ssl_connection(serverssl, clientssl,
2115             SSL_ERROR_NONE))
2116         || !TEST_false(ocsp_client_called)
2117         || !TEST_false(ocsp_server_called))
2118         goto end;
2119     SSL_free(serverssl);
2120     SSL_free(clientssl);
2121     serverssl = NULL;
2122     clientssl = NULL;
2123 
2124     /*
2125      * This time we'll get the client to send an OCSP_RESPID that it will
2126      * accept.
2127      */
2128     ocsp_client_called = 0;
2129     ocsp_server_called = 0;
2130     cdummyarg = 2;
2131     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2132             &clientssl, NULL, NULL)))
2133         goto end;
2134 
2135     /*
2136      * We'll just use any old cert for this test - it doesn't have to be an OCSP
2137      * specific one. We'll use the server cert.
2138      */
2139     if (!TEST_ptr(certbio = BIO_new_file(cert, "r"))
2140         || !TEST_ptr(id = OCSP_RESPID_new())
2141         || !TEST_ptr(ids = sk_OCSP_RESPID_new_null())
2142         || !TEST_ptr(ocspcert = X509_new_ex(libctx, NULL))
2143         || !TEST_ptr(PEM_read_bio_X509(certbio, &ocspcert, NULL, NULL))
2144         || !TEST_true(OCSP_RESPID_set_by_key_ex(id, ocspcert, libctx, NULL))
2145         || !TEST_true(sk_OCSP_RESPID_push(ids, id)))
2146         goto end;
2147     id = NULL;
2148     SSL_set_tlsext_status_ids(clientssl, ids);
2149     /* Control has been transferred */
2150     ids = NULL;
2151 
2152     BIO_free(certbio);
2153     certbio = NULL;
2154 
2155     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2156             SSL_ERROR_NONE))
2157         || !TEST_true(ocsp_client_called)
2158         || !TEST_true(ocsp_server_called))
2159         goto end;
2160 
2161     testresult = 1;
2162 
2163 end:
2164     SSL_free(serverssl);
2165     SSL_free(clientssl);
2166     SSL_CTX_free(sctx);
2167     SSL_CTX_free(cctx);
2168     sk_OCSP_RESPID_pop_free(ids, OCSP_RESPID_free);
2169     OCSP_RESPID_free(id);
2170     BIO_free(certbio);
2171     X509_free(ocspcert);
2172     ocspcert = NULL;
2173 
2174     return testresult;
2175 }
2176 #endif
2177 
2178 #if !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
2179 static int new_called, remove_called, get_called;
2180 
2181 static int new_session_cb(SSL *ssl, SSL_SESSION *sess)
2182 {
2183     new_called++;
2184     /*
2185      * sess has been up-refed for us, but we don't actually need it so free it
2186      * immediately.
2187      */
2188     SSL_SESSION_free(sess);
2189     return 1;
2190 }
2191 
2192 static void remove_session_cb(SSL_CTX *ctx, SSL_SESSION *sess)
2193 {
2194     remove_called++;
2195 }
2196 
2197 static SSL_SESSION *get_sess_val = NULL;
2198 
2199 static SSL_SESSION *get_session_cb(SSL *ssl, const unsigned char *id, int len,
2200     int *copy)
2201 {
2202     get_called++;
2203     *copy = 1;
2204     return get_sess_val;
2205 }
2206 
2207 static int execute_test_session(int maxprot, int use_int_cache,
2208     int use_ext_cache, long s_options)
2209 {
2210     SSL_CTX *sctx = NULL, *cctx = NULL;
2211     SSL *serverssl1 = NULL, *clientssl1 = NULL;
2212     SSL *serverssl2 = NULL, *clientssl2 = NULL;
2213 #ifndef OPENSSL_NO_TLS1_1
2214     SSL *serverssl3 = NULL, *clientssl3 = NULL;
2215 #endif
2216     SSL_SESSION *sess1 = NULL, *sess2 = NULL;
2217     int testresult = 0, numnewsesstick = 1;
2218 
2219     new_called = remove_called = 0;
2220 
2221     /* TLSv1.3 sends 2 NewSessionTickets */
2222     if (maxprot == TLS1_3_VERSION)
2223         numnewsesstick = 2;
2224 
2225     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
2226             TLS_client_method(), TLS1_VERSION, 0,
2227             &sctx, &cctx, cert, privkey)))
2228         return 0;
2229 
2230     /*
2231      * Only allow the max protocol version so we can force a connection failure
2232      * later
2233      */
2234     SSL_CTX_set_min_proto_version(cctx, maxprot);
2235     SSL_CTX_set_max_proto_version(cctx, maxprot);
2236 
2237     /* Set up session cache */
2238     if (use_ext_cache) {
2239         SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
2240         SSL_CTX_sess_set_remove_cb(cctx, remove_session_cb);
2241     }
2242     if (use_int_cache) {
2243         /* Also covers instance where both are set */
2244         SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT);
2245     } else {
2246         SSL_CTX_set_session_cache_mode(cctx,
2247             SSL_SESS_CACHE_CLIENT
2248                 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2249     }
2250 
2251     if (s_options) {
2252         SSL_CTX_set_options(sctx, s_options);
2253     }
2254 
2255     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl1, &clientssl1,
2256             NULL, NULL))
2257         || !TEST_true(create_ssl_connection(serverssl1, clientssl1,
2258             SSL_ERROR_NONE))
2259         || !TEST_ptr(sess1 = SSL_get1_session(clientssl1)))
2260         goto end;
2261 
2262     /* Should fail because it should already be in the cache */
2263     if (use_int_cache && !TEST_false(SSL_CTX_add_session(cctx, sess1)))
2264         goto end;
2265     if (use_ext_cache
2266         && (!TEST_int_eq(new_called, numnewsesstick)
2267 
2268             || !TEST_int_eq(remove_called, 0)))
2269         goto end;
2270 
2271     new_called = remove_called = 0;
2272     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
2273             &clientssl2, NULL, NULL))
2274         || !TEST_true(SSL_set_session(clientssl2, sess1))
2275         || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
2276             SSL_ERROR_NONE))
2277         || !TEST_true(SSL_session_reused(clientssl2)))
2278         goto end;
2279 
2280     if (maxprot == TLS1_3_VERSION) {
2281         /*
2282          * In TLSv1.3 we should have created a new session even though we have
2283          * resumed. Since we attempted a resume we should also have removed the
2284          * old ticket from the cache so that we try to only use tickets once.
2285          */
2286         if (use_ext_cache
2287             && (!TEST_int_eq(new_called, 1)
2288                 || !TEST_int_eq(remove_called, 1)))
2289             goto end;
2290     } else {
2291         /*
2292          * In TLSv1.2 we expect to have resumed so no sessions added or
2293          * removed.
2294          */
2295         if (use_ext_cache
2296             && (!TEST_int_eq(new_called, 0)
2297                 || !TEST_int_eq(remove_called, 0)))
2298             goto end;
2299     }
2300 
2301     SSL_SESSION_free(sess1);
2302     if (!TEST_ptr(sess1 = SSL_get1_session(clientssl2)))
2303         goto end;
2304     shutdown_ssl_connection(serverssl2, clientssl2);
2305     serverssl2 = clientssl2 = NULL;
2306 
2307     new_called = remove_called = 0;
2308     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
2309             &clientssl2, NULL, NULL))
2310         || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
2311             SSL_ERROR_NONE)))
2312         goto end;
2313 
2314     if (!TEST_ptr(sess2 = SSL_get1_session(clientssl2)))
2315         goto end;
2316 
2317     if (use_ext_cache
2318         && (!TEST_int_eq(new_called, numnewsesstick)
2319             || !TEST_int_eq(remove_called, 0)))
2320         goto end;
2321 
2322     new_called = remove_called = 0;
2323     /*
2324      * This should clear sess2 from the cache because it is a "bad" session.
2325      * See SSL_set_session() documentation.
2326      */
2327     if (!TEST_true(SSL_set_session(clientssl2, sess1)))
2328         goto end;
2329     if (use_ext_cache
2330         && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
2331         goto end;
2332     if (!TEST_ptr_eq(SSL_get_session(clientssl2), sess1))
2333         goto end;
2334 
2335     if (use_int_cache) {
2336         /* Should succeeded because it should not already be in the cache */
2337         if (!TEST_true(SSL_CTX_add_session(cctx, sess2))
2338             || !TEST_true(SSL_CTX_remove_session(cctx, sess2)))
2339             goto end;
2340     }
2341 
2342     new_called = remove_called = 0;
2343     /* This shouldn't be in the cache so should fail */
2344     if (!TEST_false(SSL_CTX_remove_session(cctx, sess2)))
2345         goto end;
2346 
2347     if (use_ext_cache
2348         && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
2349         goto end;
2350 
2351 #if !defined(OPENSSL_NO_TLS1_1)
2352     new_called = remove_called = 0;
2353     /* Force a connection failure */
2354     SSL_CTX_set_max_proto_version(sctx, TLS1_1_VERSION);
2355     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl3,
2356             &clientssl3, NULL, NULL))
2357         || !TEST_true(SSL_set_session(clientssl3, sess1))
2358         /* This should fail because of the mismatched protocol versions */
2359         || !TEST_false(create_ssl_connection(serverssl3, clientssl3,
2360             SSL_ERROR_NONE)))
2361         goto end;
2362 
2363     /* We should have automatically removed the session from the cache */
2364     if (use_ext_cache
2365         && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
2366         goto end;
2367 
2368     /* Should succeed because it should not already be in the cache */
2369     if (use_int_cache && !TEST_true(SSL_CTX_add_session(cctx, sess2)))
2370         goto end;
2371 #endif
2372 
2373     /* Now do some tests for server side caching */
2374     if (use_ext_cache) {
2375         SSL_CTX_sess_set_new_cb(cctx, NULL);
2376         SSL_CTX_sess_set_remove_cb(cctx, NULL);
2377         SSL_CTX_sess_set_new_cb(sctx, new_session_cb);
2378         SSL_CTX_sess_set_remove_cb(sctx, remove_session_cb);
2379         SSL_CTX_sess_set_get_cb(sctx, get_session_cb);
2380         get_sess_val = NULL;
2381     }
2382 
2383     SSL_CTX_set_session_cache_mode(cctx, 0);
2384     /* Internal caching is the default on the server side */
2385     if (!use_int_cache)
2386         SSL_CTX_set_session_cache_mode(sctx,
2387             SSL_SESS_CACHE_SERVER
2388                 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2389 
2390     SSL_free(serverssl1);
2391     SSL_free(clientssl1);
2392     serverssl1 = clientssl1 = NULL;
2393     SSL_free(serverssl2);
2394     SSL_free(clientssl2);
2395     serverssl2 = clientssl2 = NULL;
2396     SSL_SESSION_free(sess1);
2397     sess1 = NULL;
2398     SSL_SESSION_free(sess2);
2399     sess2 = NULL;
2400 
2401     SSL_CTX_set_max_proto_version(sctx, maxprot);
2402     if (maxprot == TLS1_2_VERSION)
2403         SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET);
2404     new_called = remove_called = get_called = 0;
2405     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl1, &clientssl1,
2406             NULL, NULL))
2407         || !TEST_true(create_ssl_connection(serverssl1, clientssl1,
2408             SSL_ERROR_NONE))
2409         || !TEST_ptr(sess1 = SSL_get1_session(clientssl1))
2410         || !TEST_ptr(sess2 = SSL_get1_session(serverssl1)))
2411         goto end;
2412 
2413     if (use_int_cache) {
2414         if (maxprot == TLS1_3_VERSION && !use_ext_cache) {
2415             /*
2416              * In TLSv1.3 it should not have been added to the internal cache,
2417              * except in the case where we also have an external cache (in that
2418              * case it gets added to the cache in order to generate remove
2419              * events after timeout).
2420              */
2421             if (!TEST_false(SSL_CTX_remove_session(sctx, sess2)))
2422                 goto end;
2423         } else {
2424             /* Should fail because it should already be in the cache */
2425             if (!TEST_false(SSL_CTX_add_session(sctx, sess2)))
2426                 goto end;
2427         }
2428     }
2429 
2430     if (use_ext_cache) {
2431         SSL_SESSION *tmp = sess2;
2432 
2433         if (!TEST_int_eq(new_called, numnewsesstick)
2434             || !TEST_int_eq(remove_called, 0)
2435             || !TEST_int_eq(get_called, 0))
2436             goto end;
2437         /*
2438          * Delete the session from the internal cache to force a lookup from
2439          * the external cache. We take a copy first because
2440          * SSL_CTX_remove_session() also marks the session as non-resumable.
2441          */
2442         if (use_int_cache && maxprot != TLS1_3_VERSION) {
2443             if (!TEST_ptr(tmp = SSL_SESSION_dup(sess2))
2444                 || !TEST_true(sess2->owner != NULL)
2445                 || !TEST_true(tmp->owner == NULL)
2446                 || !TEST_true(SSL_CTX_remove_session(sctx, sess2)))
2447                 goto end;
2448             SSL_SESSION_free(sess2);
2449         }
2450         sess2 = tmp;
2451     }
2452 
2453     new_called = remove_called = get_called = 0;
2454     get_sess_val = sess2;
2455     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
2456             &clientssl2, NULL, NULL))
2457         || !TEST_true(SSL_set_session(clientssl2, sess1))
2458         || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
2459             SSL_ERROR_NONE))
2460         || !TEST_true(SSL_session_reused(clientssl2)))
2461         goto end;
2462 
2463     if (use_ext_cache) {
2464         if (!TEST_int_eq(remove_called, 0))
2465             goto end;
2466 
2467         if (maxprot == TLS1_3_VERSION) {
2468             if (!TEST_int_eq(new_called, 1)
2469                 || !TEST_int_eq(get_called, 0))
2470                 goto end;
2471         } else {
2472             if (!TEST_int_eq(new_called, 0)
2473                 || !TEST_int_eq(get_called, 1))
2474                 goto end;
2475         }
2476     }
2477     /*
2478      * Make a small cache, force out all other sessions but
2479      * sess2, try to add sess1, which should succeed. Then
2480      * make sure it's there by checking the owners. Despite
2481      * the timeouts, sess1 should have kicked out sess2
2482      */
2483 
2484     /* Make sess1 expire before sess2 */
2485     if (!TEST_time_t_gt(SSL_SESSION_set_time_ex(sess1, 1000), 0)
2486         || !TEST_long_gt(SSL_SESSION_set_timeout(sess1, 1000), 0)
2487         || !TEST_time_t_gt(SSL_SESSION_set_time_ex(sess2, 2000), 0)
2488         || !TEST_long_gt(SSL_SESSION_set_timeout(sess2, 2000), 0))
2489         goto end;
2490 
2491     if (!TEST_long_ne(SSL_CTX_sess_set_cache_size(sctx, 1), 0))
2492         goto end;
2493 
2494     /* Don't care about results - cache should only be sess2 at end */
2495     SSL_CTX_add_session(sctx, sess1);
2496     SSL_CTX_add_session(sctx, sess2);
2497 
2498     /* Now add sess1, and make sure it remains, despite timeout */
2499     if (!TEST_true(SSL_CTX_add_session(sctx, sess1))
2500         || !TEST_ptr(sess1->owner)
2501         || !TEST_ptr_null(sess2->owner))
2502         goto end;
2503 
2504     testresult = 1;
2505 
2506 end:
2507     SSL_free(serverssl1);
2508     SSL_free(clientssl1);
2509     SSL_free(serverssl2);
2510     SSL_free(clientssl2);
2511 #ifndef OPENSSL_NO_TLS1_1
2512     SSL_free(serverssl3);
2513     SSL_free(clientssl3);
2514 #endif
2515     SSL_SESSION_free(sess1);
2516     SSL_SESSION_free(sess2);
2517     SSL_CTX_free(sctx);
2518     SSL_CTX_free(cctx);
2519 
2520     return testresult;
2521 }
2522 #endif /* !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2) */
2523 
2524 static int test_session_with_only_int_cache(void)
2525 {
2526 #ifndef OSSL_NO_USABLE_TLS1_3
2527     if (!execute_test_session(TLS1_3_VERSION, 1, 0, 0))
2528         return 0;
2529 #endif
2530 
2531 #ifndef OPENSSL_NO_TLS1_2
2532     return execute_test_session(TLS1_2_VERSION, 1, 0, 0);
2533 #else
2534     return 1;
2535 #endif
2536 }
2537 
2538 static int test_session_with_only_ext_cache(void)
2539 {
2540 #ifndef OSSL_NO_USABLE_TLS1_3
2541     if (!execute_test_session(TLS1_3_VERSION, 0, 1, 0))
2542         return 0;
2543 #endif
2544 
2545 #ifndef OPENSSL_NO_TLS1_2
2546     return execute_test_session(TLS1_2_VERSION, 0, 1, 0);
2547 #else
2548     return 1;
2549 #endif
2550 }
2551 
2552 static int test_session_with_both_cache(void)
2553 {
2554 #ifndef OSSL_NO_USABLE_TLS1_3
2555     if (!execute_test_session(TLS1_3_VERSION, 1, 1, 0))
2556         return 0;
2557 #endif
2558 
2559 #ifndef OPENSSL_NO_TLS1_2
2560     return execute_test_session(TLS1_2_VERSION, 1, 1, 0);
2561 #else
2562     return 1;
2563 #endif
2564 }
2565 
2566 static int test_session_wo_ca_names(void)
2567 {
2568 #ifndef OSSL_NO_USABLE_TLS1_3
2569     if (!execute_test_session(TLS1_3_VERSION, 1, 0, SSL_OP_DISABLE_TLSEXT_CA_NAMES))
2570         return 0;
2571 #endif
2572 
2573 #ifndef OPENSSL_NO_TLS1_2
2574     return execute_test_session(TLS1_2_VERSION, 1, 0, SSL_OP_DISABLE_TLSEXT_CA_NAMES);
2575 #else
2576     return 1;
2577 #endif
2578 }
2579 
2580 #ifndef OSSL_NO_USABLE_TLS1_3
2581 static SSL_SESSION *sesscache[6];
2582 static int do_cache;
2583 
2584 static int new_cachesession_cb(SSL *ssl, SSL_SESSION *sess)
2585 {
2586     if (do_cache) {
2587         sesscache[new_called] = sess;
2588     } else {
2589         /* We don't need the reference to the session, so free it */
2590         SSL_SESSION_free(sess);
2591     }
2592     new_called++;
2593 
2594     return 1;
2595 }
2596 
2597 static int post_handshake_verify(SSL *sssl, SSL *cssl)
2598 {
2599     SSL_set_verify(sssl, SSL_VERIFY_PEER, NULL);
2600     if (!TEST_true(SSL_verify_client_post_handshake(sssl)))
2601         return 0;
2602 
2603     /* Start handshake on the server and client */
2604     if (!TEST_int_eq(SSL_do_handshake(sssl), 1)
2605         || !TEST_int_le(SSL_read(cssl, NULL, 0), 0)
2606         || !TEST_int_le(SSL_read(sssl, NULL, 0), 0)
2607         || !TEST_true(create_ssl_connection(sssl, cssl,
2608             SSL_ERROR_NONE)))
2609         return 0;
2610 
2611     return 1;
2612 }
2613 
2614 static int setup_ticket_test(int stateful, int idx, SSL_CTX **sctx,
2615     SSL_CTX **cctx)
2616 {
2617     int sess_id_ctx = 1;
2618 
2619     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
2620             TLS_client_method(), TLS1_VERSION, 0,
2621             sctx, cctx, cert, privkey))
2622         || !TEST_true(SSL_CTX_set_num_tickets(*sctx, idx))
2623         || !TEST_true(SSL_CTX_set_session_id_context(*sctx,
2624             (void *)&sess_id_ctx,
2625             sizeof(sess_id_ctx))))
2626         return 0;
2627 
2628     if (stateful)
2629         SSL_CTX_set_options(*sctx, SSL_OP_NO_TICKET);
2630 
2631     SSL_CTX_set_session_cache_mode(*cctx, SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2632     SSL_CTX_sess_set_new_cb(*cctx, new_cachesession_cb);
2633 
2634     return 1;
2635 }
2636 
2637 static int check_resumption(int idx, SSL_CTX *sctx, SSL_CTX *cctx, int succ)
2638 {
2639     SSL *serverssl = NULL, *clientssl = NULL;
2640     int i;
2641 
2642     /* Test that we can resume with all the tickets we got given */
2643     for (i = 0; i < idx * 2; i++) {
2644         new_called = 0;
2645         if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2646                 &clientssl, NULL, NULL))
2647             || !TEST_true(SSL_set_session(clientssl, sesscache[i])))
2648             goto end;
2649 
2650         SSL_set_post_handshake_auth(clientssl, 1);
2651 
2652         if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2653                 SSL_ERROR_NONE)))
2654             goto end;
2655 
2656         /*
2657          * Following a successful resumption we only get 1 ticket. After a
2658          * failed one we should get idx tickets.
2659          */
2660         if (succ) {
2661             if (!TEST_true(SSL_session_reused(clientssl))
2662                 || !TEST_int_eq(new_called, 1))
2663                 goto end;
2664         } else {
2665             if (!TEST_false(SSL_session_reused(clientssl))
2666                 || !TEST_int_eq(new_called, idx))
2667                 goto end;
2668         }
2669 
2670         new_called = 0;
2671         /* After a post-handshake authentication we should get 1 new ticket */
2672         if (succ
2673             && (!post_handshake_verify(serverssl, clientssl)
2674                 || !TEST_int_eq(new_called, 1)))
2675             goto end;
2676 
2677         SSL_shutdown(clientssl);
2678         SSL_shutdown(serverssl);
2679         SSL_free(serverssl);
2680         SSL_free(clientssl);
2681         serverssl = clientssl = NULL;
2682         SSL_SESSION_free(sesscache[i]);
2683         sesscache[i] = NULL;
2684     }
2685 
2686     return 1;
2687 
2688 end:
2689     SSL_free(clientssl);
2690     SSL_free(serverssl);
2691     return 0;
2692 }
2693 
2694 static int test_tickets(int stateful, int idx)
2695 {
2696     SSL_CTX *sctx = NULL, *cctx = NULL;
2697     SSL *serverssl = NULL, *clientssl = NULL;
2698     int testresult = 0;
2699     size_t j;
2700 
2701     /* idx is the test number, but also the number of tickets we want */
2702 
2703     new_called = 0;
2704     do_cache = 1;
2705 
2706     if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
2707         goto end;
2708 
2709     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2710             &clientssl, NULL, NULL)))
2711         goto end;
2712 
2713     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2714             SSL_ERROR_NONE))
2715         /* Check we got the number of tickets we were expecting */
2716         || !TEST_int_eq(idx, new_called))
2717         goto end;
2718 
2719     SSL_shutdown(clientssl);
2720     SSL_shutdown(serverssl);
2721     SSL_free(serverssl);
2722     SSL_free(clientssl);
2723     SSL_CTX_free(sctx);
2724     SSL_CTX_free(cctx);
2725     clientssl = serverssl = NULL;
2726     sctx = cctx = NULL;
2727 
2728     /*
2729      * Now we try to resume with the tickets we previously created. The
2730      * resumption attempt is expected to fail (because we're now using a new
2731      * SSL_CTX). We should see idx number of tickets issued again.
2732      */
2733 
2734     /* Stop caching sessions - just count them */
2735     do_cache = 0;
2736 
2737     if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
2738         goto end;
2739 
2740     if (!check_resumption(idx, sctx, cctx, 0))
2741         goto end;
2742 
2743     /* Start again with caching sessions */
2744     new_called = 0;
2745     do_cache = 1;
2746     SSL_CTX_free(sctx);
2747     SSL_CTX_free(cctx);
2748     sctx = cctx = NULL;
2749 
2750     if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
2751         goto end;
2752 
2753     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2754             &clientssl, NULL, NULL)))
2755         goto end;
2756 
2757     SSL_set_post_handshake_auth(clientssl, 1);
2758 
2759     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2760             SSL_ERROR_NONE))
2761         /* Check we got the number of tickets we were expecting */
2762         || !TEST_int_eq(idx, new_called))
2763         goto end;
2764 
2765     /* After a post-handshake authentication we should get new tickets issued */
2766     if (!post_handshake_verify(serverssl, clientssl)
2767         || !TEST_int_eq(idx * 2, new_called))
2768         goto end;
2769 
2770     SSL_shutdown(clientssl);
2771     SSL_shutdown(serverssl);
2772     SSL_free(serverssl);
2773     SSL_free(clientssl);
2774     serverssl = clientssl = NULL;
2775 
2776     /* Stop caching sessions - just count them */
2777     do_cache = 0;
2778 
2779     /*
2780      * Check we can resume with all the tickets we created. This time around the
2781      * resumptions should all be successful.
2782      */
2783     if (!check_resumption(idx, sctx, cctx, 1))
2784         goto end;
2785 
2786     testresult = 1;
2787 
2788 end:
2789     SSL_free(serverssl);
2790     SSL_free(clientssl);
2791     for (j = 0; j < OSSL_NELEM(sesscache); j++) {
2792         SSL_SESSION_free(sesscache[j]);
2793         sesscache[j] = NULL;
2794     }
2795     SSL_CTX_free(sctx);
2796     SSL_CTX_free(cctx);
2797 
2798     return testresult;
2799 }
2800 
2801 static int test_stateless_tickets(int idx)
2802 {
2803     return test_tickets(0, idx);
2804 }
2805 
2806 static int test_stateful_tickets(int idx)
2807 {
2808     return test_tickets(1, idx);
2809 }
2810 
2811 static int test_psk_tickets(void)
2812 {
2813     SSL_CTX *sctx = NULL, *cctx = NULL;
2814     SSL *serverssl = NULL, *clientssl = NULL;
2815     int testresult = 0;
2816     int sess_id_ctx = 1;
2817 
2818     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
2819             TLS_client_method(), TLS1_VERSION, 0,
2820             &sctx, &cctx, NULL, NULL))
2821         || !TEST_true(SSL_CTX_set_session_id_context(sctx,
2822             (void *)&sess_id_ctx,
2823             sizeof(sess_id_ctx))))
2824         goto end;
2825 
2826     SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL_STORE);
2827     SSL_CTX_set_psk_use_session_callback(cctx, use_session_cb);
2828     SSL_CTX_set_psk_find_session_callback(sctx, find_session_cb);
2829     SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
2830     use_session_cb_cnt = 0;
2831     find_session_cb_cnt = 0;
2832     srvid = pskid;
2833     new_called = 0;
2834 
2835     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
2836             NULL, NULL)))
2837         goto end;
2838     clientpsk = serverpsk = create_a_psk(clientssl, SHA384_DIGEST_LENGTH);
2839     if (!TEST_ptr(clientpsk) || !TEST_true(SSL_SESSION_up_ref(clientpsk)))
2840         goto end;
2841 
2842     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2843             SSL_ERROR_NONE))
2844         || !TEST_int_eq(1, find_session_cb_cnt)
2845         || !TEST_int_eq(1, use_session_cb_cnt)
2846         /* We should always get 1 ticket when using external PSK */
2847         || !TEST_int_eq(1, new_called))
2848         goto end;
2849 
2850     testresult = 1;
2851 
2852 end:
2853     SSL_free(serverssl);
2854     SSL_free(clientssl);
2855     SSL_CTX_free(sctx);
2856     SSL_CTX_free(cctx);
2857     SSL_SESSION_free(clientpsk);
2858     SSL_SESSION_free(serverpsk);
2859     clientpsk = serverpsk = NULL;
2860 
2861     return testresult;
2862 }
2863 
2864 static int test_extra_tickets(int idx)
2865 {
2866     SSL_CTX *sctx = NULL, *cctx = NULL;
2867     SSL *serverssl = NULL, *clientssl = NULL;
2868     BIO *bretry = BIO_new(bio_s_always_retry());
2869     BIO *tmp = NULL;
2870     int testresult = 0;
2871     int stateful = 0;
2872     size_t nbytes;
2873     unsigned char c, buf[1];
2874 
2875     new_called = 0;
2876     do_cache = 1;
2877 
2878     if (idx >= 3) {
2879         idx -= 3;
2880         stateful = 1;
2881     }
2882 
2883     if (!TEST_ptr(bretry) || !setup_ticket_test(stateful, idx, &sctx, &cctx))
2884         goto end;
2885     SSL_CTX_sess_set_new_cb(sctx, new_session_cb);
2886     /* setup_ticket_test() uses new_cachesession_cb which we don't need. */
2887     SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
2888 
2889     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2890             &clientssl, NULL, NULL)))
2891         goto end;
2892 
2893     /*
2894      * Note that we have new_session_cb on both sctx and cctx, so new_called is
2895      * incremented by both client and server.
2896      */
2897     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
2898             SSL_ERROR_NONE))
2899         /* Check we got the number of tickets we were expecting */
2900         || !TEST_int_eq(idx * 2, new_called)
2901         || !TEST_true(SSL_new_session_ticket(serverssl))
2902         || !TEST_true(SSL_new_session_ticket(serverssl))
2903         || !TEST_int_eq(idx * 2, new_called))
2904         goto end;
2905 
2906     /* Now try a (real) write to actually send the tickets */
2907     c = '1';
2908     if (!TEST_true(SSL_write_ex(serverssl, &c, 1, &nbytes))
2909         || !TEST_size_t_eq(1, nbytes)
2910         || !TEST_int_eq(idx * 2 + 2, new_called)
2911         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2912         || !TEST_int_eq(idx * 2 + 4, new_called)
2913         || !TEST_int_eq(sizeof(buf), nbytes)
2914         || !TEST_int_eq(c, buf[0])
2915         || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes)))
2916         goto end;
2917 
2918     /* Try with only requesting one new ticket, too */
2919     c = '2';
2920     new_called = 0;
2921     if (!TEST_true(SSL_new_session_ticket(serverssl))
2922         || !TEST_true(SSL_write_ex(serverssl, &c, sizeof(c), &nbytes))
2923         || !TEST_size_t_eq(sizeof(c), nbytes)
2924         || !TEST_int_eq(1, new_called)
2925         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2926         || !TEST_int_eq(2, new_called)
2927         || !TEST_size_t_eq(sizeof(buf), nbytes)
2928         || !TEST_int_eq(c, buf[0]))
2929         goto end;
2930 
2931     /* Do it again but use dummy writes to drive the ticket generation */
2932     c = '3';
2933     new_called = 0;
2934     if (!TEST_true(SSL_new_session_ticket(serverssl))
2935         || !TEST_true(SSL_new_session_ticket(serverssl))
2936         || !TEST_true(SSL_write_ex(serverssl, &c, 0, &nbytes))
2937         || !TEST_size_t_eq(0, nbytes)
2938         || !TEST_int_eq(2, new_called)
2939         || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2940         || !TEST_int_eq(4, new_called))
2941         goto end;
2942 
2943     /* Once more, but with SSL_do_handshake() to drive the ticket generation */
2944     c = '4';
2945     new_called = 0;
2946     if (!TEST_true(SSL_new_session_ticket(serverssl))
2947         || !TEST_true(SSL_new_session_ticket(serverssl))
2948         || !TEST_true(SSL_do_handshake(serverssl))
2949         || !TEST_int_eq(2, new_called)
2950         || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2951         || !TEST_int_eq(4, new_called))
2952         goto end;
2953 
2954     /*
2955      * Use the always-retry BIO to exercise the logic that forces ticket
2956      * generation to wait until a record boundary.
2957      */
2958     c = '5';
2959     new_called = 0;
2960     tmp = SSL_get_wbio(serverssl);
2961     if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
2962         tmp = NULL;
2963         goto end;
2964     }
2965     SSL_set0_wbio(serverssl, bretry);
2966     bretry = NULL;
2967     if (!TEST_false(SSL_write_ex(serverssl, &c, 1, &nbytes))
2968         || !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_WANT_WRITE)
2969         || !TEST_size_t_eq(nbytes, 0))
2970         goto end;
2971     /* Restore a BIO that will let the write succeed */
2972     SSL_set0_wbio(serverssl, tmp);
2973     tmp = NULL;
2974     /*
2975      * These calls should just queue the request and not send anything
2976      * even if we explicitly try to hit the state machine.
2977      */
2978     if (!TEST_true(SSL_new_session_ticket(serverssl))
2979         || !TEST_true(SSL_new_session_ticket(serverssl))
2980         || !TEST_int_eq(0, new_called)
2981         || !TEST_true(SSL_do_handshake(serverssl))
2982         || !TEST_int_eq(0, new_called))
2983         goto end;
2984     /* Re-do the write; still no tickets sent */
2985     if (!TEST_true(SSL_write_ex(serverssl, &c, 1, &nbytes))
2986         || !TEST_size_t_eq(1, nbytes)
2987         || !TEST_int_eq(0, new_called)
2988         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
2989         || !TEST_int_eq(0, new_called)
2990         || !TEST_int_eq(sizeof(buf), nbytes)
2991         || !TEST_int_eq(c, buf[0])
2992         || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes)))
2993         goto end;
2994     /* Even trying to hit the state machine now will still not send tickets */
2995     if (!TEST_true(SSL_do_handshake(serverssl))
2996         || !TEST_int_eq(0, new_called))
2997         goto end;
2998     /* Now the *next* write should send the tickets */
2999     c = '6';
3000     if (!TEST_true(SSL_write_ex(serverssl, &c, 1, &nbytes))
3001         || !TEST_size_t_eq(1, nbytes)
3002         || !TEST_int_eq(2, new_called)
3003         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes))
3004         || !TEST_int_eq(4, new_called)
3005         || !TEST_int_eq(sizeof(buf), nbytes)
3006         || !TEST_int_eq(c, buf[0])
3007         || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &nbytes)))
3008         goto end;
3009 
3010     SSL_shutdown(clientssl);
3011     SSL_shutdown(serverssl);
3012     testresult = 1;
3013 
3014 end:
3015     BIO_free(bretry);
3016     BIO_free(tmp);
3017     SSL_free(serverssl);
3018     SSL_free(clientssl);
3019     SSL_CTX_free(sctx);
3020     SSL_CTX_free(cctx);
3021     clientssl = serverssl = NULL;
3022     sctx = cctx = NULL;
3023     return testresult;
3024 }
3025 #endif
3026 
3027 #define USE_NULL 0
3028 #define USE_BIO_1 1
3029 #define USE_BIO_2 2
3030 #define USE_DEFAULT 3
3031 
3032 #define CONNTYPE_CONNECTION_SUCCESS 0
3033 #define CONNTYPE_CONNECTION_FAIL 1
3034 #define CONNTYPE_NO_CONNECTION 2
3035 
3036 #define TOTAL_NO_CONN_SSL_SET_BIO_TESTS (3 * 3 * 3 * 3)
3037 #define TOTAL_CONN_SUCCESS_SSL_SET_BIO_TESTS (2 * 2)
3038 #if !defined(OSSL_NO_USABLE_TLS1_3) && !defined(OPENSSL_NO_TLS1_2)
3039 #define TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS (2 * 2)
3040 #else
3041 #define TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS 0
3042 #endif
3043 
3044 #define TOTAL_SSL_SET_BIO_TESTS           \
3045     TOTAL_NO_CONN_SSL_SET_BIO_TESTS       \
3046     +TOTAL_CONN_SUCCESS_SSL_SET_BIO_TESTS \
3047         + TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS
3048 
3049 static void setupbio(BIO **res, BIO *bio1, BIO *bio2, int type)
3050 {
3051     switch (type) {
3052     case USE_NULL:
3053         *res = NULL;
3054         break;
3055     case USE_BIO_1:
3056         *res = bio1;
3057         break;
3058     case USE_BIO_2:
3059         *res = bio2;
3060         break;
3061     }
3062 }
3063 
3064 /*
3065  * Tests calls to SSL_set_bio() under various conditions.
3066  *
3067  * For the first 3 * 3 * 3 * 3 = 81 tests we do 2 calls to SSL_set_bio() with
3068  * various combinations of valid BIOs or NULL being set for the rbio/wbio. We
3069  * then do more tests where we create a successful connection first using our
3070  * standard connection setup functions, and then call SSL_set_bio() with
3071  * various combinations of valid BIOs or NULL. We then repeat these tests
3072  * following a failed connection. In this last case we are looking to check that
3073  * SSL_set_bio() functions correctly in the case where s->bbio is not NULL.
3074  */
3075 static int test_ssl_set_bio(int idx)
3076 {
3077     SSL_CTX *sctx = NULL, *cctx = NULL;
3078     BIO *bio1 = NULL;
3079     BIO *bio2 = NULL;
3080     BIO *irbio = NULL, *iwbio = NULL, *nrbio = NULL, *nwbio = NULL;
3081     SSL *serverssl = NULL, *clientssl = NULL;
3082     int initrbio, initwbio, newrbio, newwbio, conntype;
3083     int testresult = 0;
3084 
3085     if (idx < TOTAL_NO_CONN_SSL_SET_BIO_TESTS) {
3086         initrbio = idx % 3;
3087         idx /= 3;
3088         initwbio = idx % 3;
3089         idx /= 3;
3090         newrbio = idx % 3;
3091         idx /= 3;
3092         newwbio = idx % 3;
3093         conntype = CONNTYPE_NO_CONNECTION;
3094     } else {
3095         idx -= TOTAL_NO_CONN_SSL_SET_BIO_TESTS;
3096         initrbio = initwbio = USE_DEFAULT;
3097         newrbio = idx % 2;
3098         idx /= 2;
3099         newwbio = idx % 2;
3100         idx /= 2;
3101         conntype = idx % 2;
3102     }
3103 
3104     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3105             TLS_client_method(), TLS1_VERSION, 0,
3106             &sctx, &cctx, cert, privkey)))
3107         goto end;
3108 
3109     if (conntype == CONNTYPE_CONNECTION_FAIL) {
3110         /*
3111          * We won't ever get here if either TLSv1.3 or TLSv1.2 is disabled
3112          * because we reduced the number of tests in the definition of
3113          * TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS to avoid this scenario. By setting
3114          * mismatched protocol versions we will force a connection failure.
3115          */
3116         SSL_CTX_set_min_proto_version(sctx, TLS1_3_VERSION);
3117         SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
3118     }
3119 
3120     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
3121             NULL, NULL)))
3122         goto end;
3123 
3124     if (initrbio == USE_BIO_1
3125         || initwbio == USE_BIO_1
3126         || newrbio == USE_BIO_1
3127         || newwbio == USE_BIO_1) {
3128         if (!TEST_ptr(bio1 = BIO_new(BIO_s_mem())))
3129             goto end;
3130     }
3131 
3132     if (initrbio == USE_BIO_2
3133         || initwbio == USE_BIO_2
3134         || newrbio == USE_BIO_2
3135         || newwbio == USE_BIO_2) {
3136         if (!TEST_ptr(bio2 = BIO_new(BIO_s_mem())))
3137             goto end;
3138     }
3139 
3140     if (initrbio != USE_DEFAULT) {
3141         setupbio(&irbio, bio1, bio2, initrbio);
3142         setupbio(&iwbio, bio1, bio2, initwbio);
3143         SSL_set_bio(clientssl, irbio, iwbio);
3144 
3145         /*
3146          * We want to maintain our own refs to these BIO, so do an up ref for
3147          * each BIO that will have ownership transferred in the SSL_set_bio()
3148          * call
3149          */
3150         if (irbio != NULL && !BIO_up_ref(irbio))
3151             goto end;
3152         if (iwbio != NULL && iwbio != irbio && !BIO_up_ref(iwbio)) {
3153             BIO_free(irbio);
3154             goto end;
3155         }
3156     }
3157 
3158     if (conntype != CONNTYPE_NO_CONNECTION
3159         && !TEST_true(create_ssl_connection(serverssl, clientssl,
3160                           SSL_ERROR_NONE)
3161             == (conntype == CONNTYPE_CONNECTION_SUCCESS)))
3162         goto end;
3163 
3164     setupbio(&nrbio, bio1, bio2, newrbio);
3165     setupbio(&nwbio, bio1, bio2, newwbio);
3166 
3167     /*
3168      * We will (maybe) transfer ownership again so do more up refs.
3169      * SSL_set_bio() has some really complicated ownership rules where BIOs have
3170      * already been set!
3171      */
3172     if (nrbio != NULL
3173         && nrbio != irbio
3174         && (nwbio != iwbio || nrbio != nwbio))
3175         if (!TEST_true(BIO_up_ref(nrbio)))
3176             goto end;
3177     if (nwbio != NULL
3178         && nwbio != nrbio
3179         && (nwbio != iwbio || (nwbio == iwbio && irbio == iwbio)))
3180         if (!TEST_true(BIO_up_ref(nwbio))) {
3181             if (nrbio != irbio
3182                 && (nwbio != iwbio || nrbio != nwbio))
3183                 BIO_free(nrbio);
3184             goto end;
3185         }
3186 
3187     SSL_set_bio(clientssl, nrbio, nwbio);
3188 
3189     testresult = 1;
3190 
3191 end:
3192     BIO_free(bio1);
3193     BIO_free(bio2);
3194 
3195     /*
3196      * This test is checking that the ref counting for SSL_set_bio is correct.
3197      * If we get here and we did too many frees then we will fail in the above
3198      * functions.
3199      */
3200     SSL_free(serverssl);
3201     SSL_free(clientssl);
3202     SSL_CTX_free(sctx);
3203     SSL_CTX_free(cctx);
3204     return testresult;
3205 }
3206 
3207 typedef enum { NO_BIO_CHANGE,
3208     CHANGE_RBIO,
3209     CHANGE_WBIO } bio_change_t;
3210 
3211 static int execute_test_ssl_bio(int pop_ssl, bio_change_t change_bio)
3212 {
3213     BIO *sslbio = NULL, *membio1 = NULL, *membio2 = NULL;
3214     SSL_CTX *ctx;
3215     SSL *ssl = NULL;
3216     int testresult = 0;
3217 
3218     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_method()))
3219         || !TEST_ptr(ssl = SSL_new(ctx))
3220         || !TEST_ptr(sslbio = BIO_new(BIO_f_ssl()))
3221         || !TEST_ptr(membio1 = BIO_new(BIO_s_mem())))
3222         goto end;
3223 
3224     BIO_set_ssl(sslbio, ssl, BIO_CLOSE);
3225 
3226     /*
3227      * If anything goes wrong here then we could leak memory.
3228      */
3229     BIO_push(sslbio, membio1);
3230 
3231     /* Verify changing the rbio/wbio directly does not cause leaks */
3232     if (change_bio != NO_BIO_CHANGE) {
3233         if (!TEST_ptr(membio2 = BIO_new(BIO_s_mem()))) {
3234             ssl = NULL;
3235             goto end;
3236         }
3237         if (change_bio == CHANGE_RBIO)
3238             SSL_set0_rbio(ssl, membio2);
3239         else
3240             SSL_set0_wbio(ssl, membio2);
3241     }
3242     ssl = NULL;
3243 
3244     if (pop_ssl)
3245         BIO_pop(sslbio);
3246     else
3247         BIO_pop(membio1);
3248 
3249     testresult = 1;
3250 end:
3251     BIO_free(membio1);
3252     BIO_free(sslbio);
3253     SSL_free(ssl);
3254     SSL_CTX_free(ctx);
3255 
3256     return testresult;
3257 }
3258 
3259 static int test_ssl_bio_pop_next_bio(void)
3260 {
3261     return execute_test_ssl_bio(0, NO_BIO_CHANGE);
3262 }
3263 
3264 static int test_ssl_bio_pop_ssl_bio(void)
3265 {
3266     return execute_test_ssl_bio(1, NO_BIO_CHANGE);
3267 }
3268 
3269 static int test_ssl_bio_change_rbio(void)
3270 {
3271     return execute_test_ssl_bio(0, CHANGE_RBIO);
3272 }
3273 
3274 static int test_ssl_bio_change_wbio(void)
3275 {
3276     return execute_test_ssl_bio(0, CHANGE_WBIO);
3277 }
3278 
3279 /*
3280  * Regression for GH #30458: tls_set1_bio() must BIO_free_all the old chain
3281  * when the write BIO is replaced, not only the top BIO.
3282  */
3283 static int test_ssl_set_wbio_chain_no_leak(void)
3284 {
3285     SSL_CTX *ctx = NULL;
3286     SSL *ssl = NULL;
3287     BIO *bio = NULL, *filter = NULL, *chain1 = NULL;
3288     int testresult = 0;
3289 
3290     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_method())))
3291         goto end;
3292     if (!TEST_ptr(ssl = SSL_new(ctx)))
3293         goto end;
3294 
3295     if (!TEST_ptr(filter = BIO_new(BIO_f_nbio_test())))
3296         goto end;
3297     if (!TEST_ptr(bio = BIO_new(BIO_s_mem()))) {
3298         BIO_free(filter);
3299         filter = NULL;
3300         goto end;
3301     }
3302     if (!TEST_ptr(chain1 = BIO_push(filter, bio))) {
3303         BIO_free_all(filter);
3304         filter = bio = NULL;
3305         goto end;
3306     }
3307     filter = bio = NULL;
3308 
3309     SSL_set0_wbio(ssl, chain1);
3310     chain1 = NULL;
3311     SSL_set0_wbio(ssl, NULL);
3312 
3313     testresult = 1;
3314 
3315 end:
3316     BIO_free(filter);
3317     BIO_free(bio);
3318     BIO_free(chain1);
3319     SSL_free(ssl);
3320     SSL_CTX_free(ctx);
3321 
3322     return testresult;
3323 }
3324 
3325 #if !defined(OPENSSL_NO_TLS1_2) || defined(OSSL_NO_USABLE_TLS1_3)
3326 typedef struct {
3327     /* The list of sig algs */
3328     const int *list;
3329     /* The length of the list */
3330     size_t listlen;
3331     /* A sigalgs list in string format */
3332     const char *liststr;
3333     /* Whether setting the list should succeed */
3334     int valid;
3335     /* Whether creating a connection with the list should succeed */
3336     int connsuccess;
3337 } sigalgs_list;
3338 
3339 static const int validlist1[] = { NID_sha256, EVP_PKEY_RSA };
3340 #ifndef OPENSSL_NO_EC
3341 static const int validlist2[] = { NID_sha256, EVP_PKEY_RSA, NID_sha512, EVP_PKEY_EC };
3342 static const int validlist3[] = { NID_sha512, EVP_PKEY_EC };
3343 #endif
3344 static const int invalidlist1[] = { NID_undef, EVP_PKEY_RSA };
3345 static const int invalidlist2[] = { NID_sha256, NID_undef };
3346 static const int invalidlist3[] = { NID_sha256, EVP_PKEY_RSA, NID_sha256 };
3347 static const int invalidlist4[] = { NID_sha256 };
3348 static const sigalgs_list testsigalgs[] = {
3349     { validlist1, OSSL_NELEM(validlist1), NULL, 1, 1 },
3350 #ifndef OPENSSL_NO_EC
3351     { validlist2, OSSL_NELEM(validlist2), NULL, 1, 1 },
3352     { validlist3, OSSL_NELEM(validlist3), NULL, 1, 0 },
3353 #endif
3354     { NULL, 0, "RSA+SHA256", 1, 1 },
3355     { NULL, 0, "RSA+SHA256:?Invalid", 1, 1 },
3356 #ifndef OPENSSL_NO_EC
3357     { NULL, 0, "RSA+SHA256:ECDSA+SHA512", 1, 1 },
3358     { NULL, 0, "ECDSA+SHA512", 1, 0 },
3359 #endif
3360     { invalidlist1, OSSL_NELEM(invalidlist1), NULL, 0, 0 },
3361     { invalidlist2, OSSL_NELEM(invalidlist2), NULL, 0, 0 },
3362     { invalidlist3, OSSL_NELEM(invalidlist3), NULL, 0, 0 },
3363     { invalidlist4, OSSL_NELEM(invalidlist4), NULL, 0, 0 },
3364     { NULL, 0, "RSA", 0, 0 },
3365     { NULL, 0, "SHA256", 0, 0 },
3366     { NULL, 0, "RSA+SHA256:SHA256", 0, 0 },
3367     { NULL, 0, "Invalid", 0, 0 }
3368 };
3369 
3370 static int test_set_sigalgs(int idx)
3371 {
3372     SSL_CTX *cctx = NULL, *sctx = NULL;
3373     SSL *clientssl = NULL, *serverssl = NULL;
3374     int testresult = 0;
3375     const sigalgs_list *curr;
3376     int testctx;
3377 
3378     /* Should never happen */
3379     if (!TEST_size_t_le((size_t)idx, OSSL_NELEM(testsigalgs) * 2))
3380         return 0;
3381 
3382     testctx = ((size_t)idx < OSSL_NELEM(testsigalgs));
3383     curr = testctx ? &testsigalgs[idx]
3384                    : &testsigalgs[idx - OSSL_NELEM(testsigalgs)];
3385 
3386     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3387             TLS_client_method(), TLS1_VERSION, 0,
3388             &sctx, &cctx, cert, privkey)))
3389         return 0;
3390 
3391     SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
3392 
3393     if (testctx) {
3394         int ret;
3395 
3396         if (curr->list != NULL)
3397             ret = SSL_CTX_set1_sigalgs(cctx, curr->list, curr->listlen);
3398         else
3399             ret = SSL_CTX_set1_sigalgs_list(cctx, curr->liststr);
3400 
3401         if (!ret) {
3402             if (curr->valid)
3403                 TEST_info("Failure setting sigalgs in SSL_CTX (%d)\n", idx);
3404             else
3405                 testresult = 1;
3406             goto end;
3407         }
3408         if (!curr->valid) {
3409             TEST_info("Not-failed setting sigalgs in SSL_CTX (%d)\n", idx);
3410             goto end;
3411         }
3412     }
3413 
3414     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3415             &clientssl, NULL, NULL)))
3416         goto end;
3417 
3418     if (!testctx) {
3419         int ret;
3420 
3421         if (curr->list != NULL)
3422             ret = SSL_set1_sigalgs(clientssl, curr->list, curr->listlen);
3423         else
3424             ret = SSL_set1_sigalgs_list(clientssl, curr->liststr);
3425         if (!ret) {
3426             if (curr->valid)
3427                 TEST_info("Failure setting sigalgs in SSL (%d)\n", idx);
3428             else
3429                 testresult = 1;
3430             goto end;
3431         }
3432         if (!curr->valid)
3433             goto end;
3434     }
3435 
3436     if (!TEST_int_eq(create_ssl_connection(serverssl, clientssl,
3437                          SSL_ERROR_NONE),
3438             curr->connsuccess))
3439         goto end;
3440 
3441     testresult = 1;
3442 
3443 end:
3444     SSL_free(serverssl);
3445     SSL_free(clientssl);
3446     SSL_CTX_free(sctx);
3447     SSL_CTX_free(cctx);
3448 
3449     return testresult;
3450 }
3451 #endif
3452 
3453 #ifndef OSSL_NO_USABLE_TLS1_3
3454 static int psk_client_cb_cnt = 0;
3455 static int psk_server_cb_cnt = 0;
3456 
3457 static int use_session_cb(SSL *ssl, const EVP_MD *md, const unsigned char **id,
3458     size_t *idlen, SSL_SESSION **sess)
3459 {
3460     switch (++use_session_cb_cnt) {
3461     case 1:
3462         /* The first call should always have a NULL md */
3463         if (md != NULL)
3464             return 0;
3465         break;
3466 
3467     case 2:
3468         /* The second call should always have an md */
3469         if (md == NULL)
3470             return 0;
3471         break;
3472 
3473     default:
3474         /* We should only be called a maximum of twice */
3475         return 0;
3476     }
3477 
3478     if (clientpsk != NULL && !SSL_SESSION_up_ref(clientpsk))
3479         return 0;
3480 
3481     *sess = clientpsk;
3482     *id = (const unsigned char *)pskid;
3483     *idlen = strlen(pskid);
3484 
3485     return 1;
3486 }
3487 
3488 #ifndef OPENSSL_NO_PSK
3489 static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *id,
3490     unsigned int max_id_len,
3491     unsigned char *psk,
3492     unsigned int max_psk_len)
3493 {
3494     unsigned int psklen = 0;
3495 
3496     psk_client_cb_cnt++;
3497 
3498     if (strlen(pskid) + 1 > max_id_len)
3499         return 0;
3500 
3501     /* We should only ever be called a maximum of twice per connection */
3502     if (psk_client_cb_cnt > 2)
3503         return 0;
3504 
3505     if (clientpsk == NULL)
3506         return 0;
3507 
3508     /* We'll reuse the PSK we set up for TLSv1.3 */
3509     if (SSL_SESSION_get_master_key(clientpsk, NULL, 0) > max_psk_len)
3510         return 0;
3511     psklen = SSL_SESSION_get_master_key(clientpsk, psk, max_psk_len);
3512     strncpy(id, pskid, max_id_len);
3513 
3514     return psklen;
3515 }
3516 #endif /* OPENSSL_NO_PSK */
3517 
3518 static int find_session_cb(SSL *ssl, const unsigned char *identity,
3519     size_t identity_len, SSL_SESSION **sess)
3520 {
3521     find_session_cb_cnt++;
3522 
3523     /* We should only ever be called a maximum of twice per connection */
3524     if (find_session_cb_cnt > 2)
3525         return 0;
3526 
3527     if (serverpsk == NULL)
3528         return 0;
3529 
3530     /* Identity should match that set by the client */
3531     if (strlen(srvid) != identity_len
3532         || strncmp(srvid, (const char *)identity, identity_len) != 0) {
3533         /* No PSK found, continue but without a PSK */
3534         *sess = NULL;
3535         return 1;
3536     }
3537 
3538     if (!SSL_SESSION_up_ref(serverpsk))
3539         return 0;
3540 
3541     *sess = serverpsk;
3542 
3543     return 1;
3544 }
3545 
3546 #ifndef OPENSSL_NO_PSK
3547 static unsigned int psk_server_cb(SSL *ssl, const char *identity,
3548     unsigned char *psk, unsigned int max_psk_len)
3549 {
3550     unsigned int psklen = 0;
3551 
3552     psk_server_cb_cnt++;
3553 
3554     /* We should only ever be called a maximum of twice per connection */
3555     if (find_session_cb_cnt > 2)
3556         return 0;
3557 
3558     if (serverpsk == NULL)
3559         return 0;
3560 
3561     /* Identity should match that set by the client */
3562     if (strcmp(srvid, identity) != 0) {
3563         return 0;
3564     }
3565 
3566     /* We'll reuse the PSK we set up for TLSv1.3 */
3567     if (SSL_SESSION_get_master_key(serverpsk, NULL, 0) > max_psk_len)
3568         return 0;
3569     psklen = SSL_SESSION_get_master_key(serverpsk, psk, max_psk_len);
3570 
3571     return psklen;
3572 }
3573 #endif /* OPENSSL_NO_PSK */
3574 
3575 #define MSG1 "Hello"
3576 #define MSG2 "World."
3577 #define MSG3 "This"
3578 #define MSG4 "is"
3579 #define MSG5 "a"
3580 #define MSG6 "test"
3581 #define MSG7 "message."
3582 
3583 static int artificial_ticket_time = 0;
3584 
3585 static int sub_session_time(SSL_SESSION *sess)
3586 {
3587     OSSL_TIME tick_time;
3588 
3589     tick_time = ossl_time_from_time_t(SSL_SESSION_get_time_ex(sess));
3590     tick_time = ossl_time_subtract(tick_time, ossl_seconds2time(10));
3591 
3592     return SSL_SESSION_set_time_ex(sess, ossl_time_to_time_t(tick_time)) != 0;
3593 }
3594 
3595 static int ed_gen_cb(SSL *s, void *arg)
3596 {
3597     SSL_SESSION *sess = SSL_get0_session(s);
3598 
3599     if (sess == NULL)
3600         return 0;
3601 
3602     /*
3603      * Artificially give the ticket some age. Just do it for the number of
3604      * tickets we've been told to do.
3605      */
3606     if (artificial_ticket_time == 0)
3607         return 1;
3608     artificial_ticket_time--;
3609 
3610     return sub_session_time(sess);
3611 }
3612 
3613 /*
3614  * Helper method to setup objects for early data test. Caller frees objects on
3615  * error.
3616  */
3617 static int setupearly_data_test(SSL_CTX **cctx, SSL_CTX **sctx, SSL **clientssl,
3618     SSL **serverssl, SSL_SESSION **sess, int idx,
3619     size_t mdsize)
3620 {
3621     int artificial = (artificial_ticket_time > 0);
3622 
3623     if (*sctx == NULL
3624         && !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3625             TLS_client_method(),
3626             TLS1_VERSION, 0,
3627             sctx, cctx, cert, privkey)))
3628         return 0;
3629 
3630     if (artificial)
3631         SSL_CTX_set_session_ticket_cb(*sctx, ed_gen_cb, NULL, NULL);
3632 
3633     if (!TEST_true(SSL_CTX_set_max_early_data(*sctx, SSL3_RT_MAX_PLAIN_LENGTH)))
3634         return 0;
3635 
3636     if (idx == 1) {
3637         /* When idx == 1 we repeat the tests with read_ahead set */
3638         SSL_CTX_set_read_ahead(*cctx, 1);
3639         SSL_CTX_set_read_ahead(*sctx, 1);
3640     } else if (idx == 2) {
3641         /* When idx == 2 we are doing early_data with a PSK. Set up callbacks */
3642         SSL_CTX_set_psk_use_session_callback(*cctx, use_session_cb);
3643         SSL_CTX_set_psk_find_session_callback(*sctx, find_session_cb);
3644         use_session_cb_cnt = 0;
3645         find_session_cb_cnt = 0;
3646         srvid = pskid;
3647     }
3648 
3649     if (!TEST_true(create_ssl_objects(*sctx, *cctx, serverssl, clientssl,
3650             NULL, NULL)))
3651         return 0;
3652 
3653     /*
3654      * For one of the run throughs (doesn't matter which one), we'll try sending
3655      * some SNI data in the initial ClientHello. This will be ignored (because
3656      * there is no SNI cb set up by the server), so it should not impact
3657      * early_data.
3658      */
3659     if (idx == 1
3660         && !TEST_true(SSL_set_tlsext_host_name(*clientssl, "localhost")))
3661         return 0;
3662 
3663     if (idx == 2) {
3664         clientpsk = create_a_psk(*clientssl, mdsize);
3665         if (!TEST_ptr(clientpsk)
3666             /*
3667              * We just choose an arbitrary value for max_early_data which
3668              * should be big enough for testing purposes.
3669              */
3670             || !TEST_true(SSL_SESSION_set_max_early_data(clientpsk,
3671                 0x100))
3672             || !TEST_true(SSL_SESSION_up_ref(clientpsk))) {
3673             SSL_SESSION_free(clientpsk);
3674             clientpsk = NULL;
3675             return 0;
3676         }
3677         serverpsk = clientpsk;
3678 
3679         if (sess != NULL) {
3680             if (!TEST_true(SSL_SESSION_up_ref(clientpsk))) {
3681                 SSL_SESSION_free(clientpsk);
3682                 SSL_SESSION_free(serverpsk);
3683                 clientpsk = serverpsk = NULL;
3684                 return 0;
3685             }
3686             *sess = clientpsk;
3687         }
3688         return 1;
3689     }
3690 
3691     if (sess == NULL)
3692         return 1;
3693 
3694     if (!TEST_true(create_ssl_connection(*serverssl, *clientssl,
3695             SSL_ERROR_NONE)))
3696         return 0;
3697 
3698     *sess = SSL_get1_session(*clientssl);
3699     SSL_shutdown(*clientssl);
3700     SSL_shutdown(*serverssl);
3701     SSL_free(*serverssl);
3702     SSL_free(*clientssl);
3703     *serverssl = *clientssl = NULL;
3704 
3705     /*
3706      * Artificially give the ticket some age to match the artificial age we
3707      * gave it on the server side
3708      */
3709     if (artificial
3710         && !TEST_true(sub_session_time(*sess)))
3711         return 0;
3712 
3713     if (!TEST_true(create_ssl_objects(*sctx, *cctx, serverssl,
3714             clientssl, NULL, NULL))
3715         || !TEST_true(SSL_set_session(*clientssl, *sess)))
3716         return 0;
3717 
3718     return 1;
3719 }
3720 
3721 static int check_early_data_timeout(OSSL_TIME timer)
3722 {
3723     int res = 0;
3724 
3725     /*
3726      * Early data is time sensitive. We have an approx 8 second allowance
3727      * between writing the early data and reading it. If we exceed that time
3728      * then this test will fail. This can sometimes (rarely) occur in normal CI
3729      * operation. We can try and detect this and just ignore the result of this
3730      * test if it has taken too long. We assume anything over 7 seconds is too
3731      * long
3732      */
3733     timer = ossl_time_subtract(ossl_time_now(), timer);
3734     if (ossl_time_compare(timer, ossl_seconds2time(7)) >= 0)
3735         res = TEST_skip("Test took too long, ignoring result");
3736 
3737     return res;
3738 }
3739 
3740 static int test_early_data_read_write(int idx)
3741 {
3742     SSL_CTX *cctx = NULL, *sctx = NULL;
3743     SSL *clientssl = NULL, *serverssl = NULL;
3744     int testresult = 0;
3745     SSL_SESSION *sess = NULL;
3746     unsigned char buf[20], data[1024];
3747     size_t readbytes, written, eoedlen, rawread, rawwritten;
3748     BIO *rbio;
3749     OSSL_TIME timer;
3750 
3751     /* Artificially give the next 2 tickets some age for non PSK sessions */
3752     if (idx != 2)
3753         artificial_ticket_time = 2;
3754     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3755             &serverssl, &sess, idx,
3756             SHA384_DIGEST_LENGTH))) {
3757         artificial_ticket_time = 0;
3758         goto end;
3759     }
3760     artificial_ticket_time = 0;
3761 
3762     /* Write and read some early data */
3763     timer = ossl_time_now();
3764     if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3765             &written))
3766         || !TEST_size_t_eq(written, strlen(MSG1)))
3767         goto end;
3768 
3769     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3770                          &readbytes),
3771             SSL_READ_EARLY_DATA_SUCCESS)) {
3772         testresult = check_early_data_timeout(timer);
3773         goto end;
3774     }
3775 
3776     if (!TEST_mem_eq(MSG1, readbytes, buf, strlen(MSG1))
3777         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3778             SSL_EARLY_DATA_ACCEPTED))
3779         goto end;
3780 
3781     /*
3782      * Server should be able to write data, and client should be able to
3783      * read it.
3784      */
3785     if (!TEST_true(SSL_write_early_data(serverssl, MSG2, strlen(MSG2),
3786             &written))
3787         || !TEST_size_t_eq(written, strlen(MSG2))
3788         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3789         || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
3790         goto end;
3791 
3792     /* Even after reading normal data, client should be able write early data */
3793     if (!TEST_true(SSL_write_early_data(clientssl, MSG3, strlen(MSG3),
3794             &written))
3795         || !TEST_size_t_eq(written, strlen(MSG3)))
3796         goto end;
3797 
3798     /* Server should still be able read early data after writing data */
3799     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3800                          &readbytes),
3801             SSL_READ_EARLY_DATA_SUCCESS)
3802         || !TEST_mem_eq(buf, readbytes, MSG3, strlen(MSG3)))
3803         goto end;
3804 
3805     /* Write more data from server and read it from client */
3806     if (!TEST_true(SSL_write_early_data(serverssl, MSG4, strlen(MSG4),
3807             &written))
3808         || !TEST_size_t_eq(written, strlen(MSG4))
3809         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3810         || !TEST_mem_eq(buf, readbytes, MSG4, strlen(MSG4)))
3811         goto end;
3812 
3813     /*
3814      * If client writes normal data it should mean writing early data is no
3815      * longer possible.
3816      */
3817     if (!TEST_true(SSL_write_ex(clientssl, MSG5, strlen(MSG5), &written))
3818         || !TEST_size_t_eq(written, strlen(MSG5))
3819         || !TEST_int_eq(SSL_get_early_data_status(clientssl),
3820             SSL_EARLY_DATA_ACCEPTED))
3821         goto end;
3822 
3823     /*
3824      * At this point the client has written EndOfEarlyData, ClientFinished and
3825      * normal (fully protected) data. We are going to cause a delay between the
3826      * arrival of EndOfEarlyData and ClientFinished. We read out all the data
3827      * in the read BIO, and then just put back the EndOfEarlyData message.
3828      */
3829     rbio = SSL_get_rbio(serverssl);
3830     if (!TEST_true(BIO_read_ex(rbio, data, sizeof(data), &rawread))
3831         || !TEST_size_t_lt(rawread, sizeof(data))
3832         || !TEST_size_t_gt(rawread, SSL3_RT_HEADER_LENGTH))
3833         goto end;
3834 
3835     /* Record length is in the 4th and 5th bytes of the record header */
3836     eoedlen = SSL3_RT_HEADER_LENGTH + (data[3] << 8 | data[4]);
3837     if (!TEST_true(BIO_write_ex(rbio, data, eoedlen, &rawwritten))
3838         || !TEST_size_t_eq(rawwritten, eoedlen))
3839         goto end;
3840 
3841     /* Server should be told that there is no more early data */
3842     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3843                          &readbytes),
3844             SSL_READ_EARLY_DATA_FINISH)
3845         || !TEST_size_t_eq(readbytes, 0))
3846         goto end;
3847 
3848     /*
3849      * Server has not finished init yet, so should still be able to write early
3850      * data.
3851      */
3852     if (!TEST_true(SSL_write_early_data(serverssl, MSG6, strlen(MSG6),
3853             &written))
3854         || !TEST_size_t_eq(written, strlen(MSG6)))
3855         goto end;
3856 
3857     /* Push the ClientFinished and the normal data back into the server rbio */
3858     if (!TEST_true(BIO_write_ex(rbio, data + eoedlen, rawread - eoedlen,
3859             &rawwritten))
3860         || !TEST_size_t_eq(rawwritten, rawread - eoedlen))
3861         goto end;
3862 
3863     /* Server should be able to read normal data */
3864     if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3865         || !TEST_size_t_eq(readbytes, strlen(MSG5)))
3866         goto end;
3867 
3868     /* Client and server should not be able to write/read early data now */
3869     if (!TEST_false(SSL_write_early_data(clientssl, MSG6, strlen(MSG6),
3870             &written)))
3871         goto end;
3872     ERR_clear_error();
3873     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3874                          &readbytes),
3875             SSL_READ_EARLY_DATA_ERROR))
3876         goto end;
3877     ERR_clear_error();
3878 
3879     /* Client should be able to read the data sent by the server */
3880     if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3881         || !TEST_mem_eq(buf, readbytes, MSG6, strlen(MSG6)))
3882         goto end;
3883 
3884     /*
3885      * Make sure we process the two NewSessionTickets. These arrive
3886      * post-handshake. We attempt reads which we do not expect to return any
3887      * data.
3888      */
3889     if (!TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3890         || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf),
3891             &readbytes)))
3892         goto end;
3893 
3894     /* Server should be able to write normal data */
3895     if (!TEST_true(SSL_write_ex(serverssl, MSG7, strlen(MSG7), &written))
3896         || !TEST_size_t_eq(written, strlen(MSG7))
3897         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3898         || !TEST_mem_eq(buf, readbytes, MSG7, strlen(MSG7)))
3899         goto end;
3900 
3901     SSL_SESSION_free(sess);
3902     sess = SSL_get1_session(clientssl);
3903     use_session_cb_cnt = 0;
3904     find_session_cb_cnt = 0;
3905 
3906     SSL_shutdown(clientssl);
3907     SSL_shutdown(serverssl);
3908     SSL_free(serverssl);
3909     SSL_free(clientssl);
3910     serverssl = clientssl = NULL;
3911     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3912             &clientssl, NULL, NULL))
3913         || !TEST_true(SSL_set_session(clientssl, sess)))
3914         goto end;
3915 
3916     /* Write and read some early data */
3917     if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3918             &written))
3919         || !TEST_size_t_eq(written, strlen(MSG1))
3920         || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3921                             &readbytes),
3922             SSL_READ_EARLY_DATA_SUCCESS)
3923         || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1)))
3924         goto end;
3925 
3926     if (!TEST_int_gt(SSL_connect(clientssl), 0)
3927         || !TEST_int_gt(SSL_accept(serverssl), 0))
3928         goto end;
3929 
3930     /* Client and server should not be able to write/read early data now */
3931     if (!TEST_false(SSL_write_early_data(clientssl, MSG6, strlen(MSG6),
3932             &written)))
3933         goto end;
3934     ERR_clear_error();
3935     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3936                          &readbytes),
3937             SSL_READ_EARLY_DATA_ERROR))
3938         goto end;
3939     ERR_clear_error();
3940 
3941     /* Client and server should be able to write/read normal data */
3942     if (!TEST_true(SSL_write_ex(clientssl, MSG5, strlen(MSG5), &written))
3943         || !TEST_size_t_eq(written, strlen(MSG5))
3944         || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3945         || !TEST_size_t_eq(readbytes, strlen(MSG5)))
3946         goto end;
3947 
3948     testresult = 1;
3949 
3950 end:
3951     SSL_SESSION_free(sess);
3952     SSL_SESSION_free(clientpsk);
3953     SSL_SESSION_free(serverpsk);
3954     clientpsk = serverpsk = NULL;
3955     SSL_free(serverssl);
3956     SSL_free(clientssl);
3957     SSL_CTX_free(sctx);
3958     SSL_CTX_free(cctx);
3959     return testresult;
3960 }
3961 
3962 static int allow_ed_cb_called = 0;
3963 
3964 static int allow_early_data_cb(SSL *s, void *arg)
3965 {
3966     int *usecb = (int *)arg;
3967 
3968     allow_ed_cb_called++;
3969 
3970     if (*usecb == 1)
3971         return 0;
3972 
3973     return 1;
3974 }
3975 
3976 /*
3977  * idx == 0: Standard early_data setup
3978  * idx == 1: early_data setup using read_ahead
3979  * usecb == 0: Don't use a custom early data callback
3980  * usecb == 1: Use a custom early data callback and reject the early data
3981  * usecb == 2: Use a custom early data callback and accept the early data
3982  * confopt == 0: Configure anti-replay directly
3983  * confopt == 1: Configure anti-replay using SSL_CONF
3984  */
3985 static int test_early_data_replay_int(int idx, int usecb, int confopt)
3986 {
3987     SSL_CTX *cctx = NULL, *sctx = NULL;
3988     SSL *clientssl = NULL, *serverssl = NULL;
3989     int testresult = 0;
3990     SSL_SESSION *sess = NULL;
3991     size_t readbytes, written;
3992     unsigned char buf[20];
3993     OSSL_TIME timer;
3994 
3995     allow_ed_cb_called = 0;
3996 
3997     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
3998             TLS_client_method(), TLS1_VERSION, 0,
3999             &sctx, &cctx, cert, privkey)))
4000         return 0;
4001 
4002     if (usecb > 0) {
4003         if (confopt == 0) {
4004             SSL_CTX_set_options(sctx, SSL_OP_NO_ANTI_REPLAY);
4005         } else {
4006             SSL_CONF_CTX *confctx = SSL_CONF_CTX_new();
4007 
4008             if (!TEST_ptr(confctx))
4009                 goto end;
4010             SSL_CONF_CTX_set_flags(confctx, SSL_CONF_FLAG_FILE | SSL_CONF_FLAG_SERVER);
4011             SSL_CONF_CTX_set_ssl_ctx(confctx, sctx);
4012             if (!TEST_int_eq(SSL_CONF_cmd(confctx, "Options", "-AntiReplay"),
4013                     2)) {
4014                 SSL_CONF_CTX_free(confctx);
4015                 goto end;
4016             }
4017             SSL_CONF_CTX_free(confctx);
4018         }
4019         SSL_CTX_set_allow_early_data_cb(sctx, allow_early_data_cb, &usecb);
4020     }
4021 
4022     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4023             &serverssl, &sess, idx,
4024             SHA384_DIGEST_LENGTH)))
4025         goto end;
4026 
4027     /*
4028      * The server is configured to accept early data. Create a connection to
4029      * "use up" the ticket
4030      */
4031     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
4032         || !TEST_true(SSL_session_reused(clientssl)))
4033         goto end;
4034 
4035     SSL_shutdown(clientssl);
4036     SSL_shutdown(serverssl);
4037     SSL_free(serverssl);
4038     SSL_free(clientssl);
4039     serverssl = clientssl = NULL;
4040 
4041     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
4042             &clientssl, NULL, NULL))
4043         || !TEST_true(SSL_set_session(clientssl, sess)))
4044         goto end;
4045 
4046     /* Write and read some early data */
4047     timer = ossl_time_now();
4048     if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4049             &written))
4050         || !TEST_size_t_eq(written, strlen(MSG1)))
4051         goto end;
4052 
4053     if (usecb <= 1) {
4054         if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4055                              &readbytes),
4056                 SSL_READ_EARLY_DATA_FINISH)
4057             /*
4058              * The ticket was reused, so the we should have rejected the
4059              * early data
4060              */
4061             || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4062                 SSL_EARLY_DATA_REJECTED))
4063             goto end;
4064     } else {
4065         /* In this case the callback decides to accept the early data */
4066         if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4067                              &readbytes),
4068                 SSL_READ_EARLY_DATA_SUCCESS)) {
4069             testresult = check_early_data_timeout(timer);
4070             goto end;
4071         }
4072         if (!TEST_mem_eq(MSG1, strlen(MSG1), buf, readbytes)
4073             /*
4074              * Server will have sent its flight so client can now send
4075              * end of early data and complete its half of the handshake
4076              */
4077             || !TEST_int_gt(SSL_connect(clientssl), 0)
4078             || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4079                                 &readbytes),
4080                 SSL_READ_EARLY_DATA_FINISH)
4081             || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4082                 SSL_EARLY_DATA_ACCEPTED))
4083             goto end;
4084     }
4085 
4086     /* Complete the connection */
4087     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
4088         || !TEST_int_eq(SSL_session_reused(clientssl), (usecb > 0) ? 1 : 0)
4089         || !TEST_int_eq(allow_ed_cb_called, usecb > 0 ? 1 : 0))
4090         goto end;
4091 
4092     testresult = 1;
4093 
4094 end:
4095     SSL_SESSION_free(sess);
4096     SSL_SESSION_free(clientpsk);
4097     SSL_SESSION_free(serverpsk);
4098     clientpsk = serverpsk = NULL;
4099     SSL_free(serverssl);
4100     SSL_free(clientssl);
4101     SSL_CTX_free(sctx);
4102     SSL_CTX_free(cctx);
4103     return testresult;
4104 }
4105 
4106 static int test_early_data_replay(int idx)
4107 {
4108     int ret = 1, usecb, confopt;
4109 
4110     for (usecb = 0; usecb < 3; usecb++) {
4111         for (confopt = 0; confopt < 2; confopt++)
4112             ret &= test_early_data_replay_int(idx, usecb, confopt);
4113     }
4114 
4115     return ret;
4116 }
4117 
4118 static const char *ciphersuites[] = {
4119     "TLS_AES_128_CCM_8_SHA256",
4120     "TLS_AES_128_GCM_SHA256",
4121     "TLS_AES_256_GCM_SHA384",
4122     "TLS_AES_128_CCM_SHA256",
4123 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
4124     "TLS_CHACHA20_POLY1305_SHA256",
4125 #else
4126     NULL,
4127 #endif
4128 #if !defined(OPENSSL_NO_INTEGRITY_ONLY_CIPHERS)
4129     "TLS_SHA256_SHA256",
4130     "TLS_SHA384_SHA384"
4131 #endif
4132 };
4133 
4134 /*
4135  * Helper function to test that a server attempting to read early data can
4136  * handle a connection from a client where the early data should be skipped.
4137  * testtype: 0 == No HRR
4138  * testtype: 1 == HRR
4139  * testtype: 2 == HRR, invalid early_data sent after HRR
4140  * testtype: 3 == recv_max_early_data set to 0
4141  */
4142 static int early_data_skip_helper(int testtype, int cipher, int idx)
4143 {
4144     SSL_CTX *cctx = NULL, *sctx = NULL;
4145     SSL *clientssl = NULL, *serverssl = NULL;
4146     int testresult = 0;
4147     SSL_SESSION *sess = NULL;
4148     unsigned char buf[20];
4149     size_t readbytes, written;
4150 
4151     if (is_fips && cipher >= 4)
4152         return 1;
4153 
4154     if (ciphersuites[cipher] == NULL)
4155         return TEST_skip("Cipher not supported");
4156 
4157     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
4158             TLS_client_method(),
4159             TLS1_VERSION, 0,
4160             &sctx, &cctx, cert, privkey)))
4161         goto end;
4162 
4163     if (cipher == 0 || cipher == 5 || cipher == 6) {
4164         SSL_CTX_set_security_level(sctx, 0);
4165         SSL_CTX_set_security_level(cctx, 0);
4166     }
4167 
4168     if (!TEST_true(SSL_CTX_set_ciphersuites(sctx, ciphersuites[cipher]))
4169         || !TEST_true(SSL_CTX_set_ciphersuites(cctx, ciphersuites[cipher])))
4170         goto end;
4171 
4172     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4173             &serverssl, &sess, idx,
4174             (cipher == 2 || cipher == 6)
4175                 ? SHA384_DIGEST_LENGTH
4176                 : SHA256_DIGEST_LENGTH)))
4177         goto end;
4178 
4179     if (testtype == 1 || testtype == 2) {
4180         /* Force an HRR to occur */
4181 #if defined(OPENSSL_NO_EC)
4182         if (!TEST_true(SSL_set1_groups_list(serverssl, "ffdhe3072")))
4183             goto end;
4184 #else
4185         if (!TEST_true(SSL_set1_groups_list(serverssl, "P-384")))
4186             goto end;
4187 #endif
4188     } else if (idx == 2) {
4189         /*
4190          * We force early_data rejection by ensuring the PSK identity is
4191          * unrecognised
4192          */
4193         srvid = "Dummy Identity";
4194     } else {
4195         /*
4196          * Deliberately corrupt the creation time. We take 20 seconds off the
4197          * time. It could be any value as long as it is not within tolerance.
4198          * This should mean the ticket is rejected.
4199          */
4200         if (!TEST_true(SSL_SESSION_set_time_ex(sess, time(NULL) - 20)))
4201             goto end;
4202     }
4203 
4204     if (testtype == 3
4205         && !TEST_true(SSL_set_recv_max_early_data(serverssl, 0)))
4206         goto end;
4207 
4208     /* Write some early data */
4209     if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4210             &written))
4211         || !TEST_size_t_eq(written, strlen(MSG1)))
4212         goto end;
4213 
4214     /* Server should reject the early data */
4215     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4216                          &readbytes),
4217             SSL_READ_EARLY_DATA_FINISH)
4218         || !TEST_size_t_eq(readbytes, 0)
4219         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4220             SSL_EARLY_DATA_REJECTED))
4221         goto end;
4222 
4223     switch (testtype) {
4224     case 0:
4225         /* Nothing to do */
4226         break;
4227 
4228     case 1:
4229         /*
4230          * Finish off the handshake. We perform the same writes and reads as
4231          * further down but we expect them to fail due to the incomplete
4232          * handshake.
4233          */
4234         if (!TEST_false(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
4235             || !TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf),
4236                 &readbytes)))
4237             goto end;
4238         break;
4239 
4240     case 2: {
4241         BIO *wbio = SSL_get_wbio(clientssl);
4242         /* A record that will appear as bad early_data */
4243         const unsigned char bad_early_data[] = {
4244             0x17, 0x03, 0x03, 0x00, 0x01, 0x00
4245         };
4246 
4247         /*
4248          * We force the client to attempt a write. This will fail because
4249          * we're still in the handshake. It will cause the second
4250          * ClientHello to be sent.
4251          */
4252         if (!TEST_false(SSL_write_ex(clientssl, MSG2, strlen(MSG2),
4253                 &written)))
4254             goto end;
4255 
4256         /*
4257          * Inject some early_data after the second ClientHello. This should
4258          * cause the server to fail
4259          */
4260         if (!TEST_true(BIO_write_ex(wbio, bad_early_data,
4261                 sizeof(bad_early_data), &written)))
4262             goto end;
4263     }
4264         /* FALLTHROUGH */
4265 
4266     case 3:
4267         /*
4268          * This client has sent more early_data than we are willing to skip
4269          * (case 3) or sent invalid early_data (case 2) so the connection should
4270          * abort.
4271          */
4272         if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4273             || !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_SSL))
4274             goto end;
4275 
4276         /* Connection has failed - nothing more to do */
4277         testresult = 1;
4278         goto end;
4279 
4280     default:
4281         TEST_error("Invalid test type");
4282         goto end;
4283     }
4284 
4285     ERR_clear_error();
4286     /*
4287      * Should be able to send normal data despite rejection of early data. The
4288      * early_data should be skipped.
4289      */
4290     if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
4291         || !TEST_size_t_eq(written, strlen(MSG2))
4292         || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4293             SSL_EARLY_DATA_REJECTED)
4294         || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4295         || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4296         goto end;
4297 
4298     /*
4299      * Failure to decrypt early data records should not leave spurious errors
4300      * on the error stack
4301      */
4302     if (!TEST_long_eq(ERR_peek_error(), 0))
4303         goto end;
4304 
4305     testresult = 1;
4306 
4307 end:
4308     SSL_SESSION_free(clientpsk);
4309     SSL_SESSION_free(serverpsk);
4310     clientpsk = serverpsk = NULL;
4311     SSL_SESSION_free(sess);
4312     SSL_free(serverssl);
4313     SSL_free(clientssl);
4314     SSL_CTX_free(sctx);
4315     SSL_CTX_free(cctx);
4316     return testresult;
4317 }
4318 
4319 /*
4320  * Test that a server attempting to read early data can handle a connection
4321  * from a client where the early data is not acceptable.
4322  */
4323 static int test_early_data_skip(int idx)
4324 {
4325     return early_data_skip_helper(0,
4326         idx % OSSL_NELEM(ciphersuites),
4327         idx / OSSL_NELEM(ciphersuites));
4328 }
4329 
4330 /*
4331  * Test that a server attempting to read early data can handle a connection
4332  * from a client where an HRR occurs.
4333  */
4334 static int test_early_data_skip_hrr(int idx)
4335 {
4336     return early_data_skip_helper(1,
4337         idx % OSSL_NELEM(ciphersuites),
4338         idx / OSSL_NELEM(ciphersuites));
4339 }
4340 
4341 /*
4342  * Test that a server attempting to read early data can handle a connection
4343  * from a client where an HRR occurs and correctly fails if early_data is sent
4344  * after the HRR
4345  */
4346 static int test_early_data_skip_hrr_fail(int idx)
4347 {
4348     return early_data_skip_helper(2,
4349         idx % OSSL_NELEM(ciphersuites),
4350         idx / OSSL_NELEM(ciphersuites));
4351 }
4352 
4353 /*
4354  * Test that a server attempting to read early data will abort if it tries to
4355  * skip over too much.
4356  */
4357 static int test_early_data_skip_abort(int idx)
4358 {
4359     return early_data_skip_helper(3,
4360         idx % OSSL_NELEM(ciphersuites),
4361         idx / OSSL_NELEM(ciphersuites));
4362 }
4363 
4364 /*
4365  * Test that a server attempting to read early data can handle a connection
4366  * from a client that doesn't send any.
4367  */
4368 static int test_early_data_not_sent(int idx)
4369 {
4370     SSL_CTX *cctx = NULL, *sctx = NULL;
4371     SSL *clientssl = NULL, *serverssl = NULL;
4372     int testresult = 0;
4373     SSL_SESSION *sess = NULL;
4374     unsigned char buf[20];
4375     size_t readbytes, written;
4376 
4377     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4378             &serverssl, &sess, idx,
4379             SHA384_DIGEST_LENGTH)))
4380         goto end;
4381 
4382     /* Write some data - should block due to handshake with server */
4383     SSL_set_connect_state(clientssl);
4384     if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written)))
4385         goto end;
4386 
4387     /* Server should detect that early data has not been sent */
4388     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4389                          &readbytes),
4390             SSL_READ_EARLY_DATA_FINISH)
4391         || !TEST_size_t_eq(readbytes, 0)
4392         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4393             SSL_EARLY_DATA_NOT_SENT)
4394         || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4395             SSL_EARLY_DATA_NOT_SENT))
4396         goto end;
4397 
4398     /* Continue writing the message we started earlier */
4399     if (!TEST_true(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
4400         || !TEST_size_t_eq(written, strlen(MSG1))
4401         || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4402         || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
4403         || !SSL_write_ex(serverssl, MSG2, strlen(MSG2), &written)
4404         || !TEST_size_t_eq(written, strlen(MSG2)))
4405         goto end;
4406 
4407     if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
4408         || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4409         goto end;
4410 
4411     testresult = 1;
4412 
4413 end:
4414     SSL_SESSION_free(sess);
4415     SSL_SESSION_free(clientpsk);
4416     SSL_SESSION_free(serverpsk);
4417     clientpsk = serverpsk = NULL;
4418     SSL_free(serverssl);
4419     SSL_free(clientssl);
4420     SSL_CTX_free(sctx);
4421     SSL_CTX_free(cctx);
4422     return testresult;
4423 }
4424 
4425 static const char *servalpn;
4426 
4427 static int alpn_select_cb(SSL *ssl, const unsigned char **out,
4428     unsigned char *outlen, const unsigned char *in,
4429     unsigned int inlen, void *arg)
4430 {
4431     unsigned int protlen = 0;
4432     const unsigned char *prot;
4433 
4434     for (prot = in; prot < in + inlen; prot += protlen) {
4435         protlen = *prot++;
4436         if (in + inlen < prot + protlen)
4437             return SSL_TLSEXT_ERR_NOACK;
4438 
4439         if (protlen == strlen(servalpn)
4440             && memcmp(prot, servalpn, protlen) == 0) {
4441             *out = prot;
4442             *outlen = protlen;
4443             return SSL_TLSEXT_ERR_OK;
4444         }
4445     }
4446 
4447     return SSL_TLSEXT_ERR_NOACK;
4448 }
4449 
4450 /* Test that a PSK can be used to send early_data */
4451 static int test_early_data_psk(int idx)
4452 {
4453     SSL_CTX *cctx = NULL, *sctx = NULL;
4454     SSL *clientssl = NULL, *serverssl = NULL;
4455     int testresult = 0;
4456     SSL_SESSION *sess = NULL;
4457     unsigned char alpnlist[] = {
4458         0x08, 'g', 'o', 'o', 'd', 'a', 'l', 'p', 'n', 0x07, 'b', 'a', 'd', 'a',
4459         'l', 'p', 'n'
4460     };
4461 #define GOODALPNLEN 9
4462 #define BADALPNLEN 8
4463 #define GOODALPN (alpnlist)
4464 #define BADALPN (alpnlist + GOODALPNLEN)
4465     int err = 0;
4466     unsigned char buf[20];
4467     size_t readbytes, written;
4468     int readearlyres = SSL_READ_EARLY_DATA_SUCCESS, connectres = 1;
4469     int edstatus = SSL_EARLY_DATA_ACCEPTED;
4470 
4471     /* We always set this up with a final parameter of "2" for PSK */
4472     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4473             &serverssl, &sess, 2,
4474             SHA384_DIGEST_LENGTH)))
4475         goto end;
4476 
4477     servalpn = "goodalpn";
4478 
4479     /*
4480      * Note: There is no test for inconsistent SNI with late client detection.
4481      * This is because servers do not acknowledge SNI even if they are using
4482      * it in a resumption handshake - so it is not actually possible for a
4483      * client to detect a problem.
4484      */
4485     switch (idx) {
4486     case 0:
4487         /* Set inconsistent SNI (early client detection) */
4488         err = SSL_R_INCONSISTENT_EARLY_DATA_SNI;
4489         if (!TEST_true(SSL_SESSION_set1_hostname(sess, "goodhost"))
4490             || !TEST_true(SSL_set_tlsext_host_name(clientssl, "badhost")))
4491             goto end;
4492         break;
4493 
4494     case 1:
4495         /* Set inconsistent ALPN (early client detection) */
4496         err = SSL_R_INCONSISTENT_EARLY_DATA_ALPN;
4497         /* SSL_set_alpn_protos returns 0 for success and 1 for failure */
4498         if (!TEST_true(SSL_SESSION_set1_alpn_selected(sess, GOODALPN,
4499                 GOODALPNLEN))
4500             || !TEST_false(SSL_set_alpn_protos(clientssl, BADALPN,
4501                 BADALPNLEN)))
4502             goto end;
4503         break;
4504 
4505     case 2:
4506         /*
4507          * Set invalid protocol version. Technically this affects PSKs without
4508          * early_data too, but we test it here because it is similar to the
4509          * SNI/ALPN consistency tests.
4510          */
4511         err = SSL_R_BAD_PSK;
4512         if (!TEST_true(SSL_SESSION_set_protocol_version(sess, TLS1_2_VERSION)))
4513             goto end;
4514         break;
4515 
4516     case 3:
4517         /*
4518          * Set inconsistent SNI (server side). In this case the connection
4519          * will succeed and accept early_data. In TLSv1.3 on the server side SNI
4520          * is associated with each handshake - not the session. Therefore it
4521          * should not matter that we used a different server name last time.
4522          */
4523         SSL_SESSION_free(serverpsk);
4524         serverpsk = SSL_SESSION_dup(clientpsk);
4525         if (!TEST_ptr(serverpsk)
4526             || !TEST_true(SSL_SESSION_set1_hostname(serverpsk, "badhost")))
4527             goto end;
4528         /* Fall through */
4529     case 4:
4530         /* Set consistent SNI */
4531         if (!TEST_true(SSL_SESSION_set1_hostname(sess, "goodhost"))
4532             || !TEST_true(SSL_set_tlsext_host_name(clientssl, "goodhost"))
4533             || !TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx,
4534                 hostname_cb)))
4535             goto end;
4536         break;
4537 
4538     case 5:
4539         /*
4540          * Set inconsistent ALPN (server detected). In this case the connection
4541          * will succeed but reject early_data.
4542          */
4543         servalpn = "badalpn";
4544         edstatus = SSL_EARLY_DATA_REJECTED;
4545         readearlyres = SSL_READ_EARLY_DATA_FINISH;
4546         /* Fall through */
4547     case 6:
4548         /*
4549          * Set consistent ALPN.
4550          * SSL_set_alpn_protos returns 0 for success and 1 for failure. It
4551          * accepts a list of protos (each one length prefixed).
4552          * SSL_set1_alpn_selected accepts a single protocol (not length
4553          * prefixed)
4554          */
4555         if (!TEST_true(SSL_SESSION_set1_alpn_selected(sess, GOODALPN + 1,
4556                 GOODALPNLEN - 1))
4557             || !TEST_false(SSL_set_alpn_protos(clientssl, GOODALPN,
4558                 GOODALPNLEN)))
4559             goto end;
4560 
4561         SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb, NULL);
4562         break;
4563 
4564     case 7:
4565         /* Set inconsistent ALPN (late client detection) */
4566         SSL_SESSION_free(serverpsk);
4567         serverpsk = SSL_SESSION_dup(clientpsk);
4568         if (!TEST_ptr(serverpsk)
4569             || !TEST_true(SSL_SESSION_set1_alpn_selected(clientpsk,
4570                 BADALPN + 1,
4571                 BADALPNLEN - 1))
4572             || !TEST_true(SSL_SESSION_set1_alpn_selected(serverpsk,
4573                 GOODALPN + 1,
4574                 GOODALPNLEN - 1))
4575             || !TEST_false(SSL_set_alpn_protos(clientssl, alpnlist,
4576                 sizeof(alpnlist))))
4577             goto end;
4578         SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb, NULL);
4579         edstatus = SSL_EARLY_DATA_ACCEPTED;
4580         readearlyres = SSL_READ_EARLY_DATA_SUCCESS;
4581         /* SSL_connect() call should fail */
4582         connectres = -1;
4583         break;
4584 
4585     default:
4586         TEST_error("Bad test index");
4587         goto end;
4588     }
4589 
4590     SSL_set_connect_state(clientssl);
4591     if (err != 0) {
4592         if (!TEST_false(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4593                 &written))
4594             || !TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_SSL)
4595             || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), err))
4596             goto end;
4597     } else {
4598         OSSL_TIME timer = ossl_time_now();
4599 
4600         if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4601                 &written)))
4602             goto end;
4603 
4604         if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4605                              &readbytes),
4606                 readearlyres)) {
4607             testresult = check_early_data_timeout(timer);
4608             goto end;
4609         }
4610 
4611         if ((readearlyres == SSL_READ_EARLY_DATA_SUCCESS
4612                 && !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1)))
4613             || !TEST_int_eq(SSL_get_early_data_status(serverssl), edstatus)
4614             || !TEST_int_eq(SSL_connect(clientssl), connectres))
4615             goto end;
4616     }
4617 
4618     testresult = 1;
4619 
4620 end:
4621     SSL_SESSION_free(sess);
4622     SSL_SESSION_free(clientpsk);
4623     SSL_SESSION_free(serverpsk);
4624     clientpsk = serverpsk = NULL;
4625     SSL_free(serverssl);
4626     SSL_free(clientssl);
4627     SSL_CTX_free(sctx);
4628     SSL_CTX_free(cctx);
4629     return testresult;
4630 }
4631 
4632 /*
4633  * Test TLSv1.3 PSK can be used to send early_data with all 7 ciphersuites
4634  * idx == 0: Test with TLS1_3_RFC_AES_128_GCM_SHA256
4635  * idx == 1: Test with TLS1_3_RFC_AES_256_GCM_SHA384
4636  * idx == 2: Test with TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
4637  * idx == 3: Test with TLS1_3_RFC_AES_128_CCM_SHA256
4638  * idx == 4: Test with TLS1_3_RFC_AES_128_CCM_8_SHA256
4639  * idx == 5: Test with TLS1_3_RFC_SHA256_SHA256
4640  * idx == 6: Test with TLS1_3_RFC_SHA384_SHA384
4641  */
4642 static int test_early_data_psk_with_all_ciphers(int idx)
4643 {
4644     SSL_CTX *cctx = NULL, *sctx = NULL;
4645     SSL *clientssl = NULL, *serverssl = NULL;
4646     int testresult = 0;
4647     SSL_SESSION *sess = NULL;
4648     unsigned char buf[20];
4649     size_t readbytes, written;
4650     const SSL_CIPHER *cipher;
4651     OSSL_TIME timer;
4652     const char *cipher_str[] = {
4653         TLS1_3_RFC_AES_128_GCM_SHA256,
4654         TLS1_3_RFC_AES_256_GCM_SHA384,
4655 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
4656         TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
4657 #else
4658         NULL,
4659 #endif
4660         TLS1_3_RFC_AES_128_CCM_SHA256,
4661         TLS1_3_RFC_AES_128_CCM_8_SHA256,
4662 #if !defined(OPENSSL_NO_INTEGRITY_ONLY_CIPHERS)
4663         TLS1_3_RFC_SHA256_SHA256,
4664         TLS1_3_RFC_SHA384_SHA384
4665 #else
4666         NULL,
4667         NULL
4668 #endif
4669     };
4670     const unsigned char *cipher_bytes[] = {
4671         TLS13_AES_128_GCM_SHA256_BYTES,
4672         TLS13_AES_256_GCM_SHA384_BYTES,
4673 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
4674         TLS13_CHACHA20_POLY1305_SHA256_BYTES,
4675 #else
4676         NULL,
4677 #endif
4678         TLS13_AES_128_CCM_SHA256_BYTES,
4679         TLS13_AES_128_CCM_8_SHA256_BYTES,
4680 #if !defined(OPENSSL_NO_INTEGRITY_ONLY_CIPHERS)
4681         TLS13_SHA256_SHA256_BYTES,
4682         TLS13_SHA384_SHA384_BYTES
4683 #else
4684         NULL,
4685         NULL
4686 #endif
4687     };
4688 
4689     if (cipher_str[idx] == NULL)
4690         return 1;
4691     /*
4692      * Skip ChaCha20Poly1305 and TLS_SHA{256,384}_SHA{256,384} ciphers
4693      * as currently FIPS module does not support them.
4694      */
4695     if ((idx == 2 || idx == 5 || idx == 6) && is_fips == 1)
4696         return 1;
4697 
4698     /* We always set this up with a final parameter of "2" for PSK */
4699     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4700             &serverssl, &sess, 2,
4701             SHA384_DIGEST_LENGTH)))
4702         goto end;
4703 
4704     if (idx == 4 || idx == 5 || idx == 6) {
4705         /*
4706          * CCM8 ciphers are considered low security due to their short tag.
4707          * Integrity-only cipher do not provide any confidentiality.
4708          */
4709         SSL_set_security_level(clientssl, 0);
4710         SSL_set_security_level(serverssl, 0);
4711     }
4712 
4713     if (!TEST_true(SSL_set_ciphersuites(clientssl, cipher_str[idx]))
4714         || !TEST_true(SSL_set_ciphersuites(serverssl, cipher_str[idx])))
4715         goto end;
4716 
4717     /*
4718      * 'setupearly_data_test' creates only one instance of SSL_SESSION
4719      * and assigns to both client and server with incremented reference
4720      * and the same instance is updated in 'sess'.
4721      * So updating ciphersuite in 'sess' which will get reflected in
4722      * PSK handshake using psk use sess and find sess cb.
4723      */
4724     cipher = SSL_CIPHER_find(clientssl, cipher_bytes[idx]);
4725     if (!TEST_ptr(cipher) || !TEST_true(SSL_SESSION_set_cipher(sess, cipher)))
4726         goto end;
4727 
4728     SSL_set_connect_state(clientssl);
4729     timer = ossl_time_now();
4730     if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4731             &written)))
4732         goto end;
4733 
4734     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4735                          &readbytes),
4736             SSL_READ_EARLY_DATA_SUCCESS)) {
4737         testresult = check_early_data_timeout(timer);
4738         goto end;
4739     }
4740 
4741     if (!TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
4742         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4743             SSL_EARLY_DATA_ACCEPTED)
4744         || !TEST_int_eq(SSL_connect(clientssl), 1)
4745         || !TEST_int_eq(SSL_accept(serverssl), 1))
4746         goto end;
4747 
4748     /* Send some normal data from client to server */
4749     if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
4750         || !TEST_size_t_eq(written, strlen(MSG2)))
4751         goto end;
4752 
4753     if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4754         || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4755         goto end;
4756 
4757     testresult = 1;
4758 end:
4759     SSL_SESSION_free(sess);
4760     SSL_SESSION_free(clientpsk);
4761     SSL_SESSION_free(serverpsk);
4762     clientpsk = serverpsk = NULL;
4763     if (clientssl != NULL)
4764         SSL_shutdown(clientssl);
4765     if (serverssl != NULL)
4766         SSL_shutdown(serverssl);
4767     SSL_free(serverssl);
4768     SSL_free(clientssl);
4769     SSL_CTX_free(sctx);
4770     SSL_CTX_free(cctx);
4771     return testresult;
4772 }
4773 
4774 /*
4775  * Test that a server that doesn't try to read early data can handle a
4776  * client sending some.
4777  */
4778 static int test_early_data_not_expected(int idx)
4779 {
4780     SSL_CTX *cctx = NULL, *sctx = NULL;
4781     SSL *clientssl = NULL, *serverssl = NULL;
4782     int testresult = 0;
4783     SSL_SESSION *sess = NULL;
4784     unsigned char buf[20];
4785     size_t readbytes, written;
4786 
4787     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4788             &serverssl, &sess, idx,
4789             SHA384_DIGEST_LENGTH)))
4790         goto end;
4791 
4792     /* Write some early data */
4793     if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
4794             &written)))
4795         goto end;
4796 
4797     /*
4798      * Server should skip over early data and then block waiting for client to
4799      * continue handshake
4800      */
4801     if (!TEST_int_le(SSL_accept(serverssl), 0)
4802         || !TEST_int_gt(SSL_connect(clientssl), 0)
4803         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4804             SSL_EARLY_DATA_REJECTED)
4805         || !TEST_int_gt(SSL_accept(serverssl), 0)
4806         || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4807             SSL_EARLY_DATA_REJECTED))
4808         goto end;
4809 
4810     /* Send some normal data from client to server */
4811     if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
4812         || !TEST_size_t_eq(written, strlen(MSG2)))
4813         goto end;
4814 
4815     if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4816         || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4817         goto end;
4818 
4819     testresult = 1;
4820 
4821 end:
4822     SSL_SESSION_free(sess);
4823     SSL_SESSION_free(clientpsk);
4824     SSL_SESSION_free(serverpsk);
4825     clientpsk = serverpsk = NULL;
4826     SSL_free(serverssl);
4827     SSL_free(clientssl);
4828     SSL_CTX_free(sctx);
4829     SSL_CTX_free(cctx);
4830     return testresult;
4831 }
4832 
4833 #ifndef OPENSSL_NO_TLS1_2
4834 /*
4835  * Test that a server attempting to read early data can handle a connection
4836  * from a TLSv1.2 client.
4837  */
4838 static int test_early_data_tls1_2(int idx)
4839 {
4840     SSL_CTX *cctx = NULL, *sctx = NULL;
4841     SSL *clientssl = NULL, *serverssl = NULL;
4842     int testresult = 0;
4843     unsigned char buf[20];
4844     size_t readbytes, written;
4845 
4846     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
4847             &serverssl, NULL, idx,
4848             SHA384_DIGEST_LENGTH)))
4849         goto end;
4850 
4851     /* Write some data - should block due to handshake with server */
4852     SSL_set_max_proto_version(clientssl, TLS1_2_VERSION);
4853     SSL_set_connect_state(clientssl);
4854     if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written)))
4855         goto end;
4856 
4857     /*
4858      * Server should do TLSv1.2 handshake. First it will block waiting for more
4859      * messages from client after ServerDone. Then SSL_read_early_data should
4860      * finish and detect that early data has not been sent
4861      */
4862     if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4863                          &readbytes),
4864             SSL_READ_EARLY_DATA_ERROR))
4865         goto end;
4866 
4867     /*
4868      * Continue writing the message we started earlier. Will still block waiting
4869      * for the CCS/Finished from server
4870      */
4871     if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
4872         || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4873                             &readbytes),
4874             SSL_READ_EARLY_DATA_FINISH)
4875         || !TEST_size_t_eq(readbytes, 0)
4876         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4877             SSL_EARLY_DATA_NOT_SENT))
4878         goto end;
4879 
4880     /* Continue writing the message we started earlier */
4881     if (!TEST_true(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
4882         || !TEST_size_t_eq(written, strlen(MSG1))
4883         || !TEST_int_eq(SSL_get_early_data_status(clientssl),
4884             SSL_EARLY_DATA_NOT_SENT)
4885         || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
4886         || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
4887         || !TEST_true(SSL_write_ex(serverssl, MSG2, strlen(MSG2), &written))
4888         || !TEST_size_t_eq(written, strlen(MSG2))
4889         || !SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes)
4890         || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
4891         goto end;
4892 
4893     testresult = 1;
4894 
4895 end:
4896     SSL_SESSION_free(clientpsk);
4897     SSL_SESSION_free(serverpsk);
4898     clientpsk = serverpsk = NULL;
4899     SSL_free(serverssl);
4900     SSL_free(clientssl);
4901     SSL_CTX_free(sctx);
4902     SSL_CTX_free(cctx);
4903 
4904     return testresult;
4905 }
4906 #endif /* OPENSSL_NO_TLS1_2 */
4907 
4908 /*
4909  * Test configuring the TLSv1.3 ciphersuites
4910  *
4911  * Test 0: Set a default ciphersuite in the SSL_CTX (no explicit cipher_list)
4912  * Test 1: Set a non-default ciphersuite in the SSL_CTX (no explicit cipher_list)
4913  * Test 2: Set a default ciphersuite in the SSL (no explicit cipher_list)
4914  * Test 3: Set a non-default ciphersuite in the SSL (no explicit cipher_list)
4915  * Test 4: Set a default ciphersuite in the SSL_CTX (SSL_CTX cipher_list)
4916  * Test 5: Set a non-default ciphersuite in the SSL_CTX (SSL_CTX cipher_list)
4917  * Test 6: Set a default ciphersuite in the SSL (SSL_CTX cipher_list)
4918  * Test 7: Set a non-default ciphersuite in the SSL (SSL_CTX cipher_list)
4919  * Test 8: Set a default ciphersuite in the SSL (SSL cipher_list)
4920  * Test 9: Set a non-default ciphersuite in the SSL (SSL cipher_list)
4921  */
4922 static int test_set_ciphersuite(int idx)
4923 {
4924     SSL_CTX *cctx = NULL, *sctx = NULL;
4925     SSL *clientssl = NULL, *serverssl = NULL;
4926     int testresult = 0;
4927 
4928     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
4929             TLS_client_method(), TLS1_VERSION, 0,
4930             &sctx, &cctx, cert, privkey))
4931         || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
4932             "TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256")))
4933         goto end;
4934 
4935     if (idx >= 4 && idx <= 7) {
4936         /* SSL_CTX explicit cipher list */
4937         if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "AES256-GCM-SHA384")))
4938             goto end;
4939     }
4940 
4941     if (idx == 0 || idx == 4) {
4942         /* Default ciphersuite */
4943         if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
4944                 "TLS_AES_128_GCM_SHA256")))
4945             goto end;
4946     } else if (idx == 1 || idx == 5) {
4947         /* Non default ciphersuite */
4948         if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
4949                 "TLS_AES_128_CCM_SHA256")))
4950             goto end;
4951     }
4952 
4953     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
4954             &clientssl, NULL, NULL)))
4955         goto end;
4956 
4957     if (idx == 8 || idx == 9) {
4958         /* SSL explicit cipher list */
4959         if (!TEST_true(SSL_set_cipher_list(clientssl, "AES256-GCM-SHA384")))
4960             goto end;
4961     }
4962 
4963     if (idx == 2 || idx == 6 || idx == 8) {
4964         /* Default ciphersuite */
4965         if (!TEST_true(SSL_set_ciphersuites(clientssl,
4966                 "TLS_AES_128_GCM_SHA256")))
4967             goto end;
4968     } else if (idx == 3 || idx == 7 || idx == 9) {
4969         /* Non default ciphersuite */
4970         if (!TEST_true(SSL_set_ciphersuites(clientssl,
4971                 "TLS_AES_128_CCM_SHA256")))
4972             goto end;
4973     }
4974 
4975     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
4976         goto end;
4977 
4978     testresult = 1;
4979 
4980 end:
4981     SSL_free(serverssl);
4982     SSL_free(clientssl);
4983     SSL_CTX_free(sctx);
4984     SSL_CTX_free(cctx);
4985 
4986     return testresult;
4987 }
4988 
4989 static int test_ciphersuite_change(void)
4990 {
4991     SSL_CTX *cctx = NULL, *sctx = NULL;
4992     SSL *clientssl = NULL, *serverssl = NULL;
4993     SSL_SESSION *clntsess = NULL;
4994     int testresult = 0;
4995     const SSL_CIPHER *aes_128_gcm_sha256 = NULL;
4996 
4997     /* Create a session based on SHA-256 */
4998     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
4999             TLS_client_method(), TLS1_VERSION, 0,
5000             &sctx, &cctx, cert, privkey))
5001         || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
5002             "TLS_AES_128_GCM_SHA256:"
5003             "TLS_AES_256_GCM_SHA384:"
5004             "TLS_AES_128_CCM_SHA256"))
5005         || !TEST_true(SSL_CTX_set_ciphersuites(cctx,
5006             "TLS_AES_128_GCM_SHA256")))
5007         goto end;
5008 
5009     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5010             NULL, NULL))
5011         || !TEST_true(create_ssl_connection(serverssl, clientssl,
5012             SSL_ERROR_NONE)))
5013         goto end;
5014 
5015     clntsess = SSL_get1_session(clientssl);
5016     /* Save for later */
5017     aes_128_gcm_sha256 = SSL_SESSION_get0_cipher(clntsess);
5018     SSL_shutdown(clientssl);
5019     SSL_shutdown(serverssl);
5020     SSL_free(serverssl);
5021     SSL_free(clientssl);
5022     serverssl = clientssl = NULL;
5023 
5024     /* Check we can resume a session with a different SHA-256 ciphersuite */
5025     if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
5026             "TLS_AES_128_CCM_SHA256"))
5027         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5028             &clientssl, NULL, NULL))
5029         || !TEST_true(SSL_set_session(clientssl, clntsess))
5030         || !TEST_true(create_ssl_connection(serverssl, clientssl,
5031             SSL_ERROR_NONE))
5032         || !TEST_true(SSL_session_reused(clientssl)))
5033         goto end;
5034 
5035     SSL_SESSION_free(clntsess);
5036     clntsess = SSL_get1_session(clientssl);
5037     SSL_shutdown(clientssl);
5038     SSL_shutdown(serverssl);
5039     SSL_free(serverssl);
5040     SSL_free(clientssl);
5041     serverssl = clientssl = NULL;
5042 
5043     /*
5044      * Check attempting to resume a SHA-256 session with no SHA-256 ciphersuites
5045      * succeeds but does not resume.
5046      */
5047     if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, "TLS_AES_256_GCM_SHA384"))
5048         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5049             NULL, NULL))
5050         || !TEST_true(SSL_set_session(clientssl, clntsess))
5051         || !TEST_true(create_ssl_connection(serverssl, clientssl,
5052             SSL_ERROR_SSL))
5053         || !TEST_false(SSL_session_reused(clientssl)))
5054         goto end;
5055 
5056     SSL_SESSION_free(clntsess);
5057     clntsess = NULL;
5058     SSL_shutdown(clientssl);
5059     SSL_shutdown(serverssl);
5060     SSL_free(serverssl);
5061     SSL_free(clientssl);
5062     serverssl = clientssl = NULL;
5063 
5064     /* Create a session based on SHA384 */
5065     if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, "TLS_AES_256_GCM_SHA384"))
5066         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5067             &clientssl, NULL, NULL))
5068         || !TEST_true(create_ssl_connection(serverssl, clientssl,
5069             SSL_ERROR_NONE)))
5070         goto end;
5071 
5072     clntsess = SSL_get1_session(clientssl);
5073     SSL_shutdown(clientssl);
5074     SSL_shutdown(serverssl);
5075     SSL_free(serverssl);
5076     SSL_free(clientssl);
5077     serverssl = clientssl = NULL;
5078 
5079     if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
5080             "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384"))
5081         || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
5082             "TLS_AES_256_GCM_SHA384"))
5083         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5084             NULL, NULL))
5085         || !TEST_true(SSL_set_session(clientssl, clntsess))
5086         /*
5087          * We use SSL_ERROR_WANT_READ below so that we can pause the
5088          * connection after the initial ClientHello has been sent to
5089          * enable us to make some session changes.
5090          */
5091         || !TEST_false(create_ssl_connection(serverssl, clientssl,
5092             SSL_ERROR_WANT_READ)))
5093         goto end;
5094 
5095     /* Trick the client into thinking this session is for a different digest */
5096     clntsess->cipher = aes_128_gcm_sha256;
5097     clntsess->cipher_id = clntsess->cipher->id;
5098 
5099     /*
5100      * Continue the previously started connection. Server has selected a SHA-384
5101      * ciphersuite, but client thinks the session is for SHA-256, so it should
5102      * bail out.
5103      */
5104     if (!TEST_false(create_ssl_connection(serverssl, clientssl,
5105             SSL_ERROR_SSL))
5106         || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()),
5107             SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED))
5108         goto end;
5109 
5110     testresult = 1;
5111 
5112 end:
5113     SSL_SESSION_free(clntsess);
5114     SSL_free(serverssl);
5115     SSL_free(clientssl);
5116     SSL_CTX_free(sctx);
5117     SSL_CTX_free(cctx);
5118 
5119     return testresult;
5120 }
5121 
5122 /*
5123  * Test TLSv1.3 Key exchange
5124  * Test 0 = Test all ECDHE Key exchange with TLSv1.3 client and server
5125  * Test 1 = Test NID_X9_62_prime256v1 with TLSv1.3 client and server
5126  * Test 2 = Test NID_secp384r1 with TLSv1.3 client and server
5127  * Test 3 = Test NID_secp521r1 with TLSv1.3 client and server
5128  * Test 4 = Test NID_X25519 with TLSv1.3 client and server
5129  * Test 5 = Test NID_X448 with TLSv1.3 client and server
5130  * Test 6 = Test all FFDHE Key exchange with TLSv1.3 client and server
5131  * Test 7 = Test NID_ffdhe2048 with TLSv1.3 client and server
5132  * Test 8 = Test NID_ffdhe3072 with TLSv1.3 client and server
5133  * Test 9 = Test NID_ffdhe4096 with TLSv1.3 client and server
5134  * Test 10 = Test NID_ffdhe6144 with TLSv1.3 client and server
5135  * Test 11 = Test NID_ffdhe8192 with TLSv1.3 client and server
5136  * Test 12 = Test all ML-KEM with TLSv1.3 client and server
5137  * Test 13 = Test MLKEM512
5138  * Test 14 = Test MLKEM768
5139  * Test 15 = Test MLKEM1024
5140  * Test 16 = Test X25519MLKEM768
5141  * Test 17 = Test SecP256r1MLKEM768
5142  * Test 18 = Test SecP384r1MLKEM1024
5143  * Test 19 = Test all ML-KEM with TLSv1.2 client and server
5144  * Test 20 = Test all FFDHE with TLSv1.2 client and server
5145  * Test 21 = Test all ECDHE with TLSv1.2 client and server
5146  */
5147 #ifndef OPENSSL_NO_EC
5148 static int ecdhe_kexch_groups[] = { NID_X9_62_prime256v1, NID_secp384r1,
5149     NID_secp521r1,
5150 #ifndef OPENSSL_NO_ECX
5151     NID_X25519, NID_X448
5152 #endif
5153 };
5154 #endif
5155 #ifndef OPENSSL_NO_DH
5156 static int ffdhe_kexch_groups[] = { NID_ffdhe2048, NID_ffdhe3072, NID_ffdhe4096,
5157     NID_ffdhe6144, NID_ffdhe8192 };
5158 #endif
5159 static int test_key_exchange(int idx)
5160 {
5161     SSL_CTX *sctx = NULL, *cctx = NULL;
5162     SSL *serverssl = NULL, *clientssl = NULL;
5163     int testresult = 0;
5164     int kexch_alg = NID_undef;
5165     int *kexch_groups = &kexch_alg;
5166     int kexch_groups_size = 1;
5167     int max_version = TLS1_3_VERSION;
5168     char *kexch_name0 = NULL;
5169     const char *kexch_names = NULL;
5170     int shared_group0;
5171 
5172     switch (idx) {
5173 #ifndef OPENSSL_NO_EC
5174 #ifndef OPENSSL_NO_TLS1_2
5175     case 21:
5176         max_version = TLS1_2_VERSION;
5177 #endif
5178         /* Fall through */
5179     case 0:
5180         kexch_groups = ecdhe_kexch_groups;
5181         kexch_groups_size = OSSL_NELEM(ecdhe_kexch_groups);
5182         kexch_name0 = "secp256r1";
5183         break;
5184     case 1:
5185         kexch_alg = NID_X9_62_prime256v1;
5186         kexch_name0 = "secp256r1";
5187         break;
5188     case 2:
5189         kexch_alg = NID_secp384r1;
5190         kexch_name0 = "secp384r1";
5191         break;
5192     case 3:
5193         kexch_alg = NID_secp521r1;
5194         kexch_name0 = "secp521r1";
5195         break;
5196 #ifndef OPENSSL_NO_ECX
5197     case 4:
5198         if (is_fips)
5199             return TEST_skip("X25519 might not be supported by fips provider.");
5200         kexch_alg = NID_X25519;
5201         kexch_name0 = "x25519";
5202         break;
5203     case 5:
5204         if (is_fips)
5205             return TEST_skip("X448 might not be supported by fips provider.");
5206         kexch_alg = NID_X448;
5207         kexch_name0 = "x448";
5208         break;
5209 #endif
5210 #endif
5211 #ifndef OPENSSL_NO_DH
5212 #ifndef OPENSSL_NO_TLS1_2
5213     case 20:
5214         max_version = TLS1_2_VERSION;
5215         kexch_name0 = "ffdhe2048";
5216 #endif
5217         /* Fall through */
5218     case 6:
5219         kexch_groups = ffdhe_kexch_groups;
5220         kexch_groups_size = OSSL_NELEM(ffdhe_kexch_groups);
5221         kexch_name0 = "ffdhe2048";
5222         break;
5223     case 7:
5224         kexch_alg = NID_ffdhe2048;
5225         kexch_name0 = "ffdhe2048";
5226         break;
5227     case 8:
5228         kexch_alg = NID_ffdhe3072;
5229         kexch_name0 = "ffdhe3072";
5230         break;
5231     case 9:
5232         kexch_alg = NID_ffdhe4096;
5233         kexch_name0 = "ffdhe4096";
5234         break;
5235     case 10:
5236         kexch_alg = NID_ffdhe6144;
5237         kexch_name0 = "ffdhe6144";
5238         break;
5239     case 11:
5240         kexch_alg = NID_ffdhe8192;
5241         kexch_name0 = "ffdhe8192";
5242         break;
5243 #endif
5244 #ifndef OPENSSL_NO_ML_KEM
5245 #if !defined(OPENSSL_NO_TLS1_2)
5246     case 19:
5247         max_version = TLS1_2_VERSION;
5248 #if !defined(OPENSSL_NO_EC)
5249         /* Set at least one EC group so the handshake completes */
5250         kexch_names = "MLKEM512:MLKEM768:MLKEM1024:secp256r1";
5251 #elif !defined(OPENSSL_NO_DH)
5252         kexch_names = "MLKEM512:MLKEM768:MLKEM1024";
5253 #else
5254         /* With neither EC nor DH TLS 1.2 can't happen */
5255         return 1;
5256 #endif
5257 #endif
5258         /* Fall through */
5259     case 12:
5260         kexch_groups = NULL;
5261         if (kexch_names == NULL)
5262             kexch_names = "MLKEM512:MLKEM768:MLKEM1024";
5263         kexch_name0 = "MLKEM512";
5264         break;
5265     case 13:
5266         kexch_groups = NULL;
5267         kexch_name0 = "MLKEM512";
5268         kexch_names = kexch_name0;
5269         break;
5270     case 14:
5271         kexch_groups = NULL;
5272         kexch_name0 = "MLKEM768";
5273         kexch_names = kexch_name0;
5274         break;
5275     case 15:
5276         kexch_groups = NULL;
5277         kexch_name0 = "MLKEM1024";
5278         kexch_names = kexch_name0;
5279         break;
5280 #ifndef OPENSSL_NO_EC
5281 #ifndef OPENSSL_NO_ECX
5282     case 16:
5283         kexch_groups = NULL;
5284         kexch_name0 = "X25519MLKEM768";
5285         kexch_names = kexch_name0;
5286         break;
5287 #endif
5288     case 17:
5289         kexch_groups = NULL;
5290         kexch_name0 = "SecP256r1MLKEM768";
5291         kexch_names = kexch_name0;
5292         break;
5293     case 18:
5294         kexch_groups = NULL;
5295         kexch_name0 = "SecP384r1MLKEM1024";
5296         kexch_names = kexch_name0;
5297         break;
5298 #endif
5299 #endif
5300     default:
5301         /* We're skipping this test */
5302         return 1;
5303     }
5304 
5305     if (is_fips && fips_provider_version_lt(libctx, 3, 5, 0)
5306         && idx >= 12 && idx <= 19)
5307         return TEST_skip("ML-KEM not supported in this version of fips provider");
5308 
5309     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5310             TLS_client_method(), TLS1_VERSION,
5311             max_version, &sctx, &cctx, cert,
5312             privkey)))
5313         goto end;
5314 
5315     if (!TEST_true(SSL_CTX_set_ciphersuites(sctx,
5316             TLS1_3_RFC_AES_128_GCM_SHA256)))
5317         goto end;
5318 
5319     if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
5320             TLS1_3_RFC_AES_128_GCM_SHA256)))
5321         goto end;
5322 
5323     if (!TEST_true(SSL_CTX_set_cipher_list(sctx,
5324             TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":" TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256))
5325         || !TEST_true(SSL_CTX_set_dh_auto(sctx, 1)))
5326         goto end;
5327 
5328     /*
5329      * Must include an EC ciphersuite so that we send supported groups in
5330      * TLSv1.2
5331      */
5332 #ifndef OPENSSL_NO_TLS1_2
5333     if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
5334             TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":" TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256)))
5335         goto end;
5336 #endif
5337 
5338     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5339             NULL, NULL)))
5340         goto end;
5341 
5342     if (kexch_groups != NULL) {
5343         if (!TEST_true(SSL_set1_groups(serverssl, kexch_groups, kexch_groups_size))
5344             || !TEST_true(SSL_set1_groups(clientssl, kexch_groups, kexch_groups_size)))
5345             goto end;
5346     } else {
5347         if (!TEST_true(SSL_set1_groups_list(serverssl, kexch_names))
5348             || !TEST_true(SSL_set1_groups_list(clientssl, kexch_names)))
5349             goto end;
5350     }
5351 
5352     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
5353         goto end;
5354 
5355     /*
5356      * If the handshake succeeds the negotiated kexch alg should be the first
5357      * one in configured, except in the case of "all" FFDHE and "all" ML-KEM
5358      * groups (idx == 19, 20), which are TLSv1.3 only so we expect no shared
5359      * group to exist.
5360      */
5361     shared_group0 = SSL_get_shared_group(serverssl, 0);
5362     switch (idx) {
5363     case 19:
5364 #if !defined(OPENSSL_NO_EC)
5365         /* MLKEM + TLS 1.2 and no DH => "secp526r1" */
5366         if (!TEST_int_eq(shared_group0, NID_X9_62_prime256v1))
5367             goto end;
5368         break;
5369 #endif
5370         /* Fall through */
5371     case 20:
5372         if (!TEST_int_eq(shared_group0, 0))
5373             goto end;
5374         break;
5375     default:
5376         if (kexch_groups != NULL
5377             && !TEST_int_eq(shared_group0, kexch_groups[0]))
5378             goto end;
5379         if (!TEST_str_eq(SSL_group_to_name(serverssl, shared_group0),
5380                 kexch_name0))
5381             goto end;
5382         if (!TEST_str_eq(SSL_get0_group_name(serverssl), kexch_name0)
5383             || !TEST_str_eq(SSL_get0_group_name(clientssl), kexch_name0))
5384             goto end;
5385         if (!TEST_int_eq(SSL_get_negotiated_group(serverssl), shared_group0))
5386             goto end;
5387         if (!TEST_int_eq(SSL_get_negotiated_group(clientssl), shared_group0))
5388             goto end;
5389         break;
5390     }
5391 
5392     testresult = 1;
5393 end:
5394     SSL_free(serverssl);
5395     SSL_free(clientssl);
5396     SSL_CTX_free(sctx);
5397     SSL_CTX_free(cctx);
5398     return testresult;
5399 }
5400 
5401 #if !defined(OPENSSL_NO_TLS1_2) \
5402     && !defined(OPENSSL_NO_EC)  \
5403     && !defined(OPENSSL_NO_DH)
5404 static int set_ssl_groups(SSL *serverssl, SSL *clientssl, int clientmulti,
5405     int isecdhe, int idx)
5406 {
5407     int kexch_alg;
5408     int *kexch_groups = &kexch_alg;
5409     int numec, numff;
5410 
5411     numec = OSSL_NELEM(ecdhe_kexch_groups);
5412     numff = OSSL_NELEM(ffdhe_kexch_groups);
5413     if (isecdhe)
5414         kexch_alg = ecdhe_kexch_groups[idx];
5415     else
5416         kexch_alg = ffdhe_kexch_groups[idx];
5417 
5418     if (clientmulti) {
5419         if (!TEST_true(SSL_set1_groups(serverssl, kexch_groups, 1)))
5420             return 0;
5421         if (isecdhe) {
5422             if (!TEST_true(SSL_set1_groups(clientssl, ecdhe_kexch_groups,
5423                     numec)))
5424                 return 0;
5425         } else {
5426             if (!TEST_true(SSL_set1_groups(clientssl, ffdhe_kexch_groups,
5427                     numff)))
5428                 return 0;
5429         }
5430     } else {
5431         if (!TEST_true(SSL_set1_groups(clientssl, kexch_groups, 1)))
5432             return 0;
5433         if (isecdhe) {
5434             if (!TEST_true(SSL_set1_groups(serverssl, ecdhe_kexch_groups,
5435                     numec)))
5436                 return 0;
5437         } else {
5438             if (!TEST_true(SSL_set1_groups(serverssl, ffdhe_kexch_groups,
5439                     numff)))
5440                 return 0;
5441         }
5442     }
5443     return 1;
5444 }
5445 
5446 /*-
5447  * Test the SSL_get_negotiated_group() API across a battery of scenarios.
5448  * Run through both the ECDHE and FFDHE group lists used in the previous
5449  * test, for both TLS 1.2 and TLS 1.3, negotiating each group in turn,
5450  * confirming the expected result; then perform a resumption handshake
5451  * while offering the same group list, and another resumption handshake
5452  * offering a different group list.  The returned value should be the
5453  * negotiated group for the initial handshake; for TLS 1.3 resumption
5454  * handshakes the returned value will be negotiated on the resumption
5455  * handshake itself, but for TLS 1.2 resumption handshakes the value will
5456  * be cached in the session from the original handshake, regardless of what
5457  * was offered in the resumption ClientHello.
5458  *
5459  * Using E for the number of EC groups and F for the number of FF groups:
5460  * E tests of ECDHE with TLS 1.3, server only has one group
5461  * F tests of FFDHE with TLS 1.3, server only has one group
5462  * E tests of ECDHE with TLS 1.2, server only has one group
5463  * F tests of FFDHE with TLS 1.2, server only has one group
5464  * E tests of ECDHE with TLS 1.3, client sends only one group
5465  * F tests of FFDHE with TLS 1.3, client sends only one group
5466  * E tests of ECDHE with TLS 1.2, client sends only one group
5467  * F tests of FFDHE with TLS 1.2, client sends only one group
5468  */
5469 static int test_negotiated_group(int idx)
5470 {
5471     int clientmulti, istls13, isecdhe, numec, numff, numgroups;
5472     int expectednid;
5473     SSL_CTX *sctx = NULL, *cctx = NULL;
5474     SSL *serverssl = NULL, *clientssl = NULL;
5475     SSL_SESSION *origsess = NULL;
5476     int testresult = 0;
5477     int kexch_alg;
5478     int max_version = TLS1_3_VERSION;
5479 
5480     numec = OSSL_NELEM(ecdhe_kexch_groups);
5481     numff = OSSL_NELEM(ffdhe_kexch_groups);
5482     numgroups = numec + numff;
5483     clientmulti = (idx < 2 * numgroups);
5484     idx = idx % (2 * numgroups);
5485     istls13 = (idx < numgroups);
5486     idx = idx % numgroups;
5487     isecdhe = (idx < numec);
5488     if (!isecdhe)
5489         idx -= numec;
5490     /* Now 'idx' is an index into ecdhe_kexch_groups or ffdhe_kexch_groups */
5491     if (isecdhe)
5492         kexch_alg = ecdhe_kexch_groups[idx];
5493     else
5494         kexch_alg = ffdhe_kexch_groups[idx];
5495     /* We expect nothing for the unimplemented TLS 1.2 FFDHE named groups */
5496     if (!istls13 && !isecdhe)
5497         expectednid = NID_undef;
5498     else
5499         expectednid = kexch_alg;
5500 
5501     if (is_fips && (kexch_alg == NID_X25519 || kexch_alg == NID_X448))
5502         return TEST_skip("X25519 and X448 might not be available in fips provider.");
5503 
5504     if (!istls13)
5505         max_version = TLS1_2_VERSION;
5506 
5507     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5508             TLS_client_method(), TLS1_VERSION,
5509             max_version, &sctx, &cctx, cert,
5510             privkey)))
5511         goto end;
5512 
5513     /*
5514      * Force (EC)DHE ciphers for TLS 1.2.
5515      * Be sure to enable auto tmp DH so that FFDHE can succeed.
5516      */
5517     if (!TEST_true(SSL_CTX_set_cipher_list(sctx,
5518             TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":" TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256))
5519         || !TEST_true(SSL_CTX_set_dh_auto(sctx, 1)))
5520         goto end;
5521     if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
5522             TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":" TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256)))
5523         goto end;
5524 
5525     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5526             NULL, NULL)))
5527         goto end;
5528 
5529     if (!TEST_true(set_ssl_groups(serverssl, clientssl, clientmulti, isecdhe,
5530             idx)))
5531         goto end;
5532 
5533     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
5534         goto end;
5535 
5536     /* Initial handshake; always the configured one */
5537     if (!TEST_uint_eq(SSL_get_negotiated_group(clientssl), expectednid)
5538         || !TEST_uint_eq(SSL_get_negotiated_group(serverssl), expectednid))
5539         goto end;
5540 
5541     if (!TEST_ptr((origsess = SSL_get1_session(clientssl))))
5542         goto end;
5543 
5544     SSL_shutdown(clientssl);
5545     SSL_shutdown(serverssl);
5546     SSL_free(serverssl);
5547     SSL_free(clientssl);
5548     serverssl = clientssl = NULL;
5549 
5550     /* First resumption attempt; use the same config as initial handshake */
5551     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5552             NULL, NULL))
5553         || !TEST_true(SSL_set_session(clientssl, origsess))
5554         || !TEST_true(set_ssl_groups(serverssl, clientssl, clientmulti,
5555             isecdhe, idx)))
5556         goto end;
5557 
5558     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5559         || !TEST_true(SSL_session_reused(clientssl)))
5560         goto end;
5561 
5562     /* Still had better agree, since nothing changed... */
5563     if (!TEST_uint_eq(SSL_get_negotiated_group(clientssl), expectednid)
5564         || !TEST_uint_eq(SSL_get_negotiated_group(serverssl), expectednid))
5565         goto end;
5566 
5567     SSL_shutdown(clientssl);
5568     SSL_shutdown(serverssl);
5569     SSL_free(serverssl);
5570     SSL_free(clientssl);
5571     serverssl = clientssl = NULL;
5572 
5573     /*-
5574      * Second resumption attempt
5575      * The party that picks one group changes it, which we effectuate by
5576      * changing 'idx' and updating what we expect.
5577      */
5578     if (idx == 0)
5579         idx = 1;
5580     else
5581         idx--;
5582     if (istls13) {
5583         if (isecdhe)
5584             expectednid = ecdhe_kexch_groups[idx];
5585         else
5586             expectednid = ffdhe_kexch_groups[idx];
5587         /* Verify that we are changing what we expect. */
5588         if (!TEST_int_ne(expectednid, kexch_alg))
5589             goto end;
5590     } else {
5591         /* TLS 1.2 only supports named groups for ECDHE. */
5592         if (isecdhe)
5593             expectednid = kexch_alg;
5594         else
5595             expectednid = 0;
5596     }
5597     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5598             NULL, NULL))
5599         || !TEST_true(SSL_set_session(clientssl, origsess))
5600         || !TEST_true(set_ssl_groups(serverssl, clientssl, clientmulti,
5601             isecdhe, idx)))
5602         goto end;
5603 
5604     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5605         || !TEST_true(SSL_session_reused(clientssl)))
5606         goto end;
5607 
5608     /* Check that we get what we expected */
5609     if (!TEST_uint_eq(SSL_get_negotiated_group(clientssl), expectednid)
5610         || !TEST_uint_eq(SSL_get_negotiated_group(serverssl), expectednid))
5611         goto end;
5612 
5613     testresult = 1;
5614 end:
5615     SSL_free(serverssl);
5616     SSL_free(clientssl);
5617     SSL_CTX_free(sctx);
5618     SSL_CTX_free(cctx);
5619     SSL_SESSION_free(origsess);
5620     return testresult;
5621 }
5622 #endif /* !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_DH) */
5623 
5624 /*
5625  * Test TLSv1.3 Cipher Suite
5626  * Test 0 = Set TLS1.3 cipher on context
5627  * Test 1 = Set TLS1.3 cipher on SSL
5628  * Test 2 = Set TLS1.3 and TLS1.2 cipher on context
5629  * Test 3 = Set TLS1.3 and TLS1.2 cipher on SSL
5630  */
5631 static int test_tls13_ciphersuite(int idx)
5632 {
5633     SSL_CTX *sctx = NULL, *cctx = NULL;
5634     SSL *serverssl = NULL, *clientssl = NULL;
5635     static const struct {
5636         const char *ciphername;
5637         int fipscapable;
5638         int low_security;
5639     } t13_ciphers[] = {
5640         { TLS1_3_RFC_AES_128_GCM_SHA256, 1, 0 },
5641         { TLS1_3_RFC_AES_256_GCM_SHA384, 1, 0 },
5642         { TLS1_3_RFC_AES_128_CCM_SHA256, 1, 0 },
5643 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
5644         { TLS1_3_RFC_CHACHA20_POLY1305_SHA256, 0, 0 },
5645         { TLS1_3_RFC_AES_256_GCM_SHA384
5646             ":" TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
5647             0, 0 },
5648 #endif
5649         /* CCM8 ciphers are considered low security due to their short tag */
5650         { TLS1_3_RFC_AES_128_CCM_8_SHA256
5651             ":" TLS1_3_RFC_AES_128_CCM_SHA256,
5652             1, 1 },
5653 #if !defined(OPENSSL_NO_INTEGRITY_ONLY_CIPHERS)
5654         /* Integrity-only cipher do not provide any confidentiality */
5655         { TLS1_3_RFC_SHA256_SHA256, 0, 1 },
5656         { TLS1_3_RFC_SHA384_SHA384, 0, 1 }
5657 #endif
5658     };
5659     const char *t13_cipher = NULL;
5660     const char *t12_cipher = NULL;
5661     const char *negotiated_scipher;
5662     const char *negotiated_ccipher;
5663     int set_at_ctx = 0;
5664     int set_at_ssl = 0;
5665     int testresult = 0;
5666     int max_ver;
5667     size_t i;
5668 
5669     switch (idx) {
5670     case 0:
5671         set_at_ctx = 1;
5672         break;
5673     case 1:
5674         set_at_ssl = 1;
5675         break;
5676     case 2:
5677         set_at_ctx = 1;
5678         t12_cipher = TLS1_TXT_RSA_WITH_AES_128_SHA256;
5679         break;
5680     case 3:
5681         set_at_ssl = 1;
5682         t12_cipher = TLS1_TXT_RSA_WITH_AES_128_SHA256;
5683         break;
5684     }
5685 
5686     for (max_ver = TLS1_2_VERSION; max_ver <= TLS1_3_VERSION; max_ver++) {
5687 #ifdef OPENSSL_NO_TLS1_2
5688         if (max_ver == TLS1_2_VERSION)
5689             continue;
5690 #endif
5691         for (i = 0; i < OSSL_NELEM(t13_ciphers); i++) {
5692             if (is_fips && !t13_ciphers[i].fipscapable)
5693                 continue;
5694             t13_cipher = t13_ciphers[i].ciphername;
5695             if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5696                     TLS_client_method(),
5697                     TLS1_VERSION, max_ver,
5698                     &sctx, &cctx, cert, privkey)))
5699                 goto end;
5700 
5701             if (t13_ciphers[i].low_security) {
5702                 SSL_CTX_set_security_level(sctx, 0);
5703                 SSL_CTX_set_security_level(cctx, 0);
5704             }
5705 
5706             if (set_at_ctx) {
5707                 if (!TEST_true(SSL_CTX_set_ciphersuites(sctx, t13_cipher))
5708                     || !TEST_true(SSL_CTX_set_ciphersuites(cctx, t13_cipher)))
5709                     goto end;
5710                 if (t12_cipher != NULL) {
5711                     if (!TEST_true(SSL_CTX_set_cipher_list(sctx, t12_cipher))
5712                         || !TEST_true(SSL_CTX_set_cipher_list(cctx,
5713                             t12_cipher)))
5714                         goto end;
5715                 }
5716             }
5717 
5718             if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5719                     &clientssl, NULL, NULL)))
5720                 goto end;
5721 
5722             if (set_at_ssl) {
5723                 if (!TEST_true(SSL_set_ciphersuites(serverssl, t13_cipher))
5724                     || !TEST_true(SSL_set_ciphersuites(clientssl, t13_cipher)))
5725                     goto end;
5726                 if (t12_cipher != NULL) {
5727                     if (!TEST_true(SSL_set_cipher_list(serverssl, t12_cipher))
5728                         || !TEST_true(SSL_set_cipher_list(clientssl,
5729                             t12_cipher)))
5730                         goto end;
5731                 }
5732             }
5733 
5734             if (!TEST_true(create_ssl_connection(serverssl, clientssl,
5735                     SSL_ERROR_NONE)))
5736                 goto end;
5737 
5738             negotiated_scipher = SSL_CIPHER_get_name(SSL_get_current_cipher(
5739                 serverssl));
5740             negotiated_ccipher = SSL_CIPHER_get_name(SSL_get_current_cipher(
5741                 clientssl));
5742             if (!TEST_str_eq(negotiated_scipher, negotiated_ccipher))
5743                 goto end;
5744 
5745             /*
5746              * TEST_strn_eq is used below because t13_cipher can contain
5747              * multiple ciphersuites
5748              */
5749             if (max_ver == TLS1_3_VERSION
5750                 && !TEST_strn_eq(t13_cipher, negotiated_scipher,
5751                     strlen(negotiated_scipher)))
5752                 goto end;
5753 
5754 #ifndef OPENSSL_NO_TLS1_2
5755             /* Below validation is not done when t12_cipher is NULL */
5756             if (max_ver == TLS1_2_VERSION && t12_cipher != NULL
5757                 && !TEST_str_eq(t12_cipher, negotiated_scipher))
5758                 goto end;
5759 #endif
5760 
5761             SSL_free(serverssl);
5762             serverssl = NULL;
5763             SSL_free(clientssl);
5764             clientssl = NULL;
5765             SSL_CTX_free(sctx);
5766             sctx = NULL;
5767             SSL_CTX_free(cctx);
5768             cctx = NULL;
5769         }
5770     }
5771 
5772     testresult = 1;
5773 end:
5774     SSL_free(serverssl);
5775     SSL_free(clientssl);
5776     SSL_CTX_free(sctx);
5777     SSL_CTX_free(cctx);
5778     return testresult;
5779 }
5780 
5781 /*
5782  * Test TLSv1.3 PSKs
5783  * Test 0 = Test new style callbacks
5784  * Test 1 = Test both new and old style callbacks
5785  * Test 2 = Test old style callbacks
5786  * Test 3 = Test old style callbacks with no certificate
5787  */
5788 static int test_tls13_psk(int idx)
5789 {
5790     SSL_CTX *sctx = NULL, *cctx = NULL;
5791     SSL *serverssl = NULL, *clientssl = NULL;
5792     const SSL_CIPHER *cipher = NULL;
5793     const unsigned char key[] = {
5794         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
5795         0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
5796         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
5797         0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
5798     };
5799     int testresult = 0;
5800 
5801     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
5802             TLS_client_method(), TLS1_VERSION, 0,
5803             &sctx, &cctx, idx == 3 ? NULL : cert,
5804             idx == 3 ? NULL : privkey)))
5805         goto end;
5806 
5807     if (idx != 3) {
5808         /*
5809          * We use a ciphersuite with SHA256 to ease testing old style PSK
5810          * callbacks which will always default to SHA256. This should not be
5811          * necessary if we have no cert/priv key. In that case the server should
5812          * prefer SHA256 automatically.
5813          */
5814         if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
5815                 "TLS_AES_128_GCM_SHA256")))
5816             goto end;
5817     } else {
5818         /*
5819          * As noted above the server should prefer SHA256 automatically. However
5820          * we are careful not to offer TLS_CHACHA20_POLY1305_SHA256 so this same
5821          * code works even if we are testing with only the FIPS provider loaded.
5822          */
5823         if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
5824                 "TLS_AES_256_GCM_SHA384:"
5825                 "TLS_AES_128_GCM_SHA256")))
5826             goto end;
5827     }
5828 
5829     /*
5830      * Test 0: New style callbacks only
5831      * Test 1: New and old style callbacks (only the new ones should be used)
5832      * Test 2: Old style callbacks only
5833      */
5834     if (idx == 0 || idx == 1) {
5835         SSL_CTX_set_psk_use_session_callback(cctx, use_session_cb);
5836         SSL_CTX_set_psk_find_session_callback(sctx, find_session_cb);
5837     }
5838 #ifndef OPENSSL_NO_PSK
5839     if (idx >= 1) {
5840         SSL_CTX_set_psk_client_callback(cctx, psk_client_cb);
5841         SSL_CTX_set_psk_server_callback(sctx, psk_server_cb);
5842     }
5843 #endif
5844     srvid = pskid;
5845     use_session_cb_cnt = 0;
5846     find_session_cb_cnt = 0;
5847     psk_client_cb_cnt = 0;
5848     psk_server_cb_cnt = 0;
5849 
5850     if (idx != 3) {
5851         /*
5852          * Check we can create a connection if callback decides not to send a
5853          * PSK
5854          */
5855         if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5856                 NULL, NULL))
5857             || !TEST_true(create_ssl_connection(serverssl, clientssl,
5858                 SSL_ERROR_NONE))
5859             || !TEST_false(SSL_session_reused(clientssl))
5860             || !TEST_false(SSL_session_reused(serverssl)))
5861             goto end;
5862 
5863         if (idx == 0 || idx == 1) {
5864             if (!TEST_true(use_session_cb_cnt == 1)
5865                 || !TEST_true(find_session_cb_cnt == 0)
5866                 /*
5867                  * If no old style callback then below should be 0
5868                  * otherwise 1
5869                  */
5870                 || !TEST_true(psk_client_cb_cnt == idx)
5871                 || !TEST_true(psk_server_cb_cnt == 0))
5872                 goto end;
5873         } else {
5874             if (!TEST_true(use_session_cb_cnt == 0)
5875                 || !TEST_true(find_session_cb_cnt == 0)
5876                 || !TEST_true(psk_client_cb_cnt == 1)
5877                 || !TEST_true(psk_server_cb_cnt == 0))
5878                 goto end;
5879         }
5880 
5881         shutdown_ssl_connection(serverssl, clientssl);
5882         serverssl = clientssl = NULL;
5883         use_session_cb_cnt = psk_client_cb_cnt = 0;
5884     }
5885 
5886     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5887             NULL, NULL)))
5888         goto end;
5889 
5890     /* Create the PSK */
5891     cipher = SSL_CIPHER_find(clientssl, TLS13_AES_128_GCM_SHA256_BYTES);
5892     clientpsk = SSL_SESSION_new();
5893     if (!TEST_ptr(clientpsk)
5894         || !TEST_ptr(cipher)
5895         || !TEST_true(SSL_SESSION_set1_master_key(clientpsk, key,
5896             sizeof(key)))
5897         || !TEST_true(SSL_SESSION_set_cipher(clientpsk, cipher))
5898         || !TEST_true(SSL_SESSION_set_protocol_version(clientpsk,
5899             TLS1_3_VERSION))
5900         || !TEST_true(SSL_SESSION_up_ref(clientpsk)))
5901         goto end;
5902     serverpsk = clientpsk;
5903 
5904     /* Check we can create a connection and the PSK is used */
5905     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5906         || !TEST_true(SSL_session_reused(clientssl))
5907         || !TEST_true(SSL_session_reused(serverssl)))
5908         goto end;
5909 
5910     if (idx == 0 || idx == 1) {
5911         if (!TEST_true(use_session_cb_cnt == 1)
5912             || !TEST_true(find_session_cb_cnt == 1)
5913             || !TEST_true(psk_client_cb_cnt == 0)
5914             || !TEST_true(psk_server_cb_cnt == 0))
5915             goto end;
5916     } else {
5917         if (!TEST_true(use_session_cb_cnt == 0)
5918             || !TEST_true(find_session_cb_cnt == 0)
5919             || !TEST_true(psk_client_cb_cnt == 1)
5920             || !TEST_true(psk_server_cb_cnt == 1))
5921             goto end;
5922     }
5923 
5924     shutdown_ssl_connection(serverssl, clientssl);
5925     serverssl = clientssl = NULL;
5926     use_session_cb_cnt = find_session_cb_cnt = 0;
5927     psk_client_cb_cnt = psk_server_cb_cnt = 0;
5928 
5929     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5930             NULL, NULL)))
5931         goto end;
5932 
5933     /* Force an HRR */
5934 #if defined(OPENSSL_NO_EC)
5935     if (!TEST_true(SSL_set1_groups_list(serverssl, "ffdhe3072")))
5936         goto end;
5937 #else
5938     if (!TEST_true(SSL_set1_groups_list(serverssl, "P-384")))
5939         goto end;
5940 #endif
5941 
5942     /*
5943      * Check we can create a connection, the PSK is used and the callbacks are
5944      * called twice.
5945      */
5946     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
5947         || !TEST_true(SSL_session_reused(clientssl))
5948         || !TEST_true(SSL_session_reused(serverssl)))
5949         goto end;
5950 
5951     if (idx == 0 || idx == 1) {
5952         if (!TEST_true(use_session_cb_cnt == 2)
5953             || !TEST_true(find_session_cb_cnt == 2)
5954             || !TEST_true(psk_client_cb_cnt == 0)
5955             || !TEST_true(psk_server_cb_cnt == 0))
5956             goto end;
5957     } else {
5958         if (!TEST_true(use_session_cb_cnt == 0)
5959             || !TEST_true(find_session_cb_cnt == 0)
5960             || !TEST_true(psk_client_cb_cnt == 2)
5961             || !TEST_true(psk_server_cb_cnt == 2))
5962             goto end;
5963     }
5964 
5965     shutdown_ssl_connection(serverssl, clientssl);
5966     serverssl = clientssl = NULL;
5967     use_session_cb_cnt = find_session_cb_cnt = 0;
5968     psk_client_cb_cnt = psk_server_cb_cnt = 0;
5969 
5970     if (idx != 3) {
5971         /*
5972          * Check that if the server rejects the PSK we can still connect, but with
5973          * a full handshake
5974          */
5975         srvid = "Dummy Identity";
5976         if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5977                 NULL, NULL))
5978             || !TEST_true(create_ssl_connection(serverssl, clientssl,
5979                 SSL_ERROR_NONE))
5980             || !TEST_false(SSL_session_reused(clientssl))
5981             || !TEST_false(SSL_session_reused(serverssl)))
5982             goto end;
5983 
5984         if (idx == 0 || idx == 1) {
5985             if (!TEST_true(use_session_cb_cnt == 1)
5986                 || !TEST_true(find_session_cb_cnt == 1)
5987                 || !TEST_true(psk_client_cb_cnt == 0)
5988                 /*
5989                  * If no old style callback then below should be 0
5990                  * otherwise 1
5991                  */
5992                 || !TEST_true(psk_server_cb_cnt == idx))
5993                 goto end;
5994         } else {
5995             if (!TEST_true(use_session_cb_cnt == 0)
5996                 || !TEST_true(find_session_cb_cnt == 0)
5997                 || !TEST_true(psk_client_cb_cnt == 1)
5998                 || !TEST_true(psk_server_cb_cnt == 1))
5999                 goto end;
6000         }
6001 
6002         shutdown_ssl_connection(serverssl, clientssl);
6003         serverssl = clientssl = NULL;
6004     }
6005     testresult = 1;
6006 
6007 end:
6008     SSL_SESSION_free(clientpsk);
6009     SSL_SESSION_free(serverpsk);
6010     clientpsk = serverpsk = NULL;
6011     SSL_free(serverssl);
6012     SSL_free(clientssl);
6013     SSL_CTX_free(sctx);
6014     SSL_CTX_free(cctx);
6015     return testresult;
6016 }
6017 
6018 #ifndef OSSL_NO_USABLE_TLS1_3
6019 /*
6020  * Test TLS1.3 connection establishment succeeds with various configurations of
6021  * the options `SSL_OP_ALLOW_NO_DHE_KEX` and `SSL_OP_PREFER_NO_DHE_KEX`.
6022  * The verification of whether the right KEX mode is chosen is not covered by
6023  * this test but by `test_tls13kexmodes`.
6024  *
6025  * Tests (idx & 1): Server has `SSL_OP_ALLOW_NO_DHE_KEX` set.
6026  * Tests (idx & 2): Server has `SSL_OP_PREFER_NO_DHE_KEX` set.
6027  * Tests (idx & 4): Client has `SSL_OP_ALLOW_NO_DHE_KEX` set.
6028  */
6029 static int test_tls13_no_dhe_kex(const int idx)
6030 {
6031     SSL_CTX *sctx = NULL, *cctx = NULL;
6032     SSL *serverssl = NULL, *clientssl = NULL;
6033     int testresult = 0;
6034     size_t j;
6035     SSL_SESSION *saved_session;
6036 
6037     int server_allow_no_dhe = (idx & 1) != 0;
6038     int server_prefer_no_dhe = (idx & 2) != 0;
6039     int client_allow_no_dhe = (idx & 4) != 0;
6040 
6041     uint64_t server_options = 0
6042         | (server_allow_no_dhe ? SSL_OP_ALLOW_NO_DHE_KEX : 0)
6043         | (server_prefer_no_dhe ? SSL_OP_PREFER_NO_DHE_KEX : 0);
6044 
6045     uint64_t client_options = 0
6046         | (client_allow_no_dhe ? SSL_OP_ALLOW_NO_DHE_KEX : 0);
6047 
6048     new_called = 0;
6049     do_cache = 1;
6050 
6051     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6052             TLS_client_method(), TLS1_3_VERSION, 0,
6053             &sctx, &cctx, cert, privkey)))
6054         goto end;
6055 
6056     SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL_STORE);
6057 
6058     SSL_CTX_set_options(sctx, server_options);
6059     SSL_CTX_set_options(cctx, client_options);
6060 
6061     SSL_CTX_sess_set_new_cb(cctx, new_cachesession_cb);
6062 
6063     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
6064             &clientssl, NULL, NULL)))
6065         goto end;
6066 
6067     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
6068             SSL_ERROR_NONE))
6069         /* Check we got the number of tickets we were expecting */
6070         || !TEST_int_eq(2, new_called))
6071         goto end;
6072 
6073     /* We'll reuse the last ticket. */
6074     saved_session = sesscache[new_called - 1];
6075 
6076     SSL_shutdown(clientssl);
6077     SSL_shutdown(serverssl);
6078     SSL_free(serverssl);
6079     SSL_free(clientssl);
6080     SSL_CTX_free(cctx);
6081     clientssl = serverssl = NULL;
6082     cctx = NULL;
6083 
6084     /*
6085      * Now we resume with the last ticket we created.
6086      */
6087 
6088     /* The server context already exists, so we only create the client. */
6089     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6090             TLS_client_method(), TLS1_3_VERSION, 0,
6091             NULL, &cctx, cert, privkey)))
6092         goto end;
6093 
6094     SSL_CTX_set_options(cctx, client_options);
6095 
6096     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
6097             &clientssl, NULL, NULL))
6098         || !TEST_true(SSL_set_session(clientssl, saved_session)))
6099         goto end;
6100 
6101     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
6102             SSL_ERROR_NONE)))
6103         goto end;
6104 
6105     /*
6106      * Make sure, the session was resumed.
6107      */
6108     if (!TEST_true(SSL_session_reused(clientssl)))
6109         goto end;
6110 
6111     SSL_shutdown(clientssl);
6112     SSL_shutdown(serverssl);
6113 
6114     testresult = 1;
6115 
6116 end:
6117     SSL_free(serverssl);
6118     SSL_free(clientssl);
6119     for (j = 0; j < OSSL_NELEM(sesscache); j++) {
6120         SSL_SESSION_free(sesscache[j]);
6121         sesscache[j] = NULL;
6122     }
6123     SSL_CTX_free(sctx);
6124     SSL_CTX_free(cctx);
6125 
6126     return testresult;
6127 }
6128 #endif /* OSSL_NO_USABLE_TLS1_3 */
6129 
6130 static unsigned char cookie_magic_value[] = "cookie magic";
6131 
6132 static int generate_cookie_callback(SSL *ssl, unsigned char *cookie,
6133     unsigned int *cookie_len)
6134 {
6135     /*
6136      * Not suitable as a real cookie generation function but good enough for
6137      * testing!
6138      */
6139     memcpy(cookie, cookie_magic_value, sizeof(cookie_magic_value) - 1);
6140     *cookie_len = sizeof(cookie_magic_value) - 1;
6141 
6142     return 1;
6143 }
6144 
6145 static int verify_cookie_callback(SSL *ssl, const unsigned char *cookie,
6146     unsigned int cookie_len)
6147 {
6148     if (cookie_len == sizeof(cookie_magic_value) - 1
6149         && memcmp(cookie, cookie_magic_value, cookie_len) == 0)
6150         return 1;
6151 
6152     return 0;
6153 }
6154 
6155 static int generate_stateless_cookie_callback(SSL *ssl, unsigned char *cookie,
6156     size_t *cookie_len)
6157 {
6158     unsigned int temp;
6159     int res = generate_cookie_callback(ssl, cookie, &temp);
6160     *cookie_len = temp;
6161     return res;
6162 }
6163 
6164 static int verify_stateless_cookie_callback(SSL *ssl, const unsigned char *cookie,
6165     size_t cookie_len)
6166 {
6167     return verify_cookie_callback(ssl, cookie, cookie_len);
6168 }
6169 
6170 static int test_stateless(void)
6171 {
6172     SSL_CTX *sctx = NULL, *cctx = NULL;
6173     SSL *serverssl = NULL, *clientssl = NULL;
6174     int testresult = 0;
6175 
6176     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6177             TLS_client_method(), TLS1_VERSION, 0,
6178             &sctx, &cctx, cert, privkey)))
6179         goto end;
6180 
6181     /* The arrival of CCS messages can confuse the test */
6182     SSL_CTX_clear_options(cctx, SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
6183 
6184     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6185             NULL, NULL))
6186         /* Send the first ClientHello */
6187         || !TEST_false(create_ssl_connection(serverssl, clientssl,
6188             SSL_ERROR_WANT_READ))
6189         /*
6190          * This should fail with a -1 return because we have no callbacks
6191          * set up
6192          */
6193         || !TEST_int_eq(SSL_stateless(serverssl), -1))
6194         goto end;
6195 
6196     /* Fatal error so abandon the connection from this client */
6197     SSL_free(clientssl);
6198     clientssl = NULL;
6199 
6200     /* Set up the cookie generation and verification callbacks */
6201     SSL_CTX_set_stateless_cookie_generate_cb(sctx, generate_stateless_cookie_callback);
6202     SSL_CTX_set_stateless_cookie_verify_cb(sctx, verify_stateless_cookie_callback);
6203 
6204     /*
6205      * Create a new connection from the client (we can reuse the server SSL
6206      * object).
6207      */
6208     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6209             NULL, NULL))
6210         /* Send the first ClientHello */
6211         || !TEST_false(create_ssl_connection(serverssl, clientssl,
6212             SSL_ERROR_WANT_READ))
6213         /* This should fail because there is no cookie */
6214         || !TEST_int_eq(SSL_stateless(serverssl), 0))
6215         goto end;
6216 
6217     /* Abandon the connection from this client */
6218     SSL_free(clientssl);
6219     clientssl = NULL;
6220 
6221     /*
6222      * Now create a connection from a new client but with the same server SSL
6223      * object
6224      */
6225     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6226             NULL, NULL))
6227         /* Send the first ClientHello */
6228         || !TEST_false(create_ssl_connection(serverssl, clientssl,
6229             SSL_ERROR_WANT_READ))
6230         /* This should fail because there is no cookie */
6231         || !TEST_int_eq(SSL_stateless(serverssl), 0)
6232         /* Send the second ClientHello */
6233         || !TEST_false(create_ssl_connection(serverssl, clientssl,
6234             SSL_ERROR_WANT_READ))
6235         /* This should succeed because a cookie is now present */
6236         || !TEST_int_eq(SSL_stateless(serverssl), 1)
6237         /* Complete the connection */
6238         || !TEST_true(create_ssl_connection(serverssl, clientssl,
6239             SSL_ERROR_NONE)))
6240         goto end;
6241 
6242     shutdown_ssl_connection(serverssl, clientssl);
6243     serverssl = clientssl = NULL;
6244     testresult = 1;
6245 
6246 end:
6247     SSL_free(serverssl);
6248     SSL_free(clientssl);
6249     SSL_CTX_free(sctx);
6250     SSL_CTX_free(cctx);
6251     return testresult;
6252 }
6253 #endif /* OSSL_NO_USABLE_TLS1_3 */
6254 
6255 static int clntaddoldcb = 0;
6256 static int clntparseoldcb = 0;
6257 static int srvaddoldcb = 0;
6258 static int srvparseoldcb = 0;
6259 static int clntaddnewcb = 0;
6260 static int clntparsenewcb = 0;
6261 static int srvaddnewcb = 0;
6262 static int srvparsenewcb = 0;
6263 static int snicb = 0;
6264 
6265 #define TEST_EXT_TYPE1 0xff00
6266 
6267 static int old_add_cb(SSL *s, unsigned int ext_type, const unsigned char **out,
6268     size_t *outlen, int *al, void *add_arg)
6269 {
6270     int *server = (int *)add_arg;
6271     unsigned char *data;
6272 
6273     if (SSL_is_server(s))
6274         srvaddoldcb++;
6275     else
6276         clntaddoldcb++;
6277 
6278     if (*server != SSL_is_server(s)
6279         || (data = OPENSSL_malloc(sizeof(*data))) == NULL)
6280         return -1;
6281 
6282     *data = 1;
6283     *out = data;
6284     *outlen = sizeof(char);
6285     return 1;
6286 }
6287 
6288 static void old_free_cb(SSL *s, unsigned int ext_type, const unsigned char *out,
6289     void *add_arg)
6290 {
6291     OPENSSL_free((unsigned char *)out);
6292 }
6293 
6294 static int old_parse_cb(SSL *s, unsigned int ext_type, const unsigned char *in,
6295     size_t inlen, int *al, void *parse_arg)
6296 {
6297     int *server = (int *)parse_arg;
6298 
6299     if (SSL_is_server(s))
6300         srvparseoldcb++;
6301     else
6302         clntparseoldcb++;
6303 
6304     if (*server != SSL_is_server(s)
6305         || inlen != sizeof(char)
6306         || *in != 1)
6307         return -1;
6308 
6309     return 1;
6310 }
6311 
6312 static int new_add_cb(SSL *s, unsigned int ext_type, unsigned int context,
6313     const unsigned char **out, size_t *outlen, X509 *x,
6314     size_t chainidx, int *al, void *add_arg)
6315 {
6316     int *server = (int *)add_arg;
6317     unsigned char *data;
6318 
6319     if (SSL_is_server(s))
6320         srvaddnewcb++;
6321     else
6322         clntaddnewcb++;
6323 
6324     if (*server != SSL_is_server(s)
6325         || (data = OPENSSL_malloc(sizeof(*data))) == NULL)
6326         return -1;
6327 
6328     *data = 1;
6329     *out = data;
6330     *outlen = sizeof(*data);
6331     return 1;
6332 }
6333 
6334 static void new_free_cb(SSL *s, unsigned int ext_type, unsigned int context,
6335     const unsigned char *out, void *add_arg)
6336 {
6337     OPENSSL_free((unsigned char *)out);
6338 }
6339 
6340 static int new_parse_cb(SSL *s, unsigned int ext_type, unsigned int context,
6341     const unsigned char *in, size_t inlen, X509 *x,
6342     size_t chainidx, int *al, void *parse_arg)
6343 {
6344     int *server = (int *)parse_arg;
6345 
6346     if (SSL_is_server(s))
6347         srvparsenewcb++;
6348     else
6349         clntparsenewcb++;
6350 
6351     if (*server != SSL_is_server(s)
6352         || inlen != sizeof(char) || *in != 1)
6353         return -1;
6354 
6355     return 1;
6356 }
6357 
6358 static int sni_cb(SSL *s, int *al, void *arg)
6359 {
6360     SSL_CTX *ctx = (SSL_CTX *)arg;
6361 
6362     if (SSL_set_SSL_CTX(s, ctx) == NULL) {
6363         *al = SSL_AD_INTERNAL_ERROR;
6364         return SSL_TLSEXT_ERR_ALERT_FATAL;
6365     }
6366     snicb++;
6367     return SSL_TLSEXT_ERR_OK;
6368 }
6369 
6370 static int verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx)
6371 {
6372     return 1;
6373 }
6374 
6375 /*
6376  * Custom call back tests.
6377  * Test 0: Old style callbacks in TLSv1.2
6378  * Test 1: New style callbacks in TLSv1.2
6379  * Test 2: New style callbacks in TLSv1.2 with SNI
6380  * Test 3: New style callbacks in TLSv1.3. Extensions in CH and EE
6381  * Test 4: New style callbacks in TLSv1.3. Extensions in CH, SH, EE, Cert + NST
6382  * Test 5: New style callbacks in TLSv1.3. Extensions in CR + Client Cert
6383  */
6384 static int test_custom_exts(int tst)
6385 {
6386     SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
6387     SSL *clientssl = NULL, *serverssl = NULL;
6388     int testresult = 0;
6389     static int server = 1;
6390     static int client = 0;
6391     SSL_SESSION *sess = NULL;
6392     unsigned int context;
6393 
6394 #if defined(OPENSSL_NO_TLS1_2) && !defined(OSSL_NO_USABLE_TLS1_3)
6395     /* Skip tests for TLSv1.2 and below in this case */
6396     if (tst < 3)
6397         return 1;
6398 #endif
6399 
6400     /* Reset callback counters */
6401     clntaddoldcb = clntparseoldcb = srvaddoldcb = srvparseoldcb = 0;
6402     clntaddnewcb = clntparsenewcb = srvaddnewcb = srvparsenewcb = 0;
6403     snicb = 0;
6404 
6405     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6406             TLS_client_method(), TLS1_VERSION, 0,
6407             &sctx, &cctx, cert, privkey)))
6408         goto end;
6409 
6410     if (tst == 2
6411         && !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), NULL,
6412             TLS1_VERSION, 0,
6413             &sctx2, NULL, cert, privkey)))
6414         goto end;
6415 
6416     if (tst < 3) {
6417         SSL_CTX_set_options(cctx, SSL_OP_NO_TLSv1_3);
6418         SSL_CTX_set_options(sctx, SSL_OP_NO_TLSv1_3);
6419         if (sctx2 != NULL)
6420             SSL_CTX_set_options(sctx2, SSL_OP_NO_TLSv1_3);
6421     }
6422 
6423     if (tst == 5) {
6424         context = SSL_EXT_TLS1_3_CERTIFICATE_REQUEST
6425             | SSL_EXT_TLS1_3_CERTIFICATE;
6426         SSL_CTX_set_verify(sctx,
6427             SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
6428             verify_cb);
6429         if (!TEST_int_eq(SSL_CTX_use_certificate_file(cctx, cert,
6430                              SSL_FILETYPE_PEM),
6431                 1)
6432             || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(cctx, privkey,
6433                                 SSL_FILETYPE_PEM),
6434                 1)
6435             || !TEST_int_eq(SSL_CTX_check_private_key(cctx), 1))
6436             goto end;
6437     } else if (tst == 4) {
6438         context = SSL_EXT_CLIENT_HELLO
6439             | SSL_EXT_TLS1_2_SERVER_HELLO
6440             | SSL_EXT_TLS1_3_SERVER_HELLO
6441             | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS
6442             | SSL_EXT_TLS1_3_CERTIFICATE
6443             | SSL_EXT_TLS1_3_NEW_SESSION_TICKET;
6444     } else {
6445         context = SSL_EXT_CLIENT_HELLO
6446             | SSL_EXT_TLS1_2_SERVER_HELLO
6447             | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS;
6448     }
6449 
6450     /* Create a client side custom extension */
6451     if (tst == 0) {
6452         if (!TEST_true(SSL_CTX_add_client_custom_ext(cctx, TEST_EXT_TYPE1,
6453                 old_add_cb, old_free_cb,
6454                 &client, old_parse_cb,
6455                 &client)))
6456             goto end;
6457     } else {
6458         if (!TEST_true(SSL_CTX_add_custom_ext(cctx, TEST_EXT_TYPE1, context,
6459                 new_add_cb, new_free_cb,
6460                 &client, new_parse_cb, &client)))
6461             goto end;
6462     }
6463 
6464     /* Should not be able to add duplicates */
6465     if (!TEST_false(SSL_CTX_add_client_custom_ext(cctx, TEST_EXT_TYPE1,
6466             old_add_cb, old_free_cb,
6467             &client, old_parse_cb,
6468             &client))
6469         || !TEST_false(SSL_CTX_add_custom_ext(cctx, TEST_EXT_TYPE1,
6470             context, new_add_cb,
6471             new_free_cb, &client,
6472             new_parse_cb, &client)))
6473         goto end;
6474 
6475     /* Create a server side custom extension */
6476     if (tst == 0) {
6477         if (!TEST_true(SSL_CTX_add_server_custom_ext(sctx, TEST_EXT_TYPE1,
6478                 old_add_cb, old_free_cb,
6479                 &server, old_parse_cb,
6480                 &server)))
6481             goto end;
6482     } else {
6483         if (!TEST_true(SSL_CTX_add_custom_ext(sctx, TEST_EXT_TYPE1, context,
6484                 new_add_cb, new_free_cb,
6485                 &server, new_parse_cb, &server)))
6486             goto end;
6487         if (sctx2 != NULL
6488             && !TEST_true(SSL_CTX_add_custom_ext(sctx2, TEST_EXT_TYPE1,
6489                 context, new_add_cb,
6490                 new_free_cb, &server,
6491                 new_parse_cb, &server)))
6492             goto end;
6493     }
6494 
6495     /* Should not be able to add duplicates */
6496     if (!TEST_false(SSL_CTX_add_server_custom_ext(sctx, TEST_EXT_TYPE1,
6497             old_add_cb, old_free_cb,
6498             &server, old_parse_cb,
6499             &server))
6500         || !TEST_false(SSL_CTX_add_custom_ext(sctx, TEST_EXT_TYPE1,
6501             context, new_add_cb,
6502             new_free_cb, &server,
6503             new_parse_cb, &server)))
6504         goto end;
6505 
6506     if (tst == 2) {
6507         /* Set up SNI */
6508         if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
6509             || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
6510             goto end;
6511     }
6512 
6513     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
6514             &clientssl, NULL, NULL))
6515         || !TEST_true(create_ssl_connection(serverssl, clientssl,
6516             SSL_ERROR_NONE)))
6517         goto end;
6518 
6519     if (tst == 0) {
6520         if (clntaddoldcb != 1
6521             || clntparseoldcb != 1
6522             || srvaddoldcb != 1
6523             || srvparseoldcb != 1)
6524             goto end;
6525     } else if (tst == 1 || tst == 2 || tst == 3) {
6526         if (clntaddnewcb != 1
6527             || clntparsenewcb != 1
6528             || srvaddnewcb != 1
6529             || srvparsenewcb != 1
6530             || (tst != 2 && snicb != 0)
6531             || (tst == 2 && snicb != 1))
6532             goto end;
6533     } else if (tst == 5) {
6534         if (clntaddnewcb != 1
6535             || clntparsenewcb != 1
6536             || srvaddnewcb != 1
6537             || srvparsenewcb != 1)
6538             goto end;
6539     } else {
6540         /* In this case there 2 NewSessionTicket messages created */
6541         if (clntaddnewcb != 1
6542             || clntparsenewcb != 5
6543             || srvaddnewcb != 5
6544             || srvparsenewcb != 1)
6545             goto end;
6546     }
6547 
6548     sess = SSL_get1_session(clientssl);
6549     SSL_shutdown(clientssl);
6550     SSL_shutdown(serverssl);
6551     SSL_free(serverssl);
6552     SSL_free(clientssl);
6553     serverssl = clientssl = NULL;
6554 
6555     if (tst == 3 || tst == 5) {
6556         /* We don't bother with the resumption aspects for these tests */
6557         testresult = 1;
6558         goto end;
6559     }
6560 
6561     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6562             NULL, NULL))
6563         || !TEST_true(SSL_set_session(clientssl, sess))
6564         || !TEST_true(create_ssl_connection(serverssl, clientssl,
6565             SSL_ERROR_NONE)))
6566         goto end;
6567 
6568     /*
6569      * For a resumed session we expect to add the ClientHello extension. For the
6570      * old style callbacks we ignore it on the server side because they set
6571      * SSL_EXT_IGNORE_ON_RESUMPTION. The new style callbacks do not ignore
6572      * them.
6573      */
6574     if (tst == 0) {
6575         if (clntaddoldcb != 2
6576             || clntparseoldcb != 1
6577             || srvaddoldcb != 1
6578             || srvparseoldcb != 1)
6579             goto end;
6580     } else if (tst == 1 || tst == 2 || tst == 3) {
6581         if (clntaddnewcb != 2
6582             || clntparsenewcb != 2
6583             || srvaddnewcb != 2
6584             || srvparsenewcb != 2)
6585             goto end;
6586     } else {
6587         /*
6588          * No Certificate message extensions in the resumption handshake,
6589          * 2 NewSessionTickets in the initial handshake, 1 in the resumption
6590          */
6591         if (clntaddnewcb != 2
6592             || clntparsenewcb != 8
6593             || srvaddnewcb != 8
6594             || srvparsenewcb != 2)
6595             goto end;
6596     }
6597 
6598     testresult = 1;
6599 
6600 end:
6601     SSL_SESSION_free(sess);
6602     SSL_free(serverssl);
6603     SSL_free(clientssl);
6604     SSL_CTX_free(sctx2);
6605     SSL_CTX_free(sctx);
6606     SSL_CTX_free(cctx);
6607     return testresult;
6608 }
6609 
6610 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OSSL_NO_USABLE_TLS1_3)
6611 
6612 #define SYNTHV1CONTEXT (SSL_EXT_TLS1_2_AND_BELOW_ONLY \
6613     | SSL_EXT_CLIENT_HELLO                            \
6614     | SSL_EXT_TLS1_2_SERVER_HELLO                     \
6615     | SSL_EXT_IGNORE_ON_RESUMPTION)
6616 
6617 #define TLS13CONTEXT (SSL_EXT_TLS1_3_CERTIFICATE \
6618     | SSL_EXT_TLS1_2_SERVER_HELLO                \
6619     | SSL_EXT_CLIENT_HELLO)
6620 
6621 #define SERVERINFO_CUSTOM                                 \
6622     0x00, (char)TLSEXT_TYPE_signed_certificate_timestamp, \
6623         0x00, 0x03,                                       \
6624         0x04, 0x05, 0x06
6625 
6626 static const unsigned char serverinfo_custom_tls13[] = {
6627     0x00, 0x00, (TLS13CONTEXT >> 8) & 0xff, TLS13CONTEXT & 0xff,
6628     SERVERINFO_CUSTOM
6629 };
6630 static const unsigned char serverinfo_custom_v2[] = {
6631     0x00, 0x00, (SYNTHV1CONTEXT >> 8) & 0xff, SYNTHV1CONTEXT & 0xff,
6632     SERVERINFO_CUSTOM
6633 };
6634 static const unsigned char serverinfo_custom_v1[] = {
6635     SERVERINFO_CUSTOM
6636 };
6637 static const size_t serverinfo_custom_tls13_len = sizeof(serverinfo_custom_tls13);
6638 static const size_t serverinfo_custom_v2_len = sizeof(serverinfo_custom_v2);
6639 static const size_t serverinfo_custom_v1_len = sizeof(serverinfo_custom_v1);
6640 
6641 static int serverinfo_custom_parse_cb(SSL *s, unsigned int ext_type,
6642     unsigned int context,
6643     const unsigned char *in,
6644     size_t inlen, X509 *x,
6645     size_t chainidx, int *al,
6646     void *parse_arg)
6647 {
6648     const size_t len = serverinfo_custom_v1_len;
6649     const unsigned char *si = &serverinfo_custom_v1[len - 3];
6650     int *p_cb_result = (int *)parse_arg;
6651     *p_cb_result = TEST_mem_eq(in, inlen, si, 3);
6652     return 1;
6653 }
6654 
6655 static int test_serverinfo_custom(const int idx)
6656 {
6657     SSL_CTX *sctx = NULL, *cctx = NULL;
6658     SSL *clientssl = NULL, *serverssl = NULL;
6659     int testresult = 0;
6660     int cb_result = 0;
6661 
6662     /*
6663      * Following variables are set in the switch statement
6664      *  according to the test iteration.
6665      * Default values do not make much sense: test would fail with them.
6666      */
6667     int serverinfo_version = 0;
6668     int protocol_version = 0;
6669     unsigned int extension_context = 0;
6670     const unsigned char *si = NULL;
6671     size_t si_len = 0;
6672 
6673     const int call_use_serverinfo_ex = idx > 0;
6674     switch (idx) {
6675     case 0: /* FALLTHROUGH */
6676     case 1:
6677         serverinfo_version = SSL_SERVERINFOV1;
6678         protocol_version = TLS1_2_VERSION;
6679         extension_context = SYNTHV1CONTEXT;
6680         si = serverinfo_custom_v1;
6681         si_len = serverinfo_custom_v1_len;
6682         break;
6683     case 2:
6684         serverinfo_version = SSL_SERVERINFOV2;
6685         protocol_version = TLS1_2_VERSION;
6686         extension_context = SYNTHV1CONTEXT;
6687         si = serverinfo_custom_v2;
6688         si_len = serverinfo_custom_v2_len;
6689         break;
6690     case 3:
6691         serverinfo_version = SSL_SERVERINFOV2;
6692         protocol_version = TLS1_3_VERSION;
6693         extension_context = TLS13CONTEXT;
6694         si = serverinfo_custom_tls13;
6695         si_len = serverinfo_custom_tls13_len;
6696         break;
6697     }
6698 
6699     if (!TEST_true(create_ssl_ctx_pair(libctx,
6700             TLS_method(),
6701             TLS_method(),
6702             protocol_version,
6703             protocol_version,
6704             &sctx, &cctx, cert, privkey)))
6705         goto end;
6706 
6707     if (call_use_serverinfo_ex) {
6708         if (!TEST_true(SSL_CTX_use_serverinfo_ex(sctx, serverinfo_version,
6709                 si, si_len)))
6710             goto end;
6711     } else {
6712         if (!TEST_true(SSL_CTX_use_serverinfo(sctx, si, si_len)))
6713             goto end;
6714     }
6715 
6716     if (!TEST_true(SSL_CTX_add_custom_ext(cctx, TLSEXT_TYPE_signed_certificate_timestamp,
6717             extension_context,
6718             NULL, NULL, NULL,
6719             serverinfo_custom_parse_cb,
6720             &cb_result))
6721         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6722             NULL, NULL))
6723         || !TEST_true(create_ssl_connection(serverssl, clientssl,
6724             SSL_ERROR_NONE))
6725         || !TEST_int_eq(SSL_do_handshake(clientssl), 1))
6726         goto end;
6727 
6728     if (!TEST_true(cb_result))
6729         goto end;
6730 
6731     testresult = 1;
6732 
6733 end:
6734     SSL_free(serverssl);
6735     SSL_free(clientssl);
6736     SSL_CTX_free(sctx);
6737     SSL_CTX_free(cctx);
6738 
6739     return testresult;
6740 }
6741 #endif
6742 
6743 /*
6744  * Test that SSL_export_keying_material() produces expected results. There are
6745  * no test vectors so all we do is test that both sides of the communication
6746  * produce the same results for different protocol versions.
6747  */
6748 #define SMALL_LABEL_LEN 10
6749 #define LONG_LABEL_LEN 249
6750 static int test_export_key_mat(int tst)
6751 {
6752     int testresult = 0;
6753     SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
6754     SSL *clientssl = NULL, *serverssl = NULL;
6755     const char label[LONG_LABEL_LEN + 1] = "test label";
6756     const unsigned char context[] = "context";
6757     const unsigned char *emptycontext = NULL;
6758     unsigned char longcontext[1280];
6759     int test_longcontext = fips_provider_version_ge(libctx, 3, 3, 0);
6760     unsigned char ckeymat1[80], ckeymat2[80], ckeymat3[80], ckeymat4[80];
6761     unsigned char skeymat1[80], skeymat2[80], skeymat3[80], skeymat4[80];
6762     size_t labellen;
6763     const int protocols[] = {
6764         TLS1_VERSION,
6765         TLS1_1_VERSION,
6766         TLS1_2_VERSION,
6767         TLS1_3_VERSION,
6768         TLS1_3_VERSION,
6769         TLS1_3_VERSION
6770     };
6771 
6772 #ifdef OPENSSL_NO_TLS1
6773     if (tst == 0)
6774         return 1;
6775 #endif
6776 #ifdef OPENSSL_NO_TLS1_1
6777     if (tst == 1)
6778         return 1;
6779 #endif
6780     if (is_fips && (tst == 0 || tst == 1))
6781         return 1;
6782 #ifdef OPENSSL_NO_TLS1_2
6783     if (tst == 2)
6784         return 1;
6785 #endif
6786 #ifdef OSSL_NO_USABLE_TLS1_3
6787     if (tst >= 3)
6788         return 1;
6789 #endif
6790     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
6791             TLS_client_method(), TLS1_VERSION, 0,
6792             &sctx, &cctx, cert, privkey)))
6793         goto end;
6794 
6795     OPENSSL_assert(tst >= 0 && (size_t)tst < OSSL_NELEM(protocols));
6796     SSL_CTX_set_max_proto_version(cctx, protocols[tst]);
6797     SSL_CTX_set_min_proto_version(cctx, protocols[tst]);
6798     if ((protocols[tst] < TLS1_2_VERSION) && (!SSL_CTX_set_cipher_list(cctx, "DEFAULT:@SECLEVEL=0") || !SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0")))
6799         goto end;
6800 
6801     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
6802             NULL)))
6803         goto end;
6804 
6805     /*
6806      * Premature call of SSL_export_keying_material should just fail.
6807      */
6808     if (!TEST_int_le(SSL_export_keying_material(clientssl, ckeymat1,
6809                          sizeof(ckeymat1), label,
6810                          SMALL_LABEL_LEN + 1, context,
6811                          sizeof(context) - 1, 1),
6812             0))
6813         goto end;
6814 
6815     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
6816             SSL_ERROR_NONE)))
6817         goto end;
6818 
6819     if (tst == 5) {
6820         /*
6821          * TLSv1.3 imposes a maximum label len of 249 bytes. Check we fail if we
6822          * go over that.
6823          */
6824         if (!TEST_int_le(SSL_export_keying_material(clientssl, ckeymat1,
6825                              sizeof(ckeymat1), label,
6826                              LONG_LABEL_LEN + 1, context,
6827                              sizeof(context) - 1, 1),
6828                 0))
6829             goto end;
6830 
6831         testresult = 1;
6832         goto end;
6833     } else if (tst == 4) {
6834         labellen = LONG_LABEL_LEN;
6835     } else {
6836         labellen = SMALL_LABEL_LEN;
6837     }
6838 
6839     memset(longcontext, 1, sizeof(longcontext));
6840 
6841     if (!TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat1,
6842                          sizeof(ckeymat1), label,
6843                          labellen, context,
6844                          sizeof(context) - 1, 1),
6845             1)
6846         || !TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat2,
6847                             sizeof(ckeymat2), label,
6848                             labellen,
6849                             emptycontext,
6850                             0, 1),
6851             1)
6852         || !TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat3,
6853                             sizeof(ckeymat3), label,
6854                             labellen,
6855                             NULL, 0, 0),
6856             1)
6857         || (test_longcontext
6858             && !TEST_int_eq(SSL_export_keying_material(clientssl,
6859                                 ckeymat4,
6860                                 sizeof(ckeymat4), label,
6861                                 labellen,
6862                                 longcontext,
6863                                 sizeof(longcontext), 1),
6864                 1))
6865         || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat1,
6866                             sizeof(skeymat1), label,
6867                             labellen,
6868                             context,
6869                             sizeof(context) - 1, 1),
6870             1)
6871         || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat2,
6872                             sizeof(skeymat2), label,
6873                             labellen,
6874                             emptycontext,
6875                             0, 1),
6876             1)
6877         || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat3,
6878                             sizeof(skeymat3), label,
6879                             labellen,
6880                             NULL, 0, 0),
6881             1)
6882         || (test_longcontext
6883             && !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat4,
6884                                 sizeof(skeymat4), label,
6885                                 labellen,
6886                                 longcontext,
6887                                 sizeof(longcontext), 1),
6888                 1))
6889         /*
6890          * Check that both sides created the same key material with the
6891          * same context.
6892          */
6893         || !TEST_mem_eq(ckeymat1, sizeof(ckeymat1), skeymat1,
6894             sizeof(skeymat1))
6895         /*
6896          * Check that both sides created the same key material with an
6897          * empty context.
6898          */
6899         || !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), skeymat2,
6900             sizeof(skeymat2))
6901         /*
6902          * Check that both sides created the same key material without a
6903          * context.
6904          */
6905         || !TEST_mem_eq(ckeymat3, sizeof(ckeymat3), skeymat3,
6906             sizeof(skeymat3))
6907         /*
6908          * Check that both sides created the same key material with a
6909          * long context.
6910          */
6911         || (test_longcontext
6912             && !TEST_mem_eq(ckeymat4, sizeof(ckeymat4), skeymat4,
6913                 sizeof(skeymat4)))
6914         /* Different contexts should produce different results */
6915         || !TEST_mem_ne(ckeymat1, sizeof(ckeymat1), ckeymat2,
6916             sizeof(ckeymat2)))
6917         goto end;
6918 
6919     /*
6920      * Check that an empty context and no context produce different results in
6921      * protocols less than TLSv1.3. In TLSv1.3 they should be the same.
6922      */
6923     if ((tst < 3 && !TEST_mem_ne(ckeymat2, sizeof(ckeymat2), ckeymat3, sizeof(ckeymat3)))
6924         || (tst >= 3 && !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), ckeymat3, sizeof(ckeymat3))))
6925         goto end;
6926 
6927     testresult = 1;
6928 
6929 end:
6930     SSL_free(serverssl);
6931     SSL_free(clientssl);
6932     SSL_CTX_free(sctx2);
6933     SSL_CTX_free(sctx);
6934     SSL_CTX_free(cctx);
6935 
6936     return testresult;
6937 }
6938 
6939 #ifndef OSSL_NO_USABLE_TLS1_3
6940 /*
6941  * Test that SSL_export_keying_material_early() produces expected
6942  * results. There are no test vectors so all we do is test that both
6943  * sides of the communication produce the same results for different
6944  * protocol versions.
6945  */
6946 static int test_export_key_mat_early(int idx)
6947 {
6948     static const char label[] = "test label";
6949     static const unsigned char context[] = "context";
6950     int testresult = 0;
6951     SSL_CTX *cctx = NULL, *sctx = NULL;
6952     SSL *clientssl = NULL, *serverssl = NULL;
6953     SSL_SESSION *sess = NULL;
6954     const unsigned char *emptycontext = NULL;
6955     unsigned char ckeymat1[80], ckeymat2[80];
6956     unsigned char skeymat1[80], skeymat2[80];
6957     unsigned char buf[1];
6958     size_t readbytes, written;
6959 
6960     if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl, &serverssl,
6961             &sess, idx, SHA384_DIGEST_LENGTH)))
6962         goto end;
6963 
6964     /* Here writing 0 length early data is enough. */
6965     if (!TEST_true(SSL_write_early_data(clientssl, NULL, 0, &written))
6966         || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
6967                             &readbytes),
6968             SSL_READ_EARLY_DATA_ERROR)
6969         || !TEST_int_eq(SSL_get_early_data_status(serverssl),
6970             SSL_EARLY_DATA_ACCEPTED))
6971         goto end;
6972 
6973     if (!TEST_int_eq(SSL_export_keying_material_early(
6974                          clientssl, ckeymat1, sizeof(ckeymat1), label,
6975                          sizeof(label) - 1, context, sizeof(context) - 1),
6976             1)
6977         || !TEST_int_eq(SSL_export_keying_material_early(
6978                             clientssl, ckeymat2, sizeof(ckeymat2), label,
6979                             sizeof(label) - 1, emptycontext, 0),
6980             1)
6981         || !TEST_int_eq(SSL_export_keying_material_early(
6982                             serverssl, skeymat1, sizeof(skeymat1), label,
6983                             sizeof(label) - 1, context, sizeof(context) - 1),
6984             1)
6985         || !TEST_int_eq(SSL_export_keying_material_early(
6986                             serverssl, skeymat2, sizeof(skeymat2), label,
6987                             sizeof(label) - 1, emptycontext, 0),
6988             1)
6989         /*
6990          * Check that both sides created the same key material with the
6991          * same context.
6992          */
6993         || !TEST_mem_eq(ckeymat1, sizeof(ckeymat1), skeymat1,
6994             sizeof(skeymat1))
6995         /*
6996          * Check that both sides created the same key material with an
6997          * empty context.
6998          */
6999         || !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), skeymat2,
7000             sizeof(skeymat2))
7001         /* Different contexts should produce different results */
7002         || !TEST_mem_ne(ckeymat1, sizeof(ckeymat1), ckeymat2,
7003             sizeof(ckeymat2)))
7004         goto end;
7005 
7006     testresult = 1;
7007 
7008 end:
7009     SSL_SESSION_free(sess);
7010     SSL_SESSION_free(clientpsk);
7011     SSL_SESSION_free(serverpsk);
7012     clientpsk = serverpsk = NULL;
7013     SSL_free(serverssl);
7014     SSL_free(clientssl);
7015     SSL_CTX_free(sctx);
7016     SSL_CTX_free(cctx);
7017 
7018     return testresult;
7019 }
7020 
7021 #define NUM_KEY_UPDATE_MESSAGES 40
7022 /*
7023  * Test KeyUpdate.
7024  */
7025 static int test_key_update(void)
7026 {
7027     SSL_CTX *cctx = NULL, *sctx = NULL;
7028     SSL *clientssl = NULL, *serverssl = NULL;
7029     int testresult = 0, i, j;
7030     char buf[20];
7031     static char *mess = "A test message";
7032 
7033     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7034             TLS_client_method(),
7035             TLS1_3_VERSION,
7036             0,
7037             &sctx, &cctx, cert, privkey))
7038         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7039             NULL, NULL))
7040         || !TEST_true(create_ssl_connection(serverssl, clientssl,
7041             SSL_ERROR_NONE)))
7042         goto end;
7043 
7044     for (j = 0; j < 2; j++) {
7045         /* Send lots of KeyUpdate messages */
7046         for (i = 0; i < NUM_KEY_UPDATE_MESSAGES; i++) {
7047             if (!TEST_true(SSL_key_update(clientssl,
7048                     (j == 0)
7049                         ? SSL_KEY_UPDATE_NOT_REQUESTED
7050                         : SSL_KEY_UPDATE_REQUESTED))
7051                 || !TEST_true(SSL_do_handshake(clientssl)))
7052                 goto end;
7053         }
7054 
7055         /* Check that sending and receiving app data is ok */
7056         if (!TEST_int_eq(SSL_write(clientssl, mess, strlen(mess)), strlen(mess))
7057             || !TEST_int_eq(SSL_read(serverssl, buf, sizeof(buf)),
7058                 strlen(mess)))
7059             goto end;
7060 
7061         if (!TEST_int_eq(SSL_write(serverssl, mess, strlen(mess)), strlen(mess))
7062             || !TEST_int_eq(SSL_read(clientssl, buf, sizeof(buf)),
7063                 strlen(mess)))
7064             goto end;
7065     }
7066 
7067     testresult = 1;
7068 
7069 end:
7070     SSL_free(serverssl);
7071     SSL_free(clientssl);
7072     SSL_CTX_free(sctx);
7073     SSL_CTX_free(cctx);
7074 
7075     return testresult;
7076 }
7077 
7078 /*
7079  * Test we can handle a KeyUpdate (update requested) message while
7080  * write data is pending in peer.
7081  * Test 0: Client sends KeyUpdate while Server is writing
7082  * Test 1: Server sends KeyUpdate while Client is writing
7083  */
7084 static int test_key_update_peer_in_write(int tst)
7085 {
7086     SSL_CTX *cctx = NULL, *sctx = NULL;
7087     SSL *clientssl = NULL, *serverssl = NULL;
7088     int testresult = 0;
7089     char buf[20];
7090     static char *mess = "A test message";
7091     BIO *bretry = BIO_new(bio_s_always_retry());
7092     BIO *tmp = NULL;
7093     SSL *peerupdate = NULL, *peerwrite = NULL;
7094 
7095     if (!TEST_ptr(bretry)
7096         || !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7097             TLS_client_method(),
7098             TLS1_3_VERSION,
7099             0,
7100             &sctx, &cctx, cert, privkey))
7101         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7102             NULL, NULL))
7103         || !TEST_true(create_ssl_connection(serverssl, clientssl,
7104             SSL_ERROR_NONE)))
7105         goto end;
7106 
7107     peerupdate = tst == 0 ? clientssl : serverssl;
7108     peerwrite = tst == 0 ? serverssl : clientssl;
7109 
7110     if (!TEST_true(SSL_key_update(peerupdate, SSL_KEY_UPDATE_REQUESTED))
7111         || !TEST_int_eq(SSL_do_handshake(peerupdate), 1))
7112         goto end;
7113 
7114     /* Swap the writing endpoint's write BIO to force a retry */
7115     tmp = SSL_get_wbio(peerwrite);
7116     if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
7117         tmp = NULL;
7118         goto end;
7119     }
7120     SSL_set0_wbio(peerwrite, bretry);
7121     bretry = NULL;
7122 
7123     /* Write data that we know will fail with SSL_ERROR_WANT_WRITE */
7124     if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), -1)
7125         || !TEST_int_eq(SSL_get_error(peerwrite, 0), SSL_ERROR_WANT_WRITE)
7126         || !TEST_true(SSL_want_write(peerwrite))
7127         || !TEST_true(SSL_net_write_desired(peerwrite)))
7128         goto end;
7129 
7130     /* Reinstate the original writing endpoint's write BIO */
7131     SSL_set0_wbio(peerwrite, tmp);
7132     tmp = NULL;
7133 
7134     /* Now read some data - we will read the key update */
7135     if (!TEST_int_eq(SSL_read(peerwrite, buf, sizeof(buf)), -1)
7136         || !TEST_int_eq(SSL_get_error(peerwrite, 0), SSL_ERROR_WANT_READ)
7137         || !TEST_true(SSL_want_read(peerwrite))
7138         || !TEST_true(SSL_net_read_desired(peerwrite)))
7139         goto end;
7140 
7141     /*
7142      * Complete the write we started previously and read it from the other
7143      * endpoint
7144      */
7145     if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), strlen(mess))
7146         || !TEST_int_eq(SSL_read(peerupdate, buf, sizeof(buf)), strlen(mess)))
7147         goto end;
7148 
7149     /* Write more data to ensure we send the KeyUpdate message back */
7150     if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), strlen(mess))
7151         || !TEST_int_eq(SSL_read(peerupdate, buf, sizeof(buf)), strlen(mess)))
7152         goto end;
7153 
7154     if (!TEST_false(SSL_net_read_desired(peerwrite))
7155         || !TEST_false(SSL_net_write_desired(peerwrite))
7156         || !TEST_int_eq(SSL_want(peerwrite), SSL_NOTHING))
7157         goto end;
7158 
7159     testresult = 1;
7160 
7161 end:
7162     SSL_free(serverssl);
7163     SSL_free(clientssl);
7164     SSL_CTX_free(sctx);
7165     SSL_CTX_free(cctx);
7166     BIO_free(bretry);
7167     BIO_free(tmp);
7168 
7169     return testresult;
7170 }
7171 
7172 /*
7173  * Test we can handle a KeyUpdate (update requested) message while
7174  * peer read data is pending after peer accepted keyupdate(the msg header
7175  * had been read 5 bytes).
7176  * Test 0: Client sends KeyUpdate while Server is reading
7177  * Test 1: Server sends KeyUpdate while Client is reading
7178  */
7179 static int test_key_update_peer_in_read(int tst)
7180 {
7181     SSL_CTX *cctx = NULL, *sctx = NULL;
7182     SSL *clientssl = NULL, *serverssl = NULL;
7183     int testresult = 0;
7184     char prbuf[515], lwbuf[515] = { 0 };
7185     static char *mess = "A test message";
7186     BIO *lbio = NULL, *pbio = NULL;
7187     SSL *local = NULL, *peer = NULL;
7188 
7189     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7190             TLS_client_method(),
7191             TLS1_3_VERSION,
7192             0,
7193             &sctx, &cctx, cert, privkey))
7194         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7195             NULL, NULL))
7196         || !TEST_true(create_ssl_connection(serverssl, clientssl,
7197             SSL_ERROR_NONE)))
7198         goto end;
7199 
7200     local = tst == 0 ? clientssl : serverssl;
7201     peer = tst == 0 ? serverssl : clientssl;
7202 
7203     if (!TEST_int_eq(BIO_new_bio_pair(&lbio, 512, &pbio, 512), 1))
7204         goto end;
7205 
7206     SSL_set_bio(local, lbio, lbio);
7207     SSL_set_bio(peer, pbio, pbio);
7208 
7209     /*
7210      * we first write keyupdate msg then appdata in local
7211      * write data in local will fail with SSL_ERROR_WANT_WRITE,because
7212      * lwbuf app data msg size + key updata msg size > 512(the size of
7213      * the bio pair buffer)
7214      */
7215     if (!TEST_true(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
7216         || !TEST_int_eq(SSL_write(local, lwbuf, sizeof(lwbuf)), -1)
7217         || !TEST_int_eq(SSL_get_error(local, -1), SSL_ERROR_WANT_WRITE))
7218         goto end;
7219 
7220     /*
7221      * first read keyupdate msg in peer in peer
7222      * then read appdata that we know will fail with SSL_ERROR_WANT_READ
7223      */
7224     if (!TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), -1)
7225         || !TEST_int_eq(SSL_get_error(peer, -1), SSL_ERROR_WANT_READ))
7226         goto end;
7227 
7228     /* Now write some data in peer - we will write the key update */
7229     if (!TEST_int_eq(SSL_write(peer, mess, strlen(mess)), strlen(mess)))
7230         goto end;
7231 
7232     /*
7233      * write data in local previously that we will complete
7234      * read data in peer previously that we will complete
7235      */
7236     if (!TEST_int_eq(SSL_write(local, lwbuf, sizeof(lwbuf)), sizeof(lwbuf))
7237         || !TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), sizeof(prbuf)))
7238         goto end;
7239 
7240     /* check that sending and receiving appdata ok */
7241     if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess))
7242         || !TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), strlen(mess)))
7243         goto end;
7244 
7245     testresult = 1;
7246 
7247 end:
7248     SSL_free(serverssl);
7249     SSL_free(clientssl);
7250     SSL_CTX_free(sctx);
7251     SSL_CTX_free(cctx);
7252 
7253     return testresult;
7254 }
7255 
7256 /*
7257  * Test we can't send a KeyUpdate (update requested) message while
7258  * local write data is pending.
7259  * Test 0: Client sends KeyUpdate while Client is writing
7260  * Test 1: Server sends KeyUpdate while Server is writing
7261  */
7262 static int test_key_update_local_in_write(int tst)
7263 {
7264     SSL_CTX *cctx = NULL, *sctx = NULL;
7265     SSL *clientssl = NULL, *serverssl = NULL;
7266     int testresult = 0;
7267     char buf[20];
7268     static char *mess = "A test message";
7269     BIO *bretry = BIO_new(bio_s_always_retry());
7270     BIO *tmp = NULL;
7271     SSL *local = NULL, *peer = NULL;
7272 
7273     if (!TEST_ptr(bretry)
7274         || !TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7275             TLS_client_method(),
7276             TLS1_3_VERSION,
7277             0,
7278             &sctx, &cctx, cert, privkey))
7279         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7280             NULL, NULL))
7281         || !TEST_true(create_ssl_connection(serverssl, clientssl,
7282             SSL_ERROR_NONE)))
7283         goto end;
7284 
7285     local = tst == 0 ? clientssl : serverssl;
7286     peer = tst == 0 ? serverssl : clientssl;
7287 
7288     /* Swap the writing endpoint's write BIO to force a retry */
7289     tmp = SSL_get_wbio(local);
7290     if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
7291         tmp = NULL;
7292         goto end;
7293     }
7294     SSL_set0_wbio(local, bretry);
7295     bretry = NULL;
7296 
7297     /* write data in local will fail with SSL_ERROR_WANT_WRITE */
7298     if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), -1)
7299         || !TEST_int_eq(SSL_get_error(local, -1), SSL_ERROR_WANT_WRITE))
7300         goto end;
7301 
7302     /* Reinstate the original writing endpoint's write BIO */
7303     SSL_set0_wbio(local, tmp);
7304     tmp = NULL;
7305 
7306     /* SSL_key_update will fail, because writing in local*/
7307     if (!TEST_false(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
7308         || !TEST_int_eq(ERR_GET_REASON(ERR_peek_error()), SSL_R_BAD_WRITE_RETRY))
7309         goto end;
7310 
7311     ERR_clear_error();
7312     /* write data in local previously that we will complete */
7313     if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess)))
7314         goto end;
7315 
7316     /* SSL_key_update will succeed because there is no pending write data */
7317     if (!TEST_true(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
7318         || !TEST_int_eq(SSL_do_handshake(local), 1))
7319         goto end;
7320 
7321     /*
7322      * we write some appdata in local
7323      * read data in peer - we will read the keyupdate msg
7324      */
7325     if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess))
7326         || !TEST_int_eq(SSL_read(peer, buf, sizeof(buf)), strlen(mess)))
7327         goto end;
7328 
7329     /* Write more peer more data to ensure we send the keyupdate message back */
7330     if (!TEST_int_eq(SSL_write(peer, mess, strlen(mess)), strlen(mess))
7331         || !TEST_int_eq(SSL_read(local, buf, sizeof(buf)), strlen(mess)))
7332         goto end;
7333 
7334     testresult = 1;
7335 
7336 end:
7337     SSL_free(serverssl);
7338     SSL_free(clientssl);
7339     SSL_CTX_free(sctx);
7340     SSL_CTX_free(cctx);
7341     BIO_free(bretry);
7342     BIO_free(tmp);
7343 
7344     return testresult;
7345 }
7346 
7347 /*
7348  * Test we can handle a KeyUpdate (update requested) message while
7349  * local read data is pending(the msg header had been read 5 bytes).
7350  * Test 0: Client sends KeyUpdate while Client is reading
7351  * Test 1: Server sends KeyUpdate while Server is reading
7352  */
7353 static int test_key_update_local_in_read(int tst)
7354 {
7355     SSL_CTX *cctx = NULL, *sctx = NULL;
7356     SSL *clientssl = NULL, *serverssl = NULL;
7357     int testresult = 0;
7358     char lrbuf[515], pwbuf[515] = { 0 }, prbuf[20];
7359     static char *mess = "A test message";
7360     BIO *lbio = NULL, *pbio = NULL;
7361     SSL *local = NULL, *peer = NULL;
7362 
7363     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7364             TLS_client_method(),
7365             TLS1_3_VERSION,
7366             0,
7367             &sctx, &cctx, cert, privkey))
7368         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7369             NULL, NULL))
7370         || !TEST_true(create_ssl_connection(serverssl, clientssl,
7371             SSL_ERROR_NONE)))
7372         goto end;
7373 
7374     local = tst == 0 ? clientssl : serverssl;
7375     peer = tst == 0 ? serverssl : clientssl;
7376 
7377     if (!TEST_int_eq(BIO_new_bio_pair(&lbio, 512, &pbio, 512), 1))
7378         goto end;
7379 
7380     SSL_set_bio(local, lbio, lbio);
7381     SSL_set_bio(peer, pbio, pbio);
7382 
7383     /* write app data in peer will fail with SSL_ERROR_WANT_WRITE */
7384     if (!TEST_int_eq(SSL_write(peer, pwbuf, sizeof(pwbuf)), -1)
7385         || !TEST_int_eq(SSL_get_error(peer, -1), SSL_ERROR_WANT_WRITE))
7386         goto end;
7387 
7388     /* read appdata in local will fail with SSL_ERROR_WANT_READ */
7389     if (!TEST_int_eq(SSL_read(local, lrbuf, sizeof(lrbuf)), -1)
7390         || !TEST_int_eq(SSL_get_error(local, -1), SSL_ERROR_WANT_READ))
7391         goto end;
7392 
7393     /* SSL_do_handshake will send keyupdate msg */
7394     if (!TEST_true(SSL_key_update(local, SSL_KEY_UPDATE_REQUESTED))
7395         || !TEST_int_eq(SSL_do_handshake(local), 1))
7396         goto end;
7397 
7398     /*
7399      * write data in peer previously that we will complete
7400      * read data in local previously that we will complete
7401      */
7402     if (!TEST_int_eq(SSL_write(peer, pwbuf, sizeof(pwbuf)), sizeof(pwbuf))
7403         || !TEST_int_eq(SSL_read(local, lrbuf, sizeof(lrbuf)), sizeof(lrbuf)))
7404         goto end;
7405 
7406     /*
7407      * write data in local
7408      * read data in peer - we will read the key update
7409      */
7410     if (!TEST_int_eq(SSL_write(local, mess, strlen(mess)), strlen(mess))
7411         || !TEST_int_eq(SSL_read(peer, prbuf, sizeof(prbuf)), strlen(mess)))
7412         goto end;
7413 
7414     /* Write more peer data to ensure we send the keyupdate message back */
7415     if (!TEST_int_eq(SSL_write(peer, mess, strlen(mess)), strlen(mess))
7416         || !TEST_int_eq(SSL_read(local, lrbuf, sizeof(lrbuf)), strlen(mess)))
7417         goto end;
7418 
7419     testresult = 1;
7420 
7421 end:
7422     SSL_free(serverssl);
7423     SSL_free(clientssl);
7424     SSL_CTX_free(sctx);
7425     SSL_CTX_free(cctx);
7426 
7427     return testresult;
7428 }
7429 #endif /* OSSL_NO_USABLE_TLS1_3 */
7430 
7431 /*
7432  * Test clearing a connection via SSL_clear(), or resetting it via
7433  * SSL_set_connect_state()/SSL_set_accept_state()
7434  * Test 0: SSL_set_connect_state, TLSv1.3
7435  * Test 1: SSL_set_connect_state, TLSv1.2
7436  * Test 2: SSL_set_accept_state, TLSv1.3
7437  * Test 3: SSL_set_accept_state, TLSv1.2
7438  * Test 4: SSL_clear (client), TLSv1.3
7439  * Test 5: SSL_clear (client), TLSv1.2
7440  * Test 6: SSL_clear (server), TLSv1.3
7441  * Test 7: SSL_clear (server), TLSv1.2
7442  */
7443 static int test_ssl_clear(int idx)
7444 {
7445     SSL_CTX *cctx = NULL, *sctx = NULL;
7446     SSL *clientssl = NULL, *serverssl = NULL;
7447     SSL *writer, *reader;
7448     int testresult = 0;
7449     int tls12test, servertest, cleartest;
7450     size_t written, readbytes;
7451     const char *msg = "Hello World";
7452     unsigned char buf[5];
7453 
7454     tls12test = idx & 1;
7455     idx >>= 1;
7456     servertest = idx & 1;
7457     idx >>= 1;
7458     cleartest = idx & 1;
7459 
7460 #ifdef OPENSSL_NO_TLS1_2
7461     if (tls12test == 1)
7462         return TEST_skip("No TLSv1.2 in this build");
7463 #endif
7464 
7465     /* Create an initial connection */
7466     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7467             TLS_client_method(), TLS1_VERSION, 0,
7468             &sctx, &cctx, cert, privkey))
7469         || (tls12test
7470             && !TEST_true(SSL_CTX_set_max_proto_version(cctx,
7471                 TLS1_2_VERSION)))
7472         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
7473             &clientssl, NULL, NULL))
7474         || !TEST_true(create_ssl_connection(serverssl, clientssl,
7475             SSL_ERROR_NONE)))
7476         goto end;
7477 
7478     if (servertest) {
7479         writer = clientssl;
7480         reader = serverssl;
7481     } else {
7482         writer = serverssl;
7483         reader = clientssl;
7484     }
7485 
7486     /* Write some data */
7487     if (!TEST_true(SSL_write_ex(writer, msg, strlen(msg), &written))
7488         || written != strlen(msg))
7489         goto end;
7490 
7491     /*
7492      * Read a partial record. The remaining buffered data should be cleared by
7493      * the subsequent clear/reset
7494      */
7495     if (!TEST_true(SSL_read_ex(reader, buf, sizeof(buf), &readbytes))
7496         || readbytes != sizeof(buf))
7497         goto end;
7498 
7499     SSL_shutdown(clientssl);
7500     SSL_shutdown(serverssl);
7501 
7502     /* Reset/clear one SSL object in order to reuse it. We free the other one */
7503     if (servertest) {
7504         if (cleartest) {
7505             if (!TEST_true(SSL_clear(serverssl)))
7506                 goto end;
7507         } else {
7508             SSL_set_accept_state(serverssl);
7509         }
7510         SSL_free(clientssl);
7511         clientssl = NULL;
7512     } else {
7513         if (cleartest) {
7514             if (!TEST_true(SSL_clear(clientssl)))
7515                 goto end;
7516         } else {
7517             SSL_set_connect_state(clientssl);
7518         }
7519         SSL_free(serverssl);
7520         serverssl = NULL;
7521     }
7522 
7523     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7524             NULL, NULL))
7525         || !TEST_true(create_ssl_connection(serverssl, clientssl,
7526             SSL_ERROR_NONE))
7527         || !TEST_true(servertest || SSL_session_reused(clientssl)))
7528         goto end;
7529 
7530     SSL_shutdown(clientssl);
7531     SSL_shutdown(serverssl);
7532 
7533     testresult = 1;
7534 
7535 end:
7536     SSL_free(serverssl);
7537     SSL_free(clientssl);
7538     SSL_CTX_free(sctx);
7539     SSL_CTX_free(cctx);
7540 
7541     return testresult;
7542 }
7543 
7544 /* Parse CH and retrieve any MFL extension value if present */
7545 static int get_MFL_from_client_hello(BIO *bio, int *mfl_codemfl_code)
7546 {
7547     long len;
7548     unsigned char *data;
7549     PACKET pkt, pkt2, pkt3;
7550     unsigned int MFL_code = 0, type = 0;
7551 
7552     if (!TEST_uint_gt(len = BIO_get_mem_data(bio, (char **)&data), 0))
7553         goto end;
7554 
7555     memset(&pkt, 0, sizeof(pkt));
7556     memset(&pkt2, 0, sizeof(pkt2));
7557     memset(&pkt3, 0, sizeof(pkt3));
7558 
7559     if (!TEST_long_gt(len, 0)
7560         || !TEST_true(PACKET_buf_init(&pkt, data, len))
7561         /* Skip the record header */
7562         || !PACKET_forward(&pkt, SSL3_RT_HEADER_LENGTH)
7563         /* Skip the handshake message header */
7564         || !TEST_true(PACKET_forward(&pkt, SSL3_HM_HEADER_LENGTH))
7565         /* Skip client version and random */
7566         || !TEST_true(PACKET_forward(&pkt, CLIENT_VERSION_LEN + SSL3_RANDOM_SIZE))
7567         /* Skip session id */
7568         || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &pkt2))
7569         /* Skip ciphers */
7570         || !TEST_true(PACKET_get_length_prefixed_2(&pkt, &pkt2))
7571         /* Skip compression */
7572         || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &pkt2))
7573         /* Extensions len */
7574         || !TEST_true(PACKET_as_length_prefixed_2(&pkt, &pkt2)))
7575         goto end;
7576 
7577     /* Loop through all extensions */
7578     while (PACKET_remaining(&pkt2)) {
7579         if (!TEST_true(PACKET_get_net_2(&pkt2, &type))
7580             || !TEST_true(PACKET_get_length_prefixed_2(&pkt2, &pkt3)))
7581             goto end;
7582 
7583         if (type == TLSEXT_TYPE_max_fragment_length) {
7584             if (!TEST_uint_ne(PACKET_remaining(&pkt3), 0)
7585                 || !TEST_true(PACKET_get_1(&pkt3, &MFL_code)))
7586                 goto end;
7587 
7588             *mfl_codemfl_code = MFL_code;
7589             return 1;
7590         }
7591     }
7592 
7593 end:
7594     return 0;
7595 }
7596 
7597 /* Maximum-Fragment-Length TLS extension mode to test */
7598 static const unsigned char max_fragment_len_test[] = {
7599     TLSEXT_max_fragment_length_512,
7600     TLSEXT_max_fragment_length_1024,
7601     TLSEXT_max_fragment_length_2048,
7602     TLSEXT_max_fragment_length_4096
7603 };
7604 
7605 static int test_max_fragment_len_ext(int idx_tst)
7606 {
7607     SSL_CTX *ctx = NULL;
7608     SSL *con = NULL;
7609     int testresult = 0, MFL_mode = 0;
7610     BIO *rbio, *wbio;
7611 
7612     if (!TEST_true(create_ssl_ctx_pair(libctx, NULL, TLS_client_method(),
7613             TLS1_VERSION, 0, NULL, &ctx, NULL,
7614             NULL)))
7615         return 0;
7616 
7617     if (!TEST_true(SSL_CTX_set_tlsext_max_fragment_length(
7618             ctx, max_fragment_len_test[idx_tst])))
7619         goto end;
7620 
7621     con = SSL_new(ctx);
7622     if (!TEST_ptr(con))
7623         goto end;
7624 
7625     rbio = BIO_new(BIO_s_mem());
7626     wbio = BIO_new(BIO_s_mem());
7627     if (!TEST_ptr(rbio) || !TEST_ptr(wbio)) {
7628         BIO_free(rbio);
7629         BIO_free(wbio);
7630         goto end;
7631     }
7632 
7633     SSL_set_bio(con, rbio, wbio);
7634 
7635     if (!TEST_int_le(SSL_connect(con), 0)) {
7636         /* This shouldn't succeed because we don't have a server! */
7637         goto end;
7638     }
7639 
7640     if (!TEST_true(get_MFL_from_client_hello(wbio, &MFL_mode)))
7641         /* no MFL in client hello */
7642         goto end;
7643     if (!TEST_true(max_fragment_len_test[idx_tst] == MFL_mode))
7644         goto end;
7645 
7646     testresult = 1;
7647 
7648 end:
7649     SSL_free(con);
7650     SSL_CTX_free(ctx);
7651 
7652     return testresult;
7653 }
7654 
7655 #ifndef OSSL_NO_USABLE_TLS1_3
7656 static int test_pha_key_update(void)
7657 {
7658     SSL_CTX *cctx = NULL, *sctx = NULL;
7659     SSL *clientssl = NULL, *serverssl = NULL;
7660     int testresult = 0;
7661 
7662     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7663             TLS_client_method(), TLS1_VERSION, 0,
7664             &sctx, &cctx, cert, privkey)))
7665         return 0;
7666 
7667     if (!TEST_true(SSL_CTX_set_min_proto_version(sctx, TLS1_3_VERSION))
7668         || !TEST_true(SSL_CTX_set_max_proto_version(sctx, TLS1_3_VERSION))
7669         || !TEST_true(SSL_CTX_set_min_proto_version(cctx, TLS1_3_VERSION))
7670         || !TEST_true(SSL_CTX_set_max_proto_version(cctx, TLS1_3_VERSION)))
7671         goto end;
7672 
7673     SSL_CTX_set_post_handshake_auth(cctx, 1);
7674 
7675     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7676             NULL, NULL)))
7677         goto end;
7678 
7679     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
7680             SSL_ERROR_NONE)))
7681         goto end;
7682 
7683     SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
7684     if (!TEST_true(SSL_verify_client_post_handshake(serverssl)))
7685         goto end;
7686 
7687     if (!TEST_true(SSL_key_update(clientssl, SSL_KEY_UPDATE_NOT_REQUESTED)))
7688         goto end;
7689 
7690     /* Start handshake on the server */
7691     if (!TEST_int_eq(SSL_do_handshake(serverssl), 1))
7692         goto end;
7693 
7694     /* Starts with SSL_connect(), but it's really just SSL_do_handshake() */
7695     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
7696             SSL_ERROR_NONE)))
7697         goto end;
7698 
7699     SSL_shutdown(clientssl);
7700     SSL_shutdown(serverssl);
7701 
7702     testresult = 1;
7703 
7704 end:
7705     SSL_free(serverssl);
7706     SSL_free(clientssl);
7707     SSL_CTX_free(sctx);
7708     SSL_CTX_free(cctx);
7709     return testresult;
7710 }
7711 #endif
7712 
7713 #if !defined(OPENSSL_NO_SRP) && !defined(OPENSSL_NO_TLS1_2)
7714 
7715 static SRP_VBASE *vbase = NULL;
7716 
7717 static int ssl_srp_cb(SSL *s, int *ad, void *arg)
7718 {
7719     int ret = SSL3_AL_FATAL;
7720     char *username;
7721     SRP_user_pwd *user = NULL;
7722 
7723     username = SSL_get_srp_username(s);
7724     if (username == NULL) {
7725         *ad = SSL_AD_INTERNAL_ERROR;
7726         goto err;
7727     }
7728 
7729     user = SRP_VBASE_get1_by_user(vbase, username);
7730     if (user == NULL) {
7731         *ad = SSL_AD_INTERNAL_ERROR;
7732         goto err;
7733     }
7734 
7735     if (SSL_set_srp_server_param(s, user->N, user->g, user->s, user->v,
7736             user->info)
7737         <= 0) {
7738         *ad = SSL_AD_INTERNAL_ERROR;
7739         goto err;
7740     }
7741 
7742     ret = 0;
7743 
7744 err:
7745     SRP_user_pwd_free(user);
7746     return ret;
7747 }
7748 
7749 static int create_new_vfile(char *userid, char *password, const char *filename)
7750 {
7751     char *gNid = NULL;
7752     OPENSSL_STRING *row = OPENSSL_zalloc(sizeof(row) * (DB_NUMBER + 1));
7753     TXT_DB *db = NULL;
7754     int ret = 0;
7755     BIO *out = NULL, *dummy = BIO_new_mem_buf("", 0);
7756     size_t i;
7757 
7758     if (!TEST_ptr(dummy) || !TEST_ptr(row))
7759         goto end;
7760 
7761     gNid = SRP_create_verifier_ex(userid, password, &row[DB_srpsalt],
7762         &row[DB_srpverifier], NULL, NULL, libctx, NULL);
7763     if (!TEST_ptr(gNid))
7764         goto end;
7765 
7766     /*
7767      * The only way to create an empty TXT_DB is to provide a BIO with no data
7768      * in it!
7769      */
7770     db = TXT_DB_read(dummy, DB_NUMBER);
7771     if (!TEST_ptr(db))
7772         goto end;
7773 
7774     out = BIO_new_file(filename, "w");
7775     if (!TEST_ptr(out))
7776         goto end;
7777 
7778     row[DB_srpid] = OPENSSL_strdup(userid);
7779     row[DB_srptype] = OPENSSL_strdup("V");
7780     row[DB_srpgN] = OPENSSL_strdup(gNid);
7781 
7782     if (!TEST_ptr(row[DB_srpid])
7783         || !TEST_ptr(row[DB_srptype])
7784         || !TEST_ptr(row[DB_srpgN])
7785         || !TEST_true(TXT_DB_insert(db, row)))
7786         goto end;
7787 
7788     row = NULL;
7789 
7790     if (TXT_DB_write(out, db) <= 0)
7791         goto end;
7792 
7793     ret = 1;
7794 end:
7795     if (row != NULL) {
7796         for (i = 0; i < DB_NUMBER; i++)
7797             OPENSSL_free(row[i]);
7798     }
7799     OPENSSL_free(row);
7800     BIO_free(dummy);
7801     BIO_free(out);
7802     TXT_DB_free(db);
7803 
7804     return ret;
7805 }
7806 
7807 static int create_new_vbase(char *userid, char *password)
7808 {
7809     BIGNUM *verifier = NULL, *salt = NULL;
7810     const SRP_gN *lgN = NULL;
7811     SRP_user_pwd *user_pwd = NULL;
7812     int ret = 0;
7813 
7814     lgN = SRP_get_default_gN(NULL);
7815     if (!TEST_ptr(lgN))
7816         goto end;
7817 
7818     if (!TEST_true(SRP_create_verifier_BN_ex(userid, password, &salt, &verifier,
7819             lgN->N, lgN->g, libctx, NULL)))
7820         goto end;
7821 
7822     user_pwd = OPENSSL_zalloc(sizeof(*user_pwd));
7823     if (!TEST_ptr(user_pwd))
7824         goto end;
7825 
7826     user_pwd->N = lgN->N;
7827     user_pwd->g = lgN->g;
7828     user_pwd->id = OPENSSL_strdup(userid);
7829     if (!TEST_ptr(user_pwd->id))
7830         goto end;
7831 
7832     user_pwd->v = verifier;
7833     user_pwd->s = salt;
7834     verifier = salt = NULL;
7835 
7836     if (sk_SRP_user_pwd_insert(vbase->users_pwd, user_pwd, 0) == 0)
7837         goto end;
7838     user_pwd = NULL;
7839 
7840     ret = 1;
7841 end:
7842     SRP_user_pwd_free(user_pwd);
7843     BN_free(salt);
7844     BN_free(verifier);
7845 
7846     return ret;
7847 }
7848 
7849 /*
7850  * SRP tests
7851  *
7852  * Test 0: Simple successful SRP connection, new vbase
7853  * Test 1: Connection failure due to bad password, new vbase
7854  * Test 2: Simple successful SRP connection, vbase loaded from existing file
7855  * Test 3: Connection failure due to bad password, vbase loaded from existing
7856  *         file
7857  * Test 4: Simple successful SRP connection, vbase loaded from new file
7858  * Test 5: Connection failure due to bad password, vbase loaded from new file
7859  */
7860 static int test_srp(int tst)
7861 {
7862     char *userid = "test", *password = "password", *tstsrpfile;
7863     SSL_CTX *cctx = NULL, *sctx = NULL;
7864     SSL *clientssl = NULL, *serverssl = NULL;
7865     int ret, testresult = 0;
7866 
7867     vbase = SRP_VBASE_new(NULL);
7868     if (!TEST_ptr(vbase))
7869         goto end;
7870 
7871     if (tst == 0 || tst == 1) {
7872         if (!TEST_true(create_new_vbase(userid, password)))
7873             goto end;
7874     } else {
7875         if (tst == 4 || tst == 5) {
7876             if (!TEST_true(create_new_vfile(userid, password, tmpfilename)))
7877                 goto end;
7878             tstsrpfile = tmpfilename;
7879         } else {
7880             tstsrpfile = srpvfile;
7881         }
7882         if (!TEST_int_eq(SRP_VBASE_init(vbase, tstsrpfile), SRP_NO_ERROR))
7883             goto end;
7884     }
7885 
7886     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
7887             TLS_client_method(), TLS1_VERSION, 0,
7888             &sctx, &cctx, cert, privkey)))
7889         goto end;
7890 
7891     if (!TEST_int_gt(SSL_CTX_set_srp_username_callback(sctx, ssl_srp_cb), 0)
7892         || !TEST_true(SSL_CTX_set_cipher_list(cctx, "SRP-AES-128-CBC-SHA"))
7893         || !TEST_true(SSL_CTX_set_max_proto_version(sctx, TLS1_2_VERSION))
7894         || !TEST_true(SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION))
7895         || !TEST_int_gt(SSL_CTX_set_srp_username(cctx, userid), 0))
7896         goto end;
7897 
7898     if (tst % 2 == 1) {
7899         if (!TEST_int_gt(SSL_CTX_set_srp_password(cctx, "badpass"), 0))
7900             goto end;
7901     } else {
7902         if (!TEST_int_gt(SSL_CTX_set_srp_password(cctx, password), 0))
7903             goto end;
7904     }
7905 
7906     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
7907             NULL, NULL)))
7908         goto end;
7909 
7910     ret = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
7911     if (ret) {
7912         if (!TEST_true(tst % 2 == 0))
7913             goto end;
7914     } else {
7915         if (!TEST_true(tst % 2 == 1))
7916             goto end;
7917     }
7918 
7919     testresult = 1;
7920 
7921 end:
7922     SRP_VBASE_free(vbase);
7923     vbase = NULL;
7924     SSL_free(serverssl);
7925     SSL_free(clientssl);
7926     SSL_CTX_free(sctx);
7927     SSL_CTX_free(cctx);
7928 
7929     return testresult;
7930 }
7931 #endif
7932 
7933 static int info_cb_failed = 0;
7934 static int info_cb_offset = 0;
7935 static int info_cb_this_state = -1;
7936 
7937 static struct info_cb_states_st {
7938     int where;
7939     const char *statestr;
7940 } info_cb_states[][60] = {
7941     {
7942         /* TLSv1.2 server followed by resumption */
7943         { SSL_CB_HANDSHAKE_START, NULL },
7944         { SSL_CB_LOOP, "PINIT" },
7945         { SSL_CB_LOOP, "PINIT" },
7946         { SSL_CB_LOOP, "TRCH" },
7947         { SSL_CB_LOOP, "TWSH" },
7948         { SSL_CB_LOOP, "TWSC" },
7949         { SSL_CB_LOOP, "TWSKE" },
7950         { SSL_CB_LOOP, "TWSD" },
7951         { SSL_CB_EXIT, NULL },
7952         { SSL_CB_LOOP, "TWSD" },
7953         { SSL_CB_LOOP, "TRCKE" },
7954         { SSL_CB_LOOP, "TRCCS" },
7955         { SSL_CB_LOOP, "TRFIN" },
7956         { SSL_CB_LOOP, "TWST" },
7957         { SSL_CB_LOOP, "TWCCS" },
7958         { SSL_CB_LOOP, "TWFIN" },
7959         { SSL_CB_HANDSHAKE_DONE, NULL },
7960         { SSL_CB_EXIT, NULL },
7961         { SSL_CB_ALERT, NULL },
7962         { SSL_CB_HANDSHAKE_START, NULL },
7963         { SSL_CB_LOOP, "PINIT" },
7964         { SSL_CB_LOOP, "PINIT" },
7965         { SSL_CB_LOOP, "TRCH" },
7966         { SSL_CB_LOOP, "TWSH" },
7967         { SSL_CB_LOOP, "TWCCS" },
7968         { SSL_CB_LOOP, "TWFIN" },
7969         { SSL_CB_EXIT, NULL },
7970         { SSL_CB_LOOP, "TWFIN" },
7971         { SSL_CB_LOOP, "TRCCS" },
7972         { SSL_CB_LOOP, "TRFIN" },
7973         { SSL_CB_HANDSHAKE_DONE, NULL },
7974         { SSL_CB_EXIT, NULL },
7975         { 0, NULL },
7976     },
7977     {
7978         /* TLSv1.2 client followed by resumption */
7979         { SSL_CB_HANDSHAKE_START, NULL },
7980         { SSL_CB_LOOP, "PINIT" },
7981         { SSL_CB_LOOP, "TWCH" },
7982         { SSL_CB_EXIT, NULL },
7983         { SSL_CB_LOOP, "TWCH" },
7984         { SSL_CB_LOOP, "TRSH" },
7985         { SSL_CB_LOOP, "TRSC" },
7986         { SSL_CB_LOOP, "TRSKE" },
7987         { SSL_CB_LOOP, "TRSD" },
7988         { SSL_CB_LOOP, "TWCKE" },
7989         { SSL_CB_LOOP, "TWCCS" },
7990         { SSL_CB_LOOP, "TWFIN" },
7991         { SSL_CB_EXIT, NULL },
7992         { SSL_CB_LOOP, "TWFIN" },
7993         { SSL_CB_LOOP, "TRST" },
7994         { SSL_CB_LOOP, "TRCCS" },
7995         { SSL_CB_LOOP, "TRFIN" },
7996         { SSL_CB_HANDSHAKE_DONE, NULL },
7997         { SSL_CB_EXIT, NULL },
7998         { SSL_CB_ALERT, NULL },
7999         { SSL_CB_HANDSHAKE_START, NULL },
8000         { SSL_CB_LOOP, "PINIT" },
8001         { SSL_CB_LOOP, "TWCH" },
8002         { SSL_CB_EXIT, NULL },
8003         { SSL_CB_LOOP, "TWCH" },
8004         { SSL_CB_LOOP, "TRSH" },
8005         { SSL_CB_LOOP, "TRCCS" },
8006         { SSL_CB_LOOP, "TRFIN" },
8007         { SSL_CB_LOOP, "TWCCS" },
8008         { SSL_CB_LOOP, "TWFIN" },
8009         { SSL_CB_HANDSHAKE_DONE, NULL },
8010         { SSL_CB_EXIT, NULL },
8011         { 0, NULL },
8012     },
8013     {
8014         /* TLSv1.3 server followed by resumption */
8015         { SSL_CB_HANDSHAKE_START, NULL },
8016         { SSL_CB_LOOP, "PINIT" },
8017         { SSL_CB_LOOP, "PINIT" },
8018         { SSL_CB_LOOP, "TRCH" },
8019         { SSL_CB_LOOP, "TWSH" },
8020         { SSL_CB_LOOP, "TWCCS" },
8021         { SSL_CB_LOOP, "TWEE" },
8022         { SSL_CB_LOOP, "TWSC" },
8023         { SSL_CB_LOOP, "TWSCV" },
8024         { SSL_CB_LOOP, "TWFIN" },
8025         { SSL_CB_LOOP, "TED" },
8026         { SSL_CB_EXIT, NULL },
8027         { SSL_CB_LOOP, "TED" },
8028         { SSL_CB_LOOP, "TRFIN" },
8029         { SSL_CB_HANDSHAKE_DONE, NULL },
8030         { SSL_CB_LOOP, "TWST" },
8031         { SSL_CB_LOOP, "TWST" },
8032         { SSL_CB_EXIT, NULL },
8033         { SSL_CB_ALERT, NULL },
8034         { SSL_CB_HANDSHAKE_START, NULL },
8035         { SSL_CB_LOOP, "PINIT" },
8036         { SSL_CB_LOOP, "PINIT" },
8037         { SSL_CB_LOOP, "TRCH" },
8038         { SSL_CB_LOOP, "TWSH" },
8039         { SSL_CB_LOOP, "TWCCS" },
8040         { SSL_CB_LOOP, "TWEE" },
8041         { SSL_CB_LOOP, "TWFIN" },
8042         { SSL_CB_LOOP, "TED" },
8043         { SSL_CB_EXIT, NULL },
8044         { SSL_CB_LOOP, "TED" },
8045         { SSL_CB_LOOP, "TRFIN" },
8046         { SSL_CB_HANDSHAKE_DONE, NULL },
8047         { SSL_CB_LOOP, "TWST" },
8048         { SSL_CB_EXIT, NULL },
8049         { 0, NULL },
8050     },
8051     {
8052         /* TLSv1.3 client followed by resumption */
8053         { SSL_CB_HANDSHAKE_START, NULL },
8054         { SSL_CB_LOOP, "PINIT" },
8055         { SSL_CB_LOOP, "TWCH" },
8056         { SSL_CB_EXIT, NULL },
8057         { SSL_CB_LOOP, "TWCH" },
8058         { SSL_CB_LOOP, "TRSH" },
8059         { SSL_CB_LOOP, "TREE" },
8060         { SSL_CB_LOOP, "TRSC" },
8061         { SSL_CB_LOOP, "TRSCV" },
8062         { SSL_CB_LOOP, "TRFIN" },
8063         { SSL_CB_LOOP, "TWCCS" },
8064         { SSL_CB_LOOP, "TWFIN" },
8065         { SSL_CB_HANDSHAKE_DONE, NULL },
8066         { SSL_CB_EXIT, NULL },
8067         { SSL_CB_LOOP, "SSLOK" },
8068         { SSL_CB_LOOP, "SSLOK" },
8069         { SSL_CB_LOOP, "TRST" },
8070         { SSL_CB_EXIT, NULL },
8071         { SSL_CB_LOOP, "SSLOK" },
8072         { SSL_CB_LOOP, "SSLOK" },
8073         { SSL_CB_LOOP, "TRST" },
8074         { SSL_CB_EXIT, NULL },
8075         { SSL_CB_ALERT, NULL },
8076         { SSL_CB_HANDSHAKE_START, NULL },
8077         { SSL_CB_LOOP, "PINIT" },
8078         { SSL_CB_LOOP, "TWCH" },
8079         { SSL_CB_EXIT, NULL },
8080         { SSL_CB_LOOP, "TWCH" },
8081         { SSL_CB_LOOP, "TRSH" },
8082         { SSL_CB_LOOP, "TREE" },
8083         { SSL_CB_LOOP, "TRFIN" },
8084         { SSL_CB_LOOP, "TWCCS" },
8085         { SSL_CB_LOOP, "TWFIN" },
8086         { SSL_CB_HANDSHAKE_DONE, NULL },
8087         { SSL_CB_EXIT, NULL },
8088         { SSL_CB_LOOP, "SSLOK" },
8089         { SSL_CB_LOOP, "SSLOK" },
8090         { SSL_CB_LOOP, "TRST" },
8091         { SSL_CB_EXIT, NULL },
8092         { 0, NULL },
8093     },
8094     {
8095         /* TLSv1.3 server, early_data */
8096         { SSL_CB_HANDSHAKE_START, NULL },
8097         { SSL_CB_LOOP, "PINIT" },
8098         { SSL_CB_LOOP, "PINIT" },
8099         { SSL_CB_LOOP, "TRCH" },
8100         { SSL_CB_LOOP, "TWSH" },
8101         { SSL_CB_LOOP, "TWCCS" },
8102         { SSL_CB_LOOP, "TWEE" },
8103         { SSL_CB_LOOP, "TWFIN" },
8104         { SSL_CB_HANDSHAKE_DONE, NULL },
8105         { SSL_CB_EXIT, NULL },
8106         { SSL_CB_HANDSHAKE_START, NULL },
8107         { SSL_CB_LOOP, "TED" },
8108         { SSL_CB_LOOP, "TED" },
8109         { SSL_CB_LOOP, "TWEOED" },
8110         { SSL_CB_LOOP, "TRFIN" },
8111         { SSL_CB_HANDSHAKE_DONE, NULL },
8112         { SSL_CB_LOOP, "TWST" },
8113         { SSL_CB_EXIT, NULL },
8114         { 0, NULL },
8115     },
8116     {
8117         /* TLSv1.3 client, early_data */
8118         { SSL_CB_HANDSHAKE_START, NULL },
8119         { SSL_CB_LOOP, "PINIT" },
8120         { SSL_CB_LOOP, "TWCH" },
8121         { SSL_CB_LOOP, "TWCCS" },
8122         { SSL_CB_HANDSHAKE_DONE, NULL },
8123         { SSL_CB_EXIT, NULL },
8124         { SSL_CB_HANDSHAKE_START, NULL },
8125         { SSL_CB_LOOP, "TED" },
8126         { SSL_CB_LOOP, "TED" },
8127         { SSL_CB_LOOP, "TRSH" },
8128         { SSL_CB_LOOP, "TREE" },
8129         { SSL_CB_LOOP, "TRFIN" },
8130         { SSL_CB_LOOP, "TPEDE" },
8131         { SSL_CB_LOOP, "TWEOED" },
8132         { SSL_CB_LOOP, "TWFIN" },
8133         { SSL_CB_HANDSHAKE_DONE, NULL },
8134         { SSL_CB_EXIT, NULL },
8135         { SSL_CB_LOOP, "SSLOK" },
8136         { SSL_CB_LOOP, "SSLOK" },
8137         { SSL_CB_LOOP, "TRST" },
8138         { SSL_CB_EXIT, NULL },
8139         { 0, NULL },
8140     },
8141     {
8142         /* TLSv1.3 server, certificate compression, followed by resumption */
8143         { SSL_CB_HANDSHAKE_START, NULL },
8144         { SSL_CB_LOOP, "PINIT" },
8145         { SSL_CB_LOOP, "PINIT" },
8146         { SSL_CB_LOOP, "TRCH" },
8147         { SSL_CB_LOOP, "TWSH" },
8148         { SSL_CB_LOOP, "TWCCS" },
8149         { SSL_CB_LOOP, "TWEE" },
8150         { SSL_CB_LOOP, "TWSCC" },
8151         { SSL_CB_LOOP, "TWSCV" },
8152         { SSL_CB_LOOP, "TWFIN" },
8153         { SSL_CB_LOOP, "TED" },
8154         { SSL_CB_EXIT, NULL },
8155         { SSL_CB_LOOP, "TED" },
8156         { SSL_CB_LOOP, "TRFIN" },
8157         { SSL_CB_HANDSHAKE_DONE, NULL },
8158         { SSL_CB_LOOP, "TWST" },
8159         { SSL_CB_LOOP, "TWST" },
8160         { SSL_CB_EXIT, NULL },
8161         { SSL_CB_ALERT, NULL },
8162         { SSL_CB_HANDSHAKE_START, NULL },
8163         { SSL_CB_LOOP, "PINIT" },
8164         { SSL_CB_LOOP, "PINIT" },
8165         { SSL_CB_LOOP, "TRCH" },
8166         { SSL_CB_LOOP, "TWSH" },
8167         { SSL_CB_LOOP, "TWCCS" },
8168         { SSL_CB_LOOP, "TWEE" },
8169         { SSL_CB_LOOP, "TWFIN" },
8170         { SSL_CB_LOOP, "TED" },
8171         { SSL_CB_EXIT, NULL },
8172         { SSL_CB_LOOP, "TED" },
8173         { SSL_CB_LOOP, "TRFIN" },
8174         { SSL_CB_HANDSHAKE_DONE, NULL },
8175         { SSL_CB_LOOP, "TWST" },
8176         { SSL_CB_EXIT, NULL },
8177         { 0, NULL },
8178     },
8179     {
8180         /* TLSv1.3 client, certificate compression, followed by resumption */
8181         { SSL_CB_HANDSHAKE_START, NULL },
8182         { SSL_CB_LOOP, "PINIT" },
8183         { SSL_CB_LOOP, "TWCH" },
8184         { SSL_CB_EXIT, NULL },
8185         { SSL_CB_LOOP, "TWCH" },
8186         { SSL_CB_LOOP, "TRSH" },
8187         { SSL_CB_LOOP, "TREE" },
8188         { SSL_CB_LOOP, "TRSCC" },
8189         { SSL_CB_LOOP, "TRSCV" },
8190         { SSL_CB_LOOP, "TRFIN" },
8191         { SSL_CB_LOOP, "TWCCS" },
8192         { SSL_CB_LOOP, "TWFIN" },
8193         { SSL_CB_HANDSHAKE_DONE, NULL },
8194         { SSL_CB_EXIT, NULL },
8195         { SSL_CB_LOOP, "SSLOK" },
8196         { SSL_CB_LOOP, "SSLOK" },
8197         { SSL_CB_LOOP, "TRST" },
8198         { SSL_CB_EXIT, NULL },
8199         { SSL_CB_LOOP, "SSLOK" },
8200         { SSL_CB_LOOP, "SSLOK" },
8201         { SSL_CB_LOOP, "TRST" },
8202         { SSL_CB_EXIT, NULL },
8203         { SSL_CB_ALERT, NULL },
8204         { SSL_CB_HANDSHAKE_START, NULL },
8205         { SSL_CB_LOOP, "PINIT" },
8206         { SSL_CB_LOOP, "TWCH" },
8207         { SSL_CB_EXIT, NULL },
8208         { SSL_CB_LOOP, "TWCH" },
8209         { SSL_CB_LOOP, "TRSH" },
8210         { SSL_CB_LOOP, "TREE" },
8211         { SSL_CB_LOOP, "TRFIN" },
8212         { SSL_CB_LOOP, "TWCCS" },
8213         { SSL_CB_LOOP, "TWFIN" },
8214         { SSL_CB_HANDSHAKE_DONE, NULL },
8215         { SSL_CB_EXIT, NULL },
8216         { SSL_CB_LOOP, "SSLOK" },
8217         { SSL_CB_LOOP, "SSLOK" },
8218         { SSL_CB_LOOP, "TRST" },
8219         { SSL_CB_EXIT, NULL },
8220         { 0, NULL },
8221     },
8222     {
8223         { 0, NULL },
8224     }
8225 };
8226 
8227 static void sslapi_info_callback(const SSL *s, int where, int ret)
8228 {
8229     struct info_cb_states_st *state = info_cb_states[info_cb_offset];
8230 
8231     /* We do not ever expect a connection to fail in this test */
8232     if (!TEST_false(ret == 0)) {
8233         info_cb_failed = 1;
8234         return;
8235     }
8236 
8237     /*
8238      * Do some sanity checks. We never expect these things to happen in this
8239      * test
8240      */
8241     if (!TEST_false((SSL_is_server(s) && (where & SSL_ST_CONNECT) != 0))
8242         || !TEST_false(!SSL_is_server(s) && (where & SSL_ST_ACCEPT) != 0)
8243         || !TEST_int_ne(state[++info_cb_this_state].where, 0)) {
8244         info_cb_failed = 1;
8245         return;
8246     }
8247 
8248     /* Now check we're in the right state */
8249     if (!TEST_true((where & state[info_cb_this_state].where) != 0)) {
8250         info_cb_failed = 1;
8251         return;
8252     }
8253     if ((where & SSL_CB_LOOP) != 0
8254         && !TEST_int_eq(strcmp(SSL_state_string(s),
8255                             state[info_cb_this_state].statestr),
8256             0)) {
8257         info_cb_failed = 1;
8258         return;
8259     }
8260 
8261     /*
8262      * Check that, if we've got SSL_CB_HANDSHAKE_DONE we are not in init
8263      */
8264     if ((where & SSL_CB_HANDSHAKE_DONE)
8265         && SSL_in_init((SSL *)s) != 0) {
8266         info_cb_failed = 1;
8267         return;
8268     }
8269 }
8270 
8271 /*
8272  * Test the info callback gets called when we expect it to.
8273  *
8274  * Test 0: TLSv1.2, server
8275  * Test 1: TLSv1.2, client
8276  * Test 2: TLSv1.3, server
8277  * Test 3: TLSv1.3, client
8278  * Test 4: TLSv1.3, server, early_data
8279  * Test 5: TLSv1.3, client, early_data
8280  * Test 6: TLSv1.3, server, compressed certificate
8281  * Test 7: TLSv1.3, client, compressed certificate
8282  */
8283 static int test_info_callback(int tst)
8284 {
8285     SSL_CTX *cctx = NULL, *sctx = NULL;
8286     SSL *clientssl = NULL, *serverssl = NULL;
8287     SSL_SESSION *clntsess = NULL;
8288     int testresult = 0;
8289     int tlsvers;
8290 
8291     if (tst < 2) {
8292 /* We need either ECDHE or DHE for the TLSv1.2 test to work */
8293 #if !defined(OPENSSL_NO_TLS1_2) && (!defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH))
8294         tlsvers = TLS1_2_VERSION;
8295 #else
8296         return 1;
8297 #endif
8298     } else {
8299 #ifndef OSSL_NO_USABLE_TLS1_3
8300         tlsvers = TLS1_3_VERSION;
8301 #else
8302         return 1;
8303 #endif
8304     }
8305 
8306     /* Reset globals */
8307     info_cb_failed = 0;
8308     info_cb_this_state = -1;
8309     info_cb_offset = tst;
8310 
8311 #ifndef OSSL_NO_USABLE_TLS1_3
8312     if (tst >= 4 && tst < 6) {
8313         SSL_SESSION *sess = NULL;
8314         size_t written, readbytes;
8315         unsigned char buf[80];
8316         OSSL_TIME timer;
8317 
8318         /* early_data tests */
8319         if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
8320                 &serverssl, &sess, 0,
8321                 SHA384_DIGEST_LENGTH)))
8322             goto end;
8323 
8324         /* We don't actually need this reference */
8325         SSL_SESSION_free(sess);
8326 
8327         SSL_set_info_callback((tst % 2) == 0 ? serverssl : clientssl,
8328             sslapi_info_callback);
8329 
8330         /* Write and read some early data and then complete the connection */
8331         timer = ossl_time_now();
8332         if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
8333                 &written))
8334             || !TEST_size_t_eq(written, strlen(MSG1)))
8335             goto end;
8336 
8337         if (!TEST_int_eq(SSL_read_early_data(serverssl, buf,
8338                              sizeof(buf), &readbytes),
8339                 SSL_READ_EARLY_DATA_SUCCESS)) {
8340             testresult = check_early_data_timeout(timer);
8341             goto end;
8342         }
8343 
8344         if (!TEST_mem_eq(MSG1, readbytes, buf, strlen(MSG1))
8345             || !TEST_int_eq(SSL_get_early_data_status(serverssl),
8346                 SSL_EARLY_DATA_ACCEPTED)
8347             || !TEST_true(create_ssl_connection(serverssl, clientssl,
8348                 SSL_ERROR_NONE))
8349             || !TEST_false(info_cb_failed))
8350             goto end;
8351 
8352         testresult = 1;
8353         goto end;
8354     }
8355 #endif
8356 
8357     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8358             TLS_client_method(),
8359             tlsvers, tlsvers, &sctx, &cctx, cert,
8360             privkey)))
8361         goto end;
8362 
8363     if (!TEST_true(SSL_CTX_set_dh_auto(sctx, 1)))
8364         goto end;
8365 
8366     /*
8367      * For even numbered tests we check the server callbacks. For odd numbers we
8368      * check the client.
8369      */
8370     SSL_CTX_set_info_callback((tst % 2) == 0 ? sctx : cctx,
8371         sslapi_info_callback);
8372     if (tst >= 6) {
8373         if (!SSL_CTX_compress_certs(sctx, 0))
8374             goto end;
8375     }
8376 
8377     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
8378             &clientssl, NULL, NULL))
8379         || !TEST_true(create_ssl_connection(serverssl, clientssl,
8380             SSL_ERROR_NONE))
8381         || !TEST_false(info_cb_failed))
8382         goto end;
8383 
8384     clntsess = SSL_get1_session(clientssl);
8385     SSL_shutdown(clientssl);
8386     SSL_shutdown(serverssl);
8387     SSL_free(serverssl);
8388     SSL_free(clientssl);
8389     serverssl = clientssl = NULL;
8390 
8391     /* Now do a resumption */
8392     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
8393             NULL))
8394         || !TEST_true(SSL_set_session(clientssl, clntsess))
8395         || !TEST_true(create_ssl_connection(serverssl, clientssl,
8396             SSL_ERROR_NONE))
8397         || !TEST_true(SSL_session_reused(clientssl))
8398         || !TEST_false(info_cb_failed))
8399         goto end;
8400 
8401     testresult = 1;
8402 
8403 end:
8404     SSL_free(serverssl);
8405     SSL_free(clientssl);
8406     SSL_SESSION_free(clntsess);
8407     SSL_CTX_free(sctx);
8408     SSL_CTX_free(cctx);
8409     return testresult;
8410 }
8411 
8412 static int test_ssl_pending(int tst)
8413 {
8414     SSL_CTX *cctx = NULL, *sctx = NULL;
8415     SSL *clientssl = NULL, *serverssl = NULL;
8416     int testresult = 0;
8417     char msg[] = "A test message";
8418     char buf[5];
8419     size_t written, readbytes;
8420 
8421     if (tst == 0) {
8422         if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8423                 TLS_client_method(),
8424                 TLS1_VERSION, 0,
8425                 &sctx, &cctx, cert, privkey)))
8426             goto end;
8427     } else {
8428 #ifndef OPENSSL_NO_DTLS
8429         if (!TEST_true(create_ssl_ctx_pair(libctx, DTLS_server_method(),
8430                 DTLS_client_method(),
8431                 DTLS1_VERSION, 0,
8432                 &sctx, &cctx, cert, privkey)))
8433             goto end;
8434 
8435 #ifdef OPENSSL_NO_DTLS1_2
8436         /* Not supported in the FIPS provider */
8437         if (is_fips) {
8438             testresult = 1;
8439             goto end;
8440         };
8441         /*
8442          * Default sigalgs are SHA1 based in <DTLS1.2 which is in security
8443          * level 0
8444          */
8445         if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
8446             || !TEST_true(SSL_CTX_set_cipher_list(cctx,
8447                 "DEFAULT:@SECLEVEL=0")))
8448             goto end;
8449 #endif
8450 #else
8451         return 1;
8452 #endif
8453     }
8454 
8455     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8456             NULL, NULL))
8457         || !TEST_true(create_ssl_connection(serverssl, clientssl,
8458             SSL_ERROR_NONE)))
8459         goto end;
8460 
8461     if (!TEST_int_eq(SSL_pending(clientssl), 0)
8462         || !TEST_false(SSL_has_pending(clientssl))
8463         || !TEST_int_eq(SSL_pending(serverssl), 0)
8464         || !TEST_false(SSL_has_pending(serverssl))
8465         || !TEST_true(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
8466         || !TEST_size_t_eq(written, sizeof(msg))
8467         || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
8468         || !TEST_size_t_eq(readbytes, sizeof(buf))
8469         || !TEST_int_eq(SSL_pending(clientssl), (int)(written - readbytes))
8470         || !TEST_true(SSL_has_pending(clientssl)))
8471         goto end;
8472 
8473     testresult = 1;
8474 
8475 end:
8476     SSL_free(serverssl);
8477     SSL_free(clientssl);
8478     SSL_CTX_free(sctx);
8479     SSL_CTX_free(cctx);
8480 
8481     return testresult;
8482 }
8483 
8484 static struct {
8485     unsigned int maxprot;
8486     const char *clntciphers;
8487     const char *clnttls13ciphers;
8488     const char *srvrciphers;
8489     const char *srvrtls13ciphers;
8490     const char *shared;
8491     const char *fipsshared;
8492 } shared_ciphers_data[] = {
8493 /*
8494  * We can't establish a connection (even in TLSv1.1) with these ciphersuites if
8495  * TLSv1.3 is enabled but TLSv1.2 is disabled.
8496  */
8497 #if defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
8498     { TLS1_2_VERSION,
8499         "AES128-SHA:AES256-SHA",
8500         NULL,
8501         "AES256-SHA:DHE-RSA-AES128-SHA",
8502         NULL,
8503         "AES256-SHA",
8504         "AES256-SHA" },
8505 #if !defined(OPENSSL_NO_CHACHA)      \
8506     && !defined(OPENSSL_NO_POLY1305) \
8507     && !defined(OPENSSL_NO_EC)
8508     { TLS1_2_VERSION,
8509         "AES128-SHA:ECDHE-RSA-CHACHA20-POLY1305",
8510         NULL,
8511         "AES128-SHA:ECDHE-RSA-CHACHA20-POLY1305",
8512         NULL,
8513         "AES128-SHA:ECDHE-RSA-CHACHA20-POLY1305",
8514         "AES128-SHA" },
8515 #endif
8516     { TLS1_2_VERSION,
8517         "AES128-SHA:DHE-RSA-AES128-SHA:AES256-SHA",
8518         NULL,
8519         "AES128-SHA:DHE-RSA-AES256-SHA:AES256-SHA",
8520         NULL,
8521         "AES128-SHA:AES256-SHA",
8522         "AES128-SHA:AES256-SHA" },
8523     { TLS1_2_VERSION,
8524         "AES128-SHA:AES256-SHA",
8525         NULL,
8526         "AES128-SHA:DHE-RSA-AES128-SHA",
8527         NULL,
8528         "AES128-SHA",
8529         "AES128-SHA" },
8530     { TLS1_2_VERSION,
8531         "AES256-SHA",
8532         NULL,
8533         "AES128-SHA",
8534         NULL,
8535         "",
8536         "" },
8537 #endif
8538 /*
8539  * This test combines TLSv1.3 and TLSv1.2 ciphersuites so they must both be
8540  * enabled.
8541  */
8542 #if !defined(OSSL_NO_USABLE_TLS1_3) && !defined(OPENSSL_NO_TLS1_2) \
8543     && !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
8544     { TLS1_3_VERSION,
8545         "AES128-SHA:AES256-SHA",
8546         NULL,
8547         "AES256-SHA:AES128-SHA256",
8548         NULL,
8549         "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:"
8550         "TLS_AES_128_GCM_SHA256:AES256-SHA",
8551         "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:AES256-SHA" },
8552 #endif
8553 #ifndef OSSL_NO_USABLE_TLS1_3
8554     { TLS1_3_VERSION,
8555         "AES128-SHA",
8556         "TLS_AES_256_GCM_SHA384",
8557         "AES256-SHA",
8558         "TLS_AES_256_GCM_SHA384",
8559         "TLS_AES_256_GCM_SHA384",
8560         "TLS_AES_256_GCM_SHA384" },
8561     { TLS1_3_VERSION,
8562         "AES128-SHA",
8563         "TLS_AES_128_GCM_SHA256",
8564         "AES256-SHA",
8565         "TLS_AES_256_GCM_SHA384",
8566         "",
8567         "" },
8568 #endif
8569 };
8570 
8571 static int int_test_ssl_get_shared_ciphers(int tst, int clnt)
8572 {
8573     SSL_CTX *cctx = NULL, *sctx = NULL;
8574     SSL *clientssl = NULL, *serverssl = NULL;
8575     int testresult = 0;
8576     char buf[1024];
8577     OSSL_LIB_CTX *tmplibctx = OSSL_LIB_CTX_new();
8578     const char *expbuf = is_fips ? shared_ciphers_data[tst].fipsshared
8579                                  : shared_ciphers_data[tst].shared;
8580     int handshakeok = strcmp(expbuf, "") != 0;
8581 
8582     if (!TEST_ptr(tmplibctx))
8583         goto end;
8584 
8585     /*
8586      * Regardless of whether we're testing with the FIPS provider loaded into
8587      * libctx, we want one peer to always use the full set of ciphersuites
8588      * available. Therefore we use a separate libctx with the default provider
8589      * loaded into it. We run the same tests twice - once with the client side
8590      * having the full set of ciphersuites and once with the server side.
8591      */
8592     if (clnt) {
8593         cctx = SSL_CTX_new_ex(tmplibctx, NULL, TLS_client_method());
8594         if (!TEST_ptr(cctx))
8595             goto end;
8596     } else {
8597         sctx = SSL_CTX_new_ex(tmplibctx, NULL, TLS_server_method());
8598         if (!TEST_ptr(sctx))
8599             goto end;
8600     }
8601 
8602     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8603             TLS_client_method(),
8604             TLS1_VERSION,
8605             shared_ciphers_data[tst].maxprot,
8606             &sctx, &cctx, cert, privkey)))
8607         goto end;
8608 
8609     if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
8610             shared_ciphers_data[tst].clntciphers))
8611         || (shared_ciphers_data[tst].clnttls13ciphers != NULL
8612             && !TEST_true(SSL_CTX_set_ciphersuites(cctx,
8613                 shared_ciphers_data[tst].clnttls13ciphers)))
8614         || !TEST_true(SSL_CTX_set_cipher_list(sctx,
8615             shared_ciphers_data[tst].srvrciphers))
8616         || (shared_ciphers_data[tst].srvrtls13ciphers != NULL
8617             && !TEST_true(SSL_CTX_set_ciphersuites(sctx,
8618                 shared_ciphers_data[tst].srvrtls13ciphers))))
8619         goto end;
8620 
8621     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
8622             NULL)))
8623         goto end;
8624 
8625     if (handshakeok) {
8626         if (!TEST_true(create_ssl_connection(serverssl, clientssl,
8627                 SSL_ERROR_NONE)))
8628             goto end;
8629     } else {
8630         if (!TEST_false(create_ssl_connection(serverssl, clientssl,
8631                 SSL_ERROR_NONE)))
8632             goto end;
8633     }
8634 
8635     if (!TEST_ptr(SSL_get_shared_ciphers(serverssl, buf, sizeof(buf)))
8636         || !TEST_int_eq(strcmp(buf, expbuf), 0)) {
8637         TEST_info("Shared ciphers are: %s\n", buf);
8638         goto end;
8639     }
8640 
8641     testresult = 1;
8642 
8643 end:
8644     SSL_free(serverssl);
8645     SSL_free(clientssl);
8646     SSL_CTX_free(sctx);
8647     SSL_CTX_free(cctx);
8648     OSSL_LIB_CTX_free(tmplibctx);
8649 
8650     return testresult;
8651 }
8652 
8653 static int test_ssl_get_shared_ciphers(int tst)
8654 {
8655     return int_test_ssl_get_shared_ciphers(tst, 0)
8656         && int_test_ssl_get_shared_ciphers(tst, 1);
8657 }
8658 
8659 static const char *appdata = "Hello World";
8660 static int gen_tick_called, dec_tick_called, tick_key_cb_called;
8661 static int tick_key_renew = 0;
8662 static SSL_TICKET_RETURN tick_dec_ret = SSL_TICKET_RETURN_ABORT;
8663 
8664 static int gen_tick_cb(SSL *s, void *arg)
8665 {
8666     gen_tick_called = 1;
8667 
8668     return SSL_SESSION_set1_ticket_appdata(SSL_get_session(s), appdata,
8669         strlen(appdata));
8670 }
8671 
8672 static SSL_TICKET_RETURN dec_tick_cb(SSL *s, SSL_SESSION *ss,
8673     const unsigned char *keyname,
8674     size_t keyname_length,
8675     SSL_TICKET_STATUS status,
8676     void *arg)
8677 {
8678     void *tickdata;
8679     size_t tickdlen;
8680 
8681     dec_tick_called = 1;
8682 
8683     if (status == SSL_TICKET_EMPTY)
8684         return SSL_TICKET_RETURN_IGNORE_RENEW;
8685 
8686     if (!TEST_true(status == SSL_TICKET_SUCCESS
8687             || status == SSL_TICKET_SUCCESS_RENEW))
8688         return SSL_TICKET_RETURN_ABORT;
8689 
8690     if (!TEST_true(SSL_SESSION_get0_ticket_appdata(ss, &tickdata,
8691             &tickdlen))
8692         || !TEST_size_t_eq(tickdlen, strlen(appdata))
8693         || !TEST_int_eq(memcmp(tickdata, appdata, tickdlen), 0))
8694         return SSL_TICKET_RETURN_ABORT;
8695 
8696     if (tick_key_cb_called) {
8697         /* Don't change what the ticket key callback wanted to do */
8698         switch (status) {
8699         case SSL_TICKET_NO_DECRYPT:
8700             return SSL_TICKET_RETURN_IGNORE_RENEW;
8701 
8702         case SSL_TICKET_SUCCESS:
8703             return SSL_TICKET_RETURN_USE;
8704 
8705         case SSL_TICKET_SUCCESS_RENEW:
8706             return SSL_TICKET_RETURN_USE_RENEW;
8707 
8708         default:
8709             return SSL_TICKET_RETURN_ABORT;
8710         }
8711     }
8712     return tick_dec_ret;
8713 }
8714 
8715 #ifndef OPENSSL_NO_DEPRECATED_3_0
8716 static int tick_key_cb(SSL *s, unsigned char key_name[16],
8717     unsigned char iv[EVP_MAX_IV_LENGTH], EVP_CIPHER_CTX *ctx,
8718     HMAC_CTX *hctx, int enc)
8719 {
8720     const unsigned char tick_aes_key[16] = "0123456789abcdef";
8721     const unsigned char tick_hmac_key[16] = "0123456789abcdef";
8722     EVP_CIPHER *aes128cbc;
8723     EVP_MD *sha256;
8724     int ret;
8725 
8726     tick_key_cb_called = 1;
8727 
8728     if (tick_key_renew == -1)
8729         return 0;
8730 
8731     aes128cbc = EVP_CIPHER_fetch(libctx, "AES-128-CBC", NULL);
8732     if (!TEST_ptr(aes128cbc))
8733         return 0;
8734     sha256 = EVP_MD_fetch(libctx, "SHA-256", NULL);
8735     if (!TEST_ptr(sha256)) {
8736         EVP_CIPHER_free(aes128cbc);
8737         return 0;
8738     }
8739 
8740     memset(iv, 0, AES_BLOCK_SIZE);
8741     memset(key_name, 0, 16);
8742     if (aes128cbc == NULL
8743         || sha256 == NULL
8744         || !EVP_CipherInit_ex(ctx, aes128cbc, NULL, tick_aes_key, iv, enc)
8745         || !HMAC_Init_ex(hctx, tick_hmac_key, sizeof(tick_hmac_key), sha256,
8746             NULL))
8747         ret = -1;
8748     else
8749         ret = tick_key_renew ? 2 : 1;
8750 
8751     EVP_CIPHER_free(aes128cbc);
8752     EVP_MD_free(sha256);
8753 
8754     return ret;
8755 }
8756 #endif
8757 
8758 static int tick_key_evp_cb(SSL *s, unsigned char key_name[16],
8759     unsigned char iv[EVP_MAX_IV_LENGTH],
8760     EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx, int enc)
8761 {
8762     const unsigned char tick_aes_key[16] = "0123456789abcdef";
8763     unsigned char tick_hmac_key[16] = "0123456789abcdef";
8764     OSSL_PARAM params[2];
8765     EVP_CIPHER *aes128cbc;
8766     int ret;
8767 
8768     tick_key_cb_called = 1;
8769 
8770     if (tick_key_renew == -1)
8771         return 0;
8772 
8773     aes128cbc = EVP_CIPHER_fetch(libctx, "AES-128-CBC", NULL);
8774     if (!TEST_ptr(aes128cbc))
8775         return 0;
8776 
8777     memset(iv, 0, AES_BLOCK_SIZE);
8778     memset(key_name, 0, 16);
8779     params[0] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
8780         "SHA256", 0);
8781     params[1] = OSSL_PARAM_construct_end();
8782     if (aes128cbc == NULL
8783         || !EVP_CipherInit_ex(ctx, aes128cbc, NULL, tick_aes_key, iv, enc)
8784         || !EVP_MAC_init(hctx, tick_hmac_key, sizeof(tick_hmac_key),
8785             params))
8786         ret = -1;
8787     else
8788         ret = tick_key_renew ? 2 : 1;
8789 
8790     EVP_CIPHER_free(aes128cbc);
8791 
8792     return ret;
8793 }
8794 
8795 /*
8796  * Test the various ticket callbacks
8797  * Test 0: TLSv1.2, no ticket key callback, no ticket, no renewal
8798  * Test 1: TLSv1.3, no ticket key callback, no ticket, no renewal
8799  * Test 2: TLSv1.2, no ticket key callback, no ticket, renewal
8800  * Test 3: TLSv1.3, no ticket key callback, no ticket, renewal
8801  * Test 4: TLSv1.2, no ticket key callback, ticket, no renewal
8802  * Test 5: TLSv1.3, no ticket key callback, ticket, no renewal
8803  * Test 6: TLSv1.2, no ticket key callback, ticket, renewal
8804  * Test 7: TLSv1.3, no ticket key callback, ticket, renewal
8805  * Test 8: TLSv1.2, old ticket key callback, ticket, no renewal
8806  * Test 9: TLSv1.3, old ticket key callback, ticket, no renewal
8807  * Test 10: TLSv1.2, old ticket key callback, ticket, renewal
8808  * Test 11: TLSv1.3, old ticket key callback, ticket, renewal
8809  * Test 12: TLSv1.2, old ticket key callback, no ticket
8810  * Test 13: TLSv1.3, old ticket key callback, no ticket
8811  * Test 14: TLSv1.2, ticket key callback, ticket, no renewal
8812  * Test 15: TLSv1.3, ticket key callback, ticket, no renewal
8813  * Test 16: TLSv1.2, ticket key callback, ticket, renewal
8814  * Test 17: TLSv1.3, ticket key callback, ticket, renewal
8815  * Test 18: TLSv1.2, ticket key callback, no ticket
8816  * Test 19: TLSv1.3, ticket key callback, no ticket
8817  */
8818 static int test_ticket_callbacks(int tst)
8819 {
8820     SSL_CTX *cctx = NULL, *sctx = NULL;
8821     SSL *clientssl = NULL, *serverssl = NULL;
8822     SSL_SESSION *clntsess = NULL;
8823     int testresult = 0;
8824 
8825 #ifdef OPENSSL_NO_TLS1_2
8826     if (tst % 2 == 0)
8827         return 1;
8828 #endif
8829 #ifdef OSSL_NO_USABLE_TLS1_3
8830     if (tst % 2 == 1)
8831         return 1;
8832 #endif
8833 #ifdef OPENSSL_NO_DEPRECATED_3_0
8834     if (tst >= 8 && tst <= 13)
8835         return 1;
8836 #endif
8837 
8838     gen_tick_called = dec_tick_called = tick_key_cb_called = 0;
8839 
8840     /* Which tests the ticket key callback should request renewal for */
8841 
8842     if (tst == 10 || tst == 11 || tst == 16 || tst == 17)
8843         tick_key_renew = 1;
8844     else if (tst == 12 || tst == 13 || tst == 18 || tst == 19)
8845         tick_key_renew = -1; /* abort sending the ticket/0-length ticket */
8846     else
8847         tick_key_renew = 0;
8848 
8849     /* Which tests the decrypt ticket callback should request renewal for */
8850     switch (tst) {
8851     case 0:
8852     case 1:
8853         tick_dec_ret = SSL_TICKET_RETURN_IGNORE;
8854         break;
8855 
8856     case 2:
8857     case 3:
8858         tick_dec_ret = SSL_TICKET_RETURN_IGNORE_RENEW;
8859         break;
8860 
8861     case 4:
8862     case 5:
8863         tick_dec_ret = SSL_TICKET_RETURN_USE;
8864         break;
8865 
8866     case 6:
8867     case 7:
8868         tick_dec_ret = SSL_TICKET_RETURN_USE_RENEW;
8869         break;
8870 
8871     default:
8872         tick_dec_ret = SSL_TICKET_RETURN_ABORT;
8873     }
8874 
8875     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
8876             TLS_client_method(),
8877             TLS1_VERSION,
8878             ((tst % 2) == 0) ? TLS1_2_VERSION
8879                              : TLS1_3_VERSION,
8880             &sctx, &cctx, cert, privkey)))
8881         goto end;
8882 
8883     /*
8884      * We only want sessions to resume from tickets - not the session cache. So
8885      * switch the cache off.
8886      */
8887     if (!TEST_true(SSL_CTX_set_session_cache_mode(sctx, SSL_SESS_CACHE_OFF)))
8888         goto end;
8889 
8890     if (!TEST_true(SSL_CTX_set_session_ticket_cb(sctx, gen_tick_cb, dec_tick_cb,
8891             NULL)))
8892         goto end;
8893 
8894     if (tst >= 14) {
8895         if (!TEST_true(SSL_CTX_set_tlsext_ticket_key_evp_cb(sctx, tick_key_evp_cb)))
8896             goto end;
8897 #ifndef OPENSSL_NO_DEPRECATED_3_0
8898     } else if (tst >= 8) {
8899         if (!TEST_true(SSL_CTX_set_tlsext_ticket_key_cb(sctx, tick_key_cb)))
8900             goto end;
8901 #endif
8902     }
8903 
8904     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
8905             NULL, NULL))
8906         || !TEST_true(create_ssl_connection(serverssl, clientssl,
8907             SSL_ERROR_NONE)))
8908         goto end;
8909 
8910     /*
8911      * The decrypt ticket key callback in TLSv1.2 should be called even though
8912      * we have no ticket yet, because it gets called with a status of
8913      * SSL_TICKET_EMPTY (the client indicates support for tickets but does not
8914      * actually send any ticket data). This does not happen in TLSv1.3 because
8915      * it is not valid to send empty ticket data in TLSv1.3.
8916      */
8917     if (!TEST_int_eq(gen_tick_called, 1)
8918         || !TEST_int_eq(dec_tick_called, ((tst % 2) == 0) ? 1 : 0))
8919         goto end;
8920 
8921     gen_tick_called = dec_tick_called = 0;
8922 
8923     clntsess = SSL_get1_session(clientssl);
8924     SSL_shutdown(clientssl);
8925     SSL_shutdown(serverssl);
8926     SSL_free(serverssl);
8927     SSL_free(clientssl);
8928     serverssl = clientssl = NULL;
8929 
8930     /* Now do a resumption */
8931     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
8932             NULL))
8933         || !TEST_true(SSL_set_session(clientssl, clntsess))
8934         || !TEST_true(create_ssl_connection(serverssl, clientssl,
8935             SSL_ERROR_NONE)))
8936         goto end;
8937 
8938     if (tick_dec_ret == SSL_TICKET_RETURN_IGNORE
8939         || tick_dec_ret == SSL_TICKET_RETURN_IGNORE_RENEW
8940         || tick_key_renew == -1) {
8941         if (!TEST_false(SSL_session_reused(clientssl)))
8942             goto end;
8943     } else {
8944         if (!TEST_true(SSL_session_reused(clientssl)))
8945             goto end;
8946     }
8947 
8948     if (!TEST_int_eq(gen_tick_called,
8949             (tick_key_renew
8950                 || tick_dec_ret == SSL_TICKET_RETURN_IGNORE_RENEW
8951                 || tick_dec_ret == SSL_TICKET_RETURN_USE_RENEW)
8952                 ? 1
8953                 : 0)
8954         /* There is no ticket to decrypt in tests 13 and 19 */
8955         || !TEST_int_eq(dec_tick_called, (tst == 13 || tst == 19) ? 0 : 1))
8956         goto end;
8957 
8958     testresult = 1;
8959 
8960 end:
8961     SSL_SESSION_free(clntsess);
8962     SSL_free(serverssl);
8963     SSL_free(clientssl);
8964     SSL_CTX_free(sctx);
8965     SSL_CTX_free(cctx);
8966 
8967     return testresult;
8968 }
8969 
8970 /*
8971  * Callback that always returns ABORT for successfully decrypted tickets.
8972  * Used by test_ticket_abort_session_leak to exercise the error path in
8973  * tls_parse_ctos_psk() that previously leaked the SSL_SESSION.
8974  */
8975 static SSL_TICKET_RETURN dec_tick_abort_cb(SSL *s, SSL_SESSION *ss,
8976     const unsigned char *keyname,
8977     size_t keyname_length,
8978     SSL_TICKET_STATUS status,
8979     void *arg)
8980 {
8981     if (status == SSL_TICKET_SUCCESS || status == SSL_TICKET_SUCCESS_RENEW)
8982         return SSL_TICKET_RETURN_ABORT;
8983 
8984     return SSL_TICKET_RETURN_IGNORE_RENEW;
8985 }
8986 
8987 /*
8988  * Test that returning SSL_TICKET_RETURN_ABORT from the decrypt ticket callback
8989  * during TLS 1.3 resumption does not leak the SSL_SESSION allocated by
8990  * tls_decrypt_ticket().  Before the fix, tls_parse_ctos_psk() would execute a
8991  * bare "return 0" instead of "goto err", bypassing SSL_SESSION_free(sess).
8992  * When run under LeakSanitizer the leaked session will be reported.
8993  */
8994 static int test_ticket_abort_session_leak(void)
8995 {
8996     SSL_CTX *cctx = NULL, *sctx = NULL;
8997     SSL *clientssl = NULL, *serverssl = NULL;
8998     SSL_SESSION *clntsess = NULL;
8999     int testresult = 0;
9000 
9001 #ifdef OSSL_NO_USABLE_TLS1_3
9002     return 1;
9003 #endif
9004 
9005     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9006             TLS_client_method(),
9007             TLS1_3_VERSION, TLS1_3_VERSION,
9008             &sctx, &cctx, cert, privkey)))
9009         goto end;
9010 
9011     if (!TEST_true(SSL_CTX_set_session_cache_mode(sctx, SSL_SESS_CACHE_OFF)))
9012         goto end;
9013 
9014     /* First handshake: use the normal gen/dec callbacks to get a ticket */
9015     if (!TEST_true(SSL_CTX_set_session_ticket_cb(sctx, gen_tick_cb, dec_tick_cb,
9016             NULL)))
9017         goto end;
9018 
9019     gen_tick_called = dec_tick_called = tick_key_cb_called = 0;
9020     tick_dec_ret = SSL_TICKET_RETURN_USE_RENEW;
9021 
9022     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9023             NULL, NULL))
9024         || !TEST_true(create_ssl_connection(serverssl, clientssl,
9025             SSL_ERROR_NONE)))
9026         goto end;
9027 
9028     clntsess = SSL_get1_session(clientssl);
9029     if (!TEST_ptr(clntsess))
9030         goto end;
9031 
9032     SSL_shutdown(clientssl);
9033     SSL_shutdown(serverssl);
9034     SSL_free(serverssl);
9035     SSL_free(clientssl);
9036     serverssl = clientssl = NULL;
9037 
9038     /*
9039      * Second handshake (resumption): switch to the abort callback.
9040      * The server will decrypt the ticket, allocate an SSL_SESSION, then the
9041      * callback returns ABORT.  The handshake must fail, and the session
9042      * allocated inside tls_decrypt_ticket() must be freed (not leaked).
9043      */
9044     if (!TEST_true(SSL_CTX_set_session_ticket_cb(sctx, gen_tick_cb,
9045             dec_tick_abort_cb, NULL)))
9046         goto end;
9047 
9048     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9049             NULL, NULL))
9050         || !TEST_true(SSL_set_session(clientssl, clntsess)))
9051         goto end;
9052 
9053     /* Resumption should fail because the callback aborts */
9054     if (!TEST_false(create_ssl_connection(serverssl, clientssl,
9055             SSL_ERROR_SSL)))
9056         goto end;
9057 
9058     testresult = 1;
9059 
9060 end:
9061     SSL_SESSION_free(clntsess);
9062     SSL_free(serverssl);
9063     SSL_free(clientssl);
9064     SSL_CTX_free(sctx);
9065     SSL_CTX_free(cctx);
9066 
9067     return testresult;
9068 }
9069 
9070 /*
9071  * Test incorrect shutdown.
9072  * Test 0: client does not shutdown properly,
9073  *         server does not set SSL_OP_IGNORE_UNEXPECTED_EOF,
9074  *         server should get SSL_ERROR_SSL
9075  * Test 1: client does not shutdown properly,
9076  *         server sets SSL_OP_IGNORE_UNEXPECTED_EOF,
9077  *         server should get SSL_ERROR_ZERO_RETURN
9078  */
9079 static int test_incorrect_shutdown(int tst)
9080 {
9081     SSL_CTX *cctx = NULL, *sctx = NULL;
9082     SSL *clientssl = NULL, *serverssl = NULL;
9083     int testresult = 0;
9084     char buf[80];
9085     BIO *c2s;
9086 
9087     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9088             TLS_client_method(), 0, 0,
9089             &sctx, &cctx, cert, privkey)))
9090         goto end;
9091 
9092     if (tst == 1)
9093         SSL_CTX_set_options(sctx, SSL_OP_IGNORE_UNEXPECTED_EOF);
9094 
9095     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9096             NULL, NULL)))
9097         goto end;
9098 
9099     if (!TEST_true(create_ssl_connection(serverssl, clientssl,
9100             SSL_ERROR_NONE)))
9101         goto end;
9102 
9103     c2s = SSL_get_rbio(serverssl);
9104     BIO_set_mem_eof_return(c2s, 0);
9105 
9106     if (!TEST_false(SSL_read(serverssl, buf, sizeof(buf))))
9107         goto end;
9108 
9109     if (tst == 0 && !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_SSL))
9110         goto end;
9111     if (tst == 1 && !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_ZERO_RETURN))
9112         goto end;
9113 
9114     testresult = 1;
9115 
9116 end:
9117     SSL_free(serverssl);
9118     SSL_free(clientssl);
9119     SSL_CTX_free(sctx);
9120     SSL_CTX_free(cctx);
9121 
9122     return testresult;
9123 }
9124 
9125 /*
9126  * Test bi-directional shutdown.
9127  * Test 0: TLSv1.2
9128  * Test 1: TLSv1.2, server continues to read/write after client shutdown
9129  * Test 2: TLSv1.3, no pending NewSessionTicket messages
9130  * Test 3: TLSv1.3, pending NewSessionTicket messages
9131  * Test 4: TLSv1.3, server continues to read/write after client shutdown, server
9132  *                  sends key update, client reads it
9133  * Test 5: TLSv1.3, server continues to read/write after client shutdown, server
9134  *                  sends CertificateRequest, client reads and ignores it
9135  * Test 6: TLSv1.3, server continues to read/write after client shutdown, client
9136  *                  doesn't read it
9137  */
9138 static int test_shutdown(int tst)
9139 {
9140     SSL_CTX *cctx = NULL, *sctx = NULL;
9141     SSL *clientssl = NULL, *serverssl = NULL;
9142     int testresult = 0;
9143     char msg[] = "A test message";
9144     char buf[80];
9145     size_t written, readbytes;
9146     SSL_SESSION *sess;
9147 
9148 #ifdef OPENSSL_NO_TLS1_2
9149     if (tst <= 1)
9150         return 1;
9151 #endif
9152 #ifdef OSSL_NO_USABLE_TLS1_3
9153     if (tst >= 2)
9154         return 1;
9155 #endif
9156 
9157     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9158             TLS_client_method(),
9159             TLS1_VERSION,
9160             (tst <= 1) ? TLS1_2_VERSION
9161                        : TLS1_3_VERSION,
9162             &sctx, &cctx, cert, privkey)))
9163         goto end;
9164 
9165     if (tst == 5)
9166         SSL_CTX_set_post_handshake_auth(cctx, 1);
9167 
9168     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9169             NULL, NULL)))
9170         goto end;
9171 
9172     if (tst == 3) {
9173         if (!TEST_true(create_bare_ssl_connection(serverssl, clientssl,
9174                 SSL_ERROR_NONE, 1, 0))
9175             || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
9176             || !TEST_false(SSL_SESSION_is_resumable(sess)))
9177             goto end;
9178     } else if (!TEST_true(create_ssl_connection(serverssl, clientssl,
9179                    SSL_ERROR_NONE))
9180         || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
9181         || !TEST_true(SSL_SESSION_is_resumable(sess))) {
9182         goto end;
9183     }
9184 
9185     if (!TEST_int_eq(SSL_shutdown(clientssl), 0))
9186         goto end;
9187 
9188     if (tst >= 4) {
9189         /*
9190          * Reading on the server after the client has sent close_notify should
9191          * fail and provide SSL_ERROR_ZERO_RETURN
9192          */
9193         if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
9194             || !TEST_int_eq(SSL_get_error(serverssl, 0),
9195                 SSL_ERROR_ZERO_RETURN)
9196             || !TEST_int_eq(SSL_get_shutdown(serverssl),
9197                 SSL_RECEIVED_SHUTDOWN)
9198             /*
9199              * Even though we're shutdown on receive we should still be
9200              * able to write.
9201              */
9202             || !TEST_true(SSL_write(serverssl, msg, sizeof(msg))))
9203             goto end;
9204         if (tst == 4
9205             && !TEST_true(SSL_key_update(serverssl,
9206                 SSL_KEY_UPDATE_REQUESTED)))
9207             goto end;
9208         if (tst == 5) {
9209             SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
9210             if (!TEST_true(SSL_verify_client_post_handshake(serverssl)))
9211                 goto end;
9212         }
9213         if ((tst == 4 || tst == 5)
9214             && !TEST_true(SSL_write(serverssl, msg, sizeof(msg))))
9215             goto end;
9216         if (!TEST_int_eq(SSL_shutdown(serverssl), 1))
9217             goto end;
9218         if (tst == 4 || tst == 5) {
9219             /* Should still be able to read data from server */
9220             if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf),
9221                     &readbytes))
9222                 || !TEST_size_t_eq(readbytes, sizeof(msg))
9223                 || !TEST_int_eq(memcmp(msg, buf, readbytes), 0)
9224                 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf),
9225                     &readbytes))
9226                 || !TEST_size_t_eq(readbytes, sizeof(msg))
9227                 || !TEST_int_eq(memcmp(msg, buf, readbytes), 0))
9228                 goto end;
9229         }
9230     }
9231 
9232     /* Writing on the client after sending close_notify shouldn't be possible */
9233     if (!TEST_false(SSL_write_ex(clientssl, msg, sizeof(msg), &written)))
9234         goto end;
9235 
9236     if (tst < 4) {
9237         /*
9238          * For these tests the client has sent close_notify but it has not yet
9239          * been received by the server. The server has not sent close_notify
9240          * yet.
9241          */
9242         if (!TEST_int_eq(SSL_shutdown(serverssl), 0)
9243             /*
9244              * Writing on the server after sending close_notify shouldn't
9245              * be possible.
9246              */
9247             || !TEST_false(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
9248             || !TEST_int_eq(SSL_shutdown(clientssl), 1)
9249             || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
9250             || !TEST_true(SSL_SESSION_is_resumable(sess))
9251             || !TEST_int_eq(SSL_shutdown(serverssl), 1))
9252             goto end;
9253     } else if (tst == 4 || tst == 5) {
9254         /*
9255          * In this test the client has sent close_notify and it has been
9256          * received by the server which has responded with a close_notify. The
9257          * client needs to read the close_notify sent by the server.
9258          */
9259         if (!TEST_int_eq(SSL_shutdown(clientssl), 1)
9260             || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
9261             || !TEST_true(SSL_SESSION_is_resumable(sess)))
9262             goto end;
9263     } else {
9264         /*
9265          * tst == 6
9266          *
9267          * The client has sent close_notify and is expecting a close_notify
9268          * back, but instead there is application data first. The shutdown
9269          * should fail with a fatal error.
9270          */
9271         if (!TEST_int_eq(SSL_shutdown(clientssl), -1)
9272             || !TEST_int_eq(SSL_get_error(clientssl, -1), SSL_ERROR_SSL))
9273             goto end;
9274     }
9275 
9276     testresult = 1;
9277 
9278 end:
9279     SSL_free(serverssl);
9280     SSL_free(clientssl);
9281     SSL_CTX_free(sctx);
9282     SSL_CTX_free(cctx);
9283 
9284     return testresult;
9285 }
9286 
9287 /*
9288  * Test that sending close_notify alerts works correctly in the case of a
9289  * retryable write failure.
9290  */
9291 static int test_async_shutdown(void)
9292 {
9293     SSL_CTX *cctx = NULL, *sctx = NULL;
9294     SSL *clientssl = NULL, *serverssl = NULL;
9295     int testresult = 0;
9296     BIO *bretry = BIO_new(bio_s_always_retry()), *tmp = NULL;
9297 
9298     if (!TEST_ptr(bretry))
9299         goto end;
9300 
9301     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9302             TLS_client_method(),
9303             0, 0,
9304             &sctx, &cctx, cert, privkey)))
9305         goto end;
9306 
9307     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
9308             NULL)))
9309         goto end;
9310 
9311     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9312         goto end;
9313 
9314     /* Close write side of clientssl */
9315     if (!TEST_int_eq(SSL_shutdown(clientssl), 0))
9316         goto end;
9317 
9318     tmp = SSL_get_wbio(serverssl);
9319     if (!TEST_true(BIO_up_ref(tmp))) {
9320         tmp = NULL;
9321         goto end;
9322     }
9323     SSL_set0_wbio(serverssl, bretry);
9324     bretry = NULL;
9325 
9326     /* First server shutdown should fail because of a retrable write failure */
9327     if (!TEST_int_eq(SSL_shutdown(serverssl), -1)
9328         || !TEST_int_eq(SSL_get_error(serverssl, -1), SSL_ERROR_WANT_WRITE))
9329         goto end;
9330 
9331     /* Second server shutdown should fail for the same reason */
9332     if (!TEST_int_eq(SSL_shutdown(serverssl), -1)
9333         || !TEST_int_eq(SSL_get_error(serverssl, -1), SSL_ERROR_WANT_WRITE))
9334         goto end;
9335 
9336     SSL_set0_wbio(serverssl, tmp);
9337     tmp = NULL;
9338 
9339     /* Third server shutdown should send close_notify */
9340     if (!TEST_int_eq(SSL_shutdown(serverssl), 0))
9341         goto end;
9342 
9343     /* Fourth server shutdown should read close_notify from client and finish */
9344     if (!TEST_int_eq(SSL_shutdown(serverssl), 1))
9345         goto end;
9346 
9347     /* Client should also successfully fully shutdown */
9348     if (!TEST_int_eq(SSL_shutdown(clientssl), 1))
9349         goto end;
9350 
9351     testresult = 1;
9352 end:
9353     SSL_free(serverssl);
9354     SSL_free(clientssl);
9355     SSL_CTX_free(sctx);
9356     SSL_CTX_free(cctx);
9357     BIO_free(bretry);
9358     BIO_free(tmp);
9359 
9360     return testresult;
9361 }
9362 
9363 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
9364 static int cert_cb_cnt;
9365 
9366 static int load_chain(const char *file, EVP_PKEY **pkey, X509 **x509,
9367     STACK_OF(X509) *chain)
9368 {
9369     char *path = test_mk_file_path(certsdir, file);
9370     BIO *in = NULL;
9371     X509 *x = NULL;
9372     int ok = 0;
9373 
9374     if (path == NULL)
9375         return 0;
9376     if ((in = BIO_new(BIO_s_file())) == NULL
9377         || BIO_read_filename(in, path) <= 0)
9378         goto out;
9379     if (pkey == NULL) {
9380         if ((x = X509_new_ex(libctx, NULL)) == NULL
9381             || PEM_read_bio_X509(in, &x, NULL, NULL) == NULL)
9382             goto out;
9383         if (chain == NULL)
9384             *x509 = x;
9385         else if (!sk_X509_push(chain, x))
9386             goto out;
9387     } else if (PEM_read_bio_PrivateKey_ex(in, pkey, NULL, NULL,
9388                    libctx, NULL)
9389         == NULL) {
9390         goto out;
9391     }
9392 
9393     x = NULL;
9394     ok = 1;
9395 out:
9396     X509_free(x);
9397     BIO_free(in);
9398     OPENSSL_free(path);
9399     return ok;
9400 }
9401 
9402 static int cert_cb(SSL *s, void *arg)
9403 {
9404     SSL_CTX *ctx = (SSL_CTX *)arg;
9405     EVP_PKEY *pkey = NULL;
9406     X509 *x509 = NULL, *x = NULL;
9407     STACK_OF(X509) *chain = NULL;
9408     int ret = 0;
9409 
9410     if (cert_cb_cnt == 0) {
9411         /* Suspend the handshake */
9412         cert_cb_cnt++;
9413         return -1;
9414     } else if (cert_cb_cnt == 1) {
9415         /*
9416          * Update the SSL_CTX, set the certificate and private key and then
9417          * continue the handshake normally.
9418          */
9419         if (ctx != NULL && !TEST_ptr(SSL_set_SSL_CTX(s, ctx)))
9420             return 0;
9421 
9422         if (!TEST_true(SSL_use_certificate_file(s, cert, SSL_FILETYPE_PEM))
9423             || !TEST_true(SSL_use_PrivateKey_file(s, privkey,
9424                 SSL_FILETYPE_PEM))
9425             || !TEST_true(SSL_check_private_key(s)))
9426             return 0;
9427         cert_cb_cnt++;
9428         return 1;
9429     } else if (cert_cb_cnt == 3) {
9430         int rv;
9431 
9432         chain = sk_X509_new_null();
9433 #ifndef OPENSSL_NO_ML_DSA
9434         if (SSL_version(s) >= TLS1_3_VERSION
9435             && fips_provider_version_ge(libctx, 3, 5, 0)) {
9436             if (!TEST_ptr(chain)
9437                 || !TEST_true(load_chain("root-ml-dsa-44-cert.pem", NULL, NULL, chain))
9438                 || !TEST_true(load_chain("server-ml-dsa-44-cert.pem", NULL, &x509, NULL))
9439                 || !TEST_true(load_chain("server-ml-dsa-44-key.pem", &pkey, NULL, NULL)))
9440                 goto out;
9441             goto check;
9442         }
9443 #endif
9444         if (!TEST_ptr(chain)
9445             || !TEST_true(load_chain("ca-cert.pem", NULL, NULL, chain))
9446             || !TEST_true(load_chain("root-cert.pem", NULL, NULL, chain))
9447             || !TEST_true(load_chain("p256-ee-rsa-ca-cert.pem", NULL,
9448                 &x509, NULL))
9449             || !TEST_true(load_chain("p256-ee-rsa-ca-key.pem", &pkey,
9450                 NULL, NULL)))
9451             goto out;
9452 
9453 #ifndef OPENSSL_NO_ML_DSA
9454     check:
9455 #endif
9456         rv = SSL_check_chain(s, x509, pkey, chain);
9457         /*
9458          * If the cert doesn't show as valid here (e.g., because we don't
9459          * have any shared sigalgs), then we will not set it, and there will
9460          * be no certificate at all on the SSL or SSL_CTX.  This, in turn,
9461          * will cause tls_choose_sigalgs() to fail the connection.
9462          */
9463         if ((rv & (CERT_PKEY_VALID | CERT_PKEY_CA_SIGNATURE))
9464             == (CERT_PKEY_VALID | CERT_PKEY_CA_SIGNATURE)) {
9465             if (!SSL_use_cert_and_key(s, x509, pkey, NULL, 1))
9466                 goto out;
9467         }
9468 
9469         ret = 1;
9470     }
9471 
9472     /* Abort the handshake */
9473 out:
9474     EVP_PKEY_free(pkey);
9475     X509_free(x509);
9476     X509_free(x);
9477     OSSL_STACK_OF_X509_free(chain);
9478     return ret;
9479 }
9480 
9481 /*
9482  * Test the certificate callback.
9483  * Test 0: Callback fails
9484  * Test 1: Success - no SSL_set_SSL_CTX() in the callback
9485  * Test 2: Success - SSL_set_SSL_CTX() in the callback
9486  * Test 3: Success - Call SSL_check_chain from the callback
9487  * Test 4: Failure - SSL_check_chain fails from callback due to bad cert in the
9488  *                   chain
9489  * Test 5: Failure - SSL_check_chain fails from callback due to bad ee cert
9490  */
9491 static int test_cert_cb_int(int prot, int tst)
9492 {
9493     SSL_CTX *cctx = NULL, *sctx = NULL, *snictx = NULL;
9494     SSL *clientssl = NULL, *serverssl = NULL;
9495     int testresult = 0, ret;
9496 
9497 #ifdef OPENSSL_NO_EC
9498     /* We use an EC cert in these tests with TLS 1.2 or absent ML-DSA */
9499     if (tst >= 3)
9500         return 1;
9501 #endif
9502 
9503     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9504             TLS_client_method(),
9505             prot,
9506             prot,
9507             &sctx, &cctx, NULL, NULL)))
9508         goto end;
9509 
9510     if (tst == 0)
9511         cert_cb_cnt = -1;
9512     else if (tst >= 3)
9513         cert_cb_cnt = 3;
9514     else
9515         cert_cb_cnt = 0;
9516 
9517     if (tst == 2) {
9518         snictx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
9519         if (!TEST_ptr(snictx))
9520             goto end;
9521     }
9522 
9523     SSL_CTX_set_cert_cb(sctx, cert_cb, snictx);
9524 
9525     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9526             NULL, NULL)))
9527         goto end;
9528 
9529     if (tst == 3) {
9530         if (!TEST_true(SSL_set1_sigalgs_list(clientssl,
9531                 "rsa_pss_rsae_sha256:rsa_pkcs1_sha256:"
9532                 "?ecdsa_secp256r1_sha256:?mldsa44"))
9533             || !TEST_true(SSL_set1_sigalgs_list(serverssl,
9534                 "rsa_pss_rsae_sha256:rsa_pkcs1_sha256:"
9535                 "?ecdsa_secp256r1_sha256:?mldsa44")))
9536             goto end;
9537     } else if (tst == 4) {
9538         /*
9539          * We cause SSL_check_chain() to fail by specifying sig_algs that
9540          * the chain doesn't meet (root either RSA or ML-DSA).
9541          */
9542         if (!TEST_true(SSL_set1_sigalgs_list(clientssl,
9543                 "ecdsa_secp256r1_sha256"))
9544             || !TEST_true(SSL_set1_sigalgs_list(serverssl,
9545                 "?ecdsa_secp256r1_sha256:?mldsa44")))
9546             goto end;
9547     } else if (tst == 5) {
9548         /*
9549          * We cause SSL_check_chain() to fail by specifying sig_algs that
9550          * the ee cert doesn't meet (the ee uses an ECDSA or ML-DSA cert)
9551          */
9552         if (!TEST_true(SSL_set1_sigalgs_list(clientssl,
9553                 "rsa_pss_rsae_sha256:rsa_pkcs1_sha256"))
9554             || !TEST_true(SSL_set1_sigalgs_list(serverssl,
9555                 "rsa_pss_rsae_sha256:rsa_pkcs1_sha256:"
9556                 "?ecdsa_secp256r1_sha256:?mldsa44")))
9557             goto end;
9558     }
9559 
9560     ret = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
9561     if (!TEST_true(tst == 0 || tst == 4 || tst == 5 ? !ret : ret)
9562         || (tst > 0
9563             && !TEST_int_eq((cert_cb_cnt - 2) * (cert_cb_cnt - 3), 0))) {
9564         goto end;
9565     }
9566 
9567     testresult = 1;
9568 
9569 end:
9570     SSL_free(serverssl);
9571     SSL_free(clientssl);
9572     SSL_CTX_free(sctx);
9573     SSL_CTX_free(cctx);
9574     SSL_CTX_free(snictx);
9575 
9576     return testresult;
9577 }
9578 #endif
9579 
9580 static int test_cert_cb(int tst)
9581 {
9582     int testresult = 1;
9583 
9584 #ifndef OPENSSL_NO_TLS1_2
9585     testresult &= test_cert_cb_int(TLS1_2_VERSION, tst);
9586 #endif
9587 #ifndef OSSL_NO_USABLE_TLS1_3
9588     testresult &= test_cert_cb_int(TLS1_3_VERSION, tst);
9589 #endif
9590 
9591     return testresult;
9592 }
9593 
9594 static int client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
9595 {
9596     X509 *xcert;
9597     EVP_PKEY *privpkey;
9598     BIO *in = NULL;
9599     BIO *priv_in = NULL;
9600 
9601     /* Check that SSL_get0_peer_certificate() returns something sensible */
9602     if (!TEST_ptr(SSL_get0_peer_certificate(ssl)))
9603         return 0;
9604 
9605     in = BIO_new_file(cert, "r");
9606     if (!TEST_ptr(in))
9607         return 0;
9608 
9609     if (!TEST_ptr(xcert = X509_new_ex(libctx, NULL))
9610         || !TEST_ptr(PEM_read_bio_X509(in, &xcert, NULL, NULL))
9611         || !TEST_ptr(priv_in = BIO_new_file(privkey, "r"))
9612         || !TEST_ptr(privpkey = PEM_read_bio_PrivateKey_ex(priv_in, NULL,
9613                          NULL, NULL,
9614                          libctx, NULL)))
9615         goto err;
9616 
9617     *x509 = xcert;
9618     *pkey = privpkey;
9619 
9620     BIO_free(in);
9621     BIO_free(priv_in);
9622     return 1;
9623 err:
9624     X509_free(xcert);
9625     BIO_free(in);
9626     BIO_free(priv_in);
9627     return 0;
9628 }
9629 
9630 static int test_client_cert_cb(int tst)
9631 {
9632     SSL_CTX *cctx = NULL, *sctx = NULL;
9633     SSL *clientssl = NULL, *serverssl = NULL;
9634     int testresult = 0;
9635 
9636 #ifdef OPENSSL_NO_TLS1_2
9637     if (tst == 0)
9638         return 1;
9639 #endif
9640 #ifdef OSSL_NO_USABLE_TLS1_3
9641     if (tst == 1)
9642         return 1;
9643 #endif
9644 
9645     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9646             TLS_client_method(),
9647             TLS1_VERSION,
9648             tst == 0 ? TLS1_2_VERSION
9649                      : TLS1_3_VERSION,
9650             &sctx, &cctx, cert, privkey)))
9651         goto end;
9652 
9653     /*
9654      * Test that setting a client_cert_cb results in a client certificate being
9655      * sent.
9656      */
9657     SSL_CTX_set_client_cert_cb(cctx, client_cert_cb);
9658     SSL_CTX_set_verify(sctx,
9659         SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
9660         verify_cb);
9661 
9662     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9663             NULL, NULL))
9664         || !TEST_true(create_ssl_connection(serverssl, clientssl,
9665             SSL_ERROR_NONE)))
9666         goto end;
9667 
9668     testresult = 1;
9669 
9670 end:
9671     SSL_free(serverssl);
9672     SSL_free(clientssl);
9673     SSL_CTX_free(sctx);
9674     SSL_CTX_free(cctx);
9675 
9676     return testresult;
9677 }
9678 
9679 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
9680 /*
9681  * Test setting certificate authorities on both client and server.
9682  *
9683  * Test 0: SSL_CTX_set0_CA_list() only
9684  * Test 1: Both SSL_CTX_set0_CA_list() and SSL_CTX_set_client_CA_list()
9685  * Test 2: Only SSL_CTX_set_client_CA_list()
9686  */
9687 static int test_ca_names_int(int prot, int tst)
9688 {
9689     SSL_CTX *cctx = NULL, *sctx = NULL;
9690     SSL *clientssl = NULL, *serverssl = NULL;
9691     int testresult = 0;
9692     size_t i;
9693     X509_NAME *name[] = { NULL, NULL, NULL, NULL };
9694     char *strnames[] = { "Jack", "Jill", "John", "Joanne" };
9695     STACK_OF(X509_NAME) *sk1 = NULL, *sk2 = NULL;
9696     const STACK_OF(X509_NAME) *sktmp = NULL;
9697 
9698     for (i = 0; i < OSSL_NELEM(name); i++) {
9699         name[i] = X509_NAME_new();
9700         if (!TEST_ptr(name[i])
9701             || !TEST_true(X509_NAME_add_entry_by_txt(name[i], "CN",
9702                 MBSTRING_ASC,
9703                 (unsigned char *)
9704                     strnames[i],
9705                 -1, -1, 0)))
9706             goto end;
9707     }
9708 
9709     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
9710             TLS_client_method(),
9711             TLS1_VERSION,
9712             prot,
9713             &sctx, &cctx, cert, privkey)))
9714         goto end;
9715 
9716     SSL_CTX_set_verify(sctx, SSL_VERIFY_PEER, NULL);
9717 
9718     if (tst == 0 || tst == 1) {
9719         if (!TEST_ptr(sk1 = sk_X509_NAME_new_null())
9720             || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[0])))
9721             || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[1])))
9722             || !TEST_ptr(sk2 = sk_X509_NAME_new_null())
9723             || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[0])))
9724             || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[1]))))
9725             goto end;
9726 
9727         SSL_CTX_set0_CA_list(sctx, sk1);
9728         SSL_CTX_set0_CA_list(cctx, sk2);
9729         sk1 = sk2 = NULL;
9730     }
9731     if (tst == 1 || tst == 2) {
9732         if (!TEST_ptr(sk1 = sk_X509_NAME_new_null())
9733             || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[2])))
9734             || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[3])))
9735             || !TEST_ptr(sk2 = sk_X509_NAME_new_null())
9736             || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[2])))
9737             || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[3]))))
9738             goto end;
9739 
9740         SSL_CTX_set_client_CA_list(sctx, sk1);
9741         SSL_CTX_set_client_CA_list(cctx, sk2);
9742         sk1 = sk2 = NULL;
9743     }
9744 
9745     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9746             NULL, NULL))
9747         || !TEST_true(create_ssl_connection(serverssl, clientssl,
9748             SSL_ERROR_NONE)))
9749         goto end;
9750 
9751     /*
9752      * We only expect certificate authorities to have been sent to the server
9753      * if we are using TLSv1.3 and SSL_set0_CA_list() was used
9754      */
9755     sktmp = SSL_get0_peer_CA_list(serverssl);
9756     if (prot == TLS1_3_VERSION
9757         && (tst == 0 || tst == 1)) {
9758         if (!TEST_ptr(sktmp)
9759             || !TEST_int_eq(sk_X509_NAME_num(sktmp), 2)
9760             || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 0),
9761                                 name[0]),
9762                 0)
9763             || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 1),
9764                                 name[1]),
9765                 0))
9766             goto end;
9767     } else if (!TEST_ptr_null(sktmp)) {
9768         goto end;
9769     }
9770 
9771     /*
9772      * In all tests we expect certificate authorities to have been sent to the
9773      * client. However, SSL_set_client_CA_list() should override
9774      * SSL_set0_CA_list()
9775      */
9776     sktmp = SSL_get0_peer_CA_list(clientssl);
9777     if (!TEST_ptr(sktmp)
9778         || !TEST_int_eq(sk_X509_NAME_num(sktmp), 2)
9779         || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 0),
9780                             name[tst == 0 ? 0 : 2]),
9781             0)
9782         || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 1),
9783                             name[tst == 0 ? 1 : 3]),
9784             0))
9785         goto end;
9786 
9787     testresult = 1;
9788 
9789 end:
9790     SSL_free(serverssl);
9791     SSL_free(clientssl);
9792     SSL_CTX_free(sctx);
9793     SSL_CTX_free(cctx);
9794     for (i = 0; i < OSSL_NELEM(name); i++)
9795         X509_NAME_free(name[i]);
9796     sk_X509_NAME_pop_free(sk1, X509_NAME_free);
9797     sk_X509_NAME_pop_free(sk2, X509_NAME_free);
9798 
9799     return testresult;
9800 }
9801 #endif
9802 
9803 static int test_ca_names(int tst)
9804 {
9805     int testresult = 1;
9806 
9807 #ifndef OPENSSL_NO_TLS1_2
9808     testresult &= test_ca_names_int(TLS1_2_VERSION, tst);
9809 #endif
9810 #ifndef OSSL_NO_USABLE_TLS1_3
9811     testresult &= test_ca_names_int(TLS1_3_VERSION, tst);
9812 #endif
9813 
9814     return testresult;
9815 }
9816 
9817 #ifndef OPENSSL_NO_TLS1_2
9818 static const char *multiblock_cipherlist_data[] = {
9819     "AES128-SHA",
9820     "AES128-SHA256",
9821     "AES256-SHA",
9822     "AES256-SHA256",
9823 };
9824 
9825 /* Reduce the fragment size - so the multiblock test buffer can be small */
9826 #define MULTIBLOCK_FRAGSIZE 512
9827 
9828 static int test_multiblock_write(int test_index)
9829 {
9830     static const char *fetchable_ciphers[] = {
9831         "AES-128-CBC-HMAC-SHA1",
9832         "AES-128-CBC-HMAC-SHA256",
9833         "AES-256-CBC-HMAC-SHA1",
9834         "AES-256-CBC-HMAC-SHA256"
9835     };
9836     const char *cipherlist = multiblock_cipherlist_data[test_index];
9837     const SSL_METHOD *smeth = TLS_server_method();
9838     const SSL_METHOD *cmeth = TLS_client_method();
9839     int min_version = TLS1_VERSION;
9840     int max_version = TLS1_2_VERSION; /* Don't select TLS1_3 */
9841     SSL_CTX *cctx = NULL, *sctx = NULL;
9842     SSL *clientssl = NULL, *serverssl = NULL;
9843     int testresult = 0;
9844 
9845     /*
9846      * Choose a buffer large enough to perform a multi-block operation
9847      * i.e: write_len >= 4 * frag_size
9848      * 9 * is chosen so that multiple multiblocks are used + some leftover.
9849      */
9850     unsigned char msg[MULTIBLOCK_FRAGSIZE * 9];
9851     unsigned char buf[sizeof(msg)], *p = buf;
9852     size_t readbytes, written, len;
9853     EVP_CIPHER *ciph = NULL;
9854 
9855     /*
9856      * Check if the cipher exists before attempting to use it since it only has
9857      * a hardware specific implementation.
9858      */
9859     ciph = EVP_CIPHER_fetch(libctx, fetchable_ciphers[test_index], "");
9860     if (ciph == NULL) {
9861         TEST_skip("Multiblock cipher is not available for %s", cipherlist);
9862         return 1;
9863     }
9864     EVP_CIPHER_free(ciph);
9865 
9866     /* Set up a buffer with some data that will be sent to the client */
9867     RAND_bytes(msg, sizeof(msg));
9868 
9869     if (!TEST_true(create_ssl_ctx_pair(libctx, smeth, cmeth, min_version,
9870             max_version, &sctx, &cctx, cert,
9871             privkey)))
9872         goto end;
9873 
9874     if (!TEST_true(SSL_CTX_set_max_send_fragment(sctx, MULTIBLOCK_FRAGSIZE)))
9875         goto end;
9876 
9877     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
9878             NULL, NULL)))
9879         goto end;
9880 
9881     /* settings to force it to use AES-CBC-HMAC_SHA */
9882     SSL_set_options(serverssl, SSL_OP_NO_ENCRYPT_THEN_MAC);
9883     if (!TEST_true(SSL_CTX_set_cipher_list(cctx, cipherlist)))
9884         goto end;
9885 
9886     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
9887         goto end;
9888 
9889     if (!TEST_true(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
9890         || !TEST_size_t_eq(written, sizeof(msg)))
9891         goto end;
9892 
9893     len = written;
9894     while (len > 0) {
9895         if (!TEST_true(SSL_read_ex(clientssl, p, MULTIBLOCK_FRAGSIZE, &readbytes)))
9896             goto end;
9897         p += readbytes;
9898         len -= readbytes;
9899     }
9900     if (!TEST_mem_eq(msg, sizeof(msg), buf, sizeof(buf)))
9901         goto end;
9902 
9903     testresult = 1;
9904 end:
9905     SSL_free(serverssl);
9906     SSL_free(clientssl);
9907     SSL_CTX_free(sctx);
9908     SSL_CTX_free(cctx);
9909 
9910     return testresult;
9911 }
9912 #endif /* OPENSSL_NO_TLS1_2 */
9913 
9914 static int test_session_timeout(int test)
9915 {
9916     /*
9917      * Test session ordering and timeout
9918      * Can't explicitly test performance of the new code,
9919      * but can test to see if the ordering of the sessions
9920      * are correct, and they are removed as expected
9921      */
9922     SSL_SESSION *early = NULL;
9923     SSL_SESSION *middle = NULL;
9924     SSL_SESSION *late = NULL;
9925     SSL_CTX *ctx;
9926     int testresult = 0;
9927     time_t now = time(NULL);
9928 #define TIMEOUT 10
9929 
9930     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_method()))
9931         || !TEST_ptr(early = SSL_SESSION_new())
9932         || !TEST_ptr(middle = SSL_SESSION_new())
9933         || !TEST_ptr(late = SSL_SESSION_new()))
9934         goto end;
9935 
9936     /* assign unique session ids */
9937     early->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
9938     memset(early->session_id, 1, SSL3_SSL_SESSION_ID_LENGTH);
9939     middle->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
9940     memset(middle->session_id, 2, SSL3_SSL_SESSION_ID_LENGTH);
9941     late->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
9942     memset(late->session_id, 3, SSL3_SSL_SESSION_ID_LENGTH);
9943 
9944     if (!TEST_int_eq(SSL_CTX_add_session(ctx, early), 1)
9945         || !TEST_int_eq(SSL_CTX_add_session(ctx, middle), 1)
9946         || !TEST_int_eq(SSL_CTX_add_session(ctx, late), 1))
9947         goto end;
9948 
9949     /* Make sure they are all added */
9950     if (!TEST_ptr(early->prev)
9951         || !TEST_ptr(middle->prev)
9952         || !TEST_ptr(late->prev))
9953         goto end;
9954 
9955     if (!TEST_time_t_ne(SSL_SESSION_set_time_ex(early, now - 10), 0)
9956         || !TEST_time_t_ne(SSL_SESSION_set_time_ex(middle, now), 0)
9957         || !TEST_time_t_ne(SSL_SESSION_set_time_ex(late, now + 10), 0))
9958         goto end;
9959 
9960     if (!TEST_int_ne(SSL_SESSION_set_timeout(early, TIMEOUT), 0)
9961         || !TEST_int_ne(SSL_SESSION_set_timeout(middle, TIMEOUT), 0)
9962         || !TEST_int_ne(SSL_SESSION_set_timeout(late, TIMEOUT), 0))
9963         goto end;
9964 
9965     /* Make sure they are all still there */
9966     if (!TEST_ptr(early->prev)
9967         || !TEST_ptr(middle->prev)
9968         || !TEST_ptr(late->prev))
9969         goto end;
9970 
9971     /* Make sure they are in the expected order */
9972     if (!TEST_ptr_eq(late->next, middle)
9973         || !TEST_ptr_eq(middle->next, early)
9974         || !TEST_ptr_eq(early->prev, middle)
9975         || !TEST_ptr_eq(middle->prev, late))
9976         goto end;
9977 
9978     /* This should remove "early" */
9979     SSL_CTX_flush_sessions_ex(ctx, now + TIMEOUT - 1);
9980     if (!TEST_ptr_null(early->prev)
9981         || !TEST_ptr(middle->prev)
9982         || !TEST_ptr(late->prev))
9983         goto end;
9984 
9985     /* This should remove "middle" */
9986     SSL_CTX_flush_sessions_ex(ctx, now + TIMEOUT + 1);
9987     if (!TEST_ptr_null(early->prev)
9988         || !TEST_ptr_null(middle->prev)
9989         || !TEST_ptr(late->prev))
9990         goto end;
9991 
9992     /* This should remove "late" */
9993     SSL_CTX_flush_sessions_ex(ctx, now + TIMEOUT + 11);
9994     if (!TEST_ptr_null(early->prev)
9995         || !TEST_ptr_null(middle->prev)
9996         || !TEST_ptr_null(late->prev))
9997         goto end;
9998 
9999     /* Add them back in again */
10000     if (!TEST_int_eq(SSL_CTX_add_session(ctx, early), 1)
10001         || !TEST_int_eq(SSL_CTX_add_session(ctx, middle), 1)
10002         || !TEST_int_eq(SSL_CTX_add_session(ctx, late), 1))
10003         goto end;
10004 
10005     /* Make sure they are all added */
10006     if (!TEST_ptr(early->prev)
10007         || !TEST_ptr(middle->prev)
10008         || !TEST_ptr(late->prev))
10009         goto end;
10010 
10011     /* This should remove all of them */
10012     SSL_CTX_flush_sessions_ex(ctx, 0);
10013     if (!TEST_ptr_null(early->prev)
10014         || !TEST_ptr_null(middle->prev)
10015         || !TEST_ptr_null(late->prev))
10016         goto end;
10017 
10018     (void)SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_UPDATE_TIME | SSL_CTX_get_session_cache_mode(ctx));
10019 
10020     /* make sure |now| is NOT  equal to the current time */
10021     now -= 10;
10022     if (!TEST_time_t_ne(SSL_SESSION_set_time_ex(early, now), 0)
10023         || !TEST_int_eq(SSL_CTX_add_session(ctx, early), 1)
10024         || !TEST_time_t_ne(SSL_SESSION_get_time_ex(early), now))
10025         goto end;
10026 
10027     testresult = 1;
10028 end:
10029     SSL_CTX_free(ctx);
10030     SSL_SESSION_free(early);
10031     SSL_SESSION_free(middle);
10032     SSL_SESSION_free(late);
10033     return testresult;
10034 }
10035 
10036 /*
10037  * Test that a session cache overflow works as expected
10038  * Test 0: TLSv1.3, timeout on new session later than old session
10039  * Test 1: TLSv1.2, timeout on new session later than old session
10040  * Test 2: TLSv1.3, timeout on new session earlier than old session
10041  * Test 3: TLSv1.2, timeout on new session earlier than old session
10042  */
10043 #if !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
10044 static int test_session_cache_overflow(int idx)
10045 {
10046     SSL_CTX *sctx = NULL, *cctx = NULL;
10047     SSL *serverssl = NULL, *clientssl = NULL;
10048     int testresult = 0;
10049     SSL_SESSION *sess = NULL;
10050     int references;
10051 
10052 #ifdef OSSL_NO_USABLE_TLS1_3
10053     /* If no TLSv1.3 available then do nothing in this case */
10054     if (idx % 2 == 0)
10055         return TEST_skip("No TLSv1.3 available");
10056 #endif
10057 #ifdef OPENSSL_NO_TLS1_2
10058     /* If no TLSv1.2 available then do nothing in this case */
10059     if (idx % 2 == 1)
10060         return TEST_skip("No TLSv1.2 available");
10061 #endif
10062 
10063     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10064             TLS_client_method(), TLS1_VERSION,
10065             (idx % 2 == 0) ? TLS1_3_VERSION
10066                            : TLS1_2_VERSION,
10067             &sctx, &cctx, cert, privkey))
10068         || !TEST_true(SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET)))
10069         goto end;
10070 
10071     SSL_CTX_sess_set_get_cb(sctx, get_session_cb);
10072     get_sess_val = NULL;
10073 
10074     SSL_CTX_sess_set_cache_size(sctx, 1);
10075 
10076     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10077             NULL, NULL)))
10078         goto end;
10079 
10080     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10081         goto end;
10082 
10083     if (idx > 1) {
10084         sess = SSL_get_session(serverssl);
10085         if (!TEST_ptr(sess))
10086             goto end;
10087 
10088         /*
10089          * Cause this session to have a longer timeout than the next session to
10090          * be added.
10091          */
10092         if (!TEST_true(SSL_SESSION_set_timeout(sess, LONG_MAX))) {
10093             sess = NULL;
10094             goto end;
10095         }
10096         sess = NULL;
10097     }
10098 
10099     SSL_shutdown(serverssl);
10100     SSL_shutdown(clientssl);
10101     SSL_free(serverssl);
10102     SSL_free(clientssl);
10103     serverssl = clientssl = NULL;
10104 
10105     /*
10106      * Session cache size is 1 and we already populated the cache with a session
10107      * so the next connection should cause an overflow.
10108      */
10109 
10110     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10111             NULL, NULL)))
10112         goto end;
10113 
10114     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10115         goto end;
10116 
10117     /*
10118      * The session we just negotiated may have been already removed from the
10119      * internal cache - but we will return it anyway from our external cache.
10120      */
10121     get_sess_val = SSL_get_session(serverssl);
10122     if (!TEST_ptr(get_sess_val))
10123         goto end;
10124     /*
10125      * Normally the session is also stored in the cache, thus we have more than
10126      * one reference, but due to an out-of-memory error it can happen that this
10127      * is the only reference, and in that case the SSL_free(serverssl) below
10128      * would free the get_sess_val, causing a use-after-free error.
10129      */
10130     if (!TEST_true(CRYPTO_GET_REF(&get_sess_val->references, &references))
10131         || !TEST_int_ge(references, 2))
10132         goto end;
10133     sess = SSL_get1_session(clientssl);
10134     if (!TEST_ptr(sess))
10135         goto end;
10136 
10137     SSL_shutdown(serverssl);
10138     SSL_shutdown(clientssl);
10139     SSL_free(serverssl);
10140     SSL_free(clientssl);
10141     serverssl = clientssl = NULL;
10142 
10143     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10144             NULL, NULL)))
10145         goto end;
10146 
10147     if (!TEST_true(SSL_set_session(clientssl, sess)))
10148         goto end;
10149 
10150     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10151         goto end;
10152 
10153     testresult = 1;
10154 
10155 end:
10156     SSL_free(serverssl);
10157     SSL_free(clientssl);
10158     SSL_CTX_free(sctx);
10159     SSL_CTX_free(cctx);
10160     SSL_SESSION_free(sess);
10161 
10162     return testresult;
10163 }
10164 #endif /* !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2) */
10165 
10166 /*
10167  * Test 0: Client sets servername and server acknowledges it (TLSv1.2)
10168  * Test 1: Client sets servername and server does not acknowledge it (TLSv1.2)
10169  * Test 2: Client sets inconsistent servername on resumption (TLSv1.2)
10170  * Test 3: Client does not set servername on initial handshake (TLSv1.2)
10171  * Test 4: Client does not set servername on resumption handshake (TLSv1.2)
10172  * Test 5: Client sets servername and server acknowledges it (TLSv1.3)
10173  * Test 6: Client sets servername and server does not acknowledge it (TLSv1.3)
10174  * Test 7: Client sets inconsistent servername on resumption (TLSv1.3)
10175  * Test 8: Client does not set servername on initial handshake(TLSv1.3)
10176  * Test 9: Client does not set servername on resumption handshake (TLSv1.3)
10177  */
10178 static int test_servername(int tst)
10179 {
10180     SSL_CTX *cctx = NULL, *sctx = NULL;
10181     SSL *clientssl = NULL, *serverssl = NULL;
10182     int testresult = 0;
10183     SSL_SESSION *sess = NULL;
10184     const char *sexpectedhost = NULL, *cexpectedhost = NULL;
10185 
10186 #ifdef OPENSSL_NO_TLS1_2
10187     if (tst <= 4)
10188         return 1;
10189 #endif
10190 #ifdef OSSL_NO_USABLE_TLS1_3
10191     if (tst >= 5)
10192         return 1;
10193 #endif
10194 
10195     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10196             TLS_client_method(),
10197             TLS1_VERSION,
10198             (tst <= 4) ? TLS1_2_VERSION
10199                        : TLS1_3_VERSION,
10200             &sctx, &cctx, cert, privkey))
10201         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10202             NULL, NULL)))
10203         goto end;
10204 
10205     if (tst != 1 && tst != 6) {
10206         if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx,
10207                 hostname_cb)))
10208             goto end;
10209     }
10210 
10211     if (tst != 3 && tst != 8) {
10212         if (!TEST_true(SSL_set_tlsext_host_name(clientssl, "goodhost")))
10213             goto end;
10214         sexpectedhost = cexpectedhost = "goodhost";
10215     }
10216 
10217     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10218         goto end;
10219 
10220     if (!TEST_str_eq(SSL_get_servername(clientssl, TLSEXT_NAMETYPE_host_name),
10221             cexpectedhost)
10222         || !TEST_str_eq(SSL_get_servername(serverssl,
10223                             TLSEXT_NAMETYPE_host_name),
10224             sexpectedhost))
10225         goto end;
10226 
10227     /* Now repeat with a resumption handshake */
10228 
10229     if (!TEST_int_eq(SSL_shutdown(clientssl), 0)
10230         || !TEST_ptr_ne(sess = SSL_get1_session(clientssl), NULL)
10231         || !TEST_true(SSL_SESSION_is_resumable(sess))
10232         || !TEST_int_eq(SSL_shutdown(serverssl), 0))
10233         goto end;
10234 
10235     SSL_free(clientssl);
10236     SSL_free(serverssl);
10237     clientssl = serverssl = NULL;
10238 
10239     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
10240             NULL)))
10241         goto end;
10242 
10243     if (!TEST_true(SSL_set_session(clientssl, sess)))
10244         goto end;
10245 
10246     sexpectedhost = cexpectedhost = "goodhost";
10247     if (tst == 2 || tst == 7) {
10248         /* Set an inconsistent hostname */
10249         if (!TEST_true(SSL_set_tlsext_host_name(clientssl, "altgoodhost")))
10250             goto end;
10251         /*
10252          * In TLSv1.2 we expect the hostname from the original handshake, in
10253          * TLSv1.3 we expect the hostname from this handshake
10254          */
10255         if (tst == 7)
10256             sexpectedhost = cexpectedhost = "altgoodhost";
10257 
10258         if (!TEST_str_eq(SSL_get_servername(clientssl,
10259                              TLSEXT_NAMETYPE_host_name),
10260                 "altgoodhost"))
10261             goto end;
10262     } else if (tst == 4 || tst == 9) {
10263         /*
10264          * A TLSv1.3 session does not associate a session with a servername,
10265          * but a TLSv1.2 session does.
10266          */
10267         if (tst == 9)
10268             sexpectedhost = cexpectedhost = NULL;
10269 
10270         if (!TEST_str_eq(SSL_get_servername(clientssl,
10271                              TLSEXT_NAMETYPE_host_name),
10272                 cexpectedhost))
10273             goto end;
10274     } else {
10275         if (!TEST_true(SSL_set_tlsext_host_name(clientssl, "goodhost")))
10276             goto end;
10277         /*
10278          * In a TLSv1.2 resumption where the hostname was not acknowledged
10279          * we expect the hostname on the server to be empty. On the client we
10280          * return what was requested in this case.
10281          *
10282          * Similarly if the client didn't set a hostname on an original TLSv1.2
10283          * session but is now, the server hostname will be empty, but the client
10284          * is as we set it.
10285          */
10286         if (tst == 1 || tst == 3)
10287             sexpectedhost = NULL;
10288 
10289         if (!TEST_str_eq(SSL_get_servername(clientssl,
10290                              TLSEXT_NAMETYPE_host_name),
10291                 "goodhost"))
10292             goto end;
10293     }
10294 
10295     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10296         goto end;
10297 
10298     if (!TEST_true(SSL_session_reused(clientssl))
10299         || !TEST_true(SSL_session_reused(serverssl))
10300         || !TEST_str_eq(SSL_get_servername(clientssl,
10301                             TLSEXT_NAMETYPE_host_name),
10302             cexpectedhost)
10303         || !TEST_str_eq(SSL_get_servername(serverssl,
10304                             TLSEXT_NAMETYPE_host_name),
10305             sexpectedhost))
10306         goto end;
10307 
10308     testresult = 1;
10309 
10310 end:
10311     SSL_SESSION_free(sess);
10312     SSL_free(serverssl);
10313     SSL_free(clientssl);
10314     SSL_CTX_free(sctx);
10315     SSL_CTX_free(cctx);
10316 
10317     return testresult;
10318 }
10319 
10320 static int test_unknown_sigalgs_groups(void)
10321 {
10322     int ret = 0;
10323     SSL_CTX *ctx = NULL;
10324 
10325     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method())))
10326         goto end;
10327 
10328     if (!TEST_int_gt(SSL_CTX_set1_sigalgs_list(ctx,
10329                          "RSA+SHA256:?nonexistent:?RSA+SHA512"),
10330             0))
10331         goto end;
10332     if (!TEST_size_t_eq(ctx->cert->conf_sigalgslen, 2)
10333         || !TEST_int_eq(ctx->cert->conf_sigalgs[0], TLSEXT_SIGALG_rsa_pkcs1_sha256)
10334         || !TEST_int_eq(ctx->cert->conf_sigalgs[1], TLSEXT_SIGALG_rsa_pkcs1_sha512))
10335         goto end;
10336 
10337     if (!TEST_int_gt(SSL_CTX_set1_client_sigalgs_list(ctx,
10338                          "RSA+SHA256:?nonexistent:?RSA+SHA512"),
10339             0))
10340         goto end;
10341     if (!TEST_size_t_eq(ctx->cert->client_sigalgslen, 2)
10342         || !TEST_int_eq(ctx->cert->client_sigalgs[0], TLSEXT_SIGALG_rsa_pkcs1_sha256)
10343         || !TEST_int_eq(ctx->cert->client_sigalgs[1], TLSEXT_SIGALG_rsa_pkcs1_sha512))
10344         goto end;
10345 
10346     if (!TEST_int_le(SSL_CTX_set1_groups_list(ctx,
10347                          "nonexistent"),
10348             0))
10349         goto end;
10350 
10351     if (!TEST_int_gt(SSL_CTX_set1_groups_list(ctx,
10352                          "?nonexistent1:?nonexistent2:?nonexistent3"),
10353             0))
10354         goto end;
10355 
10356 #ifndef OPENSSL_NO_EC
10357     if (!TEST_int_le(SSL_CTX_set1_groups_list(ctx,
10358                          "P-256:nonexistent"),
10359             0))
10360         goto end;
10361 
10362     if (!TEST_int_gt(SSL_CTX_set1_groups_list(ctx,
10363                          "P-384:?nonexistent:?P-521"),
10364             0))
10365         goto end;
10366     if (!TEST_size_t_eq(ctx->ext.supportedgroups_len, 2)
10367         || !TEST_int_eq(ctx->ext.supportedgroups[0], OSSL_TLS_GROUP_ID_secp384r1)
10368         || !TEST_int_eq(ctx->ext.supportedgroups[1], OSSL_TLS_GROUP_ID_secp521r1))
10369         goto end;
10370 #endif
10371 
10372     ret = 1;
10373 end:
10374     SSL_CTX_free(ctx);
10375     return ret;
10376 }
10377 
10378 #if (!defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)) || !defined(OPENSSL_NO_ML_KEM)
10379 static int test_configuration_of_groups(void)
10380 {
10381     int ret = 0;
10382     SSL_CTX *ctx = NULL;
10383     size_t groups_len;
10384 
10385     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method())))
10386         goto end;
10387     groups_len = ctx->ext.supportedgroups_len;
10388 
10389     if (!TEST_size_t_gt(groups_len, 0)
10390         || !TEST_int_gt(SSL_CTX_set1_groups_list(ctx, "DEFAULT"), 0)
10391         || !TEST_size_t_eq(ctx->ext.supportedgroups_len, groups_len))
10392         goto end;
10393 
10394     if (!TEST_int_gt(SSL_CTX_set1_groups_list(ctx, "DEFAULT:-?P-256"), 0)
10395 #if !defined(OPENSSL_NO_EC)
10396         || !TEST_size_t_eq(ctx->ext.supportedgroups_len, groups_len - 1)
10397 #else
10398         || !TEST_size_t_eq(ctx->ext.supportedgroups_len, groups_len)
10399 #endif
10400     )
10401         goto end;
10402 
10403 #if !defined(OPENSSL_NO_EC)
10404     if (!TEST_int_gt(SSL_CTX_set1_groups_list(ctx, "?P-256:?P-521:-?P-256"), 0)
10405         || !TEST_size_t_eq(ctx->ext.supportedgroups_len, 1)
10406         || !TEST_int_eq(ctx->ext.supportedgroups[0], OSSL_TLS_GROUP_ID_secp521r1))
10407         goto end;
10408 #endif
10409 
10410     ret = 1;
10411 
10412 end:
10413     SSL_CTX_free(ctx);
10414     return ret;
10415 }
10416 #endif
10417 
10418 #if !defined(OPENSSL_NO_EC) \
10419     && (!defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2))
10420 /*
10421  * Test that if signature algorithms are not available, then we do not offer or
10422  * accept them.
10423  * Test 0: Two RSA sig algs available: both RSA sig algs shared
10424  * Test 1: The client only has SHA2-256: only SHA2-256 algorithms shared
10425  * Test 2: The server only has SHA2-256: only SHA2-256 algorithms shared
10426  * Test 3: An RSA and an ECDSA sig alg available: both sig algs shared
10427  * Test 4: The client only has an ECDSA sig alg: only ECDSA algorithms shared
10428  * Test 5: The server only has an ECDSA sig alg: only ECDSA algorithms shared
10429  */
10430 static int test_sigalgs_available(int idx)
10431 {
10432     SSL_CTX *cctx = NULL, *sctx = NULL;
10433     SSL *clientssl = NULL, *serverssl = NULL;
10434     int testresult = 0;
10435     OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
10436     OSSL_LIB_CTX *clientctx = libctx, *serverctx = libctx;
10437     OSSL_PROVIDER *filterprov = NULL;
10438     int sig, hash, numshared, numshared_expected, hash_expected, sig_expected;
10439     const char *sigalg_name, *signame_expected;
10440 
10441     if (!TEST_ptr(tmpctx))
10442         goto end;
10443 
10444     if (idx != 0 && idx != 3) {
10445         if (!TEST_true(OSSL_PROVIDER_add_builtin(tmpctx, "filter",
10446                 filter_provider_init)))
10447             goto end;
10448 
10449         filterprov = OSSL_PROVIDER_load(tmpctx, "filter");
10450         if (!TEST_ptr(filterprov))
10451             goto end;
10452 
10453         if (idx < 3) {
10454             /*
10455              * Only enable SHA2-256 so rsa_pss_rsae_sha384 should not be offered
10456              * or accepted for the peer that uses this libctx. Note that libssl
10457              * *requires* SHA2-256 to be available so we cannot disable that. We
10458              * also need SHA1 for our certificate.
10459              */
10460             if (!TEST_true(filter_provider_set_filter(OSSL_OP_DIGEST,
10461                     "SHA2-256:SHA1")))
10462                 goto end;
10463         } else {
10464             if (!TEST_true(filter_provider_set_filter(OSSL_OP_SIGNATURE,
10465                     "ECDSA"))
10466 #ifdef OPENSSL_NO_ECX
10467                 || !TEST_true(filter_provider_set_filter(OSSL_OP_KEYMGMT, "EC"))
10468 #else
10469                 || !TEST_true(filter_provider_set_filter(OSSL_OP_KEYMGMT,
10470                     "EC:X25519:X448"))
10471 #endif
10472             )
10473                 goto end;
10474         }
10475 
10476         if (idx == 1 || idx == 4)
10477             clientctx = tmpctx;
10478         else
10479             serverctx = tmpctx;
10480     }
10481 
10482     cctx = SSL_CTX_new_ex(clientctx, NULL, TLS_client_method());
10483     sctx = SSL_CTX_new_ex(serverctx, NULL, TLS_server_method());
10484     if (!TEST_ptr(cctx) || !TEST_ptr(sctx))
10485         goto end;
10486 
10487     /* Avoid MLKEM groups that depend on possibly filtered-out digests */
10488     if (!TEST_true(SSL_CTX_set1_groups_list(cctx,
10489             "?X25519:?secp256r1:?ffdhe2048:?ffdhe3072"))
10490         || !TEST_true(SSL_CTX_set1_groups_list(sctx,
10491             "?X25519:?secp256r1:?ffdhe2048:?ffdhe3072")))
10492         goto end;
10493 
10494     if (idx != 5) {
10495         /* RSA first server key */
10496         if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10497                 TLS_client_method(),
10498                 TLS1_VERSION,
10499                 0,
10500                 &sctx, &cctx, cert, privkey)))
10501             goto end;
10502     } else {
10503         /* ECDSA P-256 first server key */
10504         if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10505                 TLS_client_method(),
10506                 TLS1_VERSION,
10507                 0,
10508                 &sctx, &cctx, cert2, privkey2)))
10509             goto end;
10510     }
10511 
10512     /* Ensure we only use TLSv1.2 ciphersuites based on SHA256 */
10513     if (idx < 4) {
10514         if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
10515                 "ECDHE-RSA-AES128-GCM-SHA256")))
10516             goto end;
10517     } else {
10518         if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
10519                 "ECDHE-ECDSA-AES128-GCM-SHA256")))
10520             goto end;
10521     }
10522 
10523     if (idx < 3) {
10524         if (!SSL_CTX_set1_sigalgs_list(cctx,
10525                 "rsa_pss_rsae_sha384"
10526                 ":rsa_pss_rsae_sha256")
10527             || !SSL_CTX_set1_sigalgs_list(sctx,
10528                 "rsa_pss_rsae_sha384"
10529                 ":rsa_pss_rsae_sha256"))
10530             goto end;
10531     } else {
10532         if (!SSL_CTX_set1_sigalgs_list(cctx, "rsa_pss_rsae_sha256:ECDSA+SHA256")
10533             || !SSL_CTX_set1_sigalgs_list(sctx,
10534                 "rsa_pss_rsae_sha256:ECDSA+SHA256"))
10535             goto end;
10536     }
10537 
10538     /* ECDSA P-256 second server key, unless already first */
10539     if (idx != 5
10540         && (!TEST_int_eq(SSL_CTX_use_certificate_file(sctx, cert2,
10541                              SSL_FILETYPE_PEM),
10542                 1)
10543             || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(sctx,
10544                                 privkey2,
10545                                 SSL_FILETYPE_PEM),
10546                 1)
10547             || !TEST_int_eq(SSL_CTX_check_private_key(sctx), 1)))
10548         goto end;
10549 
10550     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10551             NULL, NULL)))
10552         goto end;
10553 
10554     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10555         goto end;
10556 
10557     /* For tests 0 and 3 we expect 2 shared sigalgs, otherwise exactly 1 */
10558     numshared = SSL_get_shared_sigalgs(serverssl, 0, &sig, &hash,
10559         NULL, NULL, NULL);
10560     numshared_expected = 1;
10561     hash_expected = NID_sha256;
10562     sig_expected = NID_rsassaPss;
10563     signame_expected = "rsa_pss_rsae_sha256";
10564     switch (idx) {
10565     case 0:
10566         hash_expected = NID_sha384;
10567         signame_expected = "rsa_pss_rsae_sha384";
10568         /* FALLTHROUGH */
10569     case 3:
10570         numshared_expected = 2;
10571         break;
10572     case 4:
10573     case 5:
10574         sig_expected = EVP_PKEY_EC;
10575         signame_expected = "ecdsa_secp256r1_sha256";
10576         break;
10577     }
10578     if (!TEST_int_eq(numshared, numshared_expected)
10579         || !TEST_int_eq(hash, hash_expected)
10580         || !TEST_int_eq(sig, sig_expected)
10581         || !TEST_true(SSL_get0_peer_signature_name(clientssl, &sigalg_name))
10582         || !TEST_ptr(sigalg_name)
10583         || !TEST_str_eq(sigalg_name, signame_expected))
10584         goto end;
10585 
10586     testresult = filter_provider_check_clean_finish();
10587 
10588 end:
10589     SSL_free(serverssl);
10590     SSL_free(clientssl);
10591     SSL_CTX_free(sctx);
10592     SSL_CTX_free(cctx);
10593     OSSL_PROVIDER_unload(filterprov);
10594     OSSL_LIB_CTX_free(tmpctx);
10595 
10596     return testresult;
10597 }
10598 #endif /*                                                                     \
10599         * !defined(OPENSSL_NO_EC)                                             \
10600         * && (!defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)) \
10601         */
10602 
10603 #ifndef OPENSSL_NO_TLS1_3
10604 /* This test can run in TLSv1.3 even if ec and dh are disabled */
10605 static int test_pluggable_group(int idx)
10606 {
10607     SSL_CTX *cctx = NULL, *sctx = NULL;
10608     SSL *clientssl = NULL, *serverssl = NULL;
10609     int testresult = 0;
10610     OSSL_PROVIDER *tlsprov = OSSL_PROVIDER_load(libctx, "tls-provider");
10611     /* Check that we are not impacted by a provider without any groups */
10612     OSSL_PROVIDER *legacyprov = OSSL_PROVIDER_load(libctx, "legacy");
10613     const char *group_name = idx == 0 ? "xorkemgroup" : "xorgroup";
10614 
10615     if (!TEST_ptr(tlsprov))
10616         goto end;
10617 
10618     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10619             TLS_client_method(),
10620             TLS1_3_VERSION,
10621             TLS1_3_VERSION,
10622             &sctx, &cctx, cert, privkey))
10623         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10624             NULL, NULL)))
10625         goto end;
10626 
10627     /* ensure GROUPLIST_INCREMENT (=40) logic triggers: */
10628     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"))
10629         /* removing a single algorithm from the list makes the test pass */
10630         || !TEST_true(SSL_set1_groups_list(clientssl, group_name)))
10631         goto end;
10632 
10633     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10634         goto end;
10635 
10636     if (!TEST_str_eq(group_name,
10637             SSL_group_to_name(serverssl, SSL_get_shared_group(serverssl, 0))))
10638         goto end;
10639 
10640     if (!TEST_str_eq(group_name, SSL_get0_group_name(serverssl))
10641         || !TEST_str_eq(group_name, SSL_get0_group_name(clientssl)))
10642         goto end;
10643 
10644     testresult = 1;
10645 
10646 end:
10647     SSL_free(serverssl);
10648     SSL_free(clientssl);
10649     SSL_CTX_free(sctx);
10650     SSL_CTX_free(cctx);
10651     OSSL_PROVIDER_unload(tlsprov);
10652     OSSL_PROVIDER_unload(legacyprov);
10653 
10654     return testresult;
10655 }
10656 
10657 /*
10658  * This function triggers encode, decode and sign functions
10659  * of the artificial "xorhmacsig" algorithm implemented in tls-provider
10660  * creating private key and certificate files for use in TLS testing.
10661  */
10662 static int create_cert_key(int idx, char *certfilename, char *privkeyfilename)
10663 {
10664     EVP_PKEY_CTX *evpctx = EVP_PKEY_CTX_new_from_name(libctx,
10665         (idx == 0) ? "xorhmacsig" : "xorhmacsha2sig", NULL);
10666     EVP_PKEY *pkey = NULL;
10667     X509 *x509 = X509_new();
10668     X509_NAME *name = NULL;
10669     BIO *keybio = NULL, *certbio = NULL;
10670     int ret = 1;
10671 
10672     if (!TEST_ptr(evpctx)
10673         || !TEST_int_gt(EVP_PKEY_keygen_init(evpctx), 0)
10674         || !TEST_true(EVP_PKEY_generate(evpctx, &pkey))
10675         || !TEST_ptr(pkey)
10676         || !TEST_ptr(x509)
10677         || !TEST_true(ASN1_INTEGER_set(X509_get_serialNumber(x509), 1))
10678         || !TEST_true(X509_gmtime_adj(X509_getm_notBefore(x509), 0))
10679         || !TEST_true(X509_gmtime_adj(X509_getm_notAfter(x509), 31536000L))
10680         || !TEST_true(X509_set_pubkey(x509, pkey))
10681         || !TEST_ptr(name = X509_get_subject_name(x509))
10682         || !TEST_true(X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC,
10683             (unsigned char *)"CH", -1, -1, 0))
10684         || !TEST_true(X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC,
10685             (unsigned char *)"test.org", -1, -1, 0))
10686         || !TEST_true(X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
10687             (unsigned char *)"localhost", -1, -1, 0))
10688         || !TEST_true(X509_set_issuer_name(x509, name))
10689         || !TEST_true(X509_sign(x509, pkey, EVP_sha1()))
10690         || !TEST_ptr(keybio = BIO_new_file(privkeyfilename, "wb"))
10691         || !TEST_true(PEM_write_bio_PrivateKey(keybio, pkey, NULL, NULL, 0, NULL, NULL))
10692         || !TEST_ptr(certbio = BIO_new_file(certfilename, "wb"))
10693         || !TEST_true(PEM_write_bio_X509(certbio, x509)))
10694         ret = 0;
10695 
10696     EVP_PKEY_free(pkey);
10697     X509_free(x509);
10698     EVP_PKEY_CTX_free(evpctx);
10699     BIO_free(keybio);
10700     BIO_free(certbio);
10701     return ret;
10702 }
10703 
10704 /*
10705  * Test that signature algorithms loaded via the provider interface can
10706  * correctly establish a TLS (1.3) connection.
10707  * Test 0: Signature algorithm with built-in hashing functionality: "xorhmacsig"
10708  * Test 1: Signature algorithm using external SHA2 hashing: "xorhmacsha2sig"
10709  * Test 2: Signature algorithm with built-in hashing configured via SSL_CONF_cmd
10710  * Test 3: Test 0 using RPK
10711  * Test 4: Test 1 using RPK
10712  * Test 5: Test 2 using RPK
10713  */
10714 static int test_pluggable_signature(int idx)
10715 {
10716     static const unsigned char cert_type_rpk[] = { TLSEXT_cert_type_rpk, TLSEXT_cert_type_x509 };
10717     SSL_CTX *cctx = NULL, *sctx = NULL;
10718     SSL *clientssl = NULL, *serverssl = NULL;
10719     int testresult = 0;
10720     OSSL_PROVIDER *tlsprov = OSSL_PROVIDER_load(libctx, "tls-provider");
10721     OSSL_PROVIDER *defaultprov = OSSL_PROVIDER_load(libctx, "default");
10722     char *certfilename = "tls-prov-cert.pem";
10723     char *privkeyfilename = "tls-prov-key.pem";
10724     const char *sigalg_name = NULL, *expected_sigalg_name;
10725     int sigidx = idx % 3;
10726     int rpkidx = idx / 3;
10727     int do_conf_cmd = 0;
10728 
10729     if (sigidx == 2) {
10730         sigidx = 0;
10731         do_conf_cmd = 1;
10732     }
10733 
10734     /* See create_cert_key() above */
10735     expected_sigalg_name = (sigidx == 0) ? "xorhmacsig" : "xorhmacsha2sig";
10736 
10737     /* create key and certificate for the different algorithm types */
10738     if (!TEST_ptr(tlsprov)
10739         || !TEST_true(create_cert_key(sigidx, certfilename, privkeyfilename)))
10740         goto end;
10741 
10742     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10743             TLS_client_method(),
10744             TLS1_3_VERSION,
10745             TLS1_3_VERSION,
10746             &sctx, &cctx, NULL, NULL)))
10747         goto end;
10748 
10749     if (do_conf_cmd) {
10750         SSL_CONF_CTX *confctx = SSL_CONF_CTX_new();
10751 
10752         if (!TEST_ptr(confctx))
10753             goto end;
10754         SSL_CONF_CTX_set_flags(confctx, SSL_CONF_FLAG_FILE | SSL_CONF_FLAG_SERVER | SSL_CONF_FLAG_CERTIFICATE | SSL_CONF_FLAG_REQUIRE_PRIVATE | SSL_CONF_FLAG_SHOW_ERRORS);
10755         SSL_CONF_CTX_set_ssl_ctx(confctx, sctx);
10756         if (!TEST_int_gt(SSL_CONF_cmd(confctx, "Certificate", certfilename), 0)
10757             || !TEST_int_gt(SSL_CONF_cmd(confctx, "PrivateKey", privkeyfilename), 0)
10758             || !TEST_true(SSL_CONF_CTX_finish(confctx))) {
10759             SSL_CONF_CTX_free(confctx);
10760             goto end;
10761         }
10762         SSL_CONF_CTX_free(confctx);
10763     } else {
10764         if (!TEST_int_eq(SSL_CTX_use_certificate_file(sctx, certfilename,
10765                              SSL_FILETYPE_PEM),
10766                 1)
10767             || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(sctx,
10768                                 privkeyfilename,
10769                                 SSL_FILETYPE_PEM),
10770                 1))
10771             goto end;
10772     }
10773     if (!TEST_int_eq(SSL_CTX_check_private_key(sctx), 1))
10774         goto end;
10775 
10776     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10777             NULL, NULL)))
10778         goto end;
10779 
10780     /* Enable RPK for server cert */
10781     if (rpkidx) {
10782         if (!TEST_true(SSL_set1_server_cert_type(serverssl, cert_type_rpk, sizeof(cert_type_rpk)))
10783             || !TEST_true(SSL_set1_server_cert_type(clientssl, cert_type_rpk, sizeof(cert_type_rpk))))
10784             goto end;
10785     }
10786 
10787     /* This is necessary to pass minimal setup w/o other groups configured */
10788     if (!TEST_true(SSL_set1_groups_list(serverssl, "xorgroup"))
10789         || !TEST_true(SSL_set1_groups_list(clientssl, "xorgroup")))
10790         goto end;
10791 
10792     /*
10793      * If this connection gets established, it must have been completed
10794      * via the tls-provider-implemented "hmacsig" algorithm, testing
10795      * both sign and verify functions during handshake.
10796      */
10797     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10798         goto end;
10799 
10800     /* If using RPK, make sure we got one */
10801     if (rpkidx && !TEST_long_eq(SSL_get_verify_result(clientssl), X509_V_ERR_RPK_UNTRUSTED))
10802         goto end;
10803 
10804     if (!TEST_true(SSL_get0_peer_signature_name(clientssl, &sigalg_name))
10805         || !TEST_str_eq(sigalg_name, expected_sigalg_name)
10806         || !TEST_ptr(sigalg_name))
10807         goto end;
10808 
10809     testresult = 1;
10810 
10811 end:
10812     SSL_free(serverssl);
10813     SSL_free(clientssl);
10814     SSL_CTX_free(sctx);
10815     SSL_CTX_free(cctx);
10816     OSSL_PROVIDER_unload(tlsprov);
10817     OSSL_PROVIDER_unload(defaultprov);
10818 
10819     return testresult;
10820 }
10821 #endif
10822 
10823 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
10824 /*
10825  * Regression tests for CVE-2026-72897: SSL_set_SSL_CTX() must refresh the
10826  * connection's signature algorithm state to describe the context it installs.
10827  *
10828  * |ssl_pkey_num| sizes |s3.tmp.valid_flags| and bounds the loops over
10829  * |cert->pkeys|, while a provider sigalg's |sig_idx| is its position in the
10830  * list of whichever context a peer codepoint is resolved against, so the two
10831  * must describe the same one. The test provider is what makes them differ: a
10832  * context created before it is loaded lacks the two slots it adds.
10833  */
10834 
10835 struct sigalg_ctx_switch_st {
10836     SSL_CTX *newctx;
10837     int switches; /* Number of times the callback switched context */
10838     int err; /* Set if SSL_set_SSL_CTX() itself failed */
10839     uint32_t preflags; /* valid_flags[SSL_PKEY_RSA] before the switch */
10840     uint32_t postflags; /* ...and after it */
10841 };
10842 
10843 static int sigalg_switch_ctx(SSL *s, struct sigalg_ctx_switch_st *data)
10844 {
10845     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL_ONLY(s);
10846 
10847     if (sc == NULL)
10848         return 0;
10849 
10850     if (sc->s3.tmp.valid_flags != NULL)
10851         data->preflags = sc->s3.tmp.valid_flags[SSL_PKEY_RSA];
10852     if (SSL_set_SSL_CTX(s, data->newctx) == NULL)
10853         return 0;
10854     if (sc->s3.tmp.valid_flags != NULL)
10855         data->postflags = sc->s3.tmp.valid_flags[SSL_PKEY_RSA];
10856 
10857     data->switches++;
10858     return 1;
10859 }
10860 
10861 static int sigalg_switch_sni_cb(SSL *s, int *al, void *arg)
10862 {
10863     struct sigalg_ctx_switch_st *data = arg;
10864 
10865     if (SSL_get_SSL_CTX(s) != data->newctx && !sigalg_switch_ctx(s, data)) {
10866         data->err = 1;
10867         *al = SSL_AD_INTERNAL_ERROR;
10868         return SSL_TLSEXT_ERR_ALERT_FATAL;
10869     }
10870     return SSL_TLSEXT_ERR_OK;
10871 }
10872 
10873 static int sigalg_switch_clienthello_cb(SSL *s, int *al, void *arg)
10874 {
10875     struct sigalg_ctx_switch_st *data = arg;
10876 
10877     if (SSL_get_SSL_CTX(s) != data->newctx && !sigalg_switch_ctx(s, data)) {
10878         data->err = 1;
10879         *al = SSL_AD_INTERNAL_ERROR;
10880         return SSL_CLIENT_HELLO_ERROR;
10881     }
10882     return SSL_CLIENT_HELLO_SUCCESS;
10883 }
10884 
10885 static int sigalg_switch_cert_cb(SSL *s, void *arg)
10886 {
10887     struct sigalg_ctx_switch_st *data = arg;
10888 
10889     if (SSL_get_SSL_CTX(s) != data->newctx && !sigalg_switch_ctx(s, data)) {
10890         data->err = 1;
10891         return 0;
10892     }
10893     return 1;
10894 }
10895 
10896 /*
10897  * Build the three contexts these tests need. An SSL_CTX takes its snapshot of
10898  * the provider sigalgs when it is created, so |*sctx| is created while the test
10899  * provider is not loaded and does not have its sigalgs, and |*newsctx| and
10900  * |*cctx| are created after it is loaded and do have them. The client needs
10901  * them too, so that it actually offers the codepoints which resolve to the
10902  * slots the original context does not have.
10903  */
10904 static int sigalg_ctx_switch_setup(OSSL_PROVIDER **tlsprov, int version,
10905     SSL_CTX **sctx, SSL_CTX **newsctx, SSL_CTX **cctx)
10906 {
10907     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), NULL,
10908             version, version, sctx, NULL, cert, privkey)))
10909         return 0;
10910 
10911     if (!TEST_ptr(*tlsprov = OSSL_PROVIDER_load(libctx, "tls-provider")))
10912         return 0;
10913 
10914     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10915             TLS_client_method(), version, version, newsctx, cctx, cert,
10916             privkey)))
10917         return 0;
10918 
10919     /*
10920      * The premise of the test is that the replacement context describes more
10921      * signature algorithm slots than the original. Check that, rather than let
10922      * the test quietly become vacuous if that ever stops being true.
10923      */
10924     if (!TEST_size_t_lt((*sctx)->cert->ssl_pkey_num,
10925             (*newsctx)->cert->ssl_pkey_num))
10926         return 0;
10927 
10928     return 1;
10929 }
10930 
10931 /*
10932  * |ssl_pkey_num| bounds the loops which index |cert->pkeys| and sizes
10933  * |valid_flags|, so it must describe the CERT the connection is actually
10934  * using, not the one it was created from.
10935  */
10936 static int sigalg_ctx_switch_check(SSL *serverssl)
10937 {
10938     SSL_CONNECTION *sc;
10939 
10940     if (!TEST_ptr(sc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl)))
10941         return 0;
10942 
10943     return TEST_size_t_eq(sc->ssl_pkey_num, sc->cert->ssl_pkey_num);
10944 }
10945 
10946 /*
10947  * Switch SSL_CTX from a callback which runs *before* tls1_set_server_sigalgs()
10948  * allocates |valid_flags|. This is the route CVE-2026-72897 describes: the
10949  * stale |ssl_pkey_num| undersizes that allocation, and tls1_process_sigalgs()
10950  * reads and writes past its end for each peer codepoint occupying one of the
10951  * replacement context's excess slots. The peer chooses how many such accesses
10952  * happen, and where, by choosing which codepoints to offer.
10953  *
10954  * Both callbacks tested here run before that allocation, but not at the same
10955  * point: the client_hello callback runs before the ClientHello extensions have
10956  * been parsed at all, whereas the servername callback runs from the "final"
10957  * pass over them, after the sigalgs extension has been saved and after session
10958  * resumption has been decided. They are therefore checked separately.
10959  *
10960  * The two slots the test provider adds are TLSv1.3 only, so only the TLSv1.3
10961  * cases can index past the end of the buffer; the TLSv1.2 cases pin the
10962  * invariant for a version which processes signature algorithms identically.
10963  *
10964  * Test 0: servername callback, TLSv1.3
10965  * Test 1: client_hello callback, TLSv1.3
10966  * Test 2: servername callback, TLSv1.2
10967  * Test 3: client_hello callback, TLSv1.2
10968  */
10969 static int test_sigalg_ctx_switch(int idx)
10970 {
10971     OSSL_PROVIDER *tlsprov = NULL;
10972     SSL_CTX *sctx = NULL, *newsctx = NULL, *cctx = NULL;
10973     SSL *serverssl = NULL, *clientssl = NULL;
10974     struct sigalg_ctx_switch_st cbdata;
10975     int tls13 = idx < 2;
10976     int ver, testresult = 0;
10977 
10978 #ifdef OSSL_NO_USABLE_TLS1_3
10979     if (tls13)
10980         return TEST_skip("TLSv1.3 is not available");
10981 #endif
10982 #ifdef OPENSSL_NO_TLS1_2
10983     if (!tls13)
10984         return TEST_skip("TLSv1.2 is not available");
10985 #endif
10986     ver = tls13 ? TLS1_3_VERSION : TLS1_2_VERSION;
10987 
10988     memset(&cbdata, 0, sizeof(cbdata));
10989 
10990     if (!sigalg_ctx_switch_setup(&tlsprov, ver, &sctx, &newsctx, &cctx))
10991         goto end;
10992 
10993     cbdata.newctx = newsctx;
10994 
10995     if ((idx & 1) == 0) {
10996         if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx,
10997                 sigalg_switch_sni_cb))
10998             || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, &cbdata)))
10999             goto end;
11000     } else {
11001         SSL_CTX_set_client_hello_cb(sctx, sigalg_switch_clienthello_cb,
11002             &cbdata);
11003     }
11004 
11005     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11006             NULL, NULL)))
11007         goto end;
11008 
11009     if (!TEST_true(SSL_set_tlsext_host_name(clientssl, "server.example")))
11010         goto end;
11011 
11012     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11013         goto end;
11014 
11015     if (!TEST_int_eq(cbdata.err, 0)
11016         || !TEST_int_eq(cbdata.switches, 1)
11017         || !sigalg_ctx_switch_check(serverssl))
11018         goto end;
11019 
11020     testresult = 1;
11021 
11022 end:
11023     SSL_free(serverssl);
11024     SSL_free(clientssl);
11025     SSL_CTX_free(sctx);
11026     SSL_CTX_free(newsctx);
11027     SSL_CTX_free(cctx);
11028     OSSL_PROVIDER_unload(tlsprov);
11029 
11030     return testresult;
11031 }
11032 
11033 /*
11034  * Switch SSL_CTX from the certificate callback. Nothing prevents an
11035  * application doing this, so it has to keep working, and unlike the
11036  * servername and client_hello callbacks it runs *after*
11037  * tls1_set_server_sigalgs() has sized and filled in |valid_flags| for the
11038  * original context. Nothing recomputes the shared signature algorithms later
11039  * in the same handshake, so what this checks is that the switch leaves both
11040  * the slot count and the flags already derived from the peer consistent with
11041  * the context now installed.
11042  *
11043  * Test 0: TLSv1.3
11044  * Test 1: TLSv1.2
11045  */
11046 static int test_sigalg_ctx_switch_cert_cb(int idx)
11047 {
11048     OSSL_PROVIDER *tlsprov = NULL;
11049     SSL_CTX *sctx = NULL, *newsctx = NULL, *cctx = NULL;
11050     SSL *serverssl = NULL, *clientssl = NULL;
11051     struct sigalg_ctx_switch_st cbdata;
11052     int tls13 = idx == 0;
11053     int ver, testresult = 0;
11054 
11055 #ifdef OSSL_NO_USABLE_TLS1_3
11056     if (tls13)
11057         return TEST_skip("TLSv1.3 is not available");
11058 #endif
11059 #ifdef OPENSSL_NO_TLS1_2
11060     if (!tls13)
11061         return TEST_skip("TLSv1.2 is not available");
11062 #endif
11063     ver = tls13 ? TLS1_3_VERSION : TLS1_2_VERSION;
11064 
11065     memset(&cbdata, 0, sizeof(cbdata));
11066 
11067     if (!sigalg_ctx_switch_setup(&tlsprov, ver, &sctx, &newsctx, &cctx))
11068         goto end;
11069 
11070     cbdata.newctx = newsctx;
11071     SSL_CTX_set_cert_cb(sctx, sigalg_switch_cert_cb, &cbdata);
11072 
11073     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11074             NULL, NULL))
11075         || !TEST_true(create_ssl_connection(serverssl, clientssl,
11076             SSL_ERROR_NONE)))
11077         goto end;
11078 
11079     if (!TEST_int_eq(cbdata.err, 0)
11080         || !TEST_int_eq(cbdata.switches, 1)
11081         || !sigalg_ctx_switch_check(serverssl))
11082         goto end;
11083 
11084     /*
11085      * The switch happened after |valid_flags| had been populated, so the
11086      * built-in slots must have survived it. Nothing recomputes them after a
11087      * context switch, and at TLSv1.2 and above ssl_set_masks() needs them to
11088      * enable ECDSA, Ed25519 and Ed448.
11089      */
11090     if (!TEST_uint_ne(cbdata.preflags, 0)
11091         || !TEST_uint_eq(cbdata.postflags, cbdata.preflags))
11092         goto end;
11093 
11094     testresult = 1;
11095 
11096 end:
11097     SSL_free(serverssl);
11098     SSL_free(clientssl);
11099     SSL_CTX_free(sctx);
11100     SSL_CTX_free(newsctx);
11101     SSL_CTX_free(cctx);
11102     OSSL_PROVIDER_unload(tlsprov);
11103 
11104     return testresult;
11105 }
11106 
11107 #ifndef OPENSSL_NO_TLS1_2
11108 #define SIGALG_SWITCH_SNI1 "first.example"
11109 #define SIGALG_SWITCH_SNI2 "second.example"
11110 
11111 static int sigalg_switch_reneg_sni_cb(SSL *s, int *al, void *arg)
11112 {
11113     const char *name = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
11114 
11115     /* Model an application which picks its SSL_CTX from the name offered */
11116     if (name == NULL || strcmp(name, SIGALG_SWITCH_SNI2) != 0)
11117         return SSL_TLSEXT_ERR_OK;
11118 
11119     return sigalg_switch_sni_cb(s, al, arg);
11120 }
11121 
11122 /*
11123  * Switch SSL_CTX from the servername callback during a *renegotiation*
11124  * handshake, the client having offered a different name the second time round.
11125  * |valid_flags| is allocated during the initial handshake and is not freed in
11126  * between, so this is the case where SSL_set_SSL_CTX() has to replace an
11127  * existing buffer rather than merely correct the count a later allocation will
11128  * use. Renegotiation is TLSv1.2 and below only.
11129  *
11130  * The slot count is the only signal here: the two slots the test provider adds
11131  * are TLSv1.3 only, so nothing indexes past the end of the reused buffer.
11132  * Under a sanitiser this also catches replacing that buffer wrongly -
11133  * refreshing |ssl_pkey_num| while keeping the old allocation would make the
11134  * memset() in tls1_set_server_sigalgs() overrun it on the renegotiation.
11135  */
11136 static int test_sigalg_ctx_switch_reneg(void)
11137 {
11138     OSSL_PROVIDER *tlsprov = NULL;
11139     SSL_CTX *sctx = NULL, *newsctx = NULL, *cctx = NULL;
11140     SSL *serverssl = NULL, *clientssl = NULL;
11141     SSL_CONNECTION *sc;
11142     struct sigalg_ctx_switch_st cbdata;
11143     size_t readbytes;
11144     char buf[80];
11145     int i, testresult = 0;
11146 
11147     memset(&cbdata, 0, sizeof(cbdata));
11148 
11149     if (!sigalg_ctx_switch_setup(&tlsprov, TLS1_2_VERSION, &sctx, &newsctx,
11150             &cctx))
11151         goto end;
11152 
11153     cbdata.newctx = newsctx;
11154 
11155     if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx,
11156             sigalg_switch_reneg_sni_cb))
11157         || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, &cbdata)))
11158         goto end;
11159 
11160     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11161             NULL, NULL)))
11162         goto end;
11163 
11164     /*
11165      * The first handshake must not switch, so that |valid_flags| is allocated
11166      * and populated for the original context.
11167      */
11168     if (!TEST_true(SSL_set_tlsext_host_name(clientssl, SIGALG_SWITCH_SNI1))
11169         || !TEST_true(create_ssl_connection(serverssl, clientssl,
11170             SSL_ERROR_NONE))
11171         || !TEST_int_eq(cbdata.switches, 0))
11172         goto end;
11173 
11174     if (!TEST_ptr(sc = SSL_CONNECTION_FROM_SSL_ONLY(serverssl))
11175         || !TEST_ptr(sc->s3.tmp.valid_flags))
11176         goto end;
11177 
11178     /* Now renegotiate, offering the name which does select the other context */
11179     if (!TEST_true(SSL_set_tlsext_host_name(clientssl, SIGALG_SWITCH_SNI2))
11180         || !TEST_true(SSL_renegotiate(clientssl))
11181         || !TEST_true(SSL_renegotiate_pending(clientssl)))
11182         goto end;
11183 
11184     for (i = 0; i < 3; i++) {
11185         if (SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes) > 0) {
11186             if (!TEST_size_t_eq(readbytes, 0))
11187                 goto end;
11188         } else if (!TEST_int_eq(SSL_get_error(clientssl, 0),
11189                        SSL_ERROR_WANT_READ)) {
11190             goto end;
11191         }
11192         if (SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes) > 0) {
11193             if (!TEST_size_t_eq(readbytes, 0))
11194                 goto end;
11195         } else if (!TEST_int_eq(SSL_get_error(serverssl, 0),
11196                        SSL_ERROR_WANT_READ)) {
11197             goto end;
11198         }
11199     }
11200 
11201     /*
11202      * A resumed renegotiation would skip tls1_set_server_sigalgs() altogether,
11203      * so check the renegotiation really was a full handshake.
11204      */
11205     if (!TEST_false(SSL_renegotiate_pending(clientssl))
11206         || !TEST_false(SSL_session_reused(serverssl))
11207         || !TEST_int_eq(cbdata.err, 0)
11208         || !TEST_int_eq(cbdata.switches, 1)
11209         || !sigalg_ctx_switch_check(serverssl))
11210         goto end;
11211 
11212     /* The built-in slots must survive the buffer being replaced */
11213     if (!TEST_uint_ne(cbdata.preflags, 0)
11214         || !TEST_uint_eq(cbdata.postflags, cbdata.preflags))
11215         goto end;
11216 
11217     testresult = 1;
11218 
11219 end:
11220     SSL_free(serverssl);
11221     SSL_free(clientssl);
11222     SSL_CTX_free(sctx);
11223     SSL_CTX_free(newsctx);
11224     SSL_CTX_free(cctx);
11225     OSSL_PROVIDER_unload(tlsprov);
11226 
11227     return testresult;
11228 }
11229 #endif /* OPENSSL_NO_TLS1_2 */
11230 #endif
11231 
11232 #ifndef OPENSSL_NO_TLS1_2
11233 
11234 #define CERT_TYPE_C "\x0" /* TLSEXT_cert_type_x509 */
11235 #define CERT_TYPE_S "\x2" /* TLSEXT_cert_type_rpk */
11236 
11237 #ifndef OPENSSL_NO_CT
11238 #define CB_ARG "callback arg"
11239 
11240 /* ARGSUSED */
11241 static int validation_cbk(const CT_POLICY_EVAL_CTX *ctx,
11242     const STACK_OF(SCT) *scts, void *arg)
11243 {
11244     return 1;
11245 }
11246 #endif
11247 
11248 static int test_ssl_dup(void)
11249 {
11250     SSL_CTX *cctx = NULL, *sctx = NULL;
11251     SSL *clientssl = NULL, *serverssl = NULL, *client2ssl = NULL;
11252     int testresult = 0;
11253     BIO *rbio = NULL, *wbio = NULL;
11254     unsigned char *ctype;
11255     size_t ctype_len;
11256 
11257     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11258             TLS_client_method(),
11259             0,
11260             0,
11261             &sctx, &cctx, cert, privkey)))
11262         goto end;
11263 
11264     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11265             NULL, NULL)))
11266         goto end;
11267 
11268     if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION))
11269         || !TEST_true(SSL_set_max_proto_version(clientssl, TLS1_2_VERSION)))
11270         goto end;
11271 
11272     if (!TEST_true(
11273             SSL_set1_client_cert_type(clientssl,
11274                 (const unsigned char *)CERT_TYPE_C, sizeof(CERT_TYPE_C) - 1)))
11275         goto end;
11276 
11277     if (!TEST_true(
11278             SSL_set1_server_cert_type(clientssl,
11279                 (const unsigned char *)CERT_TYPE_S, sizeof(CERT_TYPE_S) - 1)))
11280         goto end;
11281 
11282 #ifndef OPENSSL_NO_CT
11283     if (!TEST_true(SSL_set_ct_validation_callback(clientssl, validation_cbk, CB_ARG)))
11284         goto end;
11285 #endif
11286 
11287 #ifndef OPENSSL_NO_OCSP
11288     if (!TEST_true(
11289             SSL_set_tlsext_status_type(clientssl, TLSEXT_STATUSTYPE_ocsp)))
11290         goto end;
11291 #endif
11292 
11293     client2ssl = SSL_dup(clientssl);
11294     rbio = SSL_get_rbio(clientssl);
11295     if (!TEST_ptr(rbio)
11296         || !TEST_true(BIO_up_ref(rbio)))
11297         goto end;
11298     SSL_set0_rbio(client2ssl, rbio);
11299     rbio = NULL;
11300 
11301     wbio = SSL_get_wbio(clientssl);
11302     if (!TEST_ptr(wbio) || !TEST_true(BIO_up_ref(wbio)))
11303         goto end;
11304     SSL_set0_wbio(client2ssl, wbio);
11305     rbio = NULL;
11306 
11307     if (!TEST_ptr(client2ssl)
11308         /* Handshake not started so pointers should be different */
11309         || !TEST_ptr_ne(clientssl, client2ssl))
11310         goto end;
11311 
11312     if (!TEST_int_eq(SSL_get_min_proto_version(client2ssl), TLS1_2_VERSION)
11313         || !TEST_int_eq(SSL_get_max_proto_version(client2ssl), TLS1_2_VERSION))
11314         goto end;
11315 
11316     if (!TEST_true(create_ssl_connection(serverssl, client2ssl, SSL_ERROR_NONE)))
11317         goto end;
11318 
11319     if (!TEST_true(SSL_get0_client_cert_type(client2ssl, &ctype, &ctype_len)))
11320         goto end;
11321 
11322     if (!TEST_mem_eq(ctype, ctype_len, CERT_TYPE_C, sizeof(CERT_TYPE_C) - 1))
11323         goto end;
11324 
11325     if (!TEST_true(SSL_get0_server_cert_type(client2ssl, &ctype, &ctype_len)))
11326         goto end;
11327 
11328     if (!TEST_mem_eq(ctype, ctype_len, CERT_TYPE_S, sizeof(CERT_TYPE_S) - 1))
11329         goto end;
11330 
11331 #ifndef OPENSSL_NO_CT
11332     if (!TEST_true(SSL_ct_is_enabled(client2ssl)))
11333         goto end;
11334 #endif
11335 
11336 #ifndef OPENSSL_NO_OCSP
11337     if (!TEST_long_eq(SSL_get_tlsext_status_type(client2ssl), TLSEXT_STATUSTYPE_ocsp))
11338         goto end;
11339 #endif
11340 
11341     SSL_free(clientssl);
11342     clientssl = SSL_dup(client2ssl);
11343     if (!TEST_ptr(clientssl)
11344         /* Handshake has finished so pointers should be the same */
11345         || !TEST_ptr_eq(clientssl, client2ssl))
11346         goto end;
11347 
11348     testresult = 1;
11349 
11350 end:
11351     SSL_free(serverssl);
11352     SSL_free(clientssl);
11353     SSL_free(client2ssl);
11354     SSL_CTX_free(sctx);
11355     SSL_CTX_free(cctx);
11356 
11357     return testresult;
11358 }
11359 
11360 static int secret_cb(SSL *s, void *secretin, int *secret_len,
11361     STACK_OF(SSL_CIPHER) *peer_ciphers,
11362     const SSL_CIPHER **cipher, void *arg)
11363 {
11364     int i;
11365     unsigned char *secret = secretin;
11366 
11367     /* Just use a fixed master secret */
11368     for (i = 0; i < *secret_len; i++)
11369         secret[i] = 0xff;
11370 
11371     /* We don't set a preferred cipher */
11372 
11373     return 1;
11374 }
11375 
11376 /*
11377  * Test the session_secret_cb which is designed for use with EAP-FAST
11378  */
11379 static int test_session_secret_cb(int idx)
11380 {
11381     SSL_CTX *cctx = NULL, *sctx = NULL;
11382     SSL *clientssl = NULL, *serverssl = NULL;
11383     SSL_SESSION *secret_sess = NULL, *server_sess = NULL;
11384     unsigned int sess_len;
11385     const unsigned char *sessid;
11386     int testresult = 0;
11387 
11388     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11389             TLS_client_method(),
11390             0,
11391             0,
11392             &sctx, &cctx, cert, privkey)))
11393         goto end;
11394 
11395     /* Create an initial connection and save the session */
11396     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11397             NULL, NULL)))
11398         goto end;
11399 
11400     /* session_secret_cb does not support TLSv1.3 */
11401     if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION))
11402         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION)))
11403         goto end;
11404 
11405     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11406         goto end;
11407 
11408     if (!TEST_ptr(secret_sess = SSL_get1_session(clientssl)))
11409         goto end;
11410 
11411     shutdown_ssl_connection(serverssl, clientssl);
11412     serverssl = clientssl = NULL;
11413 
11414     /* Resume the earlier session */
11415     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11416             NULL, NULL)))
11417         goto end;
11418 
11419     if (idx == 0) {
11420         /*
11421          * Normal case: no session id
11422          */
11423         if (!TEST_true(SSL_SESSION_set1_id(secret_sess, NULL, 0)))
11424             goto end;
11425     } else {
11426         /*
11427          * Set an explicit session id. Normally we don't support this, but we
11428          * can get away with it if we reset the session id later
11429          */
11430         if (!TEST_true(SSL_SESSION_set1_id(secret_sess, (unsigned char *)"sessionid", 9)))
11431             goto end;
11432     }
11433 
11434     if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION))
11435         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
11436         || !TEST_true(SSL_set_session_secret_cb(serverssl, secret_cb,
11437             NULL))
11438         || !TEST_true(SSL_set_session_secret_cb(clientssl, secret_cb,
11439             NULL))
11440         || !TEST_true(SSL_set_session(clientssl, secret_sess)))
11441         goto end;
11442 
11443     if (idx == 1) {
11444         /*
11445          * We just send the ClientHello here. We expect this to fail with
11446          * SSL_ERROR_WANT_READ
11447          */
11448         if (!TEST_int_le(SSL_connect(clientssl), 0))
11449             goto end;
11450         /* Reset the session id to avoid confusing the state machine */
11451         if (!TEST_true(SSL_SESSION_set1_id(secret_sess, NULL, 0)))
11452             goto end;
11453     }
11454     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11455         goto end;
11456 
11457     /* Check that session resumption was successful */
11458     if (!TEST_true(SSL_session_reused(clientssl))
11459         || !TEST_true(SSL_session_reused(serverssl)))
11460         goto end;
11461 
11462     if (idx == 1) {
11463         server_sess = SSL_get1_session(serverssl);
11464         if (!TEST_ptr(server_sess))
11465             goto end;
11466         sessid = SSL_SESSION_get_id(server_sess, &sess_len);
11467 
11468         if (!TEST_mem_eq(sessid, sess_len, "sessionid", 9))
11469             goto end;
11470     }
11471     testresult = 1;
11472 
11473 end:
11474     SSL_SESSION_free(secret_sess);
11475     SSL_SESSION_free(server_sess);
11476     SSL_free(serverssl);
11477     SSL_free(clientssl);
11478     SSL_CTX_free(sctx);
11479     SSL_CTX_free(cctx);
11480 
11481     return testresult;
11482 }
11483 
11484 #ifndef OPENSSL_NO_DH
11485 
11486 static EVP_PKEY *tmp_dh_params = NULL;
11487 
11488 /* Helper function for the test_set_tmp_dh() tests */
11489 static EVP_PKEY *get_tmp_dh_params(void)
11490 {
11491     if (tmp_dh_params == NULL) {
11492         BIGNUM *p = NULL;
11493         OSSL_PARAM_BLD *tmpl = NULL;
11494         EVP_PKEY_CTX *pctx = NULL;
11495         OSSL_PARAM *params = NULL;
11496         EVP_PKEY *dhpkey = NULL;
11497 
11498         p = BN_get_rfc3526_prime_2048(NULL);
11499         if (!TEST_ptr(p))
11500             goto end;
11501 
11502         pctx = EVP_PKEY_CTX_new_from_name(libctx, "DH", NULL);
11503         if (!TEST_ptr(pctx)
11504             || !TEST_int_eq(EVP_PKEY_fromdata_init(pctx), 1))
11505             goto end;
11506 
11507         tmpl = OSSL_PARAM_BLD_new();
11508         if (!TEST_ptr(tmpl)
11509             || !TEST_true(OSSL_PARAM_BLD_push_BN(tmpl,
11510                 OSSL_PKEY_PARAM_FFC_P,
11511                 p))
11512             || !TEST_true(OSSL_PARAM_BLD_push_uint(tmpl,
11513                 OSSL_PKEY_PARAM_FFC_G,
11514                 2)))
11515             goto end;
11516 
11517         params = OSSL_PARAM_BLD_to_param(tmpl);
11518         if (!TEST_ptr(params)
11519             || !TEST_int_eq(EVP_PKEY_fromdata(pctx, &dhpkey,
11520                                 EVP_PKEY_KEY_PARAMETERS,
11521                                 params),
11522                 1))
11523             goto end;
11524 
11525         tmp_dh_params = dhpkey;
11526     end:
11527         BN_free(p);
11528         EVP_PKEY_CTX_free(pctx);
11529         OSSL_PARAM_BLD_free(tmpl);
11530         OSSL_PARAM_free(params);
11531     }
11532 
11533     if (tmp_dh_params != NULL && !EVP_PKEY_up_ref(tmp_dh_params))
11534         return NULL;
11535 
11536     return tmp_dh_params;
11537 }
11538 
11539 #ifndef OPENSSL_NO_DEPRECATED_3_0
11540 /* Callback used by test_set_tmp_dh() */
11541 static DH *tmp_dh_callback(SSL *s, int is_export, int keylen)
11542 {
11543     EVP_PKEY *dhpkey = get_tmp_dh_params();
11544     DH *ret = NULL;
11545 
11546     if (!TEST_ptr(dhpkey))
11547         return NULL;
11548 
11549     /*
11550      * libssl does not free the returned DH, so we free it now knowing that even
11551      * after we free dhpkey, there will still be a reference to the owning
11552      * EVP_PKEY in tmp_dh_params, and so the DH object will live for the length
11553      * of time we need it for.
11554      */
11555     ret = EVP_PKEY_get1_DH(dhpkey);
11556     DH_free(ret);
11557 
11558     EVP_PKEY_free(dhpkey);
11559 
11560     return ret;
11561 }
11562 #endif
11563 
11564 /*
11565  * Test the various methods for setting temporary DH parameters
11566  *
11567  * Test  0: Default (no auto) setting
11568  * Test  1: Explicit SSL_CTX auto off
11569  * Test  2: Explicit SSL auto off
11570  * Test  3: Explicit SSL_CTX auto on
11571  * Test  4: Explicit SSL auto on
11572  * Test  5: Explicit SSL_CTX auto off, custom DH params via EVP_PKEY
11573  * Test  6: Explicit SSL auto off, custom DH params via EVP_PKEY
11574  *
11575  * The following are testing deprecated APIs, so we only run them if available
11576  * Test  7: Explicit SSL_CTX auto off, custom DH params via DH
11577  * Test  8: Explicit SSL auto off, custom DH params via DH
11578  * Test  9: Explicit SSL_CTX auto off, custom DH params via callback
11579  * Test 10: Explicit SSL auto off, custom DH params via callback
11580  */
11581 static int test_set_tmp_dh(int idx)
11582 {
11583     SSL_CTX *cctx = NULL, *sctx = NULL;
11584     SSL *clientssl = NULL, *serverssl = NULL;
11585     int testresult = 0;
11586     int dhauto = (idx == 3 || idx == 4) ? 1 : 0;
11587     int expected = (idx <= 2) ? 0 : 1;
11588     EVP_PKEY *dhpkey = NULL;
11589 #ifndef OPENSSL_NO_DEPRECATED_3_0
11590     DH *dh = NULL;
11591 #else
11592 
11593     if (idx >= 7)
11594         return 1;
11595 #endif
11596 
11597     if (idx >= 5 && idx <= 8) {
11598         dhpkey = get_tmp_dh_params();
11599         if (!TEST_ptr(dhpkey))
11600             goto end;
11601     }
11602 #ifndef OPENSSL_NO_DEPRECATED_3_0
11603     if (idx == 7 || idx == 8) {
11604         dh = EVP_PKEY_get1_DH(dhpkey);
11605         if (!TEST_ptr(dh))
11606             goto end;
11607     }
11608 #endif
11609 
11610     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11611             TLS_client_method(),
11612             0,
11613             0,
11614             &sctx, &cctx, cert, privkey)))
11615         goto end;
11616 
11617     if ((idx & 1) == 1) {
11618         if (!TEST_true(SSL_CTX_set_dh_auto(sctx, dhauto)))
11619             goto end;
11620     }
11621 
11622     if (idx == 5) {
11623         if (!TEST_true(SSL_CTX_set0_tmp_dh_pkey(sctx, dhpkey)))
11624             goto end;
11625         dhpkey = NULL;
11626     }
11627 #ifndef OPENSSL_NO_DEPRECATED_3_0
11628     else if (idx == 7) {
11629         if (!TEST_true(SSL_CTX_set_tmp_dh(sctx, dh)))
11630             goto end;
11631     } else if (idx == 9) {
11632         SSL_CTX_set_tmp_dh_callback(sctx, tmp_dh_callback);
11633     }
11634 #endif
11635 
11636     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11637             NULL, NULL)))
11638         goto end;
11639 
11640     if ((idx & 1) == 0 && idx != 0) {
11641         if (!TEST_true(SSL_set_dh_auto(serverssl, dhauto)))
11642             goto end;
11643     }
11644     if (idx == 6) {
11645         if (!TEST_true(SSL_set0_tmp_dh_pkey(serverssl, dhpkey)))
11646             goto end;
11647         dhpkey = NULL;
11648     }
11649 #ifndef OPENSSL_NO_DEPRECATED_3_0
11650     else if (idx == 8) {
11651         if (!TEST_true(SSL_set_tmp_dh(serverssl, dh)))
11652             goto end;
11653     } else if (idx == 10) {
11654         SSL_set_tmp_dh_callback(serverssl, tmp_dh_callback);
11655     }
11656 #endif
11657 
11658     if (!TEST_true(SSL_set_min_proto_version(serverssl, TLS1_2_VERSION))
11659         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
11660         || !TEST_true(SSL_set_cipher_list(serverssl, "DHE-RSA-AES128-SHA")))
11661         goto end;
11662 
11663     /*
11664      * If autoon then we should succeed. Otherwise we expect failure because
11665      * there are no parameters
11666      */
11667     if (!TEST_int_eq(create_ssl_connection(serverssl, clientssl,
11668                          SSL_ERROR_NONE),
11669             expected))
11670         goto end;
11671 
11672     testresult = 1;
11673 
11674 end:
11675 #ifndef OPENSSL_NO_DEPRECATED_3_0
11676     DH_free(dh);
11677 #endif
11678     SSL_free(serverssl);
11679     SSL_free(clientssl);
11680     SSL_CTX_free(sctx);
11681     SSL_CTX_free(cctx);
11682     EVP_PKEY_free(dhpkey);
11683 
11684     return testresult;
11685 }
11686 
11687 /*
11688  * Test the auto DH keys are appropriately sized
11689  */
11690 static int test_dh_auto(int idx)
11691 {
11692     SSL_CTX *cctx = SSL_CTX_new_ex(libctx, NULL, TLS_client_method());
11693     SSL_CTX *sctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11694     SSL *clientssl = NULL, *serverssl = NULL;
11695     int testresult = 0;
11696     EVP_PKEY *tmpkey = NULL;
11697     char *thiscert = NULL, *thiskey = NULL;
11698     size_t expdhsize = 0;
11699     const char *ciphersuite = "DHE-RSA-AES128-SHA";
11700 
11701     if (!TEST_ptr(sctx) || !TEST_ptr(cctx))
11702         goto end;
11703 
11704     switch (idx) {
11705     case 0:
11706         /* The FIPS provider doesn't support this DH size - so we ignore it */
11707         if (is_fips) {
11708             testresult = 1;
11709             goto end;
11710         }
11711         thiscert = cert1024;
11712         thiskey = privkey1024;
11713         expdhsize = 1024;
11714         SSL_CTX_set_security_level(sctx, 1);
11715         SSL_CTX_set_security_level(cctx, 1);
11716         break;
11717     case 1:
11718         /* 2048 bit prime */
11719         thiscert = cert;
11720         thiskey = privkey;
11721         expdhsize = 2048;
11722         break;
11723     case 2:
11724         thiscert = cert3072;
11725         thiskey = privkey3072;
11726         expdhsize = 3072;
11727         break;
11728     case 3:
11729         thiscert = cert4096;
11730         thiskey = privkey4096;
11731         expdhsize = 4096;
11732         break;
11733     case 4:
11734         thiscert = cert8192;
11735         thiskey = privkey8192;
11736         expdhsize = 8192;
11737         break;
11738     /* No certificate cases */
11739     case 5:
11740         /* The FIPS provider doesn't support this DH size - so we ignore it */
11741         if (is_fips) {
11742             testresult = 1;
11743             goto end;
11744         }
11745         ciphersuite = "ADH-AES128-SHA256:@SECLEVEL=0";
11746         expdhsize = 1024;
11747         break;
11748     case 6:
11749         ciphersuite = "ADH-AES256-SHA256:@SECLEVEL=0";
11750         expdhsize = 3072;
11751         break;
11752     default:
11753         TEST_error("Invalid text index");
11754         goto end;
11755     }
11756 
11757     if (!TEST_true(create_ssl_ctx_pair(libctx, NULL,
11758             NULL,
11759             0,
11760             0,
11761             &sctx, &cctx, thiscert, thiskey)))
11762         goto end;
11763 
11764     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11765             NULL, NULL)))
11766         goto end;
11767 
11768     if (!TEST_true(SSL_set_dh_auto(serverssl, 1))
11769         || !TEST_true(SSL_set_min_proto_version(serverssl, TLS1_2_VERSION))
11770         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
11771         || !TEST_true(SSL_set_cipher_list(serverssl, ciphersuite))
11772         || !TEST_true(SSL_set_cipher_list(clientssl, ciphersuite)))
11773         goto end;
11774 
11775     /*
11776      * Send the server's first flight. At this point the server has created the
11777      * temporary DH key but hasn't finished using it yet. Once used it is
11778      * removed, so we cannot test it.
11779      */
11780     if (!TEST_int_le(SSL_connect(clientssl), 0)
11781         || !TEST_int_le(SSL_accept(serverssl), 0))
11782         goto end;
11783 
11784     if (!TEST_int_gt(SSL_get_tmp_key(serverssl, &tmpkey), 0))
11785         goto end;
11786     if (!TEST_size_t_eq(EVP_PKEY_get_bits(tmpkey), expdhsize))
11787         goto end;
11788 
11789     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11790         goto end;
11791 
11792     testresult = 1;
11793 
11794 end:
11795     SSL_free(serverssl);
11796     SSL_free(clientssl);
11797     SSL_CTX_free(sctx);
11798     SSL_CTX_free(cctx);
11799     EVP_PKEY_free(tmpkey);
11800 
11801     return testresult;
11802 }
11803 #endif /* OPENSSL_NO_DH */
11804 #endif /* OPENSSL_NO_TLS1_2 */
11805 
11806 #ifndef OSSL_NO_USABLE_TLS1_3
11807 /*
11808  * Test that setting an SNI callback works with TLSv1.3. Specifically we check
11809  * that it works even without a certificate configured for the original
11810  * SSL_CTX
11811  */
11812 static int test_sni_tls13(void)
11813 {
11814     SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
11815     SSL *clientssl = NULL, *serverssl = NULL;
11816     int testresult = 0;
11817 
11818     /* Reset callback counter */
11819     snicb = 0;
11820 
11821     /* Create an initial SSL_CTX with no certificate configured */
11822     sctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11823     if (!TEST_ptr(sctx))
11824         goto end;
11825     /* Require TLSv1.3 as a minimum */
11826     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11827             TLS_client_method(), TLS1_3_VERSION, 0,
11828             &sctx2, &cctx, cert, privkey)))
11829         goto end;
11830 
11831     /* Set up SNI */
11832     if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
11833         || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
11834         goto end;
11835 
11836     /*
11837      * Connection should still succeed because the final SSL_CTX has the right
11838      * certificates configured.
11839      */
11840     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11841             &clientssl, NULL, NULL))
11842         || !TEST_true(create_ssl_connection(serverssl, clientssl,
11843             SSL_ERROR_NONE)))
11844         goto end;
11845 
11846     /* We should have had the SNI callback called exactly once */
11847     if (!TEST_int_eq(snicb, 1))
11848         goto end;
11849 
11850     testresult = 1;
11851 
11852 end:
11853     SSL_free(serverssl);
11854     SSL_free(clientssl);
11855     SSL_CTX_free(sctx2);
11856     SSL_CTX_free(sctx);
11857     SSL_CTX_free(cctx);
11858     return testresult;
11859 }
11860 
11861 /*
11862  * Test that the lifetime hint of a TLSv1.3 ticket is no more than 1 week
11863  * 0 = TLSv1.2
11864  * 1 = TLSv1.3
11865  */
11866 static int test_ticket_lifetime(int idx)
11867 {
11868     SSL_CTX *cctx = NULL, *sctx = NULL;
11869     SSL *clientssl = NULL, *serverssl = NULL;
11870     int testresult = 0;
11871     int version = TLS1_3_VERSION;
11872 
11873 #define ONE_WEEK_SEC (7 * 24 * 60 * 60)
11874 #define TWO_WEEK_SEC (2 * ONE_WEEK_SEC)
11875 
11876     if (idx == 0) {
11877 #ifdef OPENSSL_NO_TLS1_2
11878         return TEST_skip("TLS 1.2 is disabled.");
11879 #else
11880         version = TLS1_2_VERSION;
11881 #endif
11882     }
11883 
11884     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11885             TLS_client_method(), version, version,
11886             &sctx, &cctx, cert, privkey)))
11887         goto end;
11888 
11889     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11890             &clientssl, NULL, NULL)))
11891         goto end;
11892 
11893     /*
11894      * Set the timeout to be more than 1 week
11895      * make sure the returned value is the default
11896      */
11897     if (!TEST_long_eq(SSL_CTX_set_timeout(sctx, TWO_WEEK_SEC),
11898             SSL_get_default_timeout(serverssl)))
11899         goto end;
11900 
11901     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11902         goto end;
11903 
11904     if (idx == 0) {
11905         /* TLSv1.2 uses the set value */
11906         if (!TEST_ulong_eq(SSL_SESSION_get_ticket_lifetime_hint(SSL_get_session(clientssl)), TWO_WEEK_SEC))
11907             goto end;
11908     } else {
11909         /* TLSv1.3 uses the limited value */
11910         if (!TEST_ulong_le(SSL_SESSION_get_ticket_lifetime_hint(SSL_get_session(clientssl)), ONE_WEEK_SEC))
11911             goto end;
11912     }
11913     testresult = 1;
11914 
11915 end:
11916     SSL_free(serverssl);
11917     SSL_free(clientssl);
11918     SSL_CTX_free(sctx);
11919     SSL_CTX_free(cctx);
11920     return testresult;
11921 }
11922 #endif
11923 /*
11924  * Test that setting an ALPN does not violate RFC
11925  */
11926 static int test_set_alpn(void)
11927 {
11928     SSL_CTX *ctx = NULL;
11929     SSL *ssl = NULL;
11930     int testresult = 0;
11931 
11932     unsigned char bad0[] = { 0x00, 'b', 'a', 'd' };
11933     unsigned char good[] = { 0x04, 'g', 'o', 'o', 'd' };
11934     unsigned char bad1[] = { 0x01, 'b', 'a', 'd' };
11935     unsigned char bad2[] = { 0x03, 'b', 'a', 'd', 0x00 };
11936     unsigned char bad3[] = { 0x03, 'b', 'a', 'd', 0x01, 'b', 'a', 'd' };
11937     unsigned char bad4[] = { 0x03, 'b', 'a', 'd', 0x06, 'b', 'a', 'd' };
11938 
11939     /* Create an initial SSL_CTX with no certificate configured */
11940     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11941     if (!TEST_ptr(ctx))
11942         goto end;
11943 
11944     /* the set_alpn functions return 0 (false) on success, non-zero (true) on failure */
11945     if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, NULL, 2)))
11946         goto end;
11947     if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, good, 0)))
11948         goto end;
11949     if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, good, sizeof(good))))
11950         goto end;
11951     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, good, 1)))
11952         goto end;
11953     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad0, sizeof(bad0))))
11954         goto end;
11955     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad1, sizeof(bad1))))
11956         goto end;
11957     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad2, sizeof(bad2))))
11958         goto end;
11959     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad3, sizeof(bad3))))
11960         goto end;
11961     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad4, sizeof(bad4))))
11962         goto end;
11963 
11964     ssl = SSL_new(ctx);
11965     if (!TEST_ptr(ssl))
11966         goto end;
11967 
11968     if (!TEST_false(SSL_set_alpn_protos(ssl, NULL, 2)))
11969         goto end;
11970     if (!TEST_false(SSL_set_alpn_protos(ssl, good, 0)))
11971         goto end;
11972     if (!TEST_false(SSL_set_alpn_protos(ssl, good, sizeof(good))))
11973         goto end;
11974     if (!TEST_true(SSL_set_alpn_protos(ssl, good, 1)))
11975         goto end;
11976     if (!TEST_true(SSL_set_alpn_protos(ssl, bad0, sizeof(bad0))))
11977         goto end;
11978     if (!TEST_true(SSL_set_alpn_protos(ssl, bad1, sizeof(bad1))))
11979         goto end;
11980     if (!TEST_true(SSL_set_alpn_protos(ssl, bad2, sizeof(bad2))))
11981         goto end;
11982     if (!TEST_true(SSL_set_alpn_protos(ssl, bad3, sizeof(bad3))))
11983         goto end;
11984     if (!TEST_true(SSL_set_alpn_protos(ssl, bad4, sizeof(bad4))))
11985         goto end;
11986 
11987     testresult = 1;
11988 
11989 end:
11990     SSL_free(ssl);
11991     SSL_CTX_free(ctx);
11992     return testresult;
11993 }
11994 
11995 /*
11996  * Test SSL_CTX_set1_verify/chain_cert_store and SSL_CTX_get_verify/chain_cert_store.
11997  */
11998 static int test_set_verify_cert_store_ssl_ctx(void)
11999 {
12000     SSL_CTX *ctx = NULL;
12001     int testresult = 0;
12002     X509_STORE *store = NULL, *new_store = NULL,
12003                *cstore = NULL, *new_cstore = NULL;
12004 
12005     /* Create an initial SSL_CTX. */
12006     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
12007     if (!TEST_ptr(ctx))
12008         goto end;
12009 
12010     /* Retrieve verify store pointer. */
12011     if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
12012         goto end;
12013 
12014     /* Retrieve chain store pointer. */
12015     if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
12016         goto end;
12017 
12018     /* We haven't set any yet, so this should be NULL. */
12019     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
12020         goto end;
12021 
12022     /* Create stores. We use separate stores so pointers are different. */
12023     new_store = X509_STORE_new();
12024     if (!TEST_ptr(new_store))
12025         goto end;
12026 
12027     new_cstore = X509_STORE_new();
12028     if (!TEST_ptr(new_cstore))
12029         goto end;
12030 
12031     /* Set stores. */
12032     if (!TEST_true(SSL_CTX_set1_verify_cert_store(ctx, new_store)))
12033         goto end;
12034 
12035     if (!TEST_true(SSL_CTX_set1_chain_cert_store(ctx, new_cstore)))
12036         goto end;
12037 
12038     /* Should be able to retrieve the same pointer. */
12039     if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
12040         goto end;
12041 
12042     if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
12043         goto end;
12044 
12045     if (!TEST_ptr_eq(store, new_store) || !TEST_ptr_eq(cstore, new_cstore))
12046         goto end;
12047 
12048     /* Should be able to unset again. */
12049     if (!TEST_true(SSL_CTX_set1_verify_cert_store(ctx, NULL)))
12050         goto end;
12051 
12052     if (!TEST_true(SSL_CTX_set1_chain_cert_store(ctx, NULL)))
12053         goto end;
12054 
12055     /* Should now be NULL. */
12056     if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
12057         goto end;
12058 
12059     if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
12060         goto end;
12061 
12062     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
12063         goto end;
12064 
12065     testresult = 1;
12066 
12067 end:
12068     X509_STORE_free(new_store);
12069     X509_STORE_free(new_cstore);
12070     SSL_CTX_free(ctx);
12071     return testresult;
12072 }
12073 
12074 /*
12075  * Test SSL_set1_verify/chain_cert_store and SSL_get_verify/chain_cert_store.
12076  */
12077 static int test_set_verify_cert_store_ssl(void)
12078 {
12079     SSL_CTX *ctx = NULL;
12080     SSL *ssl = NULL;
12081     int testresult = 0;
12082     X509_STORE *store = NULL, *new_store = NULL,
12083                *cstore = NULL, *new_cstore = NULL;
12084 
12085     /* Create an initial SSL_CTX. */
12086     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
12087     if (!TEST_ptr(ctx))
12088         goto end;
12089 
12090     /* Create an SSL object. */
12091     ssl = SSL_new(ctx);
12092     if (!TEST_ptr(ssl))
12093         goto end;
12094 
12095     /* Retrieve verify store pointer. */
12096     if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
12097         goto end;
12098 
12099     /* Retrieve chain store pointer. */
12100     if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
12101         goto end;
12102 
12103     /* We haven't set any yet, so this should be NULL. */
12104     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
12105         goto end;
12106 
12107     /* Create stores. We use separate stores so pointers are different. */
12108     new_store = X509_STORE_new();
12109     if (!TEST_ptr(new_store))
12110         goto end;
12111 
12112     new_cstore = X509_STORE_new();
12113     if (!TEST_ptr(new_cstore))
12114         goto end;
12115 
12116     /* Set stores. */
12117     if (!TEST_true(SSL_set1_verify_cert_store(ssl, new_store)))
12118         goto end;
12119 
12120     if (!TEST_true(SSL_set1_chain_cert_store(ssl, new_cstore)))
12121         goto end;
12122 
12123     /* Should be able to retrieve the same pointer. */
12124     if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
12125         goto end;
12126 
12127     if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
12128         goto end;
12129 
12130     if (!TEST_ptr_eq(store, new_store) || !TEST_ptr_eq(cstore, new_cstore))
12131         goto end;
12132 
12133     /* Should be able to unset again. */
12134     if (!TEST_true(SSL_set1_verify_cert_store(ssl, NULL)))
12135         goto end;
12136 
12137     if (!TEST_true(SSL_set1_chain_cert_store(ssl, NULL)))
12138         goto end;
12139 
12140     /* Should now be NULL. */
12141     if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
12142         goto end;
12143 
12144     if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
12145         goto end;
12146 
12147     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
12148         goto end;
12149 
12150     testresult = 1;
12151 
12152 end:
12153     X509_STORE_free(new_store);
12154     X509_STORE_free(new_cstore);
12155     SSL_free(ssl);
12156     SSL_CTX_free(ctx);
12157     return testresult;
12158 }
12159 
12160 static int test_inherit_verify_param(void)
12161 {
12162     int testresult = 0;
12163 
12164     SSL_CTX *ctx = NULL;
12165     X509_VERIFY_PARAM *cp = NULL;
12166     SSL *ssl = NULL;
12167     X509_VERIFY_PARAM *sp = NULL;
12168     int hostflags = X509_CHECK_FLAG_NEVER_CHECK_SUBJECT;
12169 
12170     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
12171     if (!TEST_ptr(ctx))
12172         goto end;
12173 
12174     cp = SSL_CTX_get0_param(ctx);
12175     if (!TEST_ptr(cp))
12176         goto end;
12177     if (!TEST_int_eq(X509_VERIFY_PARAM_get_hostflags(cp), 0))
12178         goto end;
12179 
12180     X509_VERIFY_PARAM_set_hostflags(cp, hostflags);
12181 
12182     ssl = SSL_new(ctx);
12183     if (!TEST_ptr(ssl))
12184         goto end;
12185 
12186     sp = SSL_get0_param(ssl);
12187     if (!TEST_ptr(sp))
12188         goto end;
12189     if (!TEST_int_eq(X509_VERIFY_PARAM_get_hostflags(sp), hostflags))
12190         goto end;
12191 
12192     testresult = 1;
12193 
12194 end:
12195     SSL_free(ssl);
12196     SSL_CTX_free(ctx);
12197 
12198     return testresult;
12199 }
12200 
12201 static int test_load_dhfile(void)
12202 {
12203 #ifndef OPENSSL_NO_DH
12204     int testresult = 0;
12205 
12206     SSL_CTX *ctx = NULL;
12207     SSL_CONF_CTX *cctx = NULL;
12208 
12209     if (dhfile == NULL)
12210         return 1;
12211 
12212     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_client_method()))
12213         || !TEST_ptr(cctx = SSL_CONF_CTX_new()))
12214         goto end;
12215 
12216     SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);
12217     SSL_CONF_CTX_set_flags(cctx,
12218         SSL_CONF_FLAG_CERTIFICATE
12219             | SSL_CONF_FLAG_SERVER
12220             | SSL_CONF_FLAG_FILE);
12221 
12222     if (!TEST_int_eq(SSL_CONF_cmd(cctx, "DHParameters", dhfile), 2))
12223         goto end;
12224 
12225     testresult = 1;
12226 end:
12227     SSL_CONF_CTX_free(cctx);
12228     SSL_CTX_free(ctx);
12229 
12230     return testresult;
12231 #else
12232     return TEST_skip("DH not supported by this build");
12233 #endif
12234 }
12235 
12236 #ifndef OSSL_NO_USABLE_TLS1_3
12237 /* Test that read_ahead works across a key change */
12238 static int test_read_ahead_key_change(void)
12239 {
12240     SSL_CTX *cctx = NULL, *sctx = NULL;
12241     SSL *clientssl = NULL, *serverssl = NULL;
12242     int testresult = 0;
12243     char *msg = "Hello World";
12244     size_t written, readbytes;
12245     char buf[80];
12246     int i;
12247 
12248     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12249             TLS_client_method(), TLS1_3_VERSION, 0,
12250             &sctx, &cctx, cert, privkey)))
12251         goto end;
12252 
12253     SSL_CTX_set_read_ahead(sctx, 1);
12254 
12255     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12256             &clientssl, NULL, NULL)))
12257         goto end;
12258 
12259     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12260         goto end;
12261 
12262     /* Write some data, send a key update, write more data */
12263     if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
12264         || !TEST_size_t_eq(written, strlen(msg)))
12265         goto end;
12266 
12267     if (!TEST_true(SSL_key_update(clientssl, SSL_KEY_UPDATE_NOT_REQUESTED)))
12268         goto end;
12269 
12270     if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
12271         || !TEST_size_t_eq(written, strlen(msg)))
12272         goto end;
12273 
12274     /*
12275      * Since read_ahead is on the first read below should read the record with
12276      * the first app data, the second record with the key update message, and
12277      * the third record with the app data all in one go. We should be able to
12278      * still process the read_ahead data correctly even though it crosses
12279      * epochs
12280      */
12281     for (i = 0; i < 2; i++) {
12282         if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf) - 1,
12283                 &readbytes)))
12284             goto end;
12285 
12286         buf[readbytes] = '\0';
12287         if (!TEST_str_eq(buf, msg))
12288             goto end;
12289     }
12290 
12291     testresult = 1;
12292 
12293 end:
12294     SSL_free(serverssl);
12295     SSL_free(clientssl);
12296     SSL_CTX_free(sctx);
12297     SSL_CTX_free(cctx);
12298     return testresult;
12299 }
12300 
12301 static size_t record_pad_cb(SSL *s, int type, size_t len, void *arg)
12302 {
12303     int *called = arg;
12304 
12305     switch ((*called)++) {
12306     case 0:
12307         /* Add some padding to first record */
12308         return 512;
12309     case 1:
12310         /* Maximally pad the second record */
12311         return SSL3_RT_MAX_PLAIN_LENGTH - len;
12312     case 2:
12313         /*
12314          * Exceeding the maximum padding should be fine. It should just pad to
12315          * the maximum anyway
12316          */
12317         return SSL3_RT_MAX_PLAIN_LENGTH + 1 - len;
12318     case 3:
12319         /*
12320          * Very large padding should also be ok. Should just pad to the maximum
12321          * allowed
12322          */
12323         return SIZE_MAX;
12324     default:
12325         return 0;
12326     }
12327 }
12328 
12329 /*
12330  * Test that setting record padding in TLSv1.3 works as expected
12331  * Test 0: Record padding callback on the SSL_CTX
12332  * Test 1: Record padding callback on the SSL
12333  * Test 2: Record block padding on the SSL_CTX
12334  * Test 3: Record block padding on the SSL
12335  * Test 4: Extended record block padding on the SSL_CTX
12336  * Test 5: Extended record block padding on the SSL
12337  */
12338 static int test_tls13_record_padding(int idx)
12339 {
12340     SSL_CTX *cctx = NULL, *sctx = NULL;
12341     SSL *clientssl = NULL, *serverssl = NULL;
12342     int testresult = 0;
12343     char *msg = "Hello World";
12344     size_t written, readbytes;
12345     char buf[80];
12346     int i;
12347     int called = 0;
12348 
12349     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12350             TLS_client_method(), TLS1_3_VERSION, 0,
12351             &sctx, &cctx, cert, privkey)))
12352         goto end;
12353 
12354     if (idx == 0) {
12355         SSL_CTX_set_record_padding_callback(cctx, record_pad_cb);
12356         SSL_CTX_set_record_padding_callback_arg(cctx, &called);
12357         if (!TEST_ptr_eq(SSL_CTX_get_record_padding_callback_arg(cctx), &called))
12358             goto end;
12359     } else if (idx == 2) {
12360         /* Exceeding the max plain length should fail */
12361         if (!TEST_false(SSL_CTX_set_block_padding(cctx,
12362                 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
12363             goto end;
12364         if (!TEST_true(SSL_CTX_set_block_padding(cctx, 512)))
12365             goto end;
12366     } else if (idx == 4) {
12367         /* pad only handshake/alert messages */
12368         if (!TEST_true(SSL_CTX_set_block_padding_ex(cctx, 0, 512)))
12369             goto end;
12370     }
12371 
12372     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12373             &clientssl, NULL, NULL)))
12374         goto end;
12375 
12376     if (idx == 1) {
12377         SSL_set_record_padding_callback(clientssl, record_pad_cb);
12378         SSL_set_record_padding_callback_arg(clientssl, &called);
12379         if (!TEST_ptr_eq(SSL_get_record_padding_callback_arg(clientssl), &called))
12380             goto end;
12381     } else if (idx == 3) {
12382         /* Exceeding the max plain length should fail */
12383         if (!TEST_false(SSL_set_block_padding(clientssl,
12384                 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
12385             goto end;
12386         if (!TEST_true(SSL_set_block_padding(clientssl, 512)))
12387             goto end;
12388     } else if (idx == 5) {
12389         /* Exceeding the max plain length should fail */
12390         if (!TEST_false(SSL_set_block_padding_ex(clientssl, 0,
12391                 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
12392             goto end;
12393         /* pad server and client handshake only */
12394         if (!TEST_true(SSL_set_block_padding_ex(clientssl, 0, 512)))
12395             goto end;
12396         if (!TEST_true(SSL_set_block_padding_ex(serverssl, 0, 512)))
12397             goto end;
12398     }
12399 
12400     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12401         goto end;
12402 
12403     called = 0;
12404     /*
12405      * Write some data, then check we can read it. Do this four times to check
12406      * we can continue to write and read padded data after the initial record
12407      * padding has been added. We don't actually check that the padding has
12408      * been applied to the record - just that we can continue to communicate
12409      * normally and that the callback has been called (if appropriate).
12410      */
12411     for (i = 0; i < 4; i++) {
12412         if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
12413             || !TEST_size_t_eq(written, strlen(msg)))
12414             goto end;
12415 
12416         if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf) - 1,
12417                 &readbytes))
12418             || !TEST_size_t_eq(written, readbytes))
12419             goto end;
12420 
12421         buf[readbytes] = '\0';
12422         if (!TEST_str_eq(buf, msg))
12423             goto end;
12424     }
12425 
12426     if ((idx == 0 || idx == 1) && !TEST_int_eq(called, 4))
12427         goto end;
12428 
12429     testresult = 1;
12430 end:
12431     SSL_free(serverssl);
12432     SSL_free(clientssl);
12433     SSL_CTX_free(sctx);
12434     SSL_CTX_free(cctx);
12435     return testresult;
12436 }
12437 
12438 static int un_ext_add_cb(SSL *s, unsigned int ext_type,
12439     unsigned int context, const unsigned char **out, size_t *outlen, X509 *x,
12440     size_t chainidx, int *al, void *add_arg)
12441 {
12442     static const unsigned char data[] = { 0xaa };
12443     *out = data;
12444     *outlen = sizeof(data);
12445     return 1;
12446 }
12447 
12448 static int un_ext_parse_cb(SSL *s, unsigned int ext_type,
12449     unsigned int context, const unsigned char *in, size_t inlen, X509 *x,
12450     size_t chainidx, int *al, void *parse_arg)
12451 {
12452     return 1;
12453 }
12454 
12455 /*
12456  * Test that a handshake succeeds when the peer sends an extension type we do
12457  * not recognise. The client registers a custom extension in its ClientHello
12458  * that the server knows nothing about, so on the server tls_collect_extensions()
12459  * takes the "unknown extension" branch.
12460  */
12461 static int test_tls13_unknown_extension(void)
12462 {
12463     SSL_CTX *s = NULL, *c = NULL;
12464     SSL *s_ssl = NULL, *c_ssl = NULL;
12465     int test;
12466 
12467     test = TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12468                TLS_client_method(), TLS1_3_VERSION, TLS1_3_VERSION, &s, &c, cert, privkey))
12469         && TEST_true(SSL_CTX_add_custom_ext(c, 0xfefe, SSL_EXT_CLIENT_HELLO,
12470             un_ext_add_cb, NULL, NULL, un_ext_parse_cb, NULL))
12471         && TEST_true(create_ssl_objects(s, c, &s_ssl, &c_ssl, NULL, NULL))
12472         /* The server must tolerate the unknown extension and complete. */
12473         && TEST_true(create_ssl_connection(s_ssl, c_ssl, SSL_ERROR_NONE));
12474 
12475     SSL_free(s_ssl);
12476     SSL_free(c_ssl);
12477     SSL_CTX_free(s);
12478     SSL_CTX_free(c);
12479     return test;
12480 }
12481 
12482 #endif /* OSSL_NO_USABLE_TLS1_3 */
12483 
12484 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
12485 /*
12486  * Test TLSv1.2 with a pipeline capable cipher. TLSv1.3 and DTLS do not
12487  * support this yet. The only pipeline capable cipher that we have is in the
12488  * dasync engine (providers don't support this yet), so we have to use
12489  * deprecated APIs for this test.
12490  *
12491  * Test 0: Client has pipelining enabled, server does not
12492  * Test 1: Server has pipelining enabled, client does not
12493  * Test 2: Client has pipelining enabled, server does not: not enough data to
12494  *         fill all the pipelines
12495  * Test 3: Client has pipelining enabled, server does not: not enough data to
12496  *         fill all the pipelines by more than a full pipeline's worth
12497  * Test 4: Client has pipelining enabled, server does not: more data than all
12498  *         the available pipelines can take
12499  * Test 5: Client has pipelining enabled, server does not: Maximum size pipeline
12500  * Test 6: Repeat of test 0, but the engine is loaded late (after the SSL_CTX
12501  *         is created)
12502  */
12503 static int test_pipelining(int idx)
12504 {
12505     SSL_CTX *cctx = NULL, *sctx = NULL;
12506     SSL *clientssl = NULL, *serverssl = NULL, *peera, *peerb;
12507     int testresult = 0, numreads;
12508     /* A 55 byte message */
12509     unsigned char *msg = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123";
12510     size_t written, readbytes, offset, msglen, fragsize = 10, numpipes = 5;
12511     size_t expectedreads;
12512     unsigned char *buf = NULL;
12513     ENGINE *e = NULL;
12514 
12515     if (idx != 6) {
12516         e = load_dasync();
12517         if (e == NULL)
12518             return 0;
12519     }
12520 
12521     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12522             TLS_client_method(), 0,
12523             TLS1_2_VERSION, &sctx, &cctx, cert,
12524             privkey)))
12525         goto end;
12526 
12527     if (idx == 6) {
12528         e = load_dasync();
12529         if (e == NULL)
12530             goto end;
12531         /* Now act like test 0 */
12532         idx = 0;
12533     }
12534 
12535     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12536             &clientssl, NULL, NULL)))
12537         goto end;
12538 
12539     if (!TEST_true(SSL_set_cipher_list(clientssl, "AES128-SHA")))
12540         goto end;
12541 
12542     /* peera is always configured for pipelining, while peerb is not. */
12543     if (idx == 1) {
12544         peera = serverssl;
12545         peerb = clientssl;
12546 
12547     } else {
12548         peera = clientssl;
12549         peerb = serverssl;
12550     }
12551 
12552     if (idx == 5) {
12553         numpipes = 2;
12554         /* Maximum allowed fragment size */
12555         fragsize = SSL3_RT_MAX_PLAIN_LENGTH;
12556         msglen = fragsize * numpipes;
12557         msg = OPENSSL_malloc(msglen);
12558         if (!TEST_ptr(msg))
12559             goto end;
12560         if (!TEST_int_gt(RAND_bytes_ex(libctx, msg, msglen, 0), 0))
12561             goto end;
12562     } else if (idx == 4) {
12563         msglen = 55;
12564     } else {
12565         msglen = 50;
12566     }
12567     if (idx == 2)
12568         msglen -= 2; /* Send 2 less bytes */
12569     else if (idx == 3)
12570         msglen -= 12; /* Send 12 less bytes */
12571 
12572     buf = OPENSSL_malloc(msglen);
12573     if (!TEST_ptr(buf))
12574         goto end;
12575 
12576     if (idx == 5) {
12577         /*
12578          * Test that setting a split send fragment longer than the maximum
12579          * allowed fails
12580          */
12581         if (!TEST_false(SSL_set_split_send_fragment(peera, fragsize + 1)))
12582             goto end;
12583     }
12584 
12585     /*
12586      * In the normal case. We have 5 pipelines with 10 bytes per pipeline
12587      * (50 bytes in total). This is a ridiculously small number of bytes -
12588      * but sufficient for our purposes
12589      */
12590     if (!TEST_true(SSL_set_max_pipelines(peera, numpipes))
12591         || !TEST_true(SSL_set_split_send_fragment(peera, fragsize)))
12592         goto end;
12593 
12594     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12595         goto end;
12596 
12597     /* Write some data from peera to peerb */
12598     if (!TEST_true(SSL_write_ex(peera, msg, msglen, &written))
12599         || !TEST_size_t_eq(written, msglen))
12600         goto end;
12601 
12602     /*
12603      * If the pipelining code worked, then we expect all |numpipes| pipelines to
12604      * have been used - except in test 3 where only |numpipes - 1| pipelines
12605      * will be used. This will result in |numpipes| records (|numpipes - 1| for
12606      * test 3) having been sent to peerb. Since peerb is not using read_ahead we
12607      * expect this to be read in |numpipes| or |numpipes - 1| separate
12608      * SSL_read_ex calls. In the case of test 4, there is then one additional
12609      * read for left over data that couldn't fit in the previous pipelines
12610      */
12611     for (offset = 0, numreads = 0;
12612         offset < msglen;
12613         offset += readbytes, numreads++) {
12614         if (!TEST_true(SSL_read_ex(peerb, buf + offset,
12615                 msglen - offset, &readbytes)))
12616             goto end;
12617     }
12618 
12619     expectedreads = idx == 4 ? numpipes + 1
12620                              : (idx == 3 ? numpipes - 1 : numpipes);
12621     if (!TEST_mem_eq(msg, msglen, buf, offset)
12622         || !TEST_int_eq(numreads, expectedreads))
12623         goto end;
12624 
12625     /*
12626      * Write some data from peerb to peera. We do this in up to |numpipes + 1|
12627      * chunks to exercise the read pipelining code on peera.
12628      */
12629     for (offset = 0; offset < msglen; offset += fragsize) {
12630         size_t sendlen = msglen - offset;
12631 
12632         if (sendlen > fragsize)
12633             sendlen = fragsize;
12634         if (!TEST_true(SSL_write_ex(peerb, msg + offset, sendlen, &written))
12635             || !TEST_size_t_eq(written, sendlen))
12636             goto end;
12637     }
12638 
12639     /*
12640      * The data was written in |numpipes|, |numpipes - 1| or |numpipes + 1|
12641      * separate chunks (depending on which test we are running). If the
12642      * pipelining is working then we expect peera to read up to numpipes chunks
12643      * and process them in parallel, giving back the complete result in a single
12644      * call to SSL_read_ex
12645      */
12646     if (!TEST_true(SSL_read_ex(peera, buf, msglen, &readbytes))
12647         || !TEST_size_t_le(readbytes, msglen))
12648         goto end;
12649 
12650     if (idx == 4) {
12651         size_t readbytes2;
12652 
12653         if (!TEST_true(SSL_read_ex(peera, buf + readbytes,
12654                 msglen - readbytes, &readbytes2)))
12655             goto end;
12656         readbytes += readbytes2;
12657         if (!TEST_size_t_le(readbytes, msglen))
12658             goto end;
12659     }
12660 
12661     if (!TEST_mem_eq(msg, msglen, buf, readbytes))
12662         goto end;
12663 
12664     testresult = 1;
12665 end:
12666     SSL_free(serverssl);
12667     SSL_free(clientssl);
12668     SSL_CTX_free(sctx);
12669     SSL_CTX_free(cctx);
12670     if (e != NULL) {
12671         ENGINE_unregister_ciphers(e);
12672         ENGINE_finish(e);
12673         ENGINE_free(e);
12674     }
12675     OPENSSL_free(buf);
12676     if (fragsize == SSL3_RT_MAX_PLAIN_LENGTH)
12677         OPENSSL_free(msg);
12678     return testresult;
12679 }
12680 #endif /* !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE) */
12681 
12682 static int check_version_string(SSL *s, int version)
12683 {
12684     const char *verstr = NULL;
12685 
12686     switch (version) {
12687     case SSL3_VERSION:
12688         verstr = "SSLv3";
12689         break;
12690     case TLS1_VERSION:
12691         verstr = "TLSv1";
12692         break;
12693     case TLS1_1_VERSION:
12694         verstr = "TLSv1.1";
12695         break;
12696     case TLS1_2_VERSION:
12697         verstr = "TLSv1.2";
12698         break;
12699     case TLS1_3_VERSION:
12700         verstr = "TLSv1.3";
12701         break;
12702     case DTLS1_VERSION:
12703         verstr = "DTLSv1";
12704         break;
12705     case DTLS1_2_VERSION:
12706         verstr = "DTLSv1.2";
12707     }
12708 
12709     return TEST_str_eq(verstr, SSL_get_version(s));
12710 }
12711 
12712 /*
12713  * Test that SSL_version, SSL_get_version, SSL_is_quic, SSL_is_tls and
12714  * SSL_is_dtls return the expected results for a (D)TLS connection. Compare with
12715  * test_version() in quicapitest.c which does the same thing for QUIC
12716  * connections.
12717  */
12718 static int test_version(int idx)
12719 {
12720     SSL_CTX *cctx = NULL, *sctx = NULL;
12721     SSL *clientssl = NULL, *serverssl = NULL;
12722     int testresult = 0, version;
12723     const SSL_METHOD *servmeth = TLS_server_method();
12724     const SSL_METHOD *clientmeth = TLS_client_method();
12725 
12726     switch (idx) {
12727 #if !defined(OPENSSL_NO_SSL3)
12728     case 0:
12729         version = SSL3_VERSION;
12730         break;
12731 #endif
12732 #if !defined(OPENSSL_NO_TLS1)
12733     case 1:
12734         version = TLS1_VERSION;
12735         break;
12736 #endif
12737 #if !defined(OPENSSL_NO_TLS1_2)
12738     case 2:
12739         version = TLS1_2_VERSION;
12740         break;
12741 #endif
12742 #if !defined(OSSL_NO_USABLE_TLS1_3)
12743     case 3:
12744         version = TLS1_3_VERSION;
12745         break;
12746 #endif
12747 #if !defined(OPENSSL_NO_DTLS1)
12748     case 4:
12749         version = DTLS1_VERSION;
12750         break;
12751 #endif
12752 #if !defined(OPENSSL_NO_DTLS1_2)
12753     case 5:
12754         version = DTLS1_2_VERSION;
12755         break;
12756 #endif
12757     /*
12758      * NB we do not support QUIC in this test. That is covered by quicapitest.c
12759      * We also don't support DTLS1_BAD_VER since we have no server support for
12760      * that.
12761      */
12762     default:
12763         TEST_skip("Unsupported protocol version");
12764         return 1;
12765     }
12766 
12767     if (is_fips
12768         && (version == SSL3_VERSION
12769             || version == TLS1_VERSION
12770             || version == DTLS1_VERSION)) {
12771         TEST_skip("Protocol version not supported with FIPS");
12772         return 1;
12773     }
12774 
12775 #if !defined(OPENSSL_NO_DTLS)
12776     if (version == DTLS1_VERSION || version == DTLS1_2_VERSION) {
12777         servmeth = DTLS_server_method();
12778         clientmeth = DTLS_client_method();
12779     }
12780 #endif
12781 
12782     if (!TEST_true(create_ssl_ctx_pair(libctx, servmeth, clientmeth, version,
12783             version, &sctx, &cctx, cert, privkey)))
12784         goto end;
12785 
12786     if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
12787         || !TEST_true(SSL_CTX_set_cipher_list(cctx,
12788             "DEFAULT:@SECLEVEL=0")))
12789         goto end;
12790 
12791     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12792             &clientssl, NULL, NULL)))
12793         goto end;
12794 
12795     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12796         goto end;
12797 
12798     if (!TEST_int_eq(SSL_version(serverssl), version)
12799         || !TEST_int_eq(SSL_version(clientssl), version)
12800         || !TEST_true(check_version_string(serverssl, version))
12801         || !TEST_true(check_version_string(clientssl, version)))
12802         goto end;
12803 
12804     if (version == DTLS1_VERSION || version == DTLS1_2_VERSION) {
12805         if (!TEST_true(SSL_is_dtls(serverssl))
12806             || !TEST_true(SSL_is_dtls(clientssl))
12807             || !TEST_false(SSL_is_tls(serverssl))
12808             || !TEST_false(SSL_is_tls(clientssl))
12809             || !TEST_false(SSL_is_quic(serverssl))
12810             || !TEST_false(SSL_is_quic(clientssl)))
12811             goto end;
12812     } else {
12813         if (!TEST_true(SSL_is_tls(serverssl))
12814             || !TEST_true(SSL_is_tls(clientssl))
12815             || !TEST_false(SSL_is_dtls(serverssl))
12816             || !TEST_false(SSL_is_dtls(clientssl))
12817             || !TEST_false(SSL_is_quic(serverssl))
12818             || !TEST_false(SSL_is_quic(clientssl)))
12819             goto end;
12820     }
12821 
12822     testresult = 1;
12823 end:
12824     SSL_free(serverssl);
12825     SSL_free(clientssl);
12826     SSL_CTX_free(sctx);
12827     SSL_CTX_free(cctx);
12828     return testresult;
12829 }
12830 
12831 /*
12832  * Test that the SSL_rstate_string*() APIs return sane results
12833  */
12834 static int test_rstate_string(void)
12835 {
12836     SSL_CTX *cctx = NULL, *sctx = NULL;
12837     SSL *clientssl = NULL, *serverssl = NULL;
12838     int testresult = 0, version;
12839     const SSL_METHOD *servmeth = TLS_server_method();
12840     const SSL_METHOD *clientmeth = TLS_client_method();
12841     size_t written, readbytes;
12842     unsigned char buf[2];
12843     unsigned char dummyheader[SSL3_RT_HEADER_LENGTH] = {
12844         SSL3_RT_APPLICATION_DATA,
12845         TLS1_2_VERSION_MAJOR,
12846         0, /* To be filled in later */
12847         0,
12848         1
12849     };
12850 
12851     if (!TEST_true(create_ssl_ctx_pair(libctx, servmeth, clientmeth, 0,
12852             0, &sctx, &cctx, cert, privkey)))
12853         goto end;
12854 
12855     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12856             &clientssl, NULL, NULL)))
12857         goto end;
12858 
12859     if (!TEST_str_eq(SSL_rstate_string(serverssl), "RH")
12860         || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read header"))
12861         goto end;
12862 
12863     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12864         goto end;
12865 
12866     if (!TEST_str_eq(SSL_rstate_string(serverssl), "RH")
12867         || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read header"))
12868         goto end;
12869 
12870     /* Fill in the correct version for the record header */
12871     version = SSL_version(serverssl);
12872     if (version == TLS1_3_VERSION)
12873         version = TLS1_2_VERSION;
12874     dummyheader[2] = version & 0xff;
12875 
12876     /*
12877      * Send a dummy header. If we continued to read the body as well this
12878      * would fail with a bad record mac, but we're not going to go that far.
12879      */
12880     if (!TEST_true(BIO_write_ex(SSL_get_rbio(serverssl), dummyheader,
12881             sizeof(dummyheader), &written))
12882         || !TEST_size_t_eq(written, SSL3_RT_HEADER_LENGTH))
12883         goto end;
12884 
12885     if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes)))
12886         goto end;
12887 
12888     if (!TEST_str_eq(SSL_rstate_string(serverssl), "RB")
12889         || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read body"))
12890         goto end;
12891 
12892     testresult = 1;
12893 end:
12894     SSL_free(serverssl);
12895     SSL_free(clientssl);
12896     SSL_CTX_free(sctx);
12897     SSL_CTX_free(cctx);
12898     return testresult;
12899 }
12900 
12901 /*
12902  * Force a write retry during handshaking. We test various combinations of
12903  * scenarios. We test a large certificate message which will fill the buffering
12904  * BIO used in the handshake. We try with client auth on and off. Finally we
12905  * also try a BIO that indicates retry via a 0 return. BIO_write() is documented
12906  * to indicate retry via -1 - but sometimes BIOs don't do that.
12907  *
12908  * Test 0: Standard certificate message
12909  * Test 1: Large certificate message
12910  * Test 2: Standard cert, verify peer
12911  * Test 3: Large cert, verify peer
12912  * Test 4: Standard cert, BIO returns 0 on retry
12913  * Test 5: Large cert, BIO returns 0 on retry
12914  * Test 6: Standard cert, verify peer, BIO returns 0 on retry
12915  * Test 7: Large cert, verify peer, BIO returns 0 on retry
12916  * Test 8-15: Repeat of above with TLSv1.2
12917  */
12918 static int test_handshake_retry(int idx)
12919 {
12920     SSL_CTX *cctx = NULL, *sctx = NULL;
12921     SSL *clientssl = NULL, *serverssl = NULL;
12922     int testresult = 0;
12923     BIO *tmp = NULL, *bretry = BIO_new(bio_s_always_retry());
12924     int maxversion = 0;
12925 
12926     if (!TEST_ptr(bretry))
12927         goto end;
12928 
12929 #ifndef OPENSSL_NO_TLS1_2
12930     if ((idx & 8) == 8)
12931         maxversion = TLS1_2_VERSION;
12932 #else
12933     if ((idx & 8) == 8)
12934         return TEST_skip("No TLSv1.2");
12935 #endif
12936 
12937     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12938             TLS_client_method(), 0, maxversion,
12939             &sctx, &cctx, cert, privkey)))
12940         goto end;
12941 
12942     /*
12943      * Add a large amount of data to fill the buffering BIO used by the SSL
12944      * object
12945      */
12946     if ((idx & 1) == 1 && !ssl_ctx_add_large_cert_chain(libctx, sctx, cert))
12947         goto end;
12948 
12949     /*
12950      * We don't actually configure a client cert, but neither do we fail if one
12951      * isn't present.
12952      */
12953     if ((idx & 2) == 2)
12954         SSL_CTX_set_verify(sctx, SSL_VERIFY_PEER, NULL);
12955 
12956     if ((idx & 4) == 4)
12957         set_always_retry_err_val(0);
12958 
12959     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12960             &clientssl, NULL, NULL)))
12961         goto end;
12962 
12963     tmp = SSL_get_wbio(serverssl);
12964     if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
12965         tmp = NULL;
12966         goto end;
12967     }
12968     SSL_set0_wbio(serverssl, bretry);
12969     bretry = NULL;
12970 
12971     if (!TEST_int_eq(SSL_connect(clientssl), -1))
12972         goto end;
12973 
12974     if (!TEST_int_eq(SSL_accept(serverssl), -1)
12975         || !TEST_int_eq(SSL_get_error(serverssl, -1), SSL_ERROR_WANT_WRITE))
12976         goto end;
12977 
12978     /* Restore a BIO that will let the write succeed */
12979     SSL_set0_wbio(serverssl, tmp);
12980     tmp = NULL;
12981 
12982     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12983         goto end;
12984 
12985     testresult = 1;
12986 end:
12987     SSL_free(serverssl);
12988     SSL_free(clientssl);
12989     SSL_CTX_free(sctx);
12990     SSL_CTX_free(cctx);
12991     BIO_free(bretry);
12992     BIO_free(tmp);
12993     set_always_retry_err_val(-1);
12994     return testresult;
12995 }
12996 
12997 /*
12998  * Test that receiving retries when writing application data works as expected
12999  */
13000 static int test_data_retry(void)
13001 {
13002     SSL_CTX *cctx = NULL, *sctx = NULL;
13003     SSL *clientssl = NULL, *serverssl = NULL;
13004     int testresult = 0;
13005     unsigned char inbuf[1200], outbuf[1200];
13006     size_t i;
13007     BIO *tmp = NULL;
13008     BIO *bretry = BIO_new(bio_s_maybe_retry());
13009     size_t written, readbytes, totread = 0;
13010 
13011     if (!TEST_ptr(bretry))
13012         goto end;
13013 
13014     for (i = 0; i < sizeof(inbuf); i++)
13015         inbuf[i] = (unsigned char)(0xff & i);
13016     memset(outbuf, 0, sizeof(outbuf));
13017 
13018     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13019             TLS_client_method(), 0, 0, &sctx, &cctx,
13020             cert, privkey)))
13021         goto end;
13022 
13023     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13024             NULL)))
13025         goto end;
13026 
13027     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
13028         goto end;
13029 
13030     /* Smallest possible max send fragment is 512 */
13031     if (!TEST_true(SSL_set_max_send_fragment(clientssl, 512)))
13032         goto end;
13033 
13034     tmp = SSL_get_wbio(clientssl);
13035     if (!TEST_ptr(tmp))
13036         goto end;
13037     if (!TEST_true(BIO_up_ref(tmp)))
13038         goto end;
13039     BIO_push(bretry, tmp);
13040     tmp = NULL;
13041     SSL_set0_wbio(clientssl, bretry);
13042     if (!BIO_up_ref(bretry)) {
13043         bretry = NULL;
13044         goto end;
13045     }
13046 
13047     for (i = 0; i < 3; i++) {
13048         /* We expect this call to make no progress and indicate retry */
13049         if (!TEST_false(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
13050             goto end;
13051         if (!TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_WRITE))
13052             goto end;
13053 
13054         /* Allow one write to progress, but the next one to signal retry */
13055         if (!TEST_true(BIO_ctrl(bretry, MAYBE_RETRY_CTRL_SET_RETRY_AFTER_CNT, 1,
13056                 NULL)))
13057             goto end;
13058 
13059         if (i == 2)
13060             break;
13061 
13062         /*
13063          * This call will hopefully make progress but will still indicate retry
13064          * because there is more data than will fit into a single record.
13065          */
13066         if (!TEST_false(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
13067             goto end;
13068         if (!TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_WRITE))
13069             goto end;
13070     }
13071 
13072     /* The final call should write the last chunk of data and succeed */
13073     if (!TEST_true(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
13074         goto end;
13075     /* Read all the data available */
13076     while (SSL_read_ex(serverssl, outbuf + totread, sizeof(outbuf) - totread,
13077         &readbytes))
13078         totread += readbytes;
13079     if (!TEST_mem_eq(inbuf, sizeof(inbuf), outbuf, totread))
13080         goto end;
13081 
13082     testresult = 1;
13083 end:
13084     SSL_free(serverssl);
13085     SSL_free(clientssl);
13086     SSL_CTX_free(sctx);
13087     SSL_CTX_free(cctx);
13088     BIO_free_all(bretry);
13089     BIO_free(tmp);
13090     return testresult;
13091 }
13092 
13093 /*
13094  * Test that a BIO returning 0 without a retry flag for a write with a positive
13095  * length is not treated as a successful write.
13096  */
13097 static int test_data_write_zero_no_retry(int tst)
13098 {
13099     SSL_CTX *cctx = NULL, *sctx = NULL;
13100     SSL *clientssl = NULL, *serverssl = NULL;
13101     BIO *bzero = BIO_new(bio_s_no_retry_zero());
13102     const SSL_METHOD *smeth = TLS_server_method();
13103     const SSL_METHOD *cmeth = TLS_client_method();
13104     unsigned char inbuf[1] = { 0 };
13105     size_t written;
13106     unsigned long errcode;
13107     int err, min_version = 0, max_version = 0, testresult = 0;
13108 
13109     if (tst == 1) {
13110 #if !defined(OPENSSL_NO_DTLS) && !defined(OPENSSL_NO_DTLS1_2)
13111         smeth = DTLS_server_method();
13112         cmeth = DTLS_client_method();
13113         min_version = max_version = DTLS1_2_VERSION;
13114 #else
13115         BIO_free(bzero);
13116         return TEST_skip("DTLS 1.2 not supported");
13117 #endif
13118     }
13119 
13120     if (!TEST_ptr(bzero))
13121         goto end;
13122 
13123     if (!TEST_true(create_ssl_ctx_pair(libctx, smeth, cmeth, min_version,
13124             max_version, &sctx, &cctx, cert, privkey)))
13125         goto end;
13126 
13127     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13128             NULL)))
13129         goto end;
13130 
13131     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
13132         goto end;
13133 
13134     SSL_set0_wbio(clientssl, bzero);
13135     bzero = NULL;
13136 
13137     ERR_clear_error();
13138     if (!TEST_false(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
13139         goto end;
13140 
13141     err = SSL_get_error(clientssl, 0);
13142     errcode = ERR_get_error();
13143     if (!TEST_int_eq(err, SSL_ERROR_SYSCALL)
13144         || !TEST_ulong_eq(errcode, 0))
13145         goto end;
13146 
13147     testresult = 1;
13148 end:
13149     SSL_free(serverssl);
13150     SSL_free(clientssl);
13151     SSL_CTX_free(sctx);
13152     SSL_CTX_free(cctx);
13153     BIO_free_all(bzero);
13154     return testresult;
13155 }
13156 
13157 struct resume_servername_cb_data {
13158     int i;
13159     SSL_CTX *cctx;
13160     SSL_CTX *sctx;
13161     SSL_SESSION *sess;
13162     int recurse;
13163 };
13164 
13165 /*
13166  * Servername callback. We use it here to run another complete handshake using
13167  * the same session - and mark the session as not_resuamble at the end
13168  */
13169 static int resume_servername_cb(SSL *s, int *ad, void *arg)
13170 {
13171     struct resume_servername_cb_data *cbdata = arg;
13172     SSL *serverssl = NULL, *clientssl = NULL;
13173     int ret = SSL_TLSEXT_ERR_ALERT_FATAL;
13174 
13175     if (cbdata->recurse)
13176         return SSL_TLSEXT_ERR_ALERT_FATAL;
13177 
13178     if ((cbdata->i % 3) != 1)
13179         return SSL_TLSEXT_ERR_OK;
13180 
13181     cbdata->recurse = 1;
13182 
13183     if (!TEST_true(create_ssl_objects(cbdata->sctx, cbdata->cctx, &serverssl,
13184             &clientssl, NULL, NULL))
13185         || !TEST_true(SSL_set_session(clientssl, cbdata->sess)))
13186         goto end;
13187 
13188     ERR_set_mark();
13189     /*
13190      * We expect this to fail - because the servername cb will fail. This will
13191      * mark the session as not_resumable.
13192      */
13193     if (!TEST_false(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))) {
13194         ERR_clear_last_mark();
13195         goto end;
13196     }
13197     ERR_pop_to_mark();
13198 
13199     ret = SSL_TLSEXT_ERR_OK;
13200 end:
13201     SSL_free(serverssl);
13202     SSL_free(clientssl);
13203     cbdata->recurse = 0;
13204     return ret;
13205 }
13206 /*
13207  * Test multiple resumptions and cache size handling
13208  * Test 0: TLSv1.3 (max_early_data set)
13209  * Test 1: TLSv1.3 (SSL_OP_NO_TICKET set)
13210  * Test 2: TLSv1.3 (max_early_data and SSL_OP_NO_TICKET set)
13211  * Test 3: TLSv1.3 (SSL_OP_NO_TICKET, simultaneous resumes)
13212  * Test 4: TLSv1.2
13213  */
13214 static int test_multi_resume(int idx)
13215 {
13216     SSL_CTX *sctx = NULL, *cctx = NULL;
13217     SSL *serverssl = NULL, *clientssl = NULL;
13218     SSL_SESSION *sess = NULL;
13219     int max_version = TLS1_3_VERSION;
13220     int i, testresult = 0;
13221     struct resume_servername_cb_data cbdata;
13222 
13223 #if defined(OPENSSL_NO_TLS1_2)
13224     if (idx == 4)
13225         return TEST_skip("TLSv1.2 is disabled in this build");
13226 #else
13227     if (idx == 4)
13228         max_version = TLS1_2_VERSION;
13229 #endif
13230 #if defined(OSSL_NO_USABLE_TLS1_3)
13231     if (idx != 4)
13232         return TEST_skip("No usable TLSv1.3 in this build");
13233 #endif
13234 
13235     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13236             TLS_client_method(), TLS1_VERSION,
13237             max_version, &sctx, &cctx, cert,
13238             privkey)))
13239         goto end;
13240 
13241     /*
13242      * TLSv1.3 only uses a session cache if either max_early_data > 0 (used for
13243      * replay protection), or if SSL_OP_NO_TICKET is in use
13244      */
13245     if (idx == 0 || idx == 2) {
13246         if (!TEST_true(SSL_CTX_set_max_early_data(sctx, 1024)))
13247             goto end;
13248     }
13249     if (idx == 1 || idx == 2 || idx == 3)
13250         SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET);
13251 
13252     SSL_CTX_sess_set_cache_size(sctx, 5);
13253 
13254     if (idx == 3) {
13255         SSL_CTX_set_tlsext_servername_callback(sctx, resume_servername_cb);
13256         SSL_CTX_set_tlsext_servername_arg(sctx, &cbdata);
13257         cbdata.cctx = cctx;
13258         cbdata.sctx = sctx;
13259         cbdata.recurse = 0;
13260     }
13261 
13262     for (i = 0; i < 30; i++) {
13263         if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
13264                 NULL, NULL))
13265             || !TEST_true(SSL_set_session(clientssl, sess)))
13266             goto end;
13267 
13268         /*
13269          * Check simultaneous resumes. We pause the connection part way through
13270          * the handshake by (mis)using the servername_cb. The pause occurs after
13271          * session resumption has already occurred, but before any session
13272          * tickets have been issued. While paused we run another complete
13273          * handshake resuming the same session.
13274          */
13275         if (idx == 3) {
13276             cbdata.i = i;
13277             cbdata.sess = sess;
13278         }
13279 
13280         /*
13281          * Recreate a bug where dynamically changing the max_early_data value
13282          * can cause sessions in the session cache which cannot be deleted.
13283          */
13284         if ((idx == 0 || idx == 2) && (i % 3) == 2)
13285             SSL_set_max_early_data(serverssl, 0);
13286 
13287         if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
13288             goto end;
13289 
13290         if (sess == NULL || (idx == 0 && (i % 3) == 2)) {
13291             if (!TEST_false(SSL_session_reused(clientssl)))
13292                 goto end;
13293         } else {
13294             if (!TEST_true(SSL_session_reused(clientssl)))
13295                 goto end;
13296         }
13297         SSL_SESSION_free(sess);
13298 
13299         /* Do a full handshake, followed by two resumptions */
13300         if ((i % 3) == 2) {
13301             sess = NULL;
13302         } else {
13303             if (!TEST_ptr((sess = SSL_get1_session(clientssl))))
13304                 goto end;
13305         }
13306 
13307         SSL_shutdown(clientssl);
13308         SSL_shutdown(serverssl);
13309         SSL_free(serverssl);
13310         SSL_free(clientssl);
13311         serverssl = clientssl = NULL;
13312     }
13313 
13314     /* We should never exceed the session cache size limit */
13315     if (!TEST_long_le(SSL_CTX_sess_number(sctx), 5))
13316         goto end;
13317 
13318     testresult = 1;
13319 end:
13320     SSL_free(serverssl);
13321     SSL_free(clientssl);
13322     SSL_CTX_free(sctx);
13323     SSL_CTX_free(cctx);
13324     SSL_SESSION_free(sess);
13325     return testresult;
13326 }
13327 
13328 static struct next_proto_st {
13329     int serverlen;
13330     unsigned char server[40];
13331     int clientlen;
13332     unsigned char client[40];
13333     int expected_ret;
13334     size_t selectedlen;
13335     unsigned char selected[40];
13336 } next_proto_tests[] = {
13337     { 4, { 3, 'a', 'b', 'c' },
13338         4, { 3, 'a', 'b', 'c' },
13339         OPENSSL_NPN_NEGOTIATED,
13340         3, { 'a', 'b', 'c' } },
13341     { 7, { 3, 'a', 'b', 'c', 2, 'a', 'b' },
13342         4, { 3, 'a', 'b', 'c' },
13343         OPENSSL_NPN_NEGOTIATED,
13344         3, { 'a', 'b', 'c' } },
13345     { 7, {
13346              2,
13347              'a',
13348              'b',
13349              3,
13350              'a',
13351              'b',
13352              'c',
13353          },
13354         4, { 3, 'a', 'b', 'c' }, OPENSSL_NPN_NEGOTIATED, 3, { 'a', 'b', 'c' } },
13355     { 4, { 3, 'a', 'b', 'c' }, 7, {
13356                                       3,
13357                                       'a',
13358                                       'b',
13359                                       'c',
13360                                       2,
13361                                       'a',
13362                                       'b',
13363                                   },
13364         OPENSSL_NPN_NEGOTIATED, 3, { 'a', 'b', 'c' } },
13365     { 4, { 3, 'a', 'b', 'c' }, 7, { 2, 'a', 'b', 3, 'a', 'b', 'c' }, OPENSSL_NPN_NEGOTIATED, 3, { 'a', 'b', 'c' } }, { 7, { 2, 'b', 'c', 3, 'a', 'b', 'c' }, 7, { 2, 'a', 'b', 3, 'a', 'b', 'c' }, OPENSSL_NPN_NEGOTIATED, 3, { 'a', 'b', 'c' } }, { 10, { 2, 'b', 'c', 3, 'a', 'b', 'c', 2, 'a', 'b' }, 7, { 2, 'a', 'b', 3, 'a', 'b', 'c' }, OPENSSL_NPN_NEGOTIATED, 3, { 'a', 'b', 'c' } }, { 4, { 3, 'b', 'c', 'd' }, 4, { 3, 'a', 'b', 'c' }, OPENSSL_NPN_NO_OVERLAP, 3, { 'a', 'b', 'c' } }, { 0, { 0 }, 4, { 3, 'a', 'b', 'c' }, OPENSSL_NPN_NO_OVERLAP, 3, { 'a', 'b', 'c' } }, { -1, { 0 }, 4, { 3, 'a', 'b', 'c' }, OPENSSL_NPN_NO_OVERLAP, 3, { 'a', 'b', 'c' } }, { 4, { 3, 'a', 'b', 'c' }, 0, { 0 }, OPENSSL_NPN_NO_OVERLAP, 0, { 0 } }, { 4, { 3, 'a', 'b', 'c' }, -1, { 0 }, OPENSSL_NPN_NO_OVERLAP, 0, { 0 } }, { 3, { 3, 'a', 'b', 'c' }, 4, { 3, 'a', 'b', 'c' }, OPENSSL_NPN_NO_OVERLAP, 3, { 'a', 'b', 'c' } }, { 4, { 3, 'a', 'b', 'c' }, 3, { 3, 'a', 'b', 'c' }, OPENSSL_NPN_NO_OVERLAP, 0, { 0 } }
13366 };
13367 
13368 static int test_select_next_proto(int idx)
13369 {
13370     struct next_proto_st *np = &next_proto_tests[idx];
13371     int ret = 0;
13372     unsigned char *out, *client, *server;
13373     unsigned char outlen;
13374     unsigned int clientlen, serverlen;
13375 
13376     if (np->clientlen == -1) {
13377         client = NULL;
13378         clientlen = 0;
13379     } else {
13380         client = np->client;
13381         clientlen = (unsigned int)np->clientlen;
13382     }
13383     if (np->serverlen == -1) {
13384         server = NULL;
13385         serverlen = 0;
13386     } else {
13387         server = np->server;
13388         serverlen = (unsigned int)np->serverlen;
13389     }
13390 
13391     if (!TEST_int_eq(SSL_select_next_proto(&out, &outlen, server, serverlen,
13392                          client, clientlen),
13393             np->expected_ret))
13394         goto err;
13395 
13396     if (np->selectedlen == 0) {
13397         if (!TEST_ptr_null(out) || !TEST_uchar_eq(outlen, 0))
13398             goto err;
13399     } else {
13400         if (!TEST_mem_eq(out, outlen, np->selected, np->selectedlen))
13401             goto err;
13402     }
13403 
13404     ret = 1;
13405 err:
13406     return ret;
13407 }
13408 
13409 static const unsigned char fooprot[] = { 3, 'f', 'o', 'o' };
13410 static const unsigned char barprot[] = { 3, 'b', 'a', 'r' };
13411 
13412 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_NEXTPROTONEG)
13413 static int npn_advert_cb(SSL *ssl, const unsigned char **out,
13414     unsigned int *outlen, void *arg)
13415 {
13416     int *idx = (int *)arg;
13417 
13418     switch (*idx) {
13419     default:
13420     case 0:
13421         *out = fooprot;
13422         *outlen = sizeof(fooprot);
13423         return SSL_TLSEXT_ERR_OK;
13424 
13425     case 1:
13426         *out = NULL;
13427         *outlen = 0;
13428         return SSL_TLSEXT_ERR_OK;
13429 
13430     case 2:
13431         return SSL_TLSEXT_ERR_NOACK;
13432     }
13433 }
13434 
13435 static int npn_select_cb(SSL *s, unsigned char **out, unsigned char *outlen,
13436     const unsigned char *in, unsigned int inlen, void *arg)
13437 {
13438     int *idx = (int *)arg;
13439 
13440     switch (*idx) {
13441     case 0:
13442     case 1:
13443         *out = (unsigned char *)(fooprot + 1);
13444         *outlen = *fooprot;
13445         return SSL_TLSEXT_ERR_OK;
13446 
13447     case 3:
13448         *out = (unsigned char *)(barprot + 1);
13449         *outlen = *barprot;
13450         return SSL_TLSEXT_ERR_OK;
13451 
13452     case 4:
13453         *outlen = 0;
13454         return SSL_TLSEXT_ERR_OK;
13455 
13456     default:
13457     case 2:
13458         return SSL_TLSEXT_ERR_ALERT_FATAL;
13459     }
13460 }
13461 
13462 /*
13463  * Test the NPN callbacks
13464  * Test 0: advert = foo, select = foo
13465  * Test 1: advert = <empty>, select = foo
13466  * Test 2: no advert
13467  * Test 3: advert = foo, select = bar
13468  * Test 4: advert = foo, select = <empty> (should fail)
13469  */
13470 static int test_npn(int idx)
13471 {
13472     SSL_CTX *sctx = NULL, *cctx = NULL;
13473     SSL *serverssl = NULL, *clientssl = NULL;
13474     int testresult = 0;
13475 
13476     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13477             TLS_client_method(), 0, TLS1_2_VERSION,
13478             &sctx, &cctx, cert, privkey)))
13479         goto end;
13480 
13481     SSL_CTX_set_next_protos_advertised_cb(sctx, npn_advert_cb, &idx);
13482     SSL_CTX_set_next_proto_select_cb(cctx, npn_select_cb, &idx);
13483 
13484     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13485             NULL)))
13486         goto end;
13487 
13488     if (idx == 4) {
13489         /* We don't allow empty selection of NPN, so this should fail */
13490         if (!TEST_false(create_ssl_connection(serverssl, clientssl,
13491                 SSL_ERROR_NONE)))
13492             goto end;
13493     } else {
13494         const unsigned char *prot;
13495         unsigned int protlen;
13496 
13497         if (!TEST_true(create_ssl_connection(serverssl, clientssl,
13498                 SSL_ERROR_NONE)))
13499             goto end;
13500 
13501         SSL_get0_next_proto_negotiated(serverssl, &prot, &protlen);
13502         switch (idx) {
13503         case 0:
13504         case 1:
13505             if (!TEST_mem_eq(prot, protlen, fooprot + 1, *fooprot))
13506                 goto end;
13507             break;
13508         case 2:
13509             if (!TEST_uint_eq(protlen, 0))
13510                 goto end;
13511             break;
13512         case 3:
13513             if (!TEST_mem_eq(prot, protlen, barprot + 1, *barprot))
13514                 goto end;
13515             break;
13516         default:
13517             TEST_error("Should not get here");
13518             goto end;
13519         }
13520     }
13521 
13522     testresult = 1;
13523 end:
13524     SSL_free(serverssl);
13525     SSL_free(clientssl);
13526     SSL_CTX_free(sctx);
13527     SSL_CTX_free(cctx);
13528 
13529     return testresult;
13530 }
13531 #endif /* !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_NEXTPROTONEG) */
13532 
13533 static int alpn_select_cb2(SSL *ssl, const unsigned char **out,
13534     unsigned char *outlen, const unsigned char *in,
13535     unsigned int inlen, void *arg)
13536 {
13537     int *idx = (int *)arg;
13538 
13539     switch (*idx) {
13540     case 0:
13541         *out = (unsigned char *)(fooprot + 1);
13542         *outlen = *fooprot;
13543         return SSL_TLSEXT_ERR_OK;
13544 
13545     case 2:
13546         *out = (unsigned char *)(barprot + 1);
13547         *outlen = *barprot;
13548         return SSL_TLSEXT_ERR_OK;
13549 
13550     case 3:
13551         *outlen = 0;
13552         return SSL_TLSEXT_ERR_OK;
13553 
13554     default:
13555     case 1:
13556         return SSL_TLSEXT_ERR_ALERT_FATAL;
13557     }
13558     return 0;
13559 }
13560 
13561 /*
13562  * Test the ALPN callbacks
13563  * Test 0: client = foo, select = foo
13564  * Test 1: client = <empty>, select = none
13565  * Test 2: client = foo, select = bar (should fail)
13566  * Test 3: client = foo, select = <empty> (should fail)
13567  */
13568 static int test_alpn(int idx)
13569 {
13570     SSL_CTX *sctx = NULL, *cctx = NULL;
13571     SSL *serverssl = NULL, *clientssl = NULL;
13572     int testresult = 0;
13573     const unsigned char *prots = fooprot;
13574     unsigned int protslen = sizeof(fooprot);
13575 
13576     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13577             TLS_client_method(), 0, 0,
13578             &sctx, &cctx, cert, privkey)))
13579         goto end;
13580 
13581     SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb2, &idx);
13582 
13583     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13584             NULL)))
13585         goto end;
13586 
13587     if (idx == 1) {
13588         prots = NULL;
13589         protslen = 0;
13590     }
13591 
13592     /* SSL_set_alpn_protos returns 0 for success! */
13593     if (!TEST_false(SSL_set_alpn_protos(clientssl, prots, protslen)))
13594         goto end;
13595 
13596     if (idx == 2 || idx == 3) {
13597         /* We don't allow empty selection of NPN, so this should fail */
13598         if (!TEST_false(create_ssl_connection(serverssl, clientssl,
13599                 SSL_ERROR_NONE)))
13600             goto end;
13601     } else {
13602         const unsigned char *prot;
13603         unsigned int protlen;
13604 
13605         if (!TEST_true(create_ssl_connection(serverssl, clientssl,
13606                 SSL_ERROR_NONE)))
13607             goto end;
13608 
13609         SSL_get0_alpn_selected(clientssl, &prot, &protlen);
13610         switch (idx) {
13611         case 0:
13612             if (!TEST_mem_eq(prot, protlen, fooprot + 1, *fooprot))
13613                 goto end;
13614             break;
13615         case 1:
13616             if (!TEST_uint_eq(protlen, 0))
13617                 goto end;
13618             break;
13619         default:
13620             TEST_error("Should not get here");
13621             goto end;
13622         }
13623     }
13624 
13625     testresult = 1;
13626 end:
13627     SSL_free(serverssl);
13628     SSL_free(clientssl);
13629     SSL_CTX_free(sctx);
13630     SSL_CTX_free(cctx);
13631 
13632     return testresult;
13633 }
13634 
13635 #if !defined(OSSL_NO_USABLE_TLS1_3)
13636 struct quic_tls_test_data {
13637     struct quic_tls_test_data *peer;
13638     uint32_t renc_level;
13639     uint32_t wenc_level;
13640     unsigned char rcd_data[4][2048];
13641     size_t rcd_data_len[4];
13642     unsigned char rsecret[3][48];
13643     size_t rsecret_len[3];
13644     unsigned char wsecret[3][48];
13645     size_t wsecret_len[3];
13646     unsigned char params[3];
13647     size_t params_len;
13648     int alert;
13649     int err;
13650     int forcefail;
13651     int sm_count;
13652 };
13653 
13654 static int clientquicdata = 0xff, serverquicdata = 0xfe;
13655 
13656 static int check_app_data(SSL *s)
13657 {
13658     int *data, *comparedata;
13659 
13660     /* Check app data works */
13661     data = (int *)SSL_get_app_data(s);
13662     comparedata = SSL_is_server(s) ? &serverquicdata : &clientquicdata;
13663 
13664     if (!TEST_true(comparedata == data))
13665         return 0;
13666 
13667     return 1;
13668 }
13669 
13670 static int crypto_send_cb(SSL *s, const unsigned char *buf, size_t buf_len,
13671     size_t *consumed, void *arg)
13672 {
13673     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13674     struct quic_tls_test_data *peer = data->peer;
13675     size_t max_len = sizeof(peer->rcd_data[data->wenc_level])
13676         - peer->rcd_data_len[data->wenc_level];
13677 
13678     if (!check_app_data(s)) {
13679         data->err = 1;
13680         return 0;
13681     }
13682 
13683     if (buf_len > max_len)
13684         buf_len = max_len;
13685 
13686     if (buf_len == 0) {
13687         *consumed = 0;
13688         return 1;
13689     }
13690 
13691     memcpy(peer->rcd_data[data->wenc_level]
13692             + peer->rcd_data_len[data->wenc_level],
13693         buf, buf_len);
13694     peer->rcd_data_len[data->wenc_level] += buf_len;
13695 
13696     *consumed = buf_len;
13697     return 1;
13698 }
13699 static int crypto_recv_rcd_cb(SSL *s, const unsigned char **buf,
13700     size_t *bytes_read, void *arg)
13701 {
13702     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13703 
13704     if (!check_app_data(s)) {
13705         data->err = 1;
13706         return 0;
13707     }
13708 
13709     *bytes_read = data->rcd_data_len[data->renc_level];
13710     *buf = data->rcd_data[data->renc_level];
13711     return 1;
13712 }
13713 
13714 static int crypto_release_rcd_cb(SSL *s, size_t bytes_read, void *arg)
13715 {
13716     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13717 
13718     if (!check_app_data(s)) {
13719         data->err = 1;
13720         return 0;
13721     }
13722 
13723     /* See if we need to force a failure in this callback */
13724     if (data->forcefail) {
13725         data->forcefail = 0;
13726         data->err = 1;
13727         return 0;
13728     }
13729 
13730     if (!TEST_size_t_eq(bytes_read, data->rcd_data_len[data->renc_level])
13731         || !TEST_size_t_gt(bytes_read, 0)) {
13732         data->err = 1;
13733         return 0;
13734     }
13735     data->rcd_data_len[data->renc_level] = 0;
13736 
13737     return 1;
13738 }
13739 
13740 struct secret_yield_entry {
13741     uint8_t recorded;
13742     int prot_level;
13743     int direction;
13744     int sm_generation;
13745     SSL *ssl;
13746 };
13747 
13748 static struct secret_yield_entry secret_history[16];
13749 static int secret_history_idx = 0;
13750 /*
13751  * Note, this enum needs to match the direction values passed
13752  * to yield_secret_cb
13753  */
13754 typedef enum {
13755     LAST_DIR_READ = 0,
13756     LAST_DIR_WRITE = 1,
13757     LAST_DIR_UNSET = 2
13758 } last_dir_history_state;
13759 
13760 static int check_secret_history(SSL *s)
13761 {
13762     int i;
13763     int ret = 0;
13764     last_dir_history_state last_state = LAST_DIR_UNSET;
13765     int last_prot_level = 0;
13766     int last_generation = 0;
13767 
13768     TEST_info("Checking history for %p\n", (void *)s);
13769     for (i = 0; secret_history[i].recorded == 1; i++) {
13770         if (secret_history[i].ssl != s)
13771             continue;
13772         TEST_info("Got %s(%d) secret for level %d, last level %d, last state %d, gen %d\n",
13773             secret_history[i].direction == 1 ? "Write" : "Read", secret_history[i].direction,
13774             secret_history[i].prot_level, last_prot_level, last_state,
13775             secret_history[i].sm_generation);
13776 
13777         if (last_state == LAST_DIR_UNSET) {
13778             last_prot_level = secret_history[i].prot_level;
13779             last_state = secret_history[i].direction;
13780             last_generation = secret_history[i].sm_generation;
13781             continue;
13782         }
13783 
13784         switch (secret_history[i].direction) {
13785         case 1:
13786             /*
13787              * write case
13788              * NOTE: There is an odd corner case here.  It may occur that
13789              * in a single iteration of the state machine, the read key is yielded
13790              * prior to the write key for the same level.  This is undesirable
13791              * for quic, but it is ok, as the general implementation of every 3rd
13792              * party quic stack while preferring write keys before read, allows
13793              * for read before write if both keys are yielded in the same call
13794              * to SSL_do_handshake, as the tls adaptation code for that quic stack
13795              * can then cache keys until both are available, so we allow read before
13796              * write here iff they occur in the same iteration of SSL_do_handshake
13797              * as represented by the recorded sm_generation value.
13798              */
13799             if (last_prot_level == secret_history[i].prot_level
13800                 && last_state == LAST_DIR_READ) {
13801                 if (last_generation == secret_history[i].sm_generation) {
13802                     TEST_info("Read before write key in same SSL state machine iteration is ok");
13803                 } else {
13804                     TEST_error("Got read key before write key");
13805                     goto end;
13806                 }
13807             }
13808             /* FALLTHROUGH */
13809         case 0:
13810             /*
13811              * Read case
13812              */
13813             break;
13814         default:
13815             TEST_error("Unknown direction");
13816             goto end;
13817         }
13818         last_prot_level = secret_history[i].prot_level;
13819         last_state = secret_history[i].direction;
13820         last_generation = secret_history[i].sm_generation;
13821     }
13822 
13823     ret = 1;
13824 end:
13825     return ret;
13826 }
13827 
13828 static int yield_secret_cb(SSL *s, uint32_t prot_level, int direction,
13829     const unsigned char *secret, size_t secret_len,
13830     void *arg)
13831 {
13832     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13833 
13834     if (!check_app_data(s))
13835         goto err;
13836 
13837     if (prot_level < OSSL_RECORD_PROTECTION_LEVEL_EARLY
13838         || prot_level > OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13839         goto err;
13840 
13841     switch (direction) {
13842     case 0: /* read */
13843         if (!TEST_size_t_le(secret_len, sizeof(data->rsecret)))
13844             goto err;
13845         data->renc_level = prot_level;
13846         memcpy(data->rsecret[prot_level - 1], secret, secret_len);
13847         data->rsecret_len[prot_level - 1] = secret_len;
13848         break;
13849 
13850     case 1: /* write */
13851         if (!TEST_size_t_le(secret_len, sizeof(data->wsecret)))
13852             goto err;
13853         data->wenc_level = prot_level;
13854         memcpy(data->wsecret[prot_level - 1], secret, secret_len);
13855         data->wsecret_len[prot_level - 1] = secret_len;
13856         break;
13857 
13858     default:
13859         goto err;
13860     }
13861 
13862     secret_history[secret_history_idx].direction = direction;
13863     secret_history[secret_history_idx].prot_level = (int)prot_level;
13864     secret_history[secret_history_idx].recorded = 1;
13865     secret_history[secret_history_idx].ssl = s;
13866     secret_history[secret_history_idx].sm_generation = data->sm_count;
13867     secret_history_idx++;
13868     return 1;
13869 err:
13870     data->err = 1;
13871     return 0;
13872 }
13873 
13874 static int yield_secret_cb_fail(SSL *s, uint32_t prot_level, int direction,
13875     const unsigned char *secret, size_t secret_len,
13876     void *arg)
13877 {
13878     (void)s;
13879     (void)prot_level;
13880     (void)direction;
13881     (void)secret;
13882     (void)secret_len;
13883     (void)arg;
13884     /*
13885      * This callback is to test double free in quic tls
13886      */
13887     return 0;
13888 }
13889 
13890 static int got_transport_params_cb(SSL *s, const unsigned char *params,
13891     size_t params_len,
13892     void *arg)
13893 {
13894     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13895 
13896     if (!check_app_data(s)) {
13897         data->err = 1;
13898         return 0;
13899     }
13900 
13901     if (!TEST_size_t_le(params_len, sizeof(data->params))) {
13902         data->err = 1;
13903         return 0;
13904     }
13905 
13906     memcpy(data->params, params, params_len);
13907     data->params_len = params_len;
13908 
13909     return 1;
13910 }
13911 
13912 static int alert_cb(SSL *s, unsigned char alert_code, void *arg)
13913 {
13914     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13915 
13916     if (!check_app_data(s)) {
13917         data->err = 1;
13918         return 0;
13919     }
13920 
13921     data->alert = 1;
13922     return 1;
13923 }
13924 
13925 /* Extension id reserved for private use by IANA */
13926 #define TEST_TLS_EXTENSION_ID 65282
13927 
13928 static int add_ext_cb_called = 0;
13929 static int parse_ext_cb_called = 0;
13930 
13931 static int add_old_ext(SSL *s, unsigned int ext_type,
13932     const unsigned char **out, size_t *outlen,
13933     int *al, void *add_arg)
13934 {
13935     static const unsigned char data = 0xff;
13936 
13937     add_ext_cb_called++;
13938     *out = &data;
13939     *outlen = 1;
13940     return 1;
13941 }
13942 
13943 static void free_old_ext(SSL *s, unsigned int ext_type,
13944     const unsigned char *out, void *add_arg)
13945 {
13946     /* Do nothing */
13947 }
13948 
13949 static int parse_old_ext(SSL *s, unsigned int ext_type,
13950     const unsigned char *in, size_t inlen,
13951     int *al, void *parse_arg)
13952 {
13953     parse_ext_cb_called++;
13954     if (inlen != 1 || *in != 0xff) {
13955         *al = SSL_AD_DECODE_ERROR;
13956         return 0;
13957     }
13958     return 1;
13959 }
13960 
13961 /*
13962  * Test the QUIC TLS API
13963  * Test 0: Normal run
13964  * Test 1: Force a failure
13965  * Test 3: Use a CCM based ciphersuite
13966  * Test 4: fail yield_secret_cb to see double free
13967  * Test 5: Normal run with SNI
13968  */
13969 static int test_quic_tls(int idx)
13970 {
13971     SSL_CTX *sctx = NULL, *sctx2 = NULL, *cctx = NULL;
13972     SSL *serverssl = NULL, *clientssl = NULL;
13973     int testresult = 0;
13974     OSSL_DISPATCH qtdis[] = {
13975         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_SEND, (void (*)(void))crypto_send_cb },
13976         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RECV_RCD,
13977             (void (*)(void))crypto_recv_rcd_cb },
13978         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RELEASE_RCD,
13979             (void (*)(void))crypto_release_rcd_cb },
13980         { OSSL_FUNC_SSL_QUIC_TLS_YIELD_SECRET,
13981             (void (*)(void))yield_secret_cb },
13982         { OSSL_FUNC_SSL_QUIC_TLS_GOT_TRANSPORT_PARAMS,
13983             (void (*)(void))got_transport_params_cb },
13984         { OSSL_FUNC_SSL_QUIC_TLS_ALERT, (void (*)(void))alert_cb },
13985         { 0, NULL }
13986     };
13987     struct quic_tls_test_data sdata, cdata;
13988     const unsigned char cparams[] = {
13989         0xff, 0x01, 0x00
13990     };
13991     const unsigned char sparams[] = {
13992         0xfe, 0x01, 0x00
13993     };
13994     int i;
13995 
13996     if (idx == 4)
13997         qtdis[3].function = (void (*)(void))yield_secret_cb_fail;
13998 
13999     snicb = 0;
14000     memset(secret_history, 0, sizeof(secret_history));
14001     secret_history_idx = 0;
14002     memset(&sdata, 0, sizeof(sdata));
14003     memset(&cdata, 0, sizeof(cdata));
14004     sdata.peer = &cdata;
14005     cdata.peer = &sdata;
14006     if (idx == 1)
14007         sdata.forcefail = 1;
14008 
14009     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
14010             TLS_client_method(), TLS1_3_VERSION, 0,
14011             &sctx, &cctx, cert, privkey)))
14012         goto end;
14013 
14014     if (idx == 5) {
14015         static int dummy = 1;
14016 
14017         if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), NULL,
14018                 TLS1_3_VERSION, 0,
14019                 &sctx2, NULL, cert, privkey)))
14020             goto end;
14021 
14022         /*
14023          * We add an old style custom extension to ensure that it gets correctly
14024          * handled when we copy QUIC's connection specific custom extensions.
14025          */
14026         add_ext_cb_called = 0;
14027         parse_ext_cb_called = 0;
14028         if (!TEST_true(SSL_CTX_add_client_custom_ext(cctx,
14029                 TEST_TLS_EXTENSION_ID,
14030                 add_old_ext, free_old_ext, &dummy, parse_old_ext, &dummy)))
14031             goto end;
14032         if (!TEST_true(SSL_CTX_add_server_custom_ext(sctx,
14033                 TEST_TLS_EXTENSION_ID,
14034                 add_old_ext, free_old_ext, &dummy, parse_old_ext, &dummy)))
14035             goto end;
14036         if (!TEST_true(SSL_CTX_add_server_custom_ext(sctx2,
14037                 TEST_TLS_EXTENSION_ID,
14038                 add_old_ext, free_old_ext, &dummy, parse_old_ext, &dummy)))
14039             goto end;
14040 
14041         /* Set up SNI */
14042         if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
14043             || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
14044             goto end;
14045     }
14046 
14047     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
14048             NULL)))
14049         goto end;
14050 
14051     /* Reset the BIOs we set in create_ssl_objects. We should not need them */
14052     SSL_set_bio(serverssl, NULL, NULL);
14053     SSL_set_bio(clientssl, NULL, NULL);
14054 
14055     if (idx == 2) {
14056         if (!TEST_true(SSL_set_ciphersuites(serverssl, "TLS_AES_128_CCM_SHA256"))
14057             || !TEST_true(SSL_set_ciphersuites(clientssl, "TLS_AES_128_CCM_SHA256")))
14058             goto end;
14059     }
14060 
14061     if (!TEST_true(SSL_set_app_data(clientssl, &clientquicdata))
14062         || !TEST_true(SSL_set_app_data(serverssl, &serverquicdata)))
14063         goto end;
14064 
14065     if (!TEST_true(SSL_set_quic_tls_cbs(clientssl, qtdis, &cdata))
14066         || !TEST_true(SSL_set_quic_tls_cbs(serverssl, qtdis, &sdata))
14067         || !TEST_true(SSL_set_quic_tls_transport_params(clientssl, cparams,
14068             sizeof(cparams)))
14069         || !TEST_true(SSL_set_quic_tls_transport_params(serverssl, sparams,
14070             sizeof(sparams))))
14071         goto end;
14072 
14073     if (idx != 1 && idx != 4) {
14074         if (!TEST_true(create_ssl_connection_ex(serverssl, clientssl, SSL_ERROR_NONE,
14075                 &cdata.sm_count, &sdata.sm_count)))
14076             goto end;
14077     } else {
14078         /* We expect this connection to fail */
14079         if (!TEST_false(create_ssl_connection_ex(serverssl, clientssl, SSL_ERROR_NONE,
14080                 &cdata.sm_count, &sdata.sm_count)))
14081             goto end;
14082         testresult = 1;
14083         sdata.err = 0;
14084         goto end;
14085     }
14086 
14087     /* We should have had the SNI callback called exactly once */
14088     if (idx == 5) {
14089         if (!TEST_int_eq(snicb, 1))
14090             goto end;
14091     }
14092 
14093     /* Check no problems during the handshake */
14094     if (!TEST_false(sdata.alert)
14095         || !TEST_false(cdata.alert)
14096         || !TEST_false(sdata.err)
14097         || !TEST_false(cdata.err))
14098         goto end;
14099 
14100     /* Check the secrets all match */
14101     for (i = OSSL_RECORD_PROTECTION_LEVEL_EARLY - 1;
14102         i < OSSL_RECORD_PROTECTION_LEVEL_APPLICATION;
14103         i++) {
14104         if (!TEST_mem_eq(sdata.wsecret[i], sdata.wsecret_len[i],
14105                 cdata.rsecret[i], cdata.rsecret_len[i]))
14106             goto end;
14107     }
14108 
14109     /*
14110      * Check that our secret history yields write secrets before read secrets
14111      */
14112     if (!TEST_int_eq(check_secret_history(serverssl), 1))
14113         goto end;
14114     if (!TEST_int_eq(check_secret_history(clientssl), 1))
14115         goto end;
14116 
14117     /* Check the transport params */
14118     if (!TEST_mem_eq(sdata.params, sdata.params_len, cparams, sizeof(cparams))
14119         || !TEST_mem_eq(cdata.params, cdata.params_len, sparams,
14120             sizeof(sparams)))
14121         goto end;
14122 
14123     /* Check the encryption levels are what we expect them to be */
14124     if (!TEST_true(sdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
14125         || !TEST_true(sdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
14126         || !TEST_true(cdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
14127         || !TEST_true(cdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION))
14128         goto end;
14129 
14130     /*
14131      * We only expect the add cb to have actually been called because we are
14132      * using the old style callbacks that only apply to TLSv1.2. Since we are
14133      * using TLSv1.3 here, the add will be called for the ClientHello but
14134      * nothing else.
14135      */
14136     if (idx == 5) {
14137         if (!TEST_int_eq(add_ext_cb_called, 1)
14138             || !TEST_int_eq(parse_ext_cb_called, 0))
14139             goto end;
14140     }
14141 
14142     testresult = 1;
14143 end:
14144     SSL_free(serverssl);
14145     SSL_free(clientssl);
14146     SSL_CTX_free(sctx2);
14147     SSL_CTX_free(sctx);
14148     SSL_CTX_free(cctx);
14149 
14150     /* Check that we didn't suddenly hit an unexpected failure during cleanup */
14151     if (!TEST_false(sdata.err) || !TEST_false(cdata.err))
14152         testresult = 0;
14153 
14154     return testresult;
14155 }
14156 
14157 static void assert_no_end_of_early_data(int write_p, int version, int content_type,
14158     const void *buf, size_t msglen, SSL *ssl, void *arg)
14159 {
14160     const unsigned char *msg = buf;
14161 
14162     if (content_type == SSL3_RT_HANDSHAKE && msg[0] == SSL3_MT_END_OF_EARLY_DATA)
14163         end_of_early_data = 1;
14164 }
14165 
14166 static int test_quic_tls_early_data(void)
14167 {
14168     SSL_CTX *sctx = NULL, *cctx = NULL;
14169     SSL *serverssl = NULL, *clientssl = NULL;
14170     int testresult = 0;
14171     SSL_SESSION *sess = NULL;
14172     const OSSL_DISPATCH qtdis[] = {
14173         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_SEND, (void (*)(void))crypto_send_cb },
14174         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RECV_RCD,
14175             (void (*)(void))crypto_recv_rcd_cb },
14176         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RELEASE_RCD,
14177             (void (*)(void))crypto_release_rcd_cb },
14178         { OSSL_FUNC_SSL_QUIC_TLS_YIELD_SECRET,
14179             (void (*)(void))yield_secret_cb },
14180         { OSSL_FUNC_SSL_QUIC_TLS_GOT_TRANSPORT_PARAMS,
14181             (void (*)(void))got_transport_params_cb },
14182         { OSSL_FUNC_SSL_QUIC_TLS_ALERT, (void (*)(void))alert_cb },
14183         { 0, NULL }
14184     };
14185     struct quic_tls_test_data sdata, cdata;
14186     const unsigned char cparams[] = {
14187         0xff, 0x01, 0x00
14188     };
14189     const unsigned char sparams[] = {
14190         0xfe, 0x01, 0x00
14191     };
14192     int i;
14193 
14194     memset(secret_history, 0, sizeof(secret_history));
14195     secret_history_idx = 0;
14196     memset(&sdata, 0, sizeof(sdata));
14197     memset(&cdata, 0, sizeof(cdata));
14198     sdata.peer = &cdata;
14199     cdata.peer = &sdata;
14200     end_of_early_data = 0;
14201 
14202     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
14203             TLS_client_method(), TLS1_3_VERSION, 0,
14204             &sctx, &cctx, cert, privkey)))
14205         goto end;
14206 
14207     SSL_CTX_set_max_early_data(sctx, 0xffffffff);
14208     SSL_CTX_set_max_early_data(cctx, 0xffffffff);
14209 
14210     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
14211             NULL)))
14212         goto end;
14213 
14214     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
14215         goto end;
14216 
14217     sess = SSL_get1_session(clientssl);
14218     SSL_shutdown(clientssl);
14219     SSL_shutdown(serverssl);
14220     SSL_free(serverssl);
14221     SSL_free(clientssl);
14222     serverssl = clientssl = NULL;
14223 
14224     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
14225             &clientssl, NULL, NULL))
14226         || !TEST_true(SSL_set_session(clientssl, sess)))
14227         goto end;
14228 
14229     /* Reset the BIOs we set in create_ssl_objects. We should not need them */
14230     SSL_set_bio(serverssl, NULL, NULL);
14231     SSL_set_bio(clientssl, NULL, NULL);
14232 
14233     if (!TEST_true(SSL_set_app_data(clientssl, &clientquicdata))
14234         || !TEST_true(SSL_set_app_data(serverssl, &serverquicdata)))
14235         goto end;
14236 
14237     if (!TEST_true(SSL_set_quic_tls_cbs(clientssl, qtdis, &cdata))
14238         || !TEST_true(SSL_set_quic_tls_cbs(serverssl, qtdis, &sdata))
14239         || !TEST_true(SSL_set_quic_tls_transport_params(clientssl, cparams,
14240             sizeof(cparams)))
14241         || !TEST_true(SSL_set_quic_tls_transport_params(serverssl, sparams,
14242             sizeof(sparams))))
14243         goto end;
14244 
14245     /*
14246      * Reset our secret history so we get the record of the second connection
14247      */
14248     memset(secret_history, 0, sizeof(secret_history));
14249     secret_history_idx = 0;
14250 
14251     SSL_set_quic_tls_early_data_enabled(serverssl, 1);
14252     SSL_set_quic_tls_early_data_enabled(clientssl, 1);
14253 
14254     SSL_set_msg_callback(serverssl, assert_no_end_of_early_data);
14255     SSL_set_msg_callback(clientssl, assert_no_end_of_early_data);
14256 
14257     if (!TEST_int_eq(SSL_connect(clientssl), -1)
14258         || !TEST_int_eq(SSL_accept(serverssl), -1)
14259         || !TEST_int_eq(SSL_get_early_data_status(serverssl), SSL_EARLY_DATA_ACCEPTED)
14260         || !TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_READ)
14261         || !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_WANT_READ))
14262         goto end;
14263 
14264     /* Check the encryption levels are what we expect them to be */
14265     if (!TEST_true(sdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE)
14266         || !TEST_true(sdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
14267         || !TEST_true(cdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_NONE)
14268         || !TEST_true(cdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_EARLY))
14269         goto end;
14270 
14271     sdata.sm_count = 0;
14272     cdata.sm_count = 0;
14273     if (!TEST_true(create_ssl_connection_ex(serverssl, clientssl, SSL_ERROR_NONE,
14274             &cdata.sm_count, &sdata.sm_count)))
14275         goto end;
14276 
14277     /* Check no problems during the handshake */
14278     if (!TEST_false(sdata.alert)
14279         || !TEST_false(cdata.alert)
14280         || !TEST_false(sdata.err)
14281         || !TEST_false(cdata.err))
14282         goto end;
14283 
14284     /* Check the secrets all match */
14285     for (i = OSSL_RECORD_PROTECTION_LEVEL_EARLY - 1;
14286         i < OSSL_RECORD_PROTECTION_LEVEL_APPLICATION;
14287         i++) {
14288         if (!TEST_mem_eq(sdata.wsecret[i], sdata.wsecret_len[i],
14289                 cdata.rsecret[i], cdata.rsecret_len[i]))
14290             goto end;
14291     }
14292 
14293     if (!TEST_int_eq(check_secret_history(serverssl), 1))
14294         goto end;
14295     if (!TEST_int_eq(check_secret_history(clientssl), 1))
14296         goto end;
14297 
14298     /* Check the transport params */
14299     if (!TEST_mem_eq(sdata.params, sdata.params_len, cparams, sizeof(cparams))
14300         || !TEST_mem_eq(cdata.params, cdata.params_len, sparams,
14301             sizeof(sparams)))
14302         goto end;
14303 
14304     /* Check the encryption levels are what we expect them to be */
14305     if (!TEST_true(sdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
14306         || !TEST_true(sdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
14307         || !TEST_true(cdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
14308         || !TEST_true(cdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION))
14309         goto end;
14310 
14311     /* Check there is no EndOfEearlyData in handshake */
14312     if (!TEST_int_eq(end_of_early_data, 0))
14313         goto end;
14314 
14315     testresult = 1;
14316 end:
14317     SSL_SESSION_free(sess);
14318     SSL_SESSION_free(clientpsk);
14319     SSL_SESSION_free(serverpsk);
14320     clientpsk = serverpsk = NULL;
14321     SSL_free(serverssl);
14322     SSL_free(clientssl);
14323     SSL_CTX_free(sctx);
14324     SSL_CTX_free(cctx);
14325 
14326     return testresult;
14327 }
14328 #endif /* !defined(OSSL_NO_USABLE_TLS1_3) */
14329 
14330 static int test_no_renegotiation(int idx)
14331 {
14332     SSL_CTX *sctx = NULL, *cctx = NULL;
14333     SSL *serverssl = NULL, *clientssl = NULL;
14334     int testresult = 0, ret;
14335     int max_proto;
14336     const SSL_METHOD *sm, *cm;
14337     unsigned char buf[5];
14338 
14339     if (idx == 0) {
14340 #ifndef OPENSSL_NO_TLS1_2
14341         max_proto = TLS1_2_VERSION;
14342         sm = TLS_server_method();
14343         cm = TLS_client_method();
14344 #else
14345         return TEST_skip("TLSv1.2 is disabled in this build");
14346 #endif
14347     } else {
14348 #ifndef OPENSSL_NO_DTLS1_2
14349         max_proto = DTLS1_2_VERSION;
14350         sm = DTLS_server_method();
14351         cm = DTLS_client_method();
14352 #else
14353         return TEST_skip("DTLSv1.2 is disabled in this build");
14354 #endif
14355     }
14356     if (!TEST_true(create_ssl_ctx_pair(libctx, sm, cm, 0, max_proto,
14357             &sctx, &cctx, cert, privkey)))
14358         goto end;
14359 
14360     SSL_CTX_set_options(sctx, SSL_OP_NO_RENEGOTIATION);
14361 
14362     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
14363             NULL)))
14364         goto end;
14365 
14366     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
14367         goto end;
14368 
14369     if (!TEST_true(SSL_renegotiate(clientssl))
14370         || !TEST_int_le(ret = SSL_connect(clientssl), 0)
14371         || !TEST_int_eq(SSL_get_error(clientssl, ret), SSL_ERROR_WANT_READ))
14372         goto end;
14373 
14374     /*
14375      * We've not sent any application data, so we expect this to fail. It should
14376      * also read the renegotiation attempt, and send back a no_renegotiation
14377      * warning alert because we have renegotiation disabled.
14378      */
14379     if (!TEST_int_le(ret = SSL_read(serverssl, buf, sizeof(buf)), 0))
14380         goto end;
14381     if (!TEST_int_eq(SSL_get_error(serverssl, ret), SSL_ERROR_WANT_READ))
14382         goto end;
14383 
14384     /*
14385      * The client should now see the no_renegotiation warning and fail the
14386      * connection
14387      */
14388     if (!TEST_int_le(ret = SSL_connect(clientssl), 0)
14389         || !TEST_int_eq(SSL_get_error(clientssl, ret), SSL_ERROR_SSL)
14390         || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), SSL_R_NO_RENEGOTIATION))
14391         goto end;
14392 
14393     testresult = 1;
14394 end:
14395     SSL_free(serverssl);
14396     SSL_free(clientssl);
14397     SSL_CTX_free(sctx);
14398     SSL_CTX_free(cctx);
14399 
14400     return testresult;
14401 }
14402 
14403 #if defined(DO_SSL_TRACE_TEST)
14404 /*
14405  * Tests that the SSL_trace() msg_callback works as expected with a PQ Groups.
14406  */
14407 static int test_ssl_trace(void)
14408 {
14409     SSL_CTX *sctx = NULL, *cctx = NULL;
14410     SSL *serverssl = NULL, *clientssl = NULL;
14411     int testresult = 0;
14412     BIO *bio = NULL;
14413     char *reffile = NULL;
14414     char *grouplist = "MLKEM512:MLKEM768:MLKEM1024:X25519MLKEM768:SecP256r1MLKEM768"
14415                       ":SecP384r1MLKEM1024:secp521r1:secp384r1:secp256r1";
14416 
14417     if (!fips_provider_version_ge(libctx, 3, 5, 0))
14418         return TEST_skip("FIPS provider does not support MLKEM algorithms");
14419 
14420     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
14421             TLS_client_method(),
14422             TLS1_3_VERSION, TLS1_3_VERSION,
14423             &sctx, &cctx, cert, privkey))
14424         || !TEST_ptr(bio = BIO_new(BIO_s_mem()))
14425         || !TEST_true(SSL_CTX_set1_groups_list(sctx, grouplist))
14426         || !TEST_true(SSL_CTX_set1_groups_list(cctx, grouplist))
14427         || !TEST_true(SSL_CTX_set_ciphersuites(cctx,
14428             "TLS_AES_128_GCM_SHA256"))
14429         || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
14430             "TLS_AES_128_GCM_SHA256"))
14431 #ifdef SSL_OP_LEGACY_EC_POINT_FORMATS
14432         || !TEST_true(SSL_CTX_set_options(cctx, SSL_OP_LEGACY_EC_POINT_FORMATS))
14433         || !TEST_true(SSL_CTX_set_options(sctx, SSL_OP_LEGACY_EC_POINT_FORMATS))
14434 #endif
14435         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
14436             NULL, NULL)))
14437         goto err;
14438 
14439     SSL_set_msg_callback(clientssl, SSL_trace);
14440     SSL_set_msg_callback_arg(clientssl, bio);
14441 
14442     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
14443         goto err;
14444 
14445     /* Skip the comparison of the trace when the fips provider is used. */
14446     if (is_fips) {
14447         /* Check whether there was something written. */
14448         if (!TEST_int_gt(BIO_pending(bio), 0))
14449             goto err;
14450     } else {
14451 
14452 #ifdef OPENSSL_NO_ZLIB
14453         reffile = test_mk_file_path(datadir, "ssltraceref.txt");
14454 #else
14455         reffile = test_mk_file_path(datadir, "ssltraceref-zlib.txt");
14456 #endif
14457         if (!TEST_true(compare_with_reference_file(bio, reffile)))
14458             goto err;
14459     }
14460 
14461     testresult = 1;
14462 err:
14463     BIO_free(bio);
14464     SSL_free(serverssl);
14465     SSL_free(clientssl);
14466     SSL_CTX_free(sctx);
14467     SSL_CTX_free(cctx);
14468     OPENSSL_free(reffile);
14469 
14470     return testresult;
14471 }
14472 #endif
14473 
14474 /*
14475  * Test that SSL_CTX_set1_groups() when called with a list where the first
14476  * entry is unsupported, will send a key_share that uses the next usable entry.
14477  */
14478 static int test_ssl_set_groups_unsupported_keyshare(int idx)
14479 {
14480 #if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
14481     int testresult = 0;
14482     SSL_CTX *sctx = NULL, *cctx = NULL;
14483     SSL *serverssl = NULL, *clientssl = NULL;
14484     int client_groups[] = {
14485         NID_brainpoolP256r1tls13,
14486         NID_sect163k1,
14487         NID_secp384r1,
14488         NID_ffdhe2048,
14489     };
14490 
14491     switch (idx) {
14492     case 1:
14493         client_groups[0] = NID_id_tc26_gost_3410_2012_512_paramSetC;
14494         if (sizeof(unsigned long) == 4) {
14495             return TEST_skip("SSL_CTX_set1_groups() is broken on 32-bit systems with TLS"
14496                              " group IDs > 0x20, see https://github.com/openssl/openssl/issues/29196");
14497         }
14498         break;
14499     }
14500 
14501     if (!TEST_true(create_ssl_ctx_pair(libctx,
14502             TLS_server_method(),
14503             TLS_client_method(),
14504             0, 0,
14505             &sctx,
14506             &cctx,
14507             cert,
14508             privkey)))
14509         goto end;
14510 
14511     if (!TEST_true(SSL_CTX_set1_groups(cctx,
14512             client_groups,
14513             OSSL_NELEM(client_groups))))
14514         goto end;
14515 
14516     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
14517             NULL)))
14518         goto end;
14519 
14520     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
14521         goto end;
14522 
14523     testresult = 1;
14524 end:
14525     SSL_free(serverssl);
14526     SSL_free(clientssl);
14527     SSL_CTX_free(sctx);
14528     SSL_CTX_free(cctx);
14529 
14530     return testresult;
14531 #else /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
14532     return TEST_skip("No EC and DH support.");
14533 #endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
14534 }
14535 
14536 /*
14537  * Test that if we attempt to send HTTP to a TLS server that we get the expected
14538  * failure reason code.
14539  */
14540 static int test_http_verbs(int idx)
14541 {
14542     SSL_CTX *sctx = NULL;
14543     SSL *serverssl = NULL;
14544     int testresult = 0;
14545     const char *verbs[] = { "GET", "POST", "HEAD" };
14546     const char *http_trailer = " / HTTP/1.0\r\n\r\n";
14547     BIO *b = BIO_new(BIO_s_mem());
14548 
14549     if (!TEST_true((unsigned int)idx < OSSL_NELEM(verbs)))
14550         goto end;
14551 
14552     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
14553             NULL, 0, 0, &sctx, NULL, cert, privkey)))
14554         goto end;
14555 
14556     serverssl = SSL_new(sctx);
14557     if (!TEST_ptr(serverssl))
14558         goto end;
14559 
14560     if (!TEST_int_gt(BIO_write(b, verbs[idx], (int)strlen(verbs[idx])), 0))
14561         goto end;
14562     if (!TEST_int_gt(BIO_write(b, http_trailer, (int)strlen(http_trailer)), 0))
14563         goto end;
14564     SSL_set_bio(serverssl, b, b);
14565     b = NULL;
14566 
14567     ERR_clear_error();
14568     if (!TEST_int_le(SSL_accept(serverssl), 0))
14569         goto end;
14570     if (!TEST_int_eq(ERR_GET_REASON(ERR_get_error()), SSL_R_HTTP_REQUEST))
14571         goto end;
14572 
14573     testresult = 1;
14574 end:
14575     SSL_free(serverssl);
14576     SSL_CTX_free(sctx);
14577     BIO_free(b);
14578 
14579     return testresult;
14580 }
14581 
14582 OPT_TEST_DECLARE_USAGE("certfile privkeyfile srpvfile tmpfile provider config dhfile\n")
14583 
14584 int setup_tests(void)
14585 {
14586     char *modulename;
14587     char *configfile;
14588 
14589     libctx = OSSL_LIB_CTX_new();
14590     if (!TEST_ptr(libctx))
14591         return 0;
14592 
14593     defctxnull = OSSL_PROVIDER_load(NULL, "null");
14594 
14595     /*
14596      * Verify that the default and fips providers in the default libctx are not
14597      * available
14598      */
14599     if (!TEST_false(OSSL_PROVIDER_available(NULL, "default"))
14600         || !TEST_false(OSSL_PROVIDER_available(NULL, "fips")))
14601         return 0;
14602 
14603     if (!test_skip_common_options()) {
14604         TEST_error("Error parsing test options\n");
14605         return 0;
14606     }
14607 
14608     if (!TEST_ptr(certsdir = test_get_argument(0))
14609         || !TEST_ptr(srpvfile = test_get_argument(1))
14610         || !TEST_ptr(tmpfilename = test_get_argument(2))
14611         || !TEST_ptr(modulename = test_get_argument(3))
14612         || !TEST_ptr(configfile = test_get_argument(4))
14613         || !TEST_ptr(dhfile = test_get_argument(5)))
14614         return 0;
14615 
14616     datadir = test_get_argument(6);
14617 
14618     if (!TEST_true(OSSL_LIB_CTX_load_config(libctx, configfile)))
14619         return 0;
14620 
14621     /* Check we have the expected provider available */
14622     if (!TEST_true(OSSL_PROVIDER_available(libctx, modulename)))
14623         return 0;
14624 
14625     /* Check the default provider is not available */
14626     if (strcmp(modulename, "default") != 0
14627         && !TEST_false(OSSL_PROVIDER_available(libctx, "default")))
14628         return 0;
14629 
14630     if (strcmp(modulename, "fips") == 0) {
14631         OSSL_PROVIDER *prov = NULL;
14632         OSSL_PARAM params[2];
14633 
14634         is_fips = 1;
14635 
14636         prov = OSSL_PROVIDER_load(libctx, "fips");
14637         if (prov != NULL) {
14638             /* Query the fips provider to check if the check ems option is enabled */
14639             params[0] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_TLS1_PRF_EMS_CHECK,
14640                 &fips_ems_check);
14641             params[1] = OSSL_PARAM_construct_end();
14642             OSSL_PROVIDER_get_params(prov, params);
14643             OSSL_PROVIDER_unload(prov);
14644         }
14645     }
14646 
14647     /*
14648      * We add, but don't load the test "tls-provider". We'll load it when we
14649      * need it.
14650      */
14651     if (!TEST_true(OSSL_PROVIDER_add_builtin(libctx, "tls-provider",
14652             tls_provider_init)))
14653         return 0;
14654 
14655     if (getenv("OPENSSL_TEST_GETCOUNTS") != NULL) {
14656 #ifdef OPENSSL_NO_CRYPTO_MDEBUG
14657         TEST_error("not supported in this build");
14658         return 0;
14659 #else
14660         int i, mcount, rcount, fcount;
14661 
14662         for (i = 0; i < 4; i++)
14663             test_export_key_mat(i);
14664         CRYPTO_get_alloc_counts(&mcount, &rcount, &fcount);
14665         test_printf_stdout("malloc %d realloc %d free %d\n",
14666             mcount, rcount, fcount);
14667         return 1;
14668 #endif
14669     }
14670 
14671     cert = test_mk_file_path(certsdir, "servercert.pem");
14672     if (cert == NULL)
14673         goto err;
14674 
14675     privkey = test_mk_file_path(certsdir, "serverkey.pem");
14676     if (privkey == NULL)
14677         goto err;
14678 
14679     cert2 = test_mk_file_path(certsdir, "server-ecdsa-cert.pem");
14680     if (cert2 == NULL)
14681         goto err;
14682 
14683     privkey2 = test_mk_file_path(certsdir, "server-ecdsa-key.pem");
14684     if (privkey2 == NULL)
14685         goto err;
14686 
14687     cert1024 = test_mk_file_path(certsdir, "ee-cert-1024.pem");
14688     if (cert1024 == NULL)
14689         goto err;
14690 
14691     privkey1024 = test_mk_file_path(certsdir, "ee-key-1024.pem");
14692     if (privkey1024 == NULL)
14693         goto err;
14694 
14695     cert3072 = test_mk_file_path(certsdir, "ee-cert-3072.pem");
14696     if (cert3072 == NULL)
14697         goto err;
14698 
14699     privkey3072 = test_mk_file_path(certsdir, "ee-key-3072.pem");
14700     if (privkey3072 == NULL)
14701         goto err;
14702 
14703     cert4096 = test_mk_file_path(certsdir, "ee-cert-4096.pem");
14704     if (cert4096 == NULL)
14705         goto err;
14706 
14707     privkey4096 = test_mk_file_path(certsdir, "ee-key-4096.pem");
14708     if (privkey4096 == NULL)
14709         goto err;
14710 
14711     cert8192 = test_mk_file_path(certsdir, "ee-cert-8192.pem");
14712     if (cert8192 == NULL)
14713         goto err;
14714 
14715     privkey8192 = test_mk_file_path(certsdir, "ee-key-8192.pem");
14716     if (privkey8192 == NULL)
14717         goto err;
14718 
14719     if (fips_ems_check) {
14720 #ifndef OPENSSL_NO_TLS1_2
14721         ADD_TEST(test_no_ems);
14722 #endif
14723         return 1;
14724     }
14725 #if !defined(OPENSSL_NO_KTLS) && !defined(OPENSSL_NO_SOCK)
14726 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
14727     ADD_ALL_TESTS(test_ktls, NUM_KTLS_TEST_CIPHERS * 4);
14728     ADD_ALL_TESTS(test_ktls_sendfile, NUM_KTLS_TEST_CIPHERS * 2);
14729 #endif
14730 #ifndef OSSL_NO_USABLE_TLS1_3
14731     ADD_TEST(test_ktls_moving_write_buffer);
14732 #endif
14733 #endif
14734     ADD_TEST(test_large_message_tls);
14735     ADD_TEST(test_large_message_tls_read_ahead);
14736 #ifndef OPENSSL_NO_DTLS
14737     ADD_TEST(test_large_message_dtls);
14738 #endif
14739     ADD_ALL_TESTS(test_large_app_data, 28);
14740     ADD_TEST(test_cleanse_plaintext);
14741 #ifndef OPENSSL_NO_OCSP
14742     ADD_TEST(test_tlsext_status_type);
14743 #endif
14744     ADD_TEST(test_session_with_only_int_cache);
14745     ADD_TEST(test_session_with_only_ext_cache);
14746     ADD_TEST(test_session_with_both_cache);
14747     ADD_TEST(test_session_wo_ca_names);
14748 #ifndef OSSL_NO_USABLE_TLS1_3
14749     ADD_ALL_TESTS(test_stateful_tickets, 3);
14750     ADD_ALL_TESTS(test_stateless_tickets, 3);
14751     ADD_TEST(test_psk_tickets);
14752     ADD_ALL_TESTS(test_extra_tickets, 6);
14753 #endif
14754     ADD_ALL_TESTS(test_ssl_set_bio, TOTAL_SSL_SET_BIO_TESTS);
14755     ADD_TEST(test_ssl_bio_pop_next_bio);
14756     ADD_TEST(test_ssl_bio_pop_ssl_bio);
14757     ADD_TEST(test_ssl_bio_change_rbio);
14758     ADD_TEST(test_ssl_bio_change_wbio);
14759     ADD_TEST(test_ssl_set_wbio_chain_no_leak);
14760 #if !defined(OPENSSL_NO_TLS1_2) || defined(OSSL_NO_USABLE_TLS1_3)
14761     ADD_ALL_TESTS(test_set_sigalgs, OSSL_NELEM(testsigalgs) * 2);
14762     ADD_TEST(test_keylog);
14763 #endif
14764 #ifndef OSSL_NO_USABLE_TLS1_3
14765     ADD_TEST(test_keylog_no_master_key);
14766 #endif
14767     ADD_TEST(test_client_cert_verify_cb);
14768     ADD_TEST(test_ssl_build_cert_chain);
14769     ADD_TEST(test_ssl_ctx_build_cert_chain);
14770 #ifndef OPENSSL_NO_TLS1_2
14771     ADD_TEST(test_client_hello_cb);
14772     ADD_TEST(test_no_ems);
14773     ADD_TEST(test_ccs_change_cipher);
14774 #endif
14775 #ifndef OSSL_NO_USABLE_TLS1_3
14776     ADD_ALL_TESTS(test_early_data_read_write, 6);
14777     /*
14778      * We don't do replay tests for external PSK. Replay protection isn't used
14779      * in that scenario.
14780      */
14781     ADD_ALL_TESTS(test_early_data_replay, 2);
14782     ADD_ALL_TESTS(test_early_data_skip, OSSL_NELEM(ciphersuites) * 3);
14783     ADD_ALL_TESTS(test_early_data_skip_hrr, OSSL_NELEM(ciphersuites) * 3);
14784     ADD_ALL_TESTS(test_early_data_skip_hrr_fail, OSSL_NELEM(ciphersuites) * 3);
14785     ADD_ALL_TESTS(test_early_data_skip_abort, OSSL_NELEM(ciphersuites) * 3);
14786     ADD_ALL_TESTS(test_early_data_not_sent, 3);
14787     ADD_ALL_TESTS(test_early_data_psk, 8);
14788     ADD_ALL_TESTS(test_early_data_psk_with_all_ciphers, 7);
14789     ADD_ALL_TESTS(test_early_data_not_expected, 3);
14790 #ifndef OPENSSL_NO_TLS1_2
14791     ADD_ALL_TESTS(test_early_data_tls1_2, 3);
14792 #endif
14793 #endif
14794 #ifndef OSSL_NO_USABLE_TLS1_3
14795     ADD_ALL_TESTS(test_set_ciphersuite, 10);
14796     ADD_TEST(test_ciphersuite_change);
14797     ADD_ALL_TESTS(test_tls13_ciphersuite, 4);
14798 #ifdef OPENSSL_NO_PSK
14799     ADD_ALL_TESTS(test_tls13_psk, 1);
14800 #else
14801     ADD_ALL_TESTS(test_tls13_psk, 4);
14802 #endif /* OPENSSL_NO_PSK */
14803 #ifndef OSSL_NO_USABLE_TLS1_3
14804     ADD_ALL_TESTS(test_tls13_no_dhe_kex, 8);
14805 #endif /* OSSL_NO_USABLE_TLS1_3 */
14806 #ifndef OPENSSL_NO_TLS1_2
14807     /* Test with both TLSv1.3 and 1.2 versions */
14808     ADD_ALL_TESTS(test_key_exchange, 21);
14809 #if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_DH)
14810     ADD_ALL_TESTS(test_negotiated_group,
14811         4 * (OSSL_NELEM(ecdhe_kexch_groups) + OSSL_NELEM(ffdhe_kexch_groups)));
14812 #endif
14813 #else
14814     /* Test with only TLSv1.3 versions */
14815     ADD_ALL_TESTS(test_key_exchange, 18);
14816 #endif
14817     ADD_ALL_TESTS(test_custom_exts, 6);
14818     ADD_TEST(test_stateless);
14819     ADD_TEST(test_pha_key_update);
14820 #else
14821     ADD_ALL_TESTS(test_custom_exts, 3);
14822 #endif
14823     ADD_ALL_TESTS(test_export_key_mat, 6);
14824 #ifndef OSSL_NO_USABLE_TLS1_3
14825     ADD_ALL_TESTS(test_export_key_mat_early, 3);
14826     ADD_TEST(test_key_update);
14827     ADD_ALL_TESTS(test_key_update_peer_in_write, 2);
14828     ADD_ALL_TESTS(test_key_update_peer_in_read, 2);
14829     ADD_ALL_TESTS(test_key_update_local_in_write, 2);
14830     ADD_ALL_TESTS(test_key_update_local_in_read, 2);
14831 #endif
14832     ADD_ALL_TESTS(test_ssl_clear, 8);
14833     ADD_ALL_TESTS(test_max_fragment_len_ext, OSSL_NELEM(max_fragment_len_test));
14834 #if !defined(OPENSSL_NO_SRP) && !defined(OPENSSL_NO_TLS1_2)
14835     ADD_ALL_TESTS(test_srp, 6);
14836 #endif
14837 #if !defined(OPENSSL_NO_COMP_ALG)
14838     /* Add compression case */
14839     ADD_ALL_TESTS(test_info_callback, 8);
14840 #else
14841     ADD_ALL_TESTS(test_info_callback, 6);
14842 #endif
14843     ADD_ALL_TESTS(test_ssl_pending, 2);
14844     ADD_ALL_TESTS(test_ssl_get_shared_ciphers, OSSL_NELEM(shared_ciphers_data));
14845     ADD_ALL_TESTS(test_ticket_callbacks, 20);
14846     ADD_TEST(test_ticket_abort_session_leak);
14847     ADD_ALL_TESTS(test_shutdown, 7);
14848     ADD_TEST(test_async_shutdown);
14849     ADD_ALL_TESTS(test_incorrect_shutdown, 2);
14850     ADD_ALL_TESTS(test_cert_cb, 6);
14851     ADD_ALL_TESTS(test_client_cert_cb, 2);
14852     ADD_ALL_TESTS(test_ca_names, 3);
14853 #ifndef OPENSSL_NO_TLS1_2
14854     ADD_ALL_TESTS(test_multiblock_write, OSSL_NELEM(multiblock_cipherlist_data));
14855 #endif
14856     ADD_ALL_TESTS(test_servername, 10);
14857     ADD_TEST(test_unknown_sigalgs_groups);
14858 #if (!defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)) || !defined(OPENSSL_NO_ML_KEM)
14859     ADD_TEST(test_configuration_of_groups);
14860 #endif
14861 #if !defined(OPENSSL_NO_EC) \
14862     && (!defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2))
14863     ADD_ALL_TESTS(test_sigalgs_available, 6);
14864 #endif
14865 #ifndef OPENSSL_NO_TLS1_3
14866     ADD_ALL_TESTS(test_pluggable_group, 2);
14867     ADD_ALL_TESTS(test_pluggable_signature, 6);
14868 #endif
14869 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
14870     ADD_ALL_TESTS(test_sigalg_ctx_switch, 4);
14871     ADD_ALL_TESTS(test_sigalg_ctx_switch_cert_cb, 2);
14872 #ifndef OPENSSL_NO_TLS1_2
14873     ADD_TEST(test_sigalg_ctx_switch_reneg);
14874 #endif
14875 #endif
14876 #ifndef OPENSSL_NO_TLS1_2
14877     ADD_TEST(test_ssl_dup);
14878     ADD_ALL_TESTS(test_session_secret_cb, 2);
14879 #ifndef OPENSSL_NO_DH
14880     ADD_ALL_TESTS(test_set_tmp_dh, 11);
14881     ADD_ALL_TESTS(test_dh_auto, 7);
14882 #endif
14883 #endif
14884 #ifndef OSSL_NO_USABLE_TLS1_3
14885     ADD_TEST(test_sni_tls13);
14886     ADD_ALL_TESTS(test_ticket_lifetime, 2);
14887 #endif
14888     ADD_TEST(test_inherit_verify_param);
14889     ADD_TEST(test_set_alpn);
14890     ADD_TEST(test_set_verify_cert_store_ssl_ctx);
14891     ADD_TEST(test_set_verify_cert_store_ssl);
14892     ADD_ALL_TESTS(test_session_timeout, 1);
14893 #if !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
14894     ADD_ALL_TESTS(test_session_cache_overflow, 4);
14895 #endif
14896     ADD_TEST(test_load_dhfile);
14897 #ifndef OSSL_NO_USABLE_TLS1_3
14898     ADD_TEST(test_read_ahead_key_change);
14899     ADD_ALL_TESTS(test_tls13_record_padding, 6);
14900     ADD_TEST(test_tls13_unknown_extension);
14901 #endif
14902 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OSSL_NO_USABLE_TLS1_3)
14903     ADD_ALL_TESTS(test_serverinfo_custom, 4);
14904 #endif
14905 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
14906     ADD_ALL_TESTS(test_pipelining, 7);
14907 #endif
14908     ADD_ALL_TESTS(test_version, 6);
14909     ADD_TEST(test_rstate_string);
14910     ADD_ALL_TESTS(test_handshake_retry, 16);
14911     ADD_TEST(test_data_retry);
14912     ADD_ALL_TESTS(test_data_write_zero_no_retry, 2);
14913     ADD_ALL_TESTS(test_multi_resume, 5);
14914     ADD_ALL_TESTS(test_select_next_proto, OSSL_NELEM(next_proto_tests));
14915 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_NEXTPROTONEG)
14916     ADD_ALL_TESTS(test_npn, 5);
14917 #endif
14918     ADD_ALL_TESTS(test_alpn, 4);
14919 #if !defined(OSSL_NO_USABLE_TLS1_3)
14920     ADD_ALL_TESTS(test_quic_tls, 6);
14921     ADD_TEST(test_quic_tls_early_data);
14922 #endif
14923     ADD_ALL_TESTS(test_no_renegotiation, 2);
14924 #if defined(DO_SSL_TRACE_TEST)
14925     if (datadir != NULL)
14926         ADD_TEST(test_ssl_trace);
14927 #endif
14928     ADD_ALL_TESTS(test_ssl_set_groups_unsupported_keyshare, 2);
14929     ADD_ALL_TESTS(test_http_verbs, 3);
14930     return 1;
14931 
14932 err:
14933     OPENSSL_free(cert);
14934     OPENSSL_free(privkey);
14935     OPENSSL_free(cert2);
14936     OPENSSL_free(privkey2);
14937     return 0;
14938 }
14939 
14940 void cleanup_tests(void)
14941 {
14942 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DH)
14943     EVP_PKEY_free(tmp_dh_params);
14944 #endif
14945     OPENSSL_free(cert);
14946     OPENSSL_free(privkey);
14947     OPENSSL_free(cert2);
14948     OPENSSL_free(privkey2);
14949     OPENSSL_free(cert1024);
14950     OPENSSL_free(privkey1024);
14951     OPENSSL_free(cert3072);
14952     OPENSSL_free(privkey3072);
14953     OPENSSL_free(cert4096);
14954     OPENSSL_free(privkey4096);
14955     OPENSSL_free(cert8192);
14956     OPENSSL_free(privkey8192);
14957     bio_s_mempacket_test_free();
14958     bio_s_always_retry_free();
14959     bio_s_maybe_retry_free();
14960     bio_s_no_retry_zero_free();
14961     OSSL_PROVIDER_unload(defctxnull);
14962     OSSL_LIB_CTX_free(libctx);
14963 }
14964