diff options
author | Andreas Kling <awesomekling@gmail.com> | 2020-01-03 12:36:30 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2020-01-03 12:43:07 +0100 |
commit | 9026598999d996d403d0b5951006ef4bb0f1c1c0 (patch) | |
tree | 027cb67bad6291ce48d109673abb60cc909689f5 /Kernel/Devices | |
parent | 24cc67d199256faa88b43cf580e9b76b4b9b327f (diff) | |
download | serenity-9026598999d996d403d0b5951006ef4bb0f1c1c0.zip |
Kernel: Add a more expressive API for getting random bytes
We now have these API's in <Kernel/Random.h>:
- get_fast_random_bytes(u8* buffer, size_t buffer_size)
- get_good_random_bytes(u8* buffer, size_t buffer_size)
- get_fast_random<T>()
- get_good_random<T>()
Internally they both use x86 RDRAND if available, otherwise they fall
back to the same LCG we had in RandomDevice all along.
The main purpose of this patch is to give kernel code a way to better
express its needs for random data.
Randomness is something that will require a lot more work, but this is
hopefully a step in the right direction.
Diffstat (limited to 'Kernel/Devices')
-rw-r--r-- | Kernel/Devices/RandomDevice.cpp | 29 | ||||
-rw-r--r-- | Kernel/Devices/RandomDevice.h | 2 |
2 files changed, 4 insertions, 27 deletions
diff --git a/Kernel/Devices/RandomDevice.cpp b/Kernel/Devices/RandomDevice.cpp index 9df6a2c23a..19d81225a7 100644 --- a/Kernel/Devices/RandomDevice.cpp +++ b/Kernel/Devices/RandomDevice.cpp @@ -1,5 +1,5 @@ -#include "RandomDevice.h" -#include <AK/StdLibExtras.h> +#include <Kernel/Devices/RandomDevice.h> +#include <Kernel/Random.h> RandomDevice::RandomDevice() : CharacterDevice(1, 8) @@ -10,22 +10,6 @@ RandomDevice::~RandomDevice() { } -static u32 next = 1; - -#define MY_RAND_MAX 4294967295U -u32 RandomDevice::random_value() -{ - next = next * 1103515245 + 12345; - return next; -} - -#if 0 -static void mysrand(unsigned seed) -{ - next = seed; -} -#endif - bool RandomDevice::can_read(const FileDescription&) const { return true; @@ -33,13 +17,8 @@ bool RandomDevice::can_read(const FileDescription&) const ssize_t RandomDevice::read(FileDescription&, u8* buffer, ssize_t size) { - const int range = 'z' - 'a'; - ssize_t nread = min(size, PAGE_SIZE); - for (ssize_t i = 0; i < nread; ++i) { - u32 r = random_value() % range; - buffer[i] = (u8)('a' + r); - } - return nread; + get_good_random_bytes(buffer, size); + return size; } ssize_t RandomDevice::write(FileDescription&, const u8*, ssize_t size) diff --git a/Kernel/Devices/RandomDevice.h b/Kernel/Devices/RandomDevice.h index a11589d310..48065d4c62 100644 --- a/Kernel/Devices/RandomDevice.h +++ b/Kernel/Devices/RandomDevice.h @@ -8,8 +8,6 @@ public: RandomDevice(); virtual ~RandomDevice() override; - static u32 random_value(); - private: // ^CharacterDevice virtual ssize_t read(FileDescription&, u8*, ssize_t) override; |