mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 04:32:44 +00:00 
			
		
		
		
	 9026598999
			
		
	
	
		9026598999
		
	
	
	
	
		
			
			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.
		
	
			
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			897 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			897 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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);
 | |
| }
 |