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.
57 lines
1.3 KiB
57 lines
1.3 KiB
'use strict';
|
|
|
|
function Random() {
|
|
}
|
|
|
|
/* secure random bytes that sometimes throws an error due to lack of entropy */
|
|
Random.getRandomBuffer = function(size) {
|
|
if (process.browser)
|
|
return Random.getRandomBufferBrowser(size);
|
|
else
|
|
return Random.getRandomBufferNode(size);
|
|
};
|
|
|
|
Random.getRandomBufferNode = function(size) {
|
|
var crypto = require('crypto');
|
|
return crypto.randomBytes(size);
|
|
};
|
|
|
|
Random.getRandomBufferBrowser = function(size) {
|
|
if (!window.crypto && !window.msCrypto)
|
|
throw new Error('window.crypto not available');
|
|
|
|
if (window.crypto && window.crypto.getRandomValues)
|
|
var crypto = window.crypto;
|
|
else if (window.msCrypto && window.msCrypto.getRandomValues) //internet explorer
|
|
var crypto = window.msCrypto;
|
|
else
|
|
throw new Error('window.crypto.getRandomValues not available');
|
|
|
|
var bbuf = new Uint8Array(size);
|
|
crypto.getRandomValues(bbuf);
|
|
var buf = new Buffer(bbuf);
|
|
|
|
return buf;
|
|
};
|
|
|
|
/* insecure random bytes, but it never fails */
|
|
Random.getPseudoRandomBuffer = function(size) {
|
|
var b32 = 0x100000000;
|
|
var b = new Buffer(size);
|
|
var r;
|
|
|
|
for (var i = 0; i <= size; i++) {
|
|
var j = Math.floor(i / 4);
|
|
var k = i - j * 4;
|
|
if (k === 0) {
|
|
r = Math.random() * b32;
|
|
b[i] = r & 0xff;
|
|
} else {
|
|
b[i] = (r = r >>> 8) & 0xff;
|
|
}
|
|
}
|
|
|
|
return b;
|
|
};
|
|
|
|
module.exports = Random;
|
|
|