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);
158 void *ekm,
size_t ekm_size)
163 if (SSL_export_keying_material(ssl, ekm, ekm_size, label, label_size, NULL, 0, 0) == 1)
178#ifndef INFO_CALLBACK_SSL_CONST
179#define INFO_CALLBACK_SSL_CONST const
184 if (where & SSL_CB_LOOP)
187 where & SSL_ST_CONNECT ?
"connect"
188 : where & SSL_ST_ACCEPT ?
"accept"
190 SSL_state_string_long(s));
192 else if (where & SSL_CB_ALERT)
195 SSL_alert_type_string_long(ret), SSL_alert_desc_string_long(ret));
207#if defined(TLS1_3_VERSION)
210#elif OPENSSL_VERSION_NUMBER >= 0x10100000L
222 if (OpenSSL_version_num() >= 0x1010100fL)
230#elif defined(TLS1_2_VERSION) || defined(SSL_OP_NO_TLSv1_2)
232#elif defined(TLS1_1_VERSION) || defined(SSL_OP_NO_TLSv1_1)
249 return TLS1_1_VERSION;
253 return TLS1_2_VERSION;
263#ifndef TLS1_3_VERSION
271 return TLS1_3_VERSION;
280 uint16_t tls_ver_min =
282 uint16_t tls_ver_max =
288 uint16_t cur_min = (uint16_t)SSL_CTX_get_min_proto_version(ctx->
ctx);
289 tls_ver_min = cur_min < TLS1_VERSION ? TLS1_VERSION : cur_min;
292 if (!SSL_CTX_set_min_proto_version(ctx->
ctx, tls_ver_min))
298 if (tls_ver_max && !SSL_CTX_set_max_proto_version(ctx->
ctx, tls_ver_max))
313 uint64_t sslopt = SSL_OP_SINGLE_DH_USE | SSL_OP_NO_TICKET;
314#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
315 sslopt |= SSL_OP_CIPHER_SERVER_PREFERENCE;
317 sslopt |= SSL_OP_NO_COMPRESSION;
321#ifdef SSL_OP_NO_RENEGOTIATION
322 sslopt |= SSL_OP_NO_RENEGOTIATION;
325 SSL_CTX_set_options(ctx->
ctx, sslopt);
332#ifdef SSL_MODE_RELEASE_BUFFERS
333 SSL_CTX_set_mode(ctx->
ctx, SSL_MODE_RELEASE_BUFFERS);
335 SSL_CTX_set_session_cache_mode(ctx->
ctx, SSL_SESS_CACHE_OFF);
339 int verify_flags = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
346 verify_flags = SSL_VERIFY_PEER;
359 size_t begin_of_cipher, end_of_cipher;
361 const char *current_cipher;
362 size_t current_cipher_len;
366 size_t openssl_ciphers_len = 0;
367 openssl_ciphers[0] =
'\0';
370 begin_of_cipher = end_of_cipher = 0;
371 for (; begin_of_cipher < strlen(ciphers); begin_of_cipher = end_of_cipher)
373 end_of_cipher += strcspn(&ciphers[begin_of_cipher],
":");
377 if (NULL == cipher_pair)
380 current_cipher = &ciphers[begin_of_cipher];
381 current_cipher_len = end_of_cipher - begin_of_cipher;
386 msg(
D_LOW,
"No valid translation found for TLS cipher '%.*s'",
387 constrain_int((
int)current_cipher_len, 0, 256), current_cipher);
393 current_cipher_len = strlen(current_cipher);
395 if (end_of_cipher - begin_of_cipher == current_cipher_len
397 != memcmp(&ciphers[begin_of_cipher], cipher_pair->
iana_name,
398 end_of_cipher - begin_of_cipher))
401 msg(
M_WARN,
"Deprecated TLS cipher name '%s', please use IANA name '%s'",
407 if ((SIZE_MAX - openssl_ciphers_len) < current_cipher_len
408 || (len - 1) < (openssl_ciphers_len + current_cipher_len))
410 msg(
M_FATAL,
"Failed to set restricted TLS cipher list, too long (>%d).",
415 memcpy(&openssl_ciphers[openssl_ciphers_len], current_cipher, current_cipher_len);
416 openssl_ciphers_len += current_cipher_len;
417 openssl_ciphers[openssl_ciphers_len] =
':';
418 openssl_ciphers_len++;
423 if (openssl_ciphers_len > 0)
425 openssl_ciphers[openssl_ciphers_len - 1] =
'\0';
435 if (!SSL_CTX_set_cipher_list(
453 char openssl_ciphers[4096];
459 if (!SSL_CTX_set_cipher_list(ctx->
ctx, openssl_ciphers))
461 crypto_msg(
M_FATAL,
"Failed to set restricted TLS cipher list: %s", openssl_ciphers);
473 if (strlen(ciphers) >= (len - 1))
475 msg(
M_FATAL,
"Failed to set restricted TLS 1.3 cipher list, too long (>%d).",
479 strncpy(openssl_ciphers, ciphers, len);
481 for (
size_t i = 0; i < strlen(openssl_ciphers); i++)
483 if (openssl_ciphers[i] ==
'-')
485 openssl_ciphers[i] =
'_';
500#if !defined(TLS1_3_VERSION)
502 "Not compiled with OpenSSL 1.1.1 or higher. "
503 "Ignoring TLS 1.3 only tls-ciphersuites '%s' setting.",
508 char openssl_ciphers[4096];
511 if (!SSL_CTX_set_ciphersuites(ctx->
ctx, openssl_ciphers))
513 crypto_msg(
M_FATAL,
"Failed to set restricted TLS 1.3 cipher list: %s", openssl_ciphers);
521#if OPENSSL_VERSION_NUMBER > 0x10100000L \
522 && (!defined(LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER > 0x3060000fL) \
523 && !defined(OPENSSL_IS_AWSLC)
528 if (!profile || 0 == strcmp(profile,
"legacy"))
530 SSL_CTX_set_security_level(ctx->
ctx, 1);
532 else if (0 == strcmp(profile,
"insecure"))
534 SSL_CTX_set_security_level(ctx->
ctx, 0);
536 else if (0 == strcmp(profile,
"preferred"))
538 SSL_CTX_set_security_level(ctx->
ctx, 2);
540 else if (0 == strcmp(profile,
"suiteb"))
542 SSL_CTX_set_security_level(ctx->
ctx, 3);
543 SSL_CTX_set_cipher_list(ctx->
ctx,
"SUITEB128");
547 msg(
M_FATAL,
"ERROR: Invalid cert profile: %s", profile);
553 "WARNING: OpenSSL 1.1.0, AWS-LC and LibreSSL < 3.6.0 do not "
554 "support --tls-cert-profile, ignoring user-set profile: '%s'",
564#if OPENSSL_VERSION_NUMBER < 0x30000000L && !defined(ENABLE_CRYPTO_WOLFSSL)
586 while ((token =
strsep(&tmp_groups,
":")))
588 if (
streq(token,
"secp256r1"))
590 token =
"prime256v1";
592 int nid = OBJ_sn2nid(token);
596 msg(
M_WARN,
"Warning unknown curve/group specified: %s", token);
600 glist[glistlen] = nid;
611 if (!SSL_CTX_set1_groups_list(ctx->
ctx, groups))
626 cert = SSL_CTX_get0_certificate(ctx->
ctx);
633 ret = X509_cmp_time(X509_get0_notBefore(cert), NULL);
640 msg(
M_WARN,
"WARNING: Your certificate is not yet valid!");
643 ret = X509_cmp_time(X509_get0_notAfter(cert), NULL);
650 msg(
M_WARN,
"WARNING: Your certificate has expired!");
663 if (!(bio = BIO_new_mem_buf((
char *)dh_file, -1)))
671 if (!(bio = BIO_new_file(dh_file,
"r")))
677#if OPENSSL_VERSION_NUMBER >= 0x30000000L
678 EVP_PKEY *dh = PEM_read_bio_Parameters(bio, NULL);
686 if (!SSL_CTX_set0_tmp_dh_pkey(ctx->
ctx, dh))
691 msg(
D_TLS_DEBUG_LOW,
"Diffie-Hellman initialized with %d bit key", 8 * EVP_PKEY_get_size(dh));
693 DH *dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
701 if (!SSL_CTX_set_tmp_dh(ctx->
ctx, dh))
715#if OPENSSL_VERSION_NUMBER >= 0x30000000L
716 if (curve_name != NULL)
718 msg(
M_WARN,
"WARNING: OpenSSL 3.0+ builds do not support specifying an "
719 "ECDH curve with --ecdh-curve, using default curves. Use "
720 "--tls-groups to specify groups.");
722#elif !defined(OPENSSL_NO_EC)
725 const char *sname = NULL;
728 SSL_CTX_set_options(ctx->
ctx, SSL_OP_SINGLE_ECDH_USE);
730 if (curve_name != NULL)
733 msg(
D_TLS_DEBUG,
"Using user specified ECDH curve (%s)", curve_name);
734 nid = OBJ_sn2nid(curve_name);
742 sname = OBJ_nid2sn(nid);
749 if (NID_undef == nid || NULL == (ecdh = EC_KEY_new_by_curve_name(nid)))
752 ecdh = EC_KEY_new_by_curve_name(NID_secp384r1);
754 (NULL == curve_name) ?
"extract curve from certificate" :
"use supplied curve";
756 sname = OBJ_nid2sn(NID_secp384r1);
759 if (!SSL_CTX_set_tmp_ecdh(ctx->
ctx, ecdh))
768 msg(
D_LOW,
"Your OpenSSL library was built without elliptic curve support."
769 " Skipping ECDH parameter loading.");
773#if defined(HAVE_OPENSSL_STORE_API)
780ui_reader(UI *ui, UI_STRING *uis)
782 SSL_CTX *ctx = UI_get0_user_data(ui);
784 if (UI_get_string_type(uis) == UIT_PROMPT)
786 const char *prompt = UI_get0_output_string(uis);
789 if (strstr(prompt,
"PKCS#11"))
795 UI_set_result(ui, uis, up.password);
801 pem_password_cb *cb = SSL_CTX_get_default_passwd_cb(ctx);
802 void *d = SSL_CTX_get_default_passwd_cb_userdata(ctx);
815clear_ossl_store_error(OSSL_STORE_CTX *store_ctx)
817 if (OSSL_STORE_error(store_ctx))
835 EVP_PKEY *pkey = NULL;
837#if !defined(HAVE_OPENSSL_STORE_API)
840 BIO *in = BIO_new_file(uri,
"r");
845 pkey = PEM_read_bio_PrivateKey(in, NULL, SSL_CTX_get_default_passwd_cb(ssl_ctx),
846 SSL_CTX_get_default_passwd_cb_userdata(ssl_ctx));
851 OSSL_STORE_CTX *store_ctx = NULL;
852 OSSL_STORE_INFO *info = NULL;
854 UI_METHOD *ui_method = UI_create_method(
"openvpn");
857 msg(
M_WARN,
"OpenSSL UI creation failed");
860 UI_method_set_reader(ui_method, ui_reader);
862 store_ctx = OSSL_STORE_open_ex(uri,
tls_libctx, NULL, ui_method, ssl_ctx, NULL, NULL, NULL);
867 if (OSSL_STORE_expect(store_ctx, OSSL_STORE_INFO_PKEY) != 1)
873 info = OSSL_STORE_load(store_ctx);
874 if (info || OSSL_STORE_eof(store_ctx))
882 clear_ossl_store_error(store_ctx);
888 pkey = OSSL_STORE_INFO_get1_PKEY(info);
889 OSSL_STORE_INFO_free(info);
893 OSSL_STORE_close(store_ctx);
894 UI_destroy_method(ui_method);
908 STACK_OF(X509) *ca = NULL;
915 if (pkcs12_file_inline)
917 BIO *b64 = BIO_new(BIO_f_base64());
918 BIO *bio = BIO_new_mem_buf((
void *)pkcs12_file, (
int)strlen(pkcs12_file));
921 p12 = d2i_PKCS12_bio(b64, NULL);
936 p12 = d2i_PKCS12_fp(fp, NULL);
945 if (!PKCS12_parse(p12,
"", &pkey, &cert, &ca))
950 if (!PKCS12_parse(p12,
password, &pkey, &cert, &ca))
953 "or unsupported/legacy encryption");
954#ifdef ENABLE_MANAGEMENT
955 if (
management && (ERR_GET_REASON(ERR_peek_error()) == PKCS12_R_MAC_VERIFY_FAILURE))
967 if (!SSL_CTX_use_certificate(ctx->
ctx, cert))
974 if (!SSL_CTX_use_PrivateKey(ctx->
ctx, pkey))
980 if (!SSL_CTX_check_private_key(ctx->
ctx))
992 if (ca && sk_X509_num(ca))
994 for (i = 0; i < sk_X509_num(ca); i++)
996 X509_STORE *cert_store = SSL_CTX_get_cert_store(ctx->
ctx);
997 if (!X509_STORE_add_cert(cert_store, sk_X509_value(ca, i)))
1000 "Cannot add certificate to certificate chain (X509_STORE_add_cert)");
1002 if (!SSL_CTX_add_client_CA(ctx->
ctx, sk_X509_value(ca, i)))
1005 "Cannot add certificate to client CA list (SSL_CTX_add_client_CA)");
1017 if (ca && sk_X509_num(ca))
1019 for (i = 0; i < sk_X509_num(ca); i++)
1021 if (!SSL_CTX_add_extra_chain_cert(ctx->
ctx, sk_X509_value(ca, i)))
1025 "Cannot add extra certificate to chain (SSL_CTX_add_extra_chain_cert)");
1033#ifdef ENABLE_CRYPTOAPI
1042 crypto_msg(
M_FATAL,
"Cannot load certificate \"%s\" from Microsoft Certificate Store",
1055 if (!PEM_read_bio_X509(bio, &cert, NULL, NULL))
1061 if (optional && ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE)
1064 (void)ERR_get_error();
1072 if (SSL_CTX_add_extra_chain_cert(ctx->
ctx, cert) != 1)
1084#if defined(HAVE_OPENSSL_STORE_API)
1094#if defined(HAVE_OPENSSL_STORE_API)
1097 OSSL_STORE_CTX *store_ctx = NULL;
1098 OSSL_STORE_INFO *info = NULL;
1102 UI_METHOD *ui_method = UI_create_method(
"openvpn");
1105 msg(
M_WARN,
"OpenSSL UI method creation failed");
1108 UI_method_set_reader(ui_method, ui_reader);
1111 OSSL_STORE_open_ex(uri,
tls_libctx, NULL, ui_method, tls_ctx->
ctx, NULL, NULL, NULL);
1116 if (OSSL_STORE_expect(store_ctx, OSSL_STORE_INFO_CERT) != 1)
1123 info = OSSL_STORE_load(store_ctx);
1124 if (info || OSSL_STORE_eof(store_ctx))
1132 clear_ossl_store_error(store_ctx);
1139 x = OSSL_STORE_INFO_get0_CERT(info);
1146 ret = SSL_CTX_use_certificate(tls_ctx->
ctx, x);
1151 OSSL_STORE_INFO_free(info);
1155 while (!OSSL_STORE_eof(store_ctx))
1157 info = OSSL_STORE_load(store_ctx);
1160 clear_ossl_store_error(store_ctx);
1163 x = OSSL_STORE_INFO_get1_CERT(info);
1164 if (x && SSL_CTX_add_extra_chain_cert(tls_ctx->
ctx, x) != 1)
1170 OSSL_STORE_INFO_free(info);
1185 UI_destroy_method(ui_method);
1186 OSSL_STORE_INFO_free(info);
1187 OSSL_STORE_close(store_ctx);
1202 if (cert_file_inline)
1204 in = BIO_new_mem_buf((
char *)cert_file, -1);
1208 in = BIO_new_file((
char *)cert_file,
"r");
1213 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, ERR_R_SYS_LIB);
1217 x = PEM_read_bio_X509(in, NULL, SSL_CTX_get_default_passwd_cb(ctx->
ctx),
1218 SSL_CTX_get_default_passwd_cb_userdata(ctx->
ctx));
1221 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, ERR_R_PEM_LIB);
1225 ret = SSL_CTX_use_certificate(ctx->
ctx, x);
1235 if (cert_file_inline)
1268 bool priv_key_file_inline)
1270 SSL_CTX *ssl_ctx = NULL;
1272 EVP_PKEY *pkey = NULL;
1279 if (priv_key_file_inline)
1281 in = BIO_new_mem_buf((
char *)priv_key_file, -1);
1286 pkey = PEM_read_bio_PrivateKey(in, NULL, SSL_CTX_get_default_passwd_cb(ctx->
ctx),
1287 SSL_CTX_get_default_passwd_cb_userdata(ctx->
ctx));
1294 if (!pkey || !SSL_CTX_use_PrivateKey(ssl_ctx, pkey))
1296#ifdef ENABLE_MANAGEMENT
1297 if (
management && (ERR_GET_REASON(ERR_peek_error()) == EVP_R_BAD_DECRYPT))
1308 if (!SSL_CTX_check_private_key(ssl_ctx))
1315 EVP_PKEY_free(pkey);
1325 X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx->
ctx);
1334 STACK_OF(X509_OBJECT) *objs = X509_STORE_get0_objects(store);
1335 for (
int i = 0; i < sk_X509_OBJECT_num(objs); i++)
1337 X509_OBJECT *obj = sk_X509_OBJECT_value(objs, i);
1339 if (X509_OBJECT_get_type(obj) == X509_LU_CRL)
1341 sk_X509_OBJECT_delete(objs, i);
1342 X509_OBJECT_free(obj);
1346 X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
1350 in = BIO_new_mem_buf((
char *)crl_file, -1);
1354 in = BIO_new_file(crl_file,
"r");
1363 int num_crls_loaded = 0;
1366 X509_CRL *crl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
1372 bool eof = ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE;
1374 if (num_crls_loaded > 0 && eof)
1377 (void)ERR_get_error();
1386 if (!X509_STORE_add_crl(store, crl))
1396 msg(
M_INFO,
"CRL: loaded %d CRLs from file %s", num_crls_loaded, crl_file);
1402#if defined(ENABLE_MANAGEMENT) && !defined(HAVE_XKEY_PROVIDER)
1406rsa_pub_enc(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1414rsa_pub_dec(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1422rsa_priv_dec(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1435 const RSA_METHOD *meth = RSA_get_method(rsa);
1436 RSA_meth_free((RSA_METHOD *)meth);
1449 case RSA_PKCS1_PADDING:
1450 return "RSA_PKCS1_PADDING";
1452 case RSA_NO_PADDING:
1453 return "RSA_NO_PADDING";
1473 unsigned int siglen,
const char *algorithm)
1475 char *in_b64 = NULL;
1476 char *out_b64 = NULL;
1497rsa_priv_enc(
int flen,
const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding)
1499 int len = RSA_size(rsa);
1501 if (padding != RSA_PKCS1_PADDING && padding != RSA_NO_PADDING)
1503 RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
1509 return (ret == len) ? ret : -1;
1516 RSA_METHOD *rsa_meth;
1520 const RSA *pub_rsa = EVP_PKEY_get0_RSA(pkey);
1524 rsa_meth = RSA_meth_new(
"OpenVPN external private key RSA Method", RSA_METHOD_FLAG_NO_CHECK);
1530 RSA_meth_set_init(rsa_meth, NULL);
1532 RSA_meth_set0_app_data(rsa_meth, NULL);
1538 SSLerr(SSL_F_SSL_USE_PRIVATEKEY, ERR_R_MALLOC_FAILURE);
1543 const BIGNUM *n = NULL;
1544 const BIGNUM *e = NULL;
1545 RSA_get0_key(pub_rsa, &n, &e, NULL);
1546 RSA_set0_key(rsa, BN_dup(n), BN_dup(e), NULL);
1547 RSA_set_flags(rsa, RSA_flags(rsa) | RSA_FLAG_EXT_PKEY);
1548 if (!RSA_set_method(rsa, rsa_meth))
1550 RSA_meth_free(rsa_meth);
1556 if (!SSL_CTX_use_RSAPrivateKey(ctx->
ctx, rsa))
1571 RSA_meth_free(rsa_meth);
1576#if !defined(OPENSSL_NO_EC)
1583 const EC_KEY_METHOD *ec_meth = EC_KEY_get_method(ec);
1584 EC_KEY_METHOD_free((EC_KEY_METHOD *)ec_meth);
1592ecdsa_sign(
int type,
const unsigned char *dgst,
int dgstlen,
unsigned char *sig,
1593 unsigned int *siglen,
const BIGNUM *kinv,
const BIGNUM *r, EC_KEY *ec)
1595 int capacity = ECDSA_size(ec);
1623ecdsa_sign_sig(
const unsigned char *dgst,
int dgstlen,
const BIGNUM *in_kinv,
const BIGNUM *in_r,
1626 ECDSA_SIG *ecsig = NULL;
1627 unsigned int len = ECDSA_size(ec);
1631 if (
ecdsa_sign(0, dgst, dgstlen, buf, &len, NULL, NULL, ec) != 1)
1636 ecsig = d2i_ECDSA_SIG(NULL, (
const unsigned char **)&buf, len);
1647 EVP_PKEY *privkey = NULL;
1648 EC_KEY_METHOD *ec_method;
1652 ec_method = EC_KEY_METHOD_new(EC_KEY_OpenSSL());
1660#ifdef OPENSSL_IS_AWSLC
1666 ec = EC_KEY_dup(EVP_PKEY_get0_EC_KEY(pkey));
1669 EC_KEY_METHOD_free(ec_method);
1672 if (!EC_KEY_set_method(ec, ec_method))
1674 EC_KEY_METHOD_free(ec_method);
1679 privkey = EVP_PKEY_new();
1680 if (!EVP_PKEY_assign_EC_KEY(privkey, ec))
1686 if (!SSL_CTX_use_PrivateKey(ctx->
ctx, privkey))
1692 EVP_PKEY_free(privkey);
1697 EVP_PKEY_free(privkey);
1704#ifdef ENABLE_MANAGEMENT
1712 X509 *cert = SSL_CTX_get0_certificate(ctx->
ctx);
1717 EVP_PKEY *pkey = X509_get0_pubkey(cert);
1720#ifdef HAVE_XKEY_PROVIDER
1721 EVP_PKEY *privkey = xkey_load_management_key(
tls_libctx, pkey);
1722 if (!privkey || !SSL_CTX_use_PrivateKey(ctx->
ctx, privkey))
1724 EVP_PKEY_free(privkey);
1727 EVP_PKEY_free(privkey);
1729#if OPENSSL_VERSION_NUMBER < 0x30000000L
1730 if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA)
1732 if (EVP_PKEY_is_a(pkey,
"RSA"))
1740#if !defined(OPENSSL_NO_EC)
1741#if OPENSSL_VERSION_NUMBER < 0x30000000L
1742 else if (EVP_PKEY_id(pkey) == EVP_PKEY_EC)
1744 else if (EVP_PKEY_is_a(pkey,
"EC"))
1754 crypto_msg(
M_WARN,
"management-external-key requires an RSA or EC certificate");
1781 return X509_NAME_cmp(*a, *b);
1786 const char *ca_path,
bool tls_server)
1788 STACK_OF(X509_INFO) *info_stack = NULL;
1789 STACK_OF(X509_NAME) *cert_names = NULL;
1790 X509_LOOKUP *lookup = NULL;
1791 X509_STORE *store = NULL;
1792 X509_NAME *xn = NULL;
1794 int i, added = 0, prev = 0;
1798 store = SSL_CTX_get_cert_store(ctx->
ctx);
1809 in = BIO_new_mem_buf((
char *)ca_file, -1);
1813 in = BIO_new_file(ca_file,
"r");
1818 info_stack = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL);
1823 for (i = 0; i < sk_X509_INFO_num(info_stack); i++)
1825 X509_INFO *info = sk_X509_INFO_value(info_stack, i);
1828 X509_STORE_add_crl(store, info->crl);
1831 if (tls_server && !info->x509)
1838 X509_STORE_add_cert(store, info->x509);
1847 if (cert_names == NULL)
1856 xn = X509_get_subject_name(info->x509);
1863 if (sk_X509_NAME_find(cert_names, xn) == -1)
1865 xn = X509_NAME_dup(xn);
1870 sk_X509_NAME_push(cert_names, xn);
1876 int cnum = sk_X509_NAME_num(cert_names);
1877 if (cnum != (prev + 1))
1880 "Cannot load CA certificate file %s (entry %d did not validate)",
1886 sk_X509_INFO_pop_free(info_stack, X509_INFO_free);
1891 cnum = sk_X509_NAME_num(cert_names);
1892 SSL_CTX_set_client_CA_list(ctx->
ctx, cert_names);
1897 crypto_msg(
M_FATAL,
"Cannot load CA certificate file %s (no entries were read)",
1906 "Cannot load CA certificate file %s (only %d "
1907 "of %d entries were valid X509 names)",
1918 lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
1919 if (lookup && X509_LOOKUP_add_dir(lookup, ca_path, X509_FILETYPE_PEM))
1921 msg(
M_WARN,
"WARNING: experimental option --capath %s", ca_path);
1927 X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
1933 bool extra_certs_file_inline)
1936 if (extra_certs_file_inline)
1938 in = BIO_new_mem_buf((
char *)extra_certs_file, -1);
1942 in = BIO_new_file(extra_certs_file,
"r");
1971#warning BIO_DEBUG defined
1974static bool biofp_toggle;
1975static time_t biofp_last_open;
1976static const int biofp_reopen_interval = 600;
1991 const time_t current = time(NULL);
1992 const pid_t pid = getpid();
1994 if (biofp_last_open + biofp_reopen_interval < current)
2001 snprintf(fn,
sizeof(fn),
"bio/%d-%d.log", pid, biofp_toggle);
2002 biofp = fopen(fn,
"w");
2004 biofp_last_open = time(NULL);
2010bio_debug_data(
const char *mode, BIO *bio,
const uint8_t *buf,
int len,
const char *desc)
2016 fprintf(biofp,
"BIO_%s %s time=%" PRIi64
" bio=" ptr_format " len=%d data=%s\n", mode, desc,
2024bio_debug_oc(
const char *mode, BIO *bio)
2027 fprintf(biofp,
"BIO %s time=%" PRIi64
" bio=" ptr_format "\n", mode, (int64_t)time(NULL),
2038bio_write(BIO *bio,
const uint8_t *data,
int size,
const char *desc)
2052 bio_debug_data(
"write", bio, data, size, desc);
2054 i = BIO_write(bio, data, size);
2058 if (!BIO_should_retry(bio))
2115 int i = BIO_read(bio,
BPTR(buf), len);
2120 bio_debug_data(
"read", bio,
BPTR(buf), i, desc);
2126 if (!BIO_should_retry(bio))
2156 ks_ssl->
ssl = SSL_new(ssl_ctx->
ctx);
2171 bio_debug_oc(
"open ssl_bio", ks_ssl->
ssl_bio);
2172 bio_debug_oc(
"open ct_in", ks_ssl->
ct_in);
2173 bio_debug_oc(
"open ct_out", ks_ssl->
ct_out);
2178 SSL_set_accept_state(ks_ssl->
ssl);
2182 SSL_set_connect_state(ks_ssl->
ssl);
2186 BIO_set_ssl(ks_ssl->
ssl_bio, ks_ssl->
ssl, BIO_NOCLOSE);
2192 SSL_set_shutdown(ks_ssl->
ssl, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
2201 bio_debug_oc(
"close ssl_bio", ks_ssl->
ssl_bio);
2202 bio_debug_oc(
"close ct_in", ks_ssl->
ct_in);
2203 bio_debug_oc(
"close ct_out", ks_ssl->
ct_out);
2205 BIO_free_all(ks_ssl->
ssl_bio);
2206 SSL_free(ks_ssl->
ssl);
2275 const char *curve =
"";
2276 const char *type =
"(error getting type)";
2284 int typeid = EVP_PKEY_id(pkey);
2285#if OPENSSL_VERSION_NUMBER < 0x30000000L
2286 bool is_ec =
typeid == EVP_PKEY_EC;
2288 bool is_ec = EVP_PKEY_is_a(pkey,
"EC");
2291#ifndef OPENSSL_NO_EC
2302 curve =
"(error getting curve name)";
2308#if OPENSSL_VERSION_NUMBER < 0x30000000L
2309 type = OBJ_nid2sn(
typeid);
2313 if (
typeid == EVP_PKEY_RSA)
2317 else if (
typeid == EVP_PKEY_DSA)
2321 else if (
typeid == EVP_PKEY_EC)
2324 type =
"EC, curve ";
2326 else if (type == NULL)
2328 type =
"unknown type";
2331 type = EVP_PKEY_get0_type_name(pkey);
2334 type =
"(error getting public key type)";
2339 snprintf(buf, buflen,
"%d bits %s%s", EVP_PKEY_bits(pkey), type, curve);
2351 EVP_PKEY *pkey = X509_get_pubkey(cert);
2352 char pkeybuf[64] = { 0 };
2355 char sig[128] = { 0 };
2356 int signature_nid = X509_get_signature_nid(cert);
2357 if (signature_nid != 0)
2359 snprintf(sig,
sizeof(sig),
", signature: %s", OBJ_nid2sn(signature_nid));
2362 snprintf(buf, buflen,
", peer certificate: %s%s", pkeybuf, sig);
2364 EVP_PKEY_free(pkey);
2370 EVP_PKEY *pkey = NULL;
2371 SSL_get_peer_tmp_key(ssl, &pkey);
2377 char pkeybuf[128] = { 0 };
2380 snprintf(buf, buflen,
", peer temporary key: %s", pkeybuf);
2382 EVP_PKEY_free(pkey);
2385#if !defined(LIBRESSL_VERSION_NUMBER) \
2386 || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x3090000fL)
2411 return "(error getting name)";
2415 const char *type = OBJ_nid2sn(nid);
2421 type =
"(error getting name, OBJ_nid2sn failed)";
2436 int peer_sig_type_nid = NID_undef;
2437 const char *peer_sig_unknown =
"unknown";
2438 const char *peer_sig = peer_sig_unknown;
2439 const char *peer_sig_type =
"unknown type";
2448#if !defined(LIBRESSL_VERSION_NUMBER) \
2449 || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x3090000fL)
2452 if (SSL_get_peer_signature_type_nid(ssl, &peer_sig_type_nid) && peer_sig_type_nid != NID_undef)
2458 if (peer_sig == peer_sig_unknown && peer_sig_type_nid == NID_undef)
2463 snprintf(buf, buflen,
", peer signing digest/type: %s %s", peer_sig, peer_sig_type);
2466#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2468print_tls_key_agreement_group(SSL *ssl,
char *buf,
size_t buflen)
2470 const char *groupname = SSL_get0_group_name(ssl);
2473 snprintf(buf, buflen,
", key agreement: (error fetching group)");
2477 snprintf(buf, buflen,
", key agreement: %s", groupname);
2492 const SSL_CIPHER *ciph;
2499 s1[0] = s2[0] = s3[0] = s4[0] = s5[0] = 0;
2500 ciph = SSL_get_current_cipher(ks_ssl->
ssl);
2501 snprintf(s1,
sizeof(s1),
"%s %s, cipher %s %s", prefix, SSL_get_version(ks_ssl->
ssl),
2502 SSL_CIPHER_get_version(ciph), SSL_CIPHER_get_name(ciph));
2503 X509 *cert = SSL_get_peer_certificate(ks_ssl->
ssl);
2512#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2513 print_tls_key_agreement_group(ks_ssl->
ssl, s5,
sizeof(s5));
2524 tls_ctx.
ctx = SSL_CTX_new(SSLv23_method());
2530#if defined(TLS1_3_VERSION)
2533 SSL_CTX_set_min_proto_version(tls_ctx.
ctx, TLS1_3_VERSION);
2539 SSL_CTX_set_max_proto_version(tls_ctx.
ctx, TLS1_2_VERSION);
2545 SSL *ssl = SSL_new(tls_ctx.
ctx);
2551#if OPENSSL_VERSION_NUMBER < 0x1010000fL || defined(OPENSSL_IS_AWSLC) || defined(ENABLE_CRYPTO_WOLFSSL)
2552 STACK_OF(SSL_CIPHER) *sk = SSL_get_ciphers(ssl);
2554 STACK_OF(SSL_CIPHER) *sk = SSL_get1_supported_ciphers(ssl);
2556 for (
int i = 0; i < sk_SSL_CIPHER_num(sk); i++)
2558 const SSL_CIPHER *c = sk_SSL_CIPHER_value(sk, i);
2560 const char *cipher_name = SSL_CIPHER_get_name(c);
2567 printf(
"%s\n", cipher_name);
2569 else if (NULL == pair)
2572 printf(
"%s (No IANA name known to OpenVPN, use OpenSSL name.)\n", cipher_name);
2579#if (OPENSSL_VERSION_NUMBER >= 0x1010000fL)
2580 sk_SSL_CIPHER_free(sk);
2583 SSL_CTX_free(tls_ctx.
ctx);
2593 printf(
"Consider using 'openssl ecparam -list_curves' as alternative to running\n"
2595 "Note this output does only list curves/groups that OpenSSL considers as\n"
2596 "builtin EC curves. It does not list additional curves nor X448 or X25519\n");
2597#ifndef OPENSSL_NO_EC
2598 EC_builtin_curve *curves = NULL;
2602 crv_len = EC_get_builtin_curves(NULL, 0);
2604 if (EC_get_builtin_curves(curves, crv_len))
2606 printf(
"\nAvailable Elliptic curves/groups:\n");
2607 for (n = 0; n < crv_len; n++)
2610 sname = OBJ_nid2sn(curves[n].nid);
2616 printf(
"%s\n", sname);
2625 msg(
M_WARN,
"Your OpenSSL library was built without elliptic curve support. "
2626 "No curves available.");
2633 return OpenSSL_version(OPENSSL_VERSION);
2638#ifdef HAVE_XKEY_PROVIDER
2642 const char *name = OSSL_PROVIDER_get0_name(prov);
2643 OSSL_PROVIDER_load(dest_libctx, name);
2651 OSSL_PROVIDER_unload(prov);
2666#ifdef HAVE_XKEY_PROVIDER
2679 OSSL_PROVIDER_do_all(NULL, provider_load,
tls_libctx);
2682 if (!OSSL_PROVIDER_available(
tls_libctx,
"ovpn.xkey"))
2684 OSSL_PROVIDER_add_builtin(
tls_libctx,
"ovpn.xkey", xkey_provider_init);
2685 if (!OSSL_PROVIDER_load(
tls_libctx,
"ovpn.xkey"))
2687 msg(
M_NONFATAL,
"ERROR: failed loading external key provider: "
2688 "Signing with external keys will not work.");
2698 EVP_set_default_properties(
tls_libctx,
"?provider!=ovpn.xkey");
2709#ifdef HAVE_XKEY_PROVIDER
2712 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.
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)