summaryrefslogtreecommitdiffstats
path: root/arch/x86/crypto/aegis256-aesni-glue.c
diff options
context:
space:
mode:
authorOndrej Mosnacek2018-08-03 13:37:50 +0200
committerHerbert Xu2018-08-07 11:51:15 +0200
commit877ccce7cbe8409256616f5e6bdedb08ce2e82db (patch)
treef77516c63353b6e6c4ae7df3390ce30298b59e1e /arch/x86/crypto/aegis256-aesni-glue.c
parentcrypto: arm64 - revert NEON yield for fast AEAD implementations (diff)
downloadkernel-qcow2-linux-877ccce7cbe8409256616f5e6bdedb08ce2e82db.tar.gz
kernel-qcow2-linux-877ccce7cbe8409256616f5e6bdedb08ce2e82db.tar.xz
kernel-qcow2-linux-877ccce7cbe8409256616f5e6bdedb08ce2e82db.zip
crypto: x86/aegis,morus - Fix and simplify CPUID checks
It turns out I had misunderstood how the x86_match_cpu() function works. It evaluates a logical OR of the matching conditions, not logical AND. This caused the CPU feature checks for AEGIS to pass even if only SSE2 (but not AES-NI) was supported (or vice versa), leading to potential crashes if something tried to use the registered algs. This patch switches the checks to a simpler method that is used e.g. in the Camellia x86 code. The patch also removes the MODULE_DEVICE_TABLE declarations which actually seem to cause the modules to be auto-loaded at boot, which is not desired. The crypto API on-demand module loading is sufficient. Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations") Fixes: 6ecc9d9ff91f ("crypto: x86 - Add optimized MORUS implementations") Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com> Tested-by: Milan Broz <gmazyland@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'arch/x86/crypto/aegis256-aesni-glue.c')
-rw-r--r--arch/x86/crypto/aegis256-aesni-glue.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/arch/x86/crypto/aegis256-aesni-glue.c b/arch/x86/crypto/aegis256-aesni-glue.c
index 2b5dd3af8f4d..b5f2a8fd5a71 100644
--- a/arch/x86/crypto/aegis256-aesni-glue.c
+++ b/arch/x86/crypto/aegis256-aesni-glue.c
@@ -375,16 +375,12 @@ static struct aead_alg crypto_aegis256_aesni_alg[] = {
}
};
-static const struct x86_cpu_id aesni_cpu_id[] = {
- X86_FEATURE_MATCH(X86_FEATURE_AES),
- X86_FEATURE_MATCH(X86_FEATURE_XMM2),
- {}
-};
-MODULE_DEVICE_TABLE(x86cpu, aesni_cpu_id);
-
static int __init crypto_aegis256_aesni_module_init(void)
{
- if (!x86_match_cpu(aesni_cpu_id))
+ if (!boot_cpu_has(X86_FEATURE_XMM2) ||
+ !boot_cpu_has(X86_FEATURE_AES) ||
+ !boot_cpu_has(X86_FEATURE_OSXSAVE) ||
+ !cpu_has_xfeatures(XFEATURE_MASK_SSE, NULL))
return -ENODEV;
return crypto_register_aeads(crypto_aegis256_aesni_alg,