Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3076758ybt; Mon, 29 Jun 2020 14:43:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxzO2G2QXpW96MP1dDoiPL4+PbSzM/+MNzEuklUmK7wZTFVzSglPTc7aXwugOX+pZX8hemL X-Received: by 2002:a05:6402:b9b:: with SMTP id cf27mr17396495edb.84.1593466979910; Mon, 29 Jun 2020 14:42:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593466979; cv=none; d=google.com; s=arc-20160816; b=vgBGq+UOtBbERsc3gOSnXIWAmxa4Z0WpnVBP9uYn3SZdB9intlWlZBDgI03BhF9fNv Vj1AKhydIotik/tA6uH5g5XETq3x/jqqd77RDq/sEPzS0bmirV64KDrFO1p70GMMJgx0 S74vg+g+0NLtpBDon+lcARQJKyYR+1geBvYD3J0RMXKRqq5OGr5ls5slSIDSn0jJ8Si8 pPnqf20lt+Uwl2U+99RjLG5xY++QMuW3DHPyuKHnnyyxOppJa/rrgJHkFB3Iw3X/MXLf 1jcE5SYlsteQE8XEQNp9VxK0StEBDbRHJafQcuR5guaDG4wrybKDFXwZ1Pb1jCJWq4UV 3CtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=uC81F+6EPxk0Gjot/Xe/ojOZzo3HknGc1lS4bDErwQ0=; b=G9Sb3qcU5GDCmeEogHojGbPF3xp/8n5hXgYLDtsfk5krfPKbnrdPnTzjoA2TBh5D5N OS5twI/jpL7Qo94dC0C9iqhedu0+lSDTeJ3SbFgx9ADs9hHXm5l0dUtbeUivWqyT5CBO ahSPdkdi/SWN8wl1a6tUxshW+JfxbPP27yjyV1HlUa6xTathndGQc7U5x4PhBgxl/42a 466VBWz6Vsmr0fwd3l8T/eqdJMkH+teSirHDo76yDn4w044XR3OvhRuzphoGR81KpZcF PtG1tGZBbFpZ0RM/T7sDnkIQAgIzwfhIzOtZxVpzIRJNabO1Zu8tMnRO74X+6E9DoFOn bwYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=hjaTxkVQ; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e10si433773edq.65.2020.06.29.14.42.36; Mon, 29 Jun 2020 14:42:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=hjaTxkVQ; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728215AbgF2VlG (ORCPT + 99 others); Mon, 29 Jun 2020 17:41:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:60644 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728199AbgF2SkV (ORCPT ); Mon, 29 Jun 2020 14:40:21 -0400 Received: from localhost.localdomain (82-64-249-211.subs.proxad.net [82.64.249.211]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 93C3C23331; Mon, 29 Jun 2020 07:39:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593416387; bh=7Y5xZ76bHIz+nL86N9wS8g1Q/maA8uLO1WTDULpHDGI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hjaTxkVQo77RnjMTvqsm9J9gDC64ewZzlQTUMR3ICZow8sEUu3OwKFmbP8XoNkjqY 9+BtfIXj3nd5SajtkhkGthbSlf/Vpwb1+hi1Co3uSG/7IAZ5JpdiNXv+rSoi4W75cx Wl7Xl1bRzo3bu8oikqo+03Vhtn4pLEsVNPQwWgHc= From: Ard Biesheuvel To: linux-crypto@vger.kernel.org Cc: herbert@gondor.apana.org.au, Ard Biesheuvel Subject: [PATCH 5/5] crypto: arm/ghash - use variably sized key struct Date: Mon, 29 Jun 2020 09:39:25 +0200 Message-Id: <20200629073925.127538-6-ardb@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200629073925.127538-1-ardb@kernel.org> References: <20200629073925.127538-1-ardb@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org Of the two versions of GHASH that the ARM driver implements, only one performs aggregation, and so the other one has no use for the powers of H to be precomputed, or space to be allocated for them in the key struct. So make the context size dependent on which version is being selected, and while at it, use a static key to carry this decision, and get rid of the function pointer. Signed-off-by: Ard Biesheuvel --- arch/arm/crypto/ghash-ce-glue.c | 51 +++++++++----------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/arch/arm/crypto/ghash-ce-glue.c b/arch/arm/crypto/ghash-ce-glue.c index a00fd329255f..f13401f3e669 100644 --- a/arch/arm/crypto/ghash-ce-glue.c +++ b/arch/arm/crypto/ghash-ce-glue.c @@ -16,6 +16,7 @@ #include #include #include +#include #include MODULE_DESCRIPTION("GHASH hash function using ARMv8 Crypto Extensions"); @@ -27,12 +28,8 @@ MODULE_ALIAS_CRYPTO("ghash"); #define GHASH_DIGEST_SIZE 16 struct ghash_key { - u64 h[2]; - u64 h2[2]; - u64 h3[2]; - u64 h4[2]; - be128 k; + u64 h[][2]; }; struct ghash_desc_ctx { @@ -46,16 +43,12 @@ struct ghash_async_ctx { }; asmlinkage void pmull_ghash_update_p64(int blocks, u64 dg[], const char *src, - struct ghash_key const *k, - const char *head); + u64 const h[][2], const char *head); asmlinkage void pmull_ghash_update_p8(int blocks, u64 dg[], const char *src, - struct ghash_key const *k, - const char *head); + u64 const h[][2], const char *head); -static void (*pmull_ghash_update)(int blocks, u64 dg[], const char *src, - struct ghash_key const *k, - const char *head); +static __ro_after_init DEFINE_STATIC_KEY_FALSE(use_p64); static int ghash_init(struct shash_desc *desc) { @@ -70,7 +63,10 @@ static void ghash_do_update(int blocks, u64 dg[], const char *src, { if (likely(crypto_simd_usable())) { kernel_neon_begin(); - pmull_ghash_update(blocks, dg, src, key, head); + if (static_branch_likely(&use_p64)) + pmull_ghash_update_p64(blocks, dg, src, key->h, head); + else + pmull_ghash_update_p8(blocks, dg, src, key->h, head); kernel_neon_end(); } else { be128 dst = { cpu_to_be64(dg[1]), cpu_to_be64(dg[0]) }; @@ -161,25 +157,26 @@ static int ghash_setkey(struct crypto_shash *tfm, const u8 *inkey, unsigned int keylen) { struct ghash_key *key = crypto_shash_ctx(tfm); - be128 h; if (keylen != GHASH_BLOCK_SIZE) return -EINVAL; /* needed for the fallback */ memcpy(&key->k, inkey, GHASH_BLOCK_SIZE); - ghash_reflect(key->h, &key->k); + ghash_reflect(key->h[0], &key->k); - h = key->k; - gf128mul_lle(&h, &key->k); - ghash_reflect(key->h2, &h); + if (static_branch_likely(&use_p64)) { + be128 h = key->k; - gf128mul_lle(&h, &key->k); - ghash_reflect(key->h3, &h); + gf128mul_lle(&h, &key->k); + ghash_reflect(key->h[1], &h); - gf128mul_lle(&h, &key->k); - ghash_reflect(key->h4, &h); + gf128mul_lle(&h, &key->k); + ghash_reflect(key->h[2], &h); + gf128mul_lle(&h, &key->k); + ghash_reflect(key->h[3], &h); + } return 0; } @@ -195,7 +192,7 @@ static struct shash_alg ghash_alg = { .base.cra_driver_name = "ghash-ce-sync", .base.cra_priority = 300 - 1, .base.cra_blocksize = GHASH_BLOCK_SIZE, - .base.cra_ctxsize = sizeof(struct ghash_key), + .base.cra_ctxsize = sizeof(struct ghash_key) + sizeof(u64[2]), .base.cra_module = THIS_MODULE, }; @@ -354,10 +351,10 @@ static int __init ghash_ce_mod_init(void) if (!(elf_hwcap & HWCAP_NEON)) return -ENODEV; - if (elf_hwcap2 & HWCAP2_PMULL) - pmull_ghash_update = pmull_ghash_update_p64; - else - pmull_ghash_update = pmull_ghash_update_p8; + if (elf_hwcap2 & HWCAP2_PMULL) { + ghash_alg.base.cra_ctxsize += 3 * sizeof(u64[2]); + static_branch_enable(&use_p64); + } err = crypto_register_shash(&ghash_alg); if (err) -- 2.20.1