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;