From 6c50033dfb7a4dc7094d96f9339459b08b4efac9 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 8 Mar 2015 11:10:45 +0100 Subject: Add PRNG --- src/kernel/core/kmain.c | 10 ++++++++++ src/kernel/core/prng.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/kernel/core/prng.c (limited to 'src/kernel/core') diff --git a/src/kernel/core/kmain.c b/src/kernel/core/kmain.c index 5cd71c5..7cdd109 100644 --- a/src/kernel/core/kmain.c +++ b/src/kernel/core/kmain.c @@ -23,10 +23,16 @@ #include #include +#include + #include #include #include +#ifndef PRNG_INIT_ENTROPY +#define PRNG_INIT_ENTROPY 1299733235 +#endif + // ===== FOR TESTS ===== #define TEST_PLACEHOLDER_AFTER_IDT #define TEST_PLACEHOLDER_AFTER_REGION @@ -149,6 +155,10 @@ void kernel_init_stage2(void* data) { // Register FS drivers register_iso9660_driver(); + // Add entropy to prng + uint32_t x = PRNG_INIT_ENTROPY; + prng_add_entropy((uint8_t*)&x, sizeof(x)); + // Parse command line btree_t *cmdline = parse_cmdline((const char*)mbd->cmdline); diff --git a/src/kernel/core/prng.c b/src/kernel/core/prng.c new file mode 100644 index 0000000..d4307b6 --- /dev/null +++ b/src/kernel/core/prng.c @@ -0,0 +1,38 @@ +#include + +#define EPOOLSIZE 2048 + +static uint32_t x = 211; +static int n = 0; +static char entropy[EPOOLSIZE]; +static int entropy_count = 0; +static const uint32_t a = 16807; +static const uint32_t m = 0x7FFFFFFF; + +uint16_t prng_word() { + if (++n == 100) { + n = 0; + if (entropy_count) { + entropy_count--; + x += entropy[entropy_count]; + } + } + x = (x * a) % m; + return x & 0xFFFF; +} + +void prng_bytes(uint8_t* out, size_t nbytes) { + uint16_t *d = (uint16_t*)out; + for (size_t i = 0; i < nbytes / 2; i++) { + d[i] = prng_word(); + } + if (nbytes & 1) out[nbytes-1] = prng_word() & 0xFF; +} + +void prng_add_entropy(const uint8_t* ptr, size_t nbytes) { + while (nbytes-- && entropy_count < EPOOLSIZE - 1) { + entropy[entropy_count++] = *(ptr++); + } +} + +/* vim: set ts=4 sw=4 tw=0 noet :*/ -- cgit v1.2.3