UNPKG

1.37 kBJavaScriptView Raw
1'use strict';
2
3function Random() {
4}
5
6/* secure random bytes that sometimes throws an error due to lack of entropy */
7Random.getRandomBuffer = function(size) {
8 if (process.browser)
9 return Random.getRandomBufferBrowser(size);
10 else
11 return Random.getRandomBufferNode(size);
12};
13
14Random.getRandomBufferNode = function(size) {
15 var crypto = require('crypto');
16 return crypto.randomBytes(size);
17};
18
19Random.getRandomBufferBrowser = function(size) {
20 if (!window.crypto && !window.msCrypto)
21 throw new Error('window.crypto not available');
22
23 if (window.crypto && window.crypto.getRandomValues)
24 var crypto = window.crypto;
25 else if (window.msCrypto && window.msCrypto.getRandomValues) //internet explorer
26 var crypto = window.msCrypto;
27 else
28 throw new Error('window.crypto.getRandomValues not available');
29
30 var bbuf = new Uint8Array(size);
31 crypto.getRandomValues(bbuf);
32 var buf = Buffer.from(bbuf);
33
34 return buf;
35};
36
37/* insecure random bytes, but it never fails */
38Random.getPseudoRandomBuffer = function(size) {
39 var b32 = 0x100000000;
40 var b = Buffer.alloc(size);
41 var r;
42
43 for (var i = 0; i <= size; i++) {
44 var j = Math.floor(i / 4);
45 var k = i - j * 4;
46 if (k === 0) {
47 r = Math.random() * b32;
48 b[i] = r & 0xff;
49 } else {
50 b[i] = (r = r >>> 8) & 0xff;
51 }
52 }
53
54 return b;
55};
56
57module.exports = Random;