You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.0 KiB
97 lines
3.0 KiB
2 years ago
|
import randombytes from "../randombytes";
|
||
|
'use strict';
|
||
|
function oldBrowser() {
|
||
|
throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11');
|
||
|
}
|
||
|
var kBufferMaxLength = Buffer.kMaxLength;
|
||
|
var crypto = global.crypto || global.msCrypto;
|
||
|
var kMaxUint32 = Math.pow(2, 32) - 1;
|
||
|
function assertOffset(offset, length) {
|
||
|
if (typeof offset !== 'number' || offset !== offset) { // eslint-disable-line no-self-compare
|
||
|
throw new TypeError('offset must be a number');
|
||
|
}
|
||
|
if (offset > kMaxUint32 || offset < 0) {
|
||
|
throw new TypeError('offset must be a uint32');
|
||
|
}
|
||
|
if (offset > kBufferMaxLength || offset > length) {
|
||
|
throw new RangeError('offset out of range');
|
||
|
}
|
||
|
}
|
||
|
function assertSize(size, offset, length) {
|
||
|
if (typeof size !== 'number' || size !== size) { // eslint-disable-line no-self-compare
|
||
|
throw new TypeError('size must be a number');
|
||
|
}
|
||
|
if (size > kMaxUint32 || size < 0) {
|
||
|
throw new TypeError('size must be a uint32');
|
||
|
}
|
||
|
if (size + offset > length || size > kBufferMaxLength) {
|
||
|
throw new RangeError('buffer too small');
|
||
|
}
|
||
|
}
|
||
|
if ((crypto && crypto.getRandomValues) || !process.browser) {
|
||
|
}
|
||
|
else {
|
||
|
}
|
||
|
function randomFill(buf, offset, size, cb) {
|
||
|
if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
|
||
|
throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
|
||
|
}
|
||
|
if (typeof offset === 'function') {
|
||
|
cb = offset;
|
||
|
offset = 0;
|
||
|
size = buf.length;
|
||
|
}
|
||
|
else if (typeof size === 'function') {
|
||
|
cb = size;
|
||
|
size = buf.length - offset;
|
||
|
}
|
||
|
else if (typeof cb !== 'function') {
|
||
|
throw new TypeError('"cb" argument must be a function');
|
||
|
}
|
||
|
assertOffset(offset, buf.length);
|
||
|
assertSize(size, offset, buf.length);
|
||
|
return actualFill(buf, offset, size, cb);
|
||
|
}
|
||
|
function actualFill(buf, offset, size, cb) {
|
||
|
if (process.browser) {
|
||
|
var ourBuf = buf.buffer;
|
||
|
var uint = new Uint8Array(ourBuf, offset, size);
|
||
|
crypto.getRandomValues(uint);
|
||
|
if (cb) {
|
||
|
process.nextTick(function () {
|
||
|
cb(null, buf);
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
return buf;
|
||
|
}
|
||
|
if (cb) {
|
||
|
randombytes(size, function (err, bytes) {
|
||
|
if (err) {
|
||
|
return cb(err);
|
||
|
}
|
||
|
bytes.copy(buf, offset);
|
||
|
cb(null, buf);
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
var bytes = randombytes(size);
|
||
|
bytes.copy(buf, offset);
|
||
|
return buf;
|
||
|
}
|
||
|
function randomFillSync(buf, offset, size) {
|
||
|
if (typeof offset === 'undefined') {
|
||
|
offset = 0;
|
||
|
}
|
||
|
if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
|
||
|
throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
|
||
|
}
|
||
|
assertOffset(offset, buf.length);
|
||
|
if (size === undefined)
|
||
|
size = buf.length - offset;
|
||
|
assertSize(size, offset, buf.length);
|
||
|
return actualFill(buf, offset, size);
|
||
|
}
|
||
|
export { randomFill };
|
||
|
export { randomFillSync };
|