1212#include " rust_rng.h"
1313#include " rust_util.h"
1414
15+
16+ #ifdef __WIN32__
17+ void
18+ win32_require (LPCTSTR fn, BOOL ok) {
19+ if (!ok) {
20+ LPTSTR buf;
21+ DWORD err = GetLastError ();
22+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
23+ FORMAT_MESSAGE_FROM_SYSTEM |
24+ FORMAT_MESSAGE_IGNORE_INSERTS,
25+ NULL , err,
26+ MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
27+ (LPTSTR) &buf, 0 , NULL );
28+ fprintf (stderr, " %s failed with error %ld: %s" , fn, err, buf);
29+ LocalFree ((HLOCAL)buf);
30+ abort ();
31+ }
32+ }
33+ #endif
34+
1535size_t
1636rng_seed_size () {
1737 randctx rctx;
@@ -21,44 +41,50 @@ rng_seed_size() {
2141// Initialization helpers for ISAAC RNG
2242
2343void
24- rng_gen_seed (rust_kernel* kernel, uint8_t * dest, size_t size) {
44+ rng_gen_seed (uint8_t * dest, size_t size) {
2545#ifdef __WIN32__
2646 HCRYPTPROV hProv;
27- kernel-> win32_require
47+ win32_require
2848 (_T (" CryptAcquireContext" ),
2949 CryptAcquireContext (&hProv, NULL , NULL , PROV_RSA_FULL,
3050 CRYPT_VERIFYCONTEXT|CRYPT_SILENT));
31- kernel-> win32_require
51+ win32_require
3252 (_T (" CryptGenRandom" ), CryptGenRandom (hProv, size, (BYTE*) dest));
33- kernel-> win32_require
53+ win32_require
3454 (_T (" CryptReleaseContext" ), CryptReleaseContext (hProv, 0 ));
3555#else
3656 int fd = open (" /dev/urandom" , O_RDONLY);
37- if (fd == -1 )
38- kernel->fatal (" error opening /dev/urandom: %s" , strerror (errno));
57+ if (fd == -1 ) {
58+ fprintf (stderr, " error opening /dev/urandom: %s" , strerror (errno));
59+ abort ();
60+ }
3961 size_t amount = 0 ;
4062 do {
4163 ssize_t ret = read (fd, dest+amount, size-amount);
42- if (ret < 0 )
43- kernel->fatal (" error reading /dev/urandom: %s" , strerror (errno));
44- else if (ret == 0 )
45- kernel->fatal (" somehow hit eof reading from /dev/urandom" );
64+ if (ret < 0 ) {
65+ fprintf (stderr, " error reading /dev/urandom: %s" , strerror (errno));
66+ abort ();
67+ }
68+ else if (ret == 0 ) {
69+ fprintf (stderr, " somehow hit eof reading from /dev/urandom" );
70+ abort ();
71+ }
4672 amount += (size_t )ret;
4773 } while (amount < size);
4874 int ret = close (fd);
49- // FIXME #3697: Why does this fail sometimes?
50- if (ret != 0 )
51- kernel->log (log_warn, " error closing /dev/urandom: %s" ,
52- strerror (errno));
75+ if (ret != 0 ) {
76+ fprintf (stderr, " error closing /dev/urandom: %s" , strerror (errno));
77+ // FIXME #3697: Why does this fail sometimes?
78+ // abort();
79+ }
5380#endif
5481}
5582
5683static void
57- isaac_init (rust_kernel *kernel, randctx *rctx ,
84+ isaac_init (randctx *rctx, char *env_seed ,
5885 uint8_t * user_seed, size_t seed_len) {
5986 memset (rctx, 0 , sizeof (randctx));
6087
61- char *env_seed = kernel->env ->rust_seed ;
6288 if (user_seed != NULL ) {
6389 // ignore bytes after the required length
6490 if (seed_len > sizeof (rctx->randrsl )) {
@@ -72,40 +98,38 @@ isaac_init(rust_kernel *kernel, randctx *rctx,
7298 seed = (seed + 0x7ed55d16 ) + (seed << 12 );
7399 }
74100 } else {
75- rng_gen_seed (kernel,
76- (uint8_t *)&rctx->randrsl ,
101+ rng_gen_seed ((uint8_t *)&rctx->randrsl ,
77102 sizeof (rctx->randrsl ));
78103 }
79104
80105 randinit (rctx, 1 );
81106}
82107
83108void
84- rng_init (rust_kernel* kernel, rust_rng* rng ,
109+ rng_init (rust_rng* rng, char * env_seed ,
85110 uint8_t *user_seed, size_t seed_len) {
86- isaac_init (kernel, &rng->rctx , user_seed, seed_len);
87- rng->reseedable = !user_seed && !kernel-> env -> rust_seed ;
111+ isaac_init (&rng->rctx , env_seed , user_seed, seed_len);
112+ rng->reseedable = !user_seed && !env_seed ;
88113}
89114
90115static void
91- rng_maybe_reseed (rust_kernel* kernel, rust_rng* rng) {
116+ rng_maybe_reseed (rust_rng* rng) {
92117 // If this RNG has generated more than 32KB of random data and was not
93118 // seeded by the user or RUST_SEED, then we should reseed now.
94119 const size_t RESEED_THRESHOLD = 32 * 1024 ;
95120 size_t bytes_generated = rng->rctx .randc * sizeof (ub4);
96121 if (bytes_generated < RESEED_THRESHOLD || !rng->reseedable ) {
97122 return ;
98123 }
99- rng_gen_seed (kernel,
100- (uint8_t *)rng->rctx .randrsl ,
124+ rng_gen_seed ((uint8_t *)rng->rctx .randrsl ,
101125 sizeof (rng->rctx .randrsl ));
102126 randinit (&rng->rctx , 1 );
103127}
104128
105129uint32_t
106- rng_gen_u32 (rust_kernel* kernel, rust_rng* rng) {
130+ rng_gen_u32 (rust_rng* rng) {
107131 uint32_t x = isaac_rand (&rng->rctx );
108- rng_maybe_reseed (kernel, rng);
132+ rng_maybe_reseed (rng);
109133 return x;
110134}
111135
0 commit comments