From patchwork Fri Dec 7 08:17:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 634 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director8.mail.ord1d.rsapps.net ([172.31.255.6]) by backend30.mail.ord1d.rsapps.net with LMTP id ALs7LKPHClwWfQAAIUCqbw for ; Fri, 07 Dec 2018 14:18:59 -0500 Received: from proxy20.mail.iad3b.rsapps.net ([172.31.255.6]) by director8.mail.ord1d.rsapps.net with LMTP id CJMIKqPHClwkXgAAfY0hYg ; Fri, 07 Dec 2018 14:18:59 -0500 Received: from smtp31.gate.iad3b ([172.31.255.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by proxy20.mail.iad3b.rsapps.net with LMTP id IFQbJaPHClz3CgAAcDxLoQ ; Fri, 07 Dec 2018 14:18:59 -0500 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: smtp31.gate.iad3b.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; dkim=fail (signature verification failed) header.d=gmail.com; dmarc=fail (p=none; dis=none) header.from=gmail.com X-Suspicious-Flag: YES X-Classification-ID: f24ad1a8-fa54-11e8-bf12-52540005277f-1-1 Received: from [216.105.38.7] ([216.105.38.7:33394] helo=lists.sourceforge.net) by smtp31.gate.iad3b.rsapps.net (envelope-from ) (ecelerity 4.2.38.62370 r(:)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id 9A/38-03641-3A7CA0C5; Fri, 07 Dec 2018 14:18:59 -0500 Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.90_1) (envelope-from ) id 1gVLdL-0004c6-S2; Fri, 07 Dec 2018 19:17:55 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1gVLdK-0004bu-Gb for openvpn-devel@lists.sourceforge.net; Fri, 07 Dec 2018 19:17:54 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=bkEq+qG2N/OMi0U2CcsA9KBOv4GKr+xZi8ZCaOChT1Y=; b=lbS0c73sB17KT6acgTW26T+Jse w6pH/x/Bo7qEUeTy4iebZEwRn6NXsnCHfUQ5g+R+mhK2XxYXIA/LCyZjx3b2oTKTpOhyfEaCRBcOK RuVFNkDRaSur6bK3rQhmB5jFDaFkqvbPhc/PgL40OBsfiFdu9Pz0tuZpySb4xCwu9w4M=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:MIME-Version: Content-Type:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=bkEq+qG2N/OMi0U2CcsA9KBOv4GKr+xZi8ZCaOChT1Y=; b=FUewUXeeKzX7DcbYd353k7dbk1 bVGIX2QeqQMPnEnb270tiYbRRg5K47QtfxiocQbjwX+bdogtkAg+z4EP9bXRDFxT/uQyE/EiIDFcO /u2T4WSBX8C1GE235fZEEdcY0yTm9wilUXc4jZ/YXrHYlxZgxYktcU1b04BCBTOvNDpQ=; Received: from mail-io1-f67.google.com ([209.85.166.67]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.90_1) id 1gVLdI-005UcZ-Sm for openvpn-devel@lists.sourceforge.net; Fri, 07 Dec 2018 19:17:54 +0000 Received: by mail-io1-f67.google.com with SMTP id s22so4112634ioc.8 for ; Fri, 07 Dec 2018 11:17:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=bkEq+qG2N/OMi0U2CcsA9KBOv4GKr+xZi8ZCaOChT1Y=; b=XqArt0joqbQ5v+v4DzuInT3icOqMSTNIUtMMYLHkfETvYJnoMj032kG6Vm5aSvVYCu k+XpvUVSS1kCDv4JCw7ZzeFBNRDcHwVT+zLrwk/FctTOrxIG6FvCiXGeBctJngrUX+/s 83Z9LIfTwiiNSc6dBtH1W/pZI8RH48v5hP0cesESaO2BGYMzf/2vXfTgPNldffFuKTes F14GMC0nlqbX2Xt9yzdZwOxJKxxB0Hg7uVMaAPQmY3smYR+2bhppQlp46KzSJrtLr0Ak GjqjOmYQS0WO/46oOOTf9wIj9JzBfghI0ZDnBF0eEhwLdL0SqeSLEglAyiDJAZguMXh3 xzlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=bkEq+qG2N/OMi0U2CcsA9KBOv4GKr+xZi8ZCaOChT1Y=; b=VElC2rDcurJKjUsmUp3ugfjXjkvlEvDlBU0GjaH3OlI8sIbUFh3sBpfHCAF0gpE/qo 4lS8LTUusw54o2wYl+XCMxXfi9Qti78p7sDj86wR3Xq/TcMqdjNrv4T5PzyGFvUFX+SY DzKgxgTLlwU9GEu427igrDXB0nv+eSL5WXEsYE/d4wKu18tksaoqZojWePnuoULUjqng fXpbGWdzbO1yRP1VgQVrx366ASH7z5RYkOnnVaoeHOk3xmBT1TeR0yGSYMi4WXEzZoOO wOfiyE34w24zEDKn0q01PgHHEBtNqzvcyJn4SpqAJT2VUMG5y9nKBhtfbImKV0g1bzhv Ymkg== X-Gm-Message-State: AA+aEWY2bxmyqj/Y/mbod3GD3caY74Su+pXQiFg0ivCss1rwgZi1iTuA rQCzRoFVtVfcgoChkNbg2cDskONLNqQ= X-Google-Smtp-Source: AFSGD/WCfWN1qeQ3IyYBbooWWs3BOZvkgDi5Y5GTFB/YmPd+DifS+cVWVkTqgtYW08P8HWv88yWJCQ== X-Received: by 2002:a6b:da10:: with SMTP id x16mr2604507iob.101.1544210266662; Fri, 07 Dec 2018 11:17:46 -0800 (PST) Received: from saturn.home.sansel.ca (CPE40167ea0e1c2-CM788df74daaa0.cpe.net.cable.rogers.com. [99.228.215.92]) by smtp.gmail.com with ESMTPSA id l3sm2250080itb.43.2018.12.07.11.17.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 07 Dec 2018 11:17:45 -0800 (PST) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Fri, 7 Dec 2018 14:17:37 -0500 Message-Id: <1544210258-8754-1-git-send-email-selva.nair@gmail.com> X-Mailer: git-send-email 2.1.4 X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (selva.nair[at]gmail.com) -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.166.67 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.166.67 listed in wl.mailspike.net] -0.0 SPF_PASS SPF: sender matches SPF record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-Headers-End: 1gVLdI-005UcZ-Sm Subject: [Openvpn-devel] [PATCH 1/2] Move OpenSSL vs CNG signature digest type mapping to a function 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 From: Selva Nair Also add a function to map OpenSSL padding identifier to corresponding CNG constant. This is to help add support for additional padding types: only refactoring, no functional changes. Signed-off-by: Selva Nair Acked-By: Arne Schwabe --- src/openvpn/cryptoapi.c | 120 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/src/openvpn/cryptoapi.c b/src/openvpn/cryptoapi.c index fa057cb..1ce97f5 100644 --- a/src/openvpn/cryptoapi.c +++ b/src/openvpn/cryptoapi.c @@ -113,6 +113,77 @@ typedef struct _CAPI_DATA { int ref_count; } CAPI_DATA; +/* Translate OpenSSL padding type to CNG padding type + * Returns 0 for unknown/unsupported padding. + */ +static DWORD +cng_padding_type(int padding) +{ + DWORD pad = 0; + + switch (padding) + { + case RSA_NO_PADDING: + break; + + case RSA_PKCS1_PADDING: + pad = BCRYPT_PAD_PKCS1; + break; + + case RSA_PKCS1_PSS_PADDING: + pad = BCRYPT_PAD_PSS; + break; + + default: + msg(M_WARN|M_INFO, "cryptoapicert: unknown OpenSSL padding type %d.", + padding); + } + + return pad; +} + +/* + * Translate OpenSSL hash OID to CNG algorithm name. Returns + * "UNKNOWN" for unsupported algorithms and NULL for MD5+SHA1 + * mixed hash used in TLS 1.1 and earlier. + */ +static const wchar_t * +cng_hash_algo(int md_type) +{ + const wchar_t *alg = L"UNKNOWN"; + switch (md_type) + { + case NID_md5: + alg = BCRYPT_MD5_ALGORITHM; + break; + + case NID_sha1: + alg = BCRYPT_SHA1_ALGORITHM; + break; + + case NID_sha256: + alg = BCRYPT_SHA256_ALGORITHM; + break; + + case NID_sha384: + alg = BCRYPT_SHA384_ALGORITHM; + break; + + case NID_sha512: + alg = BCRYPT_SHA512_ALGORITHM; + break; + + case NID_md5_sha1: + case 0: + alg = NULL; + break; + default: + msg(M_WARN|M_INFO, "cryptoapicert: Unknown hash type NID=0x%x", md_type); + break; + } + return alg; +} + static void CAPI_DATA_free(CAPI_DATA *cd) { @@ -253,7 +324,7 @@ rsa_pub_dec(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, in */ static int priv_enc_CNG(const CAPI_DATA *cd, const wchar_t *hash_algo, const unsigned char *from, - int flen, unsigned char *to, int tlen, int padding) + int flen, unsigned char *to, int tlen, DWORD padding) { NCRYPT_KEY_HANDLE hkey = cd->crypt_prov; DWORD len = 0; @@ -268,7 +339,7 @@ priv_enc_CNG(const CAPI_DATA *cd, const wchar_t *hash_algo, const unsigned char DWORD status; status = NCryptSignHash(hkey, padding? &padinfo : NULL, (BYTE*) from, flen, - to, tlen, &len, padding? BCRYPT_PAD_PKCS1 : 0); + to, tlen, &len, padding); if (status != ERROR_SUCCESS) { SetLastError(status); @@ -302,7 +373,8 @@ rsa_priv_enc(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, i } if (cd->key_spec == CERT_NCRYPT_KEY_SPEC) { - return priv_enc_CNG(cd, NULL, from, flen, to, RSA_size(rsa), padding); + return priv_enc_CNG(cd, NULL, from, flen, to, RSA_size(rsa), + cng_padding_type(padding)); } /* Unfortunately, there is no "CryptSign()" function in CryptoAPI, that would @@ -388,44 +460,16 @@ rsa_sign_CNG(int type, const unsigned char *m, unsigned int m_len, return 0; } - switch (type) + alg = cng_hash_algo(type); + if (alg && wcscmp(alg, L"UNKNOWN") == 0) { - case NID_md5: - alg = BCRYPT_MD5_ALGORITHM; - break; - - case NID_sha1: - alg = BCRYPT_SHA1_ALGORITHM; - break; - - case NID_sha256: - alg = BCRYPT_SHA256_ALGORITHM; - break; - - case NID_sha384: - alg = BCRYPT_SHA384_ALGORITHM; - break; - - case NID_sha512: - alg = BCRYPT_SHA512_ALGORITHM; - break; - - case NID_md5_sha1: - if (m_len != SSL_SIG_LENGTH) - { - RSAerr(RSA_F_RSA_SIGN, RSA_R_INVALID_MESSAGE_LENGTH); - return 0; - } - /* No DigestInfo header is required -- set alg-name to NULL */ - alg = NULL; - break; - default: - msg(M_WARN, "cryptoapicert: Unknown hash type NID=0x%x", type); - RSAerr(RSA_F_RSA_SIGN, RSA_R_UNKNOWN_ALGORITHM_TYPE); - return 0; + RSAerr(RSA_F_RSA_SIGN, RSA_R_UNKNOWN_ALGORITHM_TYPE); + return 0; } - *siglen = priv_enc_CNG(cd, alg, m, (int)m_len, sig, RSA_size(rsa), padding); + *siglen = priv_enc_CNG(cd, alg, m, (int)m_len, sig, RSA_size(rsa), + cng_padding_type(padding)); + return (siglen == 0) ? 0 : 1; }