xref: /linux/lib/crypto/tests/test-utils.h (revision baf9e7f8019391a4ef8d734ff69e97333a54b09c)
1*baf9e7f8SEric Biggers /* SPDX-License-Identifier: GPL-2.0-or-later */
2*baf9e7f8SEric Biggers /*
3*baf9e7f8SEric Biggers  * Test utility functions shared by the crypto library tests.
4*baf9e7f8SEric Biggers  *
5*baf9e7f8SEric Biggers  * For now this is simply a header that's included into the KUnit test suites
6*baf9e7f8SEric Biggers  * that need it.  If this gets too large it could be made its own translation
7*baf9e7f8SEric Biggers  * unit and libcrypto_test_utils module, but that seems overkill for now.
8*baf9e7f8SEric Biggers  */
9*baf9e7f8SEric Biggers #ifndef LIB_CRYPTO_TEST_UTILS_H
10*baf9e7f8SEric Biggers #define LIB_CRYPTO_TEST_UTILS_H
11*baf9e7f8SEric Biggers 
12*baf9e7f8SEric Biggers #include <kunit/test.h>
13*baf9e7f8SEric Biggers #include <linux/math.h>
14*baf9e7f8SEric Biggers #include <linux/minmax.h>
15*baf9e7f8SEric Biggers #include <linux/string.h>
16*baf9e7f8SEric Biggers #include <linux/vmalloc.h>
17*baf9e7f8SEric Biggers 
18*baf9e7f8SEric Biggers static u64 random_seed;
19*baf9e7f8SEric Biggers 
20*baf9e7f8SEric Biggers static __maybe_unused void action_free_guarded_buf(void *buf)
21*baf9e7f8SEric Biggers {
22*baf9e7f8SEric Biggers 	vfree(buf);
23*baf9e7f8SEric Biggers }
24*baf9e7f8SEric Biggers 
25*baf9e7f8SEric Biggers /*
26*baf9e7f8SEric Biggers  * Allocate a KUnit-managed buffer that has length @size bytes (> 0) immediately
27*baf9e7f8SEric Biggers  * followed by an unmapped page, and assert that the allocation succeeds.
28*baf9e7f8SEric Biggers  */
29*baf9e7f8SEric Biggers static __maybe_unused void *alloc_guarded_buf(struct kunit *test, size_t size)
30*baf9e7f8SEric Biggers {
31*baf9e7f8SEric Biggers 	size_t full_size = round_up(size, PAGE_SIZE);
32*baf9e7f8SEric Biggers 	void *buf = vmalloc(full_size);
33*baf9e7f8SEric Biggers 
34*baf9e7f8SEric Biggers 	KUNIT_ASSERT_NOT_NULL(test, buf);
35*baf9e7f8SEric Biggers 	KUNIT_ASSERT_EQ(test, 0,
36*baf9e7f8SEric Biggers 			kunit_add_action_or_reset(test, action_free_guarded_buf,
37*baf9e7f8SEric Biggers 						  buf));
38*baf9e7f8SEric Biggers 	return buf + full_size - size;
39*baf9e7f8SEric Biggers }
40*baf9e7f8SEric Biggers 
41*baf9e7f8SEric Biggers static __maybe_unused void *alloc_buf(struct kunit *test, size_t size)
42*baf9e7f8SEric Biggers {
43*baf9e7f8SEric Biggers 	void *buf = kunit_kmalloc(test, size, GFP_KERNEL);
44*baf9e7f8SEric Biggers 
45*baf9e7f8SEric Biggers 	KUNIT_ASSERT_NOT_NULL(test, buf);
46*baf9e7f8SEric Biggers 	return buf;
47*baf9e7f8SEric Biggers }
48*baf9e7f8SEric Biggers 
49*baf9e7f8SEric Biggers static __maybe_unused void *memdup_buf(struct kunit *test, const void *src,
50*baf9e7f8SEric Biggers 				       size_t size)
51*baf9e7f8SEric Biggers {
52*baf9e7f8SEric Biggers 	void *dst = alloc_buf(test, size);
53*baf9e7f8SEric Biggers 
54*baf9e7f8SEric Biggers 	return memcpy(dst, src, size);
55*baf9e7f8SEric Biggers }
56*baf9e7f8SEric Biggers 
57*baf9e7f8SEric Biggers /*
58*baf9e7f8SEric Biggers  * This is a simple linear congruential generator.  It is used only for testing,
59*baf9e7f8SEric Biggers  * which does not require cryptographically secure random numbers.  A hard-coded
60*baf9e7f8SEric Biggers  * algorithm is used instead of <linux/prandom.h> so that it matches the
61*baf9e7f8SEric Biggers  * algorithm used by the test vector generation script.  This allows the input
62*baf9e7f8SEric Biggers  * data in random test vectors to be concisely stored as just the seed.
63*baf9e7f8SEric Biggers  */
64*baf9e7f8SEric Biggers static __maybe_unused u32 rand32(void)
65*baf9e7f8SEric Biggers {
66*baf9e7f8SEric Biggers 	random_seed = (random_seed * 25214903917 + 11) & ((1ULL << 48) - 1);
67*baf9e7f8SEric Biggers 	return random_seed >> 16;
68*baf9e7f8SEric Biggers }
69*baf9e7f8SEric Biggers 
70*baf9e7f8SEric Biggers static __maybe_unused void rand_bytes(u8 *out, size_t len)
71*baf9e7f8SEric Biggers {
72*baf9e7f8SEric Biggers 	for (size_t i = 0; i < len; i++)
73*baf9e7f8SEric Biggers 		out[i] = rand32();
74*baf9e7f8SEric Biggers }
75*baf9e7f8SEric Biggers 
76*baf9e7f8SEric Biggers static __maybe_unused void rand_bytes_seeded_from_len(u8 *out, size_t len)
77*baf9e7f8SEric Biggers {
78*baf9e7f8SEric Biggers 	random_seed = len;
79*baf9e7f8SEric Biggers 	rand_bytes(out, len);
80*baf9e7f8SEric Biggers }
81*baf9e7f8SEric Biggers 
82*baf9e7f8SEric Biggers static __maybe_unused bool rand_bool(void)
83*baf9e7f8SEric Biggers {
84*baf9e7f8SEric Biggers 	return rand32() % 2;
85*baf9e7f8SEric Biggers }
86*baf9e7f8SEric Biggers 
87*baf9e7f8SEric Biggers /* Generate a random length, preferring small lengths. */
88*baf9e7f8SEric Biggers static __maybe_unused size_t rand_length(size_t max_len)
89*baf9e7f8SEric Biggers {
90*baf9e7f8SEric Biggers 	size_t len;
91*baf9e7f8SEric Biggers 
92*baf9e7f8SEric Biggers 	switch (rand32() % 3) {
93*baf9e7f8SEric Biggers 	case 0:
94*baf9e7f8SEric Biggers 		len = rand32() % 128;
95*baf9e7f8SEric Biggers 		break;
96*baf9e7f8SEric Biggers 	case 1:
97*baf9e7f8SEric Biggers 		len = rand32() % 3072;
98*baf9e7f8SEric Biggers 		break;
99*baf9e7f8SEric Biggers 	default:
100*baf9e7f8SEric Biggers 		len = rand32();
101*baf9e7f8SEric Biggers 		break;
102*baf9e7f8SEric Biggers 	}
103*baf9e7f8SEric Biggers 	return len % (max_len + 1);
104*baf9e7f8SEric Biggers }
105*baf9e7f8SEric Biggers 
106*baf9e7f8SEric Biggers static __maybe_unused size_t rand_offset(size_t max_offset)
107*baf9e7f8SEric Biggers {
108*baf9e7f8SEric Biggers 	return min(rand32() % 128, max_offset);
109*baf9e7f8SEric Biggers }
110*baf9e7f8SEric Biggers 
111*baf9e7f8SEric Biggers #endif /* LIB_CRYPTO_TEST_UTILS_H */
112