random: Change testing random generator

The old random timer test was not random-looking
enough on some platforms.

Replace with new test which is psuedo-xoshiro.

The generator is still deterministic
and does not depend on entropy at all,
but should look more random for testing.

Change name of generator tree-wide also.

Signed-off-by: Declan Snyder <declan.snyder@nxp.com>
This commit is contained in:
Declan Snyder 2022-12-02 11:41:10 -06:00 committed by Carles Cufí
commit d6881de3b3
8 changed files with 44 additions and 21 deletions

View file

@ -1,7 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
if (CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR OR
CONFIG_TIMER_RANDOM_GENERATOR OR
CONFIG_RANDOM_TEST_GENERATOR OR
CONFIG_XOSHIRO_RANDOM_GENERATOR)
zephyr_library()
zephyr_library_sources_ifdef(CONFIG_USERSPACE rand32_handlers.c)
@ -17,10 +17,10 @@ endif()
# XOROSHIRO builds the XOSHIRO implementation because a Kconfig choice cannot
# select another choice as a means of deprecating the symbol. Swapping out the
# implementation lets out-of-tree users still build until the symbol is removed.
zephyr_library_sources_ifdef(CONFIG_TIMER_RANDOM_GENERATOR rand32_timer.c)
zephyr_library_sources_ifdef(CONFIG_XOROSHIRO_RANDOM_GENERATOR rand32_xoshiro128.c)
zephyr_library_sources_ifdef(CONFIG_XOSHIRO_RANDOM_GENERATOR rand32_xoshiro128.c)
zephyr_library_sources_ifdef(CONFIG_CTR_DRBG_CSPRNG_GENERATOR rand32_ctr_drbg.c)
zephyr_library_sources_ifdef(CONFIG_RANDOM_TEST_GENERATOR rand32_test.c)
if (CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR OR CONFIG_HARDWARE_DEVICE_CS_GENERATOR)
zephyr_library_sources(rand32_entropy_device.c)

View file

@ -40,13 +40,12 @@ choice RNG_GENERATOR_CHOICE
to support random request then select that. Otherwise, select the
XOSHIRO algorithm
config TIMER_RANDOM_GENERATOR
config RANDOM_TEST_GENERATOR
bool "System timer clock based number generator"
depends on TEST_RANDOM_GENERATOR
help
This options enables number generator based on system timer
clock. This number generator is not random and used for
testing only.
This number generator is not random and used only for testing.
Does not rely on an entropy driver, so can be used without entropy.
config ENTROPY_DEVICE_RANDOM_GENERATOR
bool "Use entropy driver to generate random numbers"

View file

@ -14,21 +14,44 @@
* provide a random number generator.
*/
#include <zephyr/init.h>
#include <zephyr/random/rand32.h>
#include <zephyr/drivers/timer/system_timer.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/atomic.h>
#include <string.h>
#include <zephyr/device.h>
#if defined(__GNUC__)
/*
* Symbols used to ensure a rapid series of calls to random number generator
* return different values.
*/
static atomic_val_t _rand32_counter;
/* seed the state with pseudo-random data */
static uint32_t state[4] = {0, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278};
#define _RAND32_INC 1000000003U
static struct k_spinlock rand_state_lock;
static inline uint32_t rotl(const uint32_t x, int k)
{
return (x << k) | (x >> (32 - k));
}
static uint32_t xoshiro128_next(void)
{
const uint32_t result = rotl(state[0] + state[3], 7) + state[0];
const uint32_t t = state[1] << 9;
k_spinlock_key_t lock_key = k_spin_lock(&rand_state_lock);
state[2] ^= state[0];
state[3] ^= state[1];
state[1] ^= state[2];
state[0] ^= state[3];
state[2] ^= t;
state[3] = rotl(state[3], 11);
k_spin_unlock(&rand_state_lock, lock_key);
return result;
}
/**
* @brief Get a 32 bit random number
@ -41,7 +64,7 @@ static atomic_val_t _rand32_counter;
*/
uint32_t z_impl_sys_rand32_get(void)
{
return k_cycle_get_32() + atomic_add(&_rand32_counter, _RAND32_INC);
return xoshiro128_next();
}
/**
@ -68,4 +91,5 @@ void z_impl_sys_rand_get(void *dst, size_t outlen)
outlen -= blocksize;
}
}
#endif /* __GNUC__ */