Expose an RNG (the one used by our runtime) to Rust via std.

This commit is contained in:
Roy Frostig
2010-07-25 21:45:09 -07:00
parent 7ef9e82f51
commit 5b6e714d05
7 changed files with 114 additions and 25 deletions

View File

@@ -117,6 +117,38 @@ next_power_of_two(size_t s)
return tmp + 1;
}
// Initialization helper for ISAAC RNG
static inline void
isaac_init(rust_dom *dom, randctx *rctx)
{
memset(rctx, 0, sizeof(randctx));
#ifdef __WIN32__
{
HCRYPTPROV hProv;
win32_require
(_T("CryptAcquireContext"),
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT|CRYPT_SILENT));
win32_require
(_T("CryptGenRandom"),
CryptGenRandom(hProv, sizeof(rctx->randrsl),
(BYTE*)(&rctx->randrsl)));
win32_require
(_T("CryptReleaseContext"),
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);
#endif
randinit(rctx, 1);
}
// Vectors (rust-user-code level).
struct