Created
February 12, 2015 12:25
-
-
Save erkiesken/6bb756f7e166f8459eae to your computer and use it in GitHub Desktop.
secure_random.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function secure_rand(min, max) { | |
var rval = 0; | |
var range = max - min; | |
if (range < 2) { | |
return min; | |
} | |
var bits_needed = Math.ceil(Math.log2(range)); | |
if (bits_needed > 53) { | |
throw new Exception("We cannot generate numbers larger than 53 bits."); | |
} | |
var bytes_needed = Math.ceil(bits_needed / 8); | |
var mask = Math.pow(2, bits_needed) - 1; | |
// 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111 | |
// Create byte array and fill with N random numbers | |
var byteArray = new Uint8Array(bytes_needed); | |
window.crypto.getRandomValues(byteArray); | |
var p = (bytes_needed - 1) * 8; | |
for(var i = 0; i < bytes_needed; i++ ) { | |
rval += byteArray[i] * Math.pow(2, p); | |
p -= 8; | |
} | |
// Use & to apply the mask and reduce the number of recursive lookups | |
rval = rval & mask; | |
if (rval >= range) { | |
// Integer out of acceptable range | |
return secure_rand(min, max); | |
} | |
// Return an integer that falls within the range | |
return min + rval; | |
} | |
/* Also featured in: | |
https://github.com/resonantcore/lib/blob/master/js/diceware/diceware.js | |
https://github.com/EFForg/OpenWireless/blob/master/app/js/diceware.js | |
feel free to use in your projects (WTFPL) | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From https://github.com/resonantcore/lib/blob/develop/js/secure_random/secure_random.js |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment