35#if defined(ENABLE_CRYPTO_OPENSSL)
48#ifdef ENABLE_CRYPTOAPI
55#include <openssl/bn.h>
56#include <openssl/crypto.h>
57#include <openssl/dh.h>
58#include <openssl/dsa.h>
59#include <openssl/err.h>
60#include <openssl/pkcs12.h>
61#include <openssl/rsa.h>
62#include <openssl/x509.h>
63#include <openssl/ssl.h>
65#include <openssl/ec.h>
68#if OPENSSL_VERSION_NUMBER >= 0x30000000L
69#define HAVE_OPENSSL_STORE_API
70#include <openssl/ui.h>
71#include <openssl/store.h>
74#if defined(_MSC_VER) && !defined(_M_ARM64)
75#include <openssl/applink.c>
93 mydata_index = SSL_get_ex_new_index(0,
"struct session *", NULL, NULL, NULL);
109 if (ctx->
ctx == NULL)
113 if (ERR_peek_error() != 0)
127 if (ctx->
ctx == NULL)
131 if (ERR_peek_error() != 0)
142 SSL_CTX_free(ctx->
ctx);
144 sk_X509_CRL_pop_free(ctx->crls, X509_CRL_free);
160 void *ekm,
size_t ekm_size)
165 if (SSL_export_keying_material(ssl, ekm, ekm_size, label, label_size, NULL, 0, 0) == 1)
180#ifndef INFO_CALLBACK_SSL_CONST
181#define INFO_CALLBACK_SSL_CONST const
186 if (where & SSL_CB_LOOP)
189 where & SSL_ST_CONNECT ?
"connect"
190 : where & SSL_ST_ACCEPT ?
"accept"
192 SSL_state_string_long(s));
194 else if (where & SSL_CB_ALERT)
197 SSL_alert_type_string_long(ret), SSL_alert_desc_string_long(ret));
209#if defined(TLS1_3_VERSION)
212#elif OPENSSL_VERSION_NUMBER >= 0x10100000L
224 if (OpenSSL_version_num() >= 0x1010100fL)
232#elif defined(TLS1_2_VERSION) || defined(SSL_OP_NO_TLSv1_2)
234#elif defined(TLS1_1_VERSION) || defined(SSL_OP_NO_TLSv1_1)
251 return TLS1_1_VERSION;
255 return TLS1_2_VERSION;
265#ifndef TLS1_3_VERSION
273 return TLS1_3_VERSION;
282 uint16_t tls_ver_min =
284 uint16_t tls_ver_max =
290 uint16_t cur_min = (uint16_t)SSL_CTX_get_min_proto_version(ctx->
ctx);
291 tls_ver_min = cur_min < TLS1_VERSION ? TLS1_VERSION : cur_min;
294 if (!SSL_CTX_set_min_proto_version(ctx->
ctx, tls_ver_min))
300 if (tls_ver_max && !SSL_CTX_set_max_proto_version(ctx->
ctx, tls_ver_max))
315 ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
321 X509_STORE_CTX_set0_crls(ctx,
session->opt->ssl_ctx->crls);
322 return X509_verify_cert(ctx);
331 uint64_t sslopt = SSL_OP_SINGLE_DH_USE | SSL_OP_NO_TICKET;
332#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
333 sslopt |= SSL_OP_CIPHER_SERVER_PREFERENCE;
335 sslopt |= SSL_OP_NO_COMPRESSION;
339#ifdef SSL_OP_NO_RENEGOTIATION
340 sslopt |= SSL_OP_NO_RENEGOTIATION;
343 SSL_CTX_set_options(ctx->
ctx, sslopt);
350#ifdef SSL_MODE_RELEASE_BUFFERS
351 SSL_CTX_set_mode(ctx->
ctx, SSL_MODE_RELEASE_BUFFERS);
353 SSL_CTX_set_session_cache_mode(ctx->
ctx, SSL_SESS_CACHE_OFF);
357 int verify_flags = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
364 verify_flags = SSL_VERIFY_PEER;
378 size_t begin_of_cipher, end_of_cipher;
380 const char *current_cipher;
381 size_t current_cipher_len;
385 size_t openssl_ciphers_len = 0;
386 openssl_ciphers[0] =
'\0';
389 begin_of_cipher = end_of_cipher = 0;
390 for (; begin_of_cipher < strlen(ciphers); begin_of_cipher = end_of_cipher)
392 end_of_cipher += strcspn(&ciphers[begin_of_cipher],
":");
396 if (NULL == cipher_pair)
399 current_cipher = &ciphers[begin_of_cipher];
400 current_cipher_len = end_of_cipher - begin_of_cipher;
405 msg(
D_LOW,
"No valid translation found for TLS cipher '%.*s'",
406 constrain_int((
int)current_cipher_len, 0, 256), current_cipher);
412 current_cipher_len = strlen(current_cipher);
414 if (end_of_cipher - begin_of_cipher == current_cipher_len
416 != memcmp(&ciphers[begin_of_cipher], cipher_pair->
iana_name,
417 end_of_cipher - begin_of_cipher))
420 msg(
M_WARN,
"Deprecated TLS cipher name '%s', please use IANA name '%s'",
426 if ((SIZE_MAX - openssl_ciphers_len) < current_cipher_len
427 || (len - 1) < (openssl_ciphers_len + current_cipher_len))
429 msg(
M_FATAL,
"Failed to set restricted TLS cipher list, too long (>%d).",
434 memcpy(&openssl_ciphers[openssl_ciphers_len], current_cipher, current_cipher_len);
435 openssl_ciphers_len += current_cipher_len;
436 openssl_ciphers[openssl_ciphers_len] =
':';
437 openssl_ciphers_len++;
442 if (openssl_ciphers_len > 0)
444 openssl_ciphers[openssl_ciphers_len - 1] =
'\0';
454 if (!SSL_CTX_set_cipher_list(
472 char openssl_ciphers[4096];
478 if (!SSL_CTX_set_cipher_list(ctx->
ctx, openssl_ciphers))
480 crypto_msg(
M_FATAL,
"Failed to set restricted TLS cipher list: %s", openssl_ciphers);
492 if (strlen(ciphers) >= (len - 1))
494 msg(
M_FATAL,
"Failed to set restricted TLS 1.3 cipher list, too long (>%d).",
498 strncpy(openssl_ciphers, ciphers, len);
500 for (
size_t i = 0; i < strlen(openssl_ciphers); i++)
502 if (openssl_ciphers[i] ==
'-')
504 openssl_ciphers[i] =
'_';
519#if !defined(TLS1_3_VERSION)
521 "Not compiled with OpenSSL 1.1.1 or higher. "
522 "Ignoring TLS 1.3 only tls-ciphersuites '%s' setting.",
527 char openssl_ciphers[4096];
530 if (!SSL_CTX_set_ciphersuites(ctx->
ctx, openssl_ciphers))
532 crypto_msg(
M_FATAL,
"Failed to set restricted TLS 1.3 cipher list: %s", openssl_ciphers);
540#if OPENSSL_VERSION_NUMBER > 0x10100000L \
541 && (!defined(LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER > 0x3060000fL) \
542 && !defined(OPENSSL_IS_AWSLC)
547 if (!profile || 0 == strcmp(profile,
"legacy"))
549 SSL_CTX_set_security_level(ctx->
ctx, 1);
551 else if (0 == strcmp(profile,
"insecure"))
553 SSL_CTX_set_security_level(ctx->
ctx, 0);
555 else if (0 == strcmp(profile,
"preferred"))
557 SSL_CTX_set_security_level(ctx->
ctx, 2);
559 else if (0 == strcmp(profile,
"suiteb"))
561 SSL_CTX_set_security_level(ctx->
ctx, 3);
562 SSL_CTX_set_cipher_list(ctx->
ctx,
"SUITEB128");
566 msg(
M_FATAL,
"ERROR: Invalid cert profile: %s", profile);
572 "WARNING: OpenSSL 1.1.0, AWS-LC and LibreSSL < 3.6.0 do not "
573 "support --tls-cert-profile, ignoring user-set profile: '%s'",
583#if OPENSSL_VERSION_NUMBER < 0x30000000L && !defined(ENABLE_CRYPTO_WOLFSSL)
605 while ((token =
strsep(&tmp_groups,
":")))
607 if (
streq(token,
"secp256r1"))
609 token =
"prime256v1";
611 int nid = OBJ_sn2nid(token);
615 msg(
M_WARN,
"Warning unknown curve/group specified: %s", token);
619 glist[glistlen] = nid;
630 if (!SSL_CTX_set1_groups_list(ctx->
ctx, groups))
637#if OPENSSL_VERSION_NUMBER < 0x40000000L
646 cert = SSL_CTX_get0_certificate(ctx->
ctx);
653 ret = X509_cmp_time(X509_get0_notBefore(cert), NULL);
660 msg(
M_WARN,
"WARNING: Your certificate is not yet valid!");
663 ret = X509_cmp_time(X509_get0_notAfter(cert), NULL);
670 msg(
M_WARN,
"WARNING: Your certificate has expired!");
680 cert = SSL_CTX_get0_certificate(ctx->
ctx);
687 X509_VERIFY_PARAM *vpm = X509_VERIFY_PARAM_new();
695 X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_USE_CHECK_TIME);
696 X509_VERIFY_PARAM_set_time(vpm,
now);
699 int ret = X509_check_certificate_times(vpm, cert, &error);
700 X509_VERIFY_PARAM_free(vpm);
709 case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
713 case X509_V_ERR_CERT_NOT_YET_VALID:
714 msg(
M_WARN,
"WARNING: Your certificate is not yet valid!");
717 case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
721 case X509_V_ERR_CERT_HAS_EXPIRED:
722 msg(
M_WARN,
"WARNING: Your certificate has expired!");
737 if (!(bio = BIO_new_mem_buf((
char *)dh_file, -1)))
745 if (!(bio = BIO_new_file(dh_file,
"r")))
751#if OPENSSL_VERSION_NUMBER >= 0x30000000L
752 EVP_PKEY *dh = PEM_read_bio_Parameters(bio, NULL);
760 if (!SSL_CTX_set0_tmp_dh_pkey(ctx->
ctx, dh))
765 msg(
D_TLS_DEBUG_LOW,
"Diffie-Hellman initialized with %d bit key", 8 * EVP_PKEY_get_size(dh));
767 DH *dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
775 if (!SSL_CTX_set_tmp_dh(ctx->
ctx, dh))
789#if OPENSSL_VERSION_NUMBER >= 0x30000000L
790 if (curve_name != NULL)
792 msg(
M_WARN,
"WARNING: OpenSSL 3.0+ builds do not support specifying an "
793 "ECDH curve with --ecdh-curve, using default curves. Use "
794 "--tls-groups to specify groups.");
796#elif !defined(OPENSSL_NO_EC)
799 const char *sname = NULL;
802 SSL_CTX_set_options(ctx->
ctx, SSL_OP_SINGLE_ECDH_USE);
804 if (curve_name != NULL)
807 msg(
D_TLS_DEBUG,
"Using user specified ECDH curve (%s)", curve_name);
808 nid = OBJ_sn2nid(curve_name);
816 sname = OBJ_nid2sn(nid);
823 if (NID_undef == nid || NULL == (ecdh = EC_KEY_new_by_curve_name(nid)))
826 ecdh = EC_KEY_new_by_curve_name(NID_secp384r1);
828 (NULL == curve_name) ?
"extract curve from certificate" :
"use supplied curve";
830 sname = OBJ_nid2sn(NID_secp384r1);
833 if (!SSL_CTX_set_tmp_ecdh(ctx->
ctx, ecdh))
842 msg(
D_LOW,
"Your OpenSSL library was built without elliptic curve support."
843 " Skipping ECDH parameter loading.");
847#if defined(HAVE_OPENSSL_STORE_API)
854ui_reader(UI *ui, UI_STRING *uis)
856 SSL_CTX *ctx = UI_get0_user_data(ui);
858 if (UI_get_string_type(uis) == UIT_PROMPT)
860 const char *prompt = UI_get0_output_string(uis);
863 if (strstr(prompt,
"PKCS#11"))
869 UI_set_result(ui, uis, up.password);
875 pem_password_cb *cb = SSL_CTX_get_default_passwd_cb(ctx);
876 void *d = SSL_CTX_get_default_passwd_cb_userdata(ctx);
889clear_ossl_store_error(OSSL_STORE_CTX *store_ctx)
891 if (OSSL_STORE_error(store_ctx))
909 EVP_PKEY *pkey = NULL;
911#if !defined(HAVE_OPENSSL_STORE_API)
914 BIO *in = BIO_new_file(uri,
"r");
919 pkey = PEM_read_bio_PrivateKey(in, NULL, SSL_CTX_get_default_passwd_cb(ssl_ctx),
920 SSL_CTX_get_default_passwd_cb_userdata(ssl_ctx));
925 OSSL_STORE_CTX *store_ctx = NULL;
926 OSSL_STORE_INFO *info = NULL;
928 UI_METHOD *ui_method = UI_create_method(
"openvpn");
931 msg(
M_WARN,
"OpenSSL UI creation failed");
934 UI_method_set_reader(ui_method, ui_reader);
936 store_ctx = OSSL_STORE_open_ex(uri,
tls_libctx, NULL, ui_method, ssl_ctx, NULL, NULL, NULL);
941 if (OSSL_STORE_expect(store_ctx, OSSL_STORE_INFO_PKEY) != 1)
947 info = OSSL_STORE_load(store_ctx);
948 if (info || OSSL_STORE_eof(store_ctx))
956 clear_ossl_store_error(store_ctx);
962 pkey = OSSL_STORE_INFO_get1_PKEY(info);
963 OSSL_STORE_INFO_free(info);
967 OSSL_STORE_close(store_ctx);
968 UI_destroy_method(ui_method);
982 STACK_OF(X509) *ca = NULL;
989 if (pkcs12_file_inline)
991 BIO *b64 = BIO_new(BIO_f_base64());
992 BIO *bio = BIO_new_mem_buf((
void *)pkcs12_file, (
int)strlen(pkcs12_file));
995 p12 = d2i_PKCS12_bio(b64, NULL);
1010 p12 = d2i_PKCS12_fp(fp, NULL);
1019 if (!PKCS12_parse(p12,
"", &pkey, &cert, &ca))
1024 if (!PKCS12_parse(p12,
password, &pkey, &cert, &ca))
1027 "or unsupported/legacy encryption");
1028#ifdef ENABLE_MANAGEMENT
1029 if (
management && (ERR_GET_REASON(ERR_peek_error()) == PKCS12_R_MAC_VERIFY_FAILURE))
1041 if (!SSL_CTX_use_certificate(ctx->
ctx, cert))
1048 if (!SSL_CTX_use_PrivateKey(ctx->
ctx, pkey))
1054 if (!SSL_CTX_check_private_key(ctx->
ctx))
1066 if (ca && sk_X509_num(ca))
1068 for (i = 0; i < sk_X509_num(ca); i++)
1070 X509_STORE *cert_store = SSL_CTX_get_cert_store(ctx->
ctx);
1071 if (!X509_STORE_add_cert(cert_store, sk_X509_value(ca, i)))
1074 "Cannot add certificate to certificate chain (X509_STORE_add_cert)");
1076 if (!SSL_CTX_add_client_CA(ctx->
ctx, sk_X509_value(ca, i)))
1079 "Cannot add certificate to client CA list (SSL_CTX_add_client_CA)");
1091 if (ca && sk_X509_num(ca))
1093 for (i = 0; i < sk_X509_num(ca); i++)
1095 if (!SSL_CTX_add_extra_chain_cert(ctx->
ctx, sk_X509_value(ca, i)))
1099 "Cannot add extra certificate to chain (SSL_CTX_add_extra_chain_cert)");
1107#ifdef ENABLE_CRYPTOAPI
1116 crypto_msg(
M_FATAL,
"Cannot load certificate \"%s\" from Microsoft Certificate Store",
1129 if (!PEM_read_bio_X509(bio, &cert, NULL, NULL))
1135 if (optional && ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE)
1138 (void)ERR_get_error();
1146 if (SSL_CTX_add_extra_chain_cert(ctx->
ctx, cert) != 1)
1158#if defined(HAVE_OPENSSL_STORE_API)
1168#if defined(HAVE_OPENSSL_STORE_API)
1171 OSSL_STORE_CTX *store_ctx = NULL;
1172 OSSL_STORE_INFO *info = NULL;
1176 UI_METHOD *ui_method = UI_create_method(
"openvpn");
1179 msg(
M_WARN,
"OpenSSL UI method creation failed");
1182 UI_method_set_reader(ui_method, ui_reader);
1185 OSSL_STORE_open_ex(uri,
tls_libctx, NULL, ui_method, tls_ctx->
ctx, NULL, NULL, NULL);
1190 if (OSSL_STORE_expect(store_ctx, OSSL_STORE_INFO_CERT) != 1)
1197 info = OSSL_STORE_load(store_ctx);
1198 if (info || OSSL_STORE_eof(store_ctx))
1206 clear_ossl_store_error(store_ctx);
1213 x = OSSL_STORE_INFO_get0_CERT(info);
1220 ret = SSL_CTX_use_certificate(tls_ctx->
ctx, x);
1225 OSSL_STORE_INFO_free(info);
1229 while (!OSSL_STORE_eof(store_ctx))
1231 info = OSSL_STORE_load(store_ctx);
1234 clear_ossl_store_error(store_ctx);
1237 x = OSSL_STORE_INFO_get1_CERT(info);
1238 if (x && SSL_CTX_add_extra_chain_cert(tls_ctx->
ctx, x) != 1)
1244 OSSL_STORE_INFO_free(info);
1259 UI_destroy_method(ui_method);
1260 OSSL_STORE_INFO_free(info);
1261 OSSL_STORE_close(store_ctx);
1276 if (cert_file_inline)
1278 in = BIO_new_mem_buf((
char *)cert_file, -1);
1282 in = BIO_new_file((
char *)cert_file,
"r");
1287 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, ERR_R_SYS_LIB);
1291 x = PEM_read_bio_X509(in, NULL, SSL_CTX_get_default_passwd_cb(ctx->
ctx),
1292 SSL_CTX_get_default_passwd_cb_userdata(ctx->
ctx));
1295 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, ERR_R_PEM_LIB);
1299 ret = SSL_CTX_use_certificate(ctx->
ctx, x);
1309 if (cert_file_inline)
1342 bool priv_key_file_inline)
1344 SSL_CTX *ssl_ctx = NULL;
1346 EVP_PKEY *pkey = NULL;
1353 if (priv_key_file_inline)
1355 in = BIO_new_mem_buf((
char *)priv_key_file, -1);
1360 pkey = PEM_read_bio_PrivateKey(in, NULL, SSL_CTX_get_default_passwd_cb(ctx->
ctx),
1361 SSL_CTX_get_default_passwd_cb_userdata(ctx->
ctx));
1368 if (!pkey || !SSL_CTX_use_PrivateKey(ssl_ctx, pkey))
1370#ifdef ENABLE_MANAGEMENT
1371 if (
management && (ERR_GET_REASON(ERR_peek_error()) == EVP_R_BAD_DECRYPT))
1382 if (!SSL_CTX_check_private_key(ssl_ctx))
1389 EVP_PKEY_free(pkey);
1398 STACK_OF(X509_CRL) *crls = NULL;
1400 X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx->
ctx);
1406 sk_X509_CRL_pop_free(ssl_ctx->crls, X509_CRL_free);
1407 ssl_ctx->crls = NULL;
1409 X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
1413 in = BIO_new_mem_buf((
char *)crl_file, -1);
1417 in = BIO_new_file(crl_file,
"r");
1426 crls = sk_X509_CRL_new_null();
1432 int num_crls_loaded = 0;
1435 X509_CRL *crl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
1441 bool eof = ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE;
1443 if (num_crls_loaded > 0 && eof)
1446 (void)ERR_get_error();
1455 if (!sk_X509_CRL_push(crls, crl))
1461 msg(
M_INFO,
"CRL: loaded %d CRLs from file %s", num_crls_loaded, crl_file);
1462 ssl_ctx->crls = crls;
1467#if defined(ENABLE_MANAGEMENT) && !defined(HAVE_XKEY_PROVIDER)
1471rsa_pub_enc(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1479rsa_pub_dec(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1487rsa_priv_dec(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1500 const RSA_METHOD *meth = RSA_get_method(rsa);
1501 RSA_meth_free((RSA_METHOD *)meth);
1514 case RSA_PKCS1_PADDING:
1515 return "RSA_PKCS1_PADDING";
1517 case RSA_NO_PADDING:
1518 return "RSA_NO_PADDING";
1538 unsigned int siglen,
const char *algorithm)
1540 char *in_b64 = NULL;
1541 char *out_b64 = NULL;
1562rsa_priv_enc(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1564 int len = RSA_size(rsa);
1566 if (padding != RSA_PKCS1_PADDING && padding != RSA_NO_PADDING)
1568 RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
1574 return (ret == len) ? ret : -1;
1581 RSA_METHOD *rsa_meth;
1585 const RSA *pub_rsa = EVP_PKEY_get0_RSA(pkey);
1589 rsa_meth = RSA_meth_new(
"OpenVPN external private key RSA Method", RSA_METHOD_FLAG_NO_CHECK);
1595 RSA_meth_set_init(rsa_meth, NULL);
1597 RSA_meth_set0_app_data(rsa_meth, NULL);
1603 SSLerr(SSL_F_SSL_USE_PRIVATEKEY, ERR_R_MALLOC_FAILURE);
1608 const BIGNUM *n = NULL;
1609 const BIGNUM *e = NULL;
1610 RSA_get0_key(pub_rsa, &n, &e, NULL);
1611 RSA_set0_key(rsa, BN_dup(n), BN_dup(e), NULL);
1612 RSA_set_flags(rsa, RSA_flags(rsa) | RSA_FLAG_EXT_PKEY);
1613 if (!RSA_set_method(rsa, rsa_meth))
1615 RSA_meth_free(rsa_meth);
1621 if (!SSL_CTX_use_RSAPrivateKey(ctx->
ctx, rsa))
1636 RSA_meth_free(rsa_meth);
1641#if !defined(OPENSSL_NO_EC)
1648 const EC_KEY_METHOD *ec_meth = EC_KEY_get_method(ec);
1649 EC_KEY_METHOD_free((EC_KEY_METHOD *)ec_meth);
1657ecdsa_sign(
int type,
const unsigned char *dgst,
int dgstlen,
unsigned char *sig,
1658 unsigned int *siglen,
const BIGNUM *kinv,
const BIGNUM *r, EC_KEY *ec)
1660 int capacity = ECDSA_size(ec);
1688ecdsa_sign_sig(
const unsigned char *dgst,
int dgstlen,
const BIGNUM *in_kinv,
const BIGNUM *in_r,
1691 ECDSA_SIG *ecsig = NULL;
1692 unsigned int len = ECDSA_size(ec);
1696 if (
ecdsa_sign(0, dgst, dgstlen, buf, &len, NULL, NULL, ec) != 1)
1701 ecsig = d2i_ECDSA_SIG(NULL, (
const unsigned char **)&buf, len);
1712 EVP_PKEY *privkey = NULL;
1713 EC_KEY_METHOD *ec_method;
1717 ec_method = EC_KEY_METHOD_new(EC_KEY_OpenSSL());
1725#ifdef OPENSSL_IS_AWSLC
1731 ec = EC_KEY_dup(EVP_PKEY_get0_EC_KEY(pkey));
1734 EC_KEY_METHOD_free(ec_method);
1737 if (!EC_KEY_set_method(ec, ec_method))
1739 EC_KEY_METHOD_free(ec_method);
1744 privkey = EVP_PKEY_new();
1745 if (!EVP_PKEY_assign_EC_KEY(privkey, ec))
1751 if (!SSL_CTX_use_PrivateKey(ctx->
ctx, privkey))
1757 EVP_PKEY_free(privkey);
1762 EVP_PKEY_free(privkey);
1769#ifdef ENABLE_MANAGEMENT
1777 X509 *cert = SSL_CTX_get0_certificate(ctx->
ctx);
1782 EVP_PKEY *pkey = X509_get0_pubkey(cert);
1785#ifdef HAVE_XKEY_PROVIDER
1786 EVP_PKEY *privkey = xkey_load_management_key(
tls_libctx, pkey);
1787 if (!privkey || !SSL_CTX_use_PrivateKey(ctx->
ctx, privkey))
1789 EVP_PKEY_free(privkey);
1792 EVP_PKEY_free(privkey);
1794#if OPENSSL_VERSION_NUMBER < 0x30000000L
1795 if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA)
1797 if (EVP_PKEY_is_a(pkey,
"RSA"))
1805#if !defined(OPENSSL_NO_EC)
1806#if OPENSSL_VERSION_NUMBER < 0x30000000L
1807 else if (EVP_PKEY_id(pkey) == EVP_PKEY_EC)
1809 else if (EVP_PKEY_is_a(pkey,
"EC"))
1819 crypto_msg(
M_WARN,
"management-external-key requires an RSA or EC certificate");
1846 return X509_NAME_cmp(*a, *b);
1851 const char *ca_path,
bool tls_server)
1853 STACK_OF(X509_INFO) *info_stack = NULL;
1854 STACK_OF(X509_NAME) *cert_names = NULL;
1855 X509_LOOKUP *lookup = NULL;
1856 X509_STORE *store = NULL;
1858 int i, added = 0, prev = 0;
1862 store = SSL_CTX_get_cert_store(ctx->
ctx);
1873 in = BIO_new_mem_buf((
char *)ca_file, -1);
1877 in = BIO_new_file(ca_file,
"r");
1882 info_stack = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL);
1887 for (i = 0; i < sk_X509_INFO_num(info_stack); i++)
1889 X509_INFO *info = sk_X509_INFO_value(info_stack, i);
1892 X509_STORE_add_crl(store, info->crl);
1895 if (tls_server && !info->x509)
1902 X509_STORE_add_cert(store, info->x509);
1911 if (cert_names == NULL)
1924 X509_NAME *xn = (X509_NAME *)X509_get_subject_name(info->x509);
1932 if (sk_X509_NAME_find(cert_names, (X509_NAME *)xn) == -1)
1934 X509_NAME *xn_dup = X509_NAME_dup(xn);
1939 sk_X509_NAME_push(cert_names, xn_dup);
1945 int cnum = sk_X509_NAME_num(cert_names);
1946 if (cnum != (prev + 1))
1949 "Cannot load CA certificate file %s (entry %d did not validate)",
1955 sk_X509_INFO_pop_free(info_stack, X509_INFO_free);
1960 cnum = sk_X509_NAME_num(cert_names);
1961 SSL_CTX_set_client_CA_list(ctx->
ctx, cert_names);
1966 crypto_msg(
M_FATAL,
"Cannot load CA certificate file %s (no entries were read)",
1975 "Cannot load CA certificate file %s (only %d "
1976 "of %d entries were valid X509 names)",
1987 lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
1988 if (lookup && X509_LOOKUP_add_dir(lookup, ca_path, X509_FILETYPE_PEM))
1990 msg(
M_WARN,
"WARNING: experimental option --capath %s", ca_path);
1996 X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
2002 bool extra_certs_file_inline)
2005 if (extra_certs_file_inline)
2007 in = BIO_new_mem_buf((
char *)extra_certs_file, -1);
2011 in = BIO_new_file(extra_certs_file,
"r");
2040#warning BIO_DEBUG defined
2043static bool biofp_toggle;
2044static time_t biofp_last_open;
2045static const int biofp_reopen_interval = 600;
2060 const time_t current = time(NULL);
2061 const pid_t pid = getpid();
2063 if (biofp_last_open + biofp_reopen_interval < current)
2070 snprintf(fn,
sizeof(fn),
"bio/%d-%d.log", pid, biofp_toggle);
2071 biofp = fopen(fn,
"w");
2073 biofp_last_open = time(NULL);
2079bio_debug_data(
const char *mode, BIO *bio,
const uint8_t *buf,
int len,
const char *desc)
2085 fprintf(biofp,
"BIO_%s %s time=%" PRIi64
" bio=" ptr_format " len=%d data=%s\n", mode, desc,
2093bio_debug_oc(
const char *mode, BIO *bio)
2096 fprintf(biofp,
"BIO %s time=%" PRIi64
" bio=" ptr_format "\n", mode, (int64_t)time(NULL),
2107bio_write(BIO *bio,
const uint8_t *data,
int size,
const char *desc)
2121 bio_debug_data(
"write", bio, data, size, desc);
2123 i = BIO_write(bio, data, size);
2127 if (!BIO_should_retry(bio))
2184 int i = BIO_read(bio,
BPTR(buf), len);
2189 bio_debug_data(
"read", bio,
BPTR(buf), i, desc);
2195 if (!BIO_should_retry(bio))
2225 ks_ssl->
ssl = SSL_new(ssl_ctx->
ctx);
2240 bio_debug_oc(
"open ssl_bio", ks_ssl->
ssl_bio);
2241 bio_debug_oc(
"open ct_in", ks_ssl->
ct_in);
2242 bio_debug_oc(
"open ct_out", ks_ssl->
ct_out);
2247 SSL_set_accept_state(ks_ssl->
ssl);
2251 SSL_set_connect_state(ks_ssl->
ssl);
2255 BIO_set_ssl(ks_ssl->
ssl_bio, ks_ssl->
ssl, BIO_NOCLOSE);
2261 SSL_set_shutdown(ks_ssl->
ssl, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
2270 bio_debug_oc(
"close ssl_bio", ks_ssl->
ssl_bio);
2271 bio_debug_oc(
"close ct_in", ks_ssl->
ct_in);
2272 bio_debug_oc(
"close ct_out", ks_ssl->
ct_out);
2274 BIO_free_all(ks_ssl->
ssl_bio);
2275 SSL_free(ks_ssl->
ssl);
2344 const char *curve =
"";
2345 const char *type =
"(error getting type)";
2353 int typeid = EVP_PKEY_id(pkey);
2354#if OPENSSL_VERSION_NUMBER < 0x30000000L
2355 bool is_ec =
typeid == EVP_PKEY_EC;
2357 bool is_ec = EVP_PKEY_is_a(pkey,
"EC");
2360#ifndef OPENSSL_NO_EC
2371 curve =
"(error getting curve name)";
2377#if OPENSSL_VERSION_NUMBER < 0x30000000L
2378 type = OBJ_nid2sn(
typeid);
2382 if (
typeid == EVP_PKEY_RSA)
2386 else if (
typeid == EVP_PKEY_DSA)
2390 else if (
typeid == EVP_PKEY_EC)
2393 type =
"EC, curve ";
2395 else if (type == NULL)
2397 type =
"unknown type";
2400 type = EVP_PKEY_get0_type_name(pkey);
2403 type =
"(error getting public key type)";
2408 snprintf(buf, buflen,
"%d bits %s%s", EVP_PKEY_bits(pkey), type, curve);
2420 EVP_PKEY *pkey = X509_get_pubkey(cert);
2421 char pkeybuf[64] = { 0 };
2424 char sig[128] = { 0 };
2425 int signature_nid = X509_get_signature_nid(cert);
2426 if (signature_nid != 0)
2428 snprintf(sig,
sizeof(sig),
", signature: %s", OBJ_nid2sn(signature_nid));
2431 snprintf(buf, buflen,
", peer certificate: %s%s", pkeybuf, sig);
2433 EVP_PKEY_free(pkey);
2439 EVP_PKEY *pkey = NULL;
2440 SSL_get_peer_tmp_key(ssl, &pkey);
2446 char pkeybuf[128] = { 0 };
2449 snprintf(buf, buflen,
", peer temporary key: %s", pkeybuf);
2451 EVP_PKEY_free(pkey);
2454#if !defined(LIBRESSL_VERSION_NUMBER) \
2455 || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x3090000fL)
2480 return "(error getting name)";
2484 const char *type = OBJ_nid2sn(nid);
2490 type =
"(error getting name, OBJ_nid2sn failed)";
2505 int peer_sig_type_nid = NID_undef;
2506 const char *peer_sig_unknown =
"unknown";
2507 const char *peer_sig = peer_sig_unknown;
2508 const char *peer_sig_type =
"unknown type";
2517#if !defined(LIBRESSL_VERSION_NUMBER) \
2518 || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x3090000fL)
2521 if (SSL_get_peer_signature_type_nid(ssl, &peer_sig_type_nid) && peer_sig_type_nid != NID_undef)
2527 if (peer_sig == peer_sig_unknown && peer_sig_type_nid == NID_undef)
2532 snprintf(buf, buflen,
", peer signing digest/type: %s %s", peer_sig, peer_sig_type);
2535#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2537print_tls_key_agreement_group(SSL *ssl,
char *buf,
size_t buflen)
2539 const char *groupname = SSL_get0_group_name(ssl);
2542 snprintf(buf, buflen,
", key agreement: (error fetching group)");
2546 snprintf(buf, buflen,
", key agreement: %s", groupname);
2561 const SSL_CIPHER *ciph;
2568 s1[0] = s2[0] = s3[0] = s4[0] = s5[0] = 0;
2569 ciph = SSL_get_current_cipher(ks_ssl->
ssl);
2570 snprintf(s1,
sizeof(s1),
"%s %s, cipher %s %s", prefix, SSL_get_version(ks_ssl->
ssl),
2571 SSL_CIPHER_get_version(ciph), SSL_CIPHER_get_name(ciph));
2572 X509 *cert = SSL_get_peer_certificate(ks_ssl->
ssl);
2581#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2582 print_tls_key_agreement_group(ks_ssl->
ssl, s5,
sizeof(s5));
2593 tls_ctx.
ctx = SSL_CTX_new(SSLv23_method());
2599#if defined(TLS1_3_VERSION)
2602 SSL_CTX_set_min_proto_version(tls_ctx.
ctx, TLS1_3_VERSION);
2608 SSL_CTX_set_max_proto_version(tls_ctx.
ctx, TLS1_2_VERSION);
2614 SSL *ssl = SSL_new(tls_ctx.
ctx);
2620#if OPENSSL_VERSION_NUMBER < 0x1010000fL || defined(OPENSSL_IS_AWSLC) || defined(ENABLE_CRYPTO_WOLFSSL)
2621 STACK_OF(SSL_CIPHER) *sk = SSL_get_ciphers(ssl);
2623 STACK_OF(SSL_CIPHER) *sk = SSL_get1_supported_ciphers(ssl);
2625 for (
int i = 0; i < sk_SSL_CIPHER_num(sk); i++)
2627 const SSL_CIPHER *c = sk_SSL_CIPHER_value(sk, i);
2629 const char *cipher_name = SSL_CIPHER_get_name(c);
2636 printf(
"%s\n", cipher_name);
2638 else if (NULL == pair)
2641 printf(
"%s (No IANA name known to OpenVPN, use OpenSSL name.)\n", cipher_name);
2648#if (OPENSSL_VERSION_NUMBER >= 0x1010000fL)
2649 sk_SSL_CIPHER_free(sk);
2652 SSL_CTX_free(tls_ctx.
ctx);
2662 printf(
"Consider using 'openssl ecparam -list_curves' as alternative to running\n"
2664 "Note this output does only list curves/groups that OpenSSL considers as\n"
2665 "builtin EC curves. It does not list additional curves nor X448 or X25519\n");
2666#ifndef OPENSSL_NO_EC
2667 EC_builtin_curve *curves = NULL;
2671 crv_len = EC_get_builtin_curves(NULL, 0);
2673 if (EC_get_builtin_curves(curves, crv_len))
2675 printf(
"\nAvailable Elliptic curves/groups:\n");
2676 for (n = 0; n < crv_len; n++)
2679 sname = OBJ_nid2sn(curves[n].nid);
2685 printf(
"%s\n", sname);
2694 msg(
M_WARN,
"Your OpenSSL library was built without elliptic curve support. "
2695 "No curves available.");
2702 return OpenSSL_version(OPENSSL_VERSION);
2707#ifdef HAVE_XKEY_PROVIDER
2711 const char *name = OSSL_PROVIDER_get0_name(prov);
2712 OSSL_PROVIDER_load(dest_libctx, name);
2720 OSSL_PROVIDER_unload(prov);
2735#ifdef HAVE_XKEY_PROVIDER
2748 OSSL_PROVIDER_do_all(NULL, provider_load,
tls_libctx);
2751 if (!OSSL_PROVIDER_available(
tls_libctx,
"ovpn.xkey"))
2753 OSSL_PROVIDER_add_builtin(
tls_libctx,
"ovpn.xkey", xkey_provider_init);
2754 if (!OSSL_PROVIDER_load(
tls_libctx,
"ovpn.xkey"))
2756 msg(
M_NONFATAL,
"ERROR: failed loading external key provider: "
2757 "Signing with external keys will not work.");
2767 EVP_set_default_properties(
tls_libctx,
"?provider!=ovpn.xkey");
2778#ifdef HAVE_XKEY_PROVIDER
2781 OSSL_PROVIDER_do_all(
tls_libctx, provider_unload, NULL);
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
char * string_alloc(const char *str, struct gc_arena *gc)
#define ALLOC_ARRAY_CLEAR_GC(dptr, type, n, gc)
static int buf_forward_capacity(const struct buffer *buf)
static void secure_memzero(void *data, size_t len)
Securely zeroise memory.
static char * format_hex(const uint8_t *data, size_t size, size_t maxoutput, struct gc_arena *gc)
static void check_malloc_return(void *p)
static void gc_free(struct gc_arena *a)
#define ALLOC_ARRAY(dptr, type, n)
static struct gc_arena gc_new(void)
char * strsep(char **stringp, const char *delim)
const char * print_key_filename(const char *str, bool is_inline)
To be used when printing a string that may contain inline data.
void crypto_print_openssl_errors(const unsigned int flags)
Retrieve any occurred OpenSSL errors and print those errors.
#define crypto_msg(flags,...)
Retrieve any OpenSSL errors, then print the supplied error message.
int SSL_CTX_use_CryptoAPI_certificate(SSL_CTX *ssl_ctx, const char *cert_prop)
#define D_HANDSHAKE_VERBOSE
#define KS_PRIMARY
Primary key state index.
int key_state_read_plaintext(struct key_state_ssl *ks_ssl, struct buffer *buf)
Extract plaintext data from the TLS module.
int key_state_write_ciphertext(struct key_state_ssl *ks_ssl, struct buffer *buf)
Insert a ciphertext buffer into the TLS module.
int key_state_read_ciphertext(struct key_state_ssl *ks_ssl, struct buffer *buf)
Extract ciphertext data from the TLS module.
int key_state_write_plaintext_const(struct key_state_ssl *ks_ssl, const uint8_t *data, int len)
Insert plaintext data into the TLS module.
int key_state_write_plaintext(struct key_state_ssl *ks_ssl, struct buffer *buf)
Insert a plaintext buffer into the TLS module.
int verify_callback(void *session_obj, mbedtls_x509_crt *cert, int cert_depth, uint32_t *flags)
Verify that the remote OpenVPN peer's certificate allows setting up a VPN tunnel.
static int constrain_int(int x, int min, int max)
static SERVICE_STATUS status
void management_auth_failure(struct management *man, const char *type, const char *reason)
char * management_query_pk_sig(struct management *man, const char *b64_data, const char *algorithm)
#define VALGRIND_MAKE_READABLE(addr, len)
void purge_user_pass(struct user_pass *up, const bool force)
#define GET_USER_PASS_MANAGEMENT
#define GET_USER_PASS_PASSWORD_ONLY
static bool get_user_pass(struct user_pass *up, const char *auth_file, const char *prefix, const unsigned int flags)
Retrieves the user credentials from various sources depending on the flags.
OpenSSL compatibility stub.
static int SSL_get0_peer_signature_name(SSL *ssl, const char **sigalg)
static int EVP_PKEY_get_group_name(EVP_PKEY *pkey, char *gname, size_t gname_sz, size_t *gname_len)
#define SSL_CTX_set1_groups
#define SSL_CTX_new_ex(libctx, propq, method)
Reduce SSL_CTX_new_ex() to SSL_CTX_new() for OpenSSL < 3.
int openvpn_base64_decode(const char *str, void *data, int size)
int openvpn_base64_encode(const void *data, int size, char **str)
int pem_password_callback(char *buf, int size, int rwflag, void *u)
Callback to retrieve the user's password.
Control Channel SSL library backend module.
Control Channel Common Data Structures.
#define SSLF_TLS_VERSION_MAX_SHIFT
#define UP_TYPE_PRIVATE_KEY
#define SSLF_CLIENT_CERT_OPTIONAL
#define SSLF_CLIENT_CERT_NOT_REQUIRED
#define SSLF_TLS_VERSION_MAX_MASK
#define SSLF_TLS_VERSION_MIN_SHIFT
#define SSLF_TLS_VERSION_MIN_MASK
void tls_ctx_set_tls_groups(struct tls_root_ctx *ctx, const char *groups)
Set the (elliptic curve) group allowed for signatures and key exchange.
void tls_ctx_free(struct tls_root_ctx *ctx)
Frees the library-specific TLSv1 context.
static int bio_read(BIO *bio, struct buffer *buf, const char *desc)
const char * get_ssl_library_version(void)
return a pointer to a static memory area containing the name and version number of the SSL library in...
static void openvpn_extkey_ec_finish(EC_KEY *ec)
static bool tls_ctx_set_tls_versions(struct tls_root_ctx *ctx, unsigned int ssl_flags)
static int bio_write(BIO *bio, const uint8_t *data, int size, const char *desc)
static int openvpn_extkey_rsa_finish(RSA *rsa)
static int tls_ctx_use_external_ec_key(struct tls_root_ctx *ctx, EVP_PKEY *pkey)
bool key_state_export_keying_material(struct tls_session *session, const char *label, size_t label_size, void *ekm, size_t ekm_size)
Keying Material Exporters [RFC 5705] allows additional keying material to be derived from existing TL...
void load_xkey_provider(void)
Some helper routines for provider load/unload.
static void print_pkey_details(EVP_PKEY *pkey, char *buf, size_t buflen)
static void print_server_tempkey(SSL *ssl, char *buf, size_t buflen)
static int rsa_pub_enc(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
static void tls_ctx_add_extra_certs(struct tls_root_ctx *ctx, BIO *bio, bool optional)
void show_available_tls_ciphers_list(const char *cipher_list, const char *tls_cert_profile, bool tls13)
Show the TLS ciphers that are available for us to use in the library depending on the TLS version.
static void * load_pkey_from_uri(const char *uri, SSL_CTX *ssl_ctx)
Load private key from OSSL_STORE URI or file uri : URI of object or filename ssl_ctx : SSL_CTX for UI...
void tls_ctx_server_new(struct tls_root_ctx *ctx)
Initialise a library-specific TLS context for a server.
void show_available_curves(void)
Show the available elliptic curves in the crypto library.
static uint16_t openssl_tls_version(unsigned int ver)
Convert internal version number to openssl version number.
void key_state_ssl_free(struct key_state_ssl *ks_ssl)
Free the SSL channel part of the given key state.
static int ecdsa_sign(int type, const unsigned char *dgst, int dgstlen, unsigned char *sig, unsigned int *siglen, const BIGNUM *kinv, const BIGNUM *r, EC_KEY *ec)
int tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const char *priv_key_file, bool priv_key_file_inline)
Load private key file into the given TLS context.
static int cert_verify_callback(X509_STORE_CTX *ctx, void *arg)
void key_state_ssl_shutdown(struct key_state_ssl *ks_ssl)
Sets a TLS session to be shutdown state, so the TLS library will generate a shutdown alert.
void tls_ctx_load_extra_certs(struct tls_root_ctx *ctx, const char *extra_certs_file, bool extra_certs_file_inline)
Load extra certificate authority certificates from the given file or path.
static void print_peer_signature(SSL *ssl, char *buf, size_t buflen)
Get the type of the signature that is used by the peer during the TLS handshake.
OSSL_LIB_CTX * tls_libctx
static const char * get_sigtype(int nid)
Translate an OpenSSL NID into a more human readable name.
int mydata_index
Allocate space in SSL objects in which to store a struct tls_session pointer back to parent.
static void print_cert_details(X509 *cert, char *buf, size_t buflen)
Print human readable information about the certificate into buf.
static int ecdsa_sign_setup(EC_KEY *ec, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)
void tls_ctx_check_cert_time(const struct tls_root_ctx *ctx)
Check our certificate notBefore and notAfter fields, and warn if the cert is either not yet valid or ...
void tls_ctx_restrict_ciphers_tls13(struct tls_root_ctx *ctx, const char *ciphers)
Restrict the list of ciphers that can be used within the TLS context for TLS 1.3 and higher.
static bool cert_uri_supported(void)
static int rsa_priv_dec(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
#define INFO_CALLBACK_SSL_CONST
static int rsa_pub_dec(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
static void bio_write_post(const int status, struct buffer *buf)
int tls_ctx_load_pkcs12(struct tls_root_ctx *ctx, const char *pkcs12_file, bool pkcs12_file_inline, bool load_ca_file)
Load PKCS #12 file for key, cert and (optionally) CA certs, and add to library-specific TLS context.
bool tls_ctx_initialised(struct tls_root_ctx *ctx)
Checks whether the given TLS context is initialised.
void key_state_ssl_init(struct key_state_ssl *ks_ssl, const struct tls_root_ctx *ssl_ctx, bool is_server, struct tls_session *session)
Initialise the SSL channel part of the given key state.
void tls_free_lib(void)
Free any global SSL library-specific data structures.
static void unload_xkey_provider(void)
Undo steps in load_xkey_provider.
const char * get_rsa_padding_name(const int padding)
void tls_ctx_load_ecdh_params(struct tls_root_ctx *ctx, const char *curve_name)
Load Elliptic Curve Parameters, and load them into the library-specific TLS context.
static int get_sig_from_man(const unsigned char *dgst, unsigned int dgstlen, unsigned char *sig, unsigned int siglen, const char *algorithm)
Pass the input hash in 'dgst' to management and get the signature back.
static void tls_ctx_load_cert_uri(struct tls_root_ctx *tls_ctx, const char *uri)
static int rsa_priv_enc(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
static void convert_tls_list_to_openssl(char *openssl_ciphers, size_t len, const char *ciphers)
static void tls_ctx_load_cert_pem_file(struct tls_root_ctx *ctx, const char *cert_file, bool cert_file_inline)
void tls_init_lib(void)
Perform any static initialisation necessary by the library.
void print_details(struct key_state_ssl *ks_ssl, const char *prefix)
Print a one line summary of SSL/TLS session handshake.
static void info_callback(INFO_CALLBACK_SSL_CONST SSL *s, int where, int ret)
int tls_version_max(void)
Return the maximum TLS version (as a TLS_VER_x constant) supported by current SSL implementation.
void backend_tls_ctx_reload_crl(struct tls_root_ctx *ssl_ctx, const char *crl_file, bool crl_inline)
Reload the Certificate Revocation List for the SSL channel.
void tls_ctx_restrict_ciphers(struct tls_root_ctx *ctx, const char *ciphers)
Restrict the list of ciphers that can be used within the TLS context for TLS 1.2 and below.
void tls_ctx_load_ca(struct tls_root_ctx *ctx, const char *ca_file, bool ca_file_inline, const char *ca_path, bool tls_server)
Load certificate authority certificates from the given file or path.
void tls_ctx_set_cert_profile(struct tls_root_ctx *ctx, const char *profile)
Set the TLS certificate profile.
int tls_ctx_use_management_external_key(struct tls_root_ctx *ctx)
Tell the management interface to load the given certificate and the external private key matching the...
static int tls_ctx_use_external_rsa_key(struct tls_root_ctx *ctx, EVP_PKEY *pkey)
static ECDSA_SIG * ecdsa_sign_sig(const unsigned char *dgst, int dgstlen, const BIGNUM *in_kinv, const BIGNUM *in_r, EC_KEY *ec)
void tls_ctx_load_cryptoapi(struct tls_root_ctx *ctx, const char *cryptoapi_cert)
Use Windows cryptoapi for key and cert, and add to library-specific TLS context.
static void convert_tls13_list_to_openssl(char *openssl_ciphers, size_t len, const char *ciphers)
bool tls_ctx_set_options(struct tls_root_ctx *ctx, unsigned int ssl_flags)
Set any library specific options.
void tls_ctx_load_dh_params(struct tls_root_ctx *ctx, const char *dh_file, bool dh_file_inline)
Load Diffie Hellman Parameters, and load them into the library-specific TLS context.
void tls_ctx_client_new(struct tls_root_ctx *ctx)
Initialises a library-specific TLS context for a client.
static int sk_x509_name_cmp(const X509_NAME *const *a, const X509_NAME *const *b)
void tls_ctx_load_cert_file(struct tls_root_ctx *ctx, const char *cert_file, bool cert_file_inline)
Load certificate file into the given TLS context.
int get_num_elements(const char *string, char delimiter)
Returns the occurrences of 'delimiter' in a string +1 This is typically used to find out the number e...
const tls_cipher_name_pair * tls_get_cipher_name_pair(const char *cipher_name, size_t len)
Control Channel Verification Module OpenSSL backend.
Wrapper structure for dynamically allocated memory.
int len
Length in bytes of the actual content within the allocated memory.
Garbage collection arena used to keep track of dynamically allocated memory.
Get a tls_cipher_name_pair containing OpenSSL and IANA names for supplied TLS cipher name.
const char * openssl_name
Structure that wraps the TLS context.
Security parameter state of a single session within a VPN tunnel.
char password[USER_PASS_LEN]
static int cleanup(void **state)