1 | 'use strict';
|
2 |
|
3 | function Random() {
|
4 | }
|
5 |
|
6 |
|
7 | Random.getRandomBuffer = function(size) {
|
8 | if (process.browser)
|
9 | return Random.getRandomBufferBrowser(size);
|
10 | else
|
11 | return Random.getRandomBufferNode(size);
|
12 | };
|
13 |
|
14 | Random.getRandomBufferNode = function(size) {
|
15 | var crypto = require('crypto');
|
16 | return crypto.randomBytes(size);
|
17 | };
|
18 |
|
19 | Random.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)
|
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 |
|
38 | Random.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 |
|
57 | module.exports = Random;
|