36#if defined(ENABLE_CRYPTO_MBEDTLS)
50#include <mbedtls/debug.h>
51#include <mbedtls/error.h>
52#include <mbedtls/net_sockets.h>
53#include <mbedtls/version.h>
55#include <mbedtls/oid.h>
56#include <mbedtls/pem.h>
58static const mbedtls_x509_crt_profile openvpn_x509_crt_profile_legacy = {
60 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_RIPEMD160)
61 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256)
62 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512),
68static const mbedtls_x509_crt_profile openvpn_x509_crt_profile_preferred = {
70 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256)
71 | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512),
77#define openvpn_x509_crt_profile_suiteb mbedtls_x509_crt_profile_suiteb;
96#if MBEDTLS_VERSION_NUMBER < 0x04000000
114 mbedtls_x509_crt_free(ctx->
ca_chain);
120#if MBEDTLS_VERSION_NUMBER < 0x04000000
121 mbedtls_dhm_free(ctx->
dhm_ctx);
125 mbedtls_x509_crl_free(ctx->
crl);
128#if defined(ENABLE_PKCS11)
132 if (ctx->pkcs11_cert)
134 pkcs11h_certificate_freeCertificate(ctx->pkcs11_cert);
156#if !defined(MBEDTLS_SSL_KEYING_MATERIAL_EXPORT)
165mbedtls_ssl_export_keys_cb(
void *p_expkey, mbedtls_ssl_key_export_type type,
166 const unsigned char *secret,
size_t secret_len,
167 const unsigned char client_random[32],
168 const unsigned char server_random[32],
169 mbedtls_tls_prf_types tls_prf_type)
173 if (type != MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET)
186 msg(
M_FATAL,
"ERROR: Incorrect TLS 1.2 master secret length: Got %zu, expected %zu",
200 void *ekm,
size_t ekm_size)
202 ASSERT(strlen(label) == label_size);
204#if defined(MBEDTLS_SSL_KEYING_MATERIAL_EXPORT)
209 mbedtls_ssl_export_keying_material(ctx, ekm, ekm_size, label, label_size, NULL, 0, 0)))
251tls_translate_cipher_name(
const char *cipher_name)
261 if (0 != strcmp(cipher_name, pair->
iana_name))
264 msg(
M_WARN,
"Deprecated cipher suite name '%s', please use IANA name '%s'",
281 "mbed TLS does not support setting tls-ciphersuites. "
282 "Ignoring TLS 1.3 cipher list: %s",
289 char *tmp_ciphers, *tmp_ciphers_orig, *token;
307 tmp_ciphers_orig = tmp_ciphers =
string_alloc(ciphers, NULL);
309 token =
strtok_r(tmp_ciphers, ":", &lasts);
312 ctx->
allowed_ciphers[i] = mbedtls_ssl_get_ciphersuite_id(tls_translate_cipher_name(token));
317 token =
strtok_r(NULL,
":", &lasts);
319 free(tmp_ciphers_orig);
325 if (!profile || 0 == strcmp(profile,
"legacy") || 0 == strcmp(profile,
"insecure"))
329 else if (0 == strcmp(profile,
"preferred"))
333 else if (0 == strcmp(profile,
"suiteb"))
339 msg(
M_FATAL,
"ERROR: Invalid cert profile: %s", profile);
343#if MBEDTLS_VERSION_NUMBER >= 0x04000000
344static const mbedtls_ecp_curve_info ecp_curve_info_table[] = {
346#if defined(PSA_WANT_ECC_SECP_R1_256)
347 {
"secp256r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1 },
349#if defined(PSA_WANT_ECC_SECP_R1_384)
350 {
"secp384r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1 },
352#if defined(PSA_WANT_ECC_SECP_R1_521)
353 {
"secp521r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1 },
357#if defined(PSA_WANT_ECC_MONTGOMERY_255)
358 {
"X25519", MBEDTLS_SSL_IANA_TLS_GROUP_X25519 },
362#if defined(PSA_WANT_ECC_MONTGOMERY_448)
363 {
"X448", MBEDTLS_SSL_IANA_TLS_GROUP_X448 },
367#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
368 {
"brainpoolP256r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1 },
370#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
371 {
"brainpoolP384r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1 },
373#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
374 {
"brainpoolP512r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1 },
378#if defined(PSA_WANT_DH_RFC7919_2048)
379 {
"ffdhe2048", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048 },
381#if defined(PSA_WANT_DH_RFC7919_3072)
382 {
"ffdhe3072", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072 },
384#if defined(PSA_WANT_DH_RFC7919_4096)
385 {
"ffdhe4096", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096 },
387#if defined(PSA_WANT_DH_RFC7919_6144)
388 {
"ffdhe6144", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144 },
390#if defined(PSA_WANT_DH_RFC7919_8192)
391 {
"ffdhe8192", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192 },
394static const size_t ecp_curve_info_table_items =
sizeof(ecp_curve_info_table) /
sizeof(mbedtls_ecp_curve_info);
396static const mbedtls_ecp_curve_info *
397mbedtls_ecp_curve_info_from_name(
const char *name)
399 for (
size_t i = 0; i < ecp_curve_info_table_items; i++)
401 if (strcmp(name, ecp_curve_info_table[i].name) == 0)
403 return &ecp_curve_info_table[i];
425 while ((token =
strsep(&tmp_groups, ":")))
427 const mbedtls_ecp_curve_info *ci = mbedtls_ecp_curve_info_from_name(token);
430 msg(
M_WARN,
"Warning unknown curve/group specified: %s", token);
434 ctx->
groups[i] = ci->tls_id;
442 msg(
M_FATAL,
"Error: All groups in \"%s\" are invalid or unsupported.", groups);
463 if (mbedtls_x509_time_is_future(&ctx->
crt_chain->valid_from))
465 msg(
M_WARN,
"WARNING: Your certificate is not yet valid!");
468 if (mbedtls_x509_time_is_past(&ctx->
crt_chain->valid_to))
470 msg(
M_WARN,
"WARNING: Your certificate has expired!");
477#if MBEDTLS_VERSION_NUMBER < 0x04000000
480 if (!
mbed_ok(mbedtls_dhm_parse_dhm(ctx->
dhm_ctx, (
const unsigned char *)dh_file,
481 strlen(dh_file) + 1)))
483 msg(
M_FATAL,
"Cannot read inline DH parameters");
490 msg(
M_FATAL,
"Cannot read DH parameters from file %s", dh_file);
497 if (strcmp(dh_file,
"none") != 0)
499 msg(
M_FATAL,
"Mbed TLS 4 only supports pre-defined Diffie-Hellman groups.");
507 if (NULL != curve_name)
509 msg(
M_WARN,
"WARNING: mbed TLS builds do not support specifying an "
510 "ECDH curve with --ecdh-curve, using default curves. Use "
511 "--tls-groups to specify curves.");
519 msg(
M_FATAL,
"PKCS #12 files not yet supported for mbed TLS.");
523#ifdef ENABLE_CRYPTOAPI
527 msg(
M_FATAL,
"Windows CryptoAPI not yet supported for mbed TLS.");
545 msg(
M_FATAL,
"Cannot load inline certificate: NULL");
547 if (!
mbed_ok(mbedtls_x509_crt_parse(ctx->
crt_chain, (
const unsigned char *)cert_file,
548 strlen(cert_file) + 1)))
550 msg(
M_FATAL,
"Cannot load inline certificate");
557 msg(
M_FATAL,
"Cannot load certificate file %s", cert_file);
576 strlen(priv_key_file) + 1, NULL, 0);
578 if (MBEDTLS_ERR_PK_PASSWORD_REQUIRED ==
status)
583 ctx->
priv_key, (
const unsigned char *)priv_key_file, strlen(priv_key_file) + 1,
590 if (MBEDTLS_ERR_PK_PASSWORD_REQUIRED ==
status)
599#ifdef ENABLE_MANAGEMENT
605 msg(
M_WARN,
"Cannot load private key file %s",
612 msg(
M_WARN,
"Private key does not match the certificate");
619#if MBEDTLS_VERSION_NUMBER < 0x04000000
639external_pkcs1_sign(
void *ctx_voidptr,
int (*f_rng)(
void *,
unsigned char *,
size_t),
void *p_rng,
640 mbedtls_md_type_t md_alg,
unsigned int hashlen,
const unsigned char *
hash,
645 size_t asn_len = 0, oid_size = 0;
646 const char *oid = NULL;
650 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
659 if (md_alg != MBEDTLS_MD_NONE)
661 const mbedtls_md_info_t *
md_info = mbedtls_md_info_from_type(md_alg);
664 return (MBEDTLS_ERR_RSA_BAD_INPUT_DATA);
667 if (!
mbed_ok(mbedtls_oid_get_oid_by_md(md_alg, &oid, &oid_size)))
669 return (MBEDTLS_ERR_RSA_BAD_INPUT_DATA);
672 hashlen = mbedtls_md_get_size(
md_info);
673 asn_len = 10 + oid_size;
677 || (asn_len + hashlen) > UINT8_MAX)
679 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
682 uint8_t *to_sign = NULL;
684 uint8_t *p = to_sign;
685 if (md_alg != MBEDTLS_MD_NONE)
696 *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;
697 *p++ = (uint8_t)(0x08 + oid_size + hashlen);
698 *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;
699 *p++ = (uint8_t)(0x04 + oid_size);
700 *p++ = MBEDTLS_ASN1_OID;
701 *p++ = (uint8_t)oid_size;
702 memcpy(p, oid, oid_size);
704 *p++ = MBEDTLS_ASN1_NULL;
706 *p++ = MBEDTLS_ASN1_OCTET_STRING;
707 *p++ = (uint8_t)hashlen;
710 ASSERT(asn_len == (uintptr_t)(p - to_sign));
714 memcpy(p,
hash, hashlen);
719 rv = MBEDTLS_ERR_RSA_PRIVATE_FAILED;
731external_key_len(
void *vctx)
743#if MBEDTLS_VERSION_NUMBER >= 0x04000000
744 msg(
M_WARN,
"tls_ctx_use_external_signing_func is not implemented for Mbed TLS 4.");
751 msg(
M_WARN,
"ERROR: external key requires a certificate.");
755 if (mbedtls_pk_get_type(&ctx->
crt_chain->pk) != MBEDTLS_PK_RSA)
757 msg(
M_WARN,
"ERROR: external key with mbed TLS requires a "
758 "certificate with an RSA key.");
768 external_pkcs1_sign, external_key_len)))
777#ifdef ENABLE_MANAGEMENT
780management_sign_func(
void *
sign_ctx,
const void *src,
size_t src_len,
void *dst,
size_t dst_len)
783 char *src_b64 = NULL;
784 char *dst_b64 = NULL;
827 msg(
M_FATAL,
"ERROR: mbed TLS cannot handle the capath directive");
830 if (ca_file && ca_inline)
832 if (!
mbed_ok(mbedtls_x509_crt_parse(ctx->
ca_chain, (
const unsigned char *)ca_file,
833 strlen(ca_file) + 1)))
835 msg(
M_FATAL,
"Cannot load inline CA certificates");
843 msg(
M_FATAL,
"Cannot load CA certificate file %s", ca_file);
850 bool extra_certs_inline)
859 if (extra_certs_inline)
861 if (!
mbed_ok(mbedtls_x509_crt_parse(ctx->
crt_chain, (
const unsigned char *)extra_certs_file,
862 strlen(extra_certs_file) + 1)))
864 msg(
M_FATAL,
"Cannot load inline extra-certs file");
869 if (!
mbed_ok(mbedtls_x509_crt_parse_file(ctx->
crt_chain, extra_certs_file)))
871 msg(
M_FATAL,
"Cannot load extra-certs file: %s", extra_certs_file);
903 buf_free_entry(cur_block);
909endless_buf_read(
endless_buffer *in,
unsigned char *out,
size_t out_len)
913 ASSERT(out_len <= INT_MAX);
917 return MBEDTLS_ERR_SSL_WANT_READ;
920 while (in->
first_block != NULL && read_len < out_len)
923 if (block_len <= out_len - read_len)
926 memcpy(out + read_len, cur_entry->data + in->
data_start, block_len);
928 read_len += block_len;
938 buf_free_entry(cur_entry);
948 return (
int)read_len;
952endless_buf_write(
endless_buffer *out,
const unsigned char *in,
size_t len)
955 if (NULL == new_block)
957 return MBEDTLS_ERR_NET_SEND_FAILED;
960 new_block->data = malloc(len);
961 if (NULL == new_block->data)
964 return MBEDTLS_ERR_NET_SEND_FAILED;
969 new_block->length = len;
970 new_block->next_block = NULL;
972 memcpy(new_block->data, in, len);
990ssl_bio_read(
void *ctx,
unsigned char *out,
size_t out_len)
993 return endless_buf_read(&my_ctx->
in, out, out_len);
997ssl_bio_write(
void *ctx,
const unsigned char *in,
size_t in_len)
1000 return endless_buf_write(&my_ctx->
out, in, in_len);
1004my_debug(
void *ctx,
int level,
const char *file,
int line,
const char *str)
1007 msg(my_loglevel,
"mbed TLS msg (%s:%d): %s", file, line, str);
1016#if MBEDTLS_VERSION_NUMBER < 0x04000000
1017 static char old_sha256_hash[32] = { 0 };
1018 unsigned char sha256_hash[32] = { 0 };
1023 mbedtls_x509_crt *cert = ctx->
crt_chain;
1024 const mbedtls_md_info_t *kt =
md_get(
"SHA256");
1026 if (0 != mbedtls_md(kt, cert->tbs.p, cert->tbs.len, sha256_hash))
1028 msg(
M_WARN,
"WARNING: failed to personalise random");
1031 if (0 != memcmp(old_sha256_hash, sha256_hash,
sizeof(sha256_hash)))
1033 if (!
mbed_ok(mbedtls_ctr_drbg_update(cd_ctx, sha256_hash, 32)))
1035 msg(
M_WARN,
"WARNING: failed to personalise random, could not update CTR_DRBG");
1037 memcpy(old_sha256_hash, sha256_hash,
sizeof(old_sha256_hash));
1047#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_KEYING_MATERIAL_EXPORT)
1049#elif defined(MBEDTLS_SSL_PROTO_TLS1_2)
1052#error mbedtls is compiled without support for TLS 1.2 or 1.3
1063mbedtls_ssl_protocol_version
1064tls_version_to_ssl_version(
int tls_ver)
1068#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1070 return MBEDTLS_SSL_VERSION_TLS1_2;
1073#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1075 return MBEDTLS_SSL_VERSION_TLS1_3;
1079 msg(
M_FATAL,
"%s: invalid or unsupported TLS version %d", __func__, tls_ver);
1080 return MBEDTLS_SSL_VERSION_UNKNOWN;
1089 if (ctx->
crl == NULL)
1093 mbedtls_x509_crl_free(ctx->
crl);
1097 if (!
mbed_ok(mbedtls_x509_crl_parse(ctx->
crl, (
const unsigned char *)crl_file,
1098 strlen(crl_file) + 1)))
1100 msg(
M_WARN,
"CRL: cannot parse inline CRL");
1106 if (!
mbed_ok(mbedtls_x509_crl_parse_file(ctx->
crl, crl_file)))
1108 msg(
M_WARN,
"CRL: cannot read CRL from file %s", crl_file);
1115 mbedtls_x509_crl_free(ctx->
crl);
1129 int endpoint = is_server ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT;
1130 mbedtls_ssl_config_defaults(ks_ssl->
ssl_config,
endpoint, MBEDTLS_SSL_TRANSPORT_STREAM,
1131 MBEDTLS_SSL_PRESET_DEFAULT);
1132#ifdef MBEDTLS_DEBUG_C
1139 mbedtls_debug_set_threshold(3);
1143 mbedtls_debug_set_threshold(2);
1146 mbedtls_ssl_conf_dbg(ks_ssl->
ssl_config, my_debug, NULL);
1147#if MBEDTLS_VERSION_NUMBER < 0x04000000
1166#if defined(MBEDTLS_SSL_RENEGOTIATION)
1167 mbedtls_ssl_conf_renegotiation(ks_ssl->
ssl_config, MBEDTLS_SSL_RENEGOTIATION_DISABLED);
1174#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
1175 mbedtls_ssl_conf_cbc_record_splitting(ks_ssl->
ssl_config,
1176 MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED);
1180#if MBEDTLS_VERSION_NUMBER < 0x04000000
1192 mbedtls_ssl_conf_authmode(ks_ssl->
ssl_config, MBEDTLS_SSL_VERIFY_OPTIONAL);
1196 mbedtls_ssl_conf_authmode(ks_ssl->
ssl_config, MBEDTLS_SSL_VERIFY_REQUIRED);
1205 const int configured_tls_version_min =
1209 mbedtls_ssl_protocol_version version = MBEDTLS_SSL_VERSION_TLS1_2;
1213 version = tls_version_to_ssl_version(configured_tls_version_min);
1216 mbedtls_ssl_conf_min_tls_version(ks_ssl->
ssl_config, version);
1221 const int configured_tls_version_max =
1224 mbedtls_ssl_protocol_version version = MBEDTLS_SSL_VERSION_UNKNOWN;
1228 version = tls_version_to_ssl_version(configured_tls_version_max);
1236 mbedtls_ssl_conf_max_tls_version(ks_ssl->
ssl_config, version);
1241 mbedtls_ssl_init(ks_ssl->
ctx);
1248#if !defined(MBEDTLS_SSL_KEYING_MATERIAL_EXPORT)
1250 mbedtls_ssl_set_export_keys_cb(ks_ssl->
ctx, mbedtls_ssl_export_keys_cb,
session);
1255 mbedtls_ssl_set_bio(ks_ssl->
ctx, ks_ssl->
bio_ctx, ssl_bio_write, ssl_bio_read, NULL);
1262 mbedtls_ssl_send_alert_message(ks_ssl->
ctx, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1263 MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY);
1275 mbedtls_ssl_free(ks_ssl->
ctx);
1326 retval = mbedtls_ssl_write(ks->
ctx, data, len);
1330 if (MBEDTLS_ERR_SSL_WANT_WRITE == retval || MBEDTLS_ERR_SSL_WANT_READ == retval)
1340 msg(
D_TLS_ERRORS,
"TLS ERROR: write tls_write_plaintext_const incomplete %d/%d", retval,
1373 if (MBEDTLS_ERR_SSL_WANT_WRITE == retval || MBEDTLS_ERR_SSL_WANT_READ == retval)
1412 if (MBEDTLS_ERR_SSL_WANT_WRITE == retval || MBEDTLS_ERR_SSL_WANT_READ == retval)
1420 if (retval != buf->
len)
1422 msg(
D_TLS_ERRORS,
"TLS ERROR: write tls_write_ciphertext incomplete %d/%d", retval,
1453 retval = mbedtls_ssl_read(ks->
ctx,
BPTR(buf), len);
1458 if (MBEDTLS_ERR_SSL_WANT_WRITE == retval || MBEDTLS_ERR_SSL_WANT_READ == retval
1459 || MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET == retval)
1491 const mbedtls_x509_crt *cert;
1496 snprintf(s1,
sizeof(s1),
"%s %s, cipher %s", prefix, mbedtls_ssl_get_version(ks_ssl->
ctx),
1497 mbedtls_ssl_get_ciphersuite(ks_ssl->
ctx));
1499 cert = mbedtls_ssl_get_peer_cert(ks_ssl->
ctx);
1502 snprintf(s2,
sizeof(s2),
", %u bit key", (
unsigned int)mbedtls_pk_get_bitlen(&cert->pk));
1517 const int *ciphers = mbedtls_ssl_list_ciphersuites();
1523 if (tls_ctx.allowed_ciphers)
1525 ciphers = tls_ctx.allowed_ciphers;
1528 while (*ciphers != 0)
1530 printf(
"%s\n", mbedtls_ssl_get_ciphersuite_name(*ciphers));
1539#if MBEDTLS_VERSION_NUMBER < 0x04000000
1540 const mbedtls_ecp_curve_info *pcurve = mbedtls_ecp_curve_list();
1544 msg(
M_FATAL,
"Cannot retrieve curve list from mbed TLS");
1548 printf(
"Available Elliptic curves, listed in order of preference:\n\n");
1549 while (MBEDTLS_ECP_DP_NONE != pcurve->grp_id)
1551 printf(
"%s\n", pcurve->name);
1555 printf(
"Available elliptic curves:\n\n");
1556 for (
size_t i = 0; i < ecp_curve_info_table_items; i++)
1558 printf(
"%s\n", ecp_curve_info_table[i].name);
1566 static char mbedtls_version[30];
1567 unsigned int pv = mbedtls_version_get_number();
1568 snprintf(mbedtls_version,
sizeof(mbedtls_version),
"mbed TLS %u.%u.%u", (pv >> 24) & 0xff,
1569 (pv >> 16) & 0xff, (pv >> 8) & 0xff);
1570 return mbedtls_version;
char * string_alloc(const char *str, struct gc_arena *gc)
Duplicate a string, allocating memory under garbage collection.
Buffer management functions and garbage collection.
#define BPTR(buf)
Return a pointer to the start of the buffer content.
#define ALLOC_ARRAY_CLEAR(dptr, type, n)
Allocate and zero-initialise an array of n elements of the given type.
static int buf_forward_capacity(const struct buffer *buf)
Return the number of bytes that can still be appended to the buffer.
static void secure_memzero(void *data, size_t len)
Securely zeroise memory.
#define BLEN(buf)
Return the length of the buffer content in bytes.
static void gc_free(struct gc_arena *a)
Free all allocations in a garbage collection arena.
#define ALLOC_OBJ_CLEAR(dptr, type)
Allocate and zero-initialise memory for a single object of the given type.
static struct gc_arena gc_new(void)
Allocate and return a new, empty garbage collection arena.
char * strsep(char **stringp, const char *delim)
char * strtok_r(char *s, const char *delim, char **last)
const char * print_key_filename(const char *str, bool is_inline)
To be used when printing a string that may contain inline data.
#define mbed_ok(errval)
Check errval and log on error.
bool mbed_log_err(unsigned int flags, int errval, const char *prefix)
Log the supplied mbed TLS error, prefixed by supplied prefix.
mbedtls_ctr_drbg_context * rand_ctx_get(void)
Returns a singleton instance of the mbed TLS random number generator.
const mbedtls_md_info_t * md_get(const char *digest)
#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 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)
mbedtls compatibility stub.
static int mbedtls_compat_pk_parse_key(mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen)
static void mbedtls_compat_psa_crypto_init(void)
static int mbedtls_compat_pk_check_pair(const mbedtls_pk_context *pub, const mbedtls_pk_context *prv)
static int mbedtls_compat_pk_parse_keyfile(mbedtls_pk_context *ctx, const char *path, const char *password)
PKCS #11 SSL library-specific backend.
int openvpn_base64_decode(const char *str, void *data, int size)
int openvpn_base64_encode(const void *data, int size, char **str)
static struct user_pass passbuf
int pem_password_callback(char *buf, int size, int rwflag, void *u)
Callback to retrieve the user's password.
void load_xkey_provider(void)
Load ovpn.xkey provider used for external key signing.
Control Channel SSL library backend module.
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.
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...
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 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.
void show_available_curves(void)
Show the available elliptic curves in the crypto library.
void key_state_ssl_free(struct key_state_ssl *ks_ssl)
Free the SSL channel part of the given key state.
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.
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.
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.
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.
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.
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...
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.
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_new(struct tls_root_ctx *ctx)
Initialise a library-specific TLS context.
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.
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_DEBUG_ENABLED
#define SSLF_TLS_VERSION_MAX_MASK
#define SSLF_TLS_VERSION_MIN_SHIFT
#define SSLF_TLS_VERSION_MIN_MASK
int tls_ctx_use_external_signing_func(struct tls_root_ctx *ctx, external_sign_func sign_func, void *sign_ctx)
Call the supplied signing function to create a TLS signature during the TLS handshake.
bool(* external_sign_func)(void *sign_ctx, const void *src, size_t src_size, void *dst, size_t dst_size)
External signing function prototype.
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 mbed TLS backend.
buffer_entry * next_block
One node in a buffer_list linked list.
Wrapper structure for dynamically allocated memory.
int len
Length in bytes of the actual content within the allocated memory.
buffer_entry * first_block
buffer_entry * last_block
Context used by external_pkcs1_sign()
Garbage collection arena used to keep track of dynamically allocated memory.
mbedtls_ssl_config * ssl_config
mbedTLS global ssl config
mbedtls_ssl_context * ctx
mbedTLS connection context
struct tls_key_cache tls_key_cache
Get a tls_cipher_name_pair containing OpenSSL and IANA names for supplied TLS cipher name.
const char * openssl_name
struct to cache TLS secrets for keying material exporter (RFC 5705).
unsigned char master_secret[48]
mbedtls_tls_prf_types tls_prf_type
unsigned char client_server_random[64]
Structure that wraps the TLS context.
mbedtls_x509_crl * crl
Certificate Revocation List.
mbedtls_x509_crt * crt_chain
Local Certificate chain.
uint16_t * groups
List of allowed groups for this connection.
mbedtls_x509_crt * ca_chain
CA chain for remote verification.
int * allowed_ciphers
List of allowed ciphers for this connection.
mbedtls_dhm_context * dhm_ctx
Diffie-Helmann-Merkle context.
mbedtls_x509_crt_profile cert_profile
Allowed certificate types.
bool initialised
True if the context has been initialised.
struct external_context external_key
External key context.
mbedtls_pk_context * priv_key
Local private key.
Security parameter state of a single session within a VPN tunnel.
static int cleanup(void **state)