/* 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 #include #include #include #include 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 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 */