Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112/* 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 */