Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp477088imm; Wed, 26 Sep 2018 01:45:52 -0700 (PDT) X-Google-Smtp-Source: ACcGV62M8Y/1SbXdoLDPqhCucWFwyC0trBWDOxM/mvS+4D2RJ/fD4r28FvQ54SYsdjVM4O8HyzQO X-Received: by 2002:a65:4242:: with SMTP id d2-v6mr4637601pgq.265.1537951551976; Wed, 26 Sep 2018 01:45:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537951551; cv=none; d=google.com; s=arc-20160816; b=pg8etScqBqiLDhHgUb/DCeP3CvwhoDDbBPFYN4MG8veEVF2pB9idj7cw8ANmRJzZSd 32RXwX60jO0jjANOfoEjghK4JXRbTfEWCifpwNVrQml7aYoR3qbo62y46U1GwPixUzxY KcbwJIIu+9fgllfOI3L6KmDrla2kvSCRqM6n03ZcgOKjgO2+Gbe3oOQF4A6mYNyfC6pu VXoWhn0Cegn+N58LL8Mol2sM7nDj9m7IYcK2Zspsnd+xeW8fnf2lToEJiBEYh4rKO3wA yxipWKpeTsoHHNJ05mrjsM4V0LTpR0QFx220FgMQcjL//zkovrAnEzIebG2JMY8g50As FWwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=Rr1HvmgafSH2XAIo8bw7+gik9BF1hKrwBsWHDGDTZPk=; b=lNthjXcKrGGDjms6YxYWeaBMW/0+WsAI/yv0mmKmEXsSf/jUIj0P9lE3TE6PbGvm9H UoblpRIl4tddHxbdNGfU0+238/Ga2YcErwORvLN0n48UEGkxuuwLX4Cq3AxMb/MN39+7 TcuqKOVmuoASV6Rk+10D2KLJJiCj30XUuPWsgC+TebemPrQt91Kww8bGuP3mYk4uN6V1 tIcarzn/oFTTr7jXAiFKBsrbUM515iCOVxca0Eh2TTwxPPFwGzbHaqKe3S6fRfMIYt2S b7WTKUtHcw+5jV3VMkp/+zhMJXVs0lxUNt4uMR3KpYUbPmqW7HvE5Qkk9Le0KCknUPgp XL9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=JBxibkKc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h6-v6si4964764pls.150.2018.09.26.01.45.36; Wed, 26 Sep 2018 01:45:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=JBxibkKc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727324AbeIZO4q (ORCPT + 99 others); Wed, 26 Sep 2018 10:56:46 -0400 Received: from mail-it1-f193.google.com ([209.85.166.193]:55444 "EHLO mail-it1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727244AbeIZO4p (ORCPT ); Wed, 26 Sep 2018 10:56:45 -0400 Received: by mail-it1-f193.google.com with SMTP id c23-v6so1863101itd.5 for ; Wed, 26 Sep 2018 01:44:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=Rr1HvmgafSH2XAIo8bw7+gik9BF1hKrwBsWHDGDTZPk=; b=JBxibkKc8afX6VP/gAgSf9vL9CDP2cdlSQtb1powm9klluXDlwyEq/eWM4T0KyF3NB hharvyw1VtofsQf6n4knOpKTur+yzFkxNU4fu8uBzJcYH2UvfL605zGw9NJx4btM1IIq fJe/aRS6YAYm/JhudiGjtyzvMLC7bb0gtLCqU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Rr1HvmgafSH2XAIo8bw7+gik9BF1hKrwBsWHDGDTZPk=; b=PfnUvxG3vLsyj6OPhOFeQerDcJz+rbN8cr8bUdmV/vQ9qEBw5lbhLF5ar9mXXGcA99 ZwVnhxQfAM/KvxwT81/o6l00/DYZa0LV9MHSwX+U6f/r2jLc3AZZcgksn08YMokvzZuI OkshgogAWh0Tn2gdte+RLj/+P0Yia34/ekPFQe9c/VIXZ6UfI8FGrISFnHJpPy78sF05 vCIzXrqC03zRFF73TtiHCFmS9LFYCT8OrVsgPHzQXI71wE5d5kbABUSX9aKI1sozzILm SayqgwCQCyG4HcVy9cMXxznHYsnQMT1A8HtpKNouYZamNrUV3Dh9oGUOEugnxmeckz9Y xJ8g== X-Gm-Message-State: ABuFfogBu4NBGSvfbL5PcbzcjGO3Q1n2lk2pObiNZQnNxovsjTaGqfKp Guyw1bR7IBQXbLpy4KoL0CZzUUa3zQGch3IKLYRH6g== X-Received: by 2002:a24:e48e:: with SMTP id o136-v6mr4093850ith.58.1537951494452; Wed, 26 Sep 2018 01:44:54 -0700 (PDT) MIME-Version: 1.0 References: <20180807211843.47586-1-keescook@chromium.org> <20180807211843.47586-8-keescook@chromium.org> In-Reply-To: From: Ard Biesheuvel Date: Wed, 26 Sep 2018 10:44:41 +0200 Message-ID: Subject: Re: [PATCH v8 7/9] crypto: qat: Remove VLA usage To: Arnd Bergmann Cc: Kees Cook , Herbert Xu , Eric Biggers , Giovanni Cabiddu , "Alasdair G. Kergon" , Mike Snitzer , Tudor-Dan Ambarus , Andrew Morton , Thomas Gleixner , Geert Uytterhoeven , Will Deacon , Rasmus Villemoes , David Woodhouse , Matthew Wilcox , "David S. Miller" , "Gustavo A. R. Silva" , "open list:HARDWARE RANDOM NUMBER GENERATOR CORE" , device-mapper development , qat-linux@intel.com, Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 25 Sep 2018 at 18:12, Arnd Bergmann wrote: > > On Tue, Aug 7, 2018 at 11:18 PM Kees Cook wrote: > > > > In the quest to remove all stack VLA usage from the kernel[1], this uses > > the new upper bound for the stack buffer. Also adds a sanity check. > > > > [1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com > > > > Signed-off-by: Kees Cook > > After rebasing to linux-next, I now get a warning about this file: > > drivers/crypto/qat/qat_common/qat_algs.c: In function 'qat_alg_do_precomputes': > drivers/crypto/qat/qat_common/qat_algs.c:257:1: error: the frame size > of 1112 bytes is larger than 1024 bytes [-Werror=frame-larger-than=] > > I assume it was already possible to get into that state with the VLA, > but it seems bad enough that I think we need to do something > about it. > > The large stack variables add up to 1084 bytes, which fully explains > how we got here: > > SHASH_DESC_ON_STACK(shash, ctx->hash_tfm); /* 360 */ > struct sha1_state sha1; /* 92 */ > struct sha256_state sha256; /* 104 */ > struct sha512_state sha512; /* 208 */ > char ipad[MAX_ALGAPI_BLOCKSIZE]; /* 160 */ > char opad[MAX_ALGAPI_BLOCKSIZE]; /* 160 */ > > The question is what we can do about it. One simple step I've tried > is to move the sha1/sha256/sha512 into a union, which saves around > 200 bytes and should bring us (slightly) below the warning > limit, but I suspect we can do better than that. Any ideas? > All the processing takes place in the context of a setkey() operation, which means only one such operation should be in flight per tfm at any given time. So we could move all these pieces into the tfm context struct instead. Something like the below [untested] (whitespace mangling courtesy of Gmail) diff --git a/drivers/crypto/qat/qat_common/qat_algs.c b/drivers/crypto/qat/qat_common/qat_algs.c index 1138e41d6805..c14f1906bdf4 100644 --- a/drivers/crypto/qat/qat_common/qat_algs.c +++ b/drivers/crypto/qat/qat_common/qat_algs.c @@ -113,6 +113,13 @@ struct qat_alg_aead_ctx { struct crypto_shash *hash_tfm; enum icp_qat_hw_auth_algo qat_hash_alg; struct qat_crypto_instance *inst; + union { + struct sha1_state sha1; + struct sha256_state sha256; + struct sha512_state sha512; + }; + char ipad[MAX_ALGAPI_BLOCKSIZE]; + char opad[MAX_ALGAPI_BLOCKSIZE]; }; struct qat_alg_ablkcipher_ctx { @@ -148,37 +155,32 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash, unsigned int auth_keylen) { SHASH_DESC_ON_STACK(shash, ctx->hash_tfm); - struct sha1_state sha1; - struct sha256_state sha256; - struct sha512_state sha512; int block_size = crypto_shash_blocksize(ctx->hash_tfm); int digest_size = crypto_shash_digestsize(ctx->hash_tfm); - char ipad[block_size]; - char opad[block_size]; __be32 *hash_state_out; __be64 *hash512_state_out; int i, offset; - memset(ipad, 0, block_size); - memset(opad, 0, block_size); + memset(ctx->ipad, 0, block_size); + memset(ctx->opad, 0, block_size); shash->tfm = ctx->hash_tfm; shash->flags = 0x0; if (auth_keylen > block_size) { int ret = crypto_shash_digest(shash, auth_key, - auth_keylen, ipad); + auth_keylen, ctx->ipad); if (ret) return ret; - memcpy(opad, ipad, digest_size); + memcpy(ctx->opad, ctx->ipad, digest_size); } else { - memcpy(ipad, auth_key, auth_keylen); - memcpy(opad, auth_key, auth_keylen); + memcpy(ctx->ipad, auth_key, auth_keylen); + memcpy(ctx->opad, auth_key, auth_keylen); } for (i = 0; i < block_size; i++) { - char *ipad_ptr = ipad + i; - char *opad_ptr = opad + i; + char *ipad_ptr = ctx->ipad + i; + char *opad_ptr = ctx->opad + i; *ipad_ptr ^= HMAC_IPAD_VALUE; *opad_ptr ^= HMAC_OPAD_VALUE; } @@ -186,7 +188,7 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash, if (crypto_shash_init(shash)) return -EFAULT; - if (crypto_shash_update(shash, ipad, block_size)) + if (crypto_shash_update(shash, ctx->ipad, block_size)) return -EFAULT; hash_state_out = (__be32 *)hash->sha.state1; @@ -194,22 +196,22 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash, switch (ctx->qat_hash_alg) { case ICP_QAT_HW_AUTH_ALGO_SHA1: - if (crypto_shash_export(shash, &sha1)) + if (crypto_shash_export(shash, &ctx->sha1)) return -EFAULT; for (i = 0; i < digest_size >> 2; i++, hash_state_out++) - *hash_state_out = cpu_to_be32(*(sha1.state + i)); + *hash_state_out = cpu_to_be32(*(ctx->sha1.state + i)); break; case ICP_QAT_HW_AUTH_ALGO_SHA256: - if (crypto_shash_export(shash, &sha256)) + if (crypto_shash_export(shash, &ctx->sha256)) return -EFAULT; for (i = 0; i < digest_size >> 2; i++, hash_state_out++) - *hash_state_out = cpu_to_be32(*(sha256.state + i)); + *hash_state_out = cpu_to_be32(*(ctx->sha256.state + i)); break; case ICP_QAT_HW_AUTH_ALGO_SHA512: - if (crypto_shash_export(shash, &sha512)) + if (crypto_shash_export(shash, &ctx->sha512)) return -EFAULT; for (i = 0; i < digest_size >> 3; i++, hash512_state_out++) - *hash512_state_out = cpu_to_be64(*(sha512.state + i)); + *hash512_state_out = cpu_to_be64(*(ctx->sha512.state + i)); break; default: return -EFAULT; @@ -218,7 +220,7 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash, if (crypto_shash_init(shash)) return -EFAULT; - if (crypto_shash_update(shash, opad, block_size)) + if (crypto_shash_update(shash, ctx->opad, block_size)) return -EFAULT; offset = round_up(qat_get_inter_state_size(ctx->qat_hash_alg), 8); @@ -227,28 +229,28 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash, switch (ctx->qat_hash_alg) { case ICP_QAT_HW_AUTH_ALGO_SHA1: - if (crypto_shash_export(shash, &sha1)) + if (crypto_shash_export(shash, &ctx->sha1)) return -EFAULT; for (i = 0; i < digest_size >> 2; i++, hash_state_out++) - *hash_state_out = cpu_to_be32(*(sha1.state + i)); + *hash_state_out = cpu_to_be32(*(ctx->sha1.state + i)); break; case ICP_QAT_HW_AUTH_ALGO_SHA256: - if (crypto_shash_export(shash, &sha256)) + if (crypto_shash_export(shash, &ctx->sha256)) return -EFAULT; for (i = 0; i < digest_size >> 2; i++, hash_state_out++) - *hash_state_out = cpu_to_be32(*(sha256.state + i)); + *hash_state_out = cpu_to_be32(*(ctx->sha256.state + i)); break; case ICP_QAT_HW_AUTH_ALGO_SHA512: - if (crypto_shash_export(shash, &sha512)) + if (crypto_shash_export(shash, &ctx->sha512)) return -EFAULT; for (i = 0; i < digest_size >> 3; i++, hash512_state_out++) - *hash512_state_out = cpu_to_be64(*(sha512.state + i)); + *hash512_state_out = cpu_to_be64(*(ctx->sha512.state + i)); break; default: return -EFAULT; } - memzero_explicit(ipad, block_size); - memzero_explicit(opad, block_size); + memzero_explicit(ctx->ipad, block_size); + memzero_explicit(ctx->opad, block_size); return 0; }