From patchwork Mon Oct 8 10:49:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arne Schwabe X-Patchwork-Id: 521 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director9.mail.ord1d.rsapps.net ([172.30.191.6]) by backend30.mail.ord1d.rsapps.net with LMTP id qOzqJSrRu1twTgAAIUCqbw for ; Mon, 08 Oct 2018 17:50:34 -0400 Received: from proxy17.mail.ord1d.rsapps.net ([172.30.191.6]) by director9.mail.ord1d.rsapps.net with LMTP id 0EzMJSrRu1u/VgAAalYnBA ; Mon, 08 Oct 2018 17:50:34 -0400 Received: from smtp24.gate.ord1d ([172.30.191.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by proxy17.mail.ord1d.rsapps.net with LMTP id sArKJSrRu1v+FgAAWC7mWg ; Mon, 08 Oct 2018 17:50:34 -0400 X-Spam-Threshold: 95 X-Spam-Score: 0 X-Spam-Flag: NO X-Virus-Scanned: OK X-Orig-To: openvpnslackdevel@openvpn.net X-Originating-Ip: [216.105.38.7] Authentication-Results: smtp24.gate.ord1d.rsapps.net; iprev=pass policy.iprev="216.105.38.7"; spf=pass smtp.mailfrom="openvpn-devel-bounces@lists.sourceforge.net" smtp.helo="lists.sourceforge.net"; dkim=fail (signature verification failed) header.d=sourceforge.net; dkim=fail (signature verification failed) header.d=sf.net; dmarc=none (p=nil; dis=none) header.from=rfc2549.org X-Suspicious-Flag: YES X-Classification-ID: 2e948356-cb44-11e8-9c35-52540091a1c4-1-1 Received: from [216.105.38.7] ([216.105.38.7:3876] helo=lists.sourceforge.net) by smtp24.gate.ord1d.rsapps.net (envelope-from ) (ecelerity 4.2.38.62370 r(:)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id 63/9F-24499-921DBBB5; Mon, 08 Oct 2018 17:50:34 -0400 Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.90_1) (envelope-from ) id 1g9dPC-000402-AE; Mon, 08 Oct 2018 21:49:34 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1g9dPB-0003zj-8s for openvpn-devel@lists.sourceforge.NET; Mon, 08 Oct 2018 21:49:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=References:In-Reply-To:Message-Id:Date:Subject:To: From:Sender:Reply-To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=qF50Tjh3JpGrStnX05S4RFInqI6S1U41Vz5o7ixdjBs=; b=AhjlVSklrt0tJXdvqcCb3CgoLU vVtxYADlfHdZKjNCJDx6gI2inh/IFeQcIPjVZZdSUFzjTb4UHHQv6Ep9o8hJv1BTEv61RdSfvHJNL b34kbRiiov3LV8wEDkhOmULZpEQwM6h6Kh+b3xuZgjkMc4XVRnUCbfMe/wCqDI8K4mn0=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=References:In-Reply-To:Message-Id:Date:Subject:To:From:Sender:Reply-To:Cc :MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=qF50Tjh3JpGrStnX05S4RFInqI6S1U41Vz5o7ixdjBs=; b=Cbx3Ldtkh8f9vKVeIjeO2n1CPm y6Spd9qHwFkvLMDGVfcnNtkivDihi3y5BgY8brSCOJ1COFHeSxQagoMjil4JOJ1E85A7DdY7WhbFf CoCML0CH1cbf1gc4RGMbq1GwI9TSfC8WxoX3mGXlBubNC/jmZ6Oc718PY8SQhmwUMY1Q=; Received: from mail.blinkt.de ([192.26.174.232]) by sfi-mx-3.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) id 1g9dP7-00EgvV-Ur for openvpn-devel@lists.sourceforge.NET; Mon, 08 Oct 2018 21:49:33 +0000 Received: from kamera.blinkt.de ([2001:638:502:390:20c:29ff:fec8:535c]) by mail.blinkt.de with smtp (Exim 4.91 (FreeBSD)) (envelope-from ) id 1g9dP1-000Alt-9G for openvpn-devel@lists.sourceforge.net; Mon, 08 Oct 2018 23:49:23 +0200 Received: (nullmailer pid 11106 invoked by uid 10006); Mon, 08 Oct 2018 21:49:23 -0000 From: Arne Schwabe To: openvpn-devel@lists.sourceforge.net Date: Mon, 8 Oct 2018 23:49:22 +0200 Message-Id: <20181008214923.11058-2-arne@rfc2549.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181008214923.11058-1-arne@rfc2549.org> References: <20181008214923.11058-1-arne@rfc2549.org> X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. 0.2 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different 0.2 AWL AWL: Adjusted score from AWL reputation of From: address X-Headers-End: 1g9dP7-00EgvV-Ur Subject: [Openvpn-devel] [PATCH v2 2/3] Add support for OpenSSL TLS 1.3 when using management-external-key X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox For TLS 1.0 to 1.2 OpenSSL calls us and requires a PKCS1 padded response, for TLS 1.3 it requires to an unpadded response. Since we can PCKS1 pad an unpadded response, we prefer to always query for an unpadded response from the management interface and add the PCKS1 padding ourselves when needed. This patch adds an 'unpadded' parameter to the management-external-key option to signal that it is uses the new unpadded API. Since we cannot support TLS 1.3 without unpadded queries we disable TLS 1.3 otherwise. We also do the same for cryptoapi since it uses the same API. Using the management api client version instead might seem like the more logical way but since we only now that version very late, it would extra logic and complexity to deal with this asynchronous behaviour . Signed-off-by: Arne Schwabe --- doc/management-notes.txt | 7 ++++- src/openvpn/manage.h | 9 ++++--- src/openvpn/options.c | 57 +++++++++++++++++++++++++++++++++++++-- src/openvpn/ssl_openssl.c | 26 +++++++++++++----- 4 files changed, 85 insertions(+), 14 deletions(-) diff --git a/doc/management-notes.txt b/doc/management-notes.txt index 17645c1d..7e61ff50 100644 --- a/doc/management-notes.txt +++ b/doc/management-notes.txt @@ -832,7 +832,12 @@ END Base 64 encoded output of RSA_private_encrypt for RSA or ECDSA_sign() for EC using OpenSSL or mbedtls_pk_sign() using mbed TLS will provide a -correct signature. +correct signature. With the 'nopadding' argument to the +external-management-interface the interface expects unpadded signatures +(RSA_NO_PADDING in OpenSSL). When the 'nopadding' keyword is missing the +interfaces expects PKCS1 padded signatures for RSA keys (RSA_PKCS1_PADDING). +EC signatures are always unpadded. To support TLS 1.3 using unpadded +signatures is required. This capability is intended to allow the use of arbitrary cryptographic service providers with OpenVPN via the management interface. diff --git a/src/openvpn/manage.h b/src/openvpn/manage.h index d24abe09..4fe66abf 100644 --- a/src/openvpn/manage.h +++ b/src/openvpn/manage.h @@ -343,10 +343,11 @@ struct management *management_init(void); #endif #define MF_UNIX_SOCK (1<<8) #define MF_EXTERNAL_KEY (1<<9) -#define MF_UP_DOWN (1<<10) -#define MF_QUERY_REMOTE (1<<11) -#define MF_QUERY_PROXY (1<<12) -#define MF_EXTERNAL_CERT (1<<13) +#define MF_EXTERNAL_KEY_NOPADDING (1<<10) +#define MF_UP_DOWN (1<<11) +#define MF_QUERY_REMOTE (1<<12) +#define MF_QUERY_PROXY (1<<13) +#define MF_EXTERNAL_CERT (1<<14) bool management_open(struct management *man, const char *addr, diff --git a/src/openvpn/options.c b/src/openvpn/options.c index 111534a5..61762791 100644 --- a/src/openvpn/options.c +++ b/src/openvpn/options.c @@ -3025,6 +3025,35 @@ options_postprocess_verify(const struct options *o) } } +#if defined(ENABLE_CRYPTOAPI) || (defined(ENABLE_CRYPTO_OPENSSL) && defined(ENABLE_MANAGEMENT)) +static void +disable_tls13_if_avilable(struct options *o, const char* msg) +{ +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + const int tls_version_max = + (o->ssl_flags >> SSLF_TLS_VERSION_MAX_SHIFT) & + SSLF_TLS_VERSION_MAX_MASK; + + /* + * The library we are *linked* against is OpenSSL 1.1.1 and therefore support TLS 1.3 + * this need to be a runtime version check since we can be compiled against 1.1.0 and + * then the library can be upgraded to 1.1.1 + */ + if (OpenSSL_version_num() >= 0x1010100fL && + (tls_version_max == TLS_VER_UNSPEC || tls_version_max > TLS_VER_1_2)) + { + msg(M_WARN, "%s Setting maximum TLS version to 1.2 ", msg); + o->ssl_flags &= ~(SSLF_TLS_VERSION_MAX_MASK << + SSLF_TLS_VERSION_MAX_SHIFT); + o->ssl_flags |= (TLS_VER_1_1 << SSLF_TLS_VERSION_MAX_SHIFT); + + } +#else + return; +#endif +} +#endif + static void options_postprocess_mutate(struct options *o) { @@ -3105,6 +3134,26 @@ options_postprocess_mutate(struct options *o) } #endif +#if defined(ENABLE_CRYPTO_MBEDTLS) && defined(MANAGMENT_EXTERNAL_KEY) + if (o->management_flags & MF_EXTERNAL_KEY_NOPADDING) + { + msg(M_FATAL, "mbed TLS does not support the 'nopadding' argument for the --management-external-key option"); + } +#endif + +#if defined(ENABLE_CRYPTOAPI) + if (o->cryptoapi_cert) + { + disable_tls13_if_avilable(o, "Warning: cryptapicert used."); + } +#endif +#if defined(ENABLE_CRYPTO_OPENSSL) && defined(ENABLE_MANAGEMENT) + if ((o->management_flags & MF_EXTERNAL_KEY) && !(o->management_flags & MF_EXTERNAL_KEY_NOPADDING)) + { + disable_tls13_if_avilable(o, "Warning: Using management-external-key " + "without nopadding option."); + } +#endif #if P2MP /* * Save certain parms before modifying options via --pull @@ -5178,9 +5227,13 @@ add_option(struct options *options, options->management_write_peer_info_file = p[1]; } #ifdef ENABLE_MANAGEMENT - else if (streq(p[0], "management-external-key") && !p[1]) + else if (streq(p[0], "management-external-key") && !p[2]) { VERIFY_PERMISSION(OPT_P_GENERAL); + if (p[1] && streq(p[1], "nopadding")) + { + options->management_flags |= MF_EXTERNAL_KEY_NOPADDING; + } options->management_flags |= MF_EXTERNAL_KEY; } else if (streq(p[0], "management-external-cert") && p[1] && !p[2]) @@ -8440,4 +8493,4 @@ add_option(struct options *options, } err: gc_free(&gc); -} \ No newline at end of file +} diff --git a/src/openvpn/ssl_openssl.c b/src/openvpn/ssl_openssl.c index 3f1f4658..fd8026b7 100644 --- a/src/openvpn/ssl_openssl.c +++ b/src/openvpn/ssl_openssl.c @@ -1100,15 +1100,27 @@ openvpn_extkey_rsa_finish(RSA *rsa) */ static int get_sig_from_man(const unsigned char *dgst, unsigned int dgstlen, - unsigned char *sig, unsigned int siglen) + unsigned char *sig, unsigned int siglen, bool pkcs1pad) { char *in_b64 = NULL; char *out_b64 = NULL; int len = -1; + int bencret = -1; - /* convert 'dgst' to base64 */ - if (management - && openvpn_base64_encode(dgst, dgstlen, &in_b64) > 0) + if ((management->settings.flags & MF_EXTERNAL_KEY_NOPADDING) && pkcs1pad) + { + /* + * Add PKCS1 signature and replace input with it + * Use our output buffer also als temporary buffer + */ + RSA_padding_add_PKCS1_type_1(sig, siglen, dgst, dgstlen); + bencret = openvpn_base64_encode(sig, siglen, &in_b64); + } + else + { + bencret = openvpn_base64_encode(dgst, dgstlen, &in_b64); + } + if (management && bencret > 0) { out_b64 = management_query_pk_sig(management, in_b64); } @@ -1129,13 +1141,13 @@ rsa_priv_enc(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, i unsigned int len = RSA_size(rsa); int ret = -1; - if (padding != RSA_PKCS1_PADDING) + if (padding != RSA_PKCS1_PADDING && padding != RSA_NO_PADDING) { RSAerr(RSA_F_RSA_OSSL_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE); return -1; } - ret = get_sig_from_man(from, flen, to, len); + ret = get_sig_from_man(from, flen, to, len, padding == RSA_PKCS1_PADDING); return (ret == len)? ret : -1; } @@ -1229,7 +1241,7 @@ 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 capacity = ECDSA_size(ec); - int len = get_sig_from_man(dgst, dgstlen, sig, capacity); + int len = get_sig_from_man(dgst, dgstlen, sig, capacity, false); if (len > 0) {