Hi, On 17-07-2020 15:47, Arne Schwabe wrote: > OpenSSL 1.0.1 was supported until 2016-12-31. Rhel6/Centos6 still > use this version but considering that RHEL7 and RHEL8 are already > out, these versions can also stay with OpenVPN 2.4. > > All the supported Debian based distributions also come with at > least 1.0.2. > > We (accidently) unconditionally compiled some key exporter code on > OpenSSL 1.0.2+ without problems. So always compile the whole > key exporter feature for OpenSSL. > > This also allows the tls groups commit to be applied without > adding ifdefs to disable that functionality on OpenSSL 1.0.1 > > Signed-off-by: Arne Schwabe <a...@rfc2549.org> > --- > .travis.yml | 8 ----- > Changes.rst | 2 ++ > INSTALL | 9 +++--- > configure.ac | 14 +++------ > src/openvpn/crypto.c | 7 ----- > src/openvpn/openssl_compat.h | 14 --------- > src/openvpn/options.c | 2 +- > src/openvpn/ssl_mbedtls.c | 2 +- > src/openvpn/ssl_openssl.c | 60 ++---------------------------------- > 9 files changed, 16 insertions(+), 102 deletions(-) > > diff --git a/.travis.yml b/.travis.yml > index 925d09ea..101ff096 100644 > --- a/.travis.yml > +++ b/.travis.yml > @@ -35,10 +35,6 @@ jobs: > env: SSLLIB="openssl" RUN_COVERITY="1" > os: linux > compiler: gcc > - - name: gcc | openssl-1.0.1u > - env: SSLLIB="openssl" OPENSSL_VERSION="1.0.1u" > - os: linux > - compiler: gcc > - name: gcc | openssl-1.1.1d > env: SSLLIB="openssl" OPENSSL_VERSION="1.1.1d" > os: linux > @@ -87,10 +83,6 @@ jobs: > env: SSLLIB="mbedtls" > os: osx > compiler: clang > - - name: mingw64 | openssl-1.0.1u > - env: SSLLIB="openssl" CHOST=x86_64-w64-mingw32 OPENSSL_VERSION="1.0.1u" > - os: linux > - compiler: ": Win64 build only" > - name: mingw64 | openssl-1.1.1d > env: SSLLIB="openssl" CHOST=x86_64-w64-mingw32 OPENSSL_VERSION="1.1.1d" > os: linux > diff --git a/Changes.rst b/Changes.rst > index 18b03e47..6e283270 100644 > --- a/Changes.rst > +++ b/Changes.rst > @@ -34,6 +34,8 @@ https://community.openvpn.net/openvpn/wiki/DeprecatedOptions > With the improved and matured data channel cipher negotiation, the use > of ``ncp-disable`` should not be necessary anymore. > > +- Support for building with OpenSSL 1.0.1 has been removed. The minimum > + supported OpenSSL version is now 1.0.2. > > Overview of changes in 2.4 > ========================== > diff --git a/INSTALL b/INSTALL > index de0eb518..fde0b7cd 100644 > --- a/INSTALL > +++ b/INSTALL > @@ -71,12 +71,13 @@ REQUIRES: > (1) TUN and/or TAP driver to allow user-space programs to control > a virtual point-to-point IP or Ethernet device. See > TUN/TAP Driver Configuration section below for more info. > - > -OPTIONAL (but recommended): > - (1) OpenSSL library, necessary for encryption, version 1.0.1 or higher > + (2) OpenSSL library, necessary for encryption, version 1.0.2 or higher > required, available from http://www.openssl.org/ > - (2) mbed TLS library, an alternative for encryption, version 2.0 or higher > + or > + (3) mbed TLS library, an alternative for encryption, version 2.0 or higher > required, available from https://tls.mbed.org/ > + > +OPTIONAL: > (3) LZO real-time compression library, required for link compression, > available from http://www.oberhumer.com/opensource/lzo/ > OpenBSD users can use ports or packages to install lzo, but remember > diff --git a/configure.ac b/configure.ac > index 45148892..d9ad80b1 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -846,7 +846,7 @@ if test "${with_crypto_library}" = "openssl"; then > # if the user did not explicitly specify flags, try to > autodetect > PKG_CHECK_MODULES( > [OPENSSL], > - [openssl >= 1.0.1], > + [openssl >= 1.0.2], > [have_openssl="yes"], > [] # If this fails, we will do another test next > ) > @@ -861,7 +861,7 @@ if test "${with_crypto_library}" = "openssl"; then > # If pkgconfig check failed or OPENSSL_CFLAGS/OPENSSL_LIBS env vars > # are used, check the version directly in the OpenSSL include file > if test "${have_openssl}" != "yes"; then > - AC_MSG_CHECKING([additionally if OpenSSL is available and > version >= 1.0.1]) > + AC_MSG_CHECKING([additionally if OpenSSL is available and > version >= 1.0.2]) > AC_COMPILE_IFELSE( > [AC_LANG_PROGRAM( > [[ > @@ -869,7 +869,7 @@ if test "${with_crypto_library}" = "openssl"; then > ]], > [[ > /* Version encoding: MNNFFPPS - see opensslv.h for details */ > -#if OPENSSL_VERSION_NUMBER < 0x10001000L > +#if OPENSSL_VERSION_NUMBER < 0x10002000L > #error OpenSSL too old > #endif > ]] > @@ -912,12 +912,9 @@ if test "${with_crypto_library}" = "openssl"; then > [have_crypto_aead_modes="no"] > ) > > + # All supported OpenSSL version (>= 1.0.2) > + # have this feature
This comment is space-indented, while the surrounding code is tab-indented. > have_export_keying_material="yes" > - AC_CHECK_FUNC( > - [SSL_export_keying_material], > - , > - [have_export_keying_material="no"] > - ) > > AC_CHECK_FUNCS( > [ \ > @@ -938,7 +935,6 @@ if test "${with_crypto_library}" = "openssl"; then > X509_STORE_get0_objects \ > X509_OBJECT_free \ > X509_OBJECT_get_type \ > - EVP_PKEY_id \ > EVP_PKEY_get0_RSA \ > EVP_PKEY_get0_DSA \ > EVP_PKEY_get0_EC_KEY \ > diff --git a/src/openvpn/crypto.c b/src/openvpn/crypto.c > index 1ce98184..bbf47ef7 100644 > --- a/src/openvpn/crypto.c > +++ b/src/openvpn/crypto.c > @@ -428,13 +428,6 @@ openvpn_decrypt_aead(struct buffer *buf, struct buffer > work, > tag_ptr = BPTR(buf); > ASSERT(buf_advance(buf, tag_size)); > dmsg(D_PACKET_CONTENT, "DECRYPT MAC: %s", format_hex(tag_ptr, tag_size, > 0, &gc)); > -#if defined(ENABLE_CRYPTO_OPENSSL) && OPENSSL_VERSION_NUMBER < 0x10001040L > - /* OpenSSL <= 1.0.1c bug requires set tag before processing ciphertext */ > - if (!EVP_CIPHER_CTX_ctrl(ctx->cipher, EVP_CTRL_GCM_SET_TAG, tag_size, > tag_ptr)) > - { > - CRYPT_ERROR("setting tag failed"); > - } > -#endif > > if (buf->len < 1) > { > diff --git a/src/openvpn/openssl_compat.h b/src/openvpn/openssl_compat.h > index 4ac8f24d..d35251fb 100644 > --- a/src/openvpn/openssl_compat.h > +++ b/src/openvpn/openssl_compat.h > @@ -271,20 +271,6 @@ EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey) > } > #endif > > -#if !defined(HAVE_EVP_PKEY_ID) > -/** > - * Get the PKEY type > - * > - * @param pkey Public key object > - * @return The key type > - */ > -static inline int > -EVP_PKEY_id(const EVP_PKEY *pkey) > -{ > - return pkey ? pkey->type : EVP_PKEY_NONE; > -} > -#endif > - > #if !defined(HAVE_EVP_PKEY_GET0_DSA) > /** > * Get the DSA object of a public key > diff --git a/src/openvpn/options.c b/src/openvpn/options.c > index b6b8d769..a20b27c9 100644 > --- a/src/openvpn/options.c > +++ b/src/openvpn/options.c > @@ -8671,7 +8671,7 @@ add_option(struct options *options, > options->keying_material_exporter_label = p[1]; > options->keying_material_exporter_length = ekm_length; > } > -#endif /* if defined(ENABLE_CRYPTO_OPENSSL) && OPENSSL_VERSION_NUMBER >= > 0x10001000 */ > +#endif /* HAVE_EXPORT_KEYING_MATERIAL */ > else if (streq(p[0], "allow-recursive-routing") && !p[1]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > diff --git a/src/openvpn/ssl_mbedtls.c b/src/openvpn/ssl_mbedtls.c > index f518f593..977ff5c3 100644 > --- a/src/openvpn/ssl_mbedtls.c > +++ b/src/openvpn/ssl_mbedtls.c > @@ -1108,7 +1108,7 @@ key_state_ssl_init(struct key_state_ssl *ks_ssl, > } > } > > -#if HAVE_EXPORT_KEYING_MATERIAL > +#ifdef HAVE_EXPORT_KEYING_MATERIAL > /* Initialize keying material exporter */ > if (session->opt->ekm_size) > { > diff --git a/src/openvpn/ssl_openssl.c b/src/openvpn/ssl_openssl.c > index 07d422c9..14d52bfa 100644 > --- a/src/openvpn/ssl_openssl.c > +++ b/src/openvpn/ssl_openssl.c > @@ -164,7 +164,6 @@ key_state_export_keying_material(struct key_state_ssl > *ssl, > { > if (session->opt->ekm_size > 0) > { > -#if (OPENSSL_VERSION_NUMBER >= 0x10001000) > unsigned int size = session->opt->ekm_size; > struct gc_arena gc = gc_new(); > unsigned char *ekm = (unsigned char *) gc_malloc(size, true, &gc); > @@ -188,7 +187,6 @@ key_state_export_keying_material(struct key_state_ssl > *ssl, > setenv_del(session->opt->es, "exported_keying_material"); > } > gc_free(&gc); > -#endif /* if (OPENSSL_VERSION_NUMBER >= 0x10001000) */ > } > } > > @@ -559,7 +557,7 @@ tls_ctx_set_cert_profile(struct tls_root_ctx *ctx, const > char *profile) > #else /* ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL */ > if (profile) > { > - msg(M_WARN, "WARNING: OpenSSL 1.0.1 does not support > --tls-cert-profile" > + msg(M_WARN, "WARNING: OpenSSL 1.0.2 does not support > --tls-cert-profile" > ", ignoring user-set profile: '%s'", profile); > } > #endif /* ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL */ > @@ -573,19 +571,11 @@ tls_ctx_check_cert_time(const struct tls_root_ctx *ctx) > > ASSERT(ctx); > > -#if (OPENSSL_VERSION_NUMBER >= 0x10002000L && > !defined(LIBRESSL_VERSION_NUMBER)) \ > - || LIBRESSL_VERSION_NUMBER >= 0x2070000fL > - /* OpenSSL 1.0.2 and up */ > cert = SSL_CTX_get0_certificate(ctx->ctx); > -#else > - /* OpenSSL 1.0.1 and earlier need an SSL object to get at the > certificate */ > - SSL *ssl = SSL_new(ctx->ctx); > - cert = SSL_get_certificate(ssl); > -#endif > > if (cert == NULL) > { > - goto cleanup; /* Nothing to check if there is no certificate */ > + return; /* Nothing to check if there is no certificate */ > } > > ret = X509_cmp_time(X509_get0_notBefore(cert), NULL); > @@ -607,13 +597,6 @@ tls_ctx_check_cert_time(const struct tls_root_ctx *ctx) > { > msg(M_WARN, "WARNING: Your certificate has expired!"); > } > - > -cleanup: > -#if OPENSSL_VERSION_NUMBER < 0x10002000L \ > - || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < > 0x2070000fL) > - SSL_free(ssl); > -#endif > - return; > } > > void > @@ -680,7 +663,6 @@ tls_ctx_load_ecdh_params(struct tls_root_ctx *ctx, const > char *curve_name > } > else > { > -#if OPENSSL_VERSION_NUMBER >= 0x10002000L > #if (OPENSSL_VERSION_NUMBER < 0x10100000L && > !defined(LIBRESSL_VERSION_NUMBER)) > > /* OpenSSL 1.0.2 and newer can automatically handle ECDH parameter > @@ -691,29 +673,6 @@ tls_ctx_load_ecdh_params(struct tls_root_ctx *ctx, const > char *curve_name > * so do nothing */ > #endif > return; > -#else /* if OPENSSL_VERSION_NUMBER >= 0x10002000L */ > - /* For older OpenSSL we have to extract the curve from key on our > own */ > - EC_KEY *eckey = NULL; > - const EC_GROUP *ecgrp = NULL; > - EVP_PKEY *pkey = NULL; > - > - /* Little hack to get private key ref from SSL_CTX, yay OpenSSL... */ > - SSL *ssl = SSL_new(ctx->ctx); > - if (!ssl) > - { > - crypto_msg(M_FATAL, "SSL_new failed"); > - } > - pkey = SSL_get_privatekey(ssl); > - SSL_free(ssl); > - > - msg(D_TLS_DEBUG, "Extracting ECDH curve from private key"); > - > - if (pkey != NULL && (eckey = EVP_PKEY_get1_EC_KEY(pkey)) != NULL > - && (ecgrp = EC_KEY_get0_group(eckey)) != NULL) > - { > - nid = EC_GROUP_get_curve_name(ecgrp); > - } > -#endif /* if OPENSSL_VERSION_NUMBER >= 0x10002000L */ > } > > /* Translate NID back to name , just for kicks */ > @@ -1462,15 +1421,7 @@ tls_ctx_use_management_external_key(struct > tls_root_ctx *ctx) > > ASSERT(NULL != ctx); > > -#if (OPENSSL_VERSION_NUMBER >= 0x10002000L && > !defined(LIBRESSL_VERSION_NUMBER)) \ > - || LIBRESSL_VERSION_NUMBER >= 0x2070000fL > - /* OpenSSL 1.0.2 and up */ > X509 *cert = SSL_CTX_get0_certificate(ctx->ctx); > -#else > - /* OpenSSL 1.0.1 and earlier need an SSL object to get at the > certificate */ > - SSL *ssl = SSL_new(ctx->ctx); > - X509 *cert = SSL_get_certificate(ssl); > -#endif > > ASSERT(NULL != cert); > > @@ -1510,13 +1461,6 @@ tls_ctx_use_management_external_key(struct > tls_root_ctx *ctx) > > ret = 0; > cleanup: > -#if OPENSSL_VERSION_NUMBER < 0x10002000L \ > - || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < > 0x2070000fL) > - if (ssl) > - { > - SSL_free(ssl); > - } > -#endif > if (ret) > { > crypto_msg(M_FATAL, "Cannot enable SSL external private key > capability"); > Otherwise this now looks good to me. So if the whitespace can fixed when committing: Acked-by: Steffan Karger <steffan.kar...@foxcrypto.com> -Steffan _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel