forked from SerenityOS/serenity
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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.
- Loading branch information
1 parent
24cc67d
commit 9026598
Showing
11 changed files
with
87 additions
and
48 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#include <Kernel/Arch/i386/CPU.h> | ||
#include <Kernel/Random.h> | ||
#include <Kernel/Devices/RandomDevice.h> | ||
|
||
static u32 random32() | ||
{ | ||
if (g_cpu_supports_rdrand) { | ||
u32 value = 0; | ||
asm volatile( | ||
"1%=:\n" | ||
"rdrand %0\n" | ||
"jnc 1%=\n" | ||
: "=r"(value)); | ||
return value; | ||
} | ||
// FIXME: This sucks lol | ||
static u32 next = 1; | ||
next = next * 1103515245 + 12345; | ||
return next; | ||
} | ||
|
||
void get_good_random_bytes(u8* buffer, size_t buffer_size) | ||
{ | ||
union { | ||
u8 bytes[4]; | ||
u32 value; | ||
} u; | ||
size_t offset = 4; | ||
for (size_t i = 0; i < buffer_size; ++i) { | ||
if (offset >= 4) { | ||
u.value = random32(); | ||
offset = 0; | ||
} | ||
buffer[i] = u.bytes[offset++]; | ||
} | ||
} | ||
|
||
void get_fast_random_bytes(u8* buffer, size_t buffer_size) | ||
{ | ||
return get_good_random_bytes(buffer, buffer_size); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
#pragma once | ||
|
||
#include <AK/Types.h> | ||
|
||
// NOTE: These API's are primarily about expressing intent/needs in the calling code. | ||
// We don't make any guarantees about actual fastness or goodness yet. | ||
|
||
void get_fast_random_bytes(u8*, size_t); | ||
void get_good_random_bytes(u8*, size_t); | ||
|
||
template<typename T> | ||
inline T get_fast_random() | ||
{ | ||
T value; | ||
get_fast_random_bytes(reinterpret_cast<u8*>(&value), sizeof(T)); | ||
return value; | ||
} | ||
|
||
template<typename T> | ||
inline T get_good_random() | ||
{ | ||
T value; | ||
get_good_random_bytes(reinterpret_cast<u8*>(&value), sizeof(T)); | ||
return value; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters