]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/sslapitest.c
Fix SSL_check_chain()
[thirdparty/openssl.git] / test / sslapitest.c
1 /*
2 * Copyright 2016-2018 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 #include <stdio.h>
11 #include <string.h>
12
13 #include <openssl/opensslconf.h>
14 #include <openssl/bio.h>
15 #include <openssl/crypto.h>
16 #include <openssl/ssl.h>
17 #include <openssl/ocsp.h>
18 #include <openssl/srp.h>
19 #include <openssl/txt_db.h>
20 #include <openssl/aes.h>
21 #include <openssl/rand.h>
22
23 #include "ssltestlib.h"
24 #include "testutil.h"
25 #include "testutil/output.h"
26 #include "internal/nelem.h"
27 #include "internal/ktls.h"
28 #include "../ssl/ssl_locl.h"
29
30 #ifndef OPENSSL_NO_TLS1_3
31
32 static SSL_SESSION *clientpsk = NULL;
33 static SSL_SESSION *serverpsk = NULL;
34 static const char *pskid = "Identity";
35 static const char *srvid;
36
37 static int use_session_cb(SSL *ssl, const EVP_MD *md, const unsigned char **id,
38 size_t *idlen, SSL_SESSION **sess);
39 static int find_session_cb(SSL *ssl, const unsigned char *identity,
40 size_t identity_len, SSL_SESSION **sess);
41
42 static int use_session_cb_cnt = 0;
43 static int find_session_cb_cnt = 0;
44
45 static SSL_SESSION *create_a_psk(SSL *ssl);
46 #endif
47
48 static char *cert = NULL;
49 static char *privkey = NULL;
50 static char *srpvfile = NULL;
51 static char *tmpfilename = NULL;
52
53 #define LOG_BUFFER_SIZE 2048
54 static char server_log_buffer[LOG_BUFFER_SIZE + 1] = {0};
55 static size_t server_log_buffer_index = 0;
56 static char client_log_buffer[LOG_BUFFER_SIZE + 1] = {0};
57 static size_t client_log_buffer_index = 0;
58 static int error_writing_log = 0;
59
60 #ifndef OPENSSL_NO_OCSP
61 static const unsigned char orespder[] = "Dummy OCSP Response";
62 static int ocsp_server_called = 0;
63 static int ocsp_client_called = 0;
64
65 static int cdummyarg = 1;
66 static X509 *ocspcert = NULL;
67 #endif
68
69 #define NUM_EXTRA_CERTS 40
70 #define CLIENT_VERSION_LEN 2
71
72 /*
73 * This structure is used to validate that the correct number of log messages
74 * of various types are emitted when emitting secret logs.
75 */
76 struct sslapitest_log_counts {
77 unsigned int rsa_key_exchange_count;
78 unsigned int master_secret_count;
79 unsigned int client_early_secret_count;
80 unsigned int client_handshake_secret_count;
81 unsigned int server_handshake_secret_count;
82 unsigned int client_application_secret_count;
83 unsigned int server_application_secret_count;
84 unsigned int early_exporter_secret_count;
85 unsigned int exporter_secret_count;
86 };
87
88
89 static unsigned char serverinfov1[] = {
90 0xff, 0xff, /* Dummy extension type */
91 0x00, 0x01, /* Extension length is 1 byte */
92 0xff /* Dummy extension data */
93 };
94
95 static unsigned char serverinfov2[] = {
96 0x00, 0x00, 0x00,
97 (unsigned char)(SSL_EXT_CLIENT_HELLO & 0xff), /* Dummy context - 4 bytes */
98 0xff, 0xff, /* Dummy extension type */
99 0x00, 0x01, /* Extension length is 1 byte */
100 0xff /* Dummy extension data */
101 };
102
103 static void client_keylog_callback(const SSL *ssl, const char *line)
104 {
105 int line_length = strlen(line);
106
107 /* If the log doesn't fit, error out. */
108 if (client_log_buffer_index + line_length > sizeof(client_log_buffer) - 1) {
109 TEST_info("Client log too full");
110 error_writing_log = 1;
111 return;
112 }
113
114 strcat(client_log_buffer, line);
115 client_log_buffer_index += line_length;
116 client_log_buffer[client_log_buffer_index++] = '\n';
117 }
118
119 static void server_keylog_callback(const SSL *ssl, const char *line)
120 {
121 int line_length = strlen(line);
122
123 /* If the log doesn't fit, error out. */
124 if (server_log_buffer_index + line_length > sizeof(server_log_buffer) - 1) {
125 TEST_info("Server log too full");
126 error_writing_log = 1;
127 return;
128 }
129
130 strcat(server_log_buffer, line);
131 server_log_buffer_index += line_length;
132 server_log_buffer[server_log_buffer_index++] = '\n';
133 }
134
135 static int compare_hex_encoded_buffer(const char *hex_encoded,
136 size_t hex_length,
137 const uint8_t *raw,
138 size_t raw_length)
139 {
140 size_t i, j;
141 char hexed[3];
142
143 if (!TEST_size_t_eq(raw_length * 2, hex_length))
144 return 1;
145
146 for (i = j = 0; i < raw_length && j + 1 < hex_length; i++, j += 2) {
147 sprintf(hexed, "%02x", raw[i]);
148 if (!TEST_int_eq(hexed[0], hex_encoded[j])
149 || !TEST_int_eq(hexed[1], hex_encoded[j + 1]))
150 return 1;
151 }
152
153 return 0;
154 }
155
156 static int test_keylog_output(char *buffer, const SSL *ssl,
157 const SSL_SESSION *session,
158 struct sslapitest_log_counts *expected)
159 {
160 char *token = NULL;
161 unsigned char actual_client_random[SSL3_RANDOM_SIZE] = {0};
162 size_t client_random_size = SSL3_RANDOM_SIZE;
163 unsigned char actual_master_key[SSL_MAX_MASTER_KEY_LENGTH] = {0};
164 size_t master_key_size = SSL_MAX_MASTER_KEY_LENGTH;
165 unsigned int rsa_key_exchange_count = 0;
166 unsigned int master_secret_count = 0;
167 unsigned int client_early_secret_count = 0;
168 unsigned int client_handshake_secret_count = 0;
169 unsigned int server_handshake_secret_count = 0;
170 unsigned int client_application_secret_count = 0;
171 unsigned int server_application_secret_count = 0;
172 unsigned int early_exporter_secret_count = 0;
173 unsigned int exporter_secret_count = 0;
174
175 for (token = strtok(buffer, " \n"); token != NULL;
176 token = strtok(NULL, " \n")) {
177 if (strcmp(token, "RSA") == 0) {
178 /*
179 * Premaster secret. Tokens should be: 16 ASCII bytes of
180 * hex-encoded encrypted secret, then the hex-encoded pre-master
181 * secret.
182 */
183 if (!TEST_ptr(token = strtok(NULL, " \n")))
184 return 0;
185 if (!TEST_size_t_eq(strlen(token), 16))
186 return 0;
187 if (!TEST_ptr(token = strtok(NULL, " \n")))
188 return 0;
189 /*
190 * We can't sensibly check the log because the premaster secret is
191 * transient, and OpenSSL doesn't keep hold of it once the master
192 * secret is generated.
193 */
194 rsa_key_exchange_count++;
195 } else if (strcmp(token, "CLIENT_RANDOM") == 0) {
196 /*
197 * Master secret. Tokens should be: 64 ASCII bytes of hex-encoded
198 * client random, then the hex-encoded master secret.
199 */
200 client_random_size = SSL_get_client_random(ssl,
201 actual_client_random,
202 SSL3_RANDOM_SIZE);
203 if (!TEST_size_t_eq(client_random_size, SSL3_RANDOM_SIZE))
204 return 0;
205
206 if (!TEST_ptr(token = strtok(NULL, " \n")))
207 return 0;
208 if (!TEST_size_t_eq(strlen(token), 64))
209 return 0;
210 if (!TEST_false(compare_hex_encoded_buffer(token, 64,
211 actual_client_random,
212 client_random_size)))
213 return 0;
214
215 if (!TEST_ptr(token = strtok(NULL, " \n")))
216 return 0;
217 master_key_size = SSL_SESSION_get_master_key(session,
218 actual_master_key,
219 master_key_size);
220 if (!TEST_size_t_ne(master_key_size, 0))
221 return 0;
222 if (!TEST_false(compare_hex_encoded_buffer(token, strlen(token),
223 actual_master_key,
224 master_key_size)))
225 return 0;
226 master_secret_count++;
227 } else if (strcmp(token, "CLIENT_EARLY_TRAFFIC_SECRET") == 0
228 || strcmp(token, "CLIENT_HANDSHAKE_TRAFFIC_SECRET") == 0
229 || strcmp(token, "SERVER_HANDSHAKE_TRAFFIC_SECRET") == 0
230 || strcmp(token, "CLIENT_TRAFFIC_SECRET_0") == 0
231 || strcmp(token, "SERVER_TRAFFIC_SECRET_0") == 0
232 || strcmp(token, "EARLY_EXPORTER_SECRET") == 0
233 || strcmp(token, "EXPORTER_SECRET") == 0) {
234 /*
235 * TLSv1.3 secret. Tokens should be: 64 ASCII bytes of hex-encoded
236 * client random, and then the hex-encoded secret. In this case,
237 * we treat all of these secrets identically and then just
238 * distinguish between them when counting what we saw.
239 */
240 if (strcmp(token, "CLIENT_EARLY_TRAFFIC_SECRET") == 0)
241 client_early_secret_count++;
242 else if (strcmp(token, "CLIENT_HANDSHAKE_TRAFFIC_SECRET") == 0)
243 client_handshake_secret_count++;
244 else if (strcmp(token, "SERVER_HANDSHAKE_TRAFFIC_SECRET") == 0)
245 server_handshake_secret_count++;
246 else if (strcmp(token, "CLIENT_TRAFFIC_SECRET_0") == 0)
247 client_application_secret_count++;
248 else if (strcmp(token, "SERVER_TRAFFIC_SECRET_0") == 0)
249 server_application_secret_count++;
250 else if (strcmp(token, "EARLY_EXPORTER_SECRET") == 0)
251 early_exporter_secret_count++;
252 else if (strcmp(token, "EXPORTER_SECRET") == 0)
253 exporter_secret_count++;
254
255 client_random_size = SSL_get_client_random(ssl,
256 actual_client_random,
257 SSL3_RANDOM_SIZE);
258 if (!TEST_size_t_eq(client_random_size, SSL3_RANDOM_SIZE))
259 return 0;
260
261 if (!TEST_ptr(token = strtok(NULL, " \n")))
262 return 0;
263 if (!TEST_size_t_eq(strlen(token), 64))
264 return 0;
265 if (!TEST_false(compare_hex_encoded_buffer(token, 64,
266 actual_client_random,
267 client_random_size)))
268 return 0;
269
270 if (!TEST_ptr(token = strtok(NULL, " \n")))
271 return 0;
272
273 /*
274 * TODO(TLS1.3): test that application traffic secrets are what
275 * we expect */
276 } else {
277 TEST_info("Unexpected token %s\n", token);
278 return 0;
279 }
280 }
281
282 /* Got what we expected? */
283 if (!TEST_size_t_eq(rsa_key_exchange_count,
284 expected->rsa_key_exchange_count)
285 || !TEST_size_t_eq(master_secret_count,
286 expected->master_secret_count)
287 || !TEST_size_t_eq(client_early_secret_count,
288 expected->client_early_secret_count)
289 || !TEST_size_t_eq(client_handshake_secret_count,
290 expected->client_handshake_secret_count)
291 || !TEST_size_t_eq(server_handshake_secret_count,
292 expected->server_handshake_secret_count)
293 || !TEST_size_t_eq(client_application_secret_count,
294 expected->client_application_secret_count)
295 || !TEST_size_t_eq(server_application_secret_count,
296 expected->server_application_secret_count)
297 || !TEST_size_t_eq(early_exporter_secret_count,
298 expected->early_exporter_secret_count)
299 || !TEST_size_t_eq(exporter_secret_count,
300 expected->exporter_secret_count))
301 return 0;
302 return 1;
303 }
304
305 #if !defined(OPENSSL_NO_TLS1_2) || defined(OPENSSL_NO_TLS1_3)
306 static int test_keylog(void)
307 {
308 SSL_CTX *cctx = NULL, *sctx = NULL;
309 SSL *clientssl = NULL, *serverssl = NULL;
310 int testresult = 0;
311 struct sslapitest_log_counts expected;
312
313 /* Clean up logging space */
314 memset(&expected, 0, sizeof(expected));
315 memset(client_log_buffer, 0, sizeof(client_log_buffer));
316 memset(server_log_buffer, 0, sizeof(server_log_buffer));
317 client_log_buffer_index = 0;
318 server_log_buffer_index = 0;
319 error_writing_log = 0;
320
321 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
322 TLS_client_method(),
323 TLS1_VERSION, 0,
324 &sctx, &cctx, cert, privkey)))
325 return 0;
326
327 /* We cannot log the master secret for TLSv1.3, so we should forbid it. */
328 SSL_CTX_set_options(cctx, SSL_OP_NO_TLSv1_3);
329 SSL_CTX_set_options(sctx, SSL_OP_NO_TLSv1_3);
330
331 /* We also want to ensure that we use RSA-based key exchange. */
332 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "RSA")))
333 goto end;
334
335 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx) == NULL)
336 || !TEST_true(SSL_CTX_get_keylog_callback(sctx) == NULL))
337 goto end;
338 SSL_CTX_set_keylog_callback(cctx, client_keylog_callback);
339 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx)
340 == client_keylog_callback))
341 goto end;
342 SSL_CTX_set_keylog_callback(sctx, server_keylog_callback);
343 if (!TEST_true(SSL_CTX_get_keylog_callback(sctx)
344 == server_keylog_callback))
345 goto end;
346
347 /* Now do a handshake and check that the logs have been written to. */
348 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
349 &clientssl, NULL, NULL))
350 || !TEST_true(create_ssl_connection(serverssl, clientssl,
351 SSL_ERROR_NONE))
352 || !TEST_false(error_writing_log)
353 || !TEST_int_gt(client_log_buffer_index, 0)
354 || !TEST_int_gt(server_log_buffer_index, 0))
355 goto end;
356
357 /*
358 * Now we want to test that our output data was vaguely sensible. We
359 * do that by using strtok and confirming that we have more or less the
360 * data we expect. For both client and server, we expect to see one master
361 * secret. The client should also see a RSA key exchange.
362 */
363 expected.rsa_key_exchange_count = 1;
364 expected.master_secret_count = 1;
365 if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
366 SSL_get_session(clientssl), &expected)))
367 goto end;
368
369 expected.rsa_key_exchange_count = 0;
370 if (!TEST_true(test_keylog_output(server_log_buffer, serverssl,
371 SSL_get_session(serverssl), &expected)))
372 goto end;
373
374 testresult = 1;
375
376 end:
377 SSL_free(serverssl);
378 SSL_free(clientssl);
379 SSL_CTX_free(sctx);
380 SSL_CTX_free(cctx);
381
382 return testresult;
383 }
384 #endif
385
386 #ifndef OPENSSL_NO_TLS1_3
387 static int test_keylog_no_master_key(void)
388 {
389 SSL_CTX *cctx = NULL, *sctx = NULL;
390 SSL *clientssl = NULL, *serverssl = NULL;
391 SSL_SESSION *sess = NULL;
392 int testresult = 0;
393 struct sslapitest_log_counts expected;
394 unsigned char buf[1];
395 size_t readbytes, written;
396
397 /* Clean up logging space */
398 memset(&expected, 0, sizeof(expected));
399 memset(client_log_buffer, 0, sizeof(client_log_buffer));
400 memset(server_log_buffer, 0, sizeof(server_log_buffer));
401 client_log_buffer_index = 0;
402 server_log_buffer_index = 0;
403 error_writing_log = 0;
404
405 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
406 TLS1_VERSION, 0,
407 &sctx, &cctx, cert, privkey))
408 || !TEST_true(SSL_CTX_set_max_early_data(sctx,
409 SSL3_RT_MAX_PLAIN_LENGTH)))
410 return 0;
411
412 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx) == NULL)
413 || !TEST_true(SSL_CTX_get_keylog_callback(sctx) == NULL))
414 goto end;
415
416 SSL_CTX_set_keylog_callback(cctx, client_keylog_callback);
417 if (!TEST_true(SSL_CTX_get_keylog_callback(cctx)
418 == client_keylog_callback))
419 goto end;
420
421 SSL_CTX_set_keylog_callback(sctx, server_keylog_callback);
422 if (!TEST_true(SSL_CTX_get_keylog_callback(sctx)
423 == server_keylog_callback))
424 goto end;
425
426 /* Now do a handshake and check that the logs have been written to. */
427 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
428 &clientssl, NULL, NULL))
429 || !TEST_true(create_ssl_connection(serverssl, clientssl,
430 SSL_ERROR_NONE))
431 || !TEST_false(error_writing_log))
432 goto end;
433
434 /*
435 * Now we want to test that our output data was vaguely sensible. For this
436 * test, we expect no CLIENT_RANDOM entry because it doesn't make sense for
437 * TLSv1.3, but we do expect both client and server to emit keys.
438 */
439 expected.client_handshake_secret_count = 1;
440 expected.server_handshake_secret_count = 1;
441 expected.client_application_secret_count = 1;
442 expected.server_application_secret_count = 1;
443 expected.exporter_secret_count = 1;
444 if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
445 SSL_get_session(clientssl), &expected))
446 || !TEST_true(test_keylog_output(server_log_buffer, serverssl,
447 SSL_get_session(serverssl),
448 &expected)))
449 goto end;
450
451 /* Terminate old session and resume with early data. */
452 sess = SSL_get1_session(clientssl);
453 SSL_shutdown(clientssl);
454 SSL_shutdown(serverssl);
455 SSL_free(serverssl);
456 SSL_free(clientssl);
457 serverssl = clientssl = NULL;
458
459 /* Reset key log */
460 memset(client_log_buffer, 0, sizeof(client_log_buffer));
461 memset(server_log_buffer, 0, sizeof(server_log_buffer));
462 client_log_buffer_index = 0;
463 server_log_buffer_index = 0;
464
465 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
466 &clientssl, NULL, NULL))
467 || !TEST_true(SSL_set_session(clientssl, sess))
468 /* Here writing 0 length early data is enough. */
469 || !TEST_true(SSL_write_early_data(clientssl, NULL, 0, &written))
470 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
471 &readbytes),
472 SSL_READ_EARLY_DATA_ERROR)
473 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
474 SSL_EARLY_DATA_ACCEPTED)
475 || !TEST_true(create_ssl_connection(serverssl, clientssl,
476 SSL_ERROR_NONE))
477 || !TEST_true(SSL_session_reused(clientssl)))
478 goto end;
479
480 /* In addition to the previous entries, expect early secrets. */
481 expected.client_early_secret_count = 1;
482 expected.early_exporter_secret_count = 1;
483 if (!TEST_true(test_keylog_output(client_log_buffer, clientssl,
484 SSL_get_session(clientssl), &expected))
485 || !TEST_true(test_keylog_output(server_log_buffer, serverssl,
486 SSL_get_session(serverssl),
487 &expected)))
488 goto end;
489
490 testresult = 1;
491
492 end:
493 SSL_SESSION_free(sess);
494 SSL_free(serverssl);
495 SSL_free(clientssl);
496 SSL_CTX_free(sctx);
497 SSL_CTX_free(cctx);
498
499 return testresult;
500 }
501 #endif
502
503 #ifndef OPENSSL_NO_TLS1_2
504 static int full_client_hello_callback(SSL *s, int *al, void *arg)
505 {
506 int *ctr = arg;
507 const unsigned char *p;
508 int *exts;
509 /* We only configure two ciphers, but the SCSV is added automatically. */
510 #ifdef OPENSSL_NO_EC
511 const unsigned char expected_ciphers[] = {0x00, 0x9d, 0x00, 0xff};
512 #else
513 const unsigned char expected_ciphers[] = {0x00, 0x9d, 0xc0,
514 0x2c, 0x00, 0xff};
515 #endif
516 const int expected_extensions[] = {
517 #ifndef OPENSSL_NO_EC
518 11, 10,
519 #endif
520 35, 22, 23, 13};
521 size_t len;
522
523 /* Make sure we can defer processing and get called back. */
524 if ((*ctr)++ == 0)
525 return SSL_CLIENT_HELLO_RETRY;
526
527 len = SSL_client_hello_get0_ciphers(s, &p);
528 if (!TEST_mem_eq(p, len, expected_ciphers, sizeof(expected_ciphers))
529 || !TEST_size_t_eq(
530 SSL_client_hello_get0_compression_methods(s, &p), 1)
531 || !TEST_int_eq(*p, 0))
532 return SSL_CLIENT_HELLO_ERROR;
533 if (!SSL_client_hello_get1_extensions_present(s, &exts, &len))
534 return SSL_CLIENT_HELLO_ERROR;
535 if (len != OSSL_NELEM(expected_extensions) ||
536 memcmp(exts, expected_extensions, len * sizeof(*exts)) != 0) {
537 printf("ClientHello callback expected extensions mismatch\n");
538 OPENSSL_free(exts);
539 return SSL_CLIENT_HELLO_ERROR;
540 }
541 OPENSSL_free(exts);
542 return SSL_CLIENT_HELLO_SUCCESS;
543 }
544
545 static int test_client_hello_cb(void)
546 {
547 SSL_CTX *cctx = NULL, *sctx = NULL;
548 SSL *clientssl = NULL, *serverssl = NULL;
549 int testctr = 0, testresult = 0;
550
551 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
552 TLS1_VERSION, 0,
553 &sctx, &cctx, cert, privkey)))
554 goto end;
555 SSL_CTX_set_client_hello_cb(sctx, full_client_hello_callback, &testctr);
556
557 /* The gimpy cipher list we configure can't do TLS 1.3. */
558 SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
559
560 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
561 "AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384"))
562 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
563 &clientssl, NULL, NULL))
564 || !TEST_false(create_ssl_connection(serverssl, clientssl,
565 SSL_ERROR_WANT_CLIENT_HELLO_CB))
566 /*
567 * Passing a -1 literal is a hack since
568 * the real value was lost.
569 * */
570 || !TEST_int_eq(SSL_get_error(serverssl, -1),
571 SSL_ERROR_WANT_CLIENT_HELLO_CB)
572 || !TEST_true(create_ssl_connection(serverssl, clientssl,
573 SSL_ERROR_NONE)))
574 goto end;
575
576 testresult = 1;
577
578 end:
579 SSL_free(serverssl);
580 SSL_free(clientssl);
581 SSL_CTX_free(sctx);
582 SSL_CTX_free(cctx);
583
584 return testresult;
585 }
586
587 static int test_no_ems(void)
588 {
589 SSL_CTX *cctx = NULL, *sctx = NULL;
590 SSL *clientssl = NULL, *serverssl = NULL;
591 int testresult = 0;
592
593 if (!create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
594 TLS1_VERSION, TLS1_2_VERSION,
595 &sctx, &cctx, cert, privkey)) {
596 printf("Unable to create SSL_CTX pair\n");
597 goto end;
598 }
599
600 SSL_CTX_set_options(sctx, SSL_OP_NO_EXTENDED_MASTER_SECRET);
601
602 if (!create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL, NULL)) {
603 printf("Unable to create SSL objects\n");
604 goto end;
605 }
606
607 if (!create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)) {
608 printf("Creating SSL connection failed\n");
609 goto end;
610 }
611
612 if (SSL_get_extms_support(serverssl)) {
613 printf("Server reports Extended Master Secret support\n");
614 goto end;
615 }
616
617 if (SSL_get_extms_support(clientssl)) {
618 printf("Client reports Extended Master Secret support\n");
619 goto end;
620 }
621 testresult = 1;
622
623 end:
624 SSL_free(serverssl);
625 SSL_free(clientssl);
626 SSL_CTX_free(sctx);
627 SSL_CTX_free(cctx);
628
629 return testresult;
630 }
631 #endif
632
633 static int execute_test_large_message(const SSL_METHOD *smeth,
634 const SSL_METHOD *cmeth,
635 int min_version, int max_version,
636 int read_ahead)
637 {
638 SSL_CTX *cctx = NULL, *sctx = NULL;
639 SSL *clientssl = NULL, *serverssl = NULL;
640 int testresult = 0;
641 int i;
642 BIO *certbio = NULL;
643 X509 *chaincert = NULL;
644 int certlen;
645
646 if (!TEST_ptr(certbio = BIO_new_file(cert, "r")))
647 goto end;
648 chaincert = PEM_read_bio_X509(certbio, NULL, NULL, NULL);
649 BIO_free(certbio);
650 certbio = NULL;
651 if (!TEST_ptr(chaincert))
652 goto end;
653
654 if (!TEST_true(create_ssl_ctx_pair(smeth, cmeth, min_version, max_version,
655 &sctx, &cctx, cert, privkey)))
656 goto end;
657
658 if (read_ahead) {
659 /*
660 * Test that read_ahead works correctly when dealing with large
661 * records
662 */
663 SSL_CTX_set_read_ahead(cctx, 1);
664 }
665
666 /*
667 * We assume the supplied certificate is big enough so that if we add
668 * NUM_EXTRA_CERTS it will make the overall message large enough. The
669 * default buffer size is requested to be 16k, but due to the way BUF_MEM
670 * works, it ends up allocating a little over 21k (16 * 4/3). So, in this
671 * test we need to have a message larger than that.
672 */
673 certlen = i2d_X509(chaincert, NULL);
674 OPENSSL_assert(certlen * NUM_EXTRA_CERTS >
675 (SSL3_RT_MAX_PLAIN_LENGTH * 4) / 3);
676 for (i = 0; i < NUM_EXTRA_CERTS; i++) {
677 if (!X509_up_ref(chaincert))
678 goto end;
679 if (!SSL_CTX_add_extra_chain_cert(sctx, chaincert)) {
680 X509_free(chaincert);
681 goto end;
682 }
683 }
684
685 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
686 NULL, NULL))
687 || !TEST_true(create_ssl_connection(serverssl, clientssl,
688 SSL_ERROR_NONE)))
689 goto end;
690
691 /*
692 * Calling SSL_clear() first is not required but this tests that SSL_clear()
693 * doesn't leak (when using enable-crypto-mdebug).
694 */
695 if (!TEST_true(SSL_clear(serverssl)))
696 goto end;
697
698 testresult = 1;
699 end:
700 X509_free(chaincert);
701 SSL_free(serverssl);
702 SSL_free(clientssl);
703 SSL_CTX_free(sctx);
704 SSL_CTX_free(cctx);
705
706 return testresult;
707 }
708
709 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_KTLS) \
710 && !defined(OPENSSL_NO_SOCK)
711
712 /* sock must be connected */
713 static int ktls_chk_platform(int sock)
714 {
715 if (!ktls_enable(sock))
716 return 0;
717 return 1;
718 }
719
720 static int ping_pong_query(SSL *clientssl, SSL *serverssl, int cfd, int sfd)
721 {
722 static char count = 1;
723 unsigned char cbuf[16000] = {0};
724 unsigned char sbuf[16000];
725 size_t err = 0;
726 char crec_wseq_before[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
727 char crec_wseq_after[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
728 char crec_rseq_before[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
729 char crec_rseq_after[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
730 char srec_wseq_before[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
731 char srec_wseq_after[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
732 char srec_rseq_before[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
733 char srec_rseq_after[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];
734
735 cbuf[0] = count++;
736 memcpy(crec_wseq_before, &clientssl->rlayer.write_sequence,
737 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
738 memcpy(crec_rseq_before, &clientssl->rlayer.read_sequence,
739 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
740 memcpy(srec_wseq_before, &serverssl->rlayer.write_sequence,
741 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
742 memcpy(srec_rseq_before, &serverssl->rlayer.read_sequence,
743 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
744
745 if (!TEST_true(SSL_write(clientssl, cbuf, sizeof(cbuf)) == sizeof(cbuf)))
746 goto end;
747
748 while ((err = SSL_read(serverssl, &sbuf, sizeof(sbuf))) != sizeof(sbuf)) {
749 if (SSL_get_error(serverssl, err) != SSL_ERROR_WANT_READ) {
750 goto end;
751 }
752 }
753
754 if (!TEST_true(SSL_write(serverssl, sbuf, sizeof(sbuf)) == sizeof(sbuf)))
755 goto end;
756
757 while ((err = SSL_read(clientssl, &cbuf, sizeof(cbuf))) != sizeof(cbuf)) {
758 if (SSL_get_error(clientssl, err) != SSL_ERROR_WANT_READ) {
759 goto end;
760 }
761 }
762
763 memcpy(crec_wseq_after, &clientssl->rlayer.write_sequence,
764 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
765 memcpy(crec_rseq_after, &clientssl->rlayer.read_sequence,
766 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
767 memcpy(srec_wseq_after, &serverssl->rlayer.write_sequence,
768 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
769 memcpy(srec_rseq_after, &serverssl->rlayer.read_sequence,
770 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
771
772 /* verify the payload */
773 if (!TEST_mem_eq(cbuf, sizeof(cbuf), sbuf, sizeof(sbuf)))
774 goto end;
775
776 /* ktls is used then kernel sequences are used instead of OpenSSL sequences */
777 if (clientssl->mode & SSL_MODE_NO_KTLS_TX) {
778 if (!TEST_mem_ne(crec_wseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
779 crec_wseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
780 goto end;
781 } else {
782 if (!TEST_mem_eq(crec_wseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
783 crec_wseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
784 goto end;
785 }
786
787 if (serverssl->mode & SSL_MODE_NO_KTLS_TX) {
788 if (!TEST_mem_ne(srec_wseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
789 srec_wseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
790 goto end;
791 } else {
792 if (!TEST_mem_eq(srec_wseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
793 srec_wseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
794 goto end;
795 }
796
797 if (clientssl->mode & SSL_MODE_NO_KTLS_RX) {
798 if (!TEST_mem_ne(crec_rseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
799 crec_rseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
800 goto end;
801 } else {
802 if (!TEST_mem_eq(crec_rseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
803 crec_rseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
804 goto end;
805 }
806
807 if (serverssl->mode & SSL_MODE_NO_KTLS_RX) {
808 if (!TEST_mem_ne(srec_rseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
809 srec_rseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
810 goto end;
811 } else {
812 if (!TEST_mem_eq(srec_rseq_before, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE,
813 srec_rseq_after, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE))
814 goto end;
815 }
816
817 return 1;
818 end:
819 return 0;
820 }
821
822 static int execute_test_ktls(int cis_ktls_tx, int cis_ktls_rx,
823 int sis_ktls_tx, int sis_ktls_rx)
824 {
825 SSL_CTX *cctx = NULL, *sctx = NULL;
826 SSL *clientssl = NULL, *serverssl = NULL;
827 int testresult = 0;
828 int cfd, sfd;
829
830 if (!TEST_true(create_test_sockets(&cfd, &sfd)))
831 goto end;
832
833 /* Skip this test if the platform does not support ktls */
834 if (!ktls_chk_platform(cfd))
835 return 1;
836
837 /* Create a session based on SHA-256 */
838 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
839 TLS_client_method(),
840 TLS1_2_VERSION, TLS1_2_VERSION,
841 &sctx, &cctx, cert, privkey))
842 || !TEST_true(SSL_CTX_set_cipher_list(cctx,
843 "AES128-GCM-SHA256"))
844 || !TEST_true(create_ssl_objects2(sctx, cctx, &serverssl,
845 &clientssl, sfd, cfd)))
846 goto end;
847
848 if (!cis_ktls_tx) {
849 if (!TEST_true(SSL_set_mode(clientssl, SSL_MODE_NO_KTLS_TX)))
850 goto end;
851 }
852
853 if (!sis_ktls_tx) {
854 if (!TEST_true(SSL_set_mode(serverssl, SSL_MODE_NO_KTLS_TX)))
855 goto end;
856 }
857
858 if (!cis_ktls_rx) {
859 if (!TEST_true(SSL_set_mode(clientssl, SSL_MODE_NO_KTLS_RX)))
860 goto end;
861 }
862
863 if (!sis_ktls_rx) {
864 if (!TEST_true(SSL_set_mode(serverssl, SSL_MODE_NO_KTLS_RX)))
865 goto end;
866 }
867
868 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
869 SSL_ERROR_NONE)))
870 goto end;
871
872 if (!cis_ktls_tx) {
873 if (!TEST_false(BIO_get_ktls_send(clientssl->wbio)))
874 goto end;
875 } else {
876 if (!TEST_true(BIO_get_ktls_send(clientssl->wbio)))
877 goto end;
878 }
879
880 if (!sis_ktls_tx) {
881 if (!TEST_false(BIO_get_ktls_send(serverssl->wbio)))
882 goto end;
883 } else {
884 if (!TEST_true(BIO_get_ktls_send(serverssl->wbio)))
885 goto end;
886 }
887
888 if (!cis_ktls_rx) {
889 if (!TEST_false(BIO_get_ktls_recv(clientssl->rbio)))
890 goto end;
891 } else {
892 if (!TEST_true(BIO_get_ktls_recv(clientssl->rbio)))
893 goto end;
894 }
895
896 if (!sis_ktls_rx) {
897 if (!TEST_false(BIO_get_ktls_recv(serverssl->rbio)))
898 goto end;
899 } else {
900 if (!TEST_true(BIO_get_ktls_recv(serverssl->rbio)))
901 goto end;
902 }
903
904 if (!TEST_true(ping_pong_query(clientssl, serverssl, cfd, sfd)))
905 goto end;
906
907 testresult = 1;
908 end:
909 if (clientssl) {
910 SSL_shutdown(clientssl);
911 SSL_free(clientssl);
912 }
913 if (serverssl) {
914 SSL_shutdown(serverssl);
915 SSL_free(serverssl);
916 }
917 SSL_CTX_free(sctx);
918 SSL_CTX_free(cctx);
919 serverssl = clientssl = NULL;
920 return testresult;
921 }
922
923 #define SENDFILE_SZ (16 * 4096)
924 #define SENDFILE_CHUNK (4 * 4096)
925 #define min(a,b) ((a) > (b) ? (b) : (a))
926
927 static int test_ktls_sendfile(void)
928 {
929 SSL_CTX *cctx = NULL, *sctx = NULL;
930 SSL *clientssl = NULL, *serverssl = NULL;
931 unsigned char *buf, *buf_dst;
932 BIO *out = NULL, *in = NULL;
933 int cfd, sfd, ffd, err;
934 ssize_t chunk_size = 0;
935 off_t chunk_off = 0;
936 int testresult = 0;
937 FILE *ffdp;
938
939 buf = OPENSSL_zalloc(SENDFILE_SZ);
940 buf_dst = OPENSSL_zalloc(SENDFILE_SZ);
941 if (!TEST_ptr(buf) || !TEST_ptr(buf_dst)
942 || !TEST_true(create_test_sockets(&cfd, &sfd)))
943 goto end;
944
945 /* Skip this test if the platform does not support ktls */
946 if (!ktls_chk_platform(sfd)) {
947 testresult = 1;
948 goto end;
949 }
950
951 /* Create a session based on SHA-256 */
952 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
953 TLS_client_method(),
954 TLS1_2_VERSION, TLS1_2_VERSION,
955 &sctx, &cctx, cert, privkey))
956 || !TEST_true(SSL_CTX_set_cipher_list(cctx,
957 "AES128-GCM-SHA256"))
958 || !TEST_true(create_ssl_objects2(sctx, cctx, &serverssl,
959 &clientssl, sfd, cfd)))
960 goto end;
961
962 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
963 SSL_ERROR_NONE))
964 || !TEST_true(BIO_get_ktls_send(serverssl->wbio)))
965 goto end;
966
967 RAND_bytes(buf, SENDFILE_SZ);
968 out = BIO_new_file(tmpfilename, "wb");
969 if (!TEST_ptr(out))
970 goto end;
971
972 if (BIO_write(out, buf, SENDFILE_SZ) != SENDFILE_SZ)
973 goto end;
974
975 BIO_free(out);
976 out = NULL;
977 in = BIO_new_file(tmpfilename, "rb");
978 BIO_get_fp(in, &ffdp);
979 ffd = fileno(ffdp);
980
981 while (chunk_off < SENDFILE_SZ) {
982 chunk_size = min(SENDFILE_CHUNK, SENDFILE_SZ - chunk_off);
983 while ((err = SSL_sendfile(serverssl,
984 ffd,
985 chunk_off,
986 chunk_size,
987 0)) != chunk_size) {
988 if (SSL_get_error(serverssl, err) != SSL_ERROR_WANT_WRITE)
989 goto end;
990 }
991 while ((err = SSL_read(clientssl,
992 buf_dst + chunk_off,
993 chunk_size)) != chunk_size) {
994 if (SSL_get_error(clientssl, err) != SSL_ERROR_WANT_READ)
995 goto end;
996 }
997
998 /* verify the payload */
999 if (!TEST_mem_eq(buf_dst + chunk_off,
1000 chunk_size,
1001 buf + chunk_off,
1002 chunk_size))
1003 goto end;
1004
1005 chunk_off += chunk_size;
1006 }
1007
1008 testresult = 1;
1009 end:
1010 if (clientssl) {
1011 SSL_shutdown(clientssl);
1012 SSL_free(clientssl);
1013 }
1014 if (serverssl) {
1015 SSL_shutdown(serverssl);
1016 SSL_free(serverssl);
1017 }
1018 SSL_CTX_free(sctx);
1019 SSL_CTX_free(cctx);
1020 serverssl = clientssl = NULL;
1021 BIO_free(out);
1022 BIO_free(in);
1023 OPENSSL_free(buf);
1024 OPENSSL_free(buf_dst);
1025 return testresult;
1026 }
1027
1028 static int test_ktls_no_txrx_client_no_txrx_server(void)
1029 {
1030 return execute_test_ktls(0, 0, 0, 0);
1031 }
1032
1033 static int test_ktls_no_rx_client_no_txrx_server(void)
1034 {
1035 return execute_test_ktls(1, 0, 0, 0);
1036 }
1037
1038 static int test_ktls_no_tx_client_no_txrx_server(void)
1039 {
1040 return execute_test_ktls(0, 1, 0, 0);
1041 }
1042
1043 static int test_ktls_client_no_txrx_server(void)
1044 {
1045 return execute_test_ktls(1, 1, 0, 0);
1046 }
1047
1048 static int test_ktls_no_txrx_client_no_rx_server(void)
1049 {
1050 return execute_test_ktls(0, 0, 1, 0);
1051 }
1052
1053 static int test_ktls_no_rx_client_no_rx_server(void)
1054 {
1055 return execute_test_ktls(1, 0, 1, 0);
1056 }
1057
1058 static int test_ktls_no_tx_client_no_rx_server(void)
1059 {
1060 return execute_test_ktls(0, 1, 1, 0);
1061 }
1062
1063 static int test_ktls_client_no_rx_server(void)
1064 {
1065 return execute_test_ktls(1, 1, 1, 0);
1066 }
1067
1068 static int test_ktls_no_txrx_client_no_tx_server(void)
1069 {
1070 return execute_test_ktls(0, 0, 0, 1);
1071 }
1072
1073 static int test_ktls_no_rx_client_no_tx_server(void)
1074 {
1075 return execute_test_ktls(1, 0, 0, 1);
1076 }
1077
1078 static int test_ktls_no_tx_client_no_tx_server(void)
1079 {
1080 return execute_test_ktls(0, 1, 0, 1);
1081 }
1082
1083 static int test_ktls_client_no_tx_server(void)
1084 {
1085 return execute_test_ktls(1, 1, 0, 1);
1086 }
1087
1088 static int test_ktls_no_txrx_client_server(void)
1089 {
1090 return execute_test_ktls(0, 0, 1, 1);
1091 }
1092
1093 static int test_ktls_no_rx_client_server(void)
1094 {
1095 return execute_test_ktls(1, 0, 1, 1);
1096 }
1097
1098 static int test_ktls_no_tx_client_server(void)
1099 {
1100 return execute_test_ktls(0, 1, 1, 1);
1101 }
1102
1103 static int test_ktls_client_server(void)
1104 {
1105 return execute_test_ktls(1, 1, 1, 1);
1106 }
1107 #endif
1108
1109 static int test_large_message_tls(void)
1110 {
1111 return execute_test_large_message(TLS_server_method(), TLS_client_method(),
1112 TLS1_VERSION, 0, 0);
1113 }
1114
1115 static int test_large_message_tls_read_ahead(void)
1116 {
1117 return execute_test_large_message(TLS_server_method(), TLS_client_method(),
1118 TLS1_VERSION, 0, 1);
1119 }
1120
1121 #ifndef OPENSSL_NO_DTLS
1122 static int test_large_message_dtls(void)
1123 {
1124 /*
1125 * read_ahead is not relevant to DTLS because DTLS always acts as if
1126 * read_ahead is set.
1127 */
1128 return execute_test_large_message(DTLS_server_method(),
1129 DTLS_client_method(),
1130 DTLS1_VERSION, 0, 0);
1131 }
1132 #endif
1133
1134 #ifndef OPENSSL_NO_OCSP
1135 static int ocsp_server_cb(SSL *s, void *arg)
1136 {
1137 int *argi = (int *)arg;
1138 unsigned char *copy = NULL;
1139 STACK_OF(OCSP_RESPID) *ids = NULL;
1140 OCSP_RESPID *id = NULL;
1141
1142 if (*argi == 2) {
1143 /* In this test we are expecting exactly 1 OCSP_RESPID */
1144 SSL_get_tlsext_status_ids(s, &ids);
1145 if (ids == NULL || sk_OCSP_RESPID_num(ids) != 1)
1146 return SSL_TLSEXT_ERR_ALERT_FATAL;
1147
1148 id = sk_OCSP_RESPID_value(ids, 0);
1149 if (id == NULL || !OCSP_RESPID_match(id, ocspcert))
1150 return SSL_TLSEXT_ERR_ALERT_FATAL;
1151 } else if (*argi != 1) {
1152 return SSL_TLSEXT_ERR_ALERT_FATAL;
1153 }
1154
1155 if (!TEST_ptr(copy = OPENSSL_memdup(orespder, sizeof(orespder))))
1156 return SSL_TLSEXT_ERR_ALERT_FATAL;
1157
1158 SSL_set_tlsext_status_ocsp_resp(s, copy, sizeof(orespder));
1159 ocsp_server_called = 1;
1160 return SSL_TLSEXT_ERR_OK;
1161 }
1162
1163 static int ocsp_client_cb(SSL *s, void *arg)
1164 {
1165 int *argi = (int *)arg;
1166 const unsigned char *respderin;
1167 size_t len;
1168
1169 if (*argi != 1 && *argi != 2)
1170 return 0;
1171
1172 len = SSL_get_tlsext_status_ocsp_resp(s, &respderin);
1173 if (!TEST_mem_eq(orespder, len, respderin, len))
1174 return 0;
1175
1176 ocsp_client_called = 1;
1177 return 1;
1178 }
1179
1180 static int test_tlsext_status_type(void)
1181 {
1182 SSL_CTX *cctx = NULL, *sctx = NULL;
1183 SSL *clientssl = NULL, *serverssl = NULL;
1184 int testresult = 0;
1185 STACK_OF(OCSP_RESPID) *ids = NULL;
1186 OCSP_RESPID *id = NULL;
1187 BIO *certbio = NULL;
1188
1189 if (!create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
1190 TLS1_VERSION, 0,
1191 &sctx, &cctx, cert, privkey))
1192 return 0;
1193
1194 if (SSL_CTX_get_tlsext_status_type(cctx) != -1)
1195 goto end;
1196
1197 /* First just do various checks getting and setting tlsext_status_type */
1198
1199 clientssl = SSL_new(cctx);
1200 if (!TEST_int_eq(SSL_get_tlsext_status_type(clientssl), -1)
1201 || !TEST_true(SSL_set_tlsext_status_type(clientssl,
1202 TLSEXT_STATUSTYPE_ocsp))
1203 || !TEST_int_eq(SSL_get_tlsext_status_type(clientssl),
1204 TLSEXT_STATUSTYPE_ocsp))
1205 goto end;
1206
1207 SSL_free(clientssl);
1208 clientssl = NULL;
1209
1210 if (!SSL_CTX_set_tlsext_status_type(cctx, TLSEXT_STATUSTYPE_ocsp)
1211 || SSL_CTX_get_tlsext_status_type(cctx) != TLSEXT_STATUSTYPE_ocsp)
1212 goto end;
1213
1214 clientssl = SSL_new(cctx);
1215 if (SSL_get_tlsext_status_type(clientssl) != TLSEXT_STATUSTYPE_ocsp)
1216 goto end;
1217 SSL_free(clientssl);
1218 clientssl = NULL;
1219
1220 /*
1221 * Now actually do a handshake and check OCSP information is exchanged and
1222 * the callbacks get called
1223 */
1224 SSL_CTX_set_tlsext_status_cb(cctx, ocsp_client_cb);
1225 SSL_CTX_set_tlsext_status_arg(cctx, &cdummyarg);
1226 SSL_CTX_set_tlsext_status_cb(sctx, ocsp_server_cb);
1227 SSL_CTX_set_tlsext_status_arg(sctx, &cdummyarg);
1228 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1229 &clientssl, NULL, NULL))
1230 || !TEST_true(create_ssl_connection(serverssl, clientssl,
1231 SSL_ERROR_NONE))
1232 || !TEST_true(ocsp_client_called)
1233 || !TEST_true(ocsp_server_called))
1234 goto end;
1235 SSL_free(serverssl);
1236 SSL_free(clientssl);
1237 serverssl = NULL;
1238 clientssl = NULL;
1239
1240 /* Try again but this time force the server side callback to fail */
1241 ocsp_client_called = 0;
1242 ocsp_server_called = 0;
1243 cdummyarg = 0;
1244 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1245 &clientssl, NULL, NULL))
1246 /* This should fail because the callback will fail */
1247 || !TEST_false(create_ssl_connection(serverssl, clientssl,
1248 SSL_ERROR_NONE))
1249 || !TEST_false(ocsp_client_called)
1250 || !TEST_false(ocsp_server_called))
1251 goto end;
1252 SSL_free(serverssl);
1253 SSL_free(clientssl);
1254 serverssl = NULL;
1255 clientssl = NULL;
1256
1257 /*
1258 * This time we'll get the client to send an OCSP_RESPID that it will
1259 * accept.
1260 */
1261 ocsp_client_called = 0;
1262 ocsp_server_called = 0;
1263 cdummyarg = 2;
1264 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1265 &clientssl, NULL, NULL)))
1266 goto end;
1267
1268 /*
1269 * We'll just use any old cert for this test - it doesn't have to be an OCSP
1270 * specific one. We'll use the server cert.
1271 */
1272 if (!TEST_ptr(certbio = BIO_new_file(cert, "r"))
1273 || !TEST_ptr(id = OCSP_RESPID_new())
1274 || !TEST_ptr(ids = sk_OCSP_RESPID_new_null())
1275 || !TEST_ptr(ocspcert = PEM_read_bio_X509(certbio,
1276 NULL, NULL, NULL))
1277 || !TEST_true(OCSP_RESPID_set_by_key(id, ocspcert))
1278 || !TEST_true(sk_OCSP_RESPID_push(ids, id)))
1279 goto end;
1280 id = NULL;
1281 SSL_set_tlsext_status_ids(clientssl, ids);
1282 /* Control has been transferred */
1283 ids = NULL;
1284
1285 BIO_free(certbio);
1286 certbio = NULL;
1287
1288 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1289 SSL_ERROR_NONE))
1290 || !TEST_true(ocsp_client_called)
1291 || !TEST_true(ocsp_server_called))
1292 goto end;
1293
1294 testresult = 1;
1295
1296 end:
1297 SSL_free(serverssl);
1298 SSL_free(clientssl);
1299 SSL_CTX_free(sctx);
1300 SSL_CTX_free(cctx);
1301 sk_OCSP_RESPID_pop_free(ids, OCSP_RESPID_free);
1302 OCSP_RESPID_free(id);
1303 BIO_free(certbio);
1304 X509_free(ocspcert);
1305 ocspcert = NULL;
1306
1307 return testresult;
1308 }
1309 #endif
1310
1311 #if !defined(OPENSSL_NO_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
1312 static int new_called, remove_called, get_called;
1313
1314 static int new_session_cb(SSL *ssl, SSL_SESSION *sess)
1315 {
1316 new_called++;
1317 /*
1318 * sess has been up-refed for us, but we don't actually need it so free it
1319 * immediately.
1320 */
1321 SSL_SESSION_free(sess);
1322 return 1;
1323 }
1324
1325 static void remove_session_cb(SSL_CTX *ctx, SSL_SESSION *sess)
1326 {
1327 remove_called++;
1328 }
1329
1330 static SSL_SESSION *get_sess_val = NULL;
1331
1332 static SSL_SESSION *get_session_cb(SSL *ssl, const unsigned char *id, int len,
1333 int *copy)
1334 {
1335 get_called++;
1336 *copy = 1;
1337 return get_sess_val;
1338 }
1339
1340 static int execute_test_session(int maxprot, int use_int_cache,
1341 int use_ext_cache)
1342 {
1343 SSL_CTX *sctx = NULL, *cctx = NULL;
1344 SSL *serverssl1 = NULL, *clientssl1 = NULL;
1345 SSL *serverssl2 = NULL, *clientssl2 = NULL;
1346 # ifndef OPENSSL_NO_TLS1_1
1347 SSL *serverssl3 = NULL, *clientssl3 = NULL;
1348 # endif
1349 SSL_SESSION *sess1 = NULL, *sess2 = NULL;
1350 int testresult = 0, numnewsesstick = 1;
1351
1352 new_called = remove_called = 0;
1353
1354 /* TLSv1.3 sends 2 NewSessionTickets */
1355 if (maxprot == TLS1_3_VERSION)
1356 numnewsesstick = 2;
1357
1358 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
1359 TLS1_VERSION, 0,
1360 &sctx, &cctx, cert, privkey)))
1361 return 0;
1362
1363 /*
1364 * Only allow the max protocol version so we can force a connection failure
1365 * later
1366 */
1367 SSL_CTX_set_min_proto_version(cctx, maxprot);
1368 SSL_CTX_set_max_proto_version(cctx, maxprot);
1369
1370 /* Set up session cache */
1371 if (use_ext_cache) {
1372 SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
1373 SSL_CTX_sess_set_remove_cb(cctx, remove_session_cb);
1374 }
1375 if (use_int_cache) {
1376 /* Also covers instance where both are set */
1377 SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT);
1378 } else {
1379 SSL_CTX_set_session_cache_mode(cctx,
1380 SSL_SESS_CACHE_CLIENT
1381 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
1382 }
1383
1384 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl1, &clientssl1,
1385 NULL, NULL))
1386 || !TEST_true(create_ssl_connection(serverssl1, clientssl1,
1387 SSL_ERROR_NONE))
1388 || !TEST_ptr(sess1 = SSL_get1_session(clientssl1)))
1389 goto end;
1390
1391 /* Should fail because it should already be in the cache */
1392 if (use_int_cache && !TEST_false(SSL_CTX_add_session(cctx, sess1)))
1393 goto end;
1394 if (use_ext_cache
1395 && (!TEST_int_eq(new_called, numnewsesstick)
1396
1397 || !TEST_int_eq(remove_called, 0)))
1398 goto end;
1399
1400 new_called = remove_called = 0;
1401 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
1402 &clientssl2, NULL, NULL))
1403 || !TEST_true(SSL_set_session(clientssl2, sess1))
1404 || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
1405 SSL_ERROR_NONE))
1406 || !TEST_true(SSL_session_reused(clientssl2)))
1407 goto end;
1408
1409 if (maxprot == TLS1_3_VERSION) {
1410 /*
1411 * In TLSv1.3 we should have created a new session even though we have
1412 * resumed. Since we attempted a resume we should also have removed the
1413 * old ticket from the cache so that we try to only use tickets once.
1414 */
1415 if (use_ext_cache
1416 && (!TEST_int_eq(new_called, 1)
1417 || !TEST_int_eq(remove_called, 1)))
1418 goto end;
1419 } else {
1420 /*
1421 * In TLSv1.2 we expect to have resumed so no sessions added or
1422 * removed.
1423 */
1424 if (use_ext_cache
1425 && (!TEST_int_eq(new_called, 0)
1426 || !TEST_int_eq(remove_called, 0)))
1427 goto end;
1428 }
1429
1430 SSL_SESSION_free(sess1);
1431 if (!TEST_ptr(sess1 = SSL_get1_session(clientssl2)))
1432 goto end;
1433 shutdown_ssl_connection(serverssl2, clientssl2);
1434 serverssl2 = clientssl2 = NULL;
1435
1436 new_called = remove_called = 0;
1437 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
1438 &clientssl2, NULL, NULL))
1439 || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
1440 SSL_ERROR_NONE)))
1441 goto end;
1442
1443 if (!TEST_ptr(sess2 = SSL_get1_session(clientssl2)))
1444 goto end;
1445
1446 if (use_ext_cache
1447 && (!TEST_int_eq(new_called, numnewsesstick)
1448 || !TEST_int_eq(remove_called, 0)))
1449 goto end;
1450
1451 new_called = remove_called = 0;
1452 /*
1453 * This should clear sess2 from the cache because it is a "bad" session.
1454 * See SSL_set_session() documentation.
1455 */
1456 if (!TEST_true(SSL_set_session(clientssl2, sess1)))
1457 goto end;
1458 if (use_ext_cache
1459 && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
1460 goto end;
1461 if (!TEST_ptr_eq(SSL_get_session(clientssl2), sess1))
1462 goto end;
1463
1464 if (use_int_cache) {
1465 /* Should succeeded because it should not already be in the cache */
1466 if (!TEST_true(SSL_CTX_add_session(cctx, sess2))
1467 || !TEST_true(SSL_CTX_remove_session(cctx, sess2)))
1468 goto end;
1469 }
1470
1471 new_called = remove_called = 0;
1472 /* This shouldn't be in the cache so should fail */
1473 if (!TEST_false(SSL_CTX_remove_session(cctx, sess2)))
1474 goto end;
1475
1476 if (use_ext_cache
1477 && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
1478 goto end;
1479
1480 # if !defined(OPENSSL_NO_TLS1_1)
1481 new_called = remove_called = 0;
1482 /* Force a connection failure */
1483 SSL_CTX_set_max_proto_version(sctx, TLS1_1_VERSION);
1484 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl3,
1485 &clientssl3, NULL, NULL))
1486 || !TEST_true(SSL_set_session(clientssl3, sess1))
1487 /* This should fail because of the mismatched protocol versions */
1488 || !TEST_false(create_ssl_connection(serverssl3, clientssl3,
1489 SSL_ERROR_NONE)))
1490 goto end;
1491
1492 /* We should have automatically removed the session from the cache */
1493 if (use_ext_cache
1494 && (!TEST_int_eq(new_called, 0) || !TEST_int_eq(remove_called, 1)))
1495 goto end;
1496
1497 /* Should succeed because it should not already be in the cache */
1498 if (use_int_cache && !TEST_true(SSL_CTX_add_session(cctx, sess2)))
1499 goto end;
1500 # endif
1501
1502 /* Now do some tests for server side caching */
1503 if (use_ext_cache) {
1504 SSL_CTX_sess_set_new_cb(cctx, NULL);
1505 SSL_CTX_sess_set_remove_cb(cctx, NULL);
1506 SSL_CTX_sess_set_new_cb(sctx, new_session_cb);
1507 SSL_CTX_sess_set_remove_cb(sctx, remove_session_cb);
1508 SSL_CTX_sess_set_get_cb(sctx, get_session_cb);
1509 get_sess_val = NULL;
1510 }
1511
1512 SSL_CTX_set_session_cache_mode(cctx, 0);
1513 /* Internal caching is the default on the server side */
1514 if (!use_int_cache)
1515 SSL_CTX_set_session_cache_mode(sctx,
1516 SSL_SESS_CACHE_SERVER
1517 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
1518
1519 SSL_free(serverssl1);
1520 SSL_free(clientssl1);
1521 serverssl1 = clientssl1 = NULL;
1522 SSL_free(serverssl2);
1523 SSL_free(clientssl2);
1524 serverssl2 = clientssl2 = NULL;
1525 SSL_SESSION_free(sess1);
1526 sess1 = NULL;
1527 SSL_SESSION_free(sess2);
1528 sess2 = NULL;
1529
1530 SSL_CTX_set_max_proto_version(sctx, maxprot);
1531 if (maxprot == TLS1_2_VERSION)
1532 SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET);
1533 new_called = remove_called = get_called = 0;
1534 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl1, &clientssl1,
1535 NULL, NULL))
1536 || !TEST_true(create_ssl_connection(serverssl1, clientssl1,
1537 SSL_ERROR_NONE))
1538 || !TEST_ptr(sess1 = SSL_get1_session(clientssl1))
1539 || !TEST_ptr(sess2 = SSL_get1_session(serverssl1)))
1540 goto end;
1541
1542 if (use_int_cache) {
1543 if (maxprot == TLS1_3_VERSION && !use_ext_cache) {
1544 /*
1545 * In TLSv1.3 it should not have been added to the internal cache,
1546 * except in the case where we also have an external cache (in that
1547 * case it gets added to the cache in order to generate remove
1548 * events after timeout).
1549 */
1550 if (!TEST_false(SSL_CTX_remove_session(sctx, sess2)))
1551 goto end;
1552 } else {
1553 /* Should fail because it should already be in the cache */
1554 if (!TEST_false(SSL_CTX_add_session(sctx, sess2)))
1555 goto end;
1556 }
1557 }
1558
1559 if (use_ext_cache) {
1560 SSL_SESSION *tmp = sess2;
1561
1562 if (!TEST_int_eq(new_called, numnewsesstick)
1563 || !TEST_int_eq(remove_called, 0)
1564 || !TEST_int_eq(get_called, 0))
1565 goto end;
1566 /*
1567 * Delete the session from the internal cache to force a lookup from
1568 * the external cache. We take a copy first because
1569 * SSL_CTX_remove_session() also marks the session as non-resumable.
1570 */
1571 if (use_int_cache && maxprot != TLS1_3_VERSION) {
1572 if (!TEST_ptr(tmp = SSL_SESSION_dup(sess2))
1573 || !TEST_true(SSL_CTX_remove_session(sctx, sess2)))
1574 goto end;
1575 SSL_SESSION_free(sess2);
1576 }
1577 sess2 = tmp;
1578 }
1579
1580 new_called = remove_called = get_called = 0;
1581 get_sess_val = sess2;
1582 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl2,
1583 &clientssl2, NULL, NULL))
1584 || !TEST_true(SSL_set_session(clientssl2, sess1))
1585 || !TEST_true(create_ssl_connection(serverssl2, clientssl2,
1586 SSL_ERROR_NONE))
1587 || !TEST_true(SSL_session_reused(clientssl2)))
1588 goto end;
1589
1590 if (use_ext_cache) {
1591 if (!TEST_int_eq(remove_called, 0))
1592 goto end;
1593
1594 if (maxprot == TLS1_3_VERSION) {
1595 if (!TEST_int_eq(new_called, 1)
1596 || !TEST_int_eq(get_called, 0))
1597 goto end;
1598 } else {
1599 if (!TEST_int_eq(new_called, 0)
1600 || !TEST_int_eq(get_called, 1))
1601 goto end;
1602 }
1603 }
1604
1605 testresult = 1;
1606
1607 end:
1608 SSL_free(serverssl1);
1609 SSL_free(clientssl1);
1610 SSL_free(serverssl2);
1611 SSL_free(clientssl2);
1612 # ifndef OPENSSL_NO_TLS1_1
1613 SSL_free(serverssl3);
1614 SSL_free(clientssl3);
1615 # endif
1616 SSL_SESSION_free(sess1);
1617 SSL_SESSION_free(sess2);
1618 SSL_CTX_free(sctx);
1619 SSL_CTX_free(cctx);
1620
1621 return testresult;
1622 }
1623 #endif /* !defined(OPENSSL_NO_TLS1_3) || !defined(OPENSSL_NO_TLS1_2) */
1624
1625 static int test_session_with_only_int_cache(void)
1626 {
1627 #ifndef OPENSSL_NO_TLS1_3
1628 if (!execute_test_session(TLS1_3_VERSION, 1, 0))
1629 return 0;
1630 #endif
1631
1632 #ifndef OPENSSL_NO_TLS1_2
1633 return execute_test_session(TLS1_2_VERSION, 1, 0);
1634 #else
1635 return 1;
1636 #endif
1637 }
1638
1639 static int test_session_with_only_ext_cache(void)
1640 {
1641 #ifndef OPENSSL_NO_TLS1_3
1642 if (!execute_test_session(TLS1_3_VERSION, 0, 1))
1643 return 0;
1644 #endif
1645
1646 #ifndef OPENSSL_NO_TLS1_2
1647 return execute_test_session(TLS1_2_VERSION, 0, 1);
1648 #else
1649 return 1;
1650 #endif
1651 }
1652
1653 static int test_session_with_both_cache(void)
1654 {
1655 #ifndef OPENSSL_NO_TLS1_3
1656 if (!execute_test_session(TLS1_3_VERSION, 1, 1))
1657 return 0;
1658 #endif
1659
1660 #ifndef OPENSSL_NO_TLS1_2
1661 return execute_test_session(TLS1_2_VERSION, 1, 1);
1662 #else
1663 return 1;
1664 #endif
1665 }
1666
1667 #ifndef OPENSSL_NO_TLS1_3
1668 static SSL_SESSION *sesscache[6];
1669 static int do_cache;
1670
1671 static int new_cachesession_cb(SSL *ssl, SSL_SESSION *sess)
1672 {
1673 if (do_cache) {
1674 sesscache[new_called] = sess;
1675 } else {
1676 /* We don't need the reference to the session, so free it */
1677 SSL_SESSION_free(sess);
1678 }
1679 new_called++;
1680
1681 return 1;
1682 }
1683
1684 static int post_handshake_verify(SSL *sssl, SSL *cssl)
1685 {
1686 SSL_set_verify(sssl, SSL_VERIFY_PEER, NULL);
1687 if (!TEST_true(SSL_verify_client_post_handshake(sssl)))
1688 return 0;
1689
1690 /* Start handshake on the server and client */
1691 if (!TEST_int_eq(SSL_do_handshake(sssl), 1)
1692 || !TEST_int_le(SSL_read(cssl, NULL, 0), 0)
1693 || !TEST_int_le(SSL_read(sssl, NULL, 0), 0)
1694 || !TEST_true(create_ssl_connection(sssl, cssl,
1695 SSL_ERROR_NONE)))
1696 return 0;
1697
1698 return 1;
1699 }
1700
1701 static int setup_ticket_test(int stateful, int idx, SSL_CTX **sctx,
1702 SSL_CTX **cctx)
1703 {
1704 int sess_id_ctx = 1;
1705
1706 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
1707 TLS1_VERSION, 0, sctx,
1708 cctx, cert, privkey))
1709 || !TEST_true(SSL_CTX_set_num_tickets(*sctx, idx))
1710 || !TEST_true(SSL_CTX_set_session_id_context(*sctx,
1711 (void *)&sess_id_ctx,
1712 sizeof(sess_id_ctx))))
1713 return 0;
1714
1715 if (stateful)
1716 SSL_CTX_set_options(*sctx, SSL_OP_NO_TICKET);
1717
1718 SSL_CTX_set_session_cache_mode(*cctx, SSL_SESS_CACHE_CLIENT
1719 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
1720 SSL_CTX_sess_set_new_cb(*cctx, new_cachesession_cb);
1721
1722 return 1;
1723 }
1724
1725 static int check_resumption(int idx, SSL_CTX *sctx, SSL_CTX *cctx, int succ)
1726 {
1727 SSL *serverssl = NULL, *clientssl = NULL;
1728 int i;
1729
1730 /* Test that we can resume with all the tickets we got given */
1731 for (i = 0; i < idx * 2; i++) {
1732 new_called = 0;
1733 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1734 &clientssl, NULL, NULL))
1735 || !TEST_true(SSL_set_session(clientssl, sesscache[i])))
1736 goto end;
1737
1738 SSL_set_post_handshake_auth(clientssl, 1);
1739
1740 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1741 SSL_ERROR_NONE)))
1742 goto end;
1743
1744 /*
1745 * Following a successful resumption we only get 1 ticket. After a
1746 * failed one we should get idx tickets.
1747 */
1748 if (succ) {
1749 if (!TEST_true(SSL_session_reused(clientssl))
1750 || !TEST_int_eq(new_called, 1))
1751 goto end;
1752 } else {
1753 if (!TEST_false(SSL_session_reused(clientssl))
1754 || !TEST_int_eq(new_called, idx))
1755 goto end;
1756 }
1757
1758 new_called = 0;
1759 /* After a post-handshake authentication we should get 1 new ticket */
1760 if (succ
1761 && (!post_handshake_verify(serverssl, clientssl)
1762 || !TEST_int_eq(new_called, 1)))
1763 goto end;
1764
1765 SSL_shutdown(clientssl);
1766 SSL_shutdown(serverssl);
1767 SSL_free(serverssl);
1768 SSL_free(clientssl);
1769 serverssl = clientssl = NULL;
1770 SSL_SESSION_free(sesscache[i]);
1771 sesscache[i] = NULL;
1772 }
1773
1774 return 1;
1775
1776 end:
1777 SSL_free(clientssl);
1778 SSL_free(serverssl);
1779 return 0;
1780 }
1781
1782 static int test_tickets(int stateful, int idx)
1783 {
1784 SSL_CTX *sctx = NULL, *cctx = NULL;
1785 SSL *serverssl = NULL, *clientssl = NULL;
1786 int testresult = 0;
1787 size_t j;
1788
1789 /* idx is the test number, but also the number of tickets we want */
1790
1791 new_called = 0;
1792 do_cache = 1;
1793
1794 if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
1795 goto end;
1796
1797 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1798 &clientssl, NULL, NULL)))
1799 goto end;
1800
1801 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1802 SSL_ERROR_NONE))
1803 /* Check we got the number of tickets we were expecting */
1804 || !TEST_int_eq(idx, new_called))
1805 goto end;
1806
1807 SSL_shutdown(clientssl);
1808 SSL_shutdown(serverssl);
1809 SSL_free(serverssl);
1810 SSL_free(clientssl);
1811 SSL_CTX_free(sctx);
1812 SSL_CTX_free(cctx);
1813 clientssl = serverssl = NULL;
1814 sctx = cctx = NULL;
1815
1816 /*
1817 * Now we try to resume with the tickets we previously created. The
1818 * resumption attempt is expected to fail (because we're now using a new
1819 * SSL_CTX). We should see idx number of tickets issued again.
1820 */
1821
1822 /* Stop caching sessions - just count them */
1823 do_cache = 0;
1824
1825 if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
1826 goto end;
1827
1828 if (!check_resumption(idx, sctx, cctx, 0))
1829 goto end;
1830
1831 /* Start again with caching sessions */
1832 new_called = 0;
1833 do_cache = 1;
1834 SSL_CTX_free(sctx);
1835 SSL_CTX_free(cctx);
1836 sctx = cctx = NULL;
1837
1838 if (!setup_ticket_test(stateful, idx, &sctx, &cctx))
1839 goto end;
1840
1841 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
1842 &clientssl, NULL, NULL)))
1843 goto end;
1844
1845 SSL_set_post_handshake_auth(clientssl, 1);
1846
1847 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1848 SSL_ERROR_NONE))
1849 /* Check we got the number of tickets we were expecting */
1850 || !TEST_int_eq(idx, new_called))
1851 goto end;
1852
1853 /* After a post-handshake authentication we should get new tickets issued */
1854 if (!post_handshake_verify(serverssl, clientssl)
1855 || !TEST_int_eq(idx * 2, new_called))
1856 goto end;
1857
1858 SSL_shutdown(clientssl);
1859 SSL_shutdown(serverssl);
1860 SSL_free(serverssl);
1861 SSL_free(clientssl);
1862 serverssl = clientssl = NULL;
1863
1864 /* Stop caching sessions - just count them */
1865 do_cache = 0;
1866
1867 /*
1868 * Check we can resume with all the tickets we created. This time around the
1869 * resumptions should all be successful.
1870 */
1871 if (!check_resumption(idx, sctx, cctx, 1))
1872 goto end;
1873
1874 testresult = 1;
1875
1876 end:
1877 SSL_free(serverssl);
1878 SSL_free(clientssl);
1879 for (j = 0; j < OSSL_NELEM(sesscache); j++) {
1880 SSL_SESSION_free(sesscache[j]);
1881 sesscache[j] = NULL;
1882 }
1883 SSL_CTX_free(sctx);
1884 SSL_CTX_free(cctx);
1885
1886 return testresult;
1887 }
1888
1889 static int test_stateless_tickets(int idx)
1890 {
1891 return test_tickets(0, idx);
1892 }
1893
1894 static int test_stateful_tickets(int idx)
1895 {
1896 return test_tickets(1, idx);
1897 }
1898
1899 static int test_psk_tickets(void)
1900 {
1901 SSL_CTX *sctx = NULL, *cctx = NULL;
1902 SSL *serverssl = NULL, *clientssl = NULL;
1903 int testresult = 0;
1904 int sess_id_ctx = 1;
1905
1906 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
1907 TLS1_VERSION, 0, &sctx,
1908 &cctx, NULL, NULL))
1909 || !TEST_true(SSL_CTX_set_session_id_context(sctx,
1910 (void *)&sess_id_ctx,
1911 sizeof(sess_id_ctx))))
1912 goto end;
1913
1914 SSL_CTX_set_session_cache_mode(cctx, SSL_SESS_CACHE_CLIENT
1915 | SSL_SESS_CACHE_NO_INTERNAL_STORE);
1916 SSL_CTX_set_psk_use_session_callback(cctx, use_session_cb);
1917 SSL_CTX_set_psk_find_session_callback(sctx, find_session_cb);
1918 SSL_CTX_sess_set_new_cb(cctx, new_session_cb);
1919 use_session_cb_cnt = 0;
1920 find_session_cb_cnt = 0;
1921 srvid = pskid;
1922 new_called = 0;
1923
1924 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
1925 NULL, NULL)))
1926 goto end;
1927 clientpsk = serverpsk = create_a_psk(clientssl);
1928 if (!TEST_ptr(clientpsk))
1929 goto end;
1930 SSL_SESSION_up_ref(clientpsk);
1931
1932 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
1933 SSL_ERROR_NONE))
1934 || !TEST_int_eq(1, find_session_cb_cnt)
1935 || !TEST_int_eq(1, use_session_cb_cnt)
1936 /* We should always get 1 ticket when using external PSK */
1937 || !TEST_int_eq(1, new_called))
1938 goto end;
1939
1940 testresult = 1;
1941
1942 end:
1943 SSL_free(serverssl);
1944 SSL_free(clientssl);
1945 SSL_CTX_free(sctx);
1946 SSL_CTX_free(cctx);
1947 SSL_SESSION_free(clientpsk);
1948 SSL_SESSION_free(serverpsk);
1949 clientpsk = serverpsk = NULL;
1950
1951 return testresult;
1952 }
1953 #endif
1954
1955 #define USE_NULL 0
1956 #define USE_BIO_1 1
1957 #define USE_BIO_2 2
1958 #define USE_DEFAULT 3
1959
1960 #define CONNTYPE_CONNECTION_SUCCESS 0
1961 #define CONNTYPE_CONNECTION_FAIL 1
1962 #define CONNTYPE_NO_CONNECTION 2
1963
1964 #define TOTAL_NO_CONN_SSL_SET_BIO_TESTS (3 * 3 * 3 * 3)
1965 #define TOTAL_CONN_SUCCESS_SSL_SET_BIO_TESTS (2 * 2)
1966 #if !defined(OPENSSL_NO_TLS1_3) && !defined(OPENSSL_NO_TLS1_2)
1967 # define TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS (2 * 2)
1968 #else
1969 # define TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS 0
1970 #endif
1971
1972 #define TOTAL_SSL_SET_BIO_TESTS TOTAL_NO_CONN_SSL_SET_BIO_TESTS \
1973 + TOTAL_CONN_SUCCESS_SSL_SET_BIO_TESTS \
1974 + TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS
1975
1976 static void setupbio(BIO **res, BIO *bio1, BIO *bio2, int type)
1977 {
1978 switch (type) {
1979 case USE_NULL:
1980 *res = NULL;
1981 break;
1982 case USE_BIO_1:
1983 *res = bio1;
1984 break;
1985 case USE_BIO_2:
1986 *res = bio2;
1987 break;
1988 }
1989 }
1990
1991
1992 /*
1993 * Tests calls to SSL_set_bio() under various conditions.
1994 *
1995 * For the first 3 * 3 * 3 * 3 = 81 tests we do 2 calls to SSL_set_bio() with
1996 * various combinations of valid BIOs or NULL being set for the rbio/wbio. We
1997 * then do more tests where we create a successful connection first using our
1998 * standard connection setup functions, and then call SSL_set_bio() with
1999 * various combinations of valid BIOs or NULL. We then repeat these tests
2000 * following a failed connection. In this last case we are looking to check that
2001 * SSL_set_bio() functions correctly in the case where s->bbio is not NULL.
2002 */
2003 static int test_ssl_set_bio(int idx)
2004 {
2005 SSL_CTX *sctx = NULL, *cctx = NULL;
2006 BIO *bio1 = NULL;
2007 BIO *bio2 = NULL;
2008 BIO *irbio = NULL, *iwbio = NULL, *nrbio = NULL, *nwbio = NULL;
2009 SSL *serverssl = NULL, *clientssl = NULL;
2010 int initrbio, initwbio, newrbio, newwbio, conntype;
2011 int testresult = 0;
2012
2013 if (idx < TOTAL_NO_CONN_SSL_SET_BIO_TESTS) {
2014 initrbio = idx % 3;
2015 idx /= 3;
2016 initwbio = idx % 3;
2017 idx /= 3;
2018 newrbio = idx % 3;
2019 idx /= 3;
2020 newwbio = idx % 3;
2021 conntype = CONNTYPE_NO_CONNECTION;
2022 } else {
2023 idx -= TOTAL_NO_CONN_SSL_SET_BIO_TESTS;
2024 initrbio = initwbio = USE_DEFAULT;
2025 newrbio = idx % 2;
2026 idx /= 2;
2027 newwbio = idx % 2;
2028 idx /= 2;
2029 conntype = idx % 2;
2030 }
2031
2032 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
2033 TLS1_VERSION, 0,
2034 &sctx, &cctx, cert, privkey)))
2035 goto end;
2036
2037 if (conntype == CONNTYPE_CONNECTION_FAIL) {
2038 /*
2039 * We won't ever get here if either TLSv1.3 or TLSv1.2 is disabled
2040 * because we reduced the number of tests in the definition of
2041 * TOTAL_CONN_FAIL_SSL_SET_BIO_TESTS to avoid this scenario. By setting
2042 * mismatched protocol versions we will force a connection failure.
2043 */
2044 SSL_CTX_set_min_proto_version(sctx, TLS1_3_VERSION);
2045 SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
2046 }
2047
2048 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
2049 NULL, NULL)))
2050 goto end;
2051
2052 if (initrbio == USE_BIO_1
2053 || initwbio == USE_BIO_1
2054 || newrbio == USE_BIO_1
2055 || newwbio == USE_BIO_1) {
2056 if (!TEST_ptr(bio1 = BIO_new(BIO_s_mem())))
2057 goto end;
2058 }
2059
2060 if (initrbio == USE_BIO_2
2061 || initwbio == USE_BIO_2
2062 || newrbio == USE_BIO_2
2063 || newwbio == USE_BIO_2) {
2064 if (!TEST_ptr(bio2 = BIO_new(BIO_s_mem())))
2065 goto end;
2066 }
2067
2068 if (initrbio != USE_DEFAULT) {
2069 setupbio(&irbio, bio1, bio2, initrbio);
2070 setupbio(&iwbio, bio1, bio2, initwbio);
2071 SSL_set_bio(clientssl, irbio, iwbio);
2072
2073 /*
2074 * We want to maintain our own refs to these BIO, so do an up ref for
2075 * each BIO that will have ownership transferred in the SSL_set_bio()
2076 * call
2077 */
2078 if (irbio != NULL)
2079 BIO_up_ref(irbio);
2080 if (iwbio != NULL && iwbio != irbio)
2081 BIO_up_ref(iwbio);
2082 }
2083
2084 if (conntype != CONNTYPE_NO_CONNECTION
2085 && !TEST_true(create_ssl_connection(serverssl, clientssl,
2086 SSL_ERROR_NONE)
2087 == (conntype == CONNTYPE_CONNECTION_SUCCESS)))
2088 goto end;
2089
2090 setupbio(&nrbio, bio1, bio2, newrbio);
2091 setupbio(&nwbio, bio1, bio2, newwbio);
2092
2093 /*
2094 * We will (maybe) transfer ownership again so do more up refs.
2095 * SSL_set_bio() has some really complicated ownership rules where BIOs have
2096 * already been set!
2097 */
2098 if (nrbio != NULL
2099 && nrbio != irbio
2100 && (nwbio != iwbio || nrbio != nwbio))
2101 BIO_up_ref(nrbio);
2102 if (nwbio != NULL
2103 && nwbio != nrbio
2104 && (nwbio != iwbio || (nwbio == iwbio && irbio == iwbio)))
2105 BIO_up_ref(nwbio);
2106
2107 SSL_set_bio(clientssl, nrbio, nwbio);
2108
2109 testresult = 1;
2110
2111 end:
2112 BIO_free(bio1);
2113 BIO_free(bio2);
2114
2115 /*
2116 * This test is checking that the ref counting for SSL_set_bio is correct.
2117 * If we get here and we did too many frees then we will fail in the above
2118 * functions. If we haven't done enough then this will only be detected in
2119 * a crypto-mdebug build
2120 */
2121 SSL_free(serverssl);
2122 SSL_free(clientssl);
2123 SSL_CTX_free(sctx);
2124 SSL_CTX_free(cctx);
2125 return testresult;
2126 }
2127
2128 typedef enum { NO_BIO_CHANGE, CHANGE_RBIO, CHANGE_WBIO } bio_change_t;
2129
2130 static int execute_test_ssl_bio(int pop_ssl, bio_change_t change_bio)
2131 {
2132 BIO *sslbio = NULL, *membio1 = NULL, *membio2 = NULL;
2133 SSL_CTX *ctx;
2134 SSL *ssl = NULL;
2135 int testresult = 0;
2136
2137 if (!TEST_ptr(ctx = SSL_CTX_new(TLS_method()))
2138 || !TEST_ptr(ssl = SSL_new(ctx))
2139 || !TEST_ptr(sslbio = BIO_new(BIO_f_ssl()))
2140 || !TEST_ptr(membio1 = BIO_new(BIO_s_mem())))
2141 goto end;
2142
2143 BIO_set_ssl(sslbio, ssl, BIO_CLOSE);
2144
2145 /*
2146 * If anything goes wrong here then we could leak memory, so this will
2147 * be caught in a crypto-mdebug build
2148 */
2149 BIO_push(sslbio, membio1);
2150
2151 /* Verify changing the rbio/wbio directly does not cause leaks */
2152 if (change_bio != NO_BIO_CHANGE) {
2153 if (!TEST_ptr(membio2 = BIO_new(BIO_s_mem())))
2154 goto end;
2155 if (change_bio == CHANGE_RBIO)
2156 SSL_set0_rbio(ssl, membio2);
2157 else
2158 SSL_set0_wbio(ssl, membio2);
2159 }
2160 ssl = NULL;
2161
2162 if (pop_ssl)
2163 BIO_pop(sslbio);
2164 else
2165 BIO_pop(membio1);
2166
2167 testresult = 1;
2168 end:
2169 BIO_free(membio1);
2170 BIO_free(sslbio);
2171 SSL_free(ssl);
2172 SSL_CTX_free(ctx);
2173
2174 return testresult;
2175 }
2176
2177 static int test_ssl_bio_pop_next_bio(void)
2178 {
2179 return execute_test_ssl_bio(0, NO_BIO_CHANGE);
2180 }
2181
2182 static int test_ssl_bio_pop_ssl_bio(void)
2183 {
2184 return execute_test_ssl_bio(1, NO_BIO_CHANGE);
2185 }
2186
2187 static int test_ssl_bio_change_rbio(void)
2188 {
2189 return execute_test_ssl_bio(0, CHANGE_RBIO);
2190 }
2191
2192 static int test_ssl_bio_change_wbio(void)
2193 {
2194 return execute_test_ssl_bio(0, CHANGE_WBIO);
2195 }
2196
2197 #if !defined(OPENSSL_NO_TLS1_2) || defined(OPENSSL_NO_TLS1_3)
2198 typedef struct {
2199 /* The list of sig algs */
2200 const int *list;
2201 /* The length of the list */
2202 size_t listlen;
2203 /* A sigalgs list in string format */
2204 const char *liststr;
2205 /* Whether setting the list should succeed */
2206 int valid;
2207 /* Whether creating a connection with the list should succeed */
2208 int connsuccess;
2209 } sigalgs_list;
2210
2211 static const int validlist1[] = {NID_sha256, EVP_PKEY_RSA};
2212 # ifndef OPENSSL_NO_EC
2213 static const int validlist2[] = {NID_sha256, EVP_PKEY_RSA, NID_sha512, EVP_PKEY_EC};
2214 static const int validlist3[] = {NID_sha512, EVP_PKEY_EC};
2215 # endif
2216 static const int invalidlist1[] = {NID_undef, EVP_PKEY_RSA};
2217 static const int invalidlist2[] = {NID_sha256, NID_undef};
2218 static const int invalidlist3[] = {NID_sha256, EVP_PKEY_RSA, NID_sha256};
2219 static const int invalidlist4[] = {NID_sha256};
2220 static const sigalgs_list testsigalgs[] = {
2221 {validlist1, OSSL_NELEM(validlist1), NULL, 1, 1},
2222 # ifndef OPENSSL_NO_EC
2223 {validlist2, OSSL_NELEM(validlist2), NULL, 1, 1},
2224 {validlist3, OSSL_NELEM(validlist3), NULL, 1, 0},
2225 # endif
2226 {NULL, 0, "RSA+SHA256", 1, 1},
2227 # ifndef OPENSSL_NO_EC
2228 {NULL, 0, "RSA+SHA256:ECDSA+SHA512", 1, 1},
2229 {NULL, 0, "ECDSA+SHA512", 1, 0},
2230 # endif
2231 {invalidlist1, OSSL_NELEM(invalidlist1), NULL, 0, 0},
2232 {invalidlist2, OSSL_NELEM(invalidlist2), NULL, 0, 0},
2233 {invalidlist3, OSSL_NELEM(invalidlist3), NULL, 0, 0},
2234 {invalidlist4, OSSL_NELEM(invalidlist4), NULL, 0, 0},
2235 {NULL, 0, "RSA", 0, 0},
2236 {NULL, 0, "SHA256", 0, 0},
2237 {NULL, 0, "RSA+SHA256:SHA256", 0, 0},
2238 {NULL, 0, "Invalid", 0, 0}
2239 };
2240
2241 static int test_set_sigalgs(int idx)
2242 {
2243 SSL_CTX *cctx = NULL, *sctx = NULL;
2244 SSL *clientssl = NULL, *serverssl = NULL;
2245 int testresult = 0;
2246 const sigalgs_list *curr;
2247 int testctx;
2248
2249 /* Should never happen */
2250 if (!TEST_size_t_le((size_t)idx, OSSL_NELEM(testsigalgs) * 2))
2251 return 0;
2252
2253 testctx = ((size_t)idx < OSSL_NELEM(testsigalgs));
2254 curr = testctx ? &testsigalgs[idx]
2255 : &testsigalgs[idx - OSSL_NELEM(testsigalgs)];
2256
2257 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
2258 TLS1_VERSION, 0,
2259 &sctx, &cctx, cert, privkey)))
2260 return 0;
2261
2262 /*
2263 * TODO(TLS1.3): These APIs cannot set TLSv1.3 sig algs so we just test it
2264 * for TLSv1.2 for now until we add a new API.
2265 */
2266 SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION);
2267
2268 if (testctx) {
2269 int ret;
2270
2271 if (curr->list != NULL)
2272 ret = SSL_CTX_set1_sigalgs(cctx, curr->list, curr->listlen);
2273 else
2274 ret = SSL_CTX_set1_sigalgs_list(cctx, curr->liststr);
2275
2276 if (!ret) {
2277 if (curr->valid)
2278 TEST_info("Failure setting sigalgs in SSL_CTX (%d)\n", idx);
2279 else
2280 testresult = 1;
2281 goto end;
2282 }
2283 if (!curr->valid) {
2284 TEST_info("Not-failed setting sigalgs in SSL_CTX (%d)\n", idx);
2285 goto end;
2286 }
2287 }
2288
2289 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2290 &clientssl, NULL, NULL)))
2291 goto end;
2292
2293 if (!testctx) {
2294 int ret;
2295
2296 if (curr->list != NULL)
2297 ret = SSL_set1_sigalgs(clientssl, curr->list, curr->listlen);
2298 else
2299 ret = SSL_set1_sigalgs_list(clientssl, curr->liststr);
2300 if (!ret) {
2301 if (curr->valid)
2302 TEST_info("Failure setting sigalgs in SSL (%d)\n", idx);
2303 else
2304 testresult = 1;
2305 goto end;
2306 }
2307 if (!curr->valid)
2308 goto end;
2309 }
2310
2311 if (!TEST_int_eq(create_ssl_connection(serverssl, clientssl,
2312 SSL_ERROR_NONE),
2313 curr->connsuccess))
2314 goto end;
2315
2316 testresult = 1;
2317
2318 end:
2319 SSL_free(serverssl);
2320 SSL_free(clientssl);
2321 SSL_CTX_free(sctx);
2322 SSL_CTX_free(cctx);
2323
2324 return testresult;
2325 }
2326 #endif
2327
2328 #ifndef OPENSSL_NO_TLS1_3
2329 static int psk_client_cb_cnt = 0;
2330 static int psk_server_cb_cnt = 0;
2331
2332 static int use_session_cb(SSL *ssl, const EVP_MD *md, const unsigned char **id,
2333 size_t *idlen, SSL_SESSION **sess)
2334 {
2335 switch (++use_session_cb_cnt) {
2336 case 1:
2337 /* The first call should always have a NULL md */
2338 if (md != NULL)
2339 return 0;
2340 break;
2341
2342 case 2:
2343 /* The second call should always have an md */
2344 if (md == NULL)
2345 return 0;
2346 break;
2347
2348 default:
2349 /* We should only be called a maximum of twice */
2350 return 0;
2351 }
2352
2353 if (clientpsk != NULL)
2354 SSL_SESSION_up_ref(clientpsk);
2355
2356 *sess = clientpsk;
2357 *id = (const unsigned char *)pskid;
2358 *idlen = strlen(pskid);
2359
2360 return 1;
2361 }
2362
2363 #ifndef OPENSSL_NO_PSK
2364 static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *id,
2365 unsigned int max_id_len,
2366 unsigned char *psk,
2367 unsigned int max_psk_len)
2368 {
2369 unsigned int psklen = 0;
2370
2371 psk_client_cb_cnt++;
2372
2373 if (strlen(pskid) + 1 > max_id_len)
2374 return 0;
2375
2376 /* We should only ever be called a maximum of twice per connection */
2377 if (psk_client_cb_cnt > 2)
2378 return 0;
2379
2380 if (clientpsk == NULL)
2381 return 0;
2382
2383 /* We'll reuse the PSK we set up for TLSv1.3 */
2384 if (SSL_SESSION_get_master_key(clientpsk, NULL, 0) > max_psk_len)
2385 return 0;
2386 psklen = SSL_SESSION_get_master_key(clientpsk, psk, max_psk_len);
2387 strncpy(id, pskid, max_id_len);
2388
2389 return psklen;
2390 }
2391 #endif /* OPENSSL_NO_PSK */
2392
2393 static int find_session_cb(SSL *ssl, const unsigned char *identity,
2394 size_t identity_len, SSL_SESSION **sess)
2395 {
2396 find_session_cb_cnt++;
2397
2398 /* We should only ever be called a maximum of twice per connection */
2399 if (find_session_cb_cnt > 2)
2400 return 0;
2401
2402 if (serverpsk == NULL)
2403 return 0;
2404
2405 /* Identity should match that set by the client */
2406 if (strlen(srvid) != identity_len
2407 || strncmp(srvid, (const char *)identity, identity_len) != 0) {
2408 /* No PSK found, continue but without a PSK */
2409 *sess = NULL;
2410 return 1;
2411 }
2412
2413 SSL_SESSION_up_ref(serverpsk);
2414 *sess = serverpsk;
2415
2416 return 1;
2417 }
2418
2419 #ifndef OPENSSL_NO_PSK
2420 static unsigned int psk_server_cb(SSL *ssl, const char *identity,
2421 unsigned char *psk, unsigned int max_psk_len)
2422 {
2423 unsigned int psklen = 0;
2424
2425 psk_server_cb_cnt++;
2426
2427 /* We should only ever be called a maximum of twice per connection */
2428 if (find_session_cb_cnt > 2)
2429 return 0;
2430
2431 if (serverpsk == NULL)
2432 return 0;
2433
2434 /* Identity should match that set by the client */
2435 if (strcmp(srvid, identity) != 0) {
2436 return 0;
2437 }
2438
2439 /* We'll reuse the PSK we set up for TLSv1.3 */
2440 if (SSL_SESSION_get_master_key(serverpsk, NULL, 0) > max_psk_len)
2441 return 0;
2442 psklen = SSL_SESSION_get_master_key(serverpsk, psk, max_psk_len);
2443
2444 return psklen;
2445 }
2446 #endif /* OPENSSL_NO_PSK */
2447
2448 #define MSG1 "Hello"
2449 #define MSG2 "World."
2450 #define MSG3 "This"
2451 #define MSG4 "is"
2452 #define MSG5 "a"
2453 #define MSG6 "test"
2454 #define MSG7 "message."
2455
2456 #define TLS13_AES_256_GCM_SHA384_BYTES ((const unsigned char *)"\x13\x02")
2457 #define TLS13_AES_128_GCM_SHA256_BYTES ((const unsigned char *)"\x13\x01")
2458
2459
2460 static SSL_SESSION *create_a_psk(SSL *ssl)
2461 {
2462 const SSL_CIPHER *cipher = NULL;
2463 const unsigned char key[] = {
2464 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
2465 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2466 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
2467 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
2468 0x2c, 0x2d, 0x2e, 0x2f
2469 };
2470 SSL_SESSION *sess = NULL;
2471
2472 cipher = SSL_CIPHER_find(ssl, TLS13_AES_256_GCM_SHA384_BYTES);
2473 sess = SSL_SESSION_new();
2474 if (!TEST_ptr(sess)
2475 || !TEST_ptr(cipher)
2476 || !TEST_true(SSL_SESSION_set1_master_key(sess, key,
2477 sizeof(key)))
2478 || !TEST_true(SSL_SESSION_set_cipher(sess, cipher))
2479 || !TEST_true(
2480 SSL_SESSION_set_protocol_version(sess,
2481 TLS1_3_VERSION))) {
2482 SSL_SESSION_free(sess);
2483 return NULL;
2484 }
2485 return sess;
2486 }
2487
2488 /*
2489 * Helper method to setup objects for early data test. Caller frees objects on
2490 * error.
2491 */
2492 static int setupearly_data_test(SSL_CTX **cctx, SSL_CTX **sctx, SSL **clientssl,
2493 SSL **serverssl, SSL_SESSION **sess, int idx)
2494 {
2495 if (*sctx == NULL
2496 && !TEST_true(create_ssl_ctx_pair(TLS_server_method(),
2497 TLS_client_method(),
2498 TLS1_VERSION, 0,
2499 sctx, cctx, cert, privkey)))
2500 return 0;
2501
2502 if (!TEST_true(SSL_CTX_set_max_early_data(*sctx, SSL3_RT_MAX_PLAIN_LENGTH)))
2503 return 0;
2504
2505 if (idx == 1) {
2506 /* When idx == 1 we repeat the tests with read_ahead set */
2507 SSL_CTX_set_read_ahead(*cctx, 1);
2508 SSL_CTX_set_read_ahead(*sctx, 1);
2509 } else if (idx == 2) {
2510 /* When idx == 2 we are doing early_data with a PSK. Set up callbacks */
2511 SSL_CTX_set_psk_use_session_callback(*cctx, use_session_cb);
2512 SSL_CTX_set_psk_find_session_callback(*sctx, find_session_cb);
2513 use_session_cb_cnt = 0;
2514 find_session_cb_cnt = 0;
2515 srvid = pskid;
2516 }
2517
2518 if (!TEST_true(create_ssl_objects(*sctx, *cctx, serverssl, clientssl,
2519 NULL, NULL)))
2520 return 0;
2521
2522 /*
2523 * For one of the run throughs (doesn't matter which one), we'll try sending
2524 * some SNI data in the initial ClientHello. This will be ignored (because
2525 * there is no SNI cb set up by the server), so it should not impact
2526 * early_data.
2527 */
2528 if (idx == 1
2529 && !TEST_true(SSL_set_tlsext_host_name(*clientssl, "localhost")))
2530 return 0;
2531
2532 if (idx == 2) {
2533 clientpsk = create_a_psk(*clientssl);
2534 if (!TEST_ptr(clientpsk)
2535 /*
2536 * We just choose an arbitrary value for max_early_data which
2537 * should be big enough for testing purposes.
2538 */
2539 || !TEST_true(SSL_SESSION_set_max_early_data(clientpsk,
2540 0x100))
2541 || !TEST_true(SSL_SESSION_up_ref(clientpsk))) {
2542 SSL_SESSION_free(clientpsk);
2543 clientpsk = NULL;
2544 return 0;
2545 }
2546 serverpsk = clientpsk;
2547
2548 if (sess != NULL) {
2549 if (!TEST_true(SSL_SESSION_up_ref(clientpsk))) {
2550 SSL_SESSION_free(clientpsk);
2551 SSL_SESSION_free(serverpsk);
2552 clientpsk = serverpsk = NULL;
2553 return 0;
2554 }
2555 *sess = clientpsk;
2556 }
2557 return 1;
2558 }
2559
2560 if (sess == NULL)
2561 return 1;
2562
2563 if (!TEST_true(create_ssl_connection(*serverssl, *clientssl,
2564 SSL_ERROR_NONE)))
2565 return 0;
2566
2567 *sess = SSL_get1_session(*clientssl);
2568 SSL_shutdown(*clientssl);
2569 SSL_shutdown(*serverssl);
2570 SSL_free(*serverssl);
2571 SSL_free(*clientssl);
2572 *serverssl = *clientssl = NULL;
2573
2574 if (!TEST_true(create_ssl_objects(*sctx, *cctx, serverssl,
2575 clientssl, NULL, NULL))
2576 || !TEST_true(SSL_set_session(*clientssl, *sess)))
2577 return 0;
2578
2579 return 1;
2580 }
2581
2582 static int test_early_data_read_write(int idx)
2583 {
2584 SSL_CTX *cctx = NULL, *sctx = NULL;
2585 SSL *clientssl = NULL, *serverssl = NULL;
2586 int testresult = 0;
2587 SSL_SESSION *sess = NULL;
2588 unsigned char buf[20], data[1024];
2589 size_t readbytes, written, eoedlen, rawread, rawwritten;
2590 BIO *rbio;
2591
2592 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
2593 &serverssl, &sess, idx)))
2594 goto end;
2595
2596 /* Write and read some early data */
2597 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
2598 &written))
2599 || !TEST_size_t_eq(written, strlen(MSG1))
2600 || !TEST_int_eq(SSL_read_early_data(serverssl, buf,
2601 sizeof(buf), &readbytes),
2602 SSL_READ_EARLY_DATA_SUCCESS)
2603 || !TEST_mem_eq(MSG1, readbytes, buf, strlen(MSG1))
2604 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
2605 SSL_EARLY_DATA_ACCEPTED))
2606 goto end;
2607
2608 /*
2609 * Server should be able to write data, and client should be able to
2610 * read it.
2611 */
2612 if (!TEST_true(SSL_write_early_data(serverssl, MSG2, strlen(MSG2),
2613 &written))
2614 || !TEST_size_t_eq(written, strlen(MSG2))
2615 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
2616 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
2617 goto end;
2618
2619 /* Even after reading normal data, client should be able write early data */
2620 if (!TEST_true(SSL_write_early_data(clientssl, MSG3, strlen(MSG3),
2621 &written))
2622 || !TEST_size_t_eq(written, strlen(MSG3)))
2623 goto end;
2624
2625 /* Server should still be able read early data after writing data */
2626 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2627 &readbytes),
2628 SSL_READ_EARLY_DATA_SUCCESS)
2629 || !TEST_mem_eq(buf, readbytes, MSG3, strlen(MSG3)))
2630 goto end;
2631
2632 /* Write more data from server and read it from client */
2633 if (!TEST_true(SSL_write_early_data(serverssl, MSG4, strlen(MSG4),
2634 &written))
2635 || !TEST_size_t_eq(written, strlen(MSG4))
2636 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
2637 || !TEST_mem_eq(buf, readbytes, MSG4, strlen(MSG4)))
2638 goto end;
2639
2640 /*
2641 * If client writes normal data it should mean writing early data is no
2642 * longer possible.
2643 */
2644 if (!TEST_true(SSL_write_ex(clientssl, MSG5, strlen(MSG5), &written))
2645 || !TEST_size_t_eq(written, strlen(MSG5))
2646 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
2647 SSL_EARLY_DATA_ACCEPTED))
2648 goto end;
2649
2650 /*
2651 * At this point the client has written EndOfEarlyData, ClientFinished and
2652 * normal (fully protected) data. We are going to cause a delay between the
2653 * arrival of EndOfEarlyData and ClientFinished. We read out all the data
2654 * in the read BIO, and then just put back the EndOfEarlyData message.
2655 */
2656 rbio = SSL_get_rbio(serverssl);
2657 if (!TEST_true(BIO_read_ex(rbio, data, sizeof(data), &rawread))
2658 || !TEST_size_t_lt(rawread, sizeof(data))
2659 || !TEST_size_t_gt(rawread, SSL3_RT_HEADER_LENGTH))
2660 goto end;
2661
2662 /* Record length is in the 4th and 5th bytes of the record header */
2663 eoedlen = SSL3_RT_HEADER_LENGTH + (data[3] << 8 | data[4]);
2664 if (!TEST_true(BIO_write_ex(rbio, data, eoedlen, &rawwritten))
2665 || !TEST_size_t_eq(rawwritten, eoedlen))
2666 goto end;
2667
2668 /* Server should be told that there is no more early data */
2669 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2670 &readbytes),
2671 SSL_READ_EARLY_DATA_FINISH)
2672 || !TEST_size_t_eq(readbytes, 0))
2673 goto end;
2674
2675 /*
2676 * Server has not finished init yet, so should still be able to write early
2677 * data.
2678 */
2679 if (!TEST_true(SSL_write_early_data(serverssl, MSG6, strlen(MSG6),
2680 &written))
2681 || !TEST_size_t_eq(written, strlen(MSG6)))
2682 goto end;
2683
2684 /* Push the ClientFinished and the normal data back into the server rbio */
2685 if (!TEST_true(BIO_write_ex(rbio, data + eoedlen, rawread - eoedlen,
2686 &rawwritten))
2687 || !TEST_size_t_eq(rawwritten, rawread - eoedlen))
2688 goto end;
2689
2690 /* Server should be able to read normal data */
2691 if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
2692 || !TEST_size_t_eq(readbytes, strlen(MSG5)))
2693 goto end;
2694
2695 /* Client and server should not be able to write/read early data now */
2696 if (!TEST_false(SSL_write_early_data(clientssl, MSG6, strlen(MSG6),
2697 &written)))
2698 goto end;
2699 ERR_clear_error();
2700 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2701 &readbytes),
2702 SSL_READ_EARLY_DATA_ERROR))
2703 goto end;
2704 ERR_clear_error();
2705
2706 /* Client should be able to read the data sent by the server */
2707 if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
2708 || !TEST_mem_eq(buf, readbytes, MSG6, strlen(MSG6)))
2709 goto end;
2710
2711 /*
2712 * Make sure we process the two NewSessionTickets. These arrive
2713 * post-handshake. We attempt reads which we do not expect to return any
2714 * data.
2715 */
2716 if (!TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
2717 || !TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf),
2718 &readbytes)))
2719 goto end;
2720
2721 /* Server should be able to write normal data */
2722 if (!TEST_true(SSL_write_ex(serverssl, MSG7, strlen(MSG7), &written))
2723 || !TEST_size_t_eq(written, strlen(MSG7))
2724 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
2725 || !TEST_mem_eq(buf, readbytes, MSG7, strlen(MSG7)))
2726 goto end;
2727
2728 SSL_SESSION_free(sess);
2729 sess = SSL_get1_session(clientssl);
2730 use_session_cb_cnt = 0;
2731 find_session_cb_cnt = 0;
2732
2733 SSL_shutdown(clientssl);
2734 SSL_shutdown(serverssl);
2735 SSL_free(serverssl);
2736 SSL_free(clientssl);
2737 serverssl = clientssl = NULL;
2738 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2739 &clientssl, NULL, NULL))
2740 || !TEST_true(SSL_set_session(clientssl, sess)))
2741 goto end;
2742
2743 /* Write and read some early data */
2744 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
2745 &written))
2746 || !TEST_size_t_eq(written, strlen(MSG1))
2747 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2748 &readbytes),
2749 SSL_READ_EARLY_DATA_SUCCESS)
2750 || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1)))
2751 goto end;
2752
2753 if (!TEST_int_gt(SSL_connect(clientssl), 0)
2754 || !TEST_int_gt(SSL_accept(serverssl), 0))
2755 goto end;
2756
2757 /* Client and server should not be able to write/read early data now */
2758 if (!TEST_false(SSL_write_early_data(clientssl, MSG6, strlen(MSG6),
2759 &written)))
2760 goto end;
2761 ERR_clear_error();
2762 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2763 &readbytes),
2764 SSL_READ_EARLY_DATA_ERROR))
2765 goto end;
2766 ERR_clear_error();
2767
2768 /* Client and server should be able to write/read normal data */
2769 if (!TEST_true(SSL_write_ex(clientssl, MSG5, strlen(MSG5), &written))
2770 || !TEST_size_t_eq(written, strlen(MSG5))
2771 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
2772 || !TEST_size_t_eq(readbytes, strlen(MSG5)))
2773 goto end;
2774
2775 testresult = 1;
2776
2777 end:
2778 SSL_SESSION_free(sess);
2779 SSL_SESSION_free(clientpsk);
2780 SSL_SESSION_free(serverpsk);
2781 clientpsk = serverpsk = NULL;
2782 SSL_free(serverssl);
2783 SSL_free(clientssl);
2784 SSL_CTX_free(sctx);
2785 SSL_CTX_free(cctx);
2786 return testresult;
2787 }
2788
2789 static int allow_ed_cb_called = 0;
2790
2791 static int allow_early_data_cb(SSL *s, void *arg)
2792 {
2793 int *usecb = (int *)arg;
2794
2795 allow_ed_cb_called++;
2796
2797 if (*usecb == 1)
2798 return 0;
2799
2800 return 1;
2801 }
2802
2803 /*
2804 * idx == 0: Standard early_data setup
2805 * idx == 1: early_data setup using read_ahead
2806 * usecb == 0: Don't use a custom early data callback
2807 * usecb == 1: Use a custom early data callback and reject the early data
2808 * usecb == 2: Use a custom early data callback and accept the early data
2809 * confopt == 0: Configure anti-replay directly
2810 * confopt == 1: Configure anti-replay using SSL_CONF
2811 */
2812 static int test_early_data_replay_int(int idx, int usecb, int confopt)
2813 {
2814 SSL_CTX *cctx = NULL, *sctx = NULL;
2815 SSL *clientssl = NULL, *serverssl = NULL;
2816 int testresult = 0;
2817 SSL_SESSION *sess = NULL;
2818 size_t readbytes, written;
2819 unsigned char buf[20];
2820
2821 allow_ed_cb_called = 0;
2822
2823 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
2824 TLS1_VERSION, 0, &sctx,
2825 &cctx, cert, privkey)))
2826 return 0;
2827
2828 if (usecb > 0) {
2829 if (confopt == 0) {
2830 SSL_CTX_set_options(sctx, SSL_OP_NO_ANTI_REPLAY);
2831 } else {
2832 SSL_CONF_CTX *confctx = SSL_CONF_CTX_new();
2833
2834 if (!TEST_ptr(confctx))
2835 goto end;
2836 SSL_CONF_CTX_set_flags(confctx, SSL_CONF_FLAG_FILE
2837 | SSL_CONF_FLAG_SERVER);
2838 SSL_CONF_CTX_set_ssl_ctx(confctx, sctx);
2839 if (!TEST_int_eq(SSL_CONF_cmd(confctx, "Options", "-AntiReplay"),
2840 2)) {
2841 SSL_CONF_CTX_free(confctx);
2842 goto end;
2843 }
2844 SSL_CONF_CTX_free(confctx);
2845 }
2846 SSL_CTX_set_allow_early_data_cb(sctx, allow_early_data_cb, &usecb);
2847 }
2848
2849 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
2850 &serverssl, &sess, idx)))
2851 goto end;
2852
2853 /*
2854 * The server is configured to accept early data. Create a connection to
2855 * "use up" the ticket
2856 */
2857 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
2858 || !TEST_true(SSL_session_reused(clientssl)))
2859 goto end;
2860
2861 SSL_shutdown(clientssl);
2862 SSL_shutdown(serverssl);
2863 SSL_free(serverssl);
2864 SSL_free(clientssl);
2865 serverssl = clientssl = NULL;
2866
2867 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
2868 &clientssl, NULL, NULL))
2869 || !TEST_true(SSL_set_session(clientssl, sess)))
2870 goto end;
2871
2872 /* Write and read some early data */
2873 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
2874 &written))
2875 || !TEST_size_t_eq(written, strlen(MSG1)))
2876 goto end;
2877
2878 if (usecb <= 1) {
2879 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2880 &readbytes),
2881 SSL_READ_EARLY_DATA_FINISH)
2882 /*
2883 * The ticket was reused, so the we should have rejected the
2884 * early data
2885 */
2886 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
2887 SSL_EARLY_DATA_REJECTED))
2888 goto end;
2889 } else {
2890 /* In this case the callback decides to accept the early data */
2891 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2892 &readbytes),
2893 SSL_READ_EARLY_DATA_SUCCESS)
2894 || !TEST_mem_eq(MSG1, strlen(MSG1), buf, readbytes)
2895 /*
2896 * Server will have sent its flight so client can now send
2897 * end of early data and complete its half of the handshake
2898 */
2899 || !TEST_int_gt(SSL_connect(clientssl), 0)
2900 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2901 &readbytes),
2902 SSL_READ_EARLY_DATA_FINISH)
2903 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
2904 SSL_EARLY_DATA_ACCEPTED))
2905 goto end;
2906 }
2907
2908 /* Complete the connection */
2909 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
2910 || !TEST_int_eq(SSL_session_reused(clientssl), (usecb > 0) ? 1 : 0)
2911 || !TEST_int_eq(allow_ed_cb_called, usecb > 0 ? 1 : 0))
2912 goto end;
2913
2914 testresult = 1;
2915
2916 end:
2917 SSL_SESSION_free(sess);
2918 SSL_SESSION_free(clientpsk);
2919 SSL_SESSION_free(serverpsk);
2920 clientpsk = serverpsk = NULL;
2921 SSL_free(serverssl);
2922 SSL_free(clientssl);
2923 SSL_CTX_free(sctx);
2924 SSL_CTX_free(cctx);
2925 return testresult;
2926 }
2927
2928 static int test_early_data_replay(int idx)
2929 {
2930 int ret = 1, usecb, confopt;
2931
2932 for (usecb = 0; usecb < 3; usecb++) {
2933 for (confopt = 0; confopt < 2; confopt++)
2934 ret &= test_early_data_replay_int(idx, usecb, confopt);
2935 }
2936
2937 return ret;
2938 }
2939
2940 /*
2941 * Helper function to test that a server attempting to read early data can
2942 * handle a connection from a client where the early data should be skipped.
2943 * testtype: 0 == No HRR
2944 * testtype: 1 == HRR
2945 * testtype: 2 == HRR, invalid early_data sent after HRR
2946 * testtype: 3 == recv_max_early_data set to 0
2947 */
2948 static int early_data_skip_helper(int testtype, int idx)
2949 {
2950 SSL_CTX *cctx = NULL, *sctx = NULL;
2951 SSL *clientssl = NULL, *serverssl = NULL;
2952 int testresult = 0;
2953 SSL_SESSION *sess = NULL;
2954 unsigned char buf[20];
2955 size_t readbytes, written;
2956
2957 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
2958 &serverssl, &sess, idx)))
2959 goto end;
2960
2961 if (testtype == 1 || testtype == 2) {
2962 /* Force an HRR to occur */
2963 #if defined(OPENSSL_NO_EC)
2964 if (!TEST_true(SSL_set1_groups_list(serverssl, "ffdhe3072")))
2965 goto end;
2966 #else
2967 if (!TEST_true(SSL_set1_groups_list(serverssl, "P-256")))
2968 goto end;
2969 #endif
2970 } else if (idx == 2) {
2971 /*
2972 * We force early_data rejection by ensuring the PSK identity is
2973 * unrecognised
2974 */
2975 srvid = "Dummy Identity";
2976 } else {
2977 /*
2978 * Deliberately corrupt the creation time. We take 20 seconds off the
2979 * time. It could be any value as long as it is not within tolerance.
2980 * This should mean the ticket is rejected.
2981 */
2982 if (!TEST_true(SSL_SESSION_set_time(sess, (long)(time(NULL) - 20))))
2983 goto end;
2984 }
2985
2986 if (testtype == 3
2987 && !TEST_true(SSL_set_recv_max_early_data(serverssl, 0)))
2988 goto end;
2989
2990 /* Write some early data */
2991 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
2992 &written))
2993 || !TEST_size_t_eq(written, strlen(MSG1)))
2994 goto end;
2995
2996 /* Server should reject the early data */
2997 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
2998 &readbytes),
2999 SSL_READ_EARLY_DATA_FINISH)
3000 || !TEST_size_t_eq(readbytes, 0)
3001 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3002 SSL_EARLY_DATA_REJECTED))
3003 goto end;
3004
3005 switch (testtype) {
3006 case 0:
3007 /* Nothing to do */
3008 break;
3009
3010 case 1:
3011 /*
3012 * Finish off the handshake. We perform the same writes and reads as
3013 * further down but we expect them to fail due to the incomplete
3014 * handshake.
3015 */
3016 if (!TEST_false(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
3017 || !TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf),
3018 &readbytes)))
3019 goto end;
3020 break;
3021
3022 case 2:
3023 {
3024 BIO *wbio = SSL_get_wbio(clientssl);
3025 /* A record that will appear as bad early_data */
3026 const unsigned char bad_early_data[] = {
3027 0x17, 0x03, 0x03, 0x00, 0x01, 0x00
3028 };
3029
3030 /*
3031 * We force the client to attempt a write. This will fail because
3032 * we're still in the handshake. It will cause the second
3033 * ClientHello to be sent.
3034 */
3035 if (!TEST_false(SSL_write_ex(clientssl, MSG2, strlen(MSG2),
3036 &written)))
3037 goto end;
3038
3039 /*
3040 * Inject some early_data after the second ClientHello. This should
3041 * cause the server to fail
3042 */
3043 if (!TEST_true(BIO_write_ex(wbio, bad_early_data,
3044 sizeof(bad_early_data), &written)))
3045 goto end;
3046 }
3047 /* fallthrough */
3048
3049 case 3:
3050 /*
3051 * This client has sent more early_data than we are willing to skip
3052 * (case 3) or sent invalid early_data (case 2) so the connection should
3053 * abort.
3054 */
3055 if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3056 || !TEST_int_eq(SSL_get_error(serverssl, 0), SSL_ERROR_SSL))
3057 goto end;
3058
3059 /* Connection has failed - nothing more to do */
3060 testresult = 1;
3061 goto end;
3062
3063 default:
3064 TEST_error("Invalid test type");
3065 goto end;
3066 }
3067
3068 /*
3069 * Should be able to send normal data despite rejection of early data. The
3070 * early_data should be skipped.
3071 */
3072 if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
3073 || !TEST_size_t_eq(written, strlen(MSG2))
3074 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
3075 SSL_EARLY_DATA_REJECTED)
3076 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3077 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
3078 goto end;
3079
3080 testresult = 1;
3081
3082 end:
3083 SSL_SESSION_free(clientpsk);
3084 SSL_SESSION_free(serverpsk);
3085 clientpsk = serverpsk = NULL;
3086 SSL_SESSION_free(sess);
3087 SSL_free(serverssl);
3088 SSL_free(clientssl);
3089 SSL_CTX_free(sctx);
3090 SSL_CTX_free(cctx);
3091 return testresult;
3092 }
3093
3094 /*
3095 * Test that a server attempting to read early data can handle a connection
3096 * from a client where the early data is not acceptable.
3097 */
3098 static int test_early_data_skip(int idx)
3099 {
3100 return early_data_skip_helper(0, idx);
3101 }
3102
3103 /*
3104 * Test that a server attempting to read early data can handle a connection
3105 * from a client where an HRR occurs.
3106 */
3107 static int test_early_data_skip_hrr(int idx)
3108 {
3109 return early_data_skip_helper(1, idx);
3110 }
3111
3112 /*
3113 * Test that a server attempting to read early data can handle a connection
3114 * from a client where an HRR occurs and correctly fails if early_data is sent
3115 * after the HRR
3116 */
3117 static int test_early_data_skip_hrr_fail(int idx)
3118 {
3119 return early_data_skip_helper(2, idx);
3120 }
3121
3122 /*
3123 * Test that a server attempting to read early data will abort if it tries to
3124 * skip over too much.
3125 */
3126 static int test_early_data_skip_abort(int idx)
3127 {
3128 return early_data_skip_helper(3, idx);
3129 }
3130
3131 /*
3132 * Test that a server attempting to read early data can handle a connection
3133 * from a client that doesn't send any.
3134 */
3135 static int test_early_data_not_sent(int idx)
3136 {
3137 SSL_CTX *cctx = NULL, *sctx = NULL;
3138 SSL *clientssl = NULL, *serverssl = NULL;
3139 int testresult = 0;
3140 SSL_SESSION *sess = NULL;
3141 unsigned char buf[20];
3142 size_t readbytes, written;
3143
3144 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3145 &serverssl, &sess, idx)))
3146 goto end;
3147
3148 /* Write some data - should block due to handshake with server */
3149 SSL_set_connect_state(clientssl);
3150 if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written)))
3151 goto end;
3152
3153 /* Server should detect that early data has not been sent */
3154 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3155 &readbytes),
3156 SSL_READ_EARLY_DATA_FINISH)
3157 || !TEST_size_t_eq(readbytes, 0)
3158 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3159 SSL_EARLY_DATA_NOT_SENT)
3160 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
3161 SSL_EARLY_DATA_NOT_SENT))
3162 goto end;
3163
3164 /* Continue writing the message we started earlier */
3165 if (!TEST_true(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
3166 || !TEST_size_t_eq(written, strlen(MSG1))
3167 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3168 || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
3169 || !SSL_write_ex(serverssl, MSG2, strlen(MSG2), &written)
3170 || !TEST_size_t_eq(written, strlen(MSG2)))
3171 goto end;
3172
3173 if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
3174 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
3175 goto end;
3176
3177 testresult = 1;
3178
3179 end:
3180 SSL_SESSION_free(sess);
3181 SSL_SESSION_free(clientpsk);
3182 SSL_SESSION_free(serverpsk);
3183 clientpsk = serverpsk = NULL;
3184 SSL_free(serverssl);
3185 SSL_free(clientssl);
3186 SSL_CTX_free(sctx);
3187 SSL_CTX_free(cctx);
3188 return testresult;
3189 }
3190
3191 static int hostname_cb(SSL *s, int *al, void *arg)
3192 {
3193 const char *hostname = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
3194
3195 if (hostname != NULL && strcmp(hostname, "goodhost") == 0)
3196 return SSL_TLSEXT_ERR_OK;
3197
3198 return SSL_TLSEXT_ERR_NOACK;
3199 }
3200
3201 static const char *servalpn;
3202
3203 static int alpn_select_cb(SSL *ssl, const unsigned char **out,
3204 unsigned char *outlen, const unsigned char *in,
3205 unsigned int inlen, void *arg)
3206 {
3207 unsigned int protlen = 0;
3208 const unsigned char *prot;
3209
3210 for (prot = in; prot < in + inlen; prot += protlen) {
3211 protlen = *prot++;
3212 if (in + inlen < prot + protlen)
3213 return SSL_TLSEXT_ERR_NOACK;
3214
3215 if (protlen == strlen(servalpn)
3216 && memcmp(prot, servalpn, protlen) == 0) {
3217 *out = prot;
3218 *outlen = protlen;
3219 return SSL_TLSEXT_ERR_OK;
3220 }
3221 }
3222
3223 return SSL_TLSEXT_ERR_NOACK;
3224 }
3225
3226 /* Test that a PSK can be used to send early_data */
3227 static int test_early_data_psk(int idx)
3228 {
3229 SSL_CTX *cctx = NULL, *sctx = NULL;
3230 SSL *clientssl = NULL, *serverssl = NULL;
3231 int testresult = 0;
3232 SSL_SESSION *sess = NULL;
3233 unsigned char alpnlist[] = {
3234 0x08, 'g', 'o', 'o', 'd', 'a', 'l', 'p', 'n', 0x07, 'b', 'a', 'd', 'a',
3235 'l', 'p', 'n'
3236 };
3237 #define GOODALPNLEN 9
3238 #define BADALPNLEN 8
3239 #define GOODALPN (alpnlist)
3240 #define BADALPN (alpnlist + GOODALPNLEN)
3241 int err = 0;
3242 unsigned char buf[20];
3243 size_t readbytes, written;
3244 int readearlyres = SSL_READ_EARLY_DATA_SUCCESS, connectres = 1;
3245 int edstatus = SSL_EARLY_DATA_ACCEPTED;
3246
3247 /* We always set this up with a final parameter of "2" for PSK */
3248 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3249 &serverssl, &sess, 2)))
3250 goto end;
3251
3252 servalpn = "goodalpn";
3253
3254 /*
3255 * Note: There is no test for inconsistent SNI with late client detection.
3256 * This is because servers do not acknowledge SNI even if they are using
3257 * it in a resumption handshake - so it is not actually possible for a
3258 * client to detect a problem.
3259 */
3260 switch (idx) {
3261 case 0:
3262 /* Set inconsistent SNI (early client detection) */
3263 err = SSL_R_INCONSISTENT_EARLY_DATA_SNI;
3264 if (!TEST_true(SSL_SESSION_set1_hostname(sess, "goodhost"))
3265 || !TEST_true(SSL_set_tlsext_host_name(clientssl, "badhost")))
3266 goto end;
3267 break;
3268
3269 case 1:
3270 /* Set inconsistent ALPN (early client detection) */
3271 err = SSL_R_INCONSISTENT_EARLY_DATA_ALPN;
3272 /* SSL_set_alpn_protos returns 0 for success and 1 for failure */
3273 if (!TEST_true(SSL_SESSION_set1_alpn_selected(sess, GOODALPN,
3274 GOODALPNLEN))
3275 || !TEST_false(SSL_set_alpn_protos(clientssl, BADALPN,
3276 BADALPNLEN)))
3277 goto end;
3278 break;
3279
3280 case 2:
3281 /*
3282 * Set invalid protocol version. Technically this affects PSKs without
3283 * early_data too, but we test it here because it is similar to the
3284 * SNI/ALPN consistency tests.
3285 */
3286 err = SSL_R_BAD_PSK;
3287 if (!TEST_true(SSL_SESSION_set_protocol_version(sess, TLS1_2_VERSION)))
3288 goto end;
3289 break;
3290
3291 case 3:
3292 /*
3293 * Set inconsistent SNI (server detected). In this case the connection
3294 * will succeed but reject early_data.
3295 */
3296 SSL_SESSION_free(serverpsk);
3297 serverpsk = SSL_SESSION_dup(clientpsk);
3298 if (!TEST_ptr(serverpsk)
3299 || !TEST_true(SSL_SESSION_set1_hostname(serverpsk, "badhost")))
3300 goto end;
3301 edstatus = SSL_EARLY_DATA_REJECTED;
3302 readearlyres = SSL_READ_EARLY_DATA_FINISH;
3303 /* Fall through */
3304 case 4:
3305 /* Set consistent SNI */
3306 if (!TEST_true(SSL_SESSION_set1_hostname(sess, "goodhost"))
3307 || !TEST_true(SSL_set_tlsext_host_name(clientssl, "goodhost"))
3308 || !TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx,
3309 hostname_cb)))
3310 goto end;
3311 break;
3312
3313 case 5:
3314 /*
3315 * Set inconsistent ALPN (server detected). In this case the connection
3316 * will succeed but reject early_data.
3317 */
3318 servalpn = "badalpn";
3319 edstatus = SSL_EARLY_DATA_REJECTED;
3320 readearlyres = SSL_READ_EARLY_DATA_FINISH;
3321 /* Fall through */
3322 case 6:
3323 /*
3324 * Set consistent ALPN.
3325 * SSL_set_alpn_protos returns 0 for success and 1 for failure. It
3326 * accepts a list of protos (each one length prefixed).
3327 * SSL_set1_alpn_selected accepts a single protocol (not length
3328 * prefixed)
3329 */
3330 if (!TEST_true(SSL_SESSION_set1_alpn_selected(sess, GOODALPN + 1,
3331 GOODALPNLEN - 1))
3332 || !TEST_false(SSL_set_alpn_protos(clientssl, GOODALPN,
3333 GOODALPNLEN)))
3334 goto end;
3335
3336 SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb, NULL);
3337 break;
3338
3339 case 7:
3340 /* Set inconsistent ALPN (late client detection) */
3341 SSL_SESSION_free(serverpsk);
3342 serverpsk = SSL_SESSION_dup(clientpsk);
3343 if (!TEST_ptr(serverpsk)
3344 || !TEST_true(SSL_SESSION_set1_alpn_selected(clientpsk,
3345 BADALPN + 1,
3346 BADALPNLEN - 1))
3347 || !TEST_true(SSL_SESSION_set1_alpn_selected(serverpsk,
3348 GOODALPN + 1,
3349 GOODALPNLEN - 1))
3350 || !TEST_false(SSL_set_alpn_protos(clientssl, alpnlist,
3351 sizeof(alpnlist))))
3352 goto end;
3353 SSL_CTX_set_alpn_select_cb(sctx, alpn_select_cb, NULL);
3354 edstatus = SSL_EARLY_DATA_ACCEPTED;
3355 readearlyres = SSL_READ_EARLY_DATA_SUCCESS;
3356 /* SSL_connect() call should fail */
3357 connectres = -1;
3358 break;
3359
3360 default:
3361 TEST_error("Bad test index");
3362 goto end;
3363 }
3364
3365 SSL_set_connect_state(clientssl);
3366 if (err != 0) {
3367 if (!TEST_false(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3368 &written))
3369 || !TEST_int_eq(SSL_get_error(clientssl, 0), SSL_ERROR_SSL)
3370 || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), err))
3371 goto end;
3372 } else {
3373 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3374 &written)))
3375 goto end;
3376
3377 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3378 &readbytes), readearlyres)
3379 || (readearlyres == SSL_READ_EARLY_DATA_SUCCESS
3380 && !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1)))
3381 || !TEST_int_eq(SSL_get_early_data_status(serverssl), edstatus)
3382 || !TEST_int_eq(SSL_connect(clientssl), connectres))
3383 goto end;
3384 }
3385
3386 testresult = 1;
3387
3388 end:
3389 SSL_SESSION_free(sess);
3390 SSL_SESSION_free(clientpsk);
3391 SSL_SESSION_free(serverpsk);
3392 clientpsk = serverpsk = NULL;
3393 SSL_free(serverssl);
3394 SSL_free(clientssl);
3395 SSL_CTX_free(sctx);
3396 SSL_CTX_free(cctx);
3397 return testresult;
3398 }
3399
3400 /*
3401 * Test that a server that doesn't try to read early data can handle a
3402 * client sending some.
3403 */
3404 static int test_early_data_not_expected(int idx)
3405 {
3406 SSL_CTX *cctx = NULL, *sctx = NULL;
3407 SSL *clientssl = NULL, *serverssl = NULL;
3408 int testresult = 0;
3409 SSL_SESSION *sess = NULL;
3410 unsigned char buf[20];
3411 size_t readbytes, written;
3412
3413 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3414 &serverssl, &sess, idx)))
3415 goto end;
3416
3417 /* Write some early data */
3418 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
3419 &written)))
3420 goto end;
3421
3422 /*
3423 * Server should skip over early data and then block waiting for client to
3424 * continue handshake
3425 */
3426 if (!TEST_int_le(SSL_accept(serverssl), 0)
3427 || !TEST_int_gt(SSL_connect(clientssl), 0)
3428 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3429 SSL_EARLY_DATA_REJECTED)
3430 || !TEST_int_gt(SSL_accept(serverssl), 0)
3431 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
3432 SSL_EARLY_DATA_REJECTED))
3433 goto end;
3434
3435 /* Send some normal data from client to server */
3436 if (!TEST_true(SSL_write_ex(clientssl, MSG2, strlen(MSG2), &written))
3437 || !TEST_size_t_eq(written, strlen(MSG2)))
3438 goto end;
3439
3440 if (!TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3441 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
3442 goto end;
3443
3444 testresult = 1;
3445
3446 end:
3447 SSL_SESSION_free(sess);
3448 SSL_SESSION_free(clientpsk);
3449 SSL_SESSION_free(serverpsk);
3450 clientpsk = serverpsk = NULL;
3451 SSL_free(serverssl);
3452 SSL_free(clientssl);
3453 SSL_CTX_free(sctx);
3454 SSL_CTX_free(cctx);
3455 return testresult;
3456 }
3457
3458
3459 # ifndef OPENSSL_NO_TLS1_2
3460 /*
3461 * Test that a server attempting to read early data can handle a connection
3462 * from a TLSv1.2 client.
3463 */
3464 static int test_early_data_tls1_2(int idx)
3465 {
3466 SSL_CTX *cctx = NULL, *sctx = NULL;
3467 SSL *clientssl = NULL, *serverssl = NULL;
3468 int testresult = 0;
3469 unsigned char buf[20];
3470 size_t readbytes, written;
3471
3472 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
3473 &serverssl, NULL, idx)))
3474 goto end;
3475
3476 /* Write some data - should block due to handshake with server */
3477 SSL_set_max_proto_version(clientssl, TLS1_2_VERSION);
3478 SSL_set_connect_state(clientssl);
3479 if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written)))
3480 goto end;
3481
3482 /*
3483 * Server should do TLSv1.2 handshake. First it will block waiting for more
3484 * messages from client after ServerDone. Then SSL_read_early_data should
3485 * finish and detect that early data has not been sent
3486 */
3487 if (!TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3488 &readbytes),
3489 SSL_READ_EARLY_DATA_ERROR))
3490 goto end;
3491
3492 /*
3493 * Continue writing the message we started earlier. Will still block waiting
3494 * for the CCS/Finished from server
3495 */
3496 if (!TEST_false(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
3497 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
3498 &readbytes),
3499 SSL_READ_EARLY_DATA_FINISH)
3500 || !TEST_size_t_eq(readbytes, 0)
3501 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
3502 SSL_EARLY_DATA_NOT_SENT))
3503 goto end;
3504
3505 /* Continue writing the message we started earlier */
3506 if (!TEST_true(SSL_write_ex(clientssl, MSG1, strlen(MSG1), &written))
3507 || !TEST_size_t_eq(written, strlen(MSG1))
3508 || !TEST_int_eq(SSL_get_early_data_status(clientssl),
3509 SSL_EARLY_DATA_NOT_SENT)
3510 || !TEST_true(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
3511 || !TEST_mem_eq(buf, readbytes, MSG1, strlen(MSG1))
3512 || !TEST_true(SSL_write_ex(serverssl, MSG2, strlen(MSG2), &written))
3513 || !TEST_size_t_eq(written, strlen(MSG2))
3514 || !SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes)
3515 || !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
3516 goto end;
3517
3518 testresult = 1;
3519
3520 end:
3521 SSL_SESSION_free(clientpsk);
3522 SSL_SESSION_free(serverpsk);
3523 clientpsk = serverpsk = NULL;
3524 SSL_free(serverssl);
3525 SSL_free(clientssl);
3526 SSL_CTX_free(sctx);
3527 SSL_CTX_free(cctx);
3528
3529 return testresult;
3530 }
3531 # endif /* OPENSSL_NO_TLS1_2 */
3532
3533 /*
3534 * Test configuring the TLSv1.3 ciphersuites
3535 *
3536 * Test 0: Set a default ciphersuite in the SSL_CTX (no explicit cipher_list)
3537 * Test 1: Set a non-default ciphersuite in the SSL_CTX (no explicit cipher_list)
3538 * Test 2: Set a default ciphersuite in the SSL (no explicit cipher_list)
3539 * Test 3: Set a non-default ciphersuite in the SSL (no explicit cipher_list)
3540 * Test 4: Set a default ciphersuite in the SSL_CTX (SSL_CTX cipher_list)
3541 * Test 5: Set a non-default ciphersuite in the SSL_CTX (SSL_CTX cipher_list)
3542 * Test 6: Set a default ciphersuite in the SSL (SSL_CTX cipher_list)
3543 * Test 7: Set a non-default ciphersuite in the SSL (SSL_CTX cipher_list)
3544 * Test 8: Set a default ciphersuite in the SSL (SSL cipher_list)
3545 * Test 9: Set a non-default ciphersuite in the SSL (SSL cipher_list)
3546 */
3547 static int test_set_ciphersuite(int idx)
3548 {
3549 SSL_CTX *cctx = NULL, *sctx = NULL;
3550 SSL *clientssl = NULL, *serverssl = NULL;
3551 int testresult = 0;
3552
3553 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
3554 TLS1_VERSION, 0,
3555 &sctx, &cctx, cert, privkey))
3556 || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
3557 "TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256")))
3558 goto end;
3559
3560 if (idx >=4 && idx <= 7) {
3561 /* SSL_CTX explicit cipher list */
3562 if (!TEST_true(SSL_CTX_set_cipher_list(cctx, "AES256-GCM-SHA384")))
3563 goto end;
3564 }
3565
3566 if (idx == 0 || idx == 4) {
3567 /* Default ciphersuite */
3568 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
3569 "TLS_AES_128_GCM_SHA256")))
3570 goto end;
3571 } else if (idx == 1 || idx == 5) {
3572 /* Non default ciphersuite */
3573 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
3574 "TLS_AES_128_CCM_SHA256")))
3575 goto end;
3576 }
3577
3578 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3579 &clientssl, NULL, NULL)))
3580 goto end;
3581
3582 if (idx == 8 || idx == 9) {
3583 /* SSL explicit cipher list */
3584 if (!TEST_true(SSL_set_cipher_list(clientssl, "AES256-GCM-SHA384")))
3585 goto end;
3586 }
3587
3588 if (idx == 2 || idx == 6 || idx == 8) {
3589 /* Default ciphersuite */
3590 if (!TEST_true(SSL_set_ciphersuites(clientssl,
3591 "TLS_AES_128_GCM_SHA256")))
3592 goto end;
3593 } else if (idx == 3 || idx == 7 || idx == 9) {
3594 /* Non default ciphersuite */
3595 if (!TEST_true(SSL_set_ciphersuites(clientssl,
3596 "TLS_AES_128_CCM_SHA256")))
3597 goto end;
3598 }
3599
3600 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
3601 goto end;
3602
3603 testresult = 1;
3604
3605 end:
3606 SSL_free(serverssl);
3607 SSL_free(clientssl);
3608 SSL_CTX_free(sctx);
3609 SSL_CTX_free(cctx);
3610
3611 return testresult;
3612 }
3613
3614 static int test_ciphersuite_change(void)
3615 {
3616 SSL_CTX *cctx = NULL, *sctx = NULL;
3617 SSL *clientssl = NULL, *serverssl = NULL;
3618 SSL_SESSION *clntsess = NULL;
3619 int testresult = 0;
3620 const SSL_CIPHER *aes_128_gcm_sha256 = NULL;
3621
3622 /* Create a session based on SHA-256 */
3623 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
3624 TLS1_VERSION, 0,
3625 &sctx, &cctx, cert, privkey))
3626 || !TEST_true(SSL_CTX_set_ciphersuites(cctx,
3627 "TLS_AES_128_GCM_SHA256"))
3628 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3629 &clientssl, NULL, NULL))
3630 || !TEST_true(create_ssl_connection(serverssl, clientssl,
3631 SSL_ERROR_NONE)))
3632 goto end;
3633
3634 clntsess = SSL_get1_session(clientssl);
3635 /* Save for later */
3636 aes_128_gcm_sha256 = SSL_SESSION_get0_cipher(clntsess);
3637 SSL_shutdown(clientssl);
3638 SSL_shutdown(serverssl);
3639 SSL_free(serverssl);
3640 SSL_free(clientssl);
3641 serverssl = clientssl = NULL;
3642
3643 # if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
3644 /* Check we can resume a session with a different SHA-256 ciphersuite */
3645 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
3646 "TLS_CHACHA20_POLY1305_SHA256"))
3647 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
3648 NULL, NULL))
3649 || !TEST_true(SSL_set_session(clientssl, clntsess))
3650 || !TEST_true(create_ssl_connection(serverssl, clientssl,
3651 SSL_ERROR_NONE))
3652 || !TEST_true(SSL_session_reused(clientssl)))
3653 goto end;
3654
3655 SSL_SESSION_free(clntsess);
3656 clntsess = SSL_get1_session(clientssl);
3657 SSL_shutdown(clientssl);
3658 SSL_shutdown(serverssl);
3659 SSL_free(serverssl);
3660 SSL_free(clientssl);
3661 serverssl = clientssl = NULL;
3662 # endif
3663
3664 /*
3665 * Check attempting to resume a SHA-256 session with no SHA-256 ciphersuites
3666 * succeeds but does not resume.
3667 */
3668 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, "TLS_AES_256_GCM_SHA384"))
3669 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
3670 NULL, NULL))
3671 || !TEST_true(SSL_set_session(clientssl, clntsess))
3672 || !TEST_true(create_ssl_connection(serverssl, clientssl,
3673 SSL_ERROR_SSL))
3674 || !TEST_false(SSL_session_reused(clientssl)))
3675 goto end;
3676
3677 SSL_SESSION_free(clntsess);
3678 clntsess = NULL;
3679 SSL_shutdown(clientssl);
3680 SSL_shutdown(serverssl);
3681 SSL_free(serverssl);
3682 SSL_free(clientssl);
3683 serverssl = clientssl = NULL;
3684
3685 /* Create a session based on SHA384 */
3686 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, "TLS_AES_256_GCM_SHA384"))
3687 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
3688 &clientssl, NULL, NULL))
3689 || !TEST_true(create_ssl_connection(serverssl, clientssl,
3690 SSL_ERROR_NONE)))
3691 goto end;
3692
3693 clntsess = SSL_get1_session(clientssl);
3694 SSL_shutdown(clientssl);
3695 SSL_shutdown(serverssl);
3696 SSL_free(serverssl);
3697 SSL_free(clientssl);
3698 serverssl = clientssl = NULL;
3699
3700 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
3701 "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384"))
3702 || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
3703 "TLS_AES_256_GCM_SHA384"))
3704 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
3705 NULL, NULL))
3706 || !TEST_true(SSL_set_session(clientssl, clntsess))
3707 /*
3708 * We use SSL_ERROR_WANT_READ below so that we can pause the
3709 * connection after the initial ClientHello has been sent to
3710 * enable us to make some session changes.
3711 */
3712 || !TEST_false(create_ssl_connection(serverssl, clientssl,
3713 SSL_ERROR_WANT_READ)))
3714 goto end;
3715
3716 /* Trick the client into thinking this session is for a different digest */
3717 clntsess->cipher = aes_128_gcm_sha256;
3718 clntsess->cipher_id = clntsess->cipher->id;
3719
3720 /*
3721 * Continue the previously started connection. Server has selected a SHA-384
3722 * ciphersuite, but client thinks the session is for SHA-256, so it should
3723 * bail out.
3724 */
3725 if (!TEST_false(create_ssl_connection(serverssl, clientssl,
3726 SSL_ERROR_SSL))
3727 || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()),
3728 SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED))
3729 goto end;
3730
3731 testresult = 1;
3732
3733 end:
3734 SSL_SESSION_free(clntsess);
3735 SSL_free(serverssl);
3736 SSL_free(clientssl);
3737 SSL_CTX_free(sctx);
3738 SSL_CTX_free(cctx);
3739
3740 return testresult;
3741 }
3742
3743 /*
3744 * Test Key exchange
3745 * Test 0 = Test ECDHE Key exchange with TLSv1.3 client and server
3746 * Test 1 = Test ECDHE with TLSv1.2 client and server
3747 * Test 2 = Test FFDHE Key exchange with TLSv1.3 client and server
3748 * Test 3 = Test FFDHE with TLSv1.2 client and server
3749 * Test 4 = Test NID_X9_62_prime256v1 with TLSv1.3 client and server
3750 * Test 5 = Test NID_secp384r1 with TLSv1.3 client and server
3751 * Test 6 = Test NID_secp521r1 with TLSv1.3 client and server
3752 * Test 7 = Test NID_X25519 with TLSv1.3 client and server
3753 * Test 8 = Test NID_X448 with TLSv1.3 client and server
3754 * Test 9 = Test NID_ffdhe2048 with TLSv1.3 client and server
3755 * Test 10 = Test NID_ffdhe3072 with TLSv1.3 client and server
3756 * Test 11 = Test NID_ffdhe4096 with TLSv1.3 client and server
3757 * Test 12 = Test NID_ffdhe6144 with TLSv1.3 client and server
3758 * Test 13 = Test NID_ffdhe8192 with TLSv1.3 client and server
3759 */
3760 static int test_key_exchange(int idx)
3761 {
3762 SSL_CTX *sctx = NULL, *cctx = NULL;
3763 SSL *serverssl = NULL, *clientssl = NULL;
3764 int testresult = 0;
3765 #if !defined(OPENSSL_NO_EC)
3766 int ecdhe_kexch_groups[] = {NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
3767 NID_X25519, NID_X448};
3768 #endif
3769 #ifndef OPENSSL_NO_DH
3770 int ffdhe_kexch_groups[] = {NID_ffdhe2048, NID_ffdhe3072, NID_ffdhe4096,
3771 NID_ffdhe6144, NID_ffdhe8192};
3772 #endif
3773 int kexch_alg;
3774 int *kexch_groups = &kexch_alg;
3775 int kexch_groups_size = 1;
3776 int max_version = TLS1_3_VERSION;
3777 int want_err = SSL_ERROR_NONE;
3778 int expected_err_reason = 0;
3779
3780 switch (idx) {
3781 #ifndef OPENSSL_NO_EC
3782 # ifndef OPENSSL_NO_TLS1_2
3783 case 1:
3784 max_version = TLS1_2_VERSION;
3785 # endif
3786 /* Fall through */
3787 case 0:
3788 kexch_groups = ecdhe_kexch_groups;
3789 kexch_groups_size = OSSL_NELEM(ecdhe_kexch_groups);
3790 break;
3791 case 4:
3792 kexch_alg = NID_X9_62_prime256v1;
3793 break;
3794 case 5:
3795 kexch_alg = NID_secp384r1;
3796 break;
3797 case 6:
3798 kexch_alg = NID_secp521r1;
3799 break;
3800 case 7:
3801 kexch_alg = NID_X25519;
3802 break;
3803 case 8:
3804 kexch_alg = NID_X448;
3805 break;
3806 #endif
3807 #ifndef OPENSSL_NO_DH
3808 # ifndef OPENSSL_NO_TLS1_2
3809 case 3:
3810 max_version = TLS1_2_VERSION;
3811 # endif
3812 /* Fall through */
3813 case 2:
3814 kexch_groups = ffdhe_kexch_groups;
3815 kexch_groups_size = OSSL_NELEM(ffdhe_kexch_groups);
3816 break;
3817 case 9:
3818 kexch_alg = NID_ffdhe2048;
3819 break;
3820 case 10:
3821 kexch_alg = NID_ffdhe3072;
3822 break;
3823 case 11:
3824 kexch_alg = NID_ffdhe4096;
3825 break;
3826 case 12:
3827 kexch_alg = NID_ffdhe6144;
3828 break;
3829 case 13:
3830 kexch_alg = NID_ffdhe8192;
3831 break;
3832 #endif
3833 default:
3834 /* We're skipping this test */
3835 return 1;
3836 }
3837
3838 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
3839 TLS1_VERSION, max_version,
3840 &sctx, &cctx, cert, privkey)))
3841 goto end;
3842
3843 if (!TEST_true(SSL_CTX_set_ciphersuites(sctx, TLS1_3_RFC_AES_128_GCM_SHA256)))
3844 goto end;
3845
3846 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx, TLS1_3_RFC_AES_128_GCM_SHA256)))
3847 goto end;
3848
3849 if (!TEST_true(SSL_CTX_set_cipher_list(sctx, TLS1_TXT_RSA_WITH_AES_128_SHA)))
3850 goto end;
3851
3852 /*
3853 * Must include an EC ciphersuite so that we send supported groups in
3854 * TLSv1.2
3855 */
3856 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
3857 TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CCM ":"
3858 TLS1_TXT_RSA_WITH_AES_128_SHA)))
3859 goto end;
3860
3861 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
3862 NULL, NULL)))
3863 goto end;
3864
3865 if (!TEST_true(SSL_set1_groups(serverssl, kexch_groups, kexch_groups_size))
3866 || !TEST_true(SSL_set1_groups(clientssl, kexch_groups, kexch_groups_size)))
3867 goto end;
3868
3869 if (!TEST_true(create_ssl_connection(serverssl, clientssl, want_err))) {
3870 /* Fail only if no error is expected in handshake */
3871 if (expected_err_reason == 0)
3872 goto end;
3873 }
3874
3875 /* Fail if expected error is not happening for failure testcases */
3876 if (expected_err_reason != 0) {
3877 unsigned long err_code = ERR_get_error();
3878
3879 ERR_print_errors_fp(stdout);
3880 if (TEST_int_eq(ERR_GET_REASON(err_code), expected_err_reason))
3881 testresult = 1;
3882 goto end;
3883 }
3884
3885 /*
3886 * If Handshake succeeds the negotiated kexch alg should the first one in
3887 * configured, except in the case of FFDHE groups which are TLSv1.3 only
3888 * so we expect no shared group to exist.
3889 */
3890 if (!TEST_int_eq(SSL_get_shared_group(serverssl, 0),
3891 idx == 3 ? 0 : kexch_groups[0]))
3892 goto end;
3893 if (max_version == TLS1_3_VERSION) {
3894 if (!TEST_int_eq(SSL_get_negotiated_group(serverssl), kexch_groups[0]))
3895 goto end;
3896 if (!TEST_int_eq(SSL_get_negotiated_group(clientssl), kexch_groups[0]))
3897 goto end;
3898 }
3899
3900 testresult = 1;
3901 end:
3902 SSL_free(serverssl);
3903 SSL_free(clientssl);
3904 SSL_CTX_free(sctx);
3905 SSL_CTX_free(cctx);
3906 return testresult;
3907 }
3908
3909 /*
3910 * Test TLSv1.3 PSKs
3911 * Test 0 = Test new style callbacks
3912 * Test 1 = Test both new and old style callbacks
3913 * Test 2 = Test old style callbacks
3914 * Test 3 = Test old style callbacks with no certificate
3915 */
3916 static int test_tls13_psk(int idx)
3917 {
3918 SSL_CTX *sctx = NULL, *cctx = NULL;
3919 SSL *serverssl = NULL, *clientssl = NULL;
3920 const SSL_CIPHER *cipher = NULL;
3921 const unsigned char key[] = {
3922 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
3923 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
3924 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
3925 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
3926 };
3927 int testresult = 0;
3928
3929 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
3930 TLS1_VERSION, 0,
3931 &sctx, &cctx, idx == 3 ? NULL : cert,
3932 idx == 3 ? NULL : privkey)))
3933 goto end;
3934
3935 if (idx != 3) {
3936 /*
3937 * We use a ciphersuite with SHA256 to ease testing old style PSK
3938 * callbacks which will always default to SHA256. This should not be
3939 * necessary if we have no cert/priv key. In that case the server should
3940 * prefer SHA256 automatically.
3941 */
3942 if (!TEST_true(SSL_CTX_set_ciphersuites(cctx,
3943 "TLS_AES_128_GCM_SHA256")))
3944 goto end;
3945 }
3946
3947 /*
3948 * Test 0: New style callbacks only
3949 * Test 1: New and old style callbacks (only the new ones should be used)
3950 * Test 2: Old style callbacks only
3951 */
3952 if (idx == 0 || idx == 1) {
3953 SSL_CTX_set_psk_use_session_callback(cctx, use_session_cb);
3954 SSL_CTX_set_psk_find_session_callback(sctx, find_session_cb);
3955 }
3956 #ifndef OPENSSL_NO_PSK
3957 if (idx >= 1) {
3958 SSL_CTX_set_psk_client_callback(cctx, psk_client_cb);
3959 SSL_CTX_set_psk_server_callback(sctx, psk_server_cb);
3960 }
3961 #endif
3962 srvid = pskid;
3963 use_session_cb_cnt = 0;
3964 find_session_cb_cnt = 0;
3965 psk_client_cb_cnt = 0;
3966 psk_server_cb_cnt = 0;
3967
3968 if (idx != 3) {
3969 /*
3970 * Check we can create a connection if callback decides not to send a
3971 * PSK
3972 */
3973 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
3974 NULL, NULL))
3975 || !TEST_true(create_ssl_connection(serverssl, clientssl,
3976 SSL_ERROR_NONE))
3977 || !TEST_false(SSL_session_reused(clientssl))
3978 || !TEST_false(SSL_session_reused(serverssl)))
3979 goto end;
3980
3981 if (idx == 0 || idx == 1) {
3982 if (!TEST_true(use_session_cb_cnt == 1)
3983 || !TEST_true(find_session_cb_cnt == 0)
3984 /*
3985 * If no old style callback then below should be 0
3986 * otherwise 1
3987 */
3988 || !TEST_true(psk_client_cb_cnt == idx)
3989 || !TEST_true(psk_server_cb_cnt == 0))
3990 goto end;
3991 } else {
3992 if (!TEST_true(use_session_cb_cnt == 0)
3993 || !TEST_true(find_session_cb_cnt == 0)
3994 || !TEST_true(psk_client_cb_cnt == 1)
3995 || !TEST_true(psk_server_cb_cnt == 0))
3996 goto end;
3997 }
3998
3999 shutdown_ssl_connection(serverssl, clientssl);
4000 serverssl = clientssl = NULL;
4001 use_session_cb_cnt = psk_client_cb_cnt = 0;
4002 }
4003
4004 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4005 NULL, NULL)))
4006 goto end;
4007
4008 /* Create the PSK */
4009 cipher = SSL_CIPHER_find(clientssl, TLS13_AES_128_GCM_SHA256_BYTES);
4010 clientpsk = SSL_SESSION_new();
4011 if (!TEST_ptr(clientpsk)
4012 || !TEST_ptr(cipher)
4013 || !TEST_true(SSL_SESSION_set1_master_key(clientpsk, key,
4014 sizeof(key)))
4015 || !TEST_true(SSL_SESSION_set_cipher(clientpsk, cipher))
4016 || !TEST_true(SSL_SESSION_set_protocol_version(clientpsk,
4017 TLS1_3_VERSION))
4018 || !TEST_true(SSL_SESSION_up_ref(clientpsk)))
4019 goto end;
4020 serverpsk = clientpsk;
4021
4022 /* Check we can create a connection and the PSK is used */
4023 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
4024 || !TEST_true(SSL_session_reused(clientssl))
4025 || !TEST_true(SSL_session_reused(serverssl)))
4026 goto end;
4027
4028 if (idx == 0 || idx == 1) {
4029 if (!TEST_true(use_session_cb_cnt == 1)
4030 || !TEST_true(find_session_cb_cnt == 1)
4031 || !TEST_true(psk_client_cb_cnt == 0)
4032 || !TEST_true(psk_server_cb_cnt == 0))
4033 goto end;
4034 } else {
4035 if (!TEST_true(use_session_cb_cnt == 0)
4036 || !TEST_true(find_session_cb_cnt == 0)
4037 || !TEST_true(psk_client_cb_cnt == 1)
4038 || !TEST_true(psk_server_cb_cnt == 1))
4039 goto end;
4040 }
4041
4042 shutdown_ssl_connection(serverssl, clientssl);
4043 serverssl = clientssl = NULL;
4044 use_session_cb_cnt = find_session_cb_cnt = 0;
4045 psk_client_cb_cnt = psk_server_cb_cnt = 0;
4046
4047 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4048 NULL, NULL)))
4049 goto end;
4050
4051 /* Force an HRR */
4052 #if defined(OPENSSL_NO_EC)
4053 if (!TEST_true(SSL_set1_groups_list(serverssl, "ffdhe3072")))
4054 goto end;
4055 #else
4056 if (!TEST_true(SSL_set1_groups_list(serverssl, "P-256")))
4057 goto end;
4058 #endif
4059
4060 /*
4061 * Check we can create a connection, the PSK is used and the callbacks are
4062 * called twice.
4063 */
4064 if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
4065 || !TEST_true(SSL_session_reused(clientssl))
4066 || !TEST_true(SSL_session_reused(serverssl)))
4067 goto end;
4068
4069 if (idx == 0 || idx == 1) {
4070 if (!TEST_true(use_session_cb_cnt == 2)
4071 || !TEST_true(find_session_cb_cnt == 2)
4072 || !TEST_true(psk_client_cb_cnt == 0)
4073 || !TEST_true(psk_server_cb_cnt == 0))
4074 goto end;
4075 } else {
4076 if (!TEST_true(use_session_cb_cnt == 0)
4077 || !TEST_true(find_session_cb_cnt == 0)
4078 || !TEST_true(psk_client_cb_cnt == 2)
4079 || !TEST_true(psk_server_cb_cnt == 2))
4080 goto end;
4081 }
4082
4083 shutdown_ssl_connection(serverssl, clientssl);
4084 serverssl = clientssl = NULL;
4085 use_session_cb_cnt = find_session_cb_cnt = 0;
4086 psk_client_cb_cnt = psk_server_cb_cnt = 0;
4087
4088 if (idx != 3) {
4089 /*
4090 * Check that if the server rejects the PSK we can still connect, but with
4091 * a full handshake
4092 */
4093 srvid = "Dummy Identity";
4094 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4095 NULL, NULL))
4096 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4097 SSL_ERROR_NONE))
4098 || !TEST_false(SSL_session_reused(clientssl))
4099 || !TEST_false(SSL_session_reused(serverssl)))
4100 goto end;
4101
4102 if (idx == 0 || idx == 1) {
4103 if (!TEST_true(use_session_cb_cnt == 1)
4104 || !TEST_true(find_session_cb_cnt == 1)
4105 || !TEST_true(psk_client_cb_cnt == 0)
4106 /*
4107 * If no old style callback then below should be 0
4108 * otherwise 1
4109 */
4110 || !TEST_true(psk_server_cb_cnt == idx))
4111 goto end;
4112 } else {
4113 if (!TEST_true(use_session_cb_cnt == 0)
4114 || !TEST_true(find_session_cb_cnt == 0)
4115 || !TEST_true(psk_client_cb_cnt == 1)
4116 || !TEST_true(psk_server_cb_cnt == 1))
4117 goto end;
4118 }
4119
4120 shutdown_ssl_connection(serverssl, clientssl);
4121 serverssl = clientssl = NULL;
4122 }
4123 testresult = 1;
4124
4125 end:
4126 SSL_SESSION_free(clientpsk);
4127 SSL_SESSION_free(serverpsk);
4128 clientpsk = serverpsk = NULL;
4129 SSL_free(serverssl);
4130 SSL_free(clientssl);
4131 SSL_CTX_free(sctx);
4132 SSL_CTX_free(cctx);
4133 return testresult;
4134 }
4135
4136 static unsigned char cookie_magic_value[] = "cookie magic";
4137
4138 static int generate_cookie_callback(SSL *ssl, unsigned char *cookie,
4139 unsigned int *cookie_len)
4140 {
4141 /*
4142 * Not suitable as a real cookie generation function but good enough for
4143 * testing!
4144 */
4145 memcpy(cookie, cookie_magic_value, sizeof(cookie_magic_value) - 1);
4146 *cookie_len = sizeof(cookie_magic_value) - 1;
4147
4148 return 1;
4149 }
4150
4151 static int verify_cookie_callback(SSL *ssl, const unsigned char *cookie,
4152 unsigned int cookie_len)
4153 {
4154 if (cookie_len == sizeof(cookie_magic_value) - 1
4155 && memcmp(cookie, cookie_magic_value, cookie_len) == 0)
4156 return 1;
4157
4158 return 0;
4159 }
4160
4161 static int generate_stateless_cookie_callback(SSL *ssl, unsigned char *cookie,
4162 size_t *cookie_len)
4163 {
4164 unsigned int temp;
4165 int res = generate_cookie_callback(ssl, cookie, &temp);
4166 *cookie_len = temp;
4167 return res;
4168 }
4169
4170 static int verify_stateless_cookie_callback(SSL *ssl, const unsigned char *cookie,
4171 size_t cookie_len)
4172 {
4173 return verify_cookie_callback(ssl, cookie, cookie_len);
4174 }
4175
4176 static int test_stateless(void)
4177 {
4178 SSL_CTX *sctx = NULL, *cctx = NULL;
4179 SSL *serverssl = NULL, *clientssl = NULL;
4180 int testresult = 0;
4181
4182 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
4183 TLS1_VERSION, 0,
4184 &sctx, &cctx, cert, privkey)))
4185 goto end;
4186
4187 /* The arrival of CCS messages can confuse the test */
4188 SSL_CTX_clear_options(cctx, SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
4189
4190 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4191 NULL, NULL))
4192 /* Send the first ClientHello */
4193 || !TEST_false(create_ssl_connection(serverssl, clientssl,
4194 SSL_ERROR_WANT_READ))
4195 /*
4196 * This should fail with a -1 return because we have no callbacks
4197 * set up
4198 */
4199 || !TEST_int_eq(SSL_stateless(serverssl), -1))
4200 goto end;
4201
4202 /* Fatal error so abandon the connection from this client */
4203 SSL_free(clientssl);
4204 clientssl = NULL;
4205
4206 /* Set up the cookie generation and verification callbacks */
4207 SSL_CTX_set_stateless_cookie_generate_cb(sctx, generate_stateless_cookie_callback);
4208 SSL_CTX_set_stateless_cookie_verify_cb(sctx, verify_stateless_cookie_callback);
4209
4210 /*
4211 * Create a new connection from the client (we can reuse the server SSL
4212 * object).
4213 */
4214 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4215 NULL, NULL))
4216 /* Send the first ClientHello */
4217 || !TEST_false(create_ssl_connection(serverssl, clientssl,
4218 SSL_ERROR_WANT_READ))
4219 /* This should fail because there is no cookie */
4220 || !TEST_int_eq(SSL_stateless(serverssl), 0))
4221 goto end;
4222
4223 /* Abandon the connection from this client */
4224 SSL_free(clientssl);
4225 clientssl = NULL;
4226
4227 /*
4228 * Now create a connection from a new client but with the same server SSL
4229 * object
4230 */
4231 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4232 NULL, NULL))
4233 /* Send the first ClientHello */
4234 || !TEST_false(create_ssl_connection(serverssl, clientssl,
4235 SSL_ERROR_WANT_READ))
4236 /* This should fail because there is no cookie */
4237 || !TEST_int_eq(SSL_stateless(serverssl), 0)
4238 /* Send the second ClientHello */
4239 || !TEST_false(create_ssl_connection(serverssl, clientssl,
4240 SSL_ERROR_WANT_READ))
4241 /* This should succeed because a cookie is now present */
4242 || !TEST_int_eq(SSL_stateless(serverssl), 1)
4243 /* Complete the connection */
4244 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4245 SSL_ERROR_NONE)))
4246 goto end;
4247
4248 shutdown_ssl_connection(serverssl, clientssl);
4249 serverssl = clientssl = NULL;
4250 testresult = 1;
4251
4252 end:
4253 SSL_free(serverssl);
4254 SSL_free(clientssl);
4255 SSL_CTX_free(sctx);
4256 SSL_CTX_free(cctx);
4257 return testresult;
4258
4259 }
4260 #endif /* OPENSSL_NO_TLS1_3 */
4261
4262 static int clntaddoldcb = 0;
4263 static int clntparseoldcb = 0;
4264 static int srvaddoldcb = 0;
4265 static int srvparseoldcb = 0;
4266 static int clntaddnewcb = 0;
4267 static int clntparsenewcb = 0;
4268 static int srvaddnewcb = 0;
4269 static int srvparsenewcb = 0;
4270 static int snicb = 0;
4271
4272 #define TEST_EXT_TYPE1 0xff00
4273
4274 static int old_add_cb(SSL *s, unsigned int ext_type, const unsigned char **out,
4275 size_t *outlen, int *al, void *add_arg)
4276 {
4277 int *server = (int *)add_arg;
4278 unsigned char *data;
4279
4280 if (SSL_is_server(s))
4281 srvaddoldcb++;
4282 else
4283 clntaddoldcb++;
4284
4285 if (*server != SSL_is_server(s)
4286 || (data = OPENSSL_malloc(sizeof(*data))) == NULL)
4287 return -1;
4288
4289 *data = 1;
4290 *out = data;
4291 *outlen = sizeof(char);
4292 return 1;
4293 }
4294
4295 static void old_free_cb(SSL *s, unsigned int ext_type, const unsigned char *out,
4296 void *add_arg)
4297 {
4298 OPENSSL_free((unsigned char *)out);
4299 }
4300
4301 static int old_parse_cb(SSL *s, unsigned int ext_type, const unsigned char *in,
4302 size_t inlen, int *al, void *parse_arg)
4303 {
4304 int *server = (int *)parse_arg;
4305
4306 if (SSL_is_server(s))
4307 srvparseoldcb++;
4308 else
4309 clntparseoldcb++;
4310
4311 if (*server != SSL_is_server(s)
4312 || inlen != sizeof(char)
4313 || *in != 1)
4314 return -1;
4315
4316 return 1;
4317 }
4318
4319 static int new_add_cb(SSL *s, unsigned int ext_type, unsigned int context,
4320 const unsigned char **out, size_t *outlen, X509 *x,
4321 size_t chainidx, int *al, void *add_arg)
4322 {
4323 int *server = (int *)add_arg;
4324 unsigned char *data;
4325
4326 if (SSL_is_server(s))
4327 srvaddnewcb++;
4328 else
4329 clntaddnewcb++;
4330
4331 if (*server != SSL_is_server(s)
4332 || (data = OPENSSL_malloc(sizeof(*data))) == NULL)
4333 return -1;
4334
4335 *data = 1;
4336 *out = data;
4337 *outlen = sizeof(*data);
4338 return 1;
4339 }
4340
4341 static void new_free_cb(SSL *s, unsigned int ext_type, unsigned int context,
4342 const unsigned char *out, void *add_arg)
4343 {
4344 OPENSSL_free((unsigned char *)out);
4345 }
4346
4347 static int new_parse_cb(SSL *s, unsigned int ext_type, unsigned int context,
4348 const unsigned char *in, size_t inlen, X509 *x,
4349 size_t chainidx, int *al, void *parse_arg)
4350 {
4351 int *server = (int *)parse_arg;
4352
4353 if (SSL_is_server(s))
4354 srvparsenewcb++;
4355 else
4356 clntparsenewcb++;
4357
4358 if (*server != SSL_is_server(s)
4359 || inlen != sizeof(char) || *in != 1)
4360 return -1;
4361
4362 return 1;
4363 }
4364
4365 static int sni_cb(SSL *s, int *al, void *arg)
4366 {
4367 SSL_CTX *ctx = (SSL_CTX *)arg;
4368
4369 if (SSL_set_SSL_CTX(s, ctx) == NULL) {
4370 *al = SSL_AD_INTERNAL_ERROR;
4371 return SSL_TLSEXT_ERR_ALERT_FATAL;
4372 }
4373 snicb++;
4374 return SSL_TLSEXT_ERR_OK;
4375 }
4376
4377 /*
4378 * Custom call back tests.
4379 * Test 0: Old style callbacks in TLSv1.2
4380 * Test 1: New style callbacks in TLSv1.2
4381 * Test 2: New style callbacks in TLSv1.2 with SNI
4382 * Test 3: New style callbacks in TLSv1.3. Extensions in CH and EE
4383 * Test 4: New style callbacks in TLSv1.3. Extensions in CH, SH, EE, Cert + NST
4384 */
4385 static int test_custom_exts(int tst)
4386 {
4387 SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
4388 SSL *clientssl = NULL, *serverssl = NULL;
4389 int testresult = 0;
4390 static int server = 1;
4391 static int client = 0;
4392 SSL_SESSION *sess = NULL;
4393 unsigned int context;
4394
4395 #if defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_TLS1_3)
4396 /* Skip tests for TLSv1.2 and below in this case */
4397 if (tst < 3)
4398 return 1;
4399 #endif
4400
4401 /* Reset callback counters */
4402 clntaddoldcb = clntparseoldcb = srvaddoldcb = srvparseoldcb = 0;
4403 clntaddnewcb = clntparsenewcb = srvaddnewcb = srvparsenewcb = 0;
4404 snicb = 0;
4405
4406 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
4407 TLS1_VERSION, 0,
4408 &sctx, &cctx, cert, privkey)))
4409 goto end;
4410
4411 if (tst == 2
4412 && !TEST_true(create_ssl_ctx_pair(TLS_server_method(), NULL,
4413 TLS1_VERSION, 0,
4414 &sctx2, NULL, cert, privkey)))
4415 goto end;
4416
4417
4418 if (tst < 3) {
4419 SSL_CTX_set_options(cctx, SSL_OP_NO_TLSv1_3);
4420 SSL_CTX_set_options(sctx, SSL_OP_NO_TLSv1_3);
4421 if (sctx2 != NULL)
4422 SSL_CTX_set_options(sctx2, SSL_OP_NO_TLSv1_3);
4423 }
4424
4425 if (tst == 4) {
4426 context = SSL_EXT_CLIENT_HELLO
4427 | SSL_EXT_TLS1_2_SERVER_HELLO
4428 | SSL_EXT_TLS1_3_SERVER_HELLO
4429 | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS
4430 | SSL_EXT_TLS1_3_CERTIFICATE
4431 | SSL_EXT_TLS1_3_NEW_SESSION_TICKET;
4432 } else {
4433 context = SSL_EXT_CLIENT_HELLO
4434 | SSL_EXT_TLS1_2_SERVER_HELLO
4435 | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS;
4436 }
4437
4438 /* Create a client side custom extension */
4439 if (tst == 0) {
4440 if (!TEST_true(SSL_CTX_add_client_custom_ext(cctx, TEST_EXT_TYPE1,
4441 old_add_cb, old_free_cb,
4442 &client, old_parse_cb,
4443 &client)))
4444 goto end;
4445 } else {
4446 if (!TEST_true(SSL_CTX_add_custom_ext(cctx, TEST_EXT_TYPE1, context,
4447 new_add_cb, new_free_cb,
4448 &client, new_parse_cb, &client)))
4449 goto end;
4450 }
4451
4452 /* Should not be able to add duplicates */
4453 if (!TEST_false(SSL_CTX_add_client_custom_ext(cctx, TEST_EXT_TYPE1,
4454 old_add_cb, old_free_cb,
4455 &client, old_parse_cb,
4456 &client))
4457 || !TEST_false(SSL_CTX_add_custom_ext(cctx, TEST_EXT_TYPE1,
4458 context, new_add_cb,
4459 new_free_cb, &client,
4460 new_parse_cb, &client)))
4461 goto end;
4462
4463 /* Create a server side custom extension */
4464 if (tst == 0) {
4465 if (!TEST_true(SSL_CTX_add_server_custom_ext(sctx, TEST_EXT_TYPE1,
4466 old_add_cb, old_free_cb,
4467 &server, old_parse_cb,
4468 &server)))
4469 goto end;
4470 } else {
4471 if (!TEST_true(SSL_CTX_add_custom_ext(sctx, TEST_EXT_TYPE1, context,
4472 new_add_cb, new_free_cb,
4473 &server, new_parse_cb, &server)))
4474 goto end;
4475 if (sctx2 != NULL
4476 && !TEST_true(SSL_CTX_add_custom_ext(sctx2, TEST_EXT_TYPE1,
4477 context, new_add_cb,
4478 new_free_cb, &server,
4479 new_parse_cb, &server)))
4480 goto end;
4481 }
4482
4483 /* Should not be able to add duplicates */
4484 if (!TEST_false(SSL_CTX_add_server_custom_ext(sctx, TEST_EXT_TYPE1,
4485 old_add_cb, old_free_cb,
4486 &server, old_parse_cb,
4487 &server))
4488 || !TEST_false(SSL_CTX_add_custom_ext(sctx, TEST_EXT_TYPE1,
4489 context, new_add_cb,
4490 new_free_cb, &server,
4491 new_parse_cb, &server)))
4492 goto end;
4493
4494 if (tst == 2) {
4495 /* Set up SNI */
4496 if (!TEST_true(SSL_CTX_set_tlsext_servername_callback(sctx, sni_cb))
4497 || !TEST_true(SSL_CTX_set_tlsext_servername_arg(sctx, sctx2)))
4498 goto end;
4499 }
4500
4501 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
4502 &clientssl, NULL, NULL))
4503 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4504 SSL_ERROR_NONE)))
4505 goto end;
4506
4507 if (tst == 0) {
4508 if (clntaddoldcb != 1
4509 || clntparseoldcb != 1
4510 || srvaddoldcb != 1
4511 || srvparseoldcb != 1)
4512 goto end;
4513 } else if (tst == 1 || tst == 2 || tst == 3) {
4514 if (clntaddnewcb != 1
4515 || clntparsenewcb != 1
4516 || srvaddnewcb != 1
4517 || srvparsenewcb != 1
4518 || (tst != 2 && snicb != 0)
4519 || (tst == 2 && snicb != 1))
4520 goto end;
4521 } else {
4522 /* In this case there 2 NewSessionTicket messages created */
4523 if (clntaddnewcb != 1
4524 || clntparsenewcb != 5
4525 || srvaddnewcb != 5
4526 || srvparsenewcb != 1)
4527 goto end;
4528 }
4529
4530 sess = SSL_get1_session(clientssl);
4531 SSL_shutdown(clientssl);
4532 SSL_shutdown(serverssl);
4533 SSL_free(serverssl);
4534 SSL_free(clientssl);
4535 serverssl = clientssl = NULL;
4536
4537 if (tst == 3) {
4538 /* We don't bother with the resumption aspects for this test */
4539 testresult = 1;
4540 goto end;
4541 }
4542
4543 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4544 NULL, NULL))
4545 || !TEST_true(SSL_set_session(clientssl, sess))
4546 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4547 SSL_ERROR_NONE)))
4548 goto end;
4549
4550 /*
4551 * For a resumed session we expect to add the ClientHello extension. For the
4552 * old style callbacks we ignore it on the server side because they set
4553 * SSL_EXT_IGNORE_ON_RESUMPTION. The new style callbacks do not ignore
4554 * them.
4555 */
4556 if (tst == 0) {
4557 if (clntaddoldcb != 2
4558 || clntparseoldcb != 1
4559 || srvaddoldcb != 1
4560 || srvparseoldcb != 1)
4561 goto end;
4562 } else if (tst == 1 || tst == 2 || tst == 3) {
4563 if (clntaddnewcb != 2
4564 || clntparsenewcb != 2
4565 || srvaddnewcb != 2
4566 || srvparsenewcb != 2)
4567 goto end;
4568 } else {
4569 /*
4570 * No Certificate message extensions in the resumption handshake,
4571 * 2 NewSessionTickets in the initial handshake, 1 in the resumption
4572 */
4573 if (clntaddnewcb != 2
4574 || clntparsenewcb != 8
4575 || srvaddnewcb != 8
4576 || srvparsenewcb != 2)
4577 goto end;
4578 }
4579
4580 testresult = 1;
4581
4582 end:
4583 SSL_SESSION_free(sess);
4584 SSL_free(serverssl);
4585 SSL_free(clientssl);
4586 SSL_CTX_free(sctx2);
4587 SSL_CTX_free(sctx);
4588 SSL_CTX_free(cctx);
4589 return testresult;
4590 }
4591
4592 /*
4593 * Test loading of serverinfo data in various formats. test_sslmessages actually
4594 * tests to make sure the extensions appear in the handshake
4595 */
4596 static int test_serverinfo(int tst)
4597 {
4598 unsigned int version;
4599 unsigned char *sibuf;
4600 size_t sibuflen;
4601 int ret, expected, testresult = 0;
4602 SSL_CTX *ctx;
4603
4604 ctx = SSL_CTX_new(TLS_method());
4605 if (!TEST_ptr(ctx))
4606 goto end;
4607
4608 if ((tst & 0x01) == 0x01)
4609 version = SSL_SERVERINFOV2;
4610 else
4611 version = SSL_SERVERINFOV1;
4612
4613 if ((tst & 0x02) == 0x02) {
4614 sibuf = serverinfov2;
4615 sibuflen = sizeof(serverinfov2);
4616 expected = (version == SSL_SERVERINFOV2);
4617 } else {
4618 sibuf = serverinfov1;
4619 sibuflen = sizeof(serverinfov1);
4620 expected = (version == SSL_SERVERINFOV1);
4621 }
4622
4623 if ((tst & 0x04) == 0x04) {
4624 ret = SSL_CTX_use_serverinfo_ex(ctx, version, sibuf, sibuflen);
4625 } else {
4626 ret = SSL_CTX_use_serverinfo(ctx, sibuf, sibuflen);
4627
4628 /*
4629 * The version variable is irrelevant in this case - it's what is in the
4630 * buffer that matters
4631 */
4632 if ((tst & 0x02) == 0x02)
4633 expected = 0;
4634 else
4635 expected = 1;
4636 }
4637
4638 if (!TEST_true(ret == expected))
4639 goto end;
4640
4641 testresult = 1;
4642
4643 end:
4644 SSL_CTX_free(ctx);
4645
4646 return testresult;
4647 }
4648
4649 /*
4650 * Test that SSL_export_keying_material() produces expected results. There are
4651 * no test vectors so all we do is test that both sides of the communication
4652 * produce the same results for different protocol versions.
4653 */
4654 #define SMALL_LABEL_LEN 10
4655 #define LONG_LABEL_LEN 249
4656 static int test_export_key_mat(int tst)
4657 {
4658 int testresult = 0;
4659 SSL_CTX *cctx = NULL, *sctx = NULL, *sctx2 = NULL;
4660 SSL *clientssl = NULL, *serverssl = NULL;
4661 const char label[LONG_LABEL_LEN + 1] = "test label";
4662 const unsigned char context[] = "context";
4663 const unsigned char *emptycontext = NULL;
4664 unsigned char ckeymat1[80], ckeymat2[80], ckeymat3[80];
4665 unsigned char skeymat1[80], skeymat2[80], skeymat3[80];
4666 size_t labellen;
4667 const int protocols[] = {
4668 TLS1_VERSION,
4669 TLS1_1_VERSION,
4670 TLS1_2_VERSION,
4671 TLS1_3_VERSION,
4672 TLS1_3_VERSION,
4673 TLS1_3_VERSION
4674 };
4675
4676 #ifdef OPENSSL_NO_TLS1
4677 if (tst == 0)
4678 return 1;
4679 #endif
4680 #ifdef OPENSSL_NO_TLS1_1
4681 if (tst == 1)
4682 return 1;
4683 #endif
4684 #ifdef OPENSSL_NO_TLS1_2
4685 if (tst == 2)
4686 return 1;
4687 #endif
4688 #ifdef OPENSSL_NO_TLS1_3
4689 if (tst >= 3)
4690 return 1;
4691 #endif
4692 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
4693 TLS1_VERSION, 0,
4694 &sctx, &cctx, cert, privkey)))
4695 goto end;
4696
4697 OPENSSL_assert(tst >= 0 && (size_t)tst < OSSL_NELEM(protocols));
4698 SSL_CTX_set_max_proto_version(cctx, protocols[tst]);
4699 SSL_CTX_set_min_proto_version(cctx, protocols[tst]);
4700
4701 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
4702 NULL))
4703 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4704 SSL_ERROR_NONE)))
4705 goto end;
4706
4707 if (tst == 5) {
4708 /*
4709 * TLSv1.3 imposes a maximum label len of 249 bytes. Check we fail if we
4710 * go over that.
4711 */
4712 if (!TEST_int_le(SSL_export_keying_material(clientssl, ckeymat1,
4713 sizeof(ckeymat1), label,
4714 LONG_LABEL_LEN + 1, context,
4715 sizeof(context) - 1, 1), 0))
4716 goto end;
4717
4718 testresult = 1;
4719 goto end;
4720 } else if (tst == 4) {
4721 labellen = LONG_LABEL_LEN;
4722 } else {
4723 labellen = SMALL_LABEL_LEN;
4724 }
4725
4726 if (!TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat1,
4727 sizeof(ckeymat1), label,
4728 labellen, context,
4729 sizeof(context) - 1, 1), 1)
4730 || !TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat2,
4731 sizeof(ckeymat2), label,
4732 labellen,
4733 emptycontext,
4734 0, 1), 1)
4735 || !TEST_int_eq(SSL_export_keying_material(clientssl, ckeymat3,
4736 sizeof(ckeymat3), label,
4737 labellen,
4738 NULL, 0, 0), 1)
4739 || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat1,
4740 sizeof(skeymat1), label,
4741 labellen,
4742 context,
4743 sizeof(context) -1, 1),
4744 1)
4745 || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat2,
4746 sizeof(skeymat2), label,
4747 labellen,
4748 emptycontext,
4749 0, 1), 1)
4750 || !TEST_int_eq(SSL_export_keying_material(serverssl, skeymat3,
4751 sizeof(skeymat3), label,
4752 labellen,
4753 NULL, 0, 0), 1)
4754 /*
4755 * Check that both sides created the same key material with the
4756 * same context.
4757 */
4758 || !TEST_mem_eq(ckeymat1, sizeof(ckeymat1), skeymat1,
4759 sizeof(skeymat1))
4760 /*
4761 * Check that both sides created the same key material with an
4762 * empty context.
4763 */
4764 || !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), skeymat2,
4765 sizeof(skeymat2))
4766 /*
4767 * Check that both sides created the same key material without a
4768 * context.
4769 */
4770 || !TEST_mem_eq(ckeymat3, sizeof(ckeymat3), skeymat3,
4771 sizeof(skeymat3))
4772 /* Different contexts should produce different results */
4773 || !TEST_mem_ne(ckeymat1, sizeof(ckeymat1), ckeymat2,
4774 sizeof(ckeymat2)))
4775 goto end;
4776
4777 /*
4778 * Check that an empty context and no context produce different results in
4779 * protocols less than TLSv1.3. In TLSv1.3 they should be the same.
4780 */
4781 if ((tst < 3 && !TEST_mem_ne(ckeymat2, sizeof(ckeymat2), ckeymat3,
4782 sizeof(ckeymat3)))
4783 || (tst >= 3 && !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), ckeymat3,
4784 sizeof(ckeymat3))))
4785 goto end;
4786
4787 testresult = 1;
4788
4789 end:
4790 SSL_free(serverssl);
4791 SSL_free(clientssl);
4792 SSL_CTX_free(sctx2);
4793 SSL_CTX_free(sctx);
4794 SSL_CTX_free(cctx);
4795
4796 return testresult;
4797 }
4798
4799 #ifndef OPENSSL_NO_TLS1_3
4800 /*
4801 * Test that SSL_export_keying_material_early() produces expected
4802 * results. There are no test vectors so all we do is test that both
4803 * sides of the communication produce the same results for different
4804 * protocol versions.
4805 */
4806 static int test_export_key_mat_early(int idx)
4807 {
4808 static const char label[] = "test label";
4809 static const unsigned char context[] = "context";
4810 int testresult = 0;
4811 SSL_CTX *cctx = NULL, *sctx = NULL;
4812 SSL *clientssl = NULL, *serverssl = NULL;
4813 SSL_SESSION *sess = NULL;
4814 const unsigned char *emptycontext = NULL;
4815 unsigned char ckeymat1[80], ckeymat2[80];
4816 unsigned char skeymat1[80], skeymat2[80];
4817 unsigned char buf[1];
4818 size_t readbytes, written;
4819
4820 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl, &serverssl,
4821 &sess, idx)))
4822 goto end;
4823
4824 /* Here writing 0 length early data is enough. */
4825 if (!TEST_true(SSL_write_early_data(clientssl, NULL, 0, &written))
4826 || !TEST_int_eq(SSL_read_early_data(serverssl, buf, sizeof(buf),
4827 &readbytes),
4828 SSL_READ_EARLY_DATA_ERROR)
4829 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
4830 SSL_EARLY_DATA_ACCEPTED))
4831 goto end;
4832
4833 if (!TEST_int_eq(SSL_export_keying_material_early(
4834 clientssl, ckeymat1, sizeof(ckeymat1), label,
4835 sizeof(label) - 1, context, sizeof(context) - 1), 1)
4836 || !TEST_int_eq(SSL_export_keying_material_early(
4837 clientssl, ckeymat2, sizeof(ckeymat2), label,
4838 sizeof(label) - 1, emptycontext, 0), 1)
4839 || !TEST_int_eq(SSL_export_keying_material_early(
4840 serverssl, skeymat1, sizeof(skeymat1), label,
4841 sizeof(label) - 1, context, sizeof(context) - 1), 1)
4842 || !TEST_int_eq(SSL_export_keying_material_early(
4843 serverssl, skeymat2, sizeof(skeymat2), label,
4844 sizeof(label) - 1, emptycontext, 0), 1)
4845 /*
4846 * Check that both sides created the same key material with the
4847 * same context.
4848 */
4849 || !TEST_mem_eq(ckeymat1, sizeof(ckeymat1), skeymat1,
4850 sizeof(skeymat1))
4851 /*
4852 * Check that both sides created the same key material with an
4853 * empty context.
4854 */
4855 || !TEST_mem_eq(ckeymat2, sizeof(ckeymat2), skeymat2,
4856 sizeof(skeymat2))
4857 /* Different contexts should produce different results */
4858 || !TEST_mem_ne(ckeymat1, sizeof(ckeymat1), ckeymat2,
4859 sizeof(ckeymat2)))
4860 goto end;
4861
4862 testresult = 1;
4863
4864 end:
4865 SSL_SESSION_free(sess);
4866 SSL_SESSION_free(clientpsk);
4867 SSL_SESSION_free(serverpsk);
4868 clientpsk = serverpsk = NULL;
4869 SSL_free(serverssl);
4870 SSL_free(clientssl);
4871 SSL_CTX_free(sctx);
4872 SSL_CTX_free(cctx);
4873
4874 return testresult;
4875 }
4876
4877 #define NUM_KEY_UPDATE_MESSAGES 40
4878 /*
4879 * Test KeyUpdate.
4880 */
4881 static int test_key_update(void)
4882 {
4883 SSL_CTX *cctx = NULL, *sctx = NULL;
4884 SSL *clientssl = NULL, *serverssl = NULL;
4885 int testresult = 0, i, j;
4886 char buf[20];
4887 static char *mess = "A test message";
4888
4889 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
4890 TLS_client_method(),
4891 TLS1_3_VERSION,
4892 0,
4893 &sctx, &cctx, cert, privkey))
4894 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4895 NULL, NULL))
4896 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4897 SSL_ERROR_NONE)))
4898 goto end;
4899
4900 for (j = 0; j < 2; j++) {
4901 /* Send lots of KeyUpdate messages */
4902 for (i = 0; i < NUM_KEY_UPDATE_MESSAGES; i++) {
4903 if (!TEST_true(SSL_key_update(clientssl,
4904 (j == 0)
4905 ? SSL_KEY_UPDATE_NOT_REQUESTED
4906 : SSL_KEY_UPDATE_REQUESTED))
4907 || !TEST_true(SSL_do_handshake(clientssl)))
4908 goto end;
4909 }
4910
4911 /* Check that sending and receiving app data is ok */
4912 if (!TEST_int_eq(SSL_write(clientssl, mess, strlen(mess)), strlen(mess))
4913 || !TEST_int_eq(SSL_read(serverssl, buf, sizeof(buf)),
4914 strlen(mess)))
4915 goto end;
4916
4917 if (!TEST_int_eq(SSL_write(serverssl, mess, strlen(mess)), strlen(mess))
4918 || !TEST_int_eq(SSL_read(clientssl, buf, sizeof(buf)),
4919 strlen(mess)))
4920 goto end;
4921 }
4922
4923 testresult = 1;
4924
4925 end:
4926 SSL_free(serverssl);
4927 SSL_free(clientssl);
4928 SSL_CTX_free(sctx);
4929 SSL_CTX_free(cctx);
4930
4931 return testresult;
4932 }
4933
4934 /*
4935 * Test we can handle a KeyUpdate (update requested) message while write data
4936 * is pending.
4937 * Test 0: Client sends KeyUpdate while Server is writing
4938 * Test 1: Server sends KeyUpdate while Client is writing
4939 */
4940 static int test_key_update_in_write(int tst)
4941 {
4942 SSL_CTX *cctx = NULL, *sctx = NULL;
4943 SSL *clientssl = NULL, *serverssl = NULL;
4944 int testresult = 0;
4945 char buf[20];
4946 static char *mess = "A test message";
4947 BIO *bretry = BIO_new(bio_s_always_retry());
4948 BIO *tmp = NULL;
4949 SSL *peerupdate = NULL, *peerwrite = NULL;
4950
4951 if (!TEST_ptr(bretry)
4952 || !TEST_true(create_ssl_ctx_pair(TLS_server_method(),
4953 TLS_client_method(),
4954 TLS1_3_VERSION,
4955 0,
4956 &sctx, &cctx, cert, privkey))
4957 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
4958 NULL, NULL))
4959 || !TEST_true(create_ssl_connection(serverssl, clientssl,
4960 SSL_ERROR_NONE)))
4961 goto end;
4962
4963 peerupdate = tst == 0 ? clientssl : serverssl;
4964 peerwrite = tst == 0 ? serverssl : clientssl;
4965
4966 if (!TEST_true(SSL_key_update(peerupdate, SSL_KEY_UPDATE_REQUESTED))
4967 || !TEST_true(SSL_do_handshake(peerupdate)))
4968 goto end;
4969
4970 /* Swap the writing endpoint's write BIO to force a retry */
4971 tmp = SSL_get_wbio(peerwrite);
4972 if (!TEST_ptr(tmp) || !TEST_true(BIO_up_ref(tmp))) {
4973 tmp = NULL;
4974 goto end;
4975 }
4976 SSL_set0_wbio(peerwrite, bretry);
4977 bretry = NULL;
4978
4979 /* Write data that we know will fail with SSL_ERROR_WANT_WRITE */
4980 if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), -1)
4981 || !TEST_int_eq(SSL_get_error(peerwrite, 0), SSL_ERROR_WANT_WRITE))
4982 goto end;
4983
4984 /* Reinstate the original writing endpoint's write BIO */
4985 SSL_set0_wbio(peerwrite, tmp);
4986 tmp = NULL;
4987
4988 /* Now read some data - we will read the key update */
4989 if (!TEST_int_eq(SSL_read(peerwrite, buf, sizeof(buf)), -1)
4990 || !TEST_int_eq(SSL_get_error(peerwrite, 0), SSL_ERROR_WANT_READ))
4991 goto end;
4992
4993 /*
4994 * Complete the write we started previously and read it from the other
4995 * endpoint
4996 */
4997 if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), strlen(mess))
4998 || !TEST_int_eq(SSL_read(peerupdate, buf, sizeof(buf)), strlen(mess)))
4999 goto end;
5000
5001 /* Write more data to ensure we send the KeyUpdate message back */
5002 if (!TEST_int_eq(SSL_write(peerwrite, mess, strlen(mess)), strlen(mess))
5003 || !TEST_int_eq(SSL_read(peerupdate, buf, sizeof(buf)), strlen(mess)))
5004 goto end;
5005
5006 testresult = 1;
5007
5008 end:
5009 SSL_free(serverssl);
5010 SSL_free(clientssl);
5011 SSL_CTX_free(sctx);
5012 SSL_CTX_free(cctx);
5013 BIO_free(bretry);
5014 BIO_free(tmp);
5015
5016 return testresult;
5017 }
5018 #endif /* OPENSSL_NO_TLS1_3 */
5019
5020 static int test_ssl_clear(int idx)
5021 {
5022 SSL_CTX *cctx = NULL, *sctx = NULL;
5023 SSL *clientssl = NULL, *serverssl = NULL;
5024 int testresult = 0;
5025
5026 #ifdef OPENSSL_NO_TLS1_2
5027 if (idx == 1)
5028 return 1;
5029 #endif
5030
5031 /* Create an initial connection */
5032 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
5033 TLS1_VERSION, 0,
5034 &sctx, &cctx, cert, privkey))
5035 || (idx == 1
5036 && !TEST_true(SSL_CTX_set_max_proto_version(cctx,
5037 TLS1_2_VERSION)))
5038 || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5039 &clientssl, NULL, NULL))
5040 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5041 SSL_ERROR_NONE)))
5042 goto end;
5043
5044 SSL_shutdown(clientssl);
5045 SSL_shutdown(serverssl);
5046 SSL_free(serverssl);
5047 serverssl = NULL;
5048
5049 /* Clear clientssl - we're going to reuse the object */
5050 if (!TEST_true(SSL_clear(clientssl)))
5051 goto end;
5052
5053 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5054 NULL, NULL))
5055 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5056 SSL_ERROR_NONE))
5057 || !TEST_true(SSL_session_reused(clientssl)))
5058 goto end;
5059
5060 SSL_shutdown(clientssl);
5061 SSL_shutdown(serverssl);
5062
5063 testresult = 1;
5064
5065 end:
5066 SSL_free(serverssl);
5067 SSL_free(clientssl);
5068 SSL_CTX_free(sctx);
5069 SSL_CTX_free(cctx);
5070
5071 return testresult;
5072 }
5073
5074 /* Parse CH and retrieve any MFL extension value if present */
5075 static int get_MFL_from_client_hello(BIO *bio, int *mfl_codemfl_code)
5076 {
5077 long len;
5078 unsigned char *data;
5079 PACKET pkt, pkt2, pkt3;
5080 unsigned int MFL_code = 0, type = 0;
5081
5082 if (!TEST_uint_gt( len = BIO_get_mem_data( bio, (char **) &data ), 0 ) )
5083 goto end;
5084
5085 memset(&pkt, 0, sizeof(pkt));
5086 memset(&pkt2, 0, sizeof(pkt2));
5087 memset(&pkt3, 0, sizeof(pkt3));
5088
5089 if (!TEST_true( PACKET_buf_init( &pkt, data, len ) )
5090 /* Skip the record header */
5091 || !PACKET_forward(&pkt, SSL3_RT_HEADER_LENGTH)
5092 /* Skip the handshake message header */
5093 || !TEST_true(PACKET_forward(&pkt, SSL3_HM_HEADER_LENGTH))
5094 /* Skip client version and random */
5095 || !TEST_true(PACKET_forward(&pkt, CLIENT_VERSION_LEN
5096 + SSL3_RANDOM_SIZE))
5097 /* Skip session id */
5098 || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &pkt2))
5099 /* Skip ciphers */
5100 || !TEST_true(PACKET_get_length_prefixed_2(&pkt, &pkt2))
5101 /* Skip compression */
5102 || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &pkt2))
5103 /* Extensions len */
5104 || !TEST_true(PACKET_as_length_prefixed_2(&pkt, &pkt2)))
5105 goto end;
5106
5107 /* Loop through all extensions */
5108 while (PACKET_remaining(&pkt2)) {
5109 if (!TEST_true(PACKET_get_net_2(&pkt2, &type))
5110 || !TEST_true(PACKET_get_length_prefixed_2(&pkt2, &pkt3)))
5111 goto end;
5112
5113 if (type == TLSEXT_TYPE_max_fragment_length) {
5114 if (!TEST_uint_ne(PACKET_remaining(&pkt3), 0)
5115 || !TEST_true(PACKET_get_1(&pkt3, &MFL_code)))
5116 goto end;
5117
5118 *mfl_codemfl_code = MFL_code;
5119 return 1;
5120 }
5121 }
5122
5123 end:
5124 return 0;
5125 }
5126
5127 /* Maximum-Fragment-Length TLS extension mode to test */
5128 static const unsigned char max_fragment_len_test[] = {
5129 TLSEXT_max_fragment_length_512,
5130 TLSEXT_max_fragment_length_1024,
5131 TLSEXT_max_fragment_length_2048,
5132 TLSEXT_max_fragment_length_4096
5133 };
5134
5135 static int test_max_fragment_len_ext(int idx_tst)
5136 {
5137 SSL_CTX *ctx;
5138 SSL *con = NULL;
5139 int testresult = 0, MFL_mode = 0;
5140 BIO *rbio, *wbio;
5141
5142 ctx = SSL_CTX_new(TLS_method());
5143 if (!TEST_ptr(ctx))
5144 goto end;
5145
5146 if (!TEST_true(SSL_CTX_set_tlsext_max_fragment_length(
5147 ctx, max_fragment_len_test[idx_tst])))
5148 goto end;
5149
5150 con = SSL_new(ctx);
5151 if (!TEST_ptr(con))
5152 goto end;
5153
5154 rbio = BIO_new(BIO_s_mem());
5155 wbio = BIO_new(BIO_s_mem());
5156 if (!TEST_ptr(rbio)|| !TEST_ptr(wbio)) {
5157 BIO_free(rbio);
5158 BIO_free(wbio);
5159 goto end;
5160 }
5161
5162 SSL_set_bio(con, rbio, wbio);
5163 SSL_set_connect_state(con);
5164
5165 if (!TEST_int_le(SSL_connect(con), 0)) {
5166 /* This shouldn't succeed because we don't have a server! */
5167 goto end;
5168 }
5169
5170 if (!TEST_true(get_MFL_from_client_hello(wbio, &MFL_mode)))
5171 /* no MFL in client hello */
5172 goto end;
5173 if (!TEST_true(max_fragment_len_test[idx_tst] == MFL_mode))
5174 goto end;
5175
5176 testresult = 1;
5177
5178 end:
5179 SSL_free(con);
5180 SSL_CTX_free(ctx);
5181
5182 return testresult;
5183 }
5184
5185 #ifndef OPENSSL_NO_TLS1_3
5186 static int test_pha_key_update(void)
5187 {
5188 SSL_CTX *cctx = NULL, *sctx = NULL;
5189 SSL *clientssl = NULL, *serverssl = NULL;
5190 int testresult = 0;
5191
5192 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
5193 TLS1_VERSION, 0,
5194 &sctx, &cctx, cert, privkey)))
5195 return 0;
5196
5197 if (!TEST_true(SSL_CTX_set_min_proto_version(sctx, TLS1_3_VERSION))
5198 || !TEST_true(SSL_CTX_set_max_proto_version(sctx, TLS1_3_VERSION))
5199 || !TEST_true(SSL_CTX_set_min_proto_version(cctx, TLS1_3_VERSION))
5200 || !TEST_true(SSL_CTX_set_max_proto_version(cctx, TLS1_3_VERSION)))
5201 goto end;
5202
5203 SSL_CTX_set_post_handshake_auth(cctx, 1);
5204
5205 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5206 NULL, NULL)))
5207 goto end;
5208
5209 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
5210 SSL_ERROR_NONE)))
5211 goto end;
5212
5213 SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
5214 if (!TEST_true(SSL_verify_client_post_handshake(serverssl)))
5215 goto end;
5216
5217 if (!TEST_true(SSL_key_update(clientssl, SSL_KEY_UPDATE_NOT_REQUESTED)))
5218 goto end;
5219
5220 /* Start handshake on the server */
5221 if (!TEST_int_eq(SSL_do_handshake(serverssl), 1))
5222 goto end;
5223
5224 /* Starts with SSL_connect(), but it's really just SSL_do_handshake() */
5225 if (!TEST_true(create_ssl_connection(serverssl, clientssl,
5226 SSL_ERROR_NONE)))
5227 goto end;
5228
5229 SSL_shutdown(clientssl);
5230 SSL_shutdown(serverssl);
5231
5232 testresult = 1;
5233
5234 end:
5235 SSL_free(serverssl);
5236 SSL_free(clientssl);
5237 SSL_CTX_free(sctx);
5238 SSL_CTX_free(cctx);
5239 return testresult;
5240 }
5241 #endif
5242
5243 #if !defined(OPENSSL_NO_SRP) && !defined(OPENSSL_NO_TLS1_2)
5244
5245 static SRP_VBASE *vbase = NULL;
5246
5247 static int ssl_srp_cb(SSL *s, int *ad, void *arg)
5248 {
5249 int ret = SSL3_AL_FATAL;
5250 char *username;
5251 SRP_user_pwd *user = NULL;
5252
5253 username = SSL_get_srp_username(s);
5254 if (username == NULL) {
5255 *ad = SSL_AD_INTERNAL_ERROR;
5256 goto err;
5257 }
5258
5259 user = SRP_VBASE_get1_by_user(vbase, username);
5260 if (user == NULL) {
5261 *ad = SSL_AD_INTERNAL_ERROR;
5262 goto err;
5263 }
5264
5265 if (SSL_set_srp_server_param(s, user->N, user->g, user->s, user->v,
5266 user->info) <= 0) {
5267 *ad = SSL_AD_INTERNAL_ERROR;
5268 goto err;
5269 }
5270
5271 ret = 0;
5272
5273 err:
5274 SRP_user_pwd_free(user);
5275 return ret;
5276 }
5277
5278 static int create_new_vfile(char *userid, char *password, const char *filename)
5279 {
5280 char *gNid = NULL;
5281 OPENSSL_STRING *row = OPENSSL_zalloc(sizeof(row) * (DB_NUMBER + 1));
5282 TXT_DB *db = NULL;
5283 int ret = 0;
5284 BIO *out = NULL, *dummy = BIO_new_mem_buf("", 0);
5285 size_t i;
5286
5287 if (!TEST_ptr(dummy) || !TEST_ptr(row))
5288 goto end;
5289
5290 gNid = SRP_create_verifier(userid, password, &row[DB_srpsalt],
5291 &row[DB_srpverifier], NULL, NULL);
5292 if (!TEST_ptr(gNid))
5293 goto end;
5294
5295 /*
5296 * The only way to create an empty TXT_DB is to provide a BIO with no data
5297 * in it!
5298 */
5299 db = TXT_DB_read(dummy, DB_NUMBER);
5300 if (!TEST_ptr(db))
5301 goto end;
5302
5303 out = BIO_new_file(filename, "w");
5304 if (!TEST_ptr(out))
5305 goto end;
5306
5307 row[DB_srpid] = OPENSSL_strdup(userid);
5308 row[DB_srptype] = OPENSSL_strdup("V");
5309 row[DB_srpgN] = OPENSSL_strdup(gNid);
5310
5311 if (!TEST_ptr(row[DB_srpid])
5312 || !TEST_ptr(row[DB_srptype])
5313 || !TEST_ptr(row[DB_srpgN])
5314 || !TEST_true(TXT_DB_insert(db, row)))
5315 goto end;
5316
5317 row = NULL;
5318
5319 if (!TXT_DB_write(out, db))
5320 goto end;
5321
5322 ret = 1;
5323 end:
5324 if (row != NULL) {
5325 for (i = 0; i < DB_NUMBER; i++)
5326 OPENSSL_free(row[i]);
5327 }
5328 OPENSSL_free(row);
5329 BIO_free(dummy);
5330 BIO_free(out);
5331 TXT_DB_free(db);
5332
5333 return ret;
5334 }
5335
5336 static int create_new_vbase(char *userid, char *password)
5337 {
5338 BIGNUM *verifier = NULL, *salt = NULL;
5339 const SRP_gN *lgN = NULL;
5340 SRP_user_pwd *user_pwd = NULL;
5341 int ret = 0;
5342
5343 lgN = SRP_get_default_gN(NULL);
5344 if (!TEST_ptr(lgN))
5345 goto end;
5346
5347 if (!TEST_true(SRP_create_verifier_BN(userid, password, &salt, &verifier,
5348 lgN->N, lgN->g)))
5349 goto end;
5350
5351 user_pwd = OPENSSL_zalloc(sizeof(*user_pwd));
5352 if (!TEST_ptr(user_pwd))
5353 goto end;
5354
5355 user_pwd->N = lgN->N;
5356 user_pwd->g = lgN->g;
5357 user_pwd->id = OPENSSL_strdup(userid);
5358 if (!TEST_ptr(user_pwd->id))
5359 goto end;
5360
5361 user_pwd->v = verifier;
5362 user_pwd->s = salt;
5363 verifier = salt = NULL;
5364
5365 if (sk_SRP_user_pwd_insert(vbase->users_pwd, user_pwd, 0) == 0)
5366 goto end;
5367 user_pwd = NULL;
5368
5369 ret = 1;
5370 end:
5371 SRP_user_pwd_free(user_pwd);
5372 BN_free(salt);
5373 BN_free(verifier);
5374
5375 return ret;
5376 }
5377
5378 /*
5379 * SRP tests
5380 *
5381 * Test 0: Simple successful SRP connection, new vbase
5382 * Test 1: Connection failure due to bad password, new vbase
5383 * Test 2: Simple successful SRP connection, vbase loaded from existing file
5384 * Test 3: Connection failure due to bad password, vbase loaded from existing
5385 * file
5386 * Test 4: Simple successful SRP connection, vbase loaded from new file
5387 * Test 5: Connection failure due to bad password, vbase loaded from new file
5388 */
5389 static int test_srp(int tst)
5390 {
5391 char *userid = "test", *password = "password", *tstsrpfile;
5392 SSL_CTX *cctx = NULL, *sctx = NULL;
5393 SSL *clientssl = NULL, *serverssl = NULL;
5394 int ret, testresult = 0;
5395
5396 vbase = SRP_VBASE_new(NULL);
5397 if (!TEST_ptr(vbase))
5398 goto end;
5399
5400 if (tst == 0 || tst == 1) {
5401 if (!TEST_true(create_new_vbase(userid, password)))
5402 goto end;
5403 } else {
5404 if (tst == 4 || tst == 5) {
5405 if (!TEST_true(create_new_vfile(userid, password, tmpfilename)))
5406 goto end;
5407 tstsrpfile = tmpfilename;
5408 } else {
5409 tstsrpfile = srpvfile;
5410 }
5411 if (!TEST_int_eq(SRP_VBASE_init(vbase, tstsrpfile), SRP_NO_ERROR))
5412 goto end;
5413 }
5414
5415 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), TLS_client_method(),
5416 TLS1_VERSION, 0,
5417 &sctx, &cctx, cert, privkey)))
5418 goto end;
5419
5420 if (!TEST_int_gt(SSL_CTX_set_srp_username_callback(sctx, ssl_srp_cb), 0)
5421 || !TEST_true(SSL_CTX_set_cipher_list(cctx, "SRP-AES-128-CBC-SHA"))
5422 || !TEST_true(SSL_CTX_set_max_proto_version(sctx, TLS1_2_VERSION))
5423 || !TEST_true(SSL_CTX_set_max_proto_version(cctx, TLS1_2_VERSION))
5424 || !TEST_int_gt(SSL_CTX_set_srp_username(cctx, userid), 0))
5425 goto end;
5426
5427 if (tst % 2 == 1) {
5428 if (!TEST_int_gt(SSL_CTX_set_srp_password(cctx, "badpass"), 0))
5429 goto end;
5430 } else {
5431 if (!TEST_int_gt(SSL_CTX_set_srp_password(cctx, password), 0))
5432 goto end;
5433 }
5434
5435 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5436 NULL, NULL)))
5437 goto end;
5438
5439 ret = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
5440 if (ret) {
5441 if (!TEST_true(tst % 2 == 0))
5442 goto end;
5443 } else {
5444 if (!TEST_true(tst % 2 == 1))
5445 goto end;
5446 }
5447
5448 testresult = 1;
5449
5450 end:
5451 SRP_VBASE_free(vbase);
5452 vbase = NULL;
5453 SSL_free(serverssl);
5454 SSL_free(clientssl);
5455 SSL_CTX_free(sctx);
5456 SSL_CTX_free(cctx);
5457
5458 return testresult;
5459 }
5460 #endif
5461
5462 static int info_cb_failed = 0;
5463 static int info_cb_offset = 0;
5464 static int info_cb_this_state = -1;
5465
5466 static struct info_cb_states_st {
5467 int where;
5468 const char *statestr;
5469 } info_cb_states[][60] = {
5470 {
5471 /* TLSv1.2 server followed by resumption */
5472 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5473 {SSL_CB_LOOP, "PINIT "}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
5474 {SSL_CB_LOOP, "TWSC"}, {SSL_CB_LOOP, "TWSKE"}, {SSL_CB_LOOP, "TWSD"},
5475 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWSD"}, {SSL_CB_LOOP, "TRCKE"},
5476 {SSL_CB_LOOP, "TRCCS"}, {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWST"},
5477 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
5478 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
5479 {SSL_CB_ALERT, NULL}, {SSL_CB_HANDSHAKE_START, NULL},
5480 {SSL_CB_LOOP, "PINIT "}, {SSL_CB_LOOP, "PINIT "}, {SSL_CB_LOOP, "TRCH"},
5481 {SSL_CB_LOOP, "TWSH"}, {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
5482 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_LOOP, "TRCCS"},
5483 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
5484 {SSL_CB_EXIT, NULL}, {0, NULL},
5485 }, {
5486 /* TLSv1.2 client followed by resumption */
5487 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5488 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWCH"},
5489 {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TRSC"}, {SSL_CB_LOOP, "TRSKE"},
5490 {SSL_CB_LOOP, "TRSD"}, {SSL_CB_LOOP, "TWCKE"}, {SSL_CB_LOOP, "TWCCS"},
5491 {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWFIN"},
5492 {SSL_CB_LOOP, "TRST"}, {SSL_CB_LOOP, "TRCCS"}, {SSL_CB_LOOP, "TRFIN"},
5493 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL}, {SSL_CB_ALERT, NULL},
5494 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5495 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWCH"},
5496 {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TRCCS"}, {SSL_CB_LOOP, "TRFIN"},
5497 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
5498 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL}, {0, NULL},
5499 }, {
5500 /* TLSv1.3 server followed by resumption */
5501 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5502 {SSL_CB_LOOP, "PINIT "}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
5503 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWSC"},
5504 {SSL_CB_LOOP, "TRSCV"}, {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_LOOP, "TED"},
5505 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TED"}, {SSL_CB_LOOP, "TRFIN"},
5506 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_LOOP, "TWST"},
5507 {SSL_CB_LOOP, "TWST"}, {SSL_CB_EXIT, NULL}, {SSL_CB_ALERT, NULL},
5508 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5509 {SSL_CB_LOOP, "PINIT "}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
5510 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWFIN"},
5511 {SSL_CB_LOOP, "TED"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TED"},
5512 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
5513 {SSL_CB_LOOP, "TWST"}, {SSL_CB_EXIT, NULL}, {0, NULL},
5514 }, {
5515 /* TLSv1.3 client followed by resumption */
5516 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5517 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "TWCH"},
5518 {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"}, {SSL_CB_LOOP, "TRSC"},
5519 {SSL_CB_LOOP, "TRSCV"}, {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWCCS"},
5520 {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
5521 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK "}, {SSL_CB_LOOP, "SSLOK "},
5522 {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK "},
5523 {SSL_CB_LOOP, "SSLOK "}, {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL},
5524 {SSL_CB_ALERT, NULL}, {SSL_CB_HANDSHAKE_START, NULL},
5525 {SSL_CB_LOOP, "PINIT "}, {SSL_CB_LOOP, "TWCH"}, {SSL_CB_EXIT, NULL},
5526 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"},
5527 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWFIN"},
5528 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
5529 {SSL_CB_LOOP, "SSLOK "}, {SSL_CB_LOOP, "SSLOK "}, {SSL_CB_LOOP, "TRST"},
5530 {SSL_CB_EXIT, NULL}, {0, NULL},
5531 }, {
5532 /* TLSv1.3 server, early_data */
5533 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5534 {SSL_CB_LOOP, "PINIT "}, {SSL_CB_LOOP, "TRCH"}, {SSL_CB_LOOP, "TWSH"},
5535 {SSL_CB_LOOP, "TWCCS"}, {SSL_CB_LOOP, "TWEE"}, {SSL_CB_LOOP, "TWFIN"},
5536 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
5537 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "TED"},
5538 {SSL_CB_LOOP, "TED"}, {SSL_CB_LOOP, "TWEOED"}, {SSL_CB_LOOP, "TRFIN"},
5539 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_LOOP, "TWST"},
5540 {SSL_CB_EXIT, NULL}, {0, NULL},
5541 }, {
5542 /* TLSv1.3 client, early_data */
5543 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "PINIT "},
5544 {SSL_CB_LOOP, "TWCH"}, {SSL_CB_LOOP, "TWCCS"},
5545 {SSL_CB_HANDSHAKE_DONE, NULL}, {SSL_CB_EXIT, NULL},
5546 {SSL_CB_HANDSHAKE_START, NULL}, {SSL_CB_LOOP, "TED"},
5547 {SSL_CB_LOOP, "TED"}, {SSL_CB_LOOP, "TRSH"}, {SSL_CB_LOOP, "TREE"},
5548 {SSL_CB_LOOP, "TRFIN"}, {SSL_CB_LOOP, "TPEDE"}, {SSL_CB_LOOP, "TWEOED"},
5549 {SSL_CB_LOOP, "TWFIN"}, {SSL_CB_HANDSHAKE_DONE, NULL},
5550 {SSL_CB_EXIT, NULL}, {SSL_CB_LOOP, "SSLOK "}, {SSL_CB_LOOP, "SSLOK "},
5551 {SSL_CB_LOOP, "TRST"}, {SSL_CB_EXIT, NULL}, {0, NULL},
5552 }, {
5553 {0, NULL},
5554 }
5555 };
5556
5557 static void sslapi_info_callback(const SSL *s, int where, int ret)
5558 {
5559 struct info_cb_states_st *state = info_cb_states[info_cb_offset];
5560
5561 /* We do not ever expect a connection to fail in this test */
5562 if (!TEST_false(ret == 0)) {
5563 info_cb_failed = 1;
5564 return;
5565 }
5566
5567 /*
5568 * Do some sanity checks. We never expect these things to happen in this
5569 * test
5570 */
5571 if (!TEST_false((SSL_is_server(s) && (where & SSL_ST_CONNECT) != 0))
5572 || !TEST_false(!SSL_is_server(s) && (where & SSL_ST_ACCEPT) != 0)
5573 || !TEST_int_ne(state[++info_cb_this_state].where, 0)) {
5574 info_cb_failed = 1;
5575 return;
5576 }
5577
5578 /* Now check we're in the right state */
5579 if (!TEST_true((where & state[info_cb_this_state].where) != 0)) {
5580 info_cb_failed = 1;
5581 return;
5582 }
5583 if ((where & SSL_CB_LOOP) != 0
5584 && !TEST_int_eq(strcmp(SSL_state_string(s),
5585 state[info_cb_this_state].statestr), 0)) {
5586 info_cb_failed = 1;
5587 return;
5588 }
5589
5590 /*
5591 * Check that, if we've got SSL_CB_HANDSHAKE_DONE we are not in init
5592 */
5593 if ((where & SSL_CB_HANDSHAKE_DONE)
5594 && SSL_in_init((SSL *)s) != 0) {
5595 info_cb_failed = 1;
5596 return;
5597 }
5598 }
5599
5600 /*
5601 * Test the info callback gets called when we expect it to.
5602 *
5603 * Test 0: TLSv1.2, server
5604 * Test 1: TLSv1.2, client
5605 * Test 2: TLSv1.3, server
5606 * Test 3: TLSv1.3, client
5607 * Test 4: TLSv1.3, server, early_data
5608 * Test 5: TLSv1.3, client, early_data
5609 */
5610 static int test_info_callback(int tst)
5611 {
5612 SSL_CTX *cctx = NULL, *sctx = NULL;
5613 SSL *clientssl = NULL, *serverssl = NULL;
5614 SSL_SESSION *clntsess = NULL;
5615 int testresult = 0;
5616 int tlsvers;
5617
5618 if (tst < 2) {
5619 /* We need either ECDHE or DHE for the TLSv1.2 test to work */
5620 #if !defined(OPENSSL_NO_TLS1_2) && (!defined(OPENSSL_NO_EC) \
5621 || !defined(OPENSSL_NO_DH))
5622 tlsvers = TLS1_2_VERSION;
5623 #else
5624 return 1;
5625 #endif
5626 } else {
5627 #ifndef OPENSSL_NO_TLS1_3
5628 tlsvers = TLS1_3_VERSION;
5629 #else
5630 return 1;
5631 #endif
5632 }
5633
5634 /* Reset globals */
5635 info_cb_failed = 0;
5636 info_cb_this_state = -1;
5637 info_cb_offset = tst;
5638
5639 #ifndef OPENSSL_NO_TLS1_3
5640 if (tst >= 4) {
5641 SSL_SESSION *sess = NULL;
5642 size_t written, readbytes;
5643 unsigned char buf[80];
5644
5645 /* early_data tests */
5646 if (!TEST_true(setupearly_data_test(&cctx, &sctx, &clientssl,
5647 &serverssl, &sess, 0)))
5648 goto end;
5649
5650 /* We don't actually need this reference */
5651 SSL_SESSION_free(sess);
5652
5653 SSL_set_info_callback((tst % 2) == 0 ? serverssl : clientssl,
5654 sslapi_info_callback);
5655
5656 /* Write and read some early data and then complete the connection */
5657 if (!TEST_true(SSL_write_early_data(clientssl, MSG1, strlen(MSG1),
5658 &written))
5659 || !TEST_size_t_eq(written, strlen(MSG1))
5660 || !TEST_int_eq(SSL_read_early_data(serverssl, buf,
5661 sizeof(buf), &readbytes),
5662 SSL_READ_EARLY_DATA_SUCCESS)
5663 || !TEST_mem_eq(MSG1, readbytes, buf, strlen(MSG1))
5664 || !TEST_int_eq(SSL_get_early_data_status(serverssl),
5665 SSL_EARLY_DATA_ACCEPTED)
5666 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5667 SSL_ERROR_NONE))
5668 || !TEST_false(info_cb_failed))
5669 goto end;
5670
5671 testresult = 1;
5672 goto end;
5673 }
5674 #endif
5675
5676 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
5677 TLS_client_method(),
5678 tlsvers, tlsvers, &sctx, &cctx, cert,
5679 privkey)))
5680 goto end;
5681
5682 /*
5683 * For even numbered tests we check the server callbacks. For odd numbers we
5684 * check the client.
5685 */
5686 SSL_CTX_set_info_callback((tst % 2) == 0 ? sctx : cctx,
5687 sslapi_info_callback);
5688
5689 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl,
5690 &clientssl, NULL, NULL))
5691 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5692 SSL_ERROR_NONE))
5693 || !TEST_false(info_cb_failed))
5694 goto end;
5695
5696
5697
5698 clntsess = SSL_get1_session(clientssl);
5699 SSL_shutdown(clientssl);
5700 SSL_shutdown(serverssl);
5701 SSL_free(serverssl);
5702 SSL_free(clientssl);
5703 serverssl = clientssl = NULL;
5704
5705 /* Now do a resumption */
5706 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
5707 NULL))
5708 || !TEST_true(SSL_set_session(clientssl, clntsess))
5709 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5710 SSL_ERROR_NONE))
5711 || !TEST_true(SSL_session_reused(clientssl))
5712 || !TEST_false(info_cb_failed))
5713 goto end;
5714
5715 testresult = 1;
5716
5717 end:
5718 SSL_free(serverssl);
5719 SSL_free(clientssl);
5720 SSL_SESSION_free(clntsess);
5721 SSL_CTX_free(sctx);
5722 SSL_CTX_free(cctx);
5723 return testresult;
5724 }
5725
5726 static int test_ssl_pending(int tst)
5727 {
5728 SSL_CTX *cctx = NULL, *sctx = NULL;
5729 SSL *clientssl = NULL, *serverssl = NULL;
5730 int testresult = 0;
5731 char msg[] = "A test message";
5732 char buf[5];
5733 size_t written, readbytes;
5734
5735 if (tst == 0) {
5736 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
5737 TLS_client_method(),
5738 TLS1_VERSION, 0,
5739 &sctx, &cctx, cert, privkey)))
5740 goto end;
5741 } else {
5742 #ifndef OPENSSL_NO_DTLS
5743 if (!TEST_true(create_ssl_ctx_pair(DTLS_server_method(),
5744 DTLS_client_method(),
5745 DTLS1_VERSION, 0,
5746 &sctx, &cctx, cert, privkey)))
5747 goto end;
5748 #else
5749 return 1;
5750 #endif
5751 }
5752
5753 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5754 NULL, NULL))
5755 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5756 SSL_ERROR_NONE)))
5757 goto end;
5758
5759 if (!TEST_int_eq(SSL_pending(clientssl), 0)
5760 || !TEST_false(SSL_has_pending(clientssl))
5761 || !TEST_int_eq(SSL_pending(serverssl), 0)
5762 || !TEST_false(SSL_has_pending(serverssl))
5763 || !TEST_true(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
5764 || !TEST_size_t_eq(written, sizeof(msg))
5765 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
5766 || !TEST_size_t_eq(readbytes, sizeof(buf))
5767 || !TEST_int_eq(SSL_pending(clientssl), (int)(written - readbytes))
5768 || !TEST_true(SSL_has_pending(clientssl)))
5769 goto end;
5770
5771 testresult = 1;
5772
5773 end:
5774 SSL_free(serverssl);
5775 SSL_free(clientssl);
5776 SSL_CTX_free(sctx);
5777 SSL_CTX_free(cctx);
5778
5779 return testresult;
5780 }
5781
5782 static struct {
5783 unsigned int maxprot;
5784 const char *clntciphers;
5785 const char *clnttls13ciphers;
5786 const char *srvrciphers;
5787 const char *srvrtls13ciphers;
5788 const char *shared;
5789 } shared_ciphers_data[] = {
5790 /*
5791 * We can't establish a connection (even in TLSv1.1) with these ciphersuites if
5792 * TLSv1.3 is enabled but TLSv1.2 is disabled.
5793 */
5794 #if defined(OPENSSL_NO_TLS1_3) || !defined(OPENSSL_NO_TLS1_2)
5795 {
5796 TLS1_2_VERSION,
5797 "AES128-SHA:AES256-SHA",
5798 NULL,
5799 "AES256-SHA:DHE-RSA-AES128-SHA",
5800 NULL,
5801 "AES256-SHA"
5802 },
5803 {
5804 TLS1_2_VERSION,
5805 "AES128-SHA:DHE-RSA-AES128-SHA:AES256-SHA",
5806 NULL,
5807 "AES128-SHA:DHE-RSA-AES256-SHA:AES256-SHA",
5808 NULL,
5809 "AES128-SHA:AES256-SHA"
5810 },
5811 {
5812 TLS1_2_VERSION,
5813 "AES128-SHA:AES256-SHA",
5814 NULL,
5815 "AES128-SHA:DHE-RSA-AES128-SHA",
5816 NULL,
5817 "AES128-SHA"
5818 },
5819 #endif
5820 /*
5821 * This test combines TLSv1.3 and TLSv1.2 ciphersuites so they must both be
5822 * enabled.
5823 */
5824 #if !defined(OPENSSL_NO_TLS1_3) && !defined(OPENSSL_NO_TLS1_2) \
5825 && !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
5826 {
5827 TLS1_3_VERSION,
5828 "AES128-SHA:AES256-SHA",
5829 NULL,
5830 "AES256-SHA:AES128-SHA256",
5831 NULL,
5832 "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:"
5833 "TLS_AES_128_GCM_SHA256:AES256-SHA"
5834 },
5835 #endif
5836 #ifndef OPENSSL_NO_TLS1_3
5837 {
5838 TLS1_3_VERSION,
5839 "AES128-SHA",
5840 "TLS_AES_256_GCM_SHA384",
5841 "AES256-SHA",
5842 "TLS_AES_256_GCM_SHA384",
5843 "TLS_AES_256_GCM_SHA384"
5844 },
5845 #endif
5846 };
5847
5848 static int test_ssl_get_shared_ciphers(int tst)
5849 {
5850 SSL_CTX *cctx = NULL, *sctx = NULL;
5851 SSL *clientssl = NULL, *serverssl = NULL;
5852 int testresult = 0;
5853 char buf[1024];
5854
5855 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
5856 TLS_client_method(),
5857 TLS1_VERSION,
5858 shared_ciphers_data[tst].maxprot,
5859 &sctx, &cctx, cert, privkey)))
5860 goto end;
5861
5862 if (!TEST_true(SSL_CTX_set_cipher_list(cctx,
5863 shared_ciphers_data[tst].clntciphers))
5864 || (shared_ciphers_data[tst].clnttls13ciphers != NULL
5865 && !TEST_true(SSL_CTX_set_ciphersuites(cctx,
5866 shared_ciphers_data[tst].clnttls13ciphers)))
5867 || !TEST_true(SSL_CTX_set_cipher_list(sctx,
5868 shared_ciphers_data[tst].srvrciphers))
5869 || (shared_ciphers_data[tst].srvrtls13ciphers != NULL
5870 && !TEST_true(SSL_CTX_set_ciphersuites(sctx,
5871 shared_ciphers_data[tst].srvrtls13ciphers))))
5872 goto end;
5873
5874
5875 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
5876 NULL, NULL))
5877 || !TEST_true(create_ssl_connection(serverssl, clientssl,
5878 SSL_ERROR_NONE)))
5879 goto end;
5880
5881 if (!TEST_ptr(SSL_get_shared_ciphers(serverssl, buf, sizeof(buf)))
5882 || !TEST_int_eq(strcmp(buf, shared_ciphers_data[tst].shared), 0)) {
5883 TEST_info("Shared ciphers are: %s\n", buf);
5884 goto end;
5885 }
5886
5887 testresult = 1;
5888
5889 end:
5890 SSL_free(serverssl);
5891 SSL_free(clientssl);
5892 SSL_CTX_free(sctx);
5893 SSL_CTX_free(cctx);
5894
5895 return testresult;
5896 }
5897
5898 static const char *appdata = "Hello World";
5899 static int gen_tick_called, dec_tick_called, tick_key_cb_called;
5900 static int tick_key_renew = 0;
5901 static SSL_TICKET_RETURN tick_dec_ret = SSL_TICKET_RETURN_ABORT;
5902
5903 static int gen_tick_cb(SSL *s, void *arg)
5904 {
5905 gen_tick_called = 1;
5906
5907 return SSL_SESSION_set1_ticket_appdata(SSL_get_session(s), appdata,
5908 strlen(appdata));
5909 }
5910
5911 static SSL_TICKET_RETURN dec_tick_cb(SSL *s, SSL_SESSION *ss,
5912 const unsigned char *keyname,
5913 size_t keyname_length,
5914 SSL_TICKET_STATUS status,
5915 void *arg)
5916 {
5917 void *tickdata;
5918 size_t tickdlen;
5919
5920 dec_tick_called = 1;
5921
5922 if (status == SSL_TICKET_EMPTY)
5923 return SSL_TICKET_RETURN_IGNORE_RENEW;
5924
5925 if (!TEST_true(status == SSL_TICKET_SUCCESS
5926 || status == SSL_TICKET_SUCCESS_RENEW))
5927 return SSL_TICKET_RETURN_ABORT;
5928
5929 if (!TEST_true(SSL_SESSION_get0_ticket_appdata(ss, &tickdata,
5930 &tickdlen))
5931 || !TEST_size_t_eq(tickdlen, strlen(appdata))
5932 || !TEST_int_eq(memcmp(tickdata, appdata, tickdlen), 0))
5933 return SSL_TICKET_RETURN_ABORT;
5934
5935 if (tick_key_cb_called) {
5936 /* Don't change what the ticket key callback wanted to do */
5937 switch (status) {
5938 case SSL_TICKET_NO_DECRYPT:
5939 return SSL_TICKET_RETURN_IGNORE_RENEW;
5940
5941 case SSL_TICKET_SUCCESS:
5942 return SSL_TICKET_RETURN_USE;
5943
5944 case SSL_TICKET_SUCCESS_RENEW:
5945 return SSL_TICKET_RETURN_USE_RENEW;
5946
5947 default:
5948 return SSL_TICKET_RETURN_ABORT;
5949 }
5950 }
5951 return tick_dec_ret;
5952
5953 }
5954
5955 static int tick_key_cb(SSL *s, unsigned char key_name[16],
5956 unsigned char iv[EVP_MAX_IV_LENGTH], EVP_CIPHER_CTX *ctx,
5957 HMAC_CTX *hctx, int enc)
5958 {
5959 const unsigned char tick_aes_key[16] = "0123456789abcdef";
5960 const unsigned char tick_hmac_key[16] = "0123456789abcdef";
5961
5962 tick_key_cb_called = 1;
5963 memset(iv, 0, AES_BLOCK_SIZE);
5964 memset(key_name, 0, 16);
5965 if (!EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, tick_aes_key, iv, enc)
5966 || !HMAC_Init_ex(hctx, tick_hmac_key, sizeof(tick_hmac_key),
5967 EVP_sha256(), NULL))
5968 return -1;
5969
5970 return tick_key_renew ? 2 : 1;
5971 }
5972
5973 /*
5974 * Test the various ticket callbacks
5975 * Test 0: TLSv1.2, no ticket key callback, no ticket, no renewal
5976 * Test 1: TLSv1.3, no ticket key callback, no ticket, no renewal
5977 * Test 2: TLSv1.2, no ticket key callback, no ticket, renewal
5978 * Test 3: TLSv1.3, no ticket key callback, no ticket, renewal
5979 * Test 4: TLSv1.2, no ticket key callback, ticket, no renewal
5980 * Test 5: TLSv1.3, no ticket key callback, ticket, no renewal
5981 * Test 6: TLSv1.2, no ticket key callback, ticket, renewal
5982 * Test 7: TLSv1.3, no ticket key callback, ticket, renewal
5983 * Test 8: TLSv1.2, ticket key callback, ticket, no renewal
5984 * Test 9: TLSv1.3, ticket key callback, ticket, no renewal
5985 * Test 10: TLSv1.2, ticket key callback, ticket, renewal
5986 * Test 11: TLSv1.3, ticket key callback, ticket, renewal
5987 */
5988 static int test_ticket_callbacks(int tst)
5989 {
5990 SSL_CTX *cctx = NULL, *sctx = NULL;
5991 SSL *clientssl = NULL, *serverssl = NULL;
5992 SSL_SESSION *clntsess = NULL;
5993 int testresult = 0;
5994
5995 #ifdef OPENSSL_NO_TLS1_2
5996 if (tst % 2 == 0)
5997 return 1;
5998 #endif
5999 #ifdef OPENSSL_NO_TLS1_3
6000 if (tst % 2 == 1)
6001 return 1;
6002 #endif
6003
6004 gen_tick_called = dec_tick_called = tick_key_cb_called = 0;
6005
6006 /* Which tests the ticket key callback should request renewal for */
6007 if (tst == 10 || tst == 11)
6008 tick_key_renew = 1;
6009 else
6010 tick_key_renew = 0;
6011
6012 /* Which tests the decrypt ticket callback should request renewal for */
6013 switch (tst) {
6014 case 0:
6015 case 1:
6016 tick_dec_ret = SSL_TICKET_RETURN_IGNORE;
6017 break;
6018
6019 case 2:
6020 case 3:
6021 tick_dec_ret = SSL_TICKET_RETURN_IGNORE_RENEW;
6022 break;
6023
6024 case 4:
6025 case 5:
6026 tick_dec_ret = SSL_TICKET_RETURN_USE;
6027 break;
6028
6029 case 6:
6030 case 7:
6031 tick_dec_ret = SSL_TICKET_RETURN_USE_RENEW;
6032 break;
6033
6034 default:
6035 tick_dec_ret = SSL_TICKET_RETURN_ABORT;
6036 }
6037
6038 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
6039 TLS_client_method(),
6040 TLS1_VERSION,
6041 ((tst % 2) == 0) ? TLS1_2_VERSION
6042 : TLS1_3_VERSION,
6043 &sctx, &cctx, cert, privkey)))
6044 goto end;
6045
6046 /*
6047 * We only want sessions to resume from tickets - not the session cache. So
6048 * switch the cache off.
6049 */
6050 if (!TEST_true(SSL_CTX_set_session_cache_mode(sctx, SSL_SESS_CACHE_OFF)))
6051 goto end;
6052
6053 if (!TEST_true(SSL_CTX_set_session_ticket_cb(sctx, gen_tick_cb, dec_tick_cb,
6054 NULL)))
6055 goto end;
6056
6057 if (tst >= 8
6058 && !TEST_true(SSL_CTX_set_tlsext_ticket_key_cb(sctx, tick_key_cb)))
6059 goto end;
6060
6061 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6062 NULL, NULL))
6063 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6064 SSL_ERROR_NONE)))
6065 goto end;
6066
6067 /*
6068 * The decrypt ticket key callback in TLSv1.2 should be called even though
6069 * we have no ticket yet, because it gets called with a status of
6070 * SSL_TICKET_EMPTY (the client indicates support for tickets but does not
6071 * actually send any ticket data). This does not happen in TLSv1.3 because
6072 * it is not valid to send empty ticket data in TLSv1.3.
6073 */
6074 if (!TEST_int_eq(gen_tick_called, 1)
6075 || !TEST_int_eq(dec_tick_called, ((tst % 2) == 0) ? 1 : 0))
6076 goto end;
6077
6078 gen_tick_called = dec_tick_called = 0;
6079
6080 clntsess = SSL_get1_session(clientssl);
6081 SSL_shutdown(clientssl);
6082 SSL_shutdown(serverssl);
6083 SSL_free(serverssl);
6084 SSL_free(clientssl);
6085 serverssl = clientssl = NULL;
6086
6087 /* Now do a resumption */
6088 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, NULL,
6089 NULL))
6090 || !TEST_true(SSL_set_session(clientssl, clntsess))
6091 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6092 SSL_ERROR_NONE)))
6093 goto end;
6094
6095 if (tick_dec_ret == SSL_TICKET_RETURN_IGNORE
6096 || tick_dec_ret == SSL_TICKET_RETURN_IGNORE_RENEW) {
6097 if (!TEST_false(SSL_session_reused(clientssl)))
6098 goto end;
6099 } else {
6100 if (!TEST_true(SSL_session_reused(clientssl)))
6101 goto end;
6102 }
6103
6104 if (!TEST_int_eq(gen_tick_called,
6105 (tick_key_renew
6106 || tick_dec_ret == SSL_TICKET_RETURN_IGNORE_RENEW
6107 || tick_dec_ret == SSL_TICKET_RETURN_USE_RENEW)
6108 ? 1 : 0)
6109 || !TEST_int_eq(dec_tick_called, 1))
6110 goto end;
6111
6112 testresult = 1;
6113
6114 end:
6115 SSL_SESSION_free(clntsess);
6116 SSL_free(serverssl);
6117 SSL_free(clientssl);
6118 SSL_CTX_free(sctx);
6119 SSL_CTX_free(cctx);
6120
6121 return testresult;
6122 }
6123
6124 /*
6125 * Test bi-directional shutdown.
6126 * Test 0: TLSv1.2
6127 * Test 1: TLSv1.2, server continues to read/write after client shutdown
6128 * Test 2: TLSv1.3, no pending NewSessionTicket messages
6129 * Test 3: TLSv1.3, pending NewSessionTicket messages
6130 * Test 4: TLSv1.3, server continues to read/write after client shutdown, server
6131 * sends key update, client reads it
6132 * Test 5: TLSv1.3, server continues to read/write after client shutdown, server
6133 * sends CertificateRequest, client reads and ignores it
6134 * Test 6: TLSv1.3, server continues to read/write after client shutdown, client
6135 * doesn't read it
6136 */
6137 static int test_shutdown(int tst)
6138 {
6139 SSL_CTX *cctx = NULL, *sctx = NULL;
6140 SSL *clientssl = NULL, *serverssl = NULL;
6141 int testresult = 0;
6142 char msg[] = "A test message";
6143 char buf[80];
6144 size_t written, readbytes;
6145 SSL_SESSION *sess;
6146
6147 #ifdef OPENSSL_NO_TLS1_2
6148 if (tst <= 1)
6149 return 1;
6150 #endif
6151 #ifdef OPENSSL_NO_TLS1_3
6152 if (tst >= 2)
6153 return 1;
6154 #endif
6155
6156 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
6157 TLS_client_method(),
6158 TLS1_VERSION,
6159 (tst <= 1) ? TLS1_2_VERSION
6160 : TLS1_3_VERSION,
6161 &sctx, &cctx, cert, privkey)))
6162 goto end;
6163
6164 if (tst == 5)
6165 SSL_CTX_set_post_handshake_auth(cctx, 1);
6166
6167 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6168 NULL, NULL)))
6169 goto end;
6170
6171 if (tst == 3) {
6172 if (!TEST_true(create_bare_ssl_connection(serverssl, clientssl,
6173 SSL_ERROR_NONE, 1))
6174 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
6175 || !TEST_false(SSL_SESSION_is_resumable(sess)))
6176 goto end;
6177 } else if (!TEST_true(create_ssl_connection(serverssl, clientssl,
6178 SSL_ERROR_NONE))
6179 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
6180 || !TEST_true(SSL_SESSION_is_resumable(sess))) {
6181 goto end;
6182 }
6183
6184 if (!TEST_int_eq(SSL_shutdown(clientssl), 0))
6185 goto end;
6186
6187 if (tst >= 4) {
6188 /*
6189 * Reading on the server after the client has sent close_notify should
6190 * fail and provide SSL_ERROR_ZERO_RETURN
6191 */
6192 if (!TEST_false(SSL_read_ex(serverssl, buf, sizeof(buf), &readbytes))
6193 || !TEST_int_eq(SSL_get_error(serverssl, 0),
6194 SSL_ERROR_ZERO_RETURN)
6195 || !TEST_int_eq(SSL_get_shutdown(serverssl),
6196 SSL_RECEIVED_SHUTDOWN)
6197 /*
6198 * Even though we're shutdown on receive we should still be
6199 * able to write.
6200 */
6201 || !TEST_true(SSL_write(serverssl, msg, sizeof(msg))))
6202 goto end;
6203 if (tst == 4
6204 && !TEST_true(SSL_key_update(serverssl,
6205 SSL_KEY_UPDATE_REQUESTED)))
6206 goto end;
6207 if (tst == 5) {
6208 SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
6209 if (!TEST_true(SSL_verify_client_post_handshake(serverssl)))
6210 goto end;
6211 }
6212 if ((tst == 4 || tst == 5)
6213 && !TEST_true(SSL_write(serverssl, msg, sizeof(msg))))
6214 goto end;
6215 if (!TEST_int_eq(SSL_shutdown(serverssl), 1))
6216 goto end;
6217 if (tst == 4 || tst == 5) {
6218 /* Should still be able to read data from server */
6219 if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf),
6220 &readbytes))
6221 || !TEST_size_t_eq(readbytes, sizeof(msg))
6222 || !TEST_int_eq(memcmp(msg, buf, readbytes), 0)
6223 || !TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf),
6224 &readbytes))
6225 || !TEST_size_t_eq(readbytes, sizeof(msg))
6226 || !TEST_int_eq(memcmp(msg, buf, readbytes), 0))
6227 goto end;
6228 }
6229 }
6230
6231 /* Writing on the client after sending close_notify shouldn't be possible */
6232 if (!TEST_false(SSL_write_ex(clientssl, msg, sizeof(msg), &written)))
6233 goto end;
6234
6235 if (tst < 4) {
6236 /*
6237 * For these tests the client has sent close_notify but it has not yet
6238 * been received by the server. The server has not sent close_notify
6239 * yet.
6240 */
6241 if (!TEST_int_eq(SSL_shutdown(serverssl), 0)
6242 /*
6243 * Writing on the server after sending close_notify shouldn't
6244 * be possible.
6245 */
6246 || !TEST_false(SSL_write_ex(serverssl, msg, sizeof(msg), &written))
6247 || !TEST_int_eq(SSL_shutdown(clientssl), 1)
6248 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
6249 || !TEST_true(SSL_SESSION_is_resumable(sess))
6250 || !TEST_int_eq(SSL_shutdown(serverssl), 1))
6251 goto end;
6252 } else if (tst == 4 || tst == 5) {
6253 /*
6254 * In this test the client has sent close_notify and it has been
6255 * received by the server which has responded with a close_notify. The
6256 * client needs to read the close_notify sent by the server.
6257 */
6258 if (!TEST_int_eq(SSL_shutdown(clientssl), 1)
6259 || !TEST_ptr_ne(sess = SSL_get_session(clientssl), NULL)
6260 || !TEST_true(SSL_SESSION_is_resumable(sess)))
6261 goto end;
6262 } else {
6263 /*
6264 * tst == 6
6265 *
6266 * The client has sent close_notify and is expecting a close_notify
6267 * back, but instead there is application data first. The shutdown
6268 * should fail with a fatal error.
6269 */
6270 if (!TEST_int_eq(SSL_shutdown(clientssl), -1)
6271 || !TEST_int_eq(SSL_get_error(clientssl, -1), SSL_ERROR_SSL))
6272 goto end;
6273 }
6274
6275 testresult = 1;
6276
6277 end:
6278 SSL_free(serverssl);
6279 SSL_free(clientssl);
6280 SSL_CTX_free(sctx);
6281 SSL_CTX_free(cctx);
6282
6283 return testresult;
6284 }
6285
6286 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OPENSSL_NO_TLS1_3)
6287 static int cert_cb_cnt;
6288
6289 static int cert_cb(SSL *s, void *arg)
6290 {
6291 SSL_CTX *ctx = (SSL_CTX *)arg;
6292 BIO *in = NULL;
6293 EVP_PKEY *pkey = NULL;
6294 X509 *x509 = NULL;
6295
6296 if (cert_cb_cnt == 0) {
6297 /* Suspend the handshake */
6298 cert_cb_cnt++;
6299 return -1;
6300 } else if (cert_cb_cnt == 1) {
6301 /*
6302 * Update the SSL_CTX, set the certificate and private key and then
6303 * continue the handshake normally.
6304 */
6305 if (ctx != NULL && !TEST_ptr(SSL_set_SSL_CTX(s, ctx)))
6306 return 0;
6307
6308 if (!TEST_true(SSL_use_certificate_file(s, cert, SSL_FILETYPE_PEM))
6309 || !TEST_true(SSL_use_PrivateKey_file(s, privkey,
6310 SSL_FILETYPE_PEM))
6311 || !TEST_true(SSL_check_private_key(s)))
6312 return 0;
6313 cert_cb_cnt++;
6314 return 1;
6315 } else if (cert_cb_cnt == 3) {
6316 int rv;
6317 if (!TEST_ptr(in = BIO_new(BIO_s_file()))
6318 || !TEST_int_ge(BIO_read_filename(in, cert), 0)
6319 || !TEST_ptr(x509 = PEM_read_bio_X509(in, NULL, NULL, NULL)))
6320 goto out;
6321 BIO_free(in);
6322 if (!TEST_ptr(in = BIO_new(BIO_s_file()))
6323 || !TEST_int_ge(BIO_read_filename(in, privkey), 0)
6324 || !TEST_ptr(pkey = PEM_read_bio_PrivateKey(in, NULL, NULL, NULL)))
6325 goto out;
6326 rv = SSL_check_chain(s, x509, pkey, NULL);
6327 /*
6328 * If the cert doesn't show as valid here (e.g., because we don't
6329 * have any shared sigalgs), then we will not set it, and there will
6330 * be no certificate at all on the SSL or SSL_CTX. This, in turn,
6331 * will cause tls_choose_sigalgs() to fail the connection.
6332 */
6333 if ((rv & CERT_PKEY_VALID)) {
6334 if (!SSL_use_cert_and_key(s, x509, pkey, NULL, 1))
6335 goto out;
6336 }
6337 BIO_free(in);
6338 EVP_PKEY_free(pkey);
6339 X509_free(x509);
6340 return 1;
6341 }
6342
6343 /* Abort the handshake */
6344 out:
6345 BIO_free(in);
6346 EVP_PKEY_free(pkey);
6347 X509_free(x509);
6348 return 0;
6349 }
6350
6351 /*
6352 * Test the certificate callback.
6353 * Test 0: Callback fails
6354 * Test 1: Success - no SSL_set_SSL_CTX() in the callback
6355 * Test 2: Success - SSL_set_SSL_CTX() in the callback
6356 */
6357 static int test_cert_cb_int(int prot, int tst)
6358 {
6359 SSL_CTX *cctx = NULL, *sctx = NULL, *snictx = NULL;
6360 SSL *clientssl = NULL, *serverssl = NULL;
6361 int testresult = 0, ret;
6362
6363 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
6364 TLS_client_method(),
6365 TLS1_VERSION,
6366 prot,
6367 &sctx, &cctx, NULL, NULL)))
6368 goto end;
6369
6370 if (tst == 0)
6371 cert_cb_cnt = -1;
6372 else if (tst == 3)
6373 cert_cb_cnt = 3;
6374 else
6375 cert_cb_cnt = 0;
6376 if (tst == 2)
6377 snictx = SSL_CTX_new(TLS_server_method());
6378 SSL_CTX_set_cert_cb(sctx, cert_cb, snictx);
6379
6380 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6381 NULL, NULL)))
6382 goto end;
6383
6384 ret = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
6385 if (!TEST_true(tst == 0 ? !ret : ret)
6386 || (tst > 0
6387 && !TEST_int_eq((cert_cb_cnt - 2) * (cert_cb_cnt - 3), 0))) {
6388 goto end;
6389 }
6390
6391 testresult = 1;
6392
6393 end:
6394 SSL_free(serverssl);
6395 SSL_free(clientssl);
6396 SSL_CTX_free(sctx);
6397 SSL_CTX_free(cctx);
6398 SSL_CTX_free(snictx);
6399
6400 return testresult;
6401 }
6402 #endif
6403
6404 static int test_cert_cb(int tst)
6405 {
6406 int testresult = 1;
6407
6408 #ifndef OPENSSL_NO_TLS1_2
6409 testresult &= test_cert_cb_int(TLS1_2_VERSION, tst);
6410 #endif
6411 #ifndef OPENSSL_NO_TLS1_3
6412 testresult &= test_cert_cb_int(TLS1_3_VERSION, tst);
6413 #endif
6414
6415 return testresult;
6416 }
6417
6418 static int client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
6419 {
6420 X509 *xcert, *peer;
6421 EVP_PKEY *privpkey;
6422 BIO *in = NULL;
6423
6424 /* Check that SSL_get_peer_certificate() returns something sensible */
6425 peer = SSL_get_peer_certificate(ssl);
6426 if (!TEST_ptr(peer))
6427 return 0;
6428 X509_free(peer);
6429
6430 in = BIO_new_file(cert, "r");
6431 if (!TEST_ptr(in))
6432 return 0;
6433
6434 xcert = PEM_read_bio_X509(in, NULL, NULL, NULL);
6435 BIO_free(in);
6436 if (!TEST_ptr(xcert))
6437 return 0;
6438
6439 in = BIO_new_file(privkey, "r");
6440 if (!TEST_ptr(in)) {
6441 X509_free(xcert);
6442 return 0;
6443 }
6444
6445 privpkey = PEM_read_bio_PrivateKey(in, NULL, NULL, NULL);
6446 BIO_free(in);
6447 if (!TEST_ptr(privpkey)) {
6448 X509_free(xcert);
6449 return 0;
6450 }
6451
6452 *x509 = xcert;
6453 *pkey = privpkey;
6454
6455 return 1;
6456 }
6457
6458 static int verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx)
6459 {
6460 return 1;
6461 }
6462
6463 static int test_client_cert_cb(int tst)
6464 {
6465 SSL_CTX *cctx = NULL, *sctx = NULL;
6466 SSL *clientssl = NULL, *serverssl = NULL;
6467 int testresult = 0;
6468
6469 #ifdef OPENSSL_NO_TLS1_2
6470 if (tst == 0)
6471 return 1;
6472 #endif
6473 #ifdef OPENSSL_NO_TLS1_3
6474 if (tst == 1)
6475 return 1;
6476 #endif
6477
6478 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
6479 TLS_client_method(),
6480 TLS1_VERSION,
6481 tst == 0 ? TLS1_2_VERSION
6482 : TLS1_3_VERSION,
6483 &sctx, &cctx, cert, privkey)))
6484 goto end;
6485
6486 /*
6487 * Test that setting a client_cert_cb results in a client certificate being
6488 * sent.
6489 */
6490 SSL_CTX_set_client_cert_cb(cctx, client_cert_cb);
6491 SSL_CTX_set_verify(sctx,
6492 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
6493 verify_cb);
6494
6495 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6496 NULL, NULL))
6497 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6498 SSL_ERROR_NONE)))
6499 goto end;
6500
6501 testresult = 1;
6502
6503 end:
6504 SSL_free(serverssl);
6505 SSL_free(clientssl);
6506 SSL_CTX_free(sctx);
6507 SSL_CTX_free(cctx);
6508
6509 return testresult;
6510 }
6511
6512 #if !defined(OPENSSL_NO_TLS1_2) || !defined(OPENSSL_NO_TLS1_3)
6513 /*
6514 * Test setting certificate authorities on both client and server.
6515 *
6516 * Test 0: SSL_CTX_set0_CA_list() only
6517 * Test 1: Both SSL_CTX_set0_CA_list() and SSL_CTX_set_client_CA_list()
6518 * Test 2: Only SSL_CTX_set_client_CA_list()
6519 */
6520 static int test_ca_names_int(int prot, int tst)
6521 {
6522 SSL_CTX *cctx = NULL, *sctx = NULL;
6523 SSL *clientssl = NULL, *serverssl = NULL;
6524 int testresult = 0;
6525 size_t i;
6526 X509_NAME *name[] = { NULL, NULL, NULL, NULL };
6527 char *strnames[] = { "Jack", "Jill", "John", "Joanne" };
6528 STACK_OF(X509_NAME) *sk1 = NULL, *sk2 = NULL;
6529 const STACK_OF(X509_NAME) *sktmp = NULL;
6530
6531 for (i = 0; i < OSSL_NELEM(name); i++) {
6532 name[i] = X509_NAME_new();
6533 if (!TEST_ptr(name[i])
6534 || !TEST_true(X509_NAME_add_entry_by_txt(name[i], "CN",
6535 MBSTRING_ASC,
6536 (unsigned char *)
6537 strnames[i],
6538 -1, -1, 0)))
6539 goto end;
6540 }
6541
6542 if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
6543 TLS_client_method(),
6544 TLS1_VERSION,
6545 prot,
6546 &sctx, &cctx, cert, privkey)))
6547 goto end;
6548
6549 SSL_CTX_set_verify(sctx, SSL_VERIFY_PEER, NULL);
6550
6551 if (tst == 0 || tst == 1) {
6552 if (!TEST_ptr(sk1 = sk_X509_NAME_new_null())
6553 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[0])))
6554 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[1])))
6555 || !TEST_ptr(sk2 = sk_X509_NAME_new_null())
6556 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[0])))
6557 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[1]))))
6558 goto end;
6559
6560 SSL_CTX_set0_CA_list(sctx, sk1);
6561 SSL_CTX_set0_CA_list(cctx, sk2);
6562 sk1 = sk2 = NULL;
6563 }
6564 if (tst == 1 || tst == 2) {
6565 if (!TEST_ptr(sk1 = sk_X509_NAME_new_null())
6566 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[2])))
6567 || !TEST_true(sk_X509_NAME_push(sk1, X509_NAME_dup(name[3])))
6568 || !TEST_ptr(sk2 = sk_X509_NAME_new_null())
6569 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[2])))
6570 || !TEST_true(sk_X509_NAME_push(sk2, X509_NAME_dup(name[3]))))
6571 goto end;
6572
6573 SSL_CTX_set_client_CA_list(sctx, sk1);
6574 SSL_CTX_set_client_CA_list(cctx, sk2);
6575 sk1 = sk2 = NULL;
6576 }
6577
6578 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
6579 NULL, NULL))
6580 || !TEST_true(create_ssl_connection(serverssl, clientssl,
6581 SSL_ERROR_NONE)))
6582 goto end;
6583
6584 /*
6585 * We only expect certificate authorities to have been sent to the server
6586 * if we are using TLSv1.3 and SSL_set0_CA_list() was used
6587 */
6588 sktmp = SSL_get0_peer_CA_list(serverssl);
6589 if (prot == TLS1_3_VERSION
6590 && (tst == 0 || tst == 1)) {
6591 if (!TEST_ptr(sktmp)
6592 || !TEST_int_eq(sk_X509_NAME_num(sktmp), 2)
6593 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 0),
6594 name[0]), 0)
6595 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 1),
6596 name[1]), 0))
6597 goto end;
6598 } else if (!TEST_ptr_null(sktmp)) {
6599 goto end;
6600 }
6601
6602 /*
6603 * In all tests we expect certificate authorities to have been sent to the
6604 * client. However, SSL_set_client_CA_list() should override
6605 * SSL_set0_CA_list()
6606 */
6607 sktmp = SSL_get0_peer_CA_list(clientssl);
6608 if (!TEST_ptr(sktmp)
6609 || !TEST_int_eq(sk_X509_NAME_num(sktmp), 2)
6610 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 0),
6611 name[tst == 0 ? 0 : 2]), 0)
6612 || !TEST_int_eq(X509_NAME_cmp(sk_X509_NAME_value(sktmp, 1),
6613 name[tst == 0 ? 1 : 3]), 0))
6614 goto end;
6615
6616 testresult = 1;
6617
6618 end:
6619 SSL_free(serverssl);
6620 SSL_free(clientssl);
6621 SSL_CTX_free(sctx);
6622 SSL_CTX_free(cctx);
6623 for (i = 0; i < OSSL_NELEM(name); i++)
6624 X509_NAME_free(name[i]);
6625 sk_X509_NAME_pop_free(sk1, X509_NAME_free);
6626 sk_X509_NAME_pop_free(sk2, X509_NAME_free);
6627
6628 return testresult;
6629 }
6630 #endif
6631
6632 static int test_ca_names(int tst)
6633 {
6634 int testresult = 1;
6635
6636 #ifndef OPENSSL_NO_TLS1_2
6637 testresult &= test_ca_names_int(TLS1_2_VERSION, tst);
6638 #endif
6639 #ifndef OPENSSL_NO_TLS1_3
6640 testresult &= test_ca_names_int(TLS1_3_VERSION, tst);
6641 #endif
6642
6643 return testresult;
6644 }
6645
6646
6647 OPT_TEST_DECLARE_USAGE("certfile privkeyfile srpvfile tmpfile\n")
6648
6649 int setup_tests(void)
6650 {
6651 if (!TEST_ptr(cert = test_get_argument(0))
6652 || !TEST_ptr(privkey = test_get_argument(1))
6653 || !TEST_ptr(srpvfile = test_get_argument(2))
6654 || !TEST_ptr(tmpfilename = test_get_argument(3)))
6655 return 0;
6656
6657 if (getenv("OPENSSL_TEST_GETCOUNTS") != NULL) {
6658 #ifdef OPENSSL_NO_CRYPTO_MDEBUG
6659 TEST_error("not supported in this build");
6660 return 0;
6661 #else
6662 int i, mcount, rcount, fcount;
6663
6664 for (i = 0; i < 4; i++)
6665 test_export_key_mat(i);
6666 CRYPTO_get_alloc_counts(&mcount, &rcount, &fcount);
6667 test_printf_stdout("malloc %d realloc %d free %d\n",
6668 mcount, rcount, fcount);
6669 return 1;
6670 #endif
6671 }
6672
6673 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_KTLS) \
6674 && !defined(OPENSSL_NO_SOCK)
6675 ADD_TEST(test_ktls_no_txrx_client_no_txrx_server);
6676 ADD_TEST(test_ktls_no_rx_client_no_txrx_server);
6677 ADD_TEST(test_ktls_no_tx_client_no_txrx_server);
6678 ADD_TEST(test_ktls_client_no_txrx_server);
6679 ADD_TEST(test_ktls_no_txrx_client_no_rx_server);
6680 ADD_TEST(test_ktls_no_rx_client_no_rx_server);
6681 ADD_TEST(test_ktls_no_tx_client_no_rx_server);
6682 ADD_TEST(test_ktls_client_no_rx_server);
6683 ADD_TEST(test_ktls_no_txrx_client_no_tx_server);
6684 ADD_TEST(test_ktls_no_rx_client_no_tx_server);
6685 ADD_TEST(test_ktls_no_tx_client_no_tx_server);
6686 ADD_TEST(test_ktls_client_no_tx_server);
6687 ADD_TEST(test_ktls_no_txrx_client_server);
6688 ADD_TEST(test_ktls_no_rx_client_server);
6689 ADD_TEST(test_ktls_no_tx_client_server);
6690 ADD_TEST(test_ktls_client_server);
6691 ADD_TEST(test_ktls_sendfile);
6692 #endif
6693 ADD_TEST(test_large_message_tls);
6694 ADD_TEST(test_large_message_tls_read_ahead);
6695 #ifndef OPENSSL_NO_DTLS
6696 ADD_TEST(test_large_message_dtls);
6697 #endif
6698 #ifndef OPENSSL_NO_OCSP
6699 ADD_TEST(test_tlsext_status_type);
6700 #endif
6701 ADD_TEST(test_session_with_only_int_cache);
6702 ADD_TEST(test_session_with_only_ext_cache);
6703 ADD_TEST(test_session_with_both_cache);
6704 #ifndef OPENSSL_NO_TLS1_3
6705 ADD_ALL_TESTS(test_stateful_tickets, 3);
6706 ADD_ALL_TESTS(test_stateless_tickets, 3);
6707 ADD_TEST(test_psk_tickets);
6708 #endif
6709 ADD_ALL_TESTS(test_ssl_set_bio, TOTAL_SSL_SET_BIO_TESTS);
6710 ADD_TEST(test_ssl_bio_pop_next_bio);
6711 ADD_TEST(test_ssl_bio_pop_ssl_bio);
6712 ADD_TEST(test_ssl_bio_change_rbio);
6713 ADD_TEST(test_ssl_bio_change_wbio);
6714 #if !defined(OPENSSL_NO_TLS1_2) || defined(OPENSSL_NO_TLS1_3)
6715 ADD_ALL_TESTS(test_set_sigalgs, OSSL_NELEM(testsigalgs) * 2);
6716 ADD_TEST(test_keylog);
6717 #endif
6718 #ifndef OPENSSL_NO_TLS1_3
6719 ADD_TEST(test_keylog_no_master_key);
6720 #endif
6721 #ifndef OPENSSL_NO_TLS1_2
6722 ADD_TEST(test_client_hello_cb);
6723 ADD_TEST(test_no_ems);
6724 #endif
6725 #ifndef OPENSSL_NO_TLS1_3
6726 ADD_ALL_TESTS(test_early_data_read_write, 3);
6727 /*
6728 * We don't do replay tests for external PSK. Replay protection isn't used
6729 * in that scenario.
6730 */
6731 ADD_ALL_TESTS(test_early_data_replay, 2);
6732 ADD_ALL_TESTS(test_early_data_skip, 3);
6733 ADD_ALL_TESTS(test_early_data_skip_hrr, 3);
6734 ADD_ALL_TESTS(test_early_data_skip_hrr_fail, 3);
6735 ADD_ALL_TESTS(test_early_data_skip_abort, 3);
6736 ADD_ALL_TESTS(test_early_data_not_sent, 3);
6737 ADD_ALL_TESTS(test_early_data_psk, 8);
6738 ADD_ALL_TESTS(test_early_data_not_expected, 3);
6739 # ifndef OPENSSL_NO_TLS1_2
6740 ADD_ALL_TESTS(test_early_data_tls1_2, 3);
6741 # endif
6742 #endif
6743 #ifndef OPENSSL_NO_TLS1_3
6744 ADD_ALL_TESTS(test_set_ciphersuite, 10);
6745 ADD_TEST(test_ciphersuite_change);
6746 #ifdef OPENSSL_NO_PSK
6747 ADD_ALL_TESTS(test_tls13_psk, 1);
6748 #else
6749 ADD_ALL_TESTS(test_tls13_psk, 4);
6750 #endif /* OPENSSL_NO_PSK */
6751 ADD_ALL_TESTS(test_key_exchange, 14);
6752 ADD_ALL_TESTS(test_custom_exts, 5);
6753 ADD_TEST(test_stateless);
6754 ADD_TEST(test_pha_key_update);
6755 #else
6756 ADD_ALL_TESTS(test_custom_exts, 3);
6757 #endif
6758 ADD_ALL_TESTS(test_serverinfo, 8);
6759 ADD_ALL_TESTS(test_export_key_mat, 6);
6760 #ifndef OPENSSL_NO_TLS1_3
6761 ADD_ALL_TESTS(test_export_key_mat_early, 3);
6762 ADD_TEST(test_key_update);
6763 ADD_ALL_TESTS(test_key_update_in_write, 2);
6764 #endif
6765 ADD_ALL_TESTS(test_ssl_clear, 2);
6766 ADD_ALL_TESTS(test_max_fragment_len_ext, OSSL_NELEM(max_fragment_len_test));
6767 #if !defined(OPENSSL_NO_SRP) && !defined(OPENSSL_NO_TLS1_2)
6768 ADD_ALL_TESTS(test_srp, 6);
6769 #endif
6770 ADD_ALL_TESTS(test_info_callback, 6);
6771 ADD_ALL_TESTS(test_ssl_pending, 2);
6772 ADD_ALL_TESTS(test_ssl_get_shared_ciphers, OSSL_NELEM(shared_ciphers_data));
6773 ADD_ALL_TESTS(test_ticket_callbacks, 12);
6774 ADD_ALL_TESTS(test_shutdown, 7);
6775 ADD_ALL_TESTS(test_cert_cb, 4);
6776 ADD_ALL_TESTS(test_client_cert_cb, 2);
6777 ADD_ALL_TESTS(test_ca_names, 3);
6778 return 1;
6779 }
6780
6781 void cleanup_tests(void)
6782 {
6783 bio_s_mempacket_test_free();
6784 bio_s_always_retry_free();
6785 }