From 97e9a61fd5631985232923cff83b2ddc0ca476c0 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 5 Oct 2018 03:13:30 +0200 Subject: crypto: test all SIMD combinations --- src/crypto/zinc/blake2s/blake2s-x86_64-glue.c | 1 + src/crypto/zinc/blake2s/blake2s.c | 7 ++-- src/crypto/zinc/chacha20/chacha20-arm-glue.c | 2 +- src/crypto/zinc/chacha20/chacha20-mips-glue.c | 2 +- src/crypto/zinc/chacha20/chacha20-x86_64-glue.c | 3 ++ src/crypto/zinc/chacha20/chacha20.c | 7 ++-- src/crypto/zinc/chacha20poly1305.c | 7 ++-- src/crypto/zinc/curve25519/curve25519-arm-glue.c | 2 +- .../zinc/curve25519/curve25519-x86_64-glue.c | 2 + src/crypto/zinc/curve25519/curve25519.c | 7 ++-- src/crypto/zinc/poly1305/poly1305-arm-glue.c | 1 + src/crypto/zinc/poly1305/poly1305-mips-glue.c | 1 + src/crypto/zinc/poly1305/poly1305-x86_64-glue.c | 2 + src/crypto/zinc/poly1305/poly1305.c | 7 ++-- src/crypto/zinc/selftest/blake2s.c | 5 --- src/crypto/zinc/selftest/chacha20.c | 4 -- src/crypto/zinc/selftest/chacha20poly1305.c | 4 -- src/crypto/zinc/selftest/curve25519.c | 4 -- src/crypto/zinc/selftest/poly1305.c | 5 --- src/crypto/zinc/selftest/run.h | 49 ++++++++++++++++++++++ 20 files changed, 82 insertions(+), 40 deletions(-) create mode 100644 src/crypto/zinc/selftest/run.h (limited to 'src/crypto') diff --git a/src/crypto/zinc/blake2s/blake2s-x86_64-glue.c b/src/crypto/zinc/blake2s/blake2s-x86_64-glue.c index 7be9809..1319480 100644 --- a/src/crypto/zinc/blake2s/blake2s-x86_64-glue.c +++ b/src/crypto/zinc/blake2s/blake2s-x86_64-glue.c @@ -17,6 +17,7 @@ asmlinkage void blake2s_compress_avx512(struct blake2s_state *state, static bool blake2s_use_avx __ro_after_init; static bool blake2s_use_avx512 __ro_after_init; +static bool *const blake2s_nobs[] __initconst = { &blake2s_use_avx512 }; static void __init blake2s_fpu_init(void) { diff --git a/src/crypto/zinc/blake2s/blake2s.c b/src/crypto/zinc/blake2s/blake2s.c index fe4d4b4..311c3fd 100644 --- a/src/crypto/zinc/blake2s/blake2s.c +++ b/src/crypto/zinc/blake2s/blake2s.c @@ -10,6 +10,7 @@ */ #include +#include "../selftest/run.h" #include #include @@ -112,6 +113,7 @@ EXPORT_SYMBOL(blake2s_init_key); #if defined(CONFIG_ZINC_ARCH_X86_64) #include "blake2s-x86_64-glue.c" #else +static bool *const blake2s_nobs[] __initconst = { }; static void __init blake2s_fpu_init(void) { } @@ -283,10 +285,9 @@ static int __init mod_init(void) { if (!nosimd) blake2s_fpu_init(); -#ifdef CONFIG_ZINC_SELFTEST - if (WARN_ON(!blake2s_selftest())) + if (!selftest_run("blake2s", blake2s_selftest, blake2s_nobs, + ARRAY_SIZE(blake2s_nobs))) return -ENOTRECOVERABLE; -#endif return 0; } diff --git a/src/crypto/zinc/chacha20/chacha20-arm-glue.c b/src/crypto/zinc/chacha20/chacha20-arm-glue.c index a397d84..a0da95d 100644 --- a/src/crypto/zinc/chacha20/chacha20-arm-glue.c +++ b/src/crypto/zinc/chacha20/chacha20-arm-glue.c @@ -17,7 +17,7 @@ asmlinkage void chacha20_neon(u8 *out, const u8 *in, const size_t len, const u32 key[8], const u32 counter[4]); static bool chacha20_use_neon __ro_after_init; - +static bool *const chacha20_nobs[] __initconst = { &chacha20_use_neon }; static void __init chacha20_fpu_init(void) { #if defined(CONFIG_ZINC_ARCH_ARM64) diff --git a/src/crypto/zinc/chacha20/chacha20-mips-glue.c b/src/crypto/zinc/chacha20/chacha20-mips-glue.c index 04235ca..917d8fa 100644 --- a/src/crypto/zinc/chacha20/chacha20-mips-glue.c +++ b/src/crypto/zinc/chacha20/chacha20-mips-glue.c @@ -5,7 +5,7 @@ asmlinkage void chacha20_mips(u32 state[16], u8 *out, const u8 *in, const size_t len); - +static bool *const chacha20_nobs[] __initconst = { }; static void __init chacha20_fpu_init(void) { } diff --git a/src/crypto/zinc/chacha20/chacha20-x86_64-glue.c b/src/crypto/zinc/chacha20/chacha20-x86_64-glue.c index b89d5e1..f5a9c21 100644 --- a/src/crypto/zinc/chacha20/chacha20-x86_64-glue.c +++ b/src/crypto/zinc/chacha20/chacha20-x86_64-glue.c @@ -23,6 +23,9 @@ static bool chacha20_use_ssse3 __ro_after_init; static bool chacha20_use_avx2 __ro_after_init; static bool chacha20_use_avx512 __ro_after_init; static bool chacha20_use_avx512vl __ro_after_init; +static bool *const chacha20_nobs[] __initconst = { + &chacha20_use_ssse3, &chacha20_use_avx2, &chacha20_use_avx512, + &chacha20_use_avx512vl }; static void __init chacha20_fpu_init(void) { diff --git a/src/crypto/zinc/chacha20/chacha20.c b/src/crypto/zinc/chacha20/chacha20.c index bc7e9be..971391c 100644 --- a/src/crypto/zinc/chacha20/chacha20.c +++ b/src/crypto/zinc/chacha20/chacha20.c @@ -8,6 +8,7 @@ */ #include +#include "../selftest/run.h" #include #include @@ -22,6 +23,7 @@ #elif defined(CONFIG_ZINC_ARCH_MIPS) #include "chacha20-mips-glue.c" #else +static bool *const chacha20_nobs[] __initconst = { }; static void __init chacha20_fpu_init(void) { } @@ -171,10 +173,9 @@ static int __init mod_init(void) { if (!nosimd) chacha20_fpu_init(); -#ifdef CONFIG_ZINC_SELFTEST - if (WARN_ON(!chacha20_selftest())) + if (!selftest_run("chacha20", chacha20_selftest, chacha20_nobs, + ARRAY_SIZE(chacha20_nobs))) return -ENOTRECOVERABLE; -#endif return 0; } diff --git a/src/crypto/zinc/chacha20poly1305.c b/src/crypto/zinc/chacha20poly1305.c index 6c8ff3a..6f709e0 100644 --- a/src/crypto/zinc/chacha20poly1305.c +++ b/src/crypto/zinc/chacha20poly1305.c @@ -10,6 +10,8 @@ #include #include #include +#include "selftest/run.h" + #include #include #include @@ -347,10 +349,9 @@ int __init chacha20poly1305_mod_init(void) static int __init mod_init(void) #endif { -#ifdef CONFIG_ZINC_SELFTEST - if (WARN_ON(!chacha20poly1305_selftest())) + if (!selftest_run("chacha20poly1305", chacha20poly1305_selftest, + NULL, 0)) return -ENOTRECOVERABLE; -#endif return 0; } diff --git a/src/crypto/zinc/curve25519/curve25519-arm-glue.c b/src/crypto/zinc/curve25519/curve25519-arm-glue.c index cea06f3..c71c981 100644 --- a/src/crypto/zinc/curve25519/curve25519-arm-glue.c +++ b/src/crypto/zinc/curve25519/curve25519-arm-glue.c @@ -12,7 +12,7 @@ asmlinkage void curve25519_neon(u8 mypublic[CURVE25519_KEY_SIZE], const u8 basepoint[CURVE25519_KEY_SIZE]); static bool curve25519_use_neon __ro_after_init; - +static bool *const curve25519_nobs[] __initconst = { &curve25519_use_neon }; static void __init curve25519_fpu_init(void) { curve25519_use_neon = elf_hwcap & HWCAP_NEON; diff --git a/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c b/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c index 34ff1d8..a0e35bb 100644 --- a/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c +++ b/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c @@ -10,6 +10,8 @@ static bool curve25519_use_bmi2 __ro_after_init; static bool curve25519_use_adx __ro_after_init; +static bool *const curve25519_nobs[] __initconst = { + &curve25519_use_bmi2, &curve25519_use_adx }; static void __init curve25519_fpu_init(void) { diff --git a/src/crypto/zinc/curve25519/curve25519.c b/src/crypto/zinc/curve25519/curve25519.c index 5fd4040..64efa60 100644 --- a/src/crypto/zinc/curve25519/curve25519.c +++ b/src/crypto/zinc/curve25519/curve25519.c @@ -10,6 +10,7 @@ */ #include +#include "../selftest/run.h" #include #include @@ -24,6 +25,7 @@ #elif defined(CONFIG_ZINC_ARCH_ARM) #include "curve25519-arm-glue.c" #else +static bool *const curve25519_nobs[] __initconst = { }; static void __init curve25519_fpu_init(void) { } @@ -98,10 +100,9 @@ static int __init mod_init(void) { if (!nosimd) curve25519_fpu_init(); -#ifdef CONFIG_ZINC_SELFTEST - if (WARN_ON(!curve25519_selftest())) + if (!selftest_run("curve25519", curve25519_selftest, curve25519_nobs, + ARRAY_SIZE(curve25519_nobs))) return -ENOTRECOVERABLE; -#endif return 0; } diff --git a/src/crypto/zinc/poly1305/poly1305-arm-glue.c b/src/crypto/zinc/poly1305/poly1305-arm-glue.c index f91066f..f4f08ec 100644 --- a/src/crypto/zinc/poly1305/poly1305-arm-glue.c +++ b/src/crypto/zinc/poly1305/poly1305-arm-glue.c @@ -15,6 +15,7 @@ asmlinkage void poly1305_blocks_neon(void *ctx, const u8 *inp, const size_t len, asmlinkage void poly1305_emit_neon(void *ctx, u8 mac[16], const u32 nonce[4]); static bool poly1305_use_neon __ro_after_init; +static bool *const poly1305_nobs[] __initconst = { &poly1305_use_neon }; static void __init poly1305_fpu_init(void) { diff --git a/src/crypto/zinc/poly1305/poly1305-mips-glue.c b/src/crypto/zinc/poly1305/poly1305-mips-glue.c index 3a72d61..1eba951 100644 --- a/src/crypto/zinc/poly1305/poly1305-mips-glue.c +++ b/src/crypto/zinc/poly1305/poly1305-mips-glue.c @@ -8,6 +8,7 @@ asmlinkage void poly1305_blocks_mips(void *ctx, const u8 *inp, const size_t len, const u32 padbit); asmlinkage void poly1305_emit_mips(void *ctx, u8 mac[16], const u32 nonce[4]); +static bool *const poly1305_nobs[] __initconst = { }; static void __init poly1305_fpu_init(void) { } diff --git a/src/crypto/zinc/poly1305/poly1305-x86_64-glue.c b/src/crypto/zinc/poly1305/poly1305-x86_64-glue.c index 3641dc8..0229aca 100644 --- a/src/crypto/zinc/poly1305/poly1305-x86_64-glue.c +++ b/src/crypto/zinc/poly1305/poly1305-x86_64-glue.c @@ -25,6 +25,8 @@ asmlinkage void poly1305_blocks_avx512(void *ctx, const u8 *inp, static bool poly1305_use_avx __ro_after_init; static bool poly1305_use_avx2 __ro_after_init; static bool poly1305_use_avx512 __ro_after_init; +static bool *const poly1305_nobs[] __initconst = { + &poly1305_use_avx, &poly1305_use_avx2, &poly1305_use_avx512 }; static void __init poly1305_fpu_init(void) { diff --git a/src/crypto/zinc/poly1305/poly1305.c b/src/crypto/zinc/poly1305/poly1305.c index 88f94cd..6da8bf1 100644 --- a/src/crypto/zinc/poly1305/poly1305.c +++ b/src/crypto/zinc/poly1305/poly1305.c @@ -8,6 +8,7 @@ */ #include +#include "../selftest/run.h" #include #include @@ -39,6 +40,7 @@ static inline bool poly1305_emit_arch(void *ctx, u8 mac[POLY1305_MAC_SIZE], { return false; } +static bool *const poly1305_nobs[] __initconst = { }; static void __init poly1305_fpu_init(void) { } @@ -146,10 +148,9 @@ static int __init mod_init(void) { if (!nosimd) poly1305_fpu_init(); -#ifdef CONFIG_ZINC_SELFTEST - if (WARN_ON(!poly1305_selftest())) + if (!selftest_run("poly1305", poly1305_selftest, poly1305_nobs, + ARRAY_SIZE(poly1305_nobs))) return -ENOTRECOVERABLE; -#endif return 0; } diff --git a/src/crypto/zinc/selftest/blake2s.c b/src/crypto/zinc/selftest/blake2s.c index 80b8e19..7325a42 100644 --- a/src/crypto/zinc/selftest/blake2s.c +++ b/src/crypto/zinc/selftest/blake2s.c @@ -3,7 +3,6 @@ * Copyright (C) 2015-2018 Jason A. Donenfeld . All Rights Reserved. */ -#ifdef CONFIG_ZINC_SELFTEST static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = { { 0x69, 0x21, 0x7a, 0x30, 0x79, 0x90, 0x80, 0x94, 0xe1, 0x11, 0x21, 0xd0, 0x42, 0x35, 0x4a, 0x7c, @@ -2087,9 +2086,5 @@ static bool __init blake2s_selftest(void) success = false; } } - - if (success) - pr_info("blake2s self-tests: pass\n"); return success; } -#endif diff --git a/src/crypto/zinc/selftest/chacha20.c b/src/crypto/zinc/selftest/chacha20.c index a76600b..b8c9c70 100644 --- a/src/crypto/zinc/selftest/chacha20.c +++ b/src/crypto/zinc/selftest/chacha20.c @@ -3,7 +3,6 @@ * Copyright (C) 2015-2018 Jason A. Donenfeld . All Rights Reserved. */ -#ifdef CONFIG_ZINC_SELFTEST struct chacha20_testvec { const u8 *input, *output, *key; u64 nonce; @@ -2690,8 +2689,6 @@ next_test: } simd_put(&simd_context); - if (success) - pr_info("chacha20 self-tests: pass\n"); out: kfree(offset_input); @@ -2699,4 +2696,3 @@ out: vfree(massive_input); return success; } -#endif diff --git a/src/crypto/zinc/selftest/chacha20poly1305.c b/src/crypto/zinc/selftest/chacha20poly1305.c index fceadb0..571befe 100644 --- a/src/crypto/zinc/selftest/chacha20poly1305.c +++ b/src/crypto/zinc/selftest/chacha20poly1305.c @@ -3,7 +3,6 @@ * Copyright (C) 2015-2018 Jason A. Donenfeld . All Rights Reserved. */ -#ifdef CONFIG_ZINC_SELFTEST struct chacha20poly1305_testvec { const u8 *input, *output, *assoc, *nonce, *key; size_t ilen, alen, nlen; @@ -9027,12 +9026,9 @@ static bool __init chacha20poly1305_selftest(void) success = false; } } - if (success) - pr_info("chacha20poly1305 self-tests: pass\n"); out: kfree(heap_src); kfree(computed_output); return success; } -#endif diff --git a/src/crypto/zinc/selftest/curve25519.c b/src/crypto/zinc/selftest/curve25519.c index 933d65e..fa653d4 100644 --- a/src/crypto/zinc/selftest/curve25519.c +++ b/src/crypto/zinc/selftest/curve25519.c @@ -3,7 +3,6 @@ * Copyright (C) 2015-2018 Jason A. Donenfeld . All Rights Reserved. */ -#ifdef CONFIG_ZINC_SELFTEST struct curve25519_test_vector { u8 private[CURVE25519_KEY_SIZE]; u8 public[CURVE25519_KEY_SIZE]; @@ -1312,8 +1311,5 @@ static bool __init curve25519_selftest(void) } } - if (success) - pr_info("curve25519 self-tests: pass\n"); return success; } -#endif diff --git a/src/crypto/zinc/selftest/poly1305.c b/src/crypto/zinc/selftest/poly1305.c index be0dff6..6b1f872 100644 --- a/src/crypto/zinc/selftest/poly1305.c +++ b/src/crypto/zinc/selftest/poly1305.c @@ -3,7 +3,6 @@ * Copyright (C) 2015-2018 Jason A. Donenfeld . All Rights Reserved. */ -#ifdef CONFIG_ZINC_SELFTEST struct poly1305_testvec { const u8 *input, *output, *key; size_t ilen; @@ -1104,9 +1103,5 @@ static bool __init poly1305_selftest(void) } simd_put(&simd_context); - if (success) - pr_info("poly1305 self-tests: pass\n"); - return success; } -#endif diff --git a/src/crypto/zinc/selftest/run.h b/src/crypto/zinc/selftest/run.h new file mode 100644 index 0000000..4cbafe2 --- /dev/null +++ b/src/crypto/zinc/selftest/run.h @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ +/* + * Copyright (C) 2015-2018 Jason A. Donenfeld . All Rights Reserved. + */ + +#ifndef _ZINC_SELFTEST_RUN_H +#define _ZINC_SELFTEST_RUN_H + +#include +#include +#include + +static inline bool selftest_run(const char *name, bool (*selftest)(void), + bool *const nobs[], unsigned int nobs_len) +{ + unsigned long subset = 0, set = 0; + unsigned int i; + bool ret = true; + + BUILD_BUG_ON(!__builtin_constant_p(nobs_len) || + nobs_len >= BITS_PER_LONG); + + if (!IS_ENABLED(CONFIG_ZINC_SELFTEST)) + return true; + + for (i = 0; i < nobs_len; ++i) + set |= ((unsigned long)*nobs[i]) << i; + + do { + for (i = 0; i < nobs_len; ++i) + *nobs[i] = (subset >> i) & 1; + if (!selftest()) { + pr_err("%s self-test combo 0x%lx: FAIL\n", name, + subset); + ret = false; + } + subset = (subset - set) & set; + } while (subset); + + for (i = 0; i < nobs_len; ++i) + *nobs[i] = (set >> i) & 1; + + if (ret) + pr_info("%s self-tests: pass\n", name); + + return !WARN_ON(!ret); +} + +#endif -- cgit v1.2.3-59-g8ed1b