lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. |
| 3 | * |
| 4 | * Licensed under the OpenSSL license (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 "ssltestlib.h" |
| 11 | #include "testutil.h" |
| 12 | #include "internal/nelem.h" |
| 13 | |
| 14 | static char *cert1 = NULL; |
| 15 | static char *privkey1 = NULL; |
| 16 | static char *cert2 = NULL; |
| 17 | static char *privkey2 = NULL; |
| 18 | |
| 19 | static struct { |
| 20 | char *cipher; |
| 21 | int expected_prot; |
| 22 | int certnum; |
| 23 | } ciphers[] = { |
| 24 | /* Server doesn't have a cert with appropriate sig algs - should fail */ |
| 25 | {"AES128-SHA", 0, 0}, |
| 26 | /* Server doesn't have a TLSv1.3 capable cert - should use TLSv1.2 */ |
| 27 | {"GOST2012-GOST8912-GOST8912", TLS1_2_VERSION, 0}, |
| 28 | /* Server doesn't have a TLSv1.3 capable cert - should use TLSv1.2 */ |
| 29 | {"GOST2012-GOST8912-GOST8912", TLS1_2_VERSION, 1}, |
| 30 | /* Server doesn't have a TLSv1.3 capable cert - should use TLSv1.2 */ |
| 31 | {"GOST2001-GOST89-GOST89", TLS1_2_VERSION, 0}, |
| 32 | }; |
| 33 | |
| 34 | /* Test that we never negotiate TLSv1.3 if using GOST */ |
| 35 | static int test_tls13(int idx) |
| 36 | { |
| 37 | SSL_CTX *cctx = NULL, *sctx = NULL; |
| 38 | SSL *clientssl = NULL, *serverssl = NULL; |
| 39 | int testresult = 0; |
| 40 | |
| 41 | if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(), |
| 42 | TLS_client_method(), |
| 43 | TLS1_VERSION, |
| 44 | TLS_MAX_VERSION, |
| 45 | &sctx, &cctx, |
| 46 | ciphers[idx].certnum == 0 ? cert1 |
| 47 | : cert2, |
| 48 | ciphers[idx].certnum == 0 ? privkey1 |
| 49 | : privkey2))) |
| 50 | goto end; |
| 51 | |
| 52 | if (!TEST_true(SSL_CTX_set_cipher_list(cctx, ciphers[idx].cipher)) |
| 53 | || !TEST_true(SSL_CTX_set_cipher_list(sctx, ciphers[idx].cipher)) |
| 54 | || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, |
| 55 | NULL, NULL))) |
| 56 | goto end; |
| 57 | |
| 58 | if (ciphers[idx].expected_prot == 0) { |
| 59 | if (!TEST_false(create_ssl_connection(serverssl, clientssl, |
| 60 | SSL_ERROR_NONE))) |
| 61 | goto end; |
| 62 | } else { |
| 63 | if (!TEST_true(create_ssl_connection(serverssl, clientssl, |
| 64 | SSL_ERROR_NONE)) |
| 65 | || !TEST_int_eq(SSL_version(clientssl), |
| 66 | ciphers[idx].expected_prot)) |
| 67 | goto end; |
| 68 | } |
| 69 | |
| 70 | testresult = 1; |
| 71 | |
| 72 | end: |
| 73 | SSL_free(serverssl); |
| 74 | SSL_free(clientssl); |
| 75 | SSL_CTX_free(sctx); |
| 76 | SSL_CTX_free(cctx); |
| 77 | |
| 78 | return testresult; |
| 79 | } |
| 80 | |
| 81 | int setup_tests(void) |
| 82 | { |
| 83 | if (!TEST_ptr(cert1 = test_get_argument(0)) |
| 84 | || !TEST_ptr(privkey1 = test_get_argument(1)) |
| 85 | || !TEST_ptr(cert2 = test_get_argument(2)) |
| 86 | || !TEST_ptr(privkey2 = test_get_argument(3))) |
| 87 | return 0; |
| 88 | |
| 89 | ADD_ALL_TESTS(test_tls13, OSSL_NELEM(ciphers)); |
| 90 | return 1; |
| 91 | } |