64 lines
1.4 KiB
JavaScript
64 lines
1.4 KiB
JavaScript
/*!
|
|
* random-browser.js - randomness for bcoin
|
|
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
|
|
* https://github.com/bcoin-org/bcoin
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
/**
|
|
* @module crypto.random-browser
|
|
* @ignore
|
|
*/
|
|
|
|
const crypto = global.crypto || global.msCrypto || {};
|
|
|
|
/**
|
|
* Generate pseudo-random bytes.
|
|
* @param {Number} size
|
|
* @returns {Buffer}
|
|
*/
|
|
|
|
exports.randomBytes = function randomBytes(size) {
|
|
const data = new Uint8Array(size);
|
|
crypto.getRandomValues(data);
|
|
return Buffer.from(data.buffer);
|
|
};
|
|
|
|
if (!crypto.getRandomValues) {
|
|
// Out of luck here. Use bad randomness for now.
|
|
exports.randomBytes = function randomBytes(size) {
|
|
const data = Buffer.allocUnsafe(size);
|
|
|
|
for (let i = 0; i < data.length; i++)
|
|
data[i] = Math.floor(Math.random() * 256);
|
|
|
|
return data;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Generate a random uint32.
|
|
* Probably more cryptographically sound than
|
|
* `Math.random()`.
|
|
* @returns {Number}
|
|
*/
|
|
|
|
exports.randomInt = function randomInt() {
|
|
return exports.randomBytes(4).readUInt32LE(0, true);
|
|
};
|
|
|
|
/**
|
|
* Generate a random number within a range.
|
|
* Probably more cryptographically sound than
|
|
* `Math.random()`.
|
|
* @param {Number} min - Inclusive.
|
|
* @param {Number} max - Exclusive.
|
|
* @returns {Number}
|
|
*/
|
|
|
|
exports.randomRange = function randomRange(min, max) {
|
|
const num = exports.randomInt();
|
|
return Math.floor((num / 0x100000000) * (max - min) + min);
|
|
};
|