secure-random
Version:
Normalize the creation of cryptographically strong random values.
84 lines (72 loc) • 2.27 kB
JavaScript
!function(globals){
//*** UMD BEGIN
if (typeof define !== 'undefined' && define.amd) { //require.js / AMD
define([], function() {
return secureRandom
})
} else if (typeof module !== 'undefined' && module.exports) { //CommonJS
module.exports = secureRandom
} else { //script / browser
globals.secureRandom = secureRandom
}
//*** UMD END
//options.type is the only valid option
function secureRandom(count, options) {
options = options || {type: 'Array'}
//we check for process.pid to prevent browserify from tricking us
if (
typeof process != 'undefined'
&& typeof process.pid == 'number'
&& process.versions
&& process.versions.node
) {
return nodeRandom(count, options)
} else {
var crypto = window.crypto || window.msCrypto
if (!crypto) throw new Error("Your browser does not support window.crypto.")
return browserRandom(count, options)
}
}
function nodeRandom(count, options) {
var crypto = require('crypto')
var buf = crypto.randomBytes(count)
switch (options.type) {
case 'Array':
return [].slice.call(buf)
case 'Buffer':
return buf
case 'Uint8Array':
var arr = new Uint8Array(count)
for (var i = 0; i < count; ++i) { arr[i] = buf.readUInt8(i) }
return arr
default:
throw new Error(options.type + " is unsupported.")
}
}
function browserRandom(count, options) {
var nativeArr = new Uint8Array(count)
var crypto = window.crypto || window.msCrypto
crypto.getRandomValues(nativeArr)
switch (options.type) {
case 'Array':
return [].slice.call(nativeArr)
case 'Buffer':
try { var b = new Buffer(1) } catch(e) { throw new Error('Buffer not supported in this environment. Use Node.js or Browserify for browser support.')}
return new Buffer(nativeArr)
case 'Uint8Array':
return nativeArr
default:
throw new Error(options.type + " is unsupported.")
}
}
secureRandom.randomArray = function(byteCount) {
return secureRandom(byteCount, {type: 'Array'})
}
secureRandom.randomUint8Array = function(byteCount) {
return secureRandom(byteCount, {type: 'Uint8Array'})
}
secureRandom.randomBuffer = function(byteCount) {
return secureRandom(byteCount, {type: 'Buffer'})
}
}(this);