15#ifndef OPENVPN_MBEDTLS_SSL_SSLCTX_H
16#define OPENVPN_MBEDTLS_SSL_SSLCTX_H
24#include <mbedtls/ssl.h>
25#include <mbedtls/oid.h>
26#include <mbedtls/sha1.h>
27#include <mbedtls/debug.h>
28#include <mbedtls/asn1.h>
29#include <mbedtls/version.h>
59namespace mbedtls_ctx_private {
62#if MBEDTLS_VERSION_NUMBER < 0x03000000
74const int ciphersuites[] =
77 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
78 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
79 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
80 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
82 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
83 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
86 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
87 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
88 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
89 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
91 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
92 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
95 MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
96 MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
98 MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
101 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384,
102 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256,
103 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA,
104 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
105 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,
106 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
108 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
109 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
110 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
113 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256,
114 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256,
115 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA,
116 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
117 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,
118 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
120 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
121 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
122 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
125 MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA,
126 MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
128 MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
137#ifdef OPENVPN_ALLOW_INSECURE_CERTPROFILE
141const mbedtls_x509_crt_profile crt_profile_insecure =
143 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_MD5)
144 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1)
145 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_RIPEMD160)
146 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224)
147 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256)
148 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384)
149 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512),
156const mbedtls_x509_crt_profile crt_profile_legacy =
158 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1)
159 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_RIPEMD160)
160 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224)
161 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256)
162 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384)
163 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512),
169const mbedtls_x509_crt_profile crt_profile_preferred =
171 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256)
172 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384)
173 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512),
274 void load_ca(
const std::string &ca_txt,
bool strict)
override
277 c->parse(ca_txt,
"ca", strict);
299 if (!extra_certs_txt.empty())
300 c->parse(extra_certs_txt,
"extra-certs",
true);
312 void load_dh(
const std::string &dh_txt)
override
315 mydh->parse(dh_txt,
"server-config");
322 return std::string();
329 return std::string();
336 return std::string();
343 return std::vector<std::string>();
350 return std::string();
357 return std::string();
358 return dh->extract();
426 if (!
override.empty())
500 && opt.
exists(
"client-cert-not-required"))
505 const std::string name = opt.
get_optional(
"sni", 1, 256);
512 std::string ca_txt = opt.
cat(
"ca");
514 ca_txt += opt.
cat(
"relay-extra-ca");
520 const std::string crl_txt = opt.
cat(
"crl-verify");
521 if (!crl_txt.empty())
531 const std::string ec_txt = opt.
cat(
"extra-certs");
551 std::string relay_prefix;
553 relay_prefix =
"relay-";
571#if defined(MBEDTLS_SSL_MAJOR_VERSION_3) && defined(MBEDTLS_SSL_MINOR_VERSION_3)
573#elif defined(MBEDTLS_SSL_MAJOR_VERSION_3) && defined(MBEDTLS_SSL_MINOR_VERSION_2)
585 if (opt.
exists(
"tls-cipher"))
588 if (opt.
exists(
"tls-groups"))
596#ifdef OPENVPN_JSON_INTERNAL
597 SSLConfigAPI::Ptr json_override(
const Json::Value &root,
const bool load_cert_key)
const override
628#ifdef OPENVPN_ALLOW_INSECURE_CERTPROFILE
629 case TLSCertProfile::INSECURE:
630 return &mbedtls_ctx_private::crt_profile_insecure;
633 return &mbedtls_ctx_private::crt_profile_legacy;
635 return &mbedtls_ctx_private::crt_profile_preferred;
637 return &mbedtls_x509_crt_profile_suiteb;
660 std::vector<unsigned int>
ku;
692 mbedtls_ssl_handshake(
ssl);
697 const int status = mbedtls_ssl_write(
ssl, (
const unsigned char *)data, size);
715 const int status = mbedtls_ssl_read(
ssl, (
unsigned char *)data, capacity);
720 else if (status == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)
731 throw ssl_ciphertext_in_overflow();
769 const char *ver = mbedtls_ssl_get_version(
ssl);
770 const char *cs = mbedtls_ssl_get_ciphersuite(
ssl);
772 return ver + std::string(
"/") + cs;
809 int endpoint, status;
817 endpoint = MBEDTLS_SSL_IS_SERVER;
821 endpoint = MBEDTLS_SSL_IS_CLIENT;
826 sslconf =
new mbedtls_ssl_config;
827 mbedtls_ssl_config_init(
sslconf);
828 mbedtls_ssl_config_defaults(
sslconf,
830 MBEDTLS_SSL_TRANSPORT_STREAM,
831 MBEDTLS_SSL_PRESET_DEFAULT);
837 ssl =
new mbedtls_ssl_context;
838 mbedtls_ssl_init(
ssl);
841#if MBEDTLS_VERSION_NUMBER > 0x03000000
842 mbedtls_ssl_protocol_version version;
847 version = MBEDTLS_SSL_VERSION_TLS1_2;
851 version = MBEDTLS_SSL_VERSION_TLS1_3;
854 mbedtls_ssl_conf_min_tls_version(
sslconf, version);
860#if defined(MBEDTLS_SSL_MAJOR_VERSION_3) && defined(MBEDTLS_SSL_MINOR_VERSION_1)
862 major = MBEDTLS_SSL_MAJOR_VERSION_3;
863 minor = MBEDTLS_SSL_MINOR_VERSION_1;
866#if defined(MBEDTLS_SSL_MAJOR_VERSION_3) && defined(MBEDTLS_SSL_MINOR_VERSION_2)
868 major = MBEDTLS_SSL_MAJOR_VERSION_3;
869 minor = MBEDTLS_SSL_MINOR_VERSION_2;
872#if defined(MBEDTLS_SSL_MAJOR_VERSION_3) && defined(MBEDTLS_SSL_MINOR_VERSION_3)
875 major = MBEDTLS_SSL_MAJOR_VERSION_3;
876 minor = MBEDTLS_SSL_MINOR_VERSION_3;
880 mbedtls_ssl_conf_min_version(
sslconf, major, minor);
884 mbedtls_ssl_conf_max_version(
sslconf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);
897 authmode = MBEDTLS_SSL_VERIFY_NONE;
901 authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
903 mbedtls_ssl_conf_authmode(
sslconf, authmode);
916 mbedtls_ssl_conf_renegotiation(
sslconf, MBEDTLS_SSL_RENEGOTIATION_DISABLED);
924#if MBEDTLS_VERSION_NUMBER < 0x03000000
926 mbedtls_ssl_conf_ciphersuites(
sslconf, mbedtls_ctx_private::ciphersuites);
936 mbedtls_ssl_conf_ca_chain(
sslconf,
948 if (mbedtls_ssl_set_hostname(
ssl, hostname))
960 if (mbedtls_pk_get_type(&c.
crt_chain.
get()->get()->pk) == MBEDTLS_PK_RSA)
967 throw MbedTLSException(
"cert has unsupported type for external pki support");
986 status = mbedtls_ssl_conf_dh_param_ctx(
sslconf, c.
dh->
get());
1015#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
1016 mbedtls_ssl_conf_cbc_record_splitting(
sslconf,
1017 MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED);
1034 std::unique_ptr<mbedtls_ecp_group_id[]>
groups;
1042 auto num_ciphers = std::count(cipher_list.begin(), cipher_list.end(),
':') + 1;
1046 std::stringstream cipher_list_ss(cipher_list);
1047 std::string ciphersuite;
1050 while (std::getline(cipher_list_ss, ciphersuite,
':'))
1054 if (pair && pair->
iana_name != ciphersuite)
1061 auto cipher_id = mbedtls_ssl_get_ciphersuite_id(ciphersuite.c_str());
1071 OVPN_LOG_INFO(
"mbed TLS -- warning ignoring unknown cipher suite '"
1072 << ciphersuite <<
"' in tls-cipher");
1083 auto num_groups = std::count(tls_groups.begin(), tls_groups.end(),
':') + 1;
1086 groups.reset(
new mbedtls_ecp_group_id[num_groups + 1]);
1088 std::stringstream groups_ss(tls_groups);
1092 while (std::getline(groups_ss, group,
':'))
1094 const mbedtls_ecp_curve_info *ci = mbedtls_ecp_curve_info_from_name(group.c_str());
1103 OVPN_LOG_INFO(
"mbed TLS -- warning ignoring unknown group '"
1104 << group <<
"' in tls-groups");
1108 groups[i] = MBEDTLS_ECP_DP_NONE;
1118 const size_t actual = self->
ct_in.
read(data, length);
1151 static void dbg_callback(
void *arg,
int level,
const char *filename,
int linenum,
const char *text)
1154 if (level <= self->
config->ssl_debug_level)
1155 OPENVPN_LOG_NTNL(
"mbed TLS[" << filename <<
":" << linenum <<
" " << level <<
"]: "
1172 mbedtls_ssl_free(
ssl);
1173 mbedtls_ssl_config_free(
sslconf);
1206 return SSL::Ptr(
new SSL(
this, hostname ? hostname->c_str() :
nullptr));
1226 static void load_cert_info_into_authcert(
AuthCert &authcert,
const std::string &
cert_txt)
1270#if MBEDTLS_VERSION_NUMBER < 0x03000000
1272 return bool(cert->ns_cert_type & MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER);
1274 return bool(cert->ns_cert_type & MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT);
1291 for (std::vector<unsigned int>::const_iterator i =
config->
ku.begin(); i !=
config->
ku.end(); ++i)
1293 if (mbedtls_x509_crt_check_key_usage(cert, *i))
1311 mbedtls_x509_sequence *oid_seq = &cert->ext_key_usage;
1312 while (oid_seq !=
nullptr)
1314 mbedtls_x509_buf *oid = &oid_seq->buf;
1318 const char *oid_str;
1319 const int status = mbedtls_oid_get_extended_key_usage(oid, &oid_str);
1320 if (status >= 0 &&
config->
eku == oid_str)
1326 char oid_num_str[256];
1327 const int status = mbedtls_oid_get_numeric_string(oid_num_str,
sizeof(oid_num_str), oid);
1328 if (status >= 0 &&
config->
eku == oid_num_str)
1331 oid_seq = oid_seq->next;
1339 std::ostringstream os;
1340 std::string status_str =
"OK";
1345 <<
" : depth=" << depth
1366#if MBEDTLS_VERSION_NUMBER < 0x03000000
1367 if (cert->sig_md == MBEDTLS_MD_MD5)
1372 if (cert->sig_md == MBEDTLS_MD_SHA1)
1384 OVPN_LOG_INFO(
"VERIFY FAIL -- bad ns-cert-type in leaf certificate");
1391 OVPN_LOG_INFO(
"VERIFY FAIL -- bad X509 key usage in leaf certificate");
1398 OVPN_LOG_INFO(
"VERIFY FAIL -- bad X509 extended key usage in leaf certificate");
1443 *
flags |= MBEDTLS_X509_BADCERT_OTHER;
1465 else if (depth == 0)
1470 OVPN_LOG_INFO(
"VERIFY FAIL -- bad ns-cert-type in leaf certificate");
1477 OVPN_LOG_INFO(
"VERIFY FAIL -- bad X509 key usage in leaf certificate");
1484 OVPN_LOG_INFO(
"VERIFY FAIL -- bad X509 extended key usage in leaf certificate");
1496 ssl->authcert->defined_ =
true;
1501 *
flags |= MBEDTLS_X509_BADCERT_OTHER;
1508 static std::string
cert_info(
const mbedtls_x509_crt *cert,
const char *prefix =
nullptr)
1510 const size_t buf_size = 4096;
1511 std::unique_ptr<char[]> buf(
new char[buf_size]);
1512 const int size = mbedtls_x509_crt_info(buf.get(), buf_size, prefix ? prefix :
"", cert);
1514 return std::string(buf.get());
1516 return "error rendering cert";
1524#
if MBEDTLS_VERSION_NUMBER < 0x03000000
1528 const unsigned char *
input,
1529 unsigned char *output,
1530 size_t output_max_len)
1532 OVPN_LOG_INFO(
"MbedTLSContext::epki_decrypt is unimplemented"
1533 <<
" output_max_len=" << output_max_len);
1535 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
1539 int (*f_rng)(
void *,
unsigned char *,
size_t),
1541#
if MBEDTLS_VERSION_NUMBER < 0x03000000
1544 mbedtls_md_type_t md_alg,
1545 unsigned int hashlen,
1546 const unsigned char *hash,
1552#if MBEDTLS_VERSION_NUMBER < 0x03000000
1553 if (
mode == MBEDTLS_RSA_PRIVATE)
1558 size_t digest_prefix_len = 0;
1559 const unsigned char *digest_prefix =
nullptr;
1564 case MBEDTLS_MD_NONE:
1566 case MBEDTLS_MD_MD5:
1567 digest_prefix = PKCS1::DigestPrefix::MD5;
1568 digest_prefix_len =
sizeof(PKCS1::DigestPrefix::MD5);
1570 case MBEDTLS_MD_SHA1:
1571 digest_prefix = PKCS1::DigestPrefix::SHA1;
1572 digest_prefix_len =
sizeof(PKCS1::DigestPrefix::SHA1);
1574 case MBEDTLS_MD_SHA256:
1575 digest_prefix = PKCS1::DigestPrefix::SHA256;
1576 digest_prefix_len =
sizeof(PKCS1::DigestPrefix::SHA256);
1578 case MBEDTLS_MD_SHA384:
1579 digest_prefix = PKCS1::DigestPrefix::SHA384;
1580 digest_prefix_len =
sizeof(PKCS1::DigestPrefix::SHA384);
1582 case MBEDTLS_MD_SHA512:
1583 digest_prefix = PKCS1::DigestPrefix::SHA512;
1584 digest_prefix_len =
sizeof(PKCS1::DigestPrefix::SHA512);
1587 OVPN_LOG_INFO(
"MbedTLSContext::epki_sign unrecognized hash_id"
1588#
if MBEDTLS_VERSION_NUMBER < 0x03000000
1591 <<
" md_alg=" << md_alg <<
" hashlen=" << hashlen);
1592 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
1597 if (digest_prefix_len)
1598 from_buf.
write(digest_prefix, digest_prefix_len);
1599 from_buf.
write(hash, hashlen);
1605 std::string sig_b64;
1611 const size_t len = self->
key_len();
1612 Buffer sigbuf(sig, len,
false);
1616 if (sigbuf.
size() != len)
1624 OVPN_LOG_INFO(
"MbedTLSContext::epki_sign unrecognized parameters"
1625#
if MBEDTLS_VERSION_NUMBER < 0x03000000
1628 <<
" md_alg=" << md_alg <<
" hashlen=" << hashlen);
1629 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
1632 catch (
const std::exception &e)
1634 OPENVPN_LOG(
"MbedTLSContext::epki_sign exception: " << e.what());
1635 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
1647 const mbedtls_x509_buf *s = &cert->serial;
1648 if (s->len > 0 && s->len <= authcert.
serial.
size())
1650 const size_t offset = authcert.
serial.
size() - s->len;
1652 std::memcpy(authcert.
serial.
number() + offset, s->p, s->len);
1658 const int SHA_DIGEST_LEN = 20;
1660#if MBEDTLS_VERSION_NUMBER < 0x02070000
1666 mbedtls_sha1(cert->raw.p, cert->raw.len, authcert->
issuer_fp);
1667#elif MBEDTLS_VERSION_NUMBER < 0x03000000
1668 if (mbedtls_sha1_ret(cert->raw.p, cert->raw.len, authcert.
issuer_fp))
1672 if (mbedtls_sha1(cert->raw.p, cert->raw.len, authcert.
issuer_fp))
1681 unsigned int ver = mbedtls_version_get_number();
1682 std::string version =
"mbed TLS "
1683 + std::to_string((ver >> 24) & 0xff)
1684 +
"." + std::to_string((ver >> 16) & 0xff)
1685 +
"." + std::to_string((ver >> 8) & 0xff);
const std::uint8_t * number() const
static constexpr size_t size()
std::uint8_t issuer_fp[20]
std::string encode(const V &data) const
size_t decode(void *data, size_t len, const std::string &str) const
size_t size() const
Returns the size of the buffer in T objects.
void write(const T *data, const size_t size)
Write data to the buffer.
virtual bool sign(const std::string &alias, const std::string &data, std::string &sig, const std::string &algorithm, const std::string &hashalg, const std::string &saltlen)=0
std::string validate_dh(const std::string &dh_txt) const override
void set_private_key_password(const std::string &pwd) override
void set_tls_version_min_override(const std::string &override) override
SSLFactoryAPI::Ptr new_factory() override
friend class MbedTLSContext
MbedTLSPKI::PKContext::Ptr priv_key
void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias) override
std::string validate_crl(const std::string &crl_txt) const override
void set_client_session_tickets(const bool v) override
void set_ns_cert_type(const NSCert::Type ns_cert_type_arg) override
void set_tls_version_min(const TLSVersion::Type tvm) override
const Mode & get_mode() const override
void enable_legacy_algorithms(const bool v) override
void set_tls_cert_profile(const TLSCertProfile::Type type) override
std::string tls_cipher_list
void set_rng(const StrongRandomAPI::Ptr &rng_arg) override
const mbedtls_x509_crt_profile * select_crt_profile() const
void set_tls_cert_profile_override(const std::string &override) override
void load_cert(const std::string &cert_txt) override
ExternalPKIBase * external_pki
std::string extract_private_key() const override
void set_tls_remote(const std::string &tls_remote_arg) override
void load_ca(const std::string &ca_txt, bool strict) override
std::string external_pki_alias
std::string validate_cert_list(const std::string &certs_txt) const override
virtual void set_tls_ciphersuite_list(const std::string &override)
void set_session_ticket_handler(TLSSessionTicketBase *session_ticket_handler_arg) override
void load_private_key(const std::string &key_txt) override
std::string validate_cert(const std::string &cert_txt) const override
std::string extract_crl() const override
TLSCertProfile::Type tls_cert_profile
virtual void set_tls_cipher_list(const std::string &override)
void set_cn_reject_handler(CommonNameReject *cn_reject_handler_arg) override
void set_tls_version_max(const TLSVersion::Type tvm) override
void load_dh(const std::string &dh_txt) override
MbedTLSPKI::X509CRL::Ptr crl_chain
void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt) override
void set_x509_track(X509Track::ConfigSet x509_track_config_arg) override
std::vector< std::string > extract_extra_certs() const override
std::string extract_cert() const override
std::string validate_private_key(const std::string &key_txt) const override
void load_crl(const std::string &crl_txt) override
void set_flags(const unsigned int flags_arg) override
MbedTLSPKI::X509Cert::Ptr crt_chain
VerifyX509Name verify_x509_name
void set_sni_handler(SNI::HandlerBase *sni_handler) override
void set_frame(const Frame::Ptr &frame_arg) override
X509Track::ConfigSet x509_track_config
std::vector< unsigned int > ku
MbedTLSRandom * get_mbed_random_class() const
void set_sni_name(const std::string &sni_name_arg) override
PKType::Type private_key_type() const override
void set_remote_cert_tls(const KUParse::TLSWebType wt) override
MbedTLSPKI::X509Cert::Ptr ca_chain
std::string extract_dh() const override
void set_debug_level(const int debug_level) override
NSCert::Type ns_cert_type
void set_mode(const Mode &mode_arg) override
virtual void set_tls_groups(const std::string &groups)
TLSVersion::Type tls_version_min
void load(const OptionList &opt, const unsigned int lflags) override
size_t private_key_length() const override
void set_local_cert_enabled(const bool v) override
std::string extract_ca() const override
MbedTLSContext * parent
Hold the array that is used for setting the curves.
ssize_t read_cleartext(void *data, const size_t capacity) override
std::unique_ptr< int[]> allowed_ciphers
void write_ciphertext_unbuffered(const unsigned char *data, const size_t size) override
mbedtls_ssl_config * sslconf
static int ct_write_func(void *arg, const unsigned char *data, size_t length)
void set_mbedtls_groups(const std::string &tls_groups)
void start_handshake() override
ssize_t write_cleartext_unbuffered(const void *data, const size_t size) override
std::unique_ptr< mbedtls_ecp_group_id[]> groups
Hold the array that is used for setting the allowed ciphers.
void set_mbedtls_cipherlist(const std::string &cipher_list)
MbedTLSPKI::PKContext epki_ctx
void write_ciphertext(const BufferPtr &buf) override
bool export_keying_material(const std::string &label, unsigned char *, size_t size) override
SSL(MbedTLSContext *ctx, const char *hostname)
const AuthCert::Ptr & auth_cert() const override
static int rng_callback(void *arg, unsigned char *data, size_t len)
static void dbg_callback(void *arg, int level, const char *filename, int linenum, const char *text)
bool read_ciphertext_ready() const override
mbedtls_ssl_context * ssl
static int ct_read_func(void *arg, unsigned char *data, size_t length)
bool did_full_handshake() override
bool read_cleartext_ready() const override
std::string ssl_handshake_details() const override
BufferPtr read_ciphertext() override
void mark_no_cache() override
static void load_serial_number_into_authcert(AuthCert &authcert, const mbedtls_x509_crt *cert)
bool x509_cert_ku_defined() const
SSLAPI::Ptr ssl() override
bool x509_cert_eku_defined() const
bool verify_ns_cert_type(const mbedtls_x509_crt *cert) const
static int verify_callback_server(void *arg, mbedtls_x509_crt *cert, int depth, uint32_t *flags)
bool verify_x509_cert_ku(const mbedtls_x509_crt *cert)
MbedTLSContext(Config *config_arg)
static constexpr bool support_key_material_export()
static int verify_callback_client(void *arg, mbedtls_x509_crt *cert, int depth, uint32_t *flags)
SSLLib::Ctx libctx() override
const Mode & mode() const override
bool ns_cert_type_defined() const
static int epki_decrypt(void *arg, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len)
SSLAPI::Ptr ssl(const std::string *hostname, const std::string *cache_key) override
static int epki_sign(void *arg, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig)
static bool load_issuer_fingerprint_into_authcert(AuthCert &authcert, const mbedtls_x509_crt *cert)
virtual ~MbedTLSContext()
RCPtr< MbedTLSContext > Ptr
bool verify_x509_cert_eku(mbedtls_x509_crt *cert)
static size_t epki_key_len(void *arg)
static std::string cert_info(const mbedtls_x509_crt *cert, const char *prefix=nullptr)
static std::string status_string(const mbedtls_x509_crt *cert, const int depth, const uint32_t *flags)
static std::string mbedtls_verify_flags_errtext(const uint32_t flags)
void epki_enable(void *arg, mbedtls_pk_rsa_alt_decrypt_func epki_decrypt, mbedtls_pk_rsa_alt_sign_func epki_sign, mbedtls_pk_rsa_alt_key_len_func epki_key_len)
mbedtls_pk_context * get() const
void write_buf(const BufferPtr &bp)
void set_frame(const Frame::Ptr &frame)
void write(const unsigned char *data, size_t size)
size_t read(unsigned char *data, size_t len)
std::string get_optional(const std::string &name, size_t index, const size_t max_len) const
std::string cat(const std::string &name) const
const Option & get(const std::string &name) const
bool exists(const std::string &name) const
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
T * get() const noexcept
Returns the raw pointer to the object T, or nullptr.
virtual bool rand_bytes_noexcept(unsigned char *buf, size_t size)=0
Fill a buffer with random bytes without throwing exceptions.
@ LF_ALLOW_CLIENT_CERT_NOT_REQUIRED
RCPtr< SSLFactoryAPI > Ptr
void init(const OptionList &opt, const std::string &relay_prefix)
bool verify(const std::string &value) const
@ VERIFY_X509_SUBJECT_RDN_PREFIX
@ VERIFY_X509_SUBJECT_RDN
#define OPENVPN_LOG_NTNL(args)
#define OPENVPN_LOG(args)
#define OVPN_LOG_INFO(args)
static int mbedtls_x509_crt_has_ext_type(const mbedtls_x509_crt *crt, int ext_type)
#define MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE
void remote_cert_ku(const OptionList &opt, const std::string &relay_prefix, std::vector< unsigned int > &ku)
void remote_cert_tls(const TLSWebType wt, std::vector< unsigned int > &ku, std::string &eku)
void remote_cert_eku(const OptionList &opt, const std::string &relay_prefix, std::string &eku)
static std::string x509_get_common_name(const mbedtls_x509_crt *cert)
static std::string x509_get_subject(const mbedtls_x509_crt *cert, bool new_format=false)
Type ns_cert_type(const std::string &ct)
void apply_override(Type &type, const std::string &override)
Type default_if_undef(const Type type)
Type parse_tls_cert_profile(const std::string &profile_name)
std::string sanitize_x509_name(const std::string &str)
bool test(const std::string &tls_remote, const std::string &subject, const std::string &common_name)
std::string sanitize_common_name(const std::string &str)
void log(const std::string &tls_remote, const std::string &subject, const std::string &common_name)
void apply_override(Type &tvm, const std::string &override)
Type parse_tls_version_min(const std::string &ver, const bool or_highest, const Type max_version)
Support deferred server-side state creation when client connects.
const tls_cipher_name_pair * tls_get_cipher_name_pair(const std::string &ciphername)
SSLFactoryAPI::ssl_external_pki ssl_external_pki
const std::string get_ssl_library_version()
const char * openssl_name
const std::string cert_txt
static const char * input[]