mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-16 17:49:29 -05:00
Move hash-test-template's test RNG code and the buffer allocation code from various test suites into a header test-utils.h. This allows them to be shared by other test suites. Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Link: https://patch.msgid.link/20260802233005.161467-2-ebiggers@kernel.org Signed-off-by: Eric Biggers <ebiggers@kernel.org>
112 lines
2.7 KiB
C
112 lines
2.7 KiB
C
/* 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 */
|