diff --git a/drivers/entropy/Kconfig.native_posix b/drivers/entropy/Kconfig.native_posix index 94fd7300670..39298c444df 100644 --- a/drivers/entropy/Kconfig.native_posix +++ b/drivers/entropy/Kconfig.native_posix @@ -12,3 +12,12 @@ config FAKE_ENTROPY_NATIVE_POSIX not generate real entropy. It actually generates always the same sequence of random numbers if initialized with the same seed. + +config FAKE_ENTROPY_NATIVE_POSIX_SEED_BY_DEFAULT + bool "Seed the generator by default" + default y + depends on FAKE_ENTROPY_NATIVE_POSIX + help + Apply a seed by default, even if the user does not request it through the command line. + Disabling this feature allows some other component to seed the host standard library random + generator without this component's default initialization interfering. diff --git a/drivers/entropy/fake_entropy_native_posix.c b/drivers/entropy/fake_entropy_native_posix.c index ccdd3aa46e5..e9ee4ab9284 100644 --- a/drivers/entropy/fake_entropy_native_posix.c +++ b/drivers/entropy/fake_entropy_native_posix.c @@ -27,6 +27,7 @@ static unsigned int seed = 0x5678; static bool seed_random; +static bool seed_set; static int entropy_native_posix_get_entropy(const struct device *dev, uint8_t *buffer, @@ -69,7 +70,10 @@ static int entropy_native_posix_get_entropy_isr(const struct device *dev, static int entropy_native_posix_init(const struct device *dev) { ARG_UNUSED(dev); - entropy_native_seed(seed, seed_random); + if (seed_set || seed_random || + IS_ENABLED(CONFIG_FAKE_ENTROPY_NATIVE_POSIX_SEED_BY_DEFAULT)) { + entropy_native_seed(seed, seed_random); + } posix_print_warning("WARNING: " "Using a test - not safe - entropy source\n"); return 0; @@ -86,6 +90,13 @@ DEVICE_DT_INST_DEFINE(0, PRE_KERNEL_1, CONFIG_ENTROPY_INIT_PRIORITY, &entropy_native_posix_api_funcs); +static void seed_was_set(char *argv, int offset) +{ + ARG_UNUSED(argv); + ARG_UNUSED(offset); + seed_set = true; +} + static void add_fake_entropy_option(void) { static struct args_struct_t entropy_options[] = { @@ -94,6 +105,7 @@ static void add_fake_entropy_option(void) .name = "r_seed", .type = 'u', .dest = (void *)&seed, + .call_when_found = seed_was_set, .descript = "A 32-bit integer seed value for the entropy device, such as " "97229 (decimal), 0x17BCD (hex), or 0275715 (octal)" },