X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Fjs%2Fentropy.js;h=a709c782a171855e3f3ba875af1c39ef73890ab4;hb=acf4c9b588c6abcc275b4e46df54248a2c913366;hp=d04d861dfa16b44f23b41398ebaa2418b3b129e1;hpb=87ad2c6e4c7987320d8ce147fe9310b702c5deea;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git diff --git a/src/js/entropy.js b/src/js/entropy.js index d04d861..a709c78 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 = {}; @@ -258,7 +263,12 @@ window.Entropy = new (function() { } // Work out the total number of bits for this many decks // See http://crypto.stackexchange.com/q/41886 - var gainedBits = Math.log2(factorial(52 * numberOfDecks)); + var gainedBits = 0; + // Equivalent of Math.log2(factorial(52*numberOfDecks)) + // which becomes infinity for numberOfDecks > 4 + for (var i=1; i<=52*numberOfDecks; i++) { + gainedBits = gainedBits + Math.log2(i); + } var lostBits = 52 * Math.log2(factorial(numberOfDecks)); var maxBits = gainedBits - lostBits; // Convert the drawn cards to a binary representation. @@ -283,15 +293,12 @@ window.Entropy = new (function() { // Create a normalized string of the selected cards var normalizedCards = cards.join("").toUpperCase(); // Convert to binary using the SHA256 hash of the normalized cards. - // If the number of bits is more than 256, multiple rounds of hashing + // If the number of bits is more than 256, multiple hashes // are used until the required number of bits is reached. var entropyBin = ""; var iterations = 0; while (entropyBin.length < numberOfBits) { - var hashedCards = sjcl.hash.sha256.hash(normalizedCards); - for (var j=0; j