From d383ada0d84297e553bda22126f0498a56a06751 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Tue, 17 Feb 2015 21:20:04 +0100 Subject: [PATCH] Fix fake kernel entropy being entirely static. --- kernel/random.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/kernel/random.cpp b/kernel/random.cpp index f7704e08..85a1d84d 100644 --- a/kernel/random.cpp +++ b/kernel/random.cpp @@ -24,19 +24,42 @@ #include +#include + #include +#include #include +#include namespace Sortix { +static unsigned long sequence = 0; + int sys_getentropy(void* user_buffer, size_t size) { - unsigned char buffer[256]; + union + { + unsigned char buffer[256]; + struct + { + struct timespec realtime; + struct timespec monotonic; + unsigned long sequence; + } seed; + }; if ( sizeof(buffer) < size ) return errno = EIO, -1; // TODO: SECURITY: We need to actually gather entropy and deliver it. for ( size_t i = 0; i < size; i++ ) buffer[i] = i; + // NOTE: This is not random and is not meant to be random, this is just + // meant to make the returned entropy a little different each time + // until we have real randomness, even across reboots. The userland + // arc4random mixer will mix it around and the produced streams will + // look random and should not repeat in practice. + seed.realtime = Time::Get(CLOCK_REALTIME); + seed.monotonic = Time::Get(CLOCK_MONOTONIC); + seed.sequence = InterlockedIncrement(&sequence).o; if ( !CopyToUser(user_buffer, buffer, size) ) return -1; return 0;