@@ -41,7 +41,7 @@ rng_seed_size() {
41
41
// Initialization helpers for ISAAC RNG
42
42
43
43
void
44
- rng_gen_seed (rust_kernel* kernel, uint8_t * dest, size_t size) {
44
+ rng_gen_seed (uint8_t * dest, size_t size) {
45
45
#ifdef __WIN32__
46
46
HCRYPTPROV hProv;
47
47
win32_require
@@ -54,31 +54,37 @@ rng_gen_seed(rust_kernel* kernel, uint8_t* dest, size_t size) {
54
54
(_T (" CryptReleaseContext" ), CryptReleaseContext (hProv, 0 ));
55
55
#else
56
56
int fd = open (" /dev/urandom" , O_RDONLY);
57
- if (fd == -1 )
58
- 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
+ }
59
61
size_t amount = 0 ;
60
62
do {
61
63
ssize_t ret = read (fd, dest+amount, size-amount);
62
- if (ret < 0 )
63
- kernel->fatal (" error reading /dev/urandom: %s" , strerror (errno));
64
- else if (ret == 0 )
65
- 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
+ }
66
72
amount += (size_t )ret;
67
73
} while (amount < size);
68
74
int ret = close (fd);
69
- // FIXME #3697: Why does this fail sometimes?
70
- if (ret != 0 )
71
- kernel->log (log_warn, " error closing /dev/urandom: %s" ,
72
- 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
+ }
73
80
#endif
74
81
}
75
82
76
83
static void
77
- isaac_init (rust_kernel *kernel, randctx *rctx ,
84
+ isaac_init (randctx *rctx, char *env_seed ,
78
85
uint8_t * user_seed, size_t seed_len) {
79
86
memset (rctx, 0 , sizeof (randctx));
80
87
81
- char *env_seed = kernel->env ->rust_seed ;
82
88
if (user_seed != NULL ) {
83
89
// ignore bytes after the required length
84
90
if (seed_len > sizeof (rctx->randrsl )) {
@@ -92,40 +98,38 @@ isaac_init(rust_kernel *kernel, randctx *rctx,
92
98
seed = (seed + 0x7ed55d16 ) + (seed << 12 );
93
99
}
94
100
} else {
95
- rng_gen_seed (kernel,
96
- (uint8_t *)&rctx->randrsl ,
101
+ rng_gen_seed ((uint8_t *)&rctx->randrsl ,
97
102
sizeof (rctx->randrsl ));
98
103
}
99
104
100
105
randinit (rctx, 1 );
101
106
}
102
107
103
108
void
104
- rng_init (rust_kernel* kernel, rust_rng* rng ,
109
+ rng_init (rust_rng* rng, char * env_seed ,
105
110
uint8_t *user_seed, size_t seed_len) {
106
- isaac_init (kernel, &rng->rctx , user_seed, seed_len);
107
- 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 ;
108
113
}
109
114
110
115
static void
111
- rng_maybe_reseed (rust_kernel* kernel, rust_rng* rng) {
116
+ rng_maybe_reseed (rust_rng* rng) {
112
117
// If this RNG has generated more than 32KB of random data and was not
113
118
// seeded by the user or RUST_SEED, then we should reseed now.
114
119
const size_t RESEED_THRESHOLD = 32 * 1024 ;
115
120
size_t bytes_generated = rng->rctx .randc * sizeof (ub4);
116
121
if (bytes_generated < RESEED_THRESHOLD || !rng->reseedable ) {
117
122
return ;
118
123
}
119
- rng_gen_seed (kernel,
120
- (uint8_t *)rng->rctx .randrsl ,
124
+ rng_gen_seed ((uint8_t *)rng->rctx .randrsl ,
121
125
sizeof (rng->rctx .randrsl ));
122
126
randinit (&rng->rctx , 1 );
123
127
}
124
128
125
129
uint32_t
126
- rng_gen_u32 (rust_kernel* kernel, rust_rng* rng) {
130
+ rng_gen_u32 (rust_rng* rng) {
127
131
uint32_t x = isaac_rand (&rng->rctx );
128
- rng_maybe_reseed (kernel, rng);
132
+ rng_maybe_reseed (rng);
129
133
return x;
130
134
}
131
135
0 commit comments