siphash: Convert selftest to KUnit
Convert the siphash self-test to KUnit so it will be included in "all KUnit tests" coverage, and can be run individually still: $ ./tools/testing/kunit/kunit.py run siphash ... [02:58:45] Starting KUnit Kernel (1/1)... [02:58:45] ============================================================ [02:58:45] =================== siphash (1 subtest) ==================== [02:58:45] [PASSED] siphash_test [02:58:45] ===================== [PASSED] siphash ===================== [02:58:45] ============================================================ [02:58:45] Testing complete. Ran 1 tests: passed: 1 [02:58:45] Elapsed time: 21.421s total, 4.306s configuring, 16.947s building, 0.148s running Cc: Vlastimil Babka <vbabka@suse.cz> Cc: "Steven Rostedt (Google)" <rostedt@goodmis.org> Cc: Yury Norov <yury.norov@gmail.com> Cc: Sander Vanheule <sander@svanheule.net> Acked-by: "Jason A. Donenfeld" <Jason@zx2c4.com> Link: https://lore.kernel.org/lkml/CAHmME9r+9MPH6zk3Vn=buEMSbQiWMFryqqzerKarmjYk+tHLJA@mail.gmail.com Tested-by: David Gow <davidgow@google.com> Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
parent
62e1cbfc5d
commit
fb3d88ab35
|
@ -18864,7 +18864,7 @@ M: Jason A. Donenfeld <Jason@zx2c4.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: include/linux/siphash.h
|
F: include/linux/siphash.h
|
||||||
F: lib/siphash.c
|
F: lib/siphash.c
|
||||||
F: lib/test_siphash.c
|
F: lib/siphash_kunit.c
|
||||||
|
|
||||||
SIS 190 ETHERNET DRIVER
|
SIS 190 ETHERNET DRIVER
|
||||||
M: Francois Romieu <romieu@fr.zoreil.com>
|
M: Francois Romieu <romieu@fr.zoreil.com>
|
||||||
|
|
|
@ -2244,15 +2244,6 @@ config TEST_RHASHTABLE
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
config TEST_SIPHASH
|
|
||||||
tristate "Perform selftest on siphash functions"
|
|
||||||
help
|
|
||||||
Enable this option to test the kernel's siphash (<linux/siphash.h>) hash
|
|
||||||
functions on boot (or module load).
|
|
||||||
|
|
||||||
This is intended to help people writing architecture-specific
|
|
||||||
optimized versions. If unsure, say N.
|
|
||||||
|
|
||||||
config TEST_IDA
|
config TEST_IDA
|
||||||
tristate "Perform selftest on IDA functions"
|
tristate "Perform selftest on IDA functions"
|
||||||
|
|
||||||
|
@ -2585,6 +2576,17 @@ config STRSCPY_KUNIT_TEST
|
||||||
depends on KUNIT
|
depends on KUNIT
|
||||||
default KUNIT_ALL_TESTS
|
default KUNIT_ALL_TESTS
|
||||||
|
|
||||||
|
config SIPHASH_KUNIT_TEST
|
||||||
|
tristate "Perform selftest on siphash functions" if !KUNIT_ALL_TESTS
|
||||||
|
depends on KUNIT
|
||||||
|
default KUNIT_ALL_TESTS
|
||||||
|
help
|
||||||
|
Enable this option to test the kernel's siphash (<linux/siphash.h>) hash
|
||||||
|
functions on boot (or module load).
|
||||||
|
|
||||||
|
This is intended to help people writing architecture-specific
|
||||||
|
optimized versions. If unsure, say N.
|
||||||
|
|
||||||
config TEST_UDELAY
|
config TEST_UDELAY
|
||||||
tristate "udelay test driver"
|
tristate "udelay test driver"
|
||||||
help
|
help
|
||||||
|
|
|
@ -62,7 +62,6 @@ obj-$(CONFIG_TEST_BITOPS) += test_bitops.o
|
||||||
CFLAGS_test_bitops.o += -Werror
|
CFLAGS_test_bitops.o += -Werror
|
||||||
obj-$(CONFIG_CPUMASK_KUNIT_TEST) += cpumask_kunit.o
|
obj-$(CONFIG_CPUMASK_KUNIT_TEST) += cpumask_kunit.o
|
||||||
obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o
|
obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o
|
||||||
obj-$(CONFIG_TEST_SIPHASH) += test_siphash.o
|
|
||||||
obj-$(CONFIG_HASH_KUNIT_TEST) += test_hash.o
|
obj-$(CONFIG_HASH_KUNIT_TEST) += test_hash.o
|
||||||
obj-$(CONFIG_TEST_IDA) += test_ida.o
|
obj-$(CONFIG_TEST_IDA) += test_ida.o
|
||||||
obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
|
obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
|
||||||
|
@ -380,6 +379,7 @@ CFLAGS_stackinit_kunit.o += $(call cc-disable-warning, switch-unreachable)
|
||||||
obj-$(CONFIG_STACKINIT_KUNIT_TEST) += stackinit_kunit.o
|
obj-$(CONFIG_STACKINIT_KUNIT_TEST) += stackinit_kunit.o
|
||||||
obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o
|
obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o
|
||||||
obj-$(CONFIG_STRSCPY_KUNIT_TEST) += strscpy_kunit.o
|
obj-$(CONFIG_STRSCPY_KUNIT_TEST) += strscpy_kunit.o
|
||||||
|
obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o
|
||||||
|
|
||||||
obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
|
obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
|
#include <kunit/test.h>
|
||||||
#include <linux/siphash.h>
|
#include <linux/siphash.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
@ -109,114 +110,88 @@ static const u32 test_vectors_hsiphash[64] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int __init siphash_test_init(void)
|
#define chk(hash, vector, fmt...) \
|
||||||
|
KUNIT_EXPECT_EQ_MSG(test, hash, vector, fmt)
|
||||||
|
|
||||||
|
static void siphash_test(struct kunit *test)
|
||||||
{
|
{
|
||||||
u8 in[64] __aligned(SIPHASH_ALIGNMENT);
|
u8 in[64] __aligned(SIPHASH_ALIGNMENT);
|
||||||
u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
|
u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
|
||||||
u8 i;
|
u8 i;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 64; ++i) {
|
for (i = 0; i < 64; ++i) {
|
||||||
in[i] = i;
|
in[i] = i;
|
||||||
in_unaligned[i + 1] = i;
|
in_unaligned[i + 1] = i;
|
||||||
if (siphash(in, i, &test_key_siphash) !=
|
chk(siphash(in, i, &test_key_siphash),
|
||||||
test_vectors_siphash[i]) {
|
test_vectors_siphash[i],
|
||||||
pr_info("siphash self-test aligned %u: FAIL\n", i + 1);
|
"siphash self-test aligned %u: FAIL", i + 1);
|
||||||
ret = -EINVAL;
|
chk(siphash(in_unaligned + 1, i, &test_key_siphash),
|
||||||
}
|
test_vectors_siphash[i],
|
||||||
if (siphash(in_unaligned + 1, i, &test_key_siphash) !=
|
"siphash self-test unaligned %u: FAIL", i + 1);
|
||||||
test_vectors_siphash[i]) {
|
chk(hsiphash(in, i, &test_key_hsiphash),
|
||||||
pr_info("siphash self-test unaligned %u: FAIL\n", i + 1);
|
test_vectors_hsiphash[i],
|
||||||
ret = -EINVAL;
|
"hsiphash self-test aligned %u: FAIL", i + 1);
|
||||||
}
|
chk(hsiphash(in_unaligned + 1, i, &test_key_hsiphash),
|
||||||
if (hsiphash(in, i, &test_key_hsiphash) !=
|
test_vectors_hsiphash[i],
|
||||||
test_vectors_hsiphash[i]) {
|
"hsiphash self-test unaligned %u: FAIL", i + 1);
|
||||||
pr_info("hsiphash self-test aligned %u: FAIL\n", i + 1);
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
if (hsiphash(in_unaligned + 1, i, &test_key_hsiphash) !=
|
|
||||||
test_vectors_hsiphash[i]) {
|
|
||||||
pr_info("hsiphash self-test unaligned %u: FAIL\n", i + 1);
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (siphash_1u64(0x0706050403020100ULL, &test_key_siphash) !=
|
chk(siphash_1u64(0x0706050403020100ULL, &test_key_siphash),
|
||||||
test_vectors_siphash[8]) {
|
test_vectors_siphash[8],
|
||||||
pr_info("siphash self-test 1u64: FAIL\n");
|
"siphash self-test 1u64: FAIL");
|
||||||
ret = -EINVAL;
|
chk(siphash_2u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
|
||||||
}
|
&test_key_siphash),
|
||||||
if (siphash_2u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
|
test_vectors_siphash[16],
|
||||||
&test_key_siphash) != test_vectors_siphash[16]) {
|
"siphash self-test 2u64: FAIL");
|
||||||
pr_info("siphash self-test 2u64: FAIL\n");
|
chk(siphash_3u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
|
||||||
ret = -EINVAL;
|
0x1716151413121110ULL, &test_key_siphash),
|
||||||
}
|
test_vectors_siphash[24],
|
||||||
if (siphash_3u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
|
"siphash self-test 3u64: FAIL");
|
||||||
0x1716151413121110ULL, &test_key_siphash) !=
|
chk(siphash_4u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
|
||||||
test_vectors_siphash[24]) {
|
|
||||||
pr_info("siphash self-test 3u64: FAIL\n");
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
if (siphash_4u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
|
|
||||||
0x1716151413121110ULL, 0x1f1e1d1c1b1a1918ULL,
|
0x1716151413121110ULL, 0x1f1e1d1c1b1a1918ULL,
|
||||||
&test_key_siphash) != test_vectors_siphash[32]) {
|
&test_key_siphash),
|
||||||
pr_info("siphash self-test 4u64: FAIL\n");
|
test_vectors_siphash[32],
|
||||||
ret = -EINVAL;
|
"siphash self-test 4u64: FAIL");
|
||||||
}
|
chk(siphash_1u32(0x03020100U, &test_key_siphash),
|
||||||
if (siphash_1u32(0x03020100U, &test_key_siphash) !=
|
test_vectors_siphash[4],
|
||||||
test_vectors_siphash[4]) {
|
"siphash self-test 1u32: FAIL");
|
||||||
pr_info("siphash self-test 1u32: FAIL\n");
|
chk(siphash_2u32(0x03020100U, 0x07060504U, &test_key_siphash),
|
||||||
ret = -EINVAL;
|
test_vectors_siphash[8],
|
||||||
}
|
"siphash self-test 2u32: FAIL");
|
||||||
if (siphash_2u32(0x03020100U, 0x07060504U, &test_key_siphash) !=
|
chk(siphash_3u32(0x03020100U, 0x07060504U,
|
||||||
test_vectors_siphash[8]) {
|
0x0b0a0908U, &test_key_siphash),
|
||||||
pr_info("siphash self-test 2u32: FAIL\n");
|
test_vectors_siphash[12],
|
||||||
ret = -EINVAL;
|
"siphash self-test 3u32: FAIL");
|
||||||
}
|
chk(siphash_4u32(0x03020100U, 0x07060504U,
|
||||||
if (siphash_3u32(0x03020100U, 0x07060504U,
|
0x0b0a0908U, 0x0f0e0d0cU, &test_key_siphash),
|
||||||
0x0b0a0908U, &test_key_siphash) !=
|
test_vectors_siphash[16],
|
||||||
test_vectors_siphash[12]) {
|
"siphash self-test 4u32: FAIL");
|
||||||
pr_info("siphash self-test 3u32: FAIL\n");
|
chk(hsiphash_1u32(0x03020100U, &test_key_hsiphash),
|
||||||
ret = -EINVAL;
|
test_vectors_hsiphash[4],
|
||||||
}
|
"hsiphash self-test 1u32: FAIL");
|
||||||
if (siphash_4u32(0x03020100U, 0x07060504U,
|
chk(hsiphash_2u32(0x03020100U, 0x07060504U, &test_key_hsiphash),
|
||||||
0x0b0a0908U, 0x0f0e0d0cU, &test_key_siphash) !=
|
test_vectors_hsiphash[8],
|
||||||
test_vectors_siphash[16]) {
|
"hsiphash self-test 2u32: FAIL");
|
||||||
pr_info("siphash self-test 4u32: FAIL\n");
|
chk(hsiphash_3u32(0x03020100U, 0x07060504U,
|
||||||
ret = -EINVAL;
|
0x0b0a0908U, &test_key_hsiphash),
|
||||||
}
|
test_vectors_hsiphash[12],
|
||||||
if (hsiphash_1u32(0x03020100U, &test_key_hsiphash) !=
|
"hsiphash self-test 3u32: FAIL");
|
||||||
test_vectors_hsiphash[4]) {
|
chk(hsiphash_4u32(0x03020100U, 0x07060504U,
|
||||||
pr_info("hsiphash self-test 1u32: FAIL\n");
|
0x0b0a0908U, 0x0f0e0d0cU, &test_key_hsiphash),
|
||||||
ret = -EINVAL;
|
test_vectors_hsiphash[16],
|
||||||
}
|
"hsiphash self-test 4u32: FAIL");
|
||||||
if (hsiphash_2u32(0x03020100U, 0x07060504U, &test_key_hsiphash) !=
|
|
||||||
test_vectors_hsiphash[8]) {
|
|
||||||
pr_info("hsiphash self-test 2u32: FAIL\n");
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
if (hsiphash_3u32(0x03020100U, 0x07060504U,
|
|
||||||
0x0b0a0908U, &test_key_hsiphash) !=
|
|
||||||
test_vectors_hsiphash[12]) {
|
|
||||||
pr_info("hsiphash self-test 3u32: FAIL\n");
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
if (hsiphash_4u32(0x03020100U, 0x07060504U,
|
|
||||||
0x0b0a0908U, 0x0f0e0d0cU, &test_key_hsiphash) !=
|
|
||||||
test_vectors_hsiphash[16]) {
|
|
||||||
pr_info("hsiphash self-test 4u32: FAIL\n");
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
if (!ret)
|
|
||||||
pr_info("self-tests: pass\n");
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit siphash_test_exit(void)
|
static struct kunit_case siphash_test_cases[] = {
|
||||||
{
|
KUNIT_CASE(siphash_test),
|
||||||
}
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
module_init(siphash_test_init);
|
static struct kunit_suite siphash_test_suite = {
|
||||||
module_exit(siphash_test_exit);
|
.name = "siphash",
|
||||||
|
.test_cases = siphash_test_cases,
|
||||||
|
};
|
||||||
|
|
||||||
|
kunit_test_suite(siphash_test_suite);
|
||||||
|
|
||||||
MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
|
MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
|
||||||
MODULE_LICENSE("Dual BSD/GPL");
|
MODULE_LICENSE("Dual BSD/GPL");
|
Loading…
Reference in New Issue