12
12
#include " rust_rng.h"
13
13
#include " rust_util.h"
14
14
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
+ KLOG_ERR_ (dom, " %s failed with error %ld: %s" , fn, err, buf);
29
+ LocalFree ((HLOCAL)buf);
30
+ assert (ok);
31
+ }
32
+ }
33
+ #endif
34
+
15
35
size_t
16
36
rng_seed_size () {
17
37
randctx rctx;
@@ -21,44 +41,50 @@ rng_seed_size() {
21
41
// Initialization helpers for ISAAC RNG
22
42
23
43
void
24
- rng_gen_seed (rust_kernel* kernel, uint8_t * dest, size_t size) {
44
+ rng_gen_seed (uint8_t * dest, size_t size) {
25
45
#ifdef __WIN32__
26
46
HCRYPTPROV hProv;
27
- kernel-> win32_require
47
+ win32_require
28
48
(_T (" CryptAcquireContext" ),
29
49
CryptAcquireContext (&hProv, NULL , NULL , PROV_RSA_FULL,
30
50
CRYPT_VERIFYCONTEXT|CRYPT_SILENT));
31
- kernel-> win32_require
51
+ win32_require
32
52
(_T (" CryptGenRandom" ), CryptGenRandom (hProv, size, (BYTE*) dest));
33
- kernel-> win32_require
53
+ win32_require
34
54
(_T (" CryptReleaseContext" ), CryptReleaseContext (hProv, 0 ));
35
55
#else
36
56
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
+ }
39
61
size_t amount = 0 ;
40
62
do {
41
63
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
+ }
46
72
amount += (size_t )ret;
47
73
} while (amount < size);
48
74
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
+ }
53
80
#endif
54
81
}
55
82
56
83
static void
57
- isaac_init (rust_kernel *kernel, randctx *rctx ,
84
+ isaac_init (randctx *rctx, char *env_seed ,
58
85
uint8_t * user_seed, size_t seed_len) {
59
86
memset (rctx, 0 , sizeof (randctx));
60
87
61
- char *env_seed = kernel->env ->rust_seed ;
62
88
if (user_seed != NULL ) {
63
89
// ignore bytes after the required length
64
90
if (seed_len > sizeof (rctx->randrsl )) {
@@ -72,40 +98,38 @@ isaac_init(rust_kernel *kernel, randctx *rctx,
72
98
seed = (seed + 0x7ed55d16 ) + (seed << 12 );
73
99
}
74
100
} else {
75
- rng_gen_seed (kernel,
76
- (uint8_t *)&rctx->randrsl ,
101
+ rng_gen_seed ((uint8_t *)&rctx->randrsl ,
77
102
sizeof (rctx->randrsl ));
78
103
}
79
104
80
105
randinit (rctx, 1 );
81
106
}
82
107
83
108
void
84
- rng_init (rust_kernel* kernel, rust_rng* rng ,
109
+ rng_init (rust_rng* rng, char * env_seed ,
85
110
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 ;
88
113
}
89
114
90
115
static void
91
- rng_maybe_reseed (rust_kernel* kernel, rust_rng* rng) {
116
+ rng_maybe_reseed (rust_rng* rng) {
92
117
// If this RNG has generated more than 32KB of random data and was not
93
118
// seeded by the user or RUST_SEED, then we should reseed now.
94
119
const size_t RESEED_THRESHOLD = 32 * 1024 ;
95
120
size_t bytes_generated = rng->rctx .randc * sizeof (ub4);
96
121
if (bytes_generated < RESEED_THRESHOLD || !rng->reseedable ) {
97
122
return ;
98
123
}
99
- rng_gen_seed (kernel,
100
- (uint8_t *)rng->rctx .randrsl ,
124
+ rng_gen_seed ((uint8_t *)rng->rctx .randrsl ,
101
125
sizeof (rng->rctx .randrsl ));
102
126
randinit (&rng->rctx , 1 );
103
127
}
104
128
105
129
uint32_t
106
- rng_gen_u32 (rust_kernel* kernel, rust_rng* rng) {
130
+ rng_gen_u32 (rust_rng* rng) {
107
131
uint32_t x = isaac_rand (&rng->rctx );
108
- rng_maybe_reseed (kernel, rng);
132
+ rng_maybe_reseed (rng);
109
133
return x;
110
134
}
111
135
0 commit comments