From patchwork Tue Jul 10 15:57:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephan Mueller X-Patchwork-Id: 10517343 X-Patchwork-Delegate: herbert@gondor.apana.org.au Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id F06456032A for ; Tue, 10 Jul 2018 16:44:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DC99129285 for ; Tue, 10 Jul 2018 16:44:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DAC8829309; Tue, 10 Jul 2018 16:44:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7DC5629285 for ; Tue, 10 Jul 2018 16:44:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933652AbeGJQoJ (ORCPT ); Tue, 10 Jul 2018 12:44:09 -0400 Received: from mo4-p01-ob.smtp.rzone.de ([85.215.255.53]:8992 "EHLO mo4-p01-ob.smtp.rzone.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933331AbeGJQoJ (ORCPT ); Tue, 10 Jul 2018 12:44:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1531241047; s=strato-dkim-0002; d=chronox.de; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: X-RZG-CLASS-ID:X-RZG-AUTH:From:Subject:Sender; bh=jDhTUv9MDKHYd2kZmzheRZOuvwq+LY4SPJo8yzCFkDU=; b=QFOD5yYzzvqi0pfhRN14IG/uzOXs2plnYgWgiouB6pTni3ExkEZ7AFD9d3ojyHdRT+ 7TPCudF83W5VsxvcudJC/PrBnYOp7w6Q5YmOQvg4mAG8WhnpNBlgS5YzmrqfZwDecLYH ArED4K1z2UsnhLphvX+0OtEWwOywF+brv5B1YvMZADSPoubiJmUjfifX0i8Be1NU1H2U C8wTla/ulQ7pOYYW+TFIaccc1EdKzb694ryprk6+2TpXDHUnZHenNhn7dWXSuNNKCV5d BycE15cwkXelgVtIr5Zg6Fs0Ceaij64bOE0JGNHycNX95gL/UdJjYRL6uSWgAYsLHDJq 0nqQ== X-RZG-AUTH: ":P2ERcEykfu11Y98lp/T7+hdri+uKZK8TKWEqNyiHySGSa9k9zT8DNpa83PTIZGri7RBBYk2qJvGdF8MiqOOAHCPc8jOeCrHJoAiT" X-RZG-CLASS-ID: mo00 Received: from positron.chronox.de by smtp.strato.de (RZmta 43.12 AUTH) with ESMTPSA id c0bedeu6AGi51pz (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Tue, 10 Jul 2018 18:44:05 +0200 (CEST) From: Stephan =?ISO-8859-1?Q?M=FCller?= To: herbert@gondor.apana.org.au Cc: linux-crypto@vger.kernel.org Subject: [PATCH 2/2] crypto: DRBG - use caller buffer if suitable Date: Tue, 10 Jul 2018 17:57:00 +0200 Message-ID: <1814539.28Fd0X6sOF@positron.chronox.de> In-Reply-To: <39269219.AHKKWf3gz9@positron.chronox.de> References: <39269219.AHKKWf3gz9@positron.chronox.de> MIME-Version: 1.0 Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The SGL can directly operate caller-provided memory with the exception of stack memory. The DRBG detects whether the caller provided non-suitable memory and uses the scratchpad only on those circumstances. This patch increases the speed of the CTR DRBG by 1 to 3 percent depending on the buffer size of the output buffer. Signed-off-by: Stephan Mueller --- crypto/drbg.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/crypto/drbg.c b/crypto/drbg.c index ee302fd229ad..193354e9d207 100644 --- a/crypto/drbg.c +++ b/crypto/drbg.c @@ -1748,14 +1748,20 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg, { struct scatterlist *sg_in = &drbg->sg_in, *sg_out = &drbg->sg_out; int ret; + bool virt_addr_valid = virt_addr_valid(outbuf); sg_set_buf(sg_in, inbuf, inlen); - sg_set_buf(sg_out, drbg->outscratchpad, DRBG_OUTSCRATCHLEN); while (outlen) { - u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN); + u32 cryptlen = min_t(u32, inlen, outlen); /* Output buffer may not be valid for SGL, use scratchpad */ + if (virt_addr_valid) { + sg_set_buf(sg_out, outbuf, cryptlen); + } else { + cryptlen = min_t(u32, cryptlen, DRBG_OUTSCRATCHLEN); + sg_set_buf(sg_out, drbg->outscratchpad, cryptlen); + } skcipher_request_set_crypt(drbg->ctr_req, sg_in, sg_out, cryptlen, drbg->V); ret = crypto_wait_req(crypto_skcipher_encrypt(drbg->ctr_req), @@ -1765,7 +1771,8 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg, crypto_init_wait(&drbg->ctr_wait); - memcpy(outbuf, drbg->outscratchpad, cryptlen); + if (!virt_addr_valid) + memcpy(outbuf, drbg->outscratchpad, cryptlen); outlen -= cryptlen; outbuf += cryptlen; @@ -1773,7 +1780,8 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg, ret = 0; out: - memzero_explicit(drbg->outscratchpad, DRBG_OUTSCRATCHLEN); + if (!virt_addr_valid) + memzero_explicit(drbg->outscratchpad, DRBG_OUTSCRATCHLEN); return ret; } #endif /* CONFIG_CRYPTO_DRBG_CTR */