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