@@ -73,11 +73,35 @@ isaac_init(rust_kernel *kernel, randctx *rctx, rust_vec_box* user_seed) {
7373void
7474rng_init (rust_kernel* kernel, rust_rng* rng, rust_vec_box* user_seed) {
7575 isaac_init (kernel, &rng->rctx , user_seed);
76+ rng->reseedable = !user_seed && !kernel->env ->rust_seed ;
77+ }
78+
79+ static void
80+ rng_maybe_reseed (rust_kernel* kernel, rust_rng* rng) {
81+ // If this RNG has generated more than 32KB of random data and was not
82+ // seeded by the user or RUST_SEED, then we should reseed now.
83+ const size_t RESEED_THRESHOLD = 32 * 1024 ;
84+ size_t bytes_generated = rng->rctx .randc * sizeof (ub4);
85+ if (bytes_generated < RESEED_THRESHOLD || !rng->reseedable ) {
86+ return ;
87+ }
88+
89+ uint32_t new_seed[RANDSIZ];
90+ rng_gen_seed (kernel, (uint8_t *) new_seed, RANDSIZ * sizeof (uint32_t ));
91+
92+ // Stir new seed into PRNG's entropy pool.
93+ for (size_t i = 0 ; i < RANDSIZ; i++) {
94+ rng->rctx .randrsl [i] ^= new_seed[i];
95+ }
96+
97+ randinit (&rng->rctx , 1 );
7698}
7799
78100uint32_t
79- rng_gen_u32 (rust_rng* rng) {
80- return isaac_rand (&rng->rctx );
101+ rng_gen_u32 (rust_kernel* kernel, rust_rng* rng) {
102+ uint32_t x = isaac_rand (&rng->rctx );
103+ rng_maybe_reseed (kernel, rng);
104+ return x;
81105}
82106
83107//
0 commit comments