remove me from your mailing list. Please
чт, 19 окт. 2023 г. в 20:29, MaxF (Code Review) <ger...@openvpn.net>: > Attention is currently required from: flichtenheld, plaisthos. > > MaxF *uploaded patch set #6* to this change. > > View Change <http://gerrit.openvpn.net/c/openvpn/+/370?usp=email> > > Add support for mbedtls 3.X.Y > > Most struct fields in mbedtls 3 are private and now need accessor > functions. Most of it was straightforward to adapt, but for two things > there were no accessor functions yet: > > * Netscape certificate type > * key usage (you can check key usage, but not get the raw bytes) > > I decided to remove Netscape certificate type checks when using OpenVPN > with mbedtls. The key usage bytes were printed in an error message, and > I removed that part from it. > > Adding the random number functions to the load private key function may > look weird, but the purpose is to make side channels for elliptic curve > operations harder to exploit. > > Change-Id: I445a93e84dc54b865b757038d22318ac427fce96 > Signed-off-by: Max Fillinger <m...@max-fillinger.net> > --- > M configure.ac > M src/openvpn/crypto_mbedtls.c > A src/openvpn/mbedtls_compat.h > M src/openvpn/options.c > M src/openvpn/ssl_mbedtls.c > M src/openvpn/ssl_verify_mbedtls.c > 6 files changed, 323 insertions(+), 100 deletions(-) > > git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/70/370/6 > > diff --git a/configure.ac b/configure.ac > index 128ab86..7e5763d 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -1016,15 +1016,21 @@ > #include <mbedtls/version.h> > ]], > [[ > -#if MBEDTLS_VERSION_NUMBER < 0x02000000 || MBEDTLS_VERSION_NUMBER >= > 0x03000000 > +#if MBEDTLS_VERSION_NUMBER < 0x02000000 || (MBEDTLS_VERSION_NUMBER >= > 0x03000000 && MBEDTLS_VERSION_NUMBER < 0x03020100) > #error invalid version > #endif > ]] > )], > [AC_MSG_RESULT([ok])], > - [AC_MSG_ERROR([mbed TLS 2.y.z required])] > + [AC_MSG_ERROR([mbed TLS version >= 2.0.0 or >= 3.2.1 required])] > ) > > + AC_CHECK_HEADER( > + psa/crypto.h, > + [AC_DEFINE([MBEDTLS_HAVE_PSA_CRYPTO_H], [1], [yes])], > + [AC_DEFINE([MBEDTLS_HAVE_PSA_CRYPTO_H], [0], [no])] > + ) > + > AC_CHECK_FUNCS( > [ \ > mbedtls_cipher_write_tag \ > diff --git a/src/openvpn/crypto_mbedtls.c b/src/openvpn/crypto_mbedtls.c > index 98cac60..bb71561 100644 > --- a/src/openvpn/crypto_mbedtls.c > +++ b/src/openvpn/crypto_mbedtls.c > @@ -41,6 +41,7 @@ > #include "integer.h" > #include "crypto_backend.h" > #include "otime.h" > +#include "mbedtls_compat.h" > #include "misc.h" > > #include <mbedtls/base64.h> > @@ -170,10 +171,11 @@ > while (*ciphers != 0) > { > const mbedtls_cipher_info_t *info = > mbedtls_cipher_info_from_type(*ciphers); > - if (info && !cipher_kt_insecure(info->name) > - && (cipher_kt_mode_aead(info->name) || > cipher_kt_mode_cbc(info->name))) > + const char *name = mbedtls_cipher_info_get_name(info); > + if (info && name && !cipher_kt_insecure(name) > + && (cipher_kt_mode_aead(name) || cipher_kt_mode_cbc(name))) > { > - print_cipher(info->name); > + print_cipher(name); > } > ciphers++; > } > @@ -184,10 +186,11 @@ > while (*ciphers != 0) > { > const mbedtls_cipher_info_t *info = > mbedtls_cipher_info_from_type(*ciphers); > - if (info && cipher_kt_insecure(info->name) > - && (cipher_kt_mode_aead(info->name) || > cipher_kt_mode_cbc(info->name))) > + const char *name = mbedtls_cipher_info_get_name(info); > + if (info && name && cipher_kt_insecure(name) > + && (cipher_kt_mode_aead(name) || cipher_kt_mode_cbc(name))) > { > - print_cipher(info->name); > + print_cipher(name); > } > ciphers++; > } > @@ -295,7 +298,9 @@ > mbedtls_pem_context ctx = { 0 }; > bool ret = mbed_ok(mbedtls_pem_read_buffer(&ctx, header, footer, > BPTR(&input), > NULL, 0, &use_len)); > - if (ret && !buf_write(dst, ctx.buf, ctx.buflen)) > + size_t buf_size = 0; > + const unsigned char *buf = mbedtls_pem_get_buffer(&ctx, &buf_size); > + if (ret && !buf_write(dst, buf, buf_size)) > { > ret = false; > msg(M_WARN, "PEM decode error: destination buffer too small"); > @@ -416,11 +421,12 @@ > return false; > } > > - if (cipher->key_bitlen/8 > MAX_CIPHER_KEY_LENGTH) > + const size_t key_bytelen = mbedtls_cipher_info_get_key_bitlen(cipher)/8; > + if (key_bytelen > MAX_CIPHER_KEY_LENGTH) > { > - msg(D_LOW, "Cipher algorithm '%s' uses a default key size (%d bytes) > " > + msg(D_LOW, "Cipher algorithm '%s' uses a default key size (%zu > bytes) " > "which is larger than " PACKAGE_NAME "'s current maximum key > size " > - "(%d bytes)", ciphername, cipher->key_bitlen/8, > MAX_CIPHER_KEY_LENGTH); > + "(%d bytes)", ciphername, key_bytelen, MAX_CIPHER_KEY_LENGTH); > *reason = "disabled due to key size too large"; > return false; > } > @@ -438,7 +444,7 @@ > return "[null-cipher]"; > } > > - return translate_cipher_name_to_openvpn(cipher_kt->name); > + return > translate_cipher_name_to_openvpn(mbedtls_cipher_info_get_name(cipher_kt)); > } > > int > @@ -451,7 +457,7 @@ > return 0; > } > > - return cipher_kt->key_bitlen/8; > + return (int)mbedtls_cipher_info_get_key_bitlen(cipher_kt)/8; > } > > int > @@ -463,7 +469,7 @@ > { > return 0; > } > - return cipher_kt->iv_size; > + return (int)mbedtls_cipher_info_get_iv_size(cipher_kt); > } > > int > @@ -474,7 +480,7 @@ > { > return 0; > } > - return cipher_kt->block_size; > + return (int)mbedtls_cipher_info_get_block_size(cipher_kt); > } > > int > @@ -498,16 +504,16 @@ > > return !(cipher_kt_block_size(ciphername) >= 128 / 8 > #ifdef MBEDTLS_CHACHAPOLY_C > - || cipher_kt->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 > + || mbedtls_cipher_info_get_type(cipher_kt) == > MBEDTLS_CIPHER_CHACHA20_POLY1305 > #endif > ); > } > > -static int > +static mbedtls_cipher_mode_t > cipher_kt_mode(const mbedtls_cipher_info_t *cipher_kt) > { > ASSERT(NULL != cipher_kt); > - return cipher_kt->mode; > + return mbedtls_cipher_info_get_mode(cipher_kt); > } > > bool > @@ -566,22 +572,29 @@ > CLEAR(*ctx); > > const mbedtls_cipher_info_t *kt = cipher_get(ciphername); > - int key_len = kt->key_bitlen/8; > - > ASSERT(kt); > + size_t key_len = mbedtls_cipher_info_get_key_bitlen(kt)/8; > > if (!mbed_ok(mbedtls_cipher_setup(ctx, kt))) > { > msg(M_FATAL, "mbed TLS cipher context init #1"); > } > > - if (!mbed_ok(mbedtls_cipher_setkey(ctx, key, key_len*8, operation))) > + if (!mbed_ok(mbedtls_cipher_setkey(ctx, key, (int)key_len*8, operation))) > { > msg(M_FATAL, "mbed TLS cipher set key"); > } > > + if (mbedtls_cipher_info_get_mode(kt) == MBEDTLS_MODE_CBC) > + { > + if (!mbed_ok(mbedtls_cipher_set_padding_mode(ctx, > MBEDTLS_PADDING_PKCS7))) > + { > + msg(M_FATAL, "mbed TLS cipher set padding mode"); > + } > + } > + > /* make sure we used a big enough key */ > - ASSERT(ctx->key_bitlen <= key_len*8); > + ASSERT(mbedtls_cipher_get_key_bitlen(ctx) <= key_len*8); > } > > int > @@ -609,7 +622,7 @@ > int > cipher_ctx_block_size(const mbedtls_cipher_context_t *ctx) > { > - return mbedtls_cipher_get_block_size(ctx); > + return (int)mbedtls_cipher_get_block_size(ctx); > } > > int > @@ -617,7 +630,7 @@ > { > ASSERT(NULL != ctx); > > - return cipher_kt_mode(ctx->cipher_info); > + return mbedtls_cipher_get_cipher_mode(ctx); > } > > bool > @@ -652,7 +665,7 @@ > return 0; > } > > - if (!mbed_ok(mbedtls_cipher_set_iv(ctx, iv_buf, > ctx->cipher_info->iv_size))) > + if (!mbed_ok(mbedtls_cipher_set_iv(ctx, iv_buf, > (size_t)mbedtls_cipher_get_iv_size(ctx)))) > { > return 0; > } > @@ -714,7 +727,7 @@ > { > size_t olen = 0; > > - if (MBEDTLS_DECRYPT != ctx->operation) > + if (MBEDTLS_DECRYPT != mbedtls_cipher_get_operation(ctx)) > { > return 0; > } > @@ -866,7 +879,7 @@ > { > return 0; > } > - return mbedtls_md_get_size(ctx->md_info); > + return (int)mbedtls_md_get_size(mbedtls_md_info_from_ctx(ctx)); > } > > void > @@ -936,7 +949,7 @@ > { > return 0; > } > - return mbedtls_md_get_size(ctx->md_info); > + return mbedtls_md_get_size(mbedtls_md_info_from_ctx(ctx)); > } > > void > diff --git a/src/openvpn/mbedtls_compat.h b/src/openvpn/mbedtls_compat.h > new file mode 100644 > index 0000000..fe7c3f9 > --- /dev/null > +++ b/src/openvpn/mbedtls_compat.h > @@ -0,0 +1,186 @@ > +/* > + * OpenVPN -- An application to securely tunnel IP networks > + * over a single TCP/UDP port, with support for SSL/TLS-based > + * session authentication and key exchange, > + * packet encryption, packet authentication, and > + * packet compression. > + * > + * Copyright (C) 2023 Fox Crypto B.V. <open...@foxcrypto.com> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 > + * as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, write to the Free Software Foundation, Inc., > + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > + */ > + > +/** > + * @file mbedtls compatibility stub > + * > + * This file provide compatibility stubs for the mbedtls libraries > + * prior to version 3. This version made most fields in structs private > + * and requires accessor functions to be used. For earlier versions, we > + * implement the accessor functions here. > + */ > + > +#ifndef MBEDTLS_COMPAT_H_ > +#define MBEDTLS_COMPAT_H_ > + > +#include "errlevel.h" > + > +#include <mbedtls/cipher.h> > +#include <mbedtls/ctr_drbg.h> > +#include <mbedtls/dhm.h> > +#include <mbedtls/md.h> > +#include <mbedtls/pem.h> > +#include <mbedtls/pk.h> > +#include <mbedtls/version.h> > +#include <mbedtls/x509_crt.h> > + > +#if MBEDTLS_HAVE_PSA_CRYPTO_H > + #include <psa/crypto.h> > +#endif > + > +static inline void > +mbedtls_compat_psa_crypto_init(void) > +{ > +#if MBEDTLS_HAVE_PSA_CRYPTO_H && defined(MBEDTLS_PSA_CRYPTO_C) > + if (psa_crypto_init() != PSA_SUCCESS) > + { > + msg(M_FATAL, "mbedtls: psa_crypto_init() failed"); > + } > +#else > + return; > +#endif /* MBEDTLS_HAVE_PSA_CRYPTO_H && defined(MBEDTLS_PSA_CRYPTO_C) */ > +} > + > +/* > + * In older versions of mbedtls, mbedtls_ctr_drbg_update() did not return an > + * error code, and it was deprecated in favor of > mbedtls_ctr_drbg_update_ret() > + * which does. > + * > + * In mbedtls 3, this function was removed and mbedtls_ctr_drbg_update() > returns > + * an error code. > + */ > +static inline int > +mbedtls_compat_ctr_drbg_update(mbedtls_ctr_drbg_context *ctx, > + const unsigned char *additional, > + size_t add_len) > +{ > +#if HAVE_CTR_DRBG_UPDATE_RET > + return mbedtls_ctr_drbg_update_ret(ctx, additional, add_len); > +#elif MBEDTLS_VERSION_NUMBER < 0x03020100 > + mbedtls_ctr_drbg_update(ctx, additional, add_len); > + return 0; > +#else > + return mbedtls_ctr_drbg_update(ctx, additional, add_len); > +#endif /* HAVE_CTR_DRBG_UPDATE_RET */ > +} > + > +static inline int > +mbedtls_compat_pk_check_pair(const mbedtls_pk_context *pub, const > mbedtls_pk_context *prv, > + int (*f_rng)(void *, unsigned char *, size_t), > void *p_rng) > +{ > +#if MBEDTLS_VERSION_NUMBER < 0x03020100 > + return mbedtls_pk_check_pair(pub, prv); > +#else > + return mbedtls_pk_check_pair(pub, prv, f_rng, p_rng); > +#endif /* MBEDTLS_VERSION_NUMBER < 0x03020100 */ > +} > + > +static inline int > +mbedtls_compat_pk_parse_key(mbedtls_pk_context *ctx, > + const unsigned char *key, size_t keylen, > + const unsigned char *pwd, size_t pwdlen, > + int (*f_rng)(void *, unsigned char *, size_t), > void *p_rng) > +{ > +#if MBEDTLS_VERSION_NUMBER < 0x03020100 > + return mbedtls_pk_parse_key(ctx, key, keylen, pwd, pwdlen); > +#else > + return mbedtls_pk_parse_key(ctx, key, keylen, pwd, pwdlen, f_rng, p_rng); > +#endif > +} > + > +static inline int > +mbedtls_compat_pk_parse_keyfile(mbedtls_pk_context *ctx, > + const char *path, const char *password, > + int (*f_rng)(void *, unsigned char *, > size_t), void *p_rng) > +{ > +#if MBEDTLS_VERSION_NUMBER < 0x03020100 > + return mbedtls_pk_parse_keyfile(ctx, path, password); > +#else > + return mbedtls_pk_parse_keyfile(ctx, path, password, f_rng, p_rng); > +#endif > +} > + > +#if MBEDTLS_VERSION_NUMBER < 0x03020100 > +static inline size_t > +mbedtls_cipher_info_get_block_size(const mbedtls_cipher_info_t *cipher) > +{ > + return (size_t)cipher->block_size; > +} > + > +static inline size_t > +mbedtls_cipher_info_get_iv_size(const mbedtls_cipher_info_t *cipher) > +{ > + return (size_t)cipher->iv_size; > +} > + > +static inline size_t > +mbedtls_cipher_info_get_key_bitlen(const mbedtls_cipher_info_t *cipher) > +{ > + return (size_t)cipher->key_bitlen; > +} > + > +static inline mbedtls_cipher_mode_t > +mbedtls_cipher_info_get_mode(const mbedtls_cipher_info_t *cipher) > +{ > + return cipher->mode; > +} > + > +static inline const char * > +mbedtls_cipher_info_get_name(const mbedtls_cipher_info_t *cipher) > +{ > + return cipher->name; > +} > + > +static inline mbedtls_cipher_type_t > +mbedtls_cipher_info_get_type(const mbedtls_cipher_info_t *cipher) > +{ > + return cipher->type; > +} > + > +static inline size_t > +mbedtls_dhm_get_bitlen(const mbedtls_dhm_context *ctx) > +{ > + return 8 * ctx->len; > +} > + > +static inline const mbedtls_md_info_t * > +mbedtls_md_info_from_ctx(const mbedtls_md_context_t *ctx) > +{ > + return ctx->md_info; > +} > + > +static inline const unsigned char * > +mbedtls_pem_get_buffer(const mbedtls_pem_context *ctx, size_t *buf_size) > +{ > + *buf_size = ctx->buflen; > + return ctx->buf; > +} > + > +static inline int > +mbedtls_x509_crt_has_ext_type(const mbedtls_x509_crt *ctx, int ext_type) > +{ > + return ctx->ext_types & ext_type; > +} > +#endif /* MBEDTLS_VERSION_NUMBER < 0x03020100 */ > + > +#endif /* MBEDTLS_COMPAT_H_ */ > diff --git a/src/openvpn/options.c b/src/openvpn/options.c > index 2b68bac..d238269 100644 > --- a/src/openvpn/options.c > +++ b/src/openvpn/options.c > @@ -644,8 +644,10 @@ > "--verify-x509-name name: Accept connections only from a host with X509 > subject\n" > " DN name. The remote host must also pass all other > tests\n" > " of verification.\n" > +#ifndef ENABLE_CRYPTO_MBEDTLS > "--ns-cert-type t: (DEPRECATED) Require that peer certificate was signed > with \n" > " an explicit nsCertType designation t = 'client' | > 'server'.\n" > +#endif > "--x509-track x : Save peer X509 attribute x in environment for use > by\n" > " plugins and management interface.\n" > #ifdef HAVE_EXPORT_KEYING_MATERIAL > @@ -9051,6 +9053,10 @@ > } > else if (streq(p[0], "ns-cert-type") && p[1] && !p[2]) > { > +#ifdef ENABLE_CRYPTO_MBEDTLS > + msg(msglevel, "--ns-cert-type is not available with mbedtls."); > + goto err; > +#else > VERIFY_PERMISSION(OPT_P_GENERAL); > if (streq(p[1], "server")) > { > @@ -9065,6 +9071,7 @@ > msg(msglevel, "--ns-cert-type must be 'client' or 'server'"); > goto err; > } > +#endif /* ENABLE_CRYPTO_MBEDTLS */ > } > else if (streq(p[0], "remote-cert-ku")) > { > diff --git a/src/openvpn/ssl_mbedtls.c b/src/openvpn/ssl_mbedtls.c > index 81dd906..4e79c82 100644 > --- a/src/openvpn/ssl_mbedtls.c > +++ b/src/openvpn/ssl_mbedtls.c > @@ -41,6 +41,7 @@ > #include "buffer.h" > #include "misc.h" > #include "manage.h" > +#include "mbedtls_compat.h" > #include "pkcs11_backend.h" > #include "ssl_common.h" > > @@ -49,34 +50,11 @@ > #include <mbedtls/error.h> > #include <mbedtls/version.h> > > -#if MBEDTLS_VERSION_NUMBER >= 0x02040000 > - #include <mbedtls/net_sockets.h> > -#else > - #include <mbedtls/net.h> > -#endif > +#include <mbedtls/net_sockets.h> > > #include <mbedtls/oid.h> > #include <mbedtls/pem.h> > > -/** > - * Compatibility: mbedtls_ctr_drbg_update was deprecated in mbedtls 2.16 and > - * replaced with mbedtls_ctr_drbg_update_ret, which returns an error code. > - * For older versions, we call mbedtls_ctr_drbg_update and return 0 > (success). > - * > - * Note: this change was backported to other mbedTLS branches, therefore we > - * rely on function detection at configure time. > - */ > -#ifndef HAVE_CTR_DRBG_UPDATE_RET > -static int > -mbedtls_ctr_drbg_update_ret(mbedtls_ctr_drbg_context *ctx, > - const unsigned char *additional, > - size_t add_len) > -{ > - mbedtls_ctr_drbg_update(ctx, additional, add_len); > - return 0; > -} > -#endif > - > static const mbedtls_x509_crt_profile openvpn_x509_crt_profile_legacy = > { > /* Hashes from SHA-1 and above */ > @@ -108,6 +86,7 @@ > void > tls_init_lib(void) > { > + mbedtls_compat_psa_crypto_init(); > } > > void > @@ -430,7 +409,7 @@ > } > > msg(D_TLS_DEBUG_LOW, "Diffie-Hellman initialized with " counter_format " > bit key", > - (counter_type) 8 * mbedtls_mpi_size(&ctx->dhm_ctx->P)); > + (counter_type) mbedtls_dhm_get_bitlen(ctx->dhm_ctx)); > } > > void > @@ -504,29 +483,40 @@ > > if (priv_key_inline) > { > - status = mbedtls_pk_parse_key(ctx->priv_key, > - (const unsigned char *) priv_key_file, > - strlen(priv_key_file) + 1, NULL, 0); > + status = mbedtls_compat_pk_parse_key(ctx->priv_key, > + (const unsigned char *) > priv_key_file, > + strlen(priv_key_file) + 1, > NULL, 0, > + mbedtls_ctr_drbg_random, > + rand_ctx_get()); > > if (MBEDTLS_ERR_PK_PASSWORD_REQUIRED == status) > { > char passbuf[512] = {0}; > pem_password_callback(passbuf, 512, 0, NULL); > - status = mbedtls_pk_parse_key(ctx->priv_key, > - (const unsigned char *) > priv_key_file, > - strlen(priv_key_file) + 1, > - (unsigned char *) passbuf, > - strlen(passbuf)); > + status = mbedtls_compat_pk_parse_key(ctx->priv_key, > + (const unsigned char *) > priv_key_file, > + strlen(priv_key_file) + 1, > + (unsigned char *) passbuf, > + strlen(passbuf), > + mbedtls_ctr_drbg_random, > + rand_ctx_get()); > } > } > else > { > - status = mbedtls_pk_parse_keyfile(ctx->priv_key, priv_key_file, > NULL); > + status = mbedtls_compat_pk_parse_keyfile(ctx->priv_key, > + priv_key_file, > + NULL, > + mbedtls_ctr_drbg_random, > + rand_ctx_get()); > if (MBEDTLS_ERR_PK_PASSWORD_REQUIRED == status) > { > char passbuf[512] = {0}; > pem_password_callback(passbuf, 512, 0, NULL); > - status = mbedtls_pk_parse_keyfile(ctx->priv_key, priv_key_file, > passbuf); > + status = mbedtls_compat_pk_parse_keyfile(ctx->priv_key, > + priv_key_file, passbuf, > + mbedtls_ctr_drbg_random, > + rand_ctx_get()); > } > } > if (!mbed_ok(status)) > @@ -542,7 +532,10 @@ > return 1; > } > > - if (!mbed_ok(mbedtls_pk_check_pair(&ctx->crt_chain->pk, ctx->priv_key))) > + if (!mbed_ok(mbedtls_compat_pk_check_pair(&ctx->crt_chain->pk, > + ctx->priv_key, > + mbedtls_ctr_drbg_random, > + rand_ctx_get()))) > { > msg(M_WARN, "Private key does not match the certificate"); > return 1; > @@ -558,7 +551,6 @@ > * @param ctx_voidptr Management external key context. > * @param f_rng (Unused) > * @param p_rng (Unused) > - * @param mode RSA mode (should be RSA_PRIVATE). > * @param md_alg Message digest ('hash') algorithm type. > * @param hashlen Length of hash (overridden by length specified by > md_alg > * if md_alg != MBEDTLS_MD_NONE). > @@ -572,7 +564,10 @@ > */ > static inline int > external_pkcs1_sign( void *ctx_voidptr, > - int (*f_rng)(void *, unsigned char *, size_t), void > *p_rng, int mode, > + int (*f_rng)(void *, unsigned char *, size_t), void > *p_rng, > +#if MBEDTLS_VERSION_NUMBER < 0x03020100 > + int mode, > +#endif > mbedtls_md_type_t md_alg, unsigned int hashlen, const > unsigned char *hash, > unsigned char *sig ) > { > @@ -587,10 +582,12 @@ > return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; > } > > +#if MBEDTLS_VERSION_NUMBER < 0x03020100 > if (MBEDTLS_RSA_PRIVATE != mode) > { > return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; > } > +#endif > > /* > * Support a wide range of hashes. TLSv1.1 and before only need > SIG_RSA_RAW, > @@ -967,7 +964,7 @@ > > if (0 != memcmp(old_sha256_hash, sha256_hash, sizeof(sha256_hash))) > { > - if (!mbed_ok(mbedtls_ctr_drbg_update_ret(cd_ctx, sha256_hash, > 32))) > + if (!mbed_ok(mbedtls_compat_ctr_drbg_update(cd_ctx, sha256_hash, > 32))) > { > msg(M_WARN, "WARNING: failed to personalise random, could > not update CTR_DRBG"); > } > @@ -979,12 +976,16 @@ > int > tls_version_max(void) > { > -#if defined(MBEDTLS_SSL_MAJOR_VERSION_3) && > defined(MBEDTLS_SSL_MINOR_VERSION_3) > +#if defined(MBEDTLS_SSL_PROTO_TLS1_3) > + return TLS_VER_1_3; > +#elif defined(MBEDTLS_SSL_PROTO_TLS1_2) > return TLS_VER_1_2; > -#elif defined(MBEDTLS_SSL_MAJOR_VERSION_3) && > defined(MBEDTLS_SSL_MINOR_VERSION_2) > +#elif defined(MBEDTLS_SSL_PROTO_TLS1_1) > return TLS_VER_1_1; > -#else > +#elif defined(MBEDTLS_SSL_PROTO_TLS1) > return TLS_VER_1_0; > +#else /* if defined(MBEDTLS_SSL_PROTO_TLS1_3) */ > + #error "mbedtls is compiled without support for any version of TLS." > #endif > } > > @@ -1006,23 +1007,36 @@ > > switch (tls_ver) > { > +#if defined(MBEDTLS_SSL_PROTO_TLS1) > case TLS_VER_1_0: > *major = MBEDTLS_SSL_MAJOR_VERSION_3; > *minor = MBEDTLS_SSL_MINOR_VERSION_1; > break; > +#endif > > +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) > case TLS_VER_1_1: > *major = MBEDTLS_SSL_MAJOR_VERSION_3; > *minor = MBEDTLS_SSL_MINOR_VERSION_2; > break; > +#endif > > +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) > case TLS_VER_1_2: > *major = MBEDTLS_SSL_MAJOR_VERSION_3; > *minor = MBEDTLS_SSL_MINOR_VERSION_3; > break; > +#endif > + > +#if defined(MBEDTLS_SSL_PROTO_TLS1_3) > + case TLS_VER_1_3: > + *major = MBEDTLS_SSL_MAJOR_VERSION_3; > + *minor = MBEDTLS_SSL_MINOR_VERSION_4; > + break; > +#endif > > default: > - msg(M_FATAL, "%s: invalid TLS version %d", __func__, tls_ver); > + msg(M_FATAL, "%s: invalid or unsupported TLS version %d", > __func__, tls_ver); > break; > } > } > @@ -1149,17 +1163,17 @@ > > /* Initialize minimum TLS version */ > { > - const int tls_version_min = > + const int configured_tls_version_min = > (session->opt->ssl_flags >> SSLF_TLS_VERSION_MIN_SHIFT) > &SSLF_TLS_VERSION_MIN_MASK; > > - /* default to TLS 1.0 */ > + /* default to TLS 1.2 */ > int major = MBEDTLS_SSL_MAJOR_VERSION_3; > - int minor = MBEDTLS_SSL_MINOR_VERSION_1; > + int minor = MBEDTLS_SSL_MINOR_VERSION_3; > > - if (tls_version_min > TLS_VER_UNSPEC) > + if (configured_tls_version_min > TLS_VER_UNSPEC) > { > - tls_version_to_major_minor(tls_version_min, &major, &minor); > + tls_version_to_major_minor(configured_tls_version_min, &major, > &minor); > } > > mbedtls_ssl_conf_min_version(ks_ssl->ssl_config, major, minor); > @@ -1167,16 +1181,24 @@ > > /* Initialize maximum TLS version */ > { > - const int tls_version_max = > + const int configured_tls_version_max = > (session->opt->ssl_flags >> SSLF_TLS_VERSION_MAX_SHIFT) > &SSLF_TLS_VERSION_MAX_MASK; > > - if (tls_version_max > TLS_VER_UNSPEC) > + int major = 0; > + int minor = 0; > + > + if (configured_tls_version_max > TLS_VER_UNSPEC) > { > - int major, minor; > - tls_version_to_major_minor(tls_version_max, &major, &minor); > - mbedtls_ssl_conf_max_version(ks_ssl->ssl_config, major, minor); > + tls_version_to_major_minor(configured_tls_version_max, &major, > &minor); > } > + else > + { > + /* Default to tls_version_max(). */ > + tls_version_to_major_minor(tls_version_max(), &major, &minor); > + } > + > + mbedtls_ssl_conf_max_version(ks_ssl->ssl_config, major, minor); > } > > #ifdef HAVE_EXPORT_KEYING_MATERIAL > @@ -1188,7 +1210,7 @@ > /* Initialise SSL context */ > ALLOC_OBJ_CLEAR(ks_ssl->ctx, mbedtls_ssl_context); > mbedtls_ssl_init(ks_ssl->ctx); > - mbedtls_ssl_setup(ks_ssl->ctx, ks_ssl->ssl_config); > + mbed_ok(mbedtls_ssl_setup(ks_ssl->ctx, ks_ssl->ssl_config)); > > /* Initialise BIOs */ > ALLOC_OBJ_CLEAR(ks_ssl->bio_ctx, bio_ctx); > diff --git a/src/openvpn/ssl_verify_mbedtls.c > b/src/openvpn/ssl_verify_mbedtls.c > index a1ddf8d..ce21324 100644 > --- a/src/openvpn/ssl_verify_mbedtls.c > +++ b/src/openvpn/ssl_verify_mbedtls.c > @@ -35,6 +35,7 @@ > #if defined(ENABLE_CRYPTO_MBEDTLS) > > #include "crypto_mbedtls.h" > +#include "mbedtls_compat.h" > #include "ssl_verify.h" > #include <mbedtls/asn1.h> > #include <mbedtls/error.h> > @@ -432,6 +433,8 @@ > } > } > > +/* Dummy function because Netscape certificate types are not supported in > OpenVPN with mbedtls. > + * Returns SUCCESS if usage is NS_CERT_CHECK_NONE, FAILURE otherwise. */ > result_t > x509_verify_ns_cert_type(mbedtls_x509_crt *cert, const int usage) > { > @@ -439,18 +442,6 @@ > { > return SUCCESS; > } > - if (usage == NS_CERT_CHECK_CLIENT) > - { > - return ((cert->ext_types & MBEDTLS_X509_EXT_NS_CERT_TYPE) > - && (cert->ns_cert_type & > MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT)) ? > - SUCCESS : FAILURE; > - } > - if (usage == NS_CERT_CHECK_SERVER) > - { > - return ((cert->ext_types & MBEDTLS_X509_EXT_NS_CERT_TYPE) > - && (cert->ns_cert_type & > MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER)) ? > - SUCCESS : FAILURE; > - } > > return FAILURE; > } > @@ -461,7 +452,7 @@ > { > msg(D_HANDSHAKE, "Validating certificate key usage"); > > - if (!(cert->ext_types & MBEDTLS_X509_EXT_KEY_USAGE)) > + if (!mbedtls_x509_crt_has_ext_type(cert, MBEDTLS_X509_EXT_KEY_USAGE)) > { > msg(D_TLS_ERRORS, > "ERROR: Certificate does not have key usage extension"); > @@ -486,9 +477,7 @@ > > if (fFound != SUCCESS) > { > - msg(D_TLS_ERRORS, > - "ERROR: Certificate has key usage %04x, expected one of:", > - cert->key_usage); > + msg(D_TLS_ERRORS, "ERROR: Certificate has invalid key usage, > expected one of:"); > for (size_t i = 0; i < expected_len && expected_ku[i]; i++) > { > msg(D_TLS_ERRORS, " * %04x", expected_ku[i]); > @@ -503,7 +492,7 @@ > { > result_t fFound = FAILURE; > > - if (!(cert->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE)) > + if (!mbedtls_x509_crt_has_ext_type(cert, > MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE)) > { > msg(D_HANDSHAKE, "Certificate does not have extended key usage > extension"); > } > > To view, visit change 370 > <http://gerrit.openvpn.net/c/openvpn/+/370?usp=email>. To unsubscribe, or > for help writing mail filters, visit settings > <http://gerrit.openvpn.net/settings>. > Gerrit-Project: openvpn > Gerrit-Branch: master > Gerrit-Change-Id: I445a93e84dc54b865b757038d22318ac427fce96 > Gerrit-Change-Number: 370 > Gerrit-PatchSet: 6 > Gerrit-Owner: MaxF <m...@max-fillinger.net> > Gerrit-Reviewer: flichtenheld <fr...@lichtenheld.com> > Gerrit-Reviewer: plaisthos <arne-open...@rfc2549.org> > Gerrit-CC: openvpn-devel <openvpn-devel@lists.sourceforge.net> > Gerrit-Attention: plaisthos <arne-open...@rfc2549.org> > Gerrit-Attention: flichtenheld <fr...@lichtenheld.com> > Gerrit-MessageType: newpatchset > _______________________________________________ > Openvpn-devel mailing list > Openvpn-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/openvpn-devel >
_______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel