projects/linux·blob master · refs

111 lines · 2.7 KiB

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
18static u64 random_seed;
19
20static __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 */
29static __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
41static __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
49static __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 */
64static __maybe_unused u32 rand32(void)
65{
66 random_seed = (random_seed * 25214903917 + 11) & ((1ULL << 48) - 1);
67 return random_seed >> 16;
68}
69
70static __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
76static __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
82static __maybe_unused bool rand_bool(void)
83{
84 return rand32() % 2;
85}
86
87/* Generate a random length, preferring small lengths. */
88static __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
106static __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 */