1 #include "arch-detect.hpp"
6 #if defined(_WIN32) || defined(_WIN64)
11 typedef BOOLEAN (WINAPI
*rtlgenrandom_t
)(PVOID buf
, ULONG buflen
);
13 rtlgenrandom_t rtlgenrandom_fn
;
20 if(rtlgenrandom_fn
) return;
21 advapi
= LoadLibraryA("advapi32.dll");
23 throw std::runtime_error("Can't load advapi32.dll");
24 rtlgenrandom_fn
= (rtlgenrandom_t
)GetProcAddress(advapi
, "SystemFunction036");
26 throw std::runtime_error("Can't find rtlgenrandom");
29 void generate(void* buffer
, size_t buffersize
)
33 while(!rtlgenrandom_fn(buffer
, buffersize
));
45 void try_file(const char* name
)
48 while(fd
< 0 && err
!= ENOENT
&& err
!= ENXIO
) {
49 fd
= open(name
, O_RDONLY
);
50 if(fd
< 0) err
= errno
;
59 if(fd
< 0) try_file("/dev/urandom");
60 if(fd
< 0) try_file("/dev/random");
61 if(fd
< 0) throw std::runtime_error("Can't open /dev/urandom");
64 void generate(void* buffer
, size_t buffersize
)
69 while(out
< buffersize
) {
70 ssize_t r
= read(fd
, (char*)buffer
+ out
, buffersize
- out
);
80 uint64_t arch_get_tsc()
84 asm volatile("rdtsc" : "=a"(a
), "=d"(b
));
85 return ((uint64_t)b
<< 32) | a
;
91 uint64_t arch_get_random()
95 asm volatile (".byte 0xb8, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xa2, 0xf7, 0xc1, 0x00, 0x00, 0x00, 0x40, "
96 "0x74, 0x05, 0x0f, 0xc7, 0xf0, 0xeb, 0x02, 0x31, 0xc0" : "=a"(r
) : : "ebx", "ecx", "edx");