]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/commitdiff
bitsPerEvent correct for multiple decks of cards
authorIan Coleman <coleman.ian@gmail.com>
Wed, 30 Nov 2016 07:55:12 +0000 (18:55 +1100)
committerIan Coleman <coleman.ian@gmail.com>
Wed, 30 Nov 2016 07:55:12 +0000 (18:55 +1100)
bip39-standalone.html
src/js/entropy.js
src/js/index.js

index e433d3194752c1610d798c155aeca64293129518..4bad422a672a0999a644d43b0fed096dbe49fd26 100644 (file)
@@ -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);
index d04d861dfa16b44f23b41398ebaa2418b3b129e1..b7274bbea7ccb5781aa084b45d0219d5e99e4e0e 100644 (file)
@@ -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
index 12788ab3da7b41620ac6f7ad08a0c2997d5148e8..82e216179bcc98da895753338f38015575be2a36 100644 (file)
         }
         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);