From patchwork Tue Dec 14 05:59:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 2167 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director10.mail.ord1d.rsapps.net ([172.30.191.6]) by backend41.mail.ord1d.rsapps.net with LMTP id kLw6KOHNuGG1WAAAqwncew (envelope-from ) for ; Tue, 14 Dec 2021 12:01:21 -0500 Received: from proxy15.mail.ord1d.rsapps.net ([172.30.191.6]) by director10.mail.ord1d.rsapps.net with LMTP id UMmrDeLNuGFjegAApN4f7A (envelope-from ) for ; Tue, 14 Dec 2021 12:01:22 -0500 Received: from smtp25.gate.ord1d ([172.30.191.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by proxy15.mail.ord1d.rsapps.net with LMTPS id EFRmDeLNuGGiQAAAAY1PeQ (envelope-from ) for ; Tue, 14 Dec 2021 12:01:22 -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: smtp25.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; 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: 761a139e-5cff-11ec-8d6d-52540081550e-1-1 Received: from [216.105.38.7] ([216.105.38.7:34798] helo=lists.sourceforge.net) by smtp25.gate.ord1d.rsapps.net (envelope-from ) (ecelerity 4.2.38.62370 r(:)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id 30/AA-22155-1EDC8B16; Tue, 14 Dec 2021 12:01:21 -0500 Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.94.2) (envelope-from ) id 1mxBAA-00028F-1H; Tue, 14 Dec 2021 17:00:26 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1mxBA3-00027Z-Br for openvpn-devel@lists.sourceforge.net; Tue, 14 Dec 2021 17:00:19 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: 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=MMTMpx12XIV1O6orh1/1qqZOk2sTKDGcoO1aoOz4NPE=; b=IESXhIRzp1+CT9OJCcLIeHXIYL 8S9qNj9IHsQuc/0GS7aw3TXsIUzA9YeBJstDDa8fwJ9Tgsym1K+Ut9Q+ZH/22qvyTPh9T7vtp43zm w0wfuMB80MGnZvi9vtnJNClFum4+X6wcTlMSUBiP9wf5Cf+LjuMy6m8L7wynnC2GujWM=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: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=MMTMpx12XIV1O6orh1/1qqZOk2sTKDGcoO1aoOz4NPE=; b=PK1z765U1d6Tg6Q6f1js7GdCCE DRqRVZXwrz3RrdIXzZX1AUBXSKcsv2NqPFBaXHLQ4CS6IvE5wBjGcJcYRgDw4IDQ1S/mdXr/0VGza xUjJ3f5jjCVNonmbQitGhqhsyOZlBhmZoAA4XoLZcvkd2IGWZzwUNtc5bxx4hyZhMmY0=; Received: from mail-io1-f47.google.com ([209.85.166.47]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.92.3) id 1mxB9q-00FKXV-EK for openvpn-devel@lists.sourceforge.net; Tue, 14 Dec 2021 17:00:19 +0000 Received: by mail-io1-f47.google.com with SMTP id 14so25235235ioe.2 for ; Tue, 14 Dec 2021 09:00:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=MMTMpx12XIV1O6orh1/1qqZOk2sTKDGcoO1aoOz4NPE=; b=EnUa9Vruq8hhgicG0WEZ+DGcqAkc+rsHghJ0PANqswU6qZSE+Beh8fjcCcA9k6guhL /VQ43L/2Yd1edQ+S9zFCsAsFi0kHfF1mQQev+VWDqiXq5QdmaKuXDtMgeIqTnEEp4hk2 pYiqLqAGNSE/1caILdt4sg85pwmMWoK4EEArW0HTl7IC4zfMXDpRzj9IcroCPiMCq5y3 FYnWaUhuphxupwsruNwAJzG4WOr0gRJKJ6ac4al6PfwnAdXRNbj2uh1ll20yeCkKp1Zb u2attkPWTjTqIvWVH89A4P+yujgsQn6u2FrXmlktpCBXbv6whnSk1BA3MTaqrhm90tXI be+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MMTMpx12XIV1O6orh1/1qqZOk2sTKDGcoO1aoOz4NPE=; b=2++avjt7y1UdOS+IuQbzW3Yomemfjkzvk3U+tgS0m3SbVUUEisH94lRTEJiwxXkFsv qWTWHF7GJ6ufLfJ4mwzP9894HNi1VdE0f8IgaLhnQxaNs7qDrY+kzRUF6ADSj8TdOsxL v2+CfUlB+dgljoMsCptTOpEH0e6fOKcT3oCxnEKKFEMAIf/iMevJcuBLRW5tn9161/Az 1uqvirVxtDPFgoNJR/qSqxJAqdmaSHnMc2bgHfk+XOQ/u5ZGfDDVm9ng0rh/uF1kDw3n NV6PeTr8gxkKBhi+HLEI5XlOI+c9kwRoSml/U94qbSpPkcxiEoyDjP1IxRrg7gA4rRZh aFfg== X-Gm-Message-State: AOAM532CKTiFvYb7cEWxFIZNyTB+wurbnIBx/bQB1Z4oEIbJwqzRqrN2 fNBRuxHEptHHa9uxedSWCFvv/QPkv+Q= X-Google-Smtp-Source: ABdhPJw0yh3vX30iBvvuAFJ9YyM/7OqB7FI2rBx6TbJiYUtXvDBceYcM43jLwklHDmrT0xrVfsrnwQ== X-Received: by 2002:a05:6602:13c4:: with SMTP id o4mr4492962iov.152.1639501200634; Tue, 14 Dec 2021 09:00:00 -0800 (PST) Received: from uranus.home.sansel.ca (bras-vprn-tnhlon4053w-lp130-02-70-51-223-8.dsl.bell.ca. [70.51.223.8]) by smtp.gmail.com with ESMTPSA id e9sm178778ilm.44.2021.12.14.09.00.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 09:00:00 -0800 (PST) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Tue, 14 Dec 2021 11:59:21 -0500 Message-Id: <20211214165928.30676-12-selva.nair@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211214165928.30676-1-selva.nair@gmail.com> References: <20211214165928.30676-1-selva.nair@gmail.com> MIME-Version: 1.0 X-Spam-Report: Spam detection software, running on the system "util-spamd-1.v13.lw.sourceforge.com", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Selva Nair To receive undigested message for signing, indicate support for handling message digesting in the client using an argument "digest" to --management-external-key. For example, to announce pkcs1 padding and digesting support use: Content analysis details: (-0.2 points, 6.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.166.47 listed in wl.mailspike.net] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 T_SPF_HELO_TEMPERROR SPF: test of HELO record failed (temperror) 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [selva.nair[at]gmail.com] -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [209.85.166.47 listed in list.dnswl.org] X-Headers-End: 1mxB9q-00FKXV-EK Subject: [Openvpn-devel] [PATCH v3 11/18] Support sending DigestSign request to management client 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: , Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox From: Selva Nair To receive undigested message for signing, indicate support for handling message digesting in the client using an argument "digest" to --management-external-key. For example, to announce pkcs1 padding and digesting support use: --management-external-key pkcs1 pss digest In PK_SIGN, the algorithm string will get data=message in addition to other relevant options. Note that it is not guaranteed that the client will be prompted with undigested message. This is possible only when OpenSSL calls our provider for DigestSign() as opposed to Sign(). In practice, signature operation always appears to result in a DigestSign() call through the provider interface. Signed-off-by: Selva Nair Acked-By: Arne Schwabe --- src/openvpn/manage.h | 1 + src/openvpn/options.c | 4 +++ src/openvpn/xkey_helper.c | 52 ++++++++++++++++++++++++++++++--------- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/openvpn/manage.h b/src/openvpn/manage.h index 5ed27c0c..9621f479 100644 --- a/src/openvpn/manage.h +++ b/src/openvpn/manage.h @@ -340,6 +340,7 @@ struct management *management_init(void); #define MF_QUERY_PROXY (1<<14) #define MF_EXTERNAL_CERT (1<<15) #define MF_EXTERNAL_KEY_PSSPAD (1<<16) +#define MF_EXTERNAL_KEY_DIGEST (1<<17) bool management_open(struct management *man, const char *addr, diff --git a/src/openvpn/options.c b/src/openvpn/options.c index 3ec9025b..a323367c 100644 --- a/src/openvpn/options.c +++ b/src/openvpn/options.c @@ -5576,6 +5576,10 @@ add_option(struct options *options, { options->management_flags |= MF_EXTERNAL_KEY_PSSPAD; } + else if (streq(p[j], "digest")) + { + options->management_flags |= MF_EXTERNAL_KEY_DIGEST; + } else { msg(msglevel, "Unknown management-external-key flag: %s", p[j]); diff --git a/src/openvpn/xkey_helper.c b/src/openvpn/xkey_helper.c index d63943d2..d09ad635 100644 --- a/src/openvpn/xkey_helper.c +++ b/src/openvpn/xkey_helper.c @@ -138,17 +138,22 @@ int xkey_management_sign(void *unused, unsigned char *sig, size_t *siglen, const unsigned char *tbs, size_t tbslen, XKEY_SIGALG alg) { + dmsg(D_LOW, "In xkey_management_sign with keytype = %s, op = %s", + alg.keytype, alg.op); + (void) unused; char alg_str[128]; unsigned char buf[EVP_MAX_MD_SIZE]; /* for computing digest if required */ size_t buflen = sizeof(buf); - unsigned char enc[EVP_MAX_MD_SIZE + 32]; /* 32 bytes enough for digest inf structure */ + unsigned char enc[EVP_MAX_MD_SIZE + 32]; /* 32 bytes enough for digest info structure */ size_t enc_len = sizeof(enc); unsigned int flags = management->settings.flags; + bool is_message = !strcmp(alg.op, "DigestSign"); /* tbs is message, not digest */ - if (!strcmp(alg.op, "DigestSign")) + /* if management client cannot do digest -- we do it here */ + if (!strcmp(alg.op, "DigestSign") && !(flags & MF_EXTERNAL_KEY_DIGEST)) { dmsg(D_LOW, "xkey_management_sign: computing digest"); if (xkey_digest(tbs, tbslen, buf, &buflen, alg.mdname)) @@ -156,6 +161,7 @@ xkey_management_sign(void *unused, unsigned char *sig, size_t *siglen, tbs = buf; tbslen = buflen; alg.op = "Sign"; + is_message = false; } else { @@ -165,22 +171,38 @@ xkey_management_sign(void *unused, unsigned char *sig, size_t *siglen, if (!strcmp(alg.keytype, "EC")) { - strncpynt(alg_str, "ECDSA", sizeof(alg_str)); + if (!strcmp(alg.op, "Sign")) + { + strncpynt(alg_str, "ECDSA", sizeof(alg_str)); + } + else + { + openvpn_snprintf(alg_str, sizeof(alg_str), "ECDSA,hashalg=%s", alg.mdname); + } } /* else assume RSA key */ else if (!strcmp(alg.padmode, "pkcs1") && (flags & MF_EXTERNAL_KEY_PKCS1PAD)) { - /* management interface expects a pkcs1 encoded digest -- add it */ - if (!encode_pkcs1(enc, &enc_len, alg.mdname, tbs, tbslen)) + /* For Sign, management interface expects a pkcs1 encoded digest -- add it */ + if (!strcmp(alg.op, "Sign")) { - return 0; + if (!encode_pkcs1(enc, &enc_len, alg.mdname, tbs, tbslen)) + { + return 0; + } + tbs = enc; + tbslen = enc_len; + strncpynt(alg_str, "RSA_PKCS1_PADDING", sizeof(alg_str)); + } + /* For undigested message, add hashalg=digest parameter */ + else + { + openvpn_snprintf(alg_str, sizeof(alg_str), "%s,hashalg=%s", + "RSA_PKCS1_PADDING", alg.mdname); } - tbs = enc; - tbslen = enc_len; - - strncpynt(alg_str, "RSA_PKCS1_PADDING", sizeof(alg_str)); } - else if (!strcmp(alg.padmode, "none") && (flags & MF_EXTERNAL_KEY_NOPADDING)) + else if (!strcmp(alg.padmode, "none") && (flags & MF_EXTERNAL_KEY_NOPADDING) + &&!strcmp(alg.op, "Sign")) /* NO_PADDING requires digested data */ { strncpynt(alg_str, "RSA_NO_PADDING", sizeof(alg_str)); } @@ -190,10 +212,16 @@ xkey_management_sign(void *unused, unsigned char *sig, size_t *siglen, "RSA_PKCS1_PSS_PADDING", alg.mdname,alg.saltlen); } else { - msg(M_NONFATAL, "RSA padding mode unknown or not supported by management-client <%s>", + msg(M_NONFATAL, "RSA padding mode not supported by management-client <%s>", alg.padmode); return 0; } + + if (is_message) + { + strncat(alg_str, ",data=message", sizeof(alg_str) - strlen(alg_str) - 1); + } + dmsg(D_LOW, "xkey management_sign: requesting sig with algorithm <%s>", alg_str); char *in_b64 = NULL;