UNPKG

1.79 kBJavaScriptView Raw
1var randomHex = function(size, callback) {
2 var crypto = require('./crypto.js');
3 var isCallback = (typeof callback === 'function');
4
5
6 if (size > 65536) {
7 if(isCallback) {
8 callback(new Error('Requested too many random bytes.'));
9 } else {
10 throw new Error('Requested too many random bytes.');
11 }
12 };
13
14
15 // is node
16 if (typeof crypto !== 'undefined' && crypto.randomBytes) {
17
18 if(isCallback) {
19 crypto.randomBytes(size, function(err, result){
20 if(!err) {
21 callback(null, '0x'+ result.toString('hex'));
22 } else {
23 callback(error);
24 }
25 })
26 } else {
27 return '0x'+ crypto.randomBytes(size).toString('hex');
28 }
29
30 // is browser
31 } else {
32 var cryptoLib;
33
34 if (typeof crypto !== 'undefined') {
35 cryptoLib = crypto;
36 } else if(typeof msCrypto !== 'undefined') {
37 cryptoLib = msCrypto;
38 }
39
40 if (cryptoLib && cryptoLib.getRandomValues) {
41 var randomBytes = cryptoLib.getRandomValues(new Uint8Array(size));
42 var returnValue = '0x'+ Array.from(randomBytes).map(function(arr){ return arr.toString(16); }).join('');
43
44 if(isCallback) {
45 callback(null, returnValue);
46 } else {
47 return returnValue;
48 }
49
50 // not crypto object
51 } else {
52 var error = new Error('No "crypto" object available. This Browser doesn\'t support generating secure random bytes.');
53
54 if(isCallback) {
55 callback(error);
56 } else {
57 throw error;
58 }
59 }
60 }
61};
62
63
64module.exports = randomHex;