about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/rt/rust_util.h19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/rt/rust_util.h b/src/rt/rust_util.h
index 420821194c9..6f2ab4c3139 100644
--- a/src/rt/rust_util.h
+++ b/src/rt/rust_util.h
@@ -140,11 +140,20 @@ isaac_init(rust_dom *dom, randctx *rctx)
                  CryptReleaseContext(hProv, 0));
         }
 #else
-        int fd = open("/dev/urandom", O_RDONLY);
-        I(dom, fd > 0);
-        I(dom, read(fd, (void*) &rctx->randrsl, sizeof(rctx->randrsl))
-          == sizeof(rctx->randrsl));
-        I(dom, close(fd) == 0);
+        char *rust_seed = getenv("RUST_SEED");
+        if (rust_seed != NULL) {
+            ub4 seed = (ub4) atoi(rust_seed);
+            for (size_t i = 0; i < RANDSIZ; i ++) {
+                memcpy(&rctx->randrsl[i], &seed, sizeof(ub4));
+                seed = (seed + 0x7ed55d16) + (seed << 12);
+            }
+        } else {
+            int fd = open("/dev/urandom", O_RDONLY);
+            I(dom, fd > 0);
+            I(dom, read(fd, (void*) &rctx->randrsl, sizeof(rctx->randrsl))
+              == sizeof(rctx->randrsl));
+            I(dom, close(fd) == 0);
+        }
 #endif
         randinit(rctx, 1);
 }