Skip to content

Commit ac90aad

Browse files
ebiggersherbertx
authored andcommitted
crypto: testmgr - reinstate kconfig control over full self-tests
Commit 698de82 ("crypto: testmgr - make it easier to enable the full set of tests") removed support for building kernels that run only the "fast" set of crypto self-tests by default. This assumed that nearly everyone actually wanted the full set of tests, *if* they had already chosen to enable the tests at all. Unfortunately, it turns out that both Debian and Fedora intentionally have the crypto self-tests enabled in their production kernels. And for production kernels we do need to keep the testing time down, which implies just running the "fast" tests, not the full set of tests. For Fedora, a reason for enabling the tests in production is that they are being (mis)used to meet the FIPS 140-3 pre-operational testing requirement. However, the other reason for enabling the tests in production, which applies to both distros, is that they provide some value in protecting users from buggy drivers. Unfortunately, the crypto/ subsystem has many buggy and untested drivers for off-CPU hardware accelerators on rare platforms. These broken drivers get shipped to users, and there have been multiple examples of the tests preventing these buggy drivers from being used. So effectively, the tests are being relied on in production kernels. I think this is kind of crazy (untested drivers should just not be enabled at all), but that seems to be how things work currently. Thus, reintroduce a kconfig option that controls the level of testing. Call it CRYPTO_SELFTESTS_FULL instead of the original name CRYPTO_MANAGER_EXTRA_TESTS, which was slightly misleading. Moreover, given the "production kernel" use case, make CRYPTO_SELFTESTS depend on EXPERT instead of DEBUG_KERNEL. I also haven't reinstated all the #ifdefs in crypto/testmgr.c. Instead, just rely on the compiler to optimize out unused code. Fixes: 40b9969 ("crypto: testmgr - replace CRYPTO_MANAGER_DISABLE_TESTS with CRYPTO_SELFTESTS") Fixes: 698de82 ("crypto: testmgr - make it easier to enable the full set of tests") Signed-off-by: Eric Biggers <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 40a98e7 commit ac90aad

File tree

4 files changed

+38
-10
lines changed

4 files changed

+38
-10
lines changed

crypto/Kconfig

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,16 +176,33 @@ config CRYPTO_USER
176176

177177
config CRYPTO_SELFTESTS
178178
bool "Enable cryptographic self-tests"
179-
depends on DEBUG_KERNEL
179+
depends on EXPERT
180180
help
181181
Enable the cryptographic self-tests.
182182

183183
The cryptographic self-tests run at boot time, or at algorithm
184184
registration time if algorithms are dynamically loaded later.
185185

186-
This is primarily intended for developer use. It should not be
187-
enabled in production kernels, unless you are trying to use these
188-
tests to fulfill a FIPS testing requirement.
186+
There are two main use cases for these tests:
187+
188+
- Development and pre-release testing. In this case, also enable
189+
CRYPTO_SELFTESTS_FULL to get the full set of tests. All crypto code
190+
in the kernel is expected to pass the full set of tests.
191+
192+
- Production kernels, to help prevent buggy drivers from being used
193+
and/or meet FIPS 140-3 pre-operational testing requirements. In
194+
this case, enable CRYPTO_SELFTESTS but not CRYPTO_SELFTESTS_FULL.
195+
196+
config CRYPTO_SELFTESTS_FULL
197+
bool "Enable the full set of cryptographic self-tests"
198+
depends on CRYPTO_SELFTESTS
199+
help
200+
Enable the full set of cryptographic self-tests for each algorithm.
201+
202+
The full set of tests should be enabled for development and
203+
pre-release testing, but not in production kernels.
204+
205+
All crypto code in the kernel is expected to pass the full tests.
189206

190207
config CRYPTO_NULL
191208
tristate "Null algorithms"

crypto/testmgr.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,18 @@ static bool notests;
4545
module_param(notests, bool, 0644);
4646
MODULE_PARM_DESC(notests, "disable all crypto self-tests");
4747

48+
#ifdef CONFIG_CRYPTO_SELFTESTS_FULL
4849
static bool noslowtests;
4950
module_param(noslowtests, bool, 0644);
5051
MODULE_PARM_DESC(noslowtests, "disable slow crypto self-tests");
5152

5253
static unsigned int fuzz_iterations = 100;
5354
module_param(fuzz_iterations, uint, 0644);
5455
MODULE_PARM_DESC(fuzz_iterations, "number of fuzz test iterations");
56+
#else
57+
#define noslowtests 1
58+
#define fuzz_iterations 0
59+
#endif
5560

5661
#ifndef CONFIG_CRYPTO_SELFTESTS
5762

@@ -319,9 +324,9 @@ struct testvec_config {
319324

320325
/*
321326
* The following are the lists of testvec_configs to test for each algorithm
322-
* type when the fast crypto self-tests are enabled. They aim to provide good
323-
* test coverage, while keeping the test time much shorter than the full tests
324-
* so that the fast tests can be used to fulfill FIPS 140 testing requirements.
327+
* type when the "fast" crypto self-tests are enabled. They aim to provide good
328+
* test coverage, while keeping the test time much shorter than the "full" tests
329+
* so that the "fast" tests can be enabled in a wider range of circumstances.
325330
*/
326331

327332
/* Configs for skciphers and aeads */
@@ -1183,14 +1188,18 @@ static void generate_random_testvec_config(struct rnd_state *rng,
11831188

11841189
static void crypto_disable_simd_for_test(void)
11851190
{
1191+
#ifdef CONFIG_CRYPTO_SELFTESTS_FULL
11861192
migrate_disable();
11871193
__this_cpu_write(crypto_simd_disabled_for_test, true);
1194+
#endif
11881195
}
11891196

11901197
static void crypto_reenable_simd_for_test(void)
11911198
{
1199+
#ifdef CONFIG_CRYPTO_SELFTESTS_FULL
11921200
__this_cpu_write(crypto_simd_disabled_for_test, false);
11931201
migrate_enable();
1202+
#endif
11941203
}
11951204

11961205
/*

include/crypto/internal/simd.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ void simd_unregister_aeads(struct aead_alg *algs, int count,
4444
*
4545
* This delegates to may_use_simd(), except that this also returns false if SIMD
4646
* in crypto code has been temporarily disabled on this CPU by the crypto
47-
* self-tests, in order to test the no-SIMD fallback code.
47+
* self-tests, in order to test the no-SIMD fallback code. This override is
48+
* currently limited to configurations where the "full" self-tests are enabled,
49+
* because it might be a bit too invasive to be part of the "fast" self-tests.
4850
*/
49-
#ifdef CONFIG_CRYPTO_SELFTESTS
51+
#ifdef CONFIG_CRYPTO_SELFTESTS_FULL
5052
DECLARE_PER_CPU(bool, crypto_simd_disabled_for_test);
5153
#define crypto_simd_usable() \
5254
(may_use_simd() && !this_cpu_read(crypto_simd_disabled_for_test))

lib/crypto/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ libsha256-generic-y := sha256-generic.o
6262

6363
obj-$(CONFIG_MPILIB) += mpi/
6464

65-
obj-$(CONFIG_CRYPTO_SELFTESTS) += simd.o
65+
obj-$(CONFIG_CRYPTO_SELFTESTS_FULL) += simd.o
6666

6767
obj-$(CONFIG_CRYPTO_LIB_SM3) += libsm3.o
6868
libsm3-y := sm3.o

0 commit comments

Comments
 (0)