| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // Random number generator - requires a PRNG backend, e.g. prng4.js
- import { prng_newstate, rng_psize } from "./prng4";
- var rng_state;
- var rng_pool = null;
- var rng_pptr;
- // Initialize the pool with junk if needed.
- if (rng_pool == null) {
- rng_pool = [];
- rng_pptr = 0;
- var t = void 0;
- if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) {
- // Extract entropy (2048 bits) from RNG if available
- var z = new Uint32Array(256);
- window.crypto.getRandomValues(z);
- for (t = 0; t < z.length; ++t) {
- rng_pool[rng_pptr++] = z[t] & 255;
- }
- }
- // Use mouse events for entropy, if we do not have enough entropy by the time
- // we need it, entropy will be generated by Math.random.
- var count = 0;
- var onMouseMoveListener_1 = function (ev) {
- count = count || 0;
- if (count >= 256 || rng_pptr >= rng_psize) {
- if (window.removeEventListener) {
- window.removeEventListener("mousemove", onMouseMoveListener_1, false);
- }
- else if (window.detachEvent) {
- window.detachEvent("onmousemove", onMouseMoveListener_1);
- }
- return;
- }
- try {
- var mouseCoordinates = ev.x + ev.y;
- rng_pool[rng_pptr++] = mouseCoordinates & 255;
- count += 1;
- }
- catch (e) {
- // Sometimes Firefox will deny permission to access event properties for some reason. Ignore.
- }
- };
- if (typeof window !== 'undefined') {
- if (window.addEventListener) {
- window.addEventListener("mousemove", onMouseMoveListener_1, false);
- }
- else if (window.attachEvent) {
- window.attachEvent("onmousemove", onMouseMoveListener_1);
- }
- }
- }
- function rng_get_byte() {
- if (rng_state == null) {
- rng_state = prng_newstate();
- // At this point, we may not have collected enough entropy. If not, fall back to Math.random
- while (rng_pptr < rng_psize) {
- var random = Math.floor(65536 * Math.random());
- rng_pool[rng_pptr++] = random & 255;
- }
- rng_state.init(rng_pool);
- for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
- rng_pool[rng_pptr] = 0;
- }
- rng_pptr = 0;
- }
- // TODO: allow reseeding after first request
- return rng_state.next();
- }
- var SecureRandom = /** @class */ (function () {
- function SecureRandom() {
- }
- SecureRandom.prototype.nextBytes = function (ba) {
- for (var i = 0; i < ba.length; ++i) {
- ba[i] = rng_get_byte();
- }
- };
- return SecureRandom;
- }());
- export { SecureRandom };
|