[6a3a178] | 1 | 'use strict'
|
---|
| 2 |
|
---|
| 3 | // limit of Crypto.getRandomValues()
|
---|
| 4 | // https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues
|
---|
| 5 | var MAX_BYTES = 65536
|
---|
| 6 |
|
---|
| 7 | // Node supports requesting up to this number of bytes
|
---|
| 8 | // https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48
|
---|
| 9 | var MAX_UINT32 = 4294967295
|
---|
| 10 |
|
---|
| 11 | function oldBrowser () {
|
---|
| 12 | throw new Error('Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11')
|
---|
| 13 | }
|
---|
| 14 |
|
---|
| 15 | var Buffer = require('safe-buffer').Buffer
|
---|
| 16 | var crypto = global.crypto || global.msCrypto
|
---|
| 17 |
|
---|
| 18 | if (crypto && crypto.getRandomValues) {
|
---|
| 19 | module.exports = randomBytes
|
---|
| 20 | } else {
|
---|
| 21 | module.exports = oldBrowser
|
---|
| 22 | }
|
---|
| 23 |
|
---|
| 24 | function randomBytes (size, cb) {
|
---|
| 25 | // phantomjs needs to throw
|
---|
| 26 | if (size > MAX_UINT32) throw new RangeError('requested too many random bytes')
|
---|
| 27 |
|
---|
| 28 | var bytes = Buffer.allocUnsafe(size)
|
---|
| 29 |
|
---|
| 30 | if (size > 0) { // getRandomValues fails on IE if size == 0
|
---|
| 31 | if (size > MAX_BYTES) { // this is the max bytes crypto.getRandomValues
|
---|
| 32 | // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues
|
---|
| 33 | for (var generated = 0; generated < size; generated += MAX_BYTES) {
|
---|
| 34 | // buffer.slice automatically checks if the end is past the end of
|
---|
| 35 | // the buffer so we don't have to here
|
---|
| 36 | crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES))
|
---|
| 37 | }
|
---|
| 38 | } else {
|
---|
| 39 | crypto.getRandomValues(bytes)
|
---|
| 40 | }
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 | if (typeof cb === 'function') {
|
---|
| 44 | return process.nextTick(function () {
|
---|
| 45 | cb(null, bytes)
|
---|
| 46 | })
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | return bytes
|
---|
| 50 | }
|
---|