From d7987e0c4f6ed3121d40c6890fca79bb0efac209 Mon Sep 17 00:00:00 2001 From: Steve Thomas Date: Thu, 1 Dec 2016 01:21:40 -0600 Subject: [PATCH 1/2] Fixed random when range>2**31 --- app/js/diceware.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/js/diceware.js b/app/js/diceware.js index 2cea62a..39abd46 100644 --- a/app/js/diceware.js +++ b/app/js/diceware.js @@ -65,7 +65,7 @@ Diceware.prototype.random = function (min, max) { 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; + var mod = Math.pow(2, bits_needed); // 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111 // Create byte array and fill with N random numbers @@ -78,8 +78,8 @@ Diceware.prototype.random = function (min, max) { p -= 8; } - // Use & to apply the mask and reduce the number of recursive lookups - rval = rval & mask; + // Use % to reduce the number of recursive lookups + rval = rval % mod; if (rval >= range) { // Integer out of acceptable range From d6a9555a6f608be3d7bf8b3166036a2428744b95 Mon Sep 17 00:00:00 2001 From: Steve Thomas Date: Thu, 1 Dec 2016 01:24:49 -0600 Subject: [PATCH 2/2] Fixed off by one bug --- app/js/diceware.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/js/diceware.js b/app/js/diceware.js index 39abd46..64388bb 100644 --- a/app/js/diceware.js +++ b/app/js/diceware.js @@ -58,7 +58,7 @@ Diceware.prototype.getWords = function(words) { Diceware.prototype.random = function (min, max) { var rval = 0; - var range = max - min; + var range = max - min + 1; var bits_needed = Math.ceil(Math.log2(range)); if (bits_needed > 53) { @@ -93,6 +93,6 @@ Diceware.prototype.getSingleWord = function() { if (!window.crypto || !window.crypto.getRandomValues) { return null; } - var index = this.random(0, this.wordlist.length); + var index = this.random(0, this.wordlist.length - 1); return this.wordlist[index]; };