From 94959756408aa60be4118ab1dceff4e71c6afdbf Mon Sep 17 00:00:00 2001 From: Ian Coleman Date: Wed, 30 Nov 2016 18:55:12 +1100 Subject: [PATCH] bitsPerEvent correct for multiple decks of cards --- bip39-standalone.html | 21 ++++++++++++++------- src/js/entropy.js | 16 +++++++++++++--- src/js/index.js | 5 +---- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/bip39-standalone.html b/bip39-standalone.html index e433d31..4bad422 100644 --- a/bip39-standalone.html +++ b/bip39-standalone.html @@ -18324,9 +18324,13 @@ window.Entropy = new (function() { while (entropyBin.length < expectedBits) { entropyBin = "0" + entropyBin; } + // Calculate the number of bits per event + var bitsPerEvent = Math.log2(base.asInt); // Cards binary must be handled differently, since they're not replaced if (base.asInt == 52) { - entropyBin = getCardBinary(base.parts); + var cardEntropy = processCardEntropy(base.parts); + entropyBin = cardEntropy.binaryStr; + bitsPerEvent = cardEntropy.bitsPerEvent; } // Supply a 'filtered' entropy string for display purposes var entropyClean = base.parts.join(""); @@ -18348,6 +18352,7 @@ window.Entropy = new (function() { binaryStr: entropyBin, cleanStr: entropyClean, cleanHtml: entropyHtml, + bitsPerEvent: bitsPerEvent, base: base, } return e; @@ -18440,7 +18445,7 @@ window.Entropy = new (function() { // total possible entropy is measured using n!, not base^n. // eg the second last card can be only one of two, not one of fifty two // so the added entropy for that card is only one bit at most - function getCardBinary(cards) { + function processCardEntropy(cards) { // Track how many instances of each card have been used, and thus // how many decks are in use. var cardCounts = {}; @@ -18509,7 +18514,12 @@ window.Entropy = new (function() { } // Truncate to the appropriate number of bits. entropyBin = entropyBin.substring(0, numberOfBits); - return entropyBin; + // Get the number of bits per event + bitsPerEvent = maxBits / totalCards; + return { + binaryStr: entropyBin, + bitsPerEvent: bitsPerEvent, + } } // Polyfill for Math.log2 @@ -19366,10 +19376,7 @@ window.Entropy = new (function() { } var entropyTypeStr = getEntropyTypeStr(entropy); var wordCount = Math.floor(numberOfBits / 32) * 3; - var bitsPerEvent = Math.log2(entropy.base.asInt).toFixed(2); - if (entropy.base.asInt == 52) { - bitsPerEvent = (4.3381).toFixed(2); // log2(52! / 52) - } + var bitsPerEvent = entropy.bitsPerEvent.toFixed(2); DOM.entropyFiltered.html(entropy.cleanHtml); DOM.entropyType.text(entropyTypeStr); DOM.entropyStrength.text(strength); diff --git a/src/js/entropy.js b/src/js/entropy.js index d04d861..b7274bb 100644 --- a/src/js/entropy.js +++ b/src/js/entropy.js @@ -120,9 +120,13 @@ window.Entropy = new (function() { while (entropyBin.length < expectedBits) { entropyBin = "0" + entropyBin; } + // Calculate the number of bits per event + var bitsPerEvent = Math.log2(base.asInt); // Cards binary must be handled differently, since they're not replaced if (base.asInt == 52) { - entropyBin = getCardBinary(base.parts); + var cardEntropy = processCardEntropy(base.parts); + entropyBin = cardEntropy.binaryStr; + bitsPerEvent = cardEntropy.bitsPerEvent; } // Supply a 'filtered' entropy string for display purposes var entropyClean = base.parts.join(""); @@ -144,6 +148,7 @@ window.Entropy = new (function() { binaryStr: entropyBin, cleanStr: entropyClean, cleanHtml: entropyHtml, + bitsPerEvent: bitsPerEvent, base: base, } return e; @@ -236,7 +241,7 @@ window.Entropy = new (function() { // total possible entropy is measured using n!, not base^n. // eg the second last card can be only one of two, not one of fifty two // so the added entropy for that card is only one bit at most - function getCardBinary(cards) { + function processCardEntropy(cards) { // Track how many instances of each card have been used, and thus // how many decks are in use. var cardCounts = {}; @@ -305,7 +310,12 @@ window.Entropy = new (function() { } // Truncate to the appropriate number of bits. entropyBin = entropyBin.substring(0, numberOfBits); - return entropyBin; + // Get the number of bits per event + bitsPerEvent = maxBits / totalCards; + return { + binaryStr: entropyBin, + bitsPerEvent: bitsPerEvent, + } } // Polyfill for Math.log2 diff --git a/src/js/index.js b/src/js/index.js index 12788ab..82e2161 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -828,10 +828,7 @@ } var entropyTypeStr = getEntropyTypeStr(entropy); var wordCount = Math.floor(numberOfBits / 32) * 3; - var bitsPerEvent = Math.log2(entropy.base.asInt).toFixed(2); - if (entropy.base.asInt == 52) { - bitsPerEvent = (4.3381).toFixed(2); // log2(52! / 52) - } + var bitsPerEvent = entropy.bitsPerEvent.toFixed(2); DOM.entropyFiltered.html(entropy.cleanHtml); DOM.entropyType.text(entropyTypeStr); DOM.entropyStrength.text(strength); -- 2.41.0