| /* SPDX-License-Identifier: GPL-2.0-or-later */ | |
| /* | |
| * Test utility functions shared by the crypto library tests. | |
| * | |
| * For now this is simply a header that's included into the KUnit test suites | |
| * that need it. If this gets too large it could be made its own translation | |
| * unit and libcrypto_test_utils module, but that seems overkill for now. | |
| */ | |
| #ifndef LIB_CRYPTO_TEST_UTILS_H | |
| #define LIB_CRYPTO_TEST_UTILS_H | |
| #include <kunit/test.h> | |
| #include <linux/math.h> | |
| #include <linux/minmax.h> | |
| #include <linux/string.h> | |
| #include <linux/vmalloc.h> | |
| static u64 random_seed; | |
| static __maybe_unused void action_free_guarded_buf(void *buf) | |
| { | |
| vfree(buf); | |
| } | |
| /* | |
| * Allocate a KUnit-managed buffer that has length @size bytes (> 0) immediately | |
| * followed by an unmapped page, and assert that the allocation succeeds. | |
| */ | |
| static __maybe_unused void *alloc_guarded_buf(struct kunit *test, size_t size) | |
| { | |
| size_t full_size = round_up(size, PAGE_SIZE); | |
| void *buf = vmalloc(full_size); | |
| KUNIT_ASSERT_NOT_NULL(test, buf); | |
| KUNIT_ASSERT_EQ(test, 0, | |
| kunit_add_action_or_reset(test, action_free_guarded_buf, | |
| buf)); | |
| return buf + full_size - size; | |
| } | |
| static __maybe_unused void *alloc_buf(struct kunit *test, size_t size) | |
| { | |
| void *buf = kunit_kmalloc(test, size, GFP_KERNEL); | |
| KUNIT_ASSERT_NOT_NULL(test, buf); | |
| return buf; | |
| } | |
| static __maybe_unused void *memdup_buf(struct kunit *test, const void *src, | |
| size_t size) | |
| { | |
| void *dst = alloc_buf(test, size); | |
| return memcpy(dst, src, size); | |
| } | |
| /* | |
| * This is a simple linear congruential generator. It is used only for testing, | |
| * which does not require cryptographically secure random numbers. A hard-coded | |
| * algorithm is used instead of <linux/prandom.h> so that it matches the | |
| * algorithm used by the test vector generation script. This allows the input | |
| * data in random test vectors to be concisely stored as just the seed. | |
| */ | |
| static __maybe_unused u32 rand32(void) | |
| { | |
| random_seed = (random_seed * 25214903917 + 11) & ((1ULL << 48) - 1); | |
| return random_seed >> 16; | |
| } | |
| static __maybe_unused void rand_bytes(u8 *out, size_t len) | |
| { | |
| for (size_t i = 0; i < len; i++) | |
| out[i] = rand32(); | |
| } | |
| static __maybe_unused void rand_bytes_seeded_from_len(u8 *out, size_t len) | |
| { | |
| random_seed = len; | |
| rand_bytes(out, len); | |
| } | |
| static __maybe_unused bool rand_bool(void) | |
| { | |
| return rand32() % 2; | |
| } | |
| /* Generate a random length, preferring small lengths. */ | |
| static __maybe_unused size_t rand_length(size_t max_len) | |
| { | |
| size_t len; | |
| switch (rand32() % 3) { | |
| case 0: | |
| len = rand32() % 128; | |
| break; | |
| case 1: | |
| len = rand32() % 3072; | |
| break; | |
| default: | |
| len = rand32(); | |
| break; | |
| } | |
| return len % (max_len + 1); | |
| } | |
| static __maybe_unused size_t rand_offset(size_t max_offset) | |
| { | |
| return min(rand32() % 128, max_offset); | |
| } | |
| #endif /* LIB_CRYPTO_TEST_UTILS_H */ |