[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v5 2/4] lib/ukswrand: Add seed generating function
Reviewed-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> On 27.11.19 13:41, Vlad-Andrei BĂDOIU (78692) wrote: From: Vlad-Andrei BĂDOIU (78692) <vlad_andrei.badoiu@xxxxxxxxxxxxxxx> This patch adds a new function, _get_random_seed32 for seed generaton. If the pre-compiled config option is not selected, then rdrand is used on x86 and ukplat_wall_clock on ARM. Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx> --- lib/ukswrand/Config.uk | 22 +++++++++++++++++++--- lib/ukswrand/exportsyms.uk | 1 + lib/ukswrand/include/uk/swrand.h | 5 ++++- lib/ukswrand/mwc.c | 11 ++++++----- lib/ukswrand/swrand.c | 29 ++++++++++++++++++++++++++++- 5 files changed, 58 insertions(+), 10 deletions(-) diff --git a/lib/ukswrand/Config.uk b/lib/ukswrand/Config.uk index c58371bb..e056b4c5 100644 --- a/lib/ukswrand/Config.uk +++ b/lib/ukswrand/Config.uk @@ -14,9 +14,25 @@ config LIBUKSWRAND_MWC Use multiply-with-carry algorithm endchoice-config LIBUKSWRAND_INITIALSEED- int "Initial random seed" - default 23 +choice + prompt "Initial seed" + default LIBUKSWRANDR_INITIALSEED_TIME + +config LIBUKSWRAND_INITIALSEED_TIME + bool "Platform timestamp" + +config LIBUKSWRAND_INITIALSEED_RDRAND + depends on ARCH_X86_64 && (MARCH_X86_64_COREI7AVXI) + bool "`rdrand` instruction" + +config LIBUKSWRAND_INITIALSEED_USECONSTANT + bool "Compiled-in constant" +endchoice + +config LIBUKSWRAND_INITIALSEED_CONSTANT + int "Initial seed constant" + depends on LIBUKSWRAND_INITIALSEED_USECONSTANT + default 23config LIBUKSWRAND_DEVFSbool "Register random and urandom device to devfs" diff --git a/lib/ukswrand/exportsyms.uk b/lib/ukswrand/exportsyms.uk index 49744046..40739365 100644 --- a/lib/ukswrand/exportsyms.uk +++ b/lib/ukswrand/exportsyms.uk @@ -2,3 +2,4 @@ getrandom uk_swrand_def uk_swrand_init_r uk_swrand_randr_r +uk_swrandr_gen_seed32 diff --git a/lib/ukswrand/include/uk/swrand.h b/lib/ukswrand/include/uk/swrand.h index 35f3e2fe..29be8a9b 100644 --- a/lib/ukswrand/include/uk/swrand.h +++ b/lib/ukswrand/include/uk/swrand.h @@ -39,6 +39,7 @@ #include <uk/arch/types.h> #include <uk/plat/lcpu.h> #include <uk/config.h> +#include <uk/plat/time.h>#ifdef __cplusplusextern "C" { @@ -48,9 +49,11 @@ struct uk_swrand;extern struct uk_swrand uk_swrand_def; -void uk_swrand_init_r(struct uk_swrand *r, __u32 seed);+void uk_swrand_init_r(struct uk_swrand *r, unsigned int seedc, + const __u32 seedv[]); __u32 uk_swrand_randr_r(struct uk_swrand *r);+__u32 uk_swrandr_gen_seed32(void);/* Uses the pre-initialized default generator */ /* TODO: Add assertion when we can test if we are in interrupt context */ /* TODO: Revisit with multi-CPU support */ diff --git a/lib/ukswrand/mwc.c b/lib/ukswrand/mwc.c index 8b4cca30..f032e950 100644 --- a/lib/ukswrand/mwc.c +++ b/lib/ukswrand/mwc.c @@ -48,15 +48,17 @@ struct uk_swrand {struct uk_swrand uk_swrand_def; -void uk_swrand_init_r(struct uk_swrand *r, __u32 seed)+void uk_swrand_init_r(struct uk_swrand *r, unsigned int seedc, + const __u32 seedv[]) { __u32 i;UK_ASSERT(r);+ UK_ASSERT(seedc > 0);- r->Q[0] = seed;- r->Q[1] = seed + PHI; - r->Q[2] = seed + PHI + PHI; + r->Q[0] = seedv[0]; + r->Q[1] = seedv[0] + PHI; + r->Q[2] = seedv[0] + PHI + PHI; for (i = 3; i < 4096; i++) r->Q[i] = r->Q[i - 3] ^ r->Q[i - 2] ^ PHI ^ i;@@ -88,4 +90,3 @@ __u32 uk_swrand_randr_r(struct uk_swrand *r)r->c = c; return (r->Q[i] = y - x); } - diff --git a/lib/ukswrand/swrand.c b/lib/ukswrand/swrand.c index d9497bf8..b3f410fb 100644 --- a/lib/ukswrand/swrand.c +++ b/lib/ukswrand/swrand.c @@ -37,6 +37,26 @@#define UK_SWRAND_CTOR_PRIO 1 +__u32 uk_swrandr_gen_seed32(void)+{ + __u32 val; + +#ifdef CONFIG_LIBUKSWRAND_INITIALSEED_TIME + val = (__u32)ukplat_wall_clock(); +#endif + +#ifdef CONFIG_LIBUKSWRAND_INITIALSEED_RDRAND + asm volatile ("rdrand %%eax;" + : "=a" (val)); +#endif + +#ifdef CONFIG_LIBUKSWRAND_INITIALSEED_USECONSTANT + val = CONFIG_LIBUKSWRAND_INITIALSEED_CONSTANT; +#endif + + return val; +} + ssize_t uk_swrand_fill_buffer(void *buf, size_t buflen) { size_t step, chunk_size, i; @@ -59,8 +79,15 @@ ssize_t uk_swrand_fill_buffer(void *buf, size_t buflen)static void _uk_swrand_ctor(void){ + unsigned int i; + unsigned int seedc = 2; + __u32 seedv[2]; + + for (i = 0; i < seedc; i++) + seedv[i] = uk_swrandr_gen_seed32(); + uk_pr_info("Initialize random number generator...\n"); - uk_swrand_init_r(&uk_swrand_def, CONFIG_LIBUKSWRAND_INITIALSEED); + uk_swrand_init_r(&uk_swrand_def, seedc, seedv); }UK_CTOR_FUNC(UK_SWRAND_CTOR_PRIO, _uk_swrand_ctor); _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |