xref: /freebsd/crypto/openssl/test/sslapitest.c (revision 1523ccfd9c8c254f7928143d31c305384b05fd11)
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 #ifndef OPENSSL_NO_TLS1_2
10824 static int test_ssl_dup(void)
10825 {
10826     SSL_CTX *cctx = NULL, *sctx = NULL;
10827     SSL *clientssl = NULL, *serverssl = NULL, *client2ssl = NULL;
10828     int testresult = 0;
10829     BIO *rbio = NULL, *wbio = NULL;
10830 
10831     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10832             TLS_client_method(),
10833             0,
10834             0,
10835             &sctx, &cctx, cert, privkey)))
10836         goto end;
10837 
10838     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10839             NULL, NULL)))
10840         goto end;
10841 
10842     if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION))
10843         || !TEST_true(SSL_set_max_proto_version(clientssl, TLS1_2_VERSION)))
10844         goto end;
10845 
10846     client2ssl = SSL_dup(clientssl);
10847     rbio = SSL_get_rbio(clientssl);
10848     if (!TEST_ptr(rbio)
10849         || !TEST_true(BIO_up_ref(rbio)))
10850         goto end;
10851     SSL_set0_rbio(client2ssl, rbio);
10852     rbio = NULL;
10853 
10854     wbio = SSL_get_wbio(clientssl);
10855     if (!TEST_ptr(wbio) || !TEST_true(BIO_up_ref(wbio)))
10856         goto end;
10857     SSL_set0_wbio(client2ssl, wbio);
10858     rbio = NULL;
10859 
10860     if (!TEST_ptr(client2ssl)
10861         /* Handshake not started so pointers should be different */
10862         || !TEST_ptr_ne(clientssl, client2ssl))
10863         goto end;
10864 
10865     if (!TEST_int_eq(SSL_get_min_proto_version(client2ssl), TLS1_2_VERSION)
10866         || !TEST_int_eq(SSL_get_max_proto_version(client2ssl), TLS1_2_VERSION))
10867         goto end;
10868 
10869     if (!TEST_true(create_ssl_connection(serverssl, client2ssl, SSL_ERROR_NONE)))
10870         goto end;
10871 
10872     SSL_free(clientssl);
10873     clientssl = SSL_dup(client2ssl);
10874     if (!TEST_ptr(clientssl)
10875         /* Handshake has finished so pointers should be the same */
10876         || !TEST_ptr_eq(clientssl, client2ssl))
10877         goto end;
10878 
10879     testresult = 1;
10880 
10881 end:
10882     SSL_free(serverssl);
10883     SSL_free(clientssl);
10884     SSL_free(client2ssl);
10885     SSL_CTX_free(sctx);
10886     SSL_CTX_free(cctx);
10887 
10888     return testresult;
10889 }
10890 
10891 static int secret_cb(SSL *s, void *secretin, int *secret_len,
10892     STACK_OF(SSL_CIPHER) *peer_ciphers,
10893     const SSL_CIPHER **cipher, void *arg)
10894 {
10895     int i;
10896     unsigned char *secret = secretin;
10897 
10898     /* Just use a fixed master secret */
10899     for (i = 0; i < *secret_len; i++)
10900         secret[i] = 0xff;
10901 
10902     /* We don't set a preferred cipher */
10903 
10904     return 1;
10905 }
10906 
10907 /*
10908  * Test the session_secret_cb which is designed for use with EAP-FAST
10909  */
10910 static int test_session_secret_cb(int idx)
10911 {
10912     SSL_CTX *cctx = NULL, *sctx = NULL;
10913     SSL *clientssl = NULL, *serverssl = NULL;
10914     SSL_SESSION *secret_sess = NULL, *server_sess = NULL;
10915     unsigned int sess_len;
10916     const unsigned char *sessid;
10917     int testresult = 0;
10918 
10919     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
10920             TLS_client_method(),
10921             0,
10922             0,
10923             &sctx, &cctx, cert, privkey)))
10924         goto end;
10925 
10926     /* Create an initial connection and save the session */
10927     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10928             NULL, NULL)))
10929         goto end;
10930 
10931     /* session_secret_cb does not support TLSv1.3 */
10932     if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION))
10933         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION)))
10934         goto end;
10935 
10936     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10937         goto end;
10938 
10939     if (!TEST_ptr(secret_sess = SSL_get1_session(clientssl)))
10940         goto end;
10941 
10942     shutdown_ssl_connection(serverssl, clientssl);
10943     serverssl = clientssl = NULL;
10944 
10945     /* Resume the earlier session */
10946     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
10947             NULL, NULL)))
10948         goto end;
10949 
10950     if (idx == 0) {
10951         /*
10952          * Normal case: no session id
10953          */
10954         if (!TEST_true(SSL_SESSION_set1_id(secret_sess, NULL, 0)))
10955             goto end;
10956     } else {
10957         /*
10958          * Set an explicit session id. Normally we don't support this, but we
10959          * can get away with it if we reset the session id later
10960          */
10961         if (!TEST_true(SSL_SESSION_set1_id(secret_sess, (unsigned char *)"sessionid", 9)))
10962             goto end;
10963     }
10964 
10965     if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION))
10966         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
10967         || !TEST_true(SSL_set_session_secret_cb(serverssl, secret_cb,
10968             NULL))
10969         || !TEST_true(SSL_set_session_secret_cb(clientssl, secret_cb,
10970             NULL))
10971         || !TEST_true(SSL_set_session(clientssl, secret_sess)))
10972         goto end;
10973 
10974     if (idx == 1) {
10975         /*
10976          * We just send the ClientHello here. We expect this to fail with
10977          * SSL_ERROR_WANT_READ
10978          */
10979         if (!TEST_int_le(SSL_connect(clientssl), 0))
10980             goto end;
10981         /* Reset the session id to avoid confusing the state machine */
10982         if (!TEST_true(SSL_SESSION_set1_id(secret_sess, NULL, 0)))
10983             goto end;
10984     }
10985     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
10986         goto end;
10987 
10988     /* Check that session resumption was successful */
10989     if (!TEST_true(SSL_session_reused(clientssl))
10990         || !TEST_true(SSL_session_reused(serverssl)))
10991         goto end;
10992 
10993     if (idx == 1) {
10994         server_sess = SSL_get1_session(serverssl);
10995         if (!TEST_ptr(server_sess))
10996             goto end;
10997         sessid = SSL_SESSION_get_id(server_sess, &sess_len);
10998 
10999         if (!TEST_mem_eq(sessid, sess_len, "sessionid", 9))
11000             goto end;
11001     }
11002     testresult = 1;
11003 
11004 end:
11005     SSL_SESSION_free(secret_sess);
11006     SSL_SESSION_free(server_sess);
11007     SSL_free(serverssl);
11008     SSL_free(clientssl);
11009     SSL_CTX_free(sctx);
11010     SSL_CTX_free(cctx);
11011 
11012     return testresult;
11013 }
11014 
11015 #ifndef OPENSSL_NO_DH
11016 
11017 static EVP_PKEY *tmp_dh_params = NULL;
11018 
11019 /* Helper function for the test_set_tmp_dh() tests */
11020 static EVP_PKEY *get_tmp_dh_params(void)
11021 {
11022     if (tmp_dh_params == NULL) {
11023         BIGNUM *p = NULL;
11024         OSSL_PARAM_BLD *tmpl = NULL;
11025         EVP_PKEY_CTX *pctx = NULL;
11026         OSSL_PARAM *params = NULL;
11027         EVP_PKEY *dhpkey = NULL;
11028 
11029         p = BN_get_rfc3526_prime_2048(NULL);
11030         if (!TEST_ptr(p))
11031             goto end;
11032 
11033         pctx = EVP_PKEY_CTX_new_from_name(libctx, "DH", NULL);
11034         if (!TEST_ptr(pctx)
11035             || !TEST_int_eq(EVP_PKEY_fromdata_init(pctx), 1))
11036             goto end;
11037 
11038         tmpl = OSSL_PARAM_BLD_new();
11039         if (!TEST_ptr(tmpl)
11040             || !TEST_true(OSSL_PARAM_BLD_push_BN(tmpl,
11041                 OSSL_PKEY_PARAM_FFC_P,
11042                 p))
11043             || !TEST_true(OSSL_PARAM_BLD_push_uint(tmpl,
11044                 OSSL_PKEY_PARAM_FFC_G,
11045                 2)))
11046             goto end;
11047 
11048         params = OSSL_PARAM_BLD_to_param(tmpl);
11049         if (!TEST_ptr(params)
11050             || !TEST_int_eq(EVP_PKEY_fromdata(pctx, &dhpkey,
11051                                 EVP_PKEY_KEY_PARAMETERS,
11052                                 params),
11053                 1))
11054             goto end;
11055 
11056         tmp_dh_params = dhpkey;
11057     end:
11058         BN_free(p);
11059         EVP_PKEY_CTX_free(pctx);
11060         OSSL_PARAM_BLD_free(tmpl);
11061         OSSL_PARAM_free(params);
11062     }
11063 
11064     if (tmp_dh_params != NULL && !EVP_PKEY_up_ref(tmp_dh_params))
11065         return NULL;
11066 
11067     return tmp_dh_params;
11068 }
11069 
11070 #ifndef OPENSSL_NO_DEPRECATED_3_0
11071 /* Callback used by test_set_tmp_dh() */
11072 static DH *tmp_dh_callback(SSL *s, int is_export, int keylen)
11073 {
11074     EVP_PKEY *dhpkey = get_tmp_dh_params();
11075     DH *ret = NULL;
11076 
11077     if (!TEST_ptr(dhpkey))
11078         return NULL;
11079 
11080     /*
11081      * libssl does not free the returned DH, so we free it now knowing that even
11082      * after we free dhpkey, there will still be a reference to the owning
11083      * EVP_PKEY in tmp_dh_params, and so the DH object will live for the length
11084      * of time we need it for.
11085      */
11086     ret = EVP_PKEY_get1_DH(dhpkey);
11087     DH_free(ret);
11088 
11089     EVP_PKEY_free(dhpkey);
11090 
11091     return ret;
11092 }
11093 #endif
11094 
11095 /*
11096  * Test the various methods for setting temporary DH parameters
11097  *
11098  * Test  0: Default (no auto) setting
11099  * Test  1: Explicit SSL_CTX auto off
11100  * Test  2: Explicit SSL auto off
11101  * Test  3: Explicit SSL_CTX auto on
11102  * Test  4: Explicit SSL auto on
11103  * Test  5: Explicit SSL_CTX auto off, custom DH params via EVP_PKEY
11104  * Test  6: Explicit SSL auto off, custom DH params via EVP_PKEY
11105  *
11106  * The following are testing deprecated APIs, so we only run them if available
11107  * Test  7: Explicit SSL_CTX auto off, custom DH params via DH
11108  * Test  8: Explicit SSL auto off, custom DH params via DH
11109  * Test  9: Explicit SSL_CTX auto off, custom DH params via callback
11110  * Test 10: Explicit SSL auto off, custom DH params via callback
11111  */
11112 static int test_set_tmp_dh(int idx)
11113 {
11114     SSL_CTX *cctx = NULL, *sctx = NULL;
11115     SSL *clientssl = NULL, *serverssl = NULL;
11116     int testresult = 0;
11117     int dhauto = (idx == 3 || idx == 4) ? 1 : 0;
11118     int expected = (idx <= 2) ? 0 : 1;
11119     EVP_PKEY *dhpkey = NULL;
11120 #ifndef OPENSSL_NO_DEPRECATED_3_0
11121     DH *dh = NULL;
11122 #else
11123 
11124     if (idx >= 7)
11125         return 1;
11126 #endif
11127 
11128     if (idx >= 5 && idx <= 8) {
11129         dhpkey = get_tmp_dh_params();
11130         if (!TEST_ptr(dhpkey))
11131             goto end;
11132     }
11133 #ifndef OPENSSL_NO_DEPRECATED_3_0
11134     if (idx == 7 || idx == 8) {
11135         dh = EVP_PKEY_get1_DH(dhpkey);
11136         if (!TEST_ptr(dh))
11137             goto end;
11138     }
11139 #endif
11140 
11141     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11142             TLS_client_method(),
11143             0,
11144             0,
11145             &sctx, &cctx, cert, privkey)))
11146         goto end;
11147 
11148     if ((idx & 1) == 1) {
11149         if (!TEST_true(SSL_CTX_set_dh_auto(sctx, dhauto)))
11150             goto end;
11151     }
11152 
11153     if (idx == 5) {
11154         if (!TEST_true(SSL_CTX_set0_tmp_dh_pkey(sctx, dhpkey)))
11155             goto end;
11156         dhpkey = NULL;
11157     }
11158 #ifndef OPENSSL_NO_DEPRECATED_3_0
11159     else if (idx == 7) {
11160         if (!TEST_true(SSL_CTX_set_tmp_dh(sctx, dh)))
11161             goto end;
11162     } else if (idx == 9) {
11163         SSL_CTX_set_tmp_dh_callback(sctx, tmp_dh_callback);
11164     }
11165 #endif
11166 
11167     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11168             NULL, NULL)))
11169         goto end;
11170 
11171     if ((idx & 1) == 0 && idx != 0) {
11172         if (!TEST_true(SSL_set_dh_auto(serverssl, dhauto)))
11173             goto end;
11174     }
11175     if (idx == 6) {
11176         if (!TEST_true(SSL_set0_tmp_dh_pkey(serverssl, dhpkey)))
11177             goto end;
11178         dhpkey = NULL;
11179     }
11180 #ifndef OPENSSL_NO_DEPRECATED_3_0
11181     else if (idx == 8) {
11182         if (!TEST_true(SSL_set_tmp_dh(serverssl, dh)))
11183             goto end;
11184     } else if (idx == 10) {
11185         SSL_set_tmp_dh_callback(serverssl, tmp_dh_callback);
11186     }
11187 #endif
11188 
11189     if (!TEST_true(SSL_set_min_proto_version(serverssl, TLS1_2_VERSION))
11190         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
11191         || !TEST_true(SSL_set_cipher_list(serverssl, "DHE-RSA-AES128-SHA")))
11192         goto end;
11193 
11194     /*
11195      * If autoon then we should succeed. Otherwise we expect failure because
11196      * there are no parameters
11197      */
11198     if (!TEST_int_eq(create_ssl_connection(serverssl, clientssl,
11199                          SSL_ERROR_NONE),
11200             expected))
11201         goto end;
11202 
11203     testresult = 1;
11204 
11205 end:
11206 #ifndef OPENSSL_NO_DEPRECATED_3_0
11207     DH_free(dh);
11208 #endif
11209     SSL_free(serverssl);
11210     SSL_free(clientssl);
11211     SSL_CTX_free(sctx);
11212     SSL_CTX_free(cctx);
11213     EVP_PKEY_free(dhpkey);
11214 
11215     return testresult;
11216 }
11217 
11218 /*
11219  * Test the auto DH keys are appropriately sized
11220  */
11221 static int test_dh_auto(int idx)
11222 {
11223     SSL_CTX *cctx = SSL_CTX_new_ex(libctx, NULL, TLS_client_method());
11224     SSL_CTX *sctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11225     SSL *clientssl = NULL, *serverssl = NULL;
11226     int testresult = 0;
11227     EVP_PKEY *tmpkey = NULL;
11228     char *thiscert = NULL, *thiskey = NULL;
11229     size_t expdhsize = 0;
11230     const char *ciphersuite = "DHE-RSA-AES128-SHA";
11231 
11232     if (!TEST_ptr(sctx) || !TEST_ptr(cctx))
11233         goto end;
11234 
11235     switch (idx) {
11236     case 0:
11237         /* The FIPS provider doesn't support this DH size - so we ignore it */
11238         if (is_fips) {
11239             testresult = 1;
11240             goto end;
11241         }
11242         thiscert = cert1024;
11243         thiskey = privkey1024;
11244         expdhsize = 1024;
11245         SSL_CTX_set_security_level(sctx, 1);
11246         SSL_CTX_set_security_level(cctx, 1);
11247         break;
11248     case 1:
11249         /* 2048 bit prime */
11250         thiscert = cert;
11251         thiskey = privkey;
11252         expdhsize = 2048;
11253         break;
11254     case 2:
11255         thiscert = cert3072;
11256         thiskey = privkey3072;
11257         expdhsize = 3072;
11258         break;
11259     case 3:
11260         thiscert = cert4096;
11261         thiskey = privkey4096;
11262         expdhsize = 4096;
11263         break;
11264     case 4:
11265         thiscert = cert8192;
11266         thiskey = privkey8192;
11267         expdhsize = 8192;
11268         break;
11269     /* No certificate cases */
11270     case 5:
11271         /* The FIPS provider doesn't support this DH size - so we ignore it */
11272         if (is_fips) {
11273             testresult = 1;
11274             goto end;
11275         }
11276         ciphersuite = "ADH-AES128-SHA256:@SECLEVEL=0";
11277         expdhsize = 1024;
11278         break;
11279     case 6:
11280         ciphersuite = "ADH-AES256-SHA256:@SECLEVEL=0";
11281         expdhsize = 3072;
11282         break;
11283     default:
11284         TEST_error("Invalid text index");
11285         goto end;
11286     }
11287 
11288     if (!TEST_true(create_ssl_ctx_pair(libctx, NULL,
11289             NULL,
11290             0,
11291             0,
11292             &sctx, &cctx, thiscert, thiskey)))
11293         goto end;
11294 
11295     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
11296             NULL, NULL)))
11297         goto end;
11298 
11299     if (!TEST_true(SSL_set_dh_auto(serverssl, 1))
11300         || !TEST_true(SSL_set_min_proto_version(serverssl, TLS1_2_VERSION))
11301         || !TEST_true(SSL_set_max_proto_version(serverssl, TLS1_2_VERSION))
11302         || !TEST_true(SSL_set_cipher_list(serverssl, ciphersuite))
11303         || !TEST_true(SSL_set_cipher_list(clientssl, ciphersuite)))
11304         goto end;
11305 
11306     /*
11307      * Send the server's first flight. At this point the server has created the
11308      * temporary DH key but hasn't finished using it yet. Once used it is
11309      * removed, so we cannot test it.
11310      */
11311     if (!TEST_int_le(SSL_connect(clientssl), 0)
11312         || !TEST_int_le(SSL_accept(serverssl), 0))
11313         goto end;
11314 
11315     if (!TEST_int_gt(SSL_get_tmp_key(serverssl, &tmpkey), 0))
11316         goto end;
11317     if (!TEST_size_t_eq(EVP_PKEY_get_bits(tmpkey), expdhsize))
11318         goto end;
11319 
11320     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11321         goto end;
11322 
11323     testresult = 1;
11324 
11325 end:
11326     SSL_free(serverssl);
11327     SSL_free(clientssl);
11328     SSL_CTX_free(sctx);
11329     SSL_CTX_free(cctx);
11330     EVP_PKEY_free(tmpkey);
11331 
11332     return testresult;
11333 }
11334 #endif /* OPENSSL_NO_DH */
11335 #endif /* OPENSSL_NO_TLS1_2 */
11336 
11337 #ifndef OSSL_NO_USABLE_TLS1_3
11338 /*
11339  * Test that setting an SNI callback works with TLSv1.3. Specifically we check
11340  * that it works even without a certificate configured for the original
11341  * SSL_CTX
11342  */
11343 static int test_sni_tls13(void)
11344 {
11345     SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
11346     SSL *clientssl = NULL, *serverssl = NULL;
11347     int testresult = 0;
11348 
11349     /* Reset callback counter */
11350     snicb = 0;
11351 
11352     /* Create an initial SSL_CTX with no certificate configured */
11353     sctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11354     if (!TEST_ptr(sctx))
11355         goto end;
11356     /* Require TLSv1.3 as a minimum */
11357     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11358             TLS_client_method(), TLS1_3_VERSION, 0,
11359             &sctx2, &cctx, cert, privkey)))
11360         goto end;
11361 
11362     /* Set up SNI */
11363     if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
11364         || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
11365         goto end;
11366 
11367     /*
11368      * Connection should still succeed because the final SSL_CTX has the right
11369      * certificates configured.
11370      */
11371     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11372             &clientssl, NULL, NULL))
11373         || !TEST_true(create_ssl_connection(serverssl, clientssl,
11374             SSL_ERROR_NONE)))
11375         goto end;
11376 
11377     /* We should have had the SNI callback called exactly once */
11378     if (!TEST_int_eq(snicb, 1))
11379         goto end;
11380 
11381     testresult = 1;
11382 
11383 end:
11384     SSL_free(serverssl);
11385     SSL_free(clientssl);
11386     SSL_CTX_free(sctx2);
11387     SSL_CTX_free(sctx);
11388     SSL_CTX_free(cctx);
11389     return testresult;
11390 }
11391 
11392 /*
11393  * Test that the lifetime hint of a TLSv1.3 ticket is no more than 1 week
11394  * 0 = TLSv1.2
11395  * 1 = TLSv1.3
11396  */
11397 static int test_ticket_lifetime(int idx)
11398 {
11399     SSL_CTX *cctx = NULL, *sctx = NULL;
11400     SSL *clientssl = NULL, *serverssl = NULL;
11401     int testresult = 0;
11402     int version = TLS1_3_VERSION;
11403 
11404 #define ONE_WEEK_SEC (7 * 24 * 60 * 60)
11405 #define TWO_WEEK_SEC (2 * ONE_WEEK_SEC)
11406 
11407     if (idx == 0) {
11408 #ifdef OPENSSL_NO_TLS1_2
11409         return TEST_skip("TLS 1.2 is disabled.");
11410 #else
11411         version = TLS1_2_VERSION;
11412 #endif
11413     }
11414 
11415     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11416             TLS_client_method(), version, version,
11417             &sctx, &cctx, cert, privkey)))
11418         goto end;
11419 
11420     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11421             &clientssl, NULL, NULL)))
11422         goto end;
11423 
11424     /*
11425      * Set the timeout to be more than 1 week
11426      * make sure the returned value is the default
11427      */
11428     if (!TEST_long_eq(SSL_CTX_set_timeout(sctx, TWO_WEEK_SEC),
11429             SSL_get_default_timeout(serverssl)))
11430         goto end;
11431 
11432     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11433         goto end;
11434 
11435     if (idx == 0) {
11436         /* TLSv1.2 uses the set value */
11437         if (!TEST_ulong_eq(SSL_SESSION_get_ticket_lifetime_hint(SSL_get_session(clientssl)), TWO_WEEK_SEC))
11438             goto end;
11439     } else {
11440         /* TLSv1.3 uses the limited value */
11441         if (!TEST_ulong_le(SSL_SESSION_get_ticket_lifetime_hint(SSL_get_session(clientssl)), ONE_WEEK_SEC))
11442             goto end;
11443     }
11444     testresult = 1;
11445 
11446 end:
11447     SSL_free(serverssl);
11448     SSL_free(clientssl);
11449     SSL_CTX_free(sctx);
11450     SSL_CTX_free(cctx);
11451     return testresult;
11452 }
11453 #endif
11454 /*
11455  * Test that setting an ALPN does not violate RFC
11456  */
11457 static int test_set_alpn(void)
11458 {
11459     SSL_CTX *ctx = NULL;
11460     SSL *ssl = NULL;
11461     int testresult = 0;
11462 
11463     unsigned char bad0[] = { 0x00, 'b', 'a', 'd' };
11464     unsigned char good[] = { 0x04, 'g', 'o', 'o', 'd' };
11465     unsigned char bad1[] = { 0x01, 'b', 'a', 'd' };
11466     unsigned char bad2[] = { 0x03, 'b', 'a', 'd', 0x00 };
11467     unsigned char bad3[] = { 0x03, 'b', 'a', 'd', 0x01, 'b', 'a', 'd' };
11468     unsigned char bad4[] = { 0x03, 'b', 'a', 'd', 0x06, 'b', 'a', 'd' };
11469 
11470     /* Create an initial SSL_CTX with no certificate configured */
11471     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11472     if (!TEST_ptr(ctx))
11473         goto end;
11474 
11475     /* the set_alpn functions return 0 (false) on success, non-zero (true) on failure */
11476     if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, NULL, 2)))
11477         goto end;
11478     if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, good, 0)))
11479         goto end;
11480     if (!TEST_false(SSL_CTX_set_alpn_protos(ctx, good, sizeof(good))))
11481         goto end;
11482     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, good, 1)))
11483         goto end;
11484     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad0, sizeof(bad0))))
11485         goto end;
11486     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad1, sizeof(bad1))))
11487         goto end;
11488     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad2, sizeof(bad2))))
11489         goto end;
11490     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad3, sizeof(bad3))))
11491         goto end;
11492     if (!TEST_true(SSL_CTX_set_alpn_protos(ctx, bad4, sizeof(bad4))))
11493         goto end;
11494 
11495     ssl = SSL_new(ctx);
11496     if (!TEST_ptr(ssl))
11497         goto end;
11498 
11499     if (!TEST_false(SSL_set_alpn_protos(ssl, NULL, 2)))
11500         goto end;
11501     if (!TEST_false(SSL_set_alpn_protos(ssl, good, 0)))
11502         goto end;
11503     if (!TEST_false(SSL_set_alpn_protos(ssl, good, sizeof(good))))
11504         goto end;
11505     if (!TEST_true(SSL_set_alpn_protos(ssl, good, 1)))
11506         goto end;
11507     if (!TEST_true(SSL_set_alpn_protos(ssl, bad0, sizeof(bad0))))
11508         goto end;
11509     if (!TEST_true(SSL_set_alpn_protos(ssl, bad1, sizeof(bad1))))
11510         goto end;
11511     if (!TEST_true(SSL_set_alpn_protos(ssl, bad2, sizeof(bad2))))
11512         goto end;
11513     if (!TEST_true(SSL_set_alpn_protos(ssl, bad3, sizeof(bad3))))
11514         goto end;
11515     if (!TEST_true(SSL_set_alpn_protos(ssl, bad4, sizeof(bad4))))
11516         goto end;
11517 
11518     testresult = 1;
11519 
11520 end:
11521     SSL_free(ssl);
11522     SSL_CTX_free(ctx);
11523     return testresult;
11524 }
11525 
11526 /*
11527  * Test SSL_CTX_set1_verify/chain_cert_store and SSL_CTX_get_verify/chain_cert_store.
11528  */
11529 static int test_set_verify_cert_store_ssl_ctx(void)
11530 {
11531     SSL_CTX *ctx = NULL;
11532     int testresult = 0;
11533     X509_STORE *store = NULL, *new_store = NULL,
11534                *cstore = NULL, *new_cstore = NULL;
11535 
11536     /* Create an initial SSL_CTX. */
11537     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11538     if (!TEST_ptr(ctx))
11539         goto end;
11540 
11541     /* Retrieve verify store pointer. */
11542     if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
11543         goto end;
11544 
11545     /* Retrieve chain store pointer. */
11546     if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
11547         goto end;
11548 
11549     /* We haven't set any yet, so this should be NULL. */
11550     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
11551         goto end;
11552 
11553     /* Create stores. We use separate stores so pointers are different. */
11554     new_store = X509_STORE_new();
11555     if (!TEST_ptr(new_store))
11556         goto end;
11557 
11558     new_cstore = X509_STORE_new();
11559     if (!TEST_ptr(new_cstore))
11560         goto end;
11561 
11562     /* Set stores. */
11563     if (!TEST_true(SSL_CTX_set1_verify_cert_store(ctx, new_store)))
11564         goto end;
11565 
11566     if (!TEST_true(SSL_CTX_set1_chain_cert_store(ctx, new_cstore)))
11567         goto end;
11568 
11569     /* Should be able to retrieve the same pointer. */
11570     if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
11571         goto end;
11572 
11573     if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
11574         goto end;
11575 
11576     if (!TEST_ptr_eq(store, new_store) || !TEST_ptr_eq(cstore, new_cstore))
11577         goto end;
11578 
11579     /* Should be able to unset again. */
11580     if (!TEST_true(SSL_CTX_set1_verify_cert_store(ctx, NULL)))
11581         goto end;
11582 
11583     if (!TEST_true(SSL_CTX_set1_chain_cert_store(ctx, NULL)))
11584         goto end;
11585 
11586     /* Should now be NULL. */
11587     if (!TEST_true(SSL_CTX_get0_verify_cert_store(ctx, &store)))
11588         goto end;
11589 
11590     if (!TEST_true(SSL_CTX_get0_chain_cert_store(ctx, &cstore)))
11591         goto end;
11592 
11593     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
11594         goto end;
11595 
11596     testresult = 1;
11597 
11598 end:
11599     X509_STORE_free(new_store);
11600     X509_STORE_free(new_cstore);
11601     SSL_CTX_free(ctx);
11602     return testresult;
11603 }
11604 
11605 /*
11606  * Test SSL_set1_verify/chain_cert_store and SSL_get_verify/chain_cert_store.
11607  */
11608 static int test_set_verify_cert_store_ssl(void)
11609 {
11610     SSL_CTX *ctx = NULL;
11611     SSL *ssl = NULL;
11612     int testresult = 0;
11613     X509_STORE *store = NULL, *new_store = NULL,
11614                *cstore = NULL, *new_cstore = NULL;
11615 
11616     /* Create an initial SSL_CTX. */
11617     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11618     if (!TEST_ptr(ctx))
11619         goto end;
11620 
11621     /* Create an SSL object. */
11622     ssl = SSL_new(ctx);
11623     if (!TEST_ptr(ssl))
11624         goto end;
11625 
11626     /* Retrieve verify store pointer. */
11627     if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
11628         goto end;
11629 
11630     /* Retrieve chain store pointer. */
11631     if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
11632         goto end;
11633 
11634     /* We haven't set any yet, so this should be NULL. */
11635     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
11636         goto end;
11637 
11638     /* Create stores. We use separate stores so pointers are different. */
11639     new_store = X509_STORE_new();
11640     if (!TEST_ptr(new_store))
11641         goto end;
11642 
11643     new_cstore = X509_STORE_new();
11644     if (!TEST_ptr(new_cstore))
11645         goto end;
11646 
11647     /* Set stores. */
11648     if (!TEST_true(SSL_set1_verify_cert_store(ssl, new_store)))
11649         goto end;
11650 
11651     if (!TEST_true(SSL_set1_chain_cert_store(ssl, new_cstore)))
11652         goto end;
11653 
11654     /* Should be able to retrieve the same pointer. */
11655     if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
11656         goto end;
11657 
11658     if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
11659         goto end;
11660 
11661     if (!TEST_ptr_eq(store, new_store) || !TEST_ptr_eq(cstore, new_cstore))
11662         goto end;
11663 
11664     /* Should be able to unset again. */
11665     if (!TEST_true(SSL_set1_verify_cert_store(ssl, NULL)))
11666         goto end;
11667 
11668     if (!TEST_true(SSL_set1_chain_cert_store(ssl, NULL)))
11669         goto end;
11670 
11671     /* Should now be NULL. */
11672     if (!TEST_true(SSL_get0_verify_cert_store(ssl, &store)))
11673         goto end;
11674 
11675     if (!TEST_true(SSL_get0_chain_cert_store(ssl, &cstore)))
11676         goto end;
11677 
11678     if (!TEST_ptr_null(store) || !TEST_ptr_null(cstore))
11679         goto end;
11680 
11681     testresult = 1;
11682 
11683 end:
11684     X509_STORE_free(new_store);
11685     X509_STORE_free(new_cstore);
11686     SSL_free(ssl);
11687     SSL_CTX_free(ctx);
11688     return testresult;
11689 }
11690 
11691 static int test_inherit_verify_param(void)
11692 {
11693     int testresult = 0;
11694 
11695     SSL_CTX *ctx = NULL;
11696     X509_VERIFY_PARAM *cp = NULL;
11697     SSL *ssl = NULL;
11698     X509_VERIFY_PARAM *sp = NULL;
11699     int hostflags = X509_CHECK_FLAG_NEVER_CHECK_SUBJECT;
11700 
11701     ctx = SSL_CTX_new_ex(libctx, NULL, TLS_server_method());
11702     if (!TEST_ptr(ctx))
11703         goto end;
11704 
11705     cp = SSL_CTX_get0_param(ctx);
11706     if (!TEST_ptr(cp))
11707         goto end;
11708     if (!TEST_int_eq(X509_VERIFY_PARAM_get_hostflags(cp), 0))
11709         goto end;
11710 
11711     X509_VERIFY_PARAM_set_hostflags(cp, hostflags);
11712 
11713     ssl = SSL_new(ctx);
11714     if (!TEST_ptr(ssl))
11715         goto end;
11716 
11717     sp = SSL_get0_param(ssl);
11718     if (!TEST_ptr(sp))
11719         goto end;
11720     if (!TEST_int_eq(X509_VERIFY_PARAM_get_hostflags(sp), hostflags))
11721         goto end;
11722 
11723     testresult = 1;
11724 
11725 end:
11726     SSL_free(ssl);
11727     SSL_CTX_free(ctx);
11728 
11729     return testresult;
11730 }
11731 
11732 static int test_load_dhfile(void)
11733 {
11734 #ifndef OPENSSL_NO_DH
11735     int testresult = 0;
11736 
11737     SSL_CTX *ctx = NULL;
11738     SSL_CONF_CTX *cctx = NULL;
11739 
11740     if (dhfile == NULL)
11741         return 1;
11742 
11743     if (!TEST_ptr(ctx = SSL_CTX_new_ex(libctx, NULL, TLS_client_method()))
11744         || !TEST_ptr(cctx = SSL_CONF_CTX_new()))
11745         goto end;
11746 
11747     SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);
11748     SSL_CONF_CTX_set_flags(cctx,
11749         SSL_CONF_FLAG_CERTIFICATE
11750             | SSL_CONF_FLAG_SERVER
11751             | SSL_CONF_FLAG_FILE);
11752 
11753     if (!TEST_int_eq(SSL_CONF_cmd(cctx, "DHParameters", dhfile), 2))
11754         goto end;
11755 
11756     testresult = 1;
11757 end:
11758     SSL_CONF_CTX_free(cctx);
11759     SSL_CTX_free(ctx);
11760 
11761     return testresult;
11762 #else
11763     return TEST_skip("DH not supported by this build");
11764 #endif
11765 }
11766 
11767 #ifndef OSSL_NO_USABLE_TLS1_3
11768 /* Test that read_ahead works across a key change */
11769 static int test_read_ahead_key_change(void)
11770 {
11771     SSL_CTX *cctx = NULL, *sctx = NULL;
11772     SSL *clientssl = NULL, *serverssl = NULL;
11773     int testresult = 0;
11774     char *msg = "Hello World";
11775     size_t written, readbytes;
11776     char buf[80];
11777     int i;
11778 
11779     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11780             TLS_client_method(), TLS1_3_VERSION, 0,
11781             &sctx, &cctx, cert, privkey)))
11782         goto end;
11783 
11784     SSL_CTX_set_read_ahead(sctx, 1);
11785 
11786     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11787             &clientssl, NULL, NULL)))
11788         goto end;
11789 
11790     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11791         goto end;
11792 
11793     /* Write some data, send a key update, write more data */
11794     if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
11795         || !TEST_size_t_eq(written, strlen(msg)))
11796         goto end;
11797 
11798     if (!TEST_true(SSL_key_update(clientssl, SSL_KEY_UPDATE_NOT_REQUESTED)))
11799         goto end;
11800 
11801     if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
11802         || !TEST_size_t_eq(written, strlen(msg)))
11803         goto end;
11804 
11805     /*
11806      * Since read_ahead is on the first read below should read the record with
11807      * the first app data, the second record with the key update message, and
11808      * the third record with the app data all in one go. We should be able to
11809      * still process the read_ahead data correctly even though it crosses
11810      * epochs
11811      */
11812     for (i = 0; i < 2; i++) {
11813         if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf) - 1,
11814                 &readbytes)))
11815             goto end;
11816 
11817         buf[readbytes] = '\0';
11818         if (!TEST_str_eq(buf, msg))
11819             goto end;
11820     }
11821 
11822     testresult = 1;
11823 
11824 end:
11825     SSL_free(serverssl);
11826     SSL_free(clientssl);
11827     SSL_CTX_free(sctx);
11828     SSL_CTX_free(cctx);
11829     return testresult;
11830 }
11831 
11832 static size_t record_pad_cb(SSL *s, int type, size_t len, void *arg)
11833 {
11834     int *called = arg;
11835 
11836     switch ((*called)++) {
11837     case 0:
11838         /* Add some padding to first record */
11839         return 512;
11840     case 1:
11841         /* Maximally pad the second record */
11842         return SSL3_RT_MAX_PLAIN_LENGTH - len;
11843     case 2:
11844         /*
11845          * Exceeding the maximum padding should be fine. It should just pad to
11846          * the maximum anyway
11847          */
11848         return SSL3_RT_MAX_PLAIN_LENGTH + 1 - len;
11849     case 3:
11850         /*
11851          * Very large padding should also be ok. Should just pad to the maximum
11852          * allowed
11853          */
11854         return SIZE_MAX;
11855     default:
11856         return 0;
11857     }
11858 }
11859 
11860 /*
11861  * Test that setting record padding in TLSv1.3 works as expected
11862  * Test 0: Record padding callback on the SSL_CTX
11863  * Test 1: Record padding callback on the SSL
11864  * Test 2: Record block padding on the SSL_CTX
11865  * Test 3: Record block padding on the SSL
11866  * Test 4: Extended record block padding on the SSL_CTX
11867  * Test 5: Extended record block padding on the SSL
11868  */
11869 static int test_tls13_record_padding(int idx)
11870 {
11871     SSL_CTX *cctx = NULL, *sctx = NULL;
11872     SSL *clientssl = NULL, *serverssl = NULL;
11873     int testresult = 0;
11874     char *msg = "Hello World";
11875     size_t written, readbytes;
11876     char buf[80];
11877     int i;
11878     int called = 0;
11879 
11880     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
11881             TLS_client_method(), TLS1_3_VERSION, 0,
11882             &sctx, &cctx, cert, privkey)))
11883         goto end;
11884 
11885     if (idx == 0) {
11886         SSL_CTX_set_record_padding_callback(cctx, record_pad_cb);
11887         SSL_CTX_set_record_padding_callback_arg(cctx, &called);
11888         if (!TEST_ptr_eq(SSL_CTX_get_record_padding_callback_arg(cctx), &called))
11889             goto end;
11890     } else if (idx == 2) {
11891         /* Exceeding the max plain length should fail */
11892         if (!TEST_false(SSL_CTX_set_block_padding(cctx,
11893                 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
11894             goto end;
11895         if (!TEST_true(SSL_CTX_set_block_padding(cctx, 512)))
11896             goto end;
11897     } else if (idx == 4) {
11898         /* pad only handshake/alert messages */
11899         if (!TEST_true(SSL_CTX_set_block_padding_ex(cctx, 0, 512)))
11900             goto end;
11901     }
11902 
11903     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
11904             &clientssl, NULL, NULL)))
11905         goto end;
11906 
11907     if (idx == 1) {
11908         SSL_set_record_padding_callback(clientssl, record_pad_cb);
11909         SSL_set_record_padding_callback_arg(clientssl, &called);
11910         if (!TEST_ptr_eq(SSL_get_record_padding_callback_arg(clientssl), &called))
11911             goto end;
11912     } else if (idx == 3) {
11913         /* Exceeding the max plain length should fail */
11914         if (!TEST_false(SSL_set_block_padding(clientssl,
11915                 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
11916             goto end;
11917         if (!TEST_true(SSL_set_block_padding(clientssl, 512)))
11918             goto end;
11919     } else if (idx == 5) {
11920         /* Exceeding the max plain length should fail */
11921         if (!TEST_false(SSL_set_block_padding_ex(clientssl, 0,
11922                 SSL3_RT_MAX_PLAIN_LENGTH + 1)))
11923             goto end;
11924         /* pad server and client handshake only */
11925         if (!TEST_true(SSL_set_block_padding_ex(clientssl, 0, 512)))
11926             goto end;
11927         if (!TEST_true(SSL_set_block_padding_ex(serverssl, 0, 512)))
11928             goto end;
11929     }
11930 
11931     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
11932         goto end;
11933 
11934     called = 0;
11935     /*
11936      * Write some data, then check we can read it. Do this four times to check
11937      * we can continue to write and read padded data after the initial record
11938      * padding has been added. We don't actually check that the padding has
11939      * been applied to the record - just that we can continue to communicate
11940      * normally and that the callback has been called (if appropriate).
11941      */
11942     for (i = 0; i < 4; i++) {
11943         if (!TEST_true(SSL_write_ex(clientssl, msg, strlen(msg), &written))
11944             || !TEST_size_t_eq(written, strlen(msg)))
11945             goto end;
11946 
11947         if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf) - 1,
11948                 &readbytes))
11949             || !TEST_size_t_eq(written, readbytes))
11950             goto end;
11951 
11952         buf[readbytes] = '\0';
11953         if (!TEST_str_eq(buf, msg))
11954             goto end;
11955     }
11956 
11957     if ((idx == 0 || idx == 1) && !TEST_int_eq(called, 4))
11958         goto end;
11959 
11960     testresult = 1;
11961 end:
11962     SSL_free(serverssl);
11963     SSL_free(clientssl);
11964     SSL_CTX_free(sctx);
11965     SSL_CTX_free(cctx);
11966     return testresult;
11967 }
11968 #endif /* OSSL_NO_USABLE_TLS1_3 */
11969 
11970 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
11971 /*
11972  * Test TLSv1.2 with a pipeline capable cipher. TLSv1.3 and DTLS do not
11973  * support this yet. The only pipeline capable cipher that we have is in the
11974  * dasync engine (providers don't support this yet), so we have to use
11975  * deprecated APIs for this test.
11976  *
11977  * Test 0: Client has pipelining enabled, server does not
11978  * Test 1: Server has pipelining enabled, client does not
11979  * Test 2: Client has pipelining enabled, server does not: not enough data to
11980  *         fill all the pipelines
11981  * Test 3: Client has pipelining enabled, server does not: not enough data to
11982  *         fill all the pipelines by more than a full pipeline's worth
11983  * Test 4: Client has pipelining enabled, server does not: more data than all
11984  *         the available pipelines can take
11985  * Test 5: Client has pipelining enabled, server does not: Maximum size pipeline
11986  * Test 6: Repeat of test 0, but the engine is loaded late (after the SSL_CTX
11987  *         is created)
11988  */
11989 static int test_pipelining(int idx)
11990 {
11991     SSL_CTX *cctx = NULL, *sctx = NULL;
11992     SSL *clientssl = NULL, *serverssl = NULL, *peera, *peerb;
11993     int testresult = 0, numreads;
11994     /* A 55 byte message */
11995     unsigned char *msg = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123";
11996     size_t written, readbytes, offset, msglen, fragsize = 10, numpipes = 5;
11997     size_t expectedreads;
11998     unsigned char *buf = NULL;
11999     ENGINE *e = NULL;
12000 
12001     if (idx != 6) {
12002         e = load_dasync();
12003         if (e == NULL)
12004             return 0;
12005     }
12006 
12007     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12008             TLS_client_method(), 0,
12009             TLS1_2_VERSION, &sctx, &cctx, cert,
12010             privkey)))
12011         goto end;
12012 
12013     if (idx == 6) {
12014         e = load_dasync();
12015         if (e == NULL)
12016             goto end;
12017         /* Now act like test 0 */
12018         idx = 0;
12019     }
12020 
12021     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12022             &clientssl, NULL, NULL)))
12023         goto end;
12024 
12025     if (!TEST_true(SSL_set_cipher_list(clientssl, "AES128-SHA")))
12026         goto end;
12027 
12028     /* peera is always configured for pipelining, while peerb is not. */
12029     if (idx == 1) {
12030         peera = serverssl;
12031         peerb = clientssl;
12032 
12033     } else {
12034         peera = clientssl;
12035         peerb = serverssl;
12036     }
12037 
12038     if (idx == 5) {
12039         numpipes = 2;
12040         /* Maximum allowed fragment size */
12041         fragsize = SSL3_RT_MAX_PLAIN_LENGTH;
12042         msglen = fragsize * numpipes;
12043         msg = OPENSSL_malloc(msglen);
12044         if (!TEST_ptr(msg))
12045             goto end;
12046         if (!TEST_int_gt(RAND_bytes_ex(libctx, msg, msglen, 0), 0))
12047             goto end;
12048     } else if (idx == 4) {
12049         msglen = 55;
12050     } else {
12051         msglen = 50;
12052     }
12053     if (idx == 2)
12054         msglen -= 2; /* Send 2 less bytes */
12055     else if (idx == 3)
12056         msglen -= 12; /* Send 12 less bytes */
12057 
12058     buf = OPENSSL_malloc(msglen);
12059     if (!TEST_ptr(buf))
12060         goto end;
12061 
12062     if (idx == 5) {
12063         /*
12064          * Test that setting a split send fragment longer than the maximum
12065          * allowed fails
12066          */
12067         if (!TEST_false(SSL_set_split_send_fragment(peera, fragsize + 1)))
12068             goto end;
12069     }
12070 
12071     /*
12072      * In the normal case. We have 5 pipelines with 10 bytes per pipeline
12073      * (50 bytes in total). This is a ridiculously small number of bytes -
12074      * but sufficient for our purposes
12075      */
12076     if (!TEST_true(SSL_set_max_pipelines(peera, numpipes))
12077         || !TEST_true(SSL_set_split_send_fragment(peera, fragsize)))
12078         goto end;
12079 
12080     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12081         goto end;
12082 
12083     /* Write some data from peera to peerb */
12084     if (!TEST_true(SSL_write_ex(peera, msg, msglen, &written))
12085         || !TEST_size_t_eq(written, msglen))
12086         goto end;
12087 
12088     /*
12089      * If the pipelining code worked, then we expect all |numpipes| pipelines to
12090      * have been used - except in test 3 where only |numpipes - 1| pipelines
12091      * will be used. This will result in |numpipes| records (|numpipes - 1| for
12092      * test 3) having been sent to peerb. Since peerb is not using read_ahead we
12093      * expect this to be read in |numpipes| or |numpipes - 1| separate
12094      * SSL_read_ex calls. In the case of test 4, there is then one additional
12095      * read for left over data that couldn't fit in the previous pipelines
12096      */
12097     for (offset = 0, numreads = 0;
12098         offset < msglen;
12099         offset += readbytes, numreads++) {
12100         if (!TEST_true(SSL_read_ex(peerb, buf + offset,
12101                 msglen - offset, &readbytes)))
12102             goto end;
12103     }
12104 
12105     expectedreads = idx == 4 ? numpipes + 1
12106                              : (idx == 3 ? numpipes - 1 : numpipes);
12107     if (!TEST_mem_eq(msg, msglen, buf, offset)
12108         || !TEST_int_eq(numreads, expectedreads))
12109         goto end;
12110 
12111     /*
12112      * Write some data from peerb to peera. We do this in up to |numpipes + 1|
12113      * chunks to exercise the read pipelining code on peera.
12114      */
12115     for (offset = 0; offset < msglen; offset += fragsize) {
12116         size_t sendlen = msglen - offset;
12117 
12118         if (sendlen > fragsize)
12119             sendlen = fragsize;
12120         if (!TEST_true(SSL_write_ex(peerb, msg + offset, sendlen, &written))
12121             || !TEST_size_t_eq(written, sendlen))
12122             goto end;
12123     }
12124 
12125     /*
12126      * The data was written in |numpipes|, |numpipes - 1| or |numpipes + 1|
12127      * separate chunks (depending on which test we are running). If the
12128      * pipelining is working then we expect peera to read up to numpipes chunks
12129      * and process them in parallel, giving back the complete result in a single
12130      * call to SSL_read_ex
12131      */
12132     if (!TEST_true(SSL_read_ex(peera, buf, msglen, &readbytes))
12133         || !TEST_size_t_le(readbytes, msglen))
12134         goto end;
12135 
12136     if (idx == 4) {
12137         size_t readbytes2;
12138 
12139         if (!TEST_true(SSL_read_ex(peera, buf + readbytes,
12140                 msglen - readbytes, &readbytes2)))
12141             goto end;
12142         readbytes += readbytes2;
12143         if (!TEST_size_t_le(readbytes, msglen))
12144             goto end;
12145     }
12146 
12147     if (!TEST_mem_eq(msg, msglen, buf, readbytes))
12148         goto end;
12149 
12150     testresult = 1;
12151 end:
12152     SSL_free(serverssl);
12153     SSL_free(clientssl);
12154     SSL_CTX_free(sctx);
12155     SSL_CTX_free(cctx);
12156     if (e != NULL) {
12157         ENGINE_unregister_ciphers(e);
12158         ENGINE_finish(e);
12159         ENGINE_free(e);
12160     }
12161     OPENSSL_free(buf);
12162     if (fragsize == SSL3_RT_MAX_PLAIN_LENGTH)
12163         OPENSSL_free(msg);
12164     return testresult;
12165 }
12166 #endif /* !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE) */
12167 
12168 static int check_version_string(SSL *s, int version)
12169 {
12170     const char *verstr = NULL;
12171 
12172     switch (version) {
12173     case SSL3_VERSION:
12174         verstr = "SSLv3";
12175         break;
12176     case TLS1_VERSION:
12177         verstr = "TLSv1";
12178         break;
12179     case TLS1_1_VERSION:
12180         verstr = "TLSv1.1";
12181         break;
12182     case TLS1_2_VERSION:
12183         verstr = "TLSv1.2";
12184         break;
12185     case TLS1_3_VERSION:
12186         verstr = "TLSv1.3";
12187         break;
12188     case DTLS1_VERSION:
12189         verstr = "DTLSv1";
12190         break;
12191     case DTLS1_2_VERSION:
12192         verstr = "DTLSv1.2";
12193     }
12194 
12195     return TEST_str_eq(verstr, SSL_get_version(s));
12196 }
12197 
12198 /*
12199  * Test that SSL_version, SSL_get_version, SSL_is_quic, SSL_is_tls and
12200  * SSL_is_dtls return the expected results for a (D)TLS connection. Compare with
12201  * test_version() in quicapitest.c which does the same thing for QUIC
12202  * connections.
12203  */
12204 static int test_version(int idx)
12205 {
12206     SSL_CTX *cctx = NULL, *sctx = NULL;
12207     SSL *clientssl = NULL, *serverssl = NULL;
12208     int testresult = 0, version;
12209     const SSL_METHOD *servmeth = TLS_server_method();
12210     const SSL_METHOD *clientmeth = TLS_client_method();
12211 
12212     switch (idx) {
12213 #if !defined(OPENSSL_NO_SSL3)
12214     case 0:
12215         version = SSL3_VERSION;
12216         break;
12217 #endif
12218 #if !defined(OPENSSL_NO_TLS1)
12219     case 1:
12220         version = TLS1_VERSION;
12221         break;
12222 #endif
12223 #if !defined(OPENSSL_NO_TLS1_2)
12224     case 2:
12225         version = TLS1_2_VERSION;
12226         break;
12227 #endif
12228 #if !defined(OSSL_NO_USABLE_TLS1_3)
12229     case 3:
12230         version = TLS1_3_VERSION;
12231         break;
12232 #endif
12233 #if !defined(OPENSSL_NO_DTLS1)
12234     case 4:
12235         version = DTLS1_VERSION;
12236         break;
12237 #endif
12238 #if !defined(OPENSSL_NO_DTLS1_2)
12239     case 5:
12240         version = DTLS1_2_VERSION;
12241         break;
12242 #endif
12243     /*
12244      * NB we do not support QUIC in this test. That is covered by quicapitest.c
12245      * We also don't support DTLS1_BAD_VER since we have no server support for
12246      * that.
12247      */
12248     default:
12249         TEST_skip("Unsupported protocol version");
12250         return 1;
12251     }
12252 
12253     if (is_fips
12254         && (version == SSL3_VERSION
12255             || version == TLS1_VERSION
12256             || version == DTLS1_VERSION)) {
12257         TEST_skip("Protocol version not supported with FIPS");
12258         return 1;
12259     }
12260 
12261 #if !defined(OPENSSL_NO_DTLS)
12262     if (version == DTLS1_VERSION || version == DTLS1_2_VERSION) {
12263         servmeth = DTLS_server_method();
12264         clientmeth = DTLS_client_method();
12265     }
12266 #endif
12267 
12268     if (!TEST_true(create_ssl_ctx_pair(libctx, servmeth, clientmeth, version,
12269             version, &sctx, &cctx, cert, privkey)))
12270         goto end;
12271 
12272     if (!TEST_true(SSL_CTX_set_cipher_list(sctx, "DEFAULT:@SECLEVEL=0"))
12273         || !TEST_true(SSL_CTX_set_cipher_list(cctx,
12274             "DEFAULT:@SECLEVEL=0")))
12275         goto end;
12276 
12277     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12278             &clientssl, NULL, NULL)))
12279         goto end;
12280 
12281     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12282         goto end;
12283 
12284     if (!TEST_int_eq(SSL_version(serverssl), version)
12285         || !TEST_int_eq(SSL_version(clientssl), version)
12286         || !TEST_true(check_version_string(serverssl, version))
12287         || !TEST_true(check_version_string(clientssl, version)))
12288         goto end;
12289 
12290     if (version == DTLS1_VERSION || version == DTLS1_2_VERSION) {
12291         if (!TEST_true(SSL_is_dtls(serverssl))
12292             || !TEST_true(SSL_is_dtls(clientssl))
12293             || !TEST_false(SSL_is_tls(serverssl))
12294             || !TEST_false(SSL_is_tls(clientssl))
12295             || !TEST_false(SSL_is_quic(serverssl))
12296             || !TEST_false(SSL_is_quic(clientssl)))
12297             goto end;
12298     } else {
12299         if (!TEST_true(SSL_is_tls(serverssl))
12300             || !TEST_true(SSL_is_tls(clientssl))
12301             || !TEST_false(SSL_is_dtls(serverssl))
12302             || !TEST_false(SSL_is_dtls(clientssl))
12303             || !TEST_false(SSL_is_quic(serverssl))
12304             || !TEST_false(SSL_is_quic(clientssl)))
12305             goto end;
12306     }
12307 
12308     testresult = 1;
12309 end:
12310     SSL_free(serverssl);
12311     SSL_free(clientssl);
12312     SSL_CTX_free(sctx);
12313     SSL_CTX_free(cctx);
12314     return testresult;
12315 }
12316 
12317 /*
12318  * Test that the SSL_rstate_string*() APIs return sane results
12319  */
12320 static int test_rstate_string(void)
12321 {
12322     SSL_CTX *cctx = NULL, *sctx = NULL;
12323     SSL *clientssl = NULL, *serverssl = NULL;
12324     int testresult = 0, version;
12325     const SSL_METHOD *servmeth = TLS_server_method();
12326     const SSL_METHOD *clientmeth = TLS_client_method();
12327     size_t written, readbytes;
12328     unsigned char buf[2];
12329     unsigned char dummyheader[SSL3_RT_HEADER_LENGTH] = {
12330         SSL3_RT_APPLICATION_DATA,
12331         TLS1_2_VERSION_MAJOR,
12332         0, /* To be filled in later */
12333         0,
12334         1
12335     };
12336 
12337     if (!TEST_true(create_ssl_ctx_pair(libctx, servmeth, clientmeth, 0,
12338             0, &sctx, &cctx, cert, privkey)))
12339         goto end;
12340 
12341     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12342             &clientssl, NULL, NULL)))
12343         goto end;
12344 
12345     if (!TEST_str_eq(SSL_rstate_string(serverssl), "RH")
12346         || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read header"))
12347         goto end;
12348 
12349     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12350         goto end;
12351 
12352     if (!TEST_str_eq(SSL_rstate_string(serverssl), "RH")
12353         || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read header"))
12354         goto end;
12355 
12356     /* Fill in the correct version for the record header */
12357     version = SSL_version(serverssl);
12358     if (version == TLS1_3_VERSION)
12359         version = TLS1_2_VERSION;
12360     dummyheader[2] = version & 0xff;
12361 
12362     /*
12363      * Send a dummy header. If we continued to read the body as well this
12364      * would fail with a bad record mac, but we're not going to go that far.
12365      */
12366     if (!TEST_true(BIO_write_ex(SSL_get_rbio(serverssl), dummyheader,
12367             sizeof(dummyheader), &written))
12368         || !TEST_size_t_eq(written, SSL3_RT_HEADER_LENGTH))
12369         goto end;
12370 
12371     if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes)))
12372         goto end;
12373 
12374     if (!TEST_str_eq(SSL_rstate_string(serverssl), "RB")
12375         || !TEST_str_eq(SSL_rstate_string_long(serverssl), "read body"))
12376         goto end;
12377 
12378     testresult = 1;
12379 end:
12380     SSL_free(serverssl);
12381     SSL_free(clientssl);
12382     SSL_CTX_free(sctx);
12383     SSL_CTX_free(cctx);
12384     return testresult;
12385 }
12386 
12387 /*
12388  * Force a write retry during handshaking. We test various combinations of
12389  * scenarios. We test a large certificate message which will fill the buffering
12390  * BIO used in the handshake. We try with client auth on and off. Finally we
12391  * also try a BIO that indicates retry via a 0 return. BIO_write() is documented
12392  * to indicate retry via -1 - but sometimes BIOs don't do that.
12393  *
12394  * Test 0: Standard certificate message
12395  * Test 1: Large certificate message
12396  * Test 2: Standard cert, verify peer
12397  * Test 3: Large cert, verify peer
12398  * Test 4: Standard cert, BIO returns 0 on retry
12399  * Test 5: Large cert, BIO returns 0 on retry
12400  * Test 6: Standard cert, verify peer, BIO returns 0 on retry
12401  * Test 7: Large cert, verify peer, BIO returns 0 on retry
12402  * Test 8-15: Repeat of above with TLSv1.2
12403  */
12404 static int test_handshake_retry(int idx)
12405 {
12406     SSL_CTX *cctx = NULL, *sctx = NULL;
12407     SSL *clientssl = NULL, *serverssl = NULL;
12408     int testresult = 0;
12409     BIO *tmp = NULL, *bretry = BIO_new(bio_s_always_retry());
12410     int maxversion = 0;
12411 
12412     if (!TEST_ptr(bretry))
12413         goto end;
12414 
12415 #ifndef OPENSSL_NO_TLS1_2
12416     if ((idx & 8) == 8)
12417         maxversion = TLS1_2_VERSION;
12418 #else
12419     if ((idx & 8) == 8)
12420         return TEST_skip("No TLSv1.2");
12421 #endif
12422 
12423     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12424             TLS_client_method(), 0, maxversion,
12425             &sctx, &cctx, cert, privkey)))
12426         goto end;
12427 
12428     /*
12429      * Add a large amount of data to fill the buffering BIO used by the SSL
12430      * object
12431      */
12432     if ((idx & 1) == 1 && !ssl_ctx_add_large_cert_chain(libctx, sctx, cert))
12433         goto end;
12434 
12435     /*
12436      * We don't actually configure a client cert, but neither do we fail if one
12437      * isn't present.
12438      */
12439     if ((idx & 2) == 2)
12440         SSL_CTX_set_verify(sctx, SSL_VERIFY_PEER, NULL);
12441 
12442     if ((idx & 4) == 4)
12443         set_always_retry_err_val(0);
12444 
12445     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
12446             &clientssl, NULL, NULL)))
12447         goto end;
12448 
12449     tmp = SSL_get_wbio(serverssl);
12450     if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
12451         tmp = NULL;
12452         goto end;
12453     }
12454     SSL_set0_wbio(serverssl, bretry);
12455     bretry = NULL;
12456 
12457     if (!TEST_int_eq(SSL_connect(clientssl), -1))
12458         goto end;
12459 
12460     if (!TEST_int_eq(SSL_accept(serverssl), -1)
12461         || !TEST_int_eq(SSL_get_error(serverssl, -1), SSL_ERROR_WANT_WRITE))
12462         goto end;
12463 
12464     /* Restore a BIO that will let the write succeed */
12465     SSL_set0_wbio(serverssl, tmp);
12466     tmp = NULL;
12467 
12468     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12469         goto end;
12470 
12471     testresult = 1;
12472 end:
12473     SSL_free(serverssl);
12474     SSL_free(clientssl);
12475     SSL_CTX_free(sctx);
12476     SSL_CTX_free(cctx);
12477     BIO_free(bretry);
12478     BIO_free(tmp);
12479     set_always_retry_err_val(-1);
12480     return testresult;
12481 }
12482 
12483 /*
12484  * Test that receiving retries when writing application data works as expected
12485  */
12486 static int test_data_retry(void)
12487 {
12488     SSL_CTX *cctx = NULL, *sctx = NULL;
12489     SSL *clientssl = NULL, *serverssl = NULL;
12490     int testresult = 0;
12491     unsigned char inbuf[1200], outbuf[1200];
12492     size_t i;
12493     BIO *tmp = NULL;
12494     BIO *bretry = BIO_new(bio_s_maybe_retry());
12495     size_t written, readbytes, totread = 0;
12496 
12497     if (!TEST_ptr(bretry))
12498         goto end;
12499 
12500     for (i = 0; i < sizeof(inbuf); i++)
12501         inbuf[i] = (unsigned char)(0xff & i);
12502     memset(outbuf, 0, sizeof(outbuf));
12503 
12504     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12505             TLS_client_method(), 0, 0, &sctx, &cctx,
12506             cert, privkey)))
12507         goto end;
12508 
12509     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
12510             NULL)))
12511         goto end;
12512 
12513     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12514         goto end;
12515 
12516     /* Smallest possible max send fragment is 512 */
12517     if (!TEST_true(SSL_set_max_send_fragment(clientssl, 512)))
12518         goto end;
12519 
12520     tmp = SSL_get_wbio(clientssl);
12521     if (!TEST_ptr(tmp))
12522         goto end;
12523     if (!TEST_true(BIO_up_ref(tmp)))
12524         goto end;
12525     BIO_push(bretry, tmp);
12526     tmp = NULL;
12527     SSL_set0_wbio(clientssl, bretry);
12528     if (!BIO_up_ref(bretry)) {
12529         bretry = NULL;
12530         goto end;
12531     }
12532 
12533     for (i = 0; i < 3; i++) {
12534         /* We expect this call to make no progress and indicate retry */
12535         if (!TEST_false(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
12536             goto end;
12537         if (!TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_WRITE))
12538             goto end;
12539 
12540         /* Allow one write to progress, but the next one to signal retry */
12541         if (!TEST_true(BIO_ctrl(bretry, MAYBE_RETRY_CTRL_SET_RETRY_AFTER_CNT, 1,
12542                 NULL)))
12543             goto end;
12544 
12545         if (i == 2)
12546             break;
12547 
12548         /*
12549          * This call will hopefully make progress but will still indicate retry
12550          * because there is more data than will fit into a single record.
12551          */
12552         if (!TEST_false(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
12553             goto end;
12554         if (!TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_WRITE))
12555             goto end;
12556     }
12557 
12558     /* The final call should write the last chunk of data and succeed */
12559     if (!TEST_true(SSL_write_ex(clientssl, inbuf, sizeof(inbuf), &written)))
12560         goto end;
12561     /* Read all the data available */
12562     while (SSL_read_ex(serverssl, outbuf + totread, sizeof(outbuf) - totread,
12563         &readbytes))
12564         totread += readbytes;
12565     if (!TEST_mem_eq(inbuf, sizeof(inbuf), outbuf, totread))
12566         goto end;
12567 
12568     testresult = 1;
12569 end:
12570     SSL_free(serverssl);
12571     SSL_free(clientssl);
12572     SSL_CTX_free(sctx);
12573     SSL_CTX_free(cctx);
12574     BIO_free_all(bretry);
12575     BIO_free(tmp);
12576     return testresult;
12577 }
12578 
12579 struct resume_servername_cb_data {
12580     int i;
12581     SSL_CTX *cctx;
12582     SSL_CTX *sctx;
12583     SSL_SESSION *sess;
12584     int recurse;
12585 };
12586 
12587 /*
12588  * Servername callback. We use it here to run another complete handshake using
12589  * the same session - and mark the session as not_resuamble at the end
12590  */
12591 static int resume_servername_cb(SSL *s, int *ad, void *arg)
12592 {
12593     struct resume_servername_cb_data *cbdata = arg;
12594     SSL *serverssl = NULL, *clientssl = NULL;
12595     int ret = SSL_TLSEXT_ERR_ALERT_FATAL;
12596 
12597     if (cbdata->recurse)
12598         return SSL_TLSEXT_ERR_ALERT_FATAL;
12599 
12600     if ((cbdata->i % 3) != 1)
12601         return SSL_TLSEXT_ERR_OK;
12602 
12603     cbdata->recurse = 1;
12604 
12605     if (!TEST_true(create_ssl_objects(cbdata->sctx, cbdata->cctx, &serverssl,
12606             &clientssl, NULL, NULL))
12607         || !TEST_true(SSL_set_session(clientssl, cbdata->sess)))
12608         goto end;
12609 
12610     ERR_set_mark();
12611     /*
12612      * We expect this to fail - because the servername cb will fail. This will
12613      * mark the session as not_resumable.
12614      */
12615     if (!TEST_false(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))) {
12616         ERR_clear_last_mark();
12617         goto end;
12618     }
12619     ERR_pop_to_mark();
12620 
12621     ret = SSL_TLSEXT_ERR_OK;
12622 end:
12623     SSL_free(serverssl);
12624     SSL_free(clientssl);
12625     cbdata->recurse = 0;
12626     return ret;
12627 }
12628 /*
12629  * Test multiple resumptions and cache size handling
12630  * Test 0: TLSv1.3 (max_early_data set)
12631  * Test 1: TLSv1.3 (SSL_OP_NO_TICKET set)
12632  * Test 2: TLSv1.3 (max_early_data and SSL_OP_NO_TICKET set)
12633  * Test 3: TLSv1.3 (SSL_OP_NO_TICKET, simultaneous resumes)
12634  * Test 4: TLSv1.2
12635  */
12636 static int test_multi_resume(int idx)
12637 {
12638     SSL_CTX *sctx = NULL, *cctx = NULL;
12639     SSL *serverssl = NULL, *clientssl = NULL;
12640     SSL_SESSION *sess = NULL;
12641     int max_version = TLS1_3_VERSION;
12642     int i, testresult = 0;
12643     struct resume_servername_cb_data cbdata;
12644 
12645 #if defined(OPENSSL_NO_TLS1_2)
12646     if (idx == 4)
12647         return TEST_skip("TLSv1.2 is disabled in this build");
12648 #else
12649     if (idx == 4)
12650         max_version = TLS1_2_VERSION;
12651 #endif
12652 #if defined(OSSL_NO_USABLE_TLS1_3)
12653     if (idx != 4)
12654         return TEST_skip("No usable TLSv1.3 in this build");
12655 #endif
12656 
12657     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12658             TLS_client_method(), TLS1_VERSION,
12659             max_version, &sctx, &cctx, cert,
12660             privkey)))
12661         goto end;
12662 
12663     /*
12664      * TLSv1.3 only uses a session cache if either max_early_data > 0 (used for
12665      * replay protection), or if SSL_OP_NO_TICKET is in use
12666      */
12667     if (idx == 0 || idx == 2) {
12668         if (!TEST_true(SSL_CTX_set_max_early_data(sctx, 1024)))
12669             goto end;
12670     }
12671     if (idx == 1 || idx == 2 || idx == 3)
12672         SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET);
12673 
12674     SSL_CTX_sess_set_cache_size(sctx, 5);
12675 
12676     if (idx == 3) {
12677         SSL_CTX_set_tlsext_servername_callback(sctx, resume_servername_cb);
12678         SSL_CTX_set_tlsext_servername_arg(sctx, &cbdata);
12679         cbdata.cctx = cctx;
12680         cbdata.sctx = sctx;
12681         cbdata.recurse = 0;
12682     }
12683 
12684     for (i = 0; i < 30; i++) {
12685         if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
12686                 NULL, NULL))
12687             || !TEST_true(SSL_set_session(clientssl, sess)))
12688             goto end;
12689 
12690         /*
12691          * Check simultaneous resumes. We pause the connection part way through
12692          * the handshake by (mis)using the servername_cb. The pause occurs after
12693          * session resumption has already occurred, but before any session
12694          * tickets have been issued. While paused we run another complete
12695          * handshake resuming the same session.
12696          */
12697         if (idx == 3) {
12698             cbdata.i = i;
12699             cbdata.sess = sess;
12700         }
12701 
12702         /*
12703          * Recreate a bug where dynamically changing the max_early_data value
12704          * can cause sessions in the session cache which cannot be deleted.
12705          */
12706         if ((idx == 0 || idx == 2) && (i % 3) == 2)
12707             SSL_set_max_early_data(serverssl, 0);
12708 
12709         if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
12710             goto end;
12711 
12712         if (sess == NULL || (idx == 0 && (i % 3) == 2)) {
12713             if (!TEST_false(SSL_session_reused(clientssl)))
12714                 goto end;
12715         } else {
12716             if (!TEST_true(SSL_session_reused(clientssl)))
12717                 goto end;
12718         }
12719         SSL_SESSION_free(sess);
12720 
12721         /* Do a full handshake, followed by two resumptions */
12722         if ((i % 3) == 2) {
12723             sess = NULL;
12724         } else {
12725             if (!TEST_ptr((sess = SSL_get1_session(clientssl))))
12726                 goto end;
12727         }
12728 
12729         SSL_shutdown(clientssl);
12730         SSL_shutdown(serverssl);
12731         SSL_free(serverssl);
12732         SSL_free(clientssl);
12733         serverssl = clientssl = NULL;
12734     }
12735 
12736     /* We should never exceed the session cache size limit */
12737     if (!TEST_long_le(SSL_CTX_sess_number(sctx), 5))
12738         goto end;
12739 
12740     testresult = 1;
12741 end:
12742     SSL_free(serverssl);
12743     SSL_free(clientssl);
12744     SSL_CTX_free(sctx);
12745     SSL_CTX_free(cctx);
12746     SSL_SESSION_free(sess);
12747     return testresult;
12748 }
12749 
12750 static struct next_proto_st {
12751     int serverlen;
12752     unsigned char server[40];
12753     int clientlen;
12754     unsigned char client[40];
12755     int expected_ret;
12756     size_t selectedlen;
12757     unsigned char selected[40];
12758 } next_proto_tests[] = {
12759     { 4, { 3, 'a', 'b', 'c' },
12760         4, { 3, 'a', 'b', 'c' },
12761         OPENSSL_NPN_NEGOTIATED,
12762         3, { 'a', 'b', 'c' } },
12763     { 7, { 3, 'a', 'b', 'c', 2, 'a', 'b' },
12764         4, { 3, 'a', 'b', 'c' },
12765         OPENSSL_NPN_NEGOTIATED,
12766         3, { 'a', 'b', 'c' } },
12767     { 7, {
12768              2,
12769              'a',
12770              'b',
12771              3,
12772              'a',
12773              'b',
12774              'c',
12775          },
12776         4, { 3, 'a', 'b', 'c' }, OPENSSL_NPN_NEGOTIATED, 3, { 'a', 'b', 'c' } },
12777     { 4, { 3, 'a', 'b', 'c' }, 7, {
12778                                       3,
12779                                       'a',
12780                                       'b',
12781                                       'c',
12782                                       2,
12783                                       'a',
12784                                       'b',
12785                                   },
12786         OPENSSL_NPN_NEGOTIATED, 3, { 'a', 'b', 'c' } },
12787     { 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 } }
12788 };
12789 
12790 static int test_select_next_proto(int idx)
12791 {
12792     struct next_proto_st *np = &next_proto_tests[idx];
12793     int ret = 0;
12794     unsigned char *out, *client, *server;
12795     unsigned char outlen;
12796     unsigned int clientlen, serverlen;
12797 
12798     if (np->clientlen == -1) {
12799         client = NULL;
12800         clientlen = 0;
12801     } else {
12802         client = np->client;
12803         clientlen = (unsigned int)np->clientlen;
12804     }
12805     if (np->serverlen == -1) {
12806         server = NULL;
12807         serverlen = 0;
12808     } else {
12809         server = np->server;
12810         serverlen = (unsigned int)np->serverlen;
12811     }
12812 
12813     if (!TEST_int_eq(SSL_select_next_proto(&out, &outlen, server, serverlen,
12814                          client, clientlen),
12815             np->expected_ret))
12816         goto err;
12817 
12818     if (np->selectedlen == 0) {
12819         if (!TEST_ptr_null(out) || !TEST_uchar_eq(outlen, 0))
12820             goto err;
12821     } else {
12822         if (!TEST_mem_eq(out, outlen, np->selected, np->selectedlen))
12823             goto err;
12824     }
12825 
12826     ret = 1;
12827 err:
12828     return ret;
12829 }
12830 
12831 static const unsigned char fooprot[] = { 3, 'f', 'o', 'o' };
12832 static const unsigned char barprot[] = { 3, 'b', 'a', 'r' };
12833 
12834 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_NEXTPROTONEG)
12835 static int npn_advert_cb(SSL *ssl, const unsigned char **out,
12836     unsigned int *outlen, void *arg)
12837 {
12838     int *idx = (int *)arg;
12839 
12840     switch (*idx) {
12841     default:
12842     case 0:
12843         *out = fooprot;
12844         *outlen = sizeof(fooprot);
12845         return SSL_TLSEXT_ERR_OK;
12846 
12847     case 1:
12848         *out = NULL;
12849         *outlen = 0;
12850         return SSL_TLSEXT_ERR_OK;
12851 
12852     case 2:
12853         return SSL_TLSEXT_ERR_NOACK;
12854     }
12855 }
12856 
12857 static int npn_select_cb(SSL *s, unsigned char **out, unsigned char *outlen,
12858     const unsigned char *in, unsigned int inlen, void *arg)
12859 {
12860     int *idx = (int *)arg;
12861 
12862     switch (*idx) {
12863     case 0:
12864     case 1:
12865         *out = (unsigned char *)(fooprot + 1);
12866         *outlen = *fooprot;
12867         return SSL_TLSEXT_ERR_OK;
12868 
12869     case 3:
12870         *out = (unsigned char *)(barprot + 1);
12871         *outlen = *barprot;
12872         return SSL_TLSEXT_ERR_OK;
12873 
12874     case 4:
12875         *outlen = 0;
12876         return SSL_TLSEXT_ERR_OK;
12877 
12878     default:
12879     case 2:
12880         return SSL_TLSEXT_ERR_ALERT_FATAL;
12881     }
12882 }
12883 
12884 /*
12885  * Test the NPN callbacks
12886  * Test 0: advert = foo, select = foo
12887  * Test 1: advert = <empty>, select = foo
12888  * Test 2: no advert
12889  * Test 3: advert = foo, select = bar
12890  * Test 4: advert = foo, select = <empty> (should fail)
12891  */
12892 static int test_npn(int idx)
12893 {
12894     SSL_CTX *sctx = NULL, *cctx = NULL;
12895     SSL *serverssl = NULL, *clientssl = NULL;
12896     int testresult = 0;
12897 
12898     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12899             TLS_client_method(), 0, TLS1_2_VERSION,
12900             &sctx, &cctx, cert, privkey)))
12901         goto end;
12902 
12903     SSL_CTX_set_next_protos_advertised_cb(sctx, npn_advert_cb, &idx);
12904     SSL_CTX_set_next_proto_select_cb(cctx, npn_select_cb, &idx);
12905 
12906     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
12907             NULL)))
12908         goto end;
12909 
12910     if (idx == 4) {
12911         /* We don't allow empty selection of NPN, so this should fail */
12912         if (!TEST_false(create_ssl_connection(serverssl, clientssl,
12913                 SSL_ERROR_NONE)))
12914             goto end;
12915     } else {
12916         const unsigned char *prot;
12917         unsigned int protlen;
12918 
12919         if (!TEST_true(create_ssl_connection(serverssl, clientssl,
12920                 SSL_ERROR_NONE)))
12921             goto end;
12922 
12923         SSL_get0_next_proto_negotiated(serverssl, &prot, &protlen);
12924         switch (idx) {
12925         case 0:
12926         case 1:
12927             if (!TEST_mem_eq(prot, protlen, fooprot + 1, *fooprot))
12928                 goto end;
12929             break;
12930         case 2:
12931             if (!TEST_uint_eq(protlen, 0))
12932                 goto end;
12933             break;
12934         case 3:
12935             if (!TEST_mem_eq(prot, protlen, barprot + 1, *barprot))
12936                 goto end;
12937             break;
12938         default:
12939             TEST_error("Should not get here");
12940             goto end;
12941         }
12942     }
12943 
12944     testresult = 1;
12945 end:
12946     SSL_free(serverssl);
12947     SSL_free(clientssl);
12948     SSL_CTX_free(sctx);
12949     SSL_CTX_free(cctx);
12950 
12951     return testresult;
12952 }
12953 #endif /* !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_NEXTPROTONEG) */
12954 
12955 static int alpn_select_cb2(SSL *ssl, const unsigned char **out,
12956     unsigned char *outlen, const unsigned char *in,
12957     unsigned int inlen, void *arg)
12958 {
12959     int *idx = (int *)arg;
12960 
12961     switch (*idx) {
12962     case 0:
12963         *out = (unsigned char *)(fooprot + 1);
12964         *outlen = *fooprot;
12965         return SSL_TLSEXT_ERR_OK;
12966 
12967     case 2:
12968         *out = (unsigned char *)(barprot + 1);
12969         *outlen = *barprot;
12970         return SSL_TLSEXT_ERR_OK;
12971 
12972     case 3:
12973         *outlen = 0;
12974         return SSL_TLSEXT_ERR_OK;
12975 
12976     default:
12977     case 1:
12978         return SSL_TLSEXT_ERR_ALERT_FATAL;
12979     }
12980     return 0;
12981 }
12982 
12983 /*
12984  * Test the ALPN callbacks
12985  * Test 0: client = foo, select = foo
12986  * Test 1: client = <empty>, select = none
12987  * Test 2: client = foo, select = bar (should fail)
12988  * Test 3: client = foo, select = <empty> (should fail)
12989  */
12990 static int test_alpn(int idx)
12991 {
12992     SSL_CTX *sctx = NULL, *cctx = NULL;
12993     SSL *serverssl = NULL, *clientssl = NULL;
12994     int testresult = 0;
12995     const unsigned char *prots = fooprot;
12996     unsigned int protslen = sizeof(fooprot);
12997 
12998     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
12999             TLS_client_method(), 0, 0,
13000             &sctx, &cctx, cert, privkey)))
13001         goto end;
13002 
13003     SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb2, &idx);
13004 
13005     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13006             NULL)))
13007         goto end;
13008 
13009     if (idx == 1) {
13010         prots = NULL;
13011         protslen = 0;
13012     }
13013 
13014     /* SSL_set_alpn_protos returns 0 for success! */
13015     if (!TEST_false(SSL_set_alpn_protos(clientssl, prots, protslen)))
13016         goto end;
13017 
13018     if (idx == 2 || idx == 3) {
13019         /* We don't allow empty selection of NPN, so this should fail */
13020         if (!TEST_false(create_ssl_connection(serverssl, clientssl,
13021                 SSL_ERROR_NONE)))
13022             goto end;
13023     } else {
13024         const unsigned char *prot;
13025         unsigned int protlen;
13026 
13027         if (!TEST_true(create_ssl_connection(serverssl, clientssl,
13028                 SSL_ERROR_NONE)))
13029             goto end;
13030 
13031         SSL_get0_alpn_selected(clientssl, &prot, &protlen);
13032         switch (idx) {
13033         case 0:
13034             if (!TEST_mem_eq(prot, protlen, fooprot + 1, *fooprot))
13035                 goto end;
13036             break;
13037         case 1:
13038             if (!TEST_uint_eq(protlen, 0))
13039                 goto end;
13040             break;
13041         default:
13042             TEST_error("Should not get here");
13043             goto end;
13044         }
13045     }
13046 
13047     testresult = 1;
13048 end:
13049     SSL_free(serverssl);
13050     SSL_free(clientssl);
13051     SSL_CTX_free(sctx);
13052     SSL_CTX_free(cctx);
13053 
13054     return testresult;
13055 }
13056 
13057 #if !defined(OSSL_NO_USABLE_TLS1_3)
13058 struct quic_tls_test_data {
13059     struct quic_tls_test_data *peer;
13060     uint32_t renc_level;
13061     uint32_t wenc_level;
13062     unsigned char rcd_data[4][2048];
13063     size_t rcd_data_len[4];
13064     unsigned char rsecret[3][48];
13065     size_t rsecret_len[3];
13066     unsigned char wsecret[3][48];
13067     size_t wsecret_len[3];
13068     unsigned char params[3];
13069     size_t params_len;
13070     int alert;
13071     int err;
13072     int forcefail;
13073     int sm_count;
13074 };
13075 
13076 static int clientquicdata = 0xff, serverquicdata = 0xfe;
13077 
13078 static int check_app_data(SSL *s)
13079 {
13080     int *data, *comparedata;
13081 
13082     /* Check app data works */
13083     data = (int *)SSL_get_app_data(s);
13084     comparedata = SSL_is_server(s) ? &serverquicdata : &clientquicdata;
13085 
13086     if (!TEST_true(comparedata == data))
13087         return 0;
13088 
13089     return 1;
13090 }
13091 
13092 static int crypto_send_cb(SSL *s, const unsigned char *buf, size_t buf_len,
13093     size_t *consumed, void *arg)
13094 {
13095     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13096     struct quic_tls_test_data *peer = data->peer;
13097     size_t max_len = sizeof(peer->rcd_data[data->wenc_level])
13098         - peer->rcd_data_len[data->wenc_level];
13099 
13100     if (!check_app_data(s)) {
13101         data->err = 1;
13102         return 0;
13103     }
13104 
13105     if (buf_len > max_len)
13106         buf_len = max_len;
13107 
13108     if (buf_len == 0) {
13109         *consumed = 0;
13110         return 1;
13111     }
13112 
13113     memcpy(peer->rcd_data[data->wenc_level]
13114             + peer->rcd_data_len[data->wenc_level],
13115         buf, buf_len);
13116     peer->rcd_data_len[data->wenc_level] += buf_len;
13117 
13118     *consumed = buf_len;
13119     return 1;
13120 }
13121 static int crypto_recv_rcd_cb(SSL *s, const unsigned char **buf,
13122     size_t *bytes_read, void *arg)
13123 {
13124     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13125 
13126     if (!check_app_data(s)) {
13127         data->err = 1;
13128         return 0;
13129     }
13130 
13131     *bytes_read = data->rcd_data_len[data->renc_level];
13132     *buf = data->rcd_data[data->renc_level];
13133     return 1;
13134 }
13135 
13136 static int crypto_release_rcd_cb(SSL *s, size_t bytes_read, void *arg)
13137 {
13138     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13139 
13140     if (!check_app_data(s)) {
13141         data->err = 1;
13142         return 0;
13143     }
13144 
13145     /* See if we need to force a failure in this callback */
13146     if (data->forcefail) {
13147         data->forcefail = 0;
13148         data->err = 1;
13149         return 0;
13150     }
13151 
13152     if (!TEST_size_t_eq(bytes_read, data->rcd_data_len[data->renc_level])
13153         || !TEST_size_t_gt(bytes_read, 0)) {
13154         data->err = 1;
13155         return 0;
13156     }
13157     data->rcd_data_len[data->renc_level] = 0;
13158 
13159     return 1;
13160 }
13161 
13162 struct secret_yield_entry {
13163     uint8_t recorded;
13164     int prot_level;
13165     int direction;
13166     int sm_generation;
13167     SSL *ssl;
13168 };
13169 
13170 static struct secret_yield_entry secret_history[16];
13171 static int secret_history_idx = 0;
13172 /*
13173  * Note, this enum needs to match the direction values passed
13174  * to yield_secret_cb
13175  */
13176 typedef enum {
13177     LAST_DIR_READ = 0,
13178     LAST_DIR_WRITE = 1,
13179     LAST_DIR_UNSET = 2
13180 } last_dir_history_state;
13181 
13182 static int check_secret_history(SSL *s)
13183 {
13184     int i;
13185     int ret = 0;
13186     last_dir_history_state last_state = LAST_DIR_UNSET;
13187     int last_prot_level = 0;
13188     int last_generation = 0;
13189 
13190     TEST_info("Checking history for %p\n", (void *)s);
13191     for (i = 0; secret_history[i].recorded == 1; i++) {
13192         if (secret_history[i].ssl != s)
13193             continue;
13194         TEST_info("Got %s(%d) secret for level %d, last level %d, last state %d, gen %d\n",
13195             secret_history[i].direction == 1 ? "Write" : "Read", secret_history[i].direction,
13196             secret_history[i].prot_level, last_prot_level, last_state,
13197             secret_history[i].sm_generation);
13198 
13199         if (last_state == LAST_DIR_UNSET) {
13200             last_prot_level = secret_history[i].prot_level;
13201             last_state = secret_history[i].direction;
13202             last_generation = secret_history[i].sm_generation;
13203             continue;
13204         }
13205 
13206         switch (secret_history[i].direction) {
13207         case 1:
13208             /*
13209              * write case
13210              * NOTE: There is an odd corner case here.  It may occur that
13211              * in a single iteration of the state machine, the read key is yielded
13212              * prior to the write key for the same level.  This is undesirable
13213              * for quic, but it is ok, as the general implementation of every 3rd
13214              * party quic stack while preferring write keys before read, allows
13215              * for read before write if both keys are yielded in the same call
13216              * to SSL_do_handshake, as the tls adaptation code for that quic stack
13217              * can then cache keys until both are available, so we allow read before
13218              * write here iff they occur in the same iteration of SSL_do_handshake
13219              * as represented by the recorded sm_generation value.
13220              */
13221             if (last_prot_level == secret_history[i].prot_level
13222                 && last_state == LAST_DIR_READ) {
13223                 if (last_generation == secret_history[i].sm_generation) {
13224                     TEST_info("Read before write key in same SSL state machine iteration is ok");
13225                 } else {
13226                     TEST_error("Got read key before write key");
13227                     goto end;
13228                 }
13229             }
13230             /* FALLTHROUGH */
13231         case 0:
13232             /*
13233              * Read case
13234              */
13235             break;
13236         default:
13237             TEST_error("Unknown direction");
13238             goto end;
13239         }
13240         last_prot_level = secret_history[i].prot_level;
13241         last_state = secret_history[i].direction;
13242         last_generation = secret_history[i].sm_generation;
13243     }
13244 
13245     ret = 1;
13246 end:
13247     return ret;
13248 }
13249 
13250 static int yield_secret_cb(SSL *s, uint32_t prot_level, int direction,
13251     const unsigned char *secret, size_t secret_len,
13252     void *arg)
13253 {
13254     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13255 
13256     if (!check_app_data(s))
13257         goto err;
13258 
13259     if (prot_level < OSSL_RECORD_PROTECTION_LEVEL_EARLY
13260         || prot_level > OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13261         goto err;
13262 
13263     switch (direction) {
13264     case 0: /* read */
13265         if (!TEST_size_t_le(secret_len, sizeof(data->rsecret)))
13266             goto err;
13267         data->renc_level = prot_level;
13268         memcpy(data->rsecret[prot_level - 1], secret, secret_len);
13269         data->rsecret_len[prot_level - 1] = secret_len;
13270         break;
13271 
13272     case 1: /* write */
13273         if (!TEST_size_t_le(secret_len, sizeof(data->wsecret)))
13274             goto err;
13275         data->wenc_level = prot_level;
13276         memcpy(data->wsecret[prot_level - 1], secret, secret_len);
13277         data->wsecret_len[prot_level - 1] = secret_len;
13278         break;
13279 
13280     default:
13281         goto err;
13282     }
13283 
13284     secret_history[secret_history_idx].direction = direction;
13285     secret_history[secret_history_idx].prot_level = (int)prot_level;
13286     secret_history[secret_history_idx].recorded = 1;
13287     secret_history[secret_history_idx].ssl = s;
13288     secret_history[secret_history_idx].sm_generation = data->sm_count;
13289     secret_history_idx++;
13290     return 1;
13291 err:
13292     data->err = 1;
13293     return 0;
13294 }
13295 
13296 static int yield_secret_cb_fail(SSL *s, uint32_t prot_level, int direction,
13297     const unsigned char *secret, size_t secret_len,
13298     void *arg)
13299 {
13300     (void)s;
13301     (void)prot_level;
13302     (void)direction;
13303     (void)secret;
13304     (void)secret_len;
13305     (void)arg;
13306     /*
13307      * This callback is to test double free in quic tls
13308      */
13309     return 0;
13310 }
13311 
13312 static int got_transport_params_cb(SSL *s, const unsigned char *params,
13313     size_t params_len,
13314     void *arg)
13315 {
13316     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13317 
13318     if (!check_app_data(s)) {
13319         data->err = 1;
13320         return 0;
13321     }
13322 
13323     if (!TEST_size_t_le(params_len, sizeof(data->params))) {
13324         data->err = 1;
13325         return 0;
13326     }
13327 
13328     memcpy(data->params, params, params_len);
13329     data->params_len = params_len;
13330 
13331     return 1;
13332 }
13333 
13334 static int alert_cb(SSL *s, unsigned char alert_code, void *arg)
13335 {
13336     struct quic_tls_test_data *data = (struct quic_tls_test_data *)arg;
13337 
13338     if (!check_app_data(s)) {
13339         data->err = 1;
13340         return 0;
13341     }
13342 
13343     data->alert = 1;
13344     return 1;
13345 }
13346 
13347 /* Extension id reserved for private use by IANA */
13348 #define TEST_TLS_EXTENSION_ID 65282
13349 
13350 static int add_ext_cb_called = 0;
13351 static int parse_ext_cb_called = 0;
13352 
13353 static int add_old_ext(SSL *s, unsigned int ext_type,
13354     const unsigned char **out, size_t *outlen,
13355     int *al, void *add_arg)
13356 {
13357     static const unsigned char data = 0xff;
13358 
13359     add_ext_cb_called++;
13360     *out = &data;
13361     *outlen = 1;
13362     return 1;
13363 }
13364 
13365 static void free_old_ext(SSL *s, unsigned int ext_type,
13366     const unsigned char *out, void *add_arg)
13367 {
13368     /* Do nothing */
13369 }
13370 
13371 static int parse_old_ext(SSL *s, unsigned int ext_type,
13372     const unsigned char *in, size_t inlen,
13373     int *al, void *parse_arg)
13374 {
13375     parse_ext_cb_called++;
13376     if (inlen != 1 || *in != 0xff) {
13377         *al = SSL_AD_DECODE_ERROR;
13378         return 0;
13379     }
13380     return 1;
13381 }
13382 
13383 /*
13384  * Test the QUIC TLS API
13385  * Test 0: Normal run
13386  * Test 1: Force a failure
13387  * Test 3: Use a CCM based ciphersuite
13388  * Test 4: fail yield_secret_cb to see double free
13389  * Test 5: Normal run with SNI
13390  */
13391 static int test_quic_tls(int idx)
13392 {
13393     SSL_CTX *sctx = NULL, *sctx2 = NULL, *cctx = NULL;
13394     SSL *serverssl = NULL, *clientssl = NULL;
13395     int testresult = 0;
13396     OSSL_DISPATCH qtdis[] = {
13397         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_SEND, (void (*)(void))crypto_send_cb },
13398         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RECV_RCD,
13399             (void (*)(void))crypto_recv_rcd_cb },
13400         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RELEASE_RCD,
13401             (void (*)(void))crypto_release_rcd_cb },
13402         { OSSL_FUNC_SSL_QUIC_TLS_YIELD_SECRET,
13403             (void (*)(void))yield_secret_cb },
13404         { OSSL_FUNC_SSL_QUIC_TLS_GOT_TRANSPORT_PARAMS,
13405             (void (*)(void))got_transport_params_cb },
13406         { OSSL_FUNC_SSL_QUIC_TLS_ALERT, (void (*)(void))alert_cb },
13407         { 0, NULL }
13408     };
13409     struct quic_tls_test_data sdata, cdata;
13410     const unsigned char cparams[] = {
13411         0xff, 0x01, 0x00
13412     };
13413     const unsigned char sparams[] = {
13414         0xfe, 0x01, 0x00
13415     };
13416     int i;
13417 
13418     if (idx == 4)
13419         qtdis[3].function = (void (*)(void))yield_secret_cb_fail;
13420 
13421     snicb = 0;
13422     memset(secret_history, 0, sizeof(secret_history));
13423     secret_history_idx = 0;
13424     memset(&sdata, 0, sizeof(sdata));
13425     memset(&cdata, 0, sizeof(cdata));
13426     sdata.peer = &cdata;
13427     cdata.peer = &sdata;
13428     if (idx == 1)
13429         sdata.forcefail = 1;
13430 
13431     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13432             TLS_client_method(), TLS1_3_VERSION, 0,
13433             &sctx, &cctx, cert, privkey)))
13434         goto end;
13435 
13436     if (idx == 5) {
13437         static int dummy = 1;
13438 
13439         if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), NULL,
13440                 TLS1_3_VERSION, 0,
13441                 &sctx2, NULL, cert, privkey)))
13442             goto end;
13443 
13444         /*
13445          * We add an old style custom extension to ensure that it gets correctly
13446          * handled when we copy QUIC's connection specific custom extensions.
13447          */
13448         add_ext_cb_called = 0;
13449         parse_ext_cb_called = 0;
13450         if (!TEST_true(SSL_CTX_add_client_custom_ext(cctx,
13451                 TEST_TLS_EXTENSION_ID,
13452                 add_old_ext, free_old_ext, &dummy, parse_old_ext, &dummy)))
13453             goto end;
13454         if (!TEST_true(SSL_CTX_add_server_custom_ext(sctx,
13455                 TEST_TLS_EXTENSION_ID,
13456                 add_old_ext, free_old_ext, &dummy, parse_old_ext, &dummy)))
13457             goto end;
13458         if (!TEST_true(SSL_CTX_add_server_custom_ext(sctx2,
13459                 TEST_TLS_EXTENSION_ID,
13460                 add_old_ext, free_old_ext, &dummy, parse_old_ext, &dummy)))
13461             goto end;
13462 
13463         /* Set up SNI */
13464         if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
13465             || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
13466             goto end;
13467     }
13468 
13469     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13470             NULL)))
13471         goto end;
13472 
13473     /* Reset the BIOs we set in create_ssl_objects. We should not need them */
13474     SSL_set_bio(serverssl, NULL, NULL);
13475     SSL_set_bio(clientssl, NULL, NULL);
13476 
13477     if (idx == 2) {
13478         if (!TEST_true(SSL_set_ciphersuites(serverssl, "TLS_AES_128_CCM_SHA256"))
13479             || !TEST_true(SSL_set_ciphersuites(clientssl, "TLS_AES_128_CCM_SHA256")))
13480             goto end;
13481     }
13482 
13483     if (!TEST_true(SSL_set_app_data(clientssl, &clientquicdata))
13484         || !TEST_true(SSL_set_app_data(serverssl, &serverquicdata)))
13485         goto end;
13486 
13487     if (!TEST_true(SSL_set_quic_tls_cbs(clientssl, qtdis, &cdata))
13488         || !TEST_true(SSL_set_quic_tls_cbs(serverssl, qtdis, &sdata))
13489         || !TEST_true(SSL_set_quic_tls_transport_params(clientssl, cparams,
13490             sizeof(cparams)))
13491         || !TEST_true(SSL_set_quic_tls_transport_params(serverssl, sparams,
13492             sizeof(sparams))))
13493         goto end;
13494 
13495     if (idx != 1 && idx != 4) {
13496         if (!TEST_true(create_ssl_connection_ex(serverssl, clientssl, SSL_ERROR_NONE,
13497                 &cdata.sm_count, &sdata.sm_count)))
13498             goto end;
13499     } else {
13500         /* We expect this connection to fail */
13501         if (!TEST_false(create_ssl_connection_ex(serverssl, clientssl, SSL_ERROR_NONE,
13502                 &cdata.sm_count, &sdata.sm_count)))
13503             goto end;
13504         testresult = 1;
13505         sdata.err = 0;
13506         goto end;
13507     }
13508 
13509     /* We should have had the SNI callback called exactly once */
13510     if (idx == 5) {
13511         if (!TEST_int_eq(snicb, 1))
13512             goto end;
13513     }
13514 
13515     /* Check no problems during the handshake */
13516     if (!TEST_false(sdata.alert)
13517         || !TEST_false(cdata.alert)
13518         || !TEST_false(sdata.err)
13519         || !TEST_false(cdata.err))
13520         goto end;
13521 
13522     /* Check the secrets all match */
13523     for (i = OSSL_RECORD_PROTECTION_LEVEL_EARLY - 1;
13524         i < OSSL_RECORD_PROTECTION_LEVEL_APPLICATION;
13525         i++) {
13526         if (!TEST_mem_eq(sdata.wsecret[i], sdata.wsecret_len[i],
13527                 cdata.rsecret[i], cdata.rsecret_len[i]))
13528             goto end;
13529     }
13530 
13531     /*
13532      * Check that our secret history yields write secrets before read secrets
13533      */
13534     if (!TEST_int_eq(check_secret_history(serverssl), 1))
13535         goto end;
13536     if (!TEST_int_eq(check_secret_history(clientssl), 1))
13537         goto end;
13538 
13539     /* Check the transport params */
13540     if (!TEST_mem_eq(sdata.params, sdata.params_len, cparams, sizeof(cparams))
13541         || !TEST_mem_eq(cdata.params, cdata.params_len, sparams,
13542             sizeof(sparams)))
13543         goto end;
13544 
13545     /* Check the encryption levels are what we expect them to be */
13546     if (!TEST_true(sdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13547         || !TEST_true(sdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13548         || !TEST_true(cdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13549         || !TEST_true(cdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION))
13550         goto end;
13551 
13552     /*
13553      * We only expect the add cb to have actually been called because we are
13554      * using the old style callbacks that only apply to TLSv1.2. Since we are
13555      * using TLSv1.3 here, the add will be called for the ClientHello but
13556      * nothing else.
13557      */
13558     if (idx == 5) {
13559         if (!TEST_int_eq(add_ext_cb_called, 1)
13560             || !TEST_int_eq(parse_ext_cb_called, 0))
13561             goto end;
13562     }
13563 
13564     testresult = 1;
13565 end:
13566     SSL_free(serverssl);
13567     SSL_free(clientssl);
13568     SSL_CTX_free(sctx2);
13569     SSL_CTX_free(sctx);
13570     SSL_CTX_free(cctx);
13571 
13572     /* Check that we didn't suddenly hit an unexpected failure during cleanup */
13573     if (!TEST_false(sdata.err) || !TEST_false(cdata.err))
13574         testresult = 0;
13575 
13576     return testresult;
13577 }
13578 
13579 static void assert_no_end_of_early_data(int write_p, int version, int content_type,
13580     const void *buf, size_t msglen, SSL *ssl, void *arg)
13581 {
13582     const unsigned char *msg = buf;
13583 
13584     if (content_type == SSL3_RT_HANDSHAKE && msg[0] == SSL3_MT_END_OF_EARLY_DATA)
13585         end_of_early_data = 1;
13586 }
13587 
13588 static int test_quic_tls_early_data(void)
13589 {
13590     SSL_CTX *sctx = NULL, *cctx = NULL;
13591     SSL *serverssl = NULL, *clientssl = NULL;
13592     int testresult = 0;
13593     SSL_SESSION *sess = NULL;
13594     const OSSL_DISPATCH qtdis[] = {
13595         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_SEND, (void (*)(void))crypto_send_cb },
13596         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RECV_RCD,
13597             (void (*)(void))crypto_recv_rcd_cb },
13598         { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RELEASE_RCD,
13599             (void (*)(void))crypto_release_rcd_cb },
13600         { OSSL_FUNC_SSL_QUIC_TLS_YIELD_SECRET,
13601             (void (*)(void))yield_secret_cb },
13602         { OSSL_FUNC_SSL_QUIC_TLS_GOT_TRANSPORT_PARAMS,
13603             (void (*)(void))got_transport_params_cb },
13604         { OSSL_FUNC_SSL_QUIC_TLS_ALERT, (void (*)(void))alert_cb },
13605         { 0, NULL }
13606     };
13607     struct quic_tls_test_data sdata, cdata;
13608     const unsigned char cparams[] = {
13609         0xff, 0x01, 0x00
13610     };
13611     const unsigned char sparams[] = {
13612         0xfe, 0x01, 0x00
13613     };
13614     int i;
13615 
13616     memset(secret_history, 0, sizeof(secret_history));
13617     secret_history_idx = 0;
13618     memset(&sdata, 0, sizeof(sdata));
13619     memset(&cdata, 0, sizeof(cdata));
13620     sdata.peer = &cdata;
13621     cdata.peer = &sdata;
13622     end_of_early_data = 0;
13623 
13624     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13625             TLS_client_method(), TLS1_3_VERSION, 0,
13626             &sctx, &cctx, cert, privkey)))
13627         goto end;
13628 
13629     SSL_CTX_set_max_early_data(sctx, 0xffffffff);
13630     SSL_CTX_set_max_early_data(cctx, 0xffffffff);
13631 
13632     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13633             NULL)))
13634         goto end;
13635 
13636     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
13637         goto end;
13638 
13639     sess = SSL_get1_session(clientssl);
13640     SSL_shutdown(clientssl);
13641     SSL_shutdown(serverssl);
13642     SSL_free(serverssl);
13643     SSL_free(clientssl);
13644     serverssl = clientssl = NULL;
13645 
13646     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
13647             &clientssl, NULL, NULL))
13648         || !TEST_true(SSL_set_session(clientssl, sess)))
13649         goto end;
13650 
13651     /* Reset the BIOs we set in create_ssl_objects. We should not need them */
13652     SSL_set_bio(serverssl, NULL, NULL);
13653     SSL_set_bio(clientssl, NULL, NULL);
13654 
13655     if (!TEST_true(SSL_set_app_data(clientssl, &clientquicdata))
13656         || !TEST_true(SSL_set_app_data(serverssl, &serverquicdata)))
13657         goto end;
13658 
13659     if (!TEST_true(SSL_set_quic_tls_cbs(clientssl, qtdis, &cdata))
13660         || !TEST_true(SSL_set_quic_tls_cbs(serverssl, qtdis, &sdata))
13661         || !TEST_true(SSL_set_quic_tls_transport_params(clientssl, cparams,
13662             sizeof(cparams)))
13663         || !TEST_true(SSL_set_quic_tls_transport_params(serverssl, sparams,
13664             sizeof(sparams))))
13665         goto end;
13666 
13667     /*
13668      * Reset our secret history so we get the record of the second connection
13669      */
13670     memset(secret_history, 0, sizeof(secret_history));
13671     secret_history_idx = 0;
13672 
13673     SSL_set_quic_tls_early_data_enabled(serverssl, 1);
13674     SSL_set_quic_tls_early_data_enabled(clientssl, 1);
13675 
13676     SSL_set_msg_callback(serverssl, assert_no_end_of_early_data);
13677     SSL_set_msg_callback(clientssl, assert_no_end_of_early_data);
13678 
13679     if (!TEST_int_eq(SSL_connect(clientssl), -1)
13680         || !TEST_int_eq(SSL_accept(serverssl), -1)
13681         || !TEST_int_eq(SSL_get_early_data_status(serverssl), SSL_EARLY_DATA_ACCEPTED)
13682         || !TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_WANT_READ)
13683         || !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_WANT_READ))
13684         goto end;
13685 
13686     /* Check the encryption levels are what we expect them to be */
13687     if (!TEST_true(sdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE)
13688         || !TEST_true(sdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13689         || !TEST_true(cdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_NONE)
13690         || !TEST_true(cdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_EARLY))
13691         goto end;
13692 
13693     sdata.sm_count = 0;
13694     cdata.sm_count = 0;
13695     if (!TEST_true(create_ssl_connection_ex(serverssl, clientssl, SSL_ERROR_NONE,
13696             &cdata.sm_count, &sdata.sm_count)))
13697         goto end;
13698 
13699     /* Check no problems during the handshake */
13700     if (!TEST_false(sdata.alert)
13701         || !TEST_false(cdata.alert)
13702         || !TEST_false(sdata.err)
13703         || !TEST_false(cdata.err))
13704         goto end;
13705 
13706     /* Check the secrets all match */
13707     for (i = OSSL_RECORD_PROTECTION_LEVEL_EARLY - 1;
13708         i < OSSL_RECORD_PROTECTION_LEVEL_APPLICATION;
13709         i++) {
13710         if (!TEST_mem_eq(sdata.wsecret[i], sdata.wsecret_len[i],
13711                 cdata.rsecret[i], cdata.rsecret_len[i]))
13712             goto end;
13713     }
13714 
13715     if (!TEST_int_eq(check_secret_history(serverssl), 1))
13716         goto end;
13717     if (!TEST_int_eq(check_secret_history(clientssl), 1))
13718         goto end;
13719 
13720     /* Check the transport params */
13721     if (!TEST_mem_eq(sdata.params, sdata.params_len, cparams, sizeof(cparams))
13722         || !TEST_mem_eq(cdata.params, cdata.params_len, sparams,
13723             sizeof(sparams)))
13724         goto end;
13725 
13726     /* Check the encryption levels are what we expect them to be */
13727     if (!TEST_true(sdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13728         || !TEST_true(sdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13729         || !TEST_true(cdata.renc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION)
13730         || !TEST_true(cdata.wenc_level == OSSL_RECORD_PROTECTION_LEVEL_APPLICATION))
13731         goto end;
13732 
13733     /* Check there is no EndOfEearlyData in handshake */
13734     if (!TEST_int_eq(end_of_early_data, 0))
13735         goto end;
13736 
13737     testresult = 1;
13738 end:
13739     SSL_SESSION_free(sess);
13740     SSL_SESSION_free(clientpsk);
13741     SSL_SESSION_free(serverpsk);
13742     clientpsk = serverpsk = NULL;
13743     SSL_free(serverssl);
13744     SSL_free(clientssl);
13745     SSL_CTX_free(sctx);
13746     SSL_CTX_free(cctx);
13747 
13748     return testresult;
13749 }
13750 #endif /* !defined(OSSL_NO_USABLE_TLS1_3) */
13751 
13752 static int test_no_renegotiation(int idx)
13753 {
13754     SSL_CTX *sctx = NULL, *cctx = NULL;
13755     SSL *serverssl = NULL, *clientssl = NULL;
13756     int testresult = 0, ret;
13757     int max_proto;
13758     const SSL_METHOD *sm, *cm;
13759     unsigned char buf[5];
13760 
13761     if (idx == 0) {
13762 #ifndef OPENSSL_NO_TLS1_2
13763         max_proto = TLS1_2_VERSION;
13764         sm = TLS_server_method();
13765         cm = TLS_client_method();
13766 #else
13767         return TEST_skip("TLSv1.2 is disabled in this build");
13768 #endif
13769     } else {
13770 #ifndef OPENSSL_NO_DTLS1_2
13771         max_proto = DTLS1_2_VERSION;
13772         sm = DTLS_server_method();
13773         cm = DTLS_client_method();
13774 #else
13775         return TEST_skip("DTLSv1.2 is disabled in this build");
13776 #endif
13777     }
13778     if (!TEST_true(create_ssl_ctx_pair(libctx, sm, cm, 0, max_proto,
13779             &sctx, &cctx, cert, privkey)))
13780         goto end;
13781 
13782     SSL_CTX_set_options(sctx, SSL_OP_NO_RENEGOTIATION);
13783 
13784     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13785             NULL)))
13786         goto end;
13787 
13788     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
13789         goto end;
13790 
13791     if (!TEST_true(SSL_renegotiate(clientssl))
13792         || !TEST_int_le(ret = SSL_connect(clientssl), 0)
13793         || !TEST_int_eq(SSL_get_error(clientssl, ret), SSL_ERROR_WANT_READ))
13794         goto end;
13795 
13796     /*
13797      * We've not sent any application data, so we expect this to fail. It should
13798      * also read the renegotiation attempt, and send back a no_renegotiation
13799      * warning alert because we have renegotiation disabled.
13800      */
13801     if (!TEST_int_le(ret = SSL_read(serverssl, buf, sizeof(buf)), 0))
13802         goto end;
13803     if (!TEST_int_eq(SSL_get_error(serverssl, ret), SSL_ERROR_WANT_READ))
13804         goto end;
13805 
13806     /*
13807      * The client should now see the no_renegotiation warning and fail the
13808      * connection
13809      */
13810     if (!TEST_int_le(ret = SSL_connect(clientssl), 0)
13811         || !TEST_int_eq(SSL_get_error(clientssl, ret), SSL_ERROR_SSL)
13812         || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), SSL_R_NO_RENEGOTIATION))
13813         goto end;
13814 
13815     testresult = 1;
13816 end:
13817     SSL_free(serverssl);
13818     SSL_free(clientssl);
13819     SSL_CTX_free(sctx);
13820     SSL_CTX_free(cctx);
13821 
13822     return testresult;
13823 }
13824 
13825 #if defined(DO_SSL_TRACE_TEST)
13826 /*
13827  * Tests that the SSL_trace() msg_callback works as expected with a PQ Groups.
13828  */
13829 static int test_ssl_trace(void)
13830 {
13831     SSL_CTX *sctx = NULL, *cctx = NULL;
13832     SSL *serverssl = NULL, *clientssl = NULL;
13833     int testresult = 0;
13834     BIO *bio = NULL;
13835     char *reffile = NULL;
13836     char *grouplist = "MLKEM512:MLKEM768:MLKEM1024:X25519MLKEM768:SecP256r1MLKEM768"
13837                       ":SecP384r1MLKEM1024:secp521r1:secp384r1:secp256r1";
13838 
13839     if (!fips_provider_version_ge(libctx, 3, 5, 0))
13840         return TEST_skip("FIPS provider does not support MLKEM algorithms");
13841 
13842     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13843             TLS_client_method(),
13844             TLS1_3_VERSION, TLS1_3_VERSION,
13845             &sctx, &cctx, cert, privkey))
13846         || !TEST_ptr(bio = BIO_new(BIO_s_mem()))
13847         || !TEST_true(SSL_CTX_set1_groups_list(sctx, grouplist))
13848         || !TEST_true(SSL_CTX_set1_groups_list(cctx, grouplist))
13849         || !TEST_true(SSL_CTX_set_ciphersuites(cctx,
13850             "TLS_AES_128_GCM_SHA256"))
13851         || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
13852             "TLS_AES_128_GCM_SHA256"))
13853 #ifdef SSL_OP_LEGACY_EC_POINT_FORMATS
13854         || !TEST_true(SSL_CTX_set_options(cctx, SSL_OP_LEGACY_EC_POINT_FORMATS))
13855         || !TEST_true(SSL_CTX_set_options(sctx, SSL_OP_LEGACY_EC_POINT_FORMATS))
13856 #endif
13857         || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
13858             NULL, NULL)))
13859         goto err;
13860 
13861     SSL_set_msg_callback(clientssl, SSL_trace);
13862     SSL_set_msg_callback_arg(clientssl, bio);
13863 
13864     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
13865         goto err;
13866 
13867     /* Skip the comparison of the trace when the fips provider is used. */
13868     if (is_fips) {
13869         /* Check whether there was something written. */
13870         if (!TEST_int_gt(BIO_pending(bio), 0))
13871             goto err;
13872     } else {
13873 
13874 #ifdef OPENSSL_NO_ZLIB
13875         reffile = test_mk_file_path(datadir, "ssltraceref.txt");
13876 #else
13877         reffile = test_mk_file_path(datadir, "ssltraceref-zlib.txt");
13878 #endif
13879         if (!TEST_true(compare_with_reference_file(bio, reffile)))
13880             goto err;
13881     }
13882 
13883     testresult = 1;
13884 err:
13885     BIO_free(bio);
13886     SSL_free(serverssl);
13887     SSL_free(clientssl);
13888     SSL_CTX_free(sctx);
13889     SSL_CTX_free(cctx);
13890     OPENSSL_free(reffile);
13891 
13892     return testresult;
13893 }
13894 #endif
13895 
13896 /*
13897  * Test that SSL_CTX_set1_groups() when called with a list where the first
13898  * entry is unsupported, will send a key_share that uses the next usable entry.
13899  */
13900 static int test_ssl_set_groups_unsupported_keyshare(int idx)
13901 {
13902 #if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
13903     int testresult = 0;
13904     SSL_CTX *sctx = NULL, *cctx = NULL;
13905     SSL *serverssl = NULL, *clientssl = NULL;
13906     int client_groups[] = {
13907         NID_brainpoolP256r1tls13,
13908         NID_sect163k1,
13909         NID_secp384r1,
13910         NID_ffdhe2048,
13911     };
13912 
13913     switch (idx) {
13914     case 1:
13915         client_groups[0] = NID_id_tc26_gost_3410_2012_512_paramSetC;
13916         if (sizeof(unsigned long) == 4) {
13917             return TEST_skip("SSL_CTX_set1_groups() is broken on 32-bit systems with TLS"
13918                              " group IDs > 0x20, see https://github.com/openssl/openssl/issues/29196");
13919         }
13920         break;
13921     }
13922 
13923     if (!TEST_true(create_ssl_ctx_pair(libctx,
13924             TLS_server_method(),
13925             TLS_client_method(),
13926             0, 0,
13927             &sctx,
13928             &cctx,
13929             cert,
13930             privkey)))
13931         goto end;
13932 
13933     if (!TEST_true(SSL_CTX_set1_groups(cctx,
13934             client_groups,
13935             OSSL_NELEM(client_groups))))
13936         goto end;
13937 
13938     if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
13939             NULL)))
13940         goto end;
13941 
13942     if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
13943         goto end;
13944 
13945     testresult = 1;
13946 end:
13947     SSL_free(serverssl);
13948     SSL_free(clientssl);
13949     SSL_CTX_free(sctx);
13950     SSL_CTX_free(cctx);
13951 
13952     return testresult;
13953 #else /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
13954     return TEST_skip("No EC and DH support.");
13955 #endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
13956 }
13957 
13958 /*
13959  * Test that if we attempt to send HTTP to a TLS server that we get the expected
13960  * failure reason code.
13961  */
13962 static int test_http_verbs(int idx)
13963 {
13964     SSL_CTX *sctx = NULL;
13965     SSL *serverssl = NULL;
13966     int testresult = 0;
13967     const char *verbs[] = { "GET", "POST", "HEAD" };
13968     const char *http_trailer = " / HTTP/1.0\r\n\r\n";
13969     BIO *b = BIO_new(BIO_s_mem());
13970 
13971     if (!TEST_true((unsigned int)idx < OSSL_NELEM(verbs)))
13972         goto end;
13973 
13974     if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
13975             NULL, 0, 0, &sctx, NULL, cert, privkey)))
13976         goto end;
13977 
13978     serverssl = SSL_new(sctx);
13979     if (!TEST_ptr(serverssl))
13980         goto end;
13981 
13982     if (!TEST_int_gt(BIO_write(b, verbs[idx], (int)strlen(verbs[idx])), 0))
13983         goto end;
13984     if (!TEST_int_gt(BIO_write(b, http_trailer, (int)strlen(http_trailer)), 0))
13985         goto end;
13986     SSL_set_bio(serverssl, b, b);
13987     b = NULL;
13988 
13989     ERR_clear_error();
13990     if (!TEST_int_le(SSL_accept(serverssl), 0))
13991         goto end;
13992     if (!TEST_int_eq(ERR_GET_REASON(ERR_get_error()), SSL_R_HTTP_REQUEST))
13993         goto end;
13994 
13995     testresult = 1;
13996 end:
13997     SSL_free(serverssl);
13998     SSL_CTX_free(sctx);
13999     BIO_free(b);
14000 
14001     return testresult;
14002 }
14003 
14004 OPT_TEST_DECLARE_USAGE("certfile privkeyfile srpvfile tmpfile provider config dhfile\n")
14005 
14006 int setup_tests(void)
14007 {
14008     char *modulename;
14009     char *configfile;
14010 
14011     libctx = OSSL_LIB_CTX_new();
14012     if (!TEST_ptr(libctx))
14013         return 0;
14014 
14015     defctxnull = OSSL_PROVIDER_load(NULL, "null");
14016 
14017     /*
14018      * Verify that the default and fips providers in the default libctx are not
14019      * available
14020      */
14021     if (!TEST_false(OSSL_PROVIDER_available(NULL, "default"))
14022         || !TEST_false(OSSL_PROVIDER_available(NULL, "fips")))
14023         return 0;
14024 
14025     if (!test_skip_common_options()) {
14026         TEST_error("Error parsing test options\n");
14027         return 0;
14028     }
14029 
14030     if (!TEST_ptr(certsdir = test_get_argument(0))
14031         || !TEST_ptr(srpvfile = test_get_argument(1))
14032         || !TEST_ptr(tmpfilename = test_get_argument(2))
14033         || !TEST_ptr(modulename = test_get_argument(3))
14034         || !TEST_ptr(configfile = test_get_argument(4))
14035         || !TEST_ptr(dhfile = test_get_argument(5)))
14036         return 0;
14037 
14038     datadir = test_get_argument(6);
14039 
14040     if (!TEST_true(OSSL_LIB_CTX_load_config(libctx, configfile)))
14041         return 0;
14042 
14043     /* Check we have the expected provider available */
14044     if (!TEST_true(OSSL_PROVIDER_available(libctx, modulename)))
14045         return 0;
14046 
14047     /* Check the default provider is not available */
14048     if (strcmp(modulename, "default") != 0
14049         && !TEST_false(OSSL_PROVIDER_available(libctx, "default")))
14050         return 0;
14051 
14052     if (strcmp(modulename, "fips") == 0) {
14053         OSSL_PROVIDER *prov = NULL;
14054         OSSL_PARAM params[2];
14055 
14056         is_fips = 1;
14057 
14058         prov = OSSL_PROVIDER_load(libctx, "fips");
14059         if (prov != NULL) {
14060             /* Query the fips provider to check if the check ems option is enabled */
14061             params[0] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_TLS1_PRF_EMS_CHECK,
14062                 &fips_ems_check);
14063             params[1] = OSSL_PARAM_construct_end();
14064             OSSL_PROVIDER_get_params(prov, params);
14065             OSSL_PROVIDER_unload(prov);
14066         }
14067     }
14068 
14069     /*
14070      * We add, but don't load the test "tls-provider". We'll load it when we
14071      * need it.
14072      */
14073     if (!TEST_true(OSSL_PROVIDER_add_builtin(libctx, "tls-provider",
14074             tls_provider_init)))
14075         return 0;
14076 
14077     if (getenv("OPENSSL_TEST_GETCOUNTS") != NULL) {
14078 #ifdef OPENSSL_NO_CRYPTO_MDEBUG
14079         TEST_error("not supported in this build");
14080         return 0;
14081 #else
14082         int i, mcount, rcount, fcount;
14083 
14084         for (i = 0; i < 4; i++)
14085             test_export_key_mat(i);
14086         CRYPTO_get_alloc_counts(&mcount, &rcount, &fcount);
14087         test_printf_stdout("malloc %d realloc %d free %d\n",
14088             mcount, rcount, fcount);
14089         return 1;
14090 #endif
14091     }
14092 
14093     cert = test_mk_file_path(certsdir, "servercert.pem");
14094     if (cert == NULL)
14095         goto err;
14096 
14097     privkey = test_mk_file_path(certsdir, "serverkey.pem");
14098     if (privkey == NULL)
14099         goto err;
14100 
14101     cert2 = test_mk_file_path(certsdir, "server-ecdsa-cert.pem");
14102     if (cert2 == NULL)
14103         goto err;
14104 
14105     privkey2 = test_mk_file_path(certsdir, "server-ecdsa-key.pem");
14106     if (privkey2 == NULL)
14107         goto err;
14108 
14109     cert1024 = test_mk_file_path(certsdir, "ee-cert-1024.pem");
14110     if (cert1024 == NULL)
14111         goto err;
14112 
14113     privkey1024 = test_mk_file_path(certsdir, "ee-key-1024.pem");
14114     if (privkey1024 == NULL)
14115         goto err;
14116 
14117     cert3072 = test_mk_file_path(certsdir, "ee-cert-3072.pem");
14118     if (cert3072 == NULL)
14119         goto err;
14120 
14121     privkey3072 = test_mk_file_path(certsdir, "ee-key-3072.pem");
14122     if (privkey3072 == NULL)
14123         goto err;
14124 
14125     cert4096 = test_mk_file_path(certsdir, "ee-cert-4096.pem");
14126     if (cert4096 == NULL)
14127         goto err;
14128 
14129     privkey4096 = test_mk_file_path(certsdir, "ee-key-4096.pem");
14130     if (privkey4096 == NULL)
14131         goto err;
14132 
14133     cert8192 = test_mk_file_path(certsdir, "ee-cert-8192.pem");
14134     if (cert8192 == NULL)
14135         goto err;
14136 
14137     privkey8192 = test_mk_file_path(certsdir, "ee-key-8192.pem");
14138     if (privkey8192 == NULL)
14139         goto err;
14140 
14141     if (fips_ems_check) {
14142 #ifndef OPENSSL_NO_TLS1_2
14143         ADD_TEST(test_no_ems);
14144 #endif
14145         return 1;
14146     }
14147 #if !defined(OPENSSL_NO_KTLS) && !defined(OPENSSL_NO_SOCK)
14148 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3)
14149     ADD_ALL_TESTS(test_ktls, NUM_KTLS_TEST_CIPHERS * 4);
14150     ADD_ALL_TESTS(test_ktls_sendfile, NUM_KTLS_TEST_CIPHERS * 2);
14151 #endif
14152 #ifndef OSSL_NO_USABLE_TLS1_3
14153     ADD_TEST(test_ktls_moving_write_buffer);
14154 #endif
14155 #endif
14156     ADD_TEST(test_large_message_tls);
14157     ADD_TEST(test_large_message_tls_read_ahead);
14158 #ifndef OPENSSL_NO_DTLS
14159     ADD_TEST(test_large_message_dtls);
14160 #endif
14161     ADD_ALL_TESTS(test_large_app_data, 28);
14162     ADD_TEST(test_cleanse_plaintext);
14163 #ifndef OPENSSL_NO_OCSP
14164     ADD_TEST(test_tlsext_status_type);
14165 #endif
14166     ADD_TEST(test_session_with_only_int_cache);
14167     ADD_TEST(test_session_with_only_ext_cache);
14168     ADD_TEST(test_session_with_both_cache);
14169     ADD_TEST(test_session_wo_ca_names);
14170 #ifndef OSSL_NO_USABLE_TLS1_3
14171     ADD_ALL_TESTS(test_stateful_tickets, 3);
14172     ADD_ALL_TESTS(test_stateless_tickets, 3);
14173     ADD_TEST(test_psk_tickets);
14174     ADD_ALL_TESTS(test_extra_tickets, 6);
14175 #endif
14176     ADD_ALL_TESTS(test_ssl_set_bio, TOTAL_SSL_SET_BIO_TESTS);
14177     ADD_TEST(test_ssl_bio_pop_next_bio);
14178     ADD_TEST(test_ssl_bio_pop_ssl_bio);
14179     ADD_TEST(test_ssl_bio_change_rbio);
14180     ADD_TEST(test_ssl_bio_change_wbio);
14181     ADD_TEST(test_ssl_set_wbio_chain_no_leak);
14182 #if !defined(OPENSSL_NO_TLS1_2) || defined(OSSL_NO_USABLE_TLS1_3)
14183     ADD_ALL_TESTS(test_set_sigalgs, OSSL_NELEM(testsigalgs) * 2);
14184     ADD_TEST(test_keylog);
14185 #endif
14186 #ifndef OSSL_NO_USABLE_TLS1_3
14187     ADD_TEST(test_keylog_no_master_key);
14188 #endif
14189     ADD_TEST(test_client_cert_verify_cb);
14190     ADD_TEST(test_ssl_build_cert_chain);
14191     ADD_TEST(test_ssl_ctx_build_cert_chain);
14192 #ifndef OPENSSL_NO_TLS1_2
14193     ADD_TEST(test_client_hello_cb);
14194     ADD_TEST(test_no_ems);
14195     ADD_TEST(test_ccs_change_cipher);
14196 #endif
14197 #ifndef OSSL_NO_USABLE_TLS1_3
14198     ADD_ALL_TESTS(test_early_data_read_write, 6);
14199     /*
14200      * We don't do replay tests for external PSK. Replay protection isn't used
14201      * in that scenario.
14202      */
14203     ADD_ALL_TESTS(test_early_data_replay, 2);
14204     ADD_ALL_TESTS(test_early_data_skip, OSSL_NELEM(ciphersuites) * 3);
14205     ADD_ALL_TESTS(test_early_data_skip_hrr, OSSL_NELEM(ciphersuites) * 3);
14206     ADD_ALL_TESTS(test_early_data_skip_hrr_fail, OSSL_NELEM(ciphersuites) * 3);
14207     ADD_ALL_TESTS(test_early_data_skip_abort, OSSL_NELEM(ciphersuites) * 3);
14208     ADD_ALL_TESTS(test_early_data_not_sent, 3);
14209     ADD_ALL_TESTS(test_early_data_psk, 8);
14210     ADD_ALL_TESTS(test_early_data_psk_with_all_ciphers, 7);
14211     ADD_ALL_TESTS(test_early_data_not_expected, 3);
14212 #ifndef OPENSSL_NO_TLS1_2
14213     ADD_ALL_TESTS(test_early_data_tls1_2, 3);
14214 #endif
14215 #endif
14216 #ifndef OSSL_NO_USABLE_TLS1_3
14217     ADD_ALL_TESTS(test_set_ciphersuite, 10);
14218     ADD_TEST(test_ciphersuite_change);
14219     ADD_ALL_TESTS(test_tls13_ciphersuite, 4);
14220 #ifdef OPENSSL_NO_PSK
14221     ADD_ALL_TESTS(test_tls13_psk, 1);
14222 #else
14223     ADD_ALL_TESTS(test_tls13_psk, 4);
14224 #endif /* OPENSSL_NO_PSK */
14225 #ifndef OSSL_NO_USABLE_TLS1_3
14226     ADD_ALL_TESTS(test_tls13_no_dhe_kex, 8);
14227 #endif /* OSSL_NO_USABLE_TLS1_3 */
14228 #ifndef OPENSSL_NO_TLS1_2
14229     /* Test with both TLSv1.3 and 1.2 versions */
14230     ADD_ALL_TESTS(test_key_exchange, 21);
14231 #if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_DH)
14232     ADD_ALL_TESTS(test_negotiated_group,
14233         4 * (OSSL_NELEM(ecdhe_kexch_groups) + OSSL_NELEM(ffdhe_kexch_groups)));
14234 #endif
14235 #else
14236     /* Test with only TLSv1.3 versions */
14237     ADD_ALL_TESTS(test_key_exchange, 18);
14238 #endif
14239     ADD_ALL_TESTS(test_custom_exts, 6);
14240     ADD_TEST(test_stateless);
14241     ADD_TEST(test_pha_key_update);
14242 #else
14243     ADD_ALL_TESTS(test_custom_exts, 3);
14244 #endif
14245     ADD_ALL_TESTS(test_export_key_mat, 6);
14246 #ifndef OSSL_NO_USABLE_TLS1_3
14247     ADD_ALL_TESTS(test_export_key_mat_early, 3);
14248     ADD_TEST(test_key_update);
14249     ADD_ALL_TESTS(test_key_update_peer_in_write, 2);
14250     ADD_ALL_TESTS(test_key_update_peer_in_read, 2);
14251     ADD_ALL_TESTS(test_key_update_local_in_write, 2);
14252     ADD_ALL_TESTS(test_key_update_local_in_read, 2);
14253 #endif
14254     ADD_ALL_TESTS(test_ssl_clear, 8);
14255     ADD_ALL_TESTS(test_max_fragment_len_ext, OSSL_NELEM(max_fragment_len_test));
14256 #if !defined(OPENSSL_NO_SRP) && !defined(OPENSSL_NO_TLS1_2)
14257     ADD_ALL_TESTS(test_srp, 6);
14258 #endif
14259 #if !defined(OPENSSL_NO_COMP_ALG)
14260     /* Add compression case */
14261     ADD_ALL_TESTS(test_info_callback, 8);
14262 #else
14263     ADD_ALL_TESTS(test_info_callback, 6);
14264 #endif
14265     ADD_ALL_TESTS(test_ssl_pending, 2);
14266     ADD_ALL_TESTS(test_ssl_get_shared_ciphers, OSSL_NELEM(shared_ciphers_data));
14267     ADD_ALL_TESTS(test_ticket_callbacks, 20);
14268     ADD_TEST(test_ticket_abort_session_leak);
14269     ADD_ALL_TESTS(test_shutdown, 7);
14270     ADD_TEST(test_async_shutdown);
14271     ADD_ALL_TESTS(test_incorrect_shutdown, 2);
14272     ADD_ALL_TESTS(test_cert_cb, 6);
14273     ADD_ALL_TESTS(test_client_cert_cb, 2);
14274     ADD_ALL_TESTS(test_ca_names, 3);
14275 #ifndef OPENSSL_NO_TLS1_2
14276     ADD_ALL_TESTS(test_multiblock_write, OSSL_NELEM(multiblock_cipherlist_data));
14277 #endif
14278     ADD_ALL_TESTS(test_servername, 10);
14279     ADD_TEST(test_unknown_sigalgs_groups);
14280 #if (!defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)) || !defined(OPENSSL_NO_ML_KEM)
14281     ADD_TEST(test_configuration_of_groups);
14282 #endif
14283 #if !defined(OPENSSL_NO_EC) \
14284     && (!defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2))
14285     ADD_ALL_TESTS(test_sigalgs_available, 6);
14286 #endif
14287 #ifndef OPENSSL_NO_TLS1_3
14288     ADD_ALL_TESTS(test_pluggable_group, 2);
14289     ADD_ALL_TESTS(test_pluggable_signature, 6);
14290 #endif
14291 #ifndef OPENSSL_NO_TLS1_2
14292     ADD_TEST(test_ssl_dup);
14293     ADD_ALL_TESTS(test_session_secret_cb, 2);
14294 #ifndef OPENSSL_NO_DH
14295     ADD_ALL_TESTS(test_set_tmp_dh, 11);
14296     ADD_ALL_TESTS(test_dh_auto, 7);
14297 #endif
14298 #endif
14299 #ifndef OSSL_NO_USABLE_TLS1_3
14300     ADD_TEST(test_sni_tls13);
14301     ADD_ALL_TESTS(test_ticket_lifetime, 2);
14302 #endif
14303     ADD_TEST(test_inherit_verify_param);
14304     ADD_TEST(test_set_alpn);
14305     ADD_TEST(test_set_verify_cert_store_ssl_ctx);
14306     ADD_TEST(test_set_verify_cert_store_ssl);
14307     ADD_ALL_TESTS(test_session_timeout, 1);
14308 #if !defined(OSSL_NO_USABLE_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
14309     ADD_ALL_TESTS(test_session_cache_overflow, 4);
14310 #endif
14311     ADD_TEST(test_load_dhfile);
14312 #ifndef OSSL_NO_USABLE_TLS1_3
14313     ADD_TEST(test_read_ahead_key_change);
14314     ADD_ALL_TESTS(test_tls13_record_padding, 6);
14315 #endif
14316 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OSSL_NO_USABLE_TLS1_3)
14317     ADD_ALL_TESTS(test_serverinfo_custom, 4);
14318 #endif
14319 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
14320     ADD_ALL_TESTS(test_pipelining, 7);
14321 #endif
14322     ADD_ALL_TESTS(test_version, 6);
14323     ADD_TEST(test_rstate_string);
14324     ADD_ALL_TESTS(test_handshake_retry, 16);
14325     ADD_TEST(test_data_retry);
14326     ADD_ALL_TESTS(test_multi_resume, 5);
14327     ADD_ALL_TESTS(test_select_next_proto, OSSL_NELEM(next_proto_tests));
14328 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_NEXTPROTONEG)
14329     ADD_ALL_TESTS(test_npn, 5);
14330 #endif
14331     ADD_ALL_TESTS(test_alpn, 4);
14332 #if !defined(OSSL_NO_USABLE_TLS1_3)
14333     ADD_ALL_TESTS(test_quic_tls, 6);
14334     ADD_TEST(test_quic_tls_early_data);
14335 #endif
14336     ADD_ALL_TESTS(test_no_renegotiation, 2);
14337 #if defined(DO_SSL_TRACE_TEST)
14338     if (datadir != NULL)
14339         ADD_TEST(test_ssl_trace);
14340 #endif
14341     ADD_ALL_TESTS(test_ssl_set_groups_unsupported_keyshare, 2);
14342     ADD_ALL_TESTS(test_http_verbs, 3);
14343     return 1;
14344 
14345 err:
14346     OPENSSL_free(cert);
14347     OPENSSL_free(privkey);
14348     OPENSSL_free(cert2);
14349     OPENSSL_free(privkey2);
14350     return 0;
14351 }
14352 
14353 void cleanup_tests(void)
14354 {
14355 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DH)
14356     EVP_PKEY_free(tmp_dh_params);
14357 #endif
14358     OPENSSL_free(cert);
14359     OPENSSL_free(privkey);
14360     OPENSSL_free(cert2);
14361     OPENSSL_free(privkey2);
14362     OPENSSL_free(cert1024);
14363     OPENSSL_free(privkey1024);
14364     OPENSSL_free(cert3072);
14365     OPENSSL_free(privkey3072);
14366     OPENSSL_free(cert4096);
14367     OPENSSL_free(privkey4096);
14368     OPENSSL_free(cert8192);
14369     OPENSSL_free(privkey8192);
14370     bio_s_mempacket_test_free();
14371     bio_s_always_retry_free();
14372     bio_s_maybe_retry_free();
14373     OSSL_PROVIDER_unload(defctxnull);
14374     OSSL_LIB_CTX_free(libctx);
14375 }
14376