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