]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/commitdiff
Detect and warn of filtered entropy
authorIan Coleman <coleman.ian@gmail.com>
Wed, 20 Sep 2017 00:31:28 +0000 (10:31 +1000)
committerIan Coleman <coleman.ian@gmail.com>
Wed, 20 Sep 2017 01:25:21 +0000 (11:25 +1000)
src/index.html
src/js/index.js
tests.js

index cc38ed0d4991c2a4ef070b4564a7e5b4afe6d290..7507a3552f7deb15a8cbfb1b736e604ba62bec9d 100644 (file)
                                 <label for="entropy" class="col-sm-2 control-label" data-translate>Entropy</label>
                                 <div class="col-sm-7">
                                     <textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts either binary, base 6, 6-sided dice, base 10, hexadecimal or cards" data-translate-placeholder></textarea>
+                                    <div class="row filter-warning text-danger hidden">
+                                        <p class="col-sm-12">
+                                        <strong>
+                                        Some characters have been discarded
+                                        </strong>
+                                        </p>
+                                    </div>
                                     <div class="row">
                                         <label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Based on estimates from zxcvbn using Filtered Entropy">Time To Crack</span></label>
                                         <div class="crack-time col-sm-3 form-control-static"></div>
index 9bd77b956d491c117dcac0d6bb6d050a041b0d89..6a2fea609140edb8e8b4561426f066772bd88bac 100644 (file)
@@ -38,6 +38,7 @@
     DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
     DOM.entropyBinary = DOM.entropyContainer.find(".binary");
     DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
+    DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
     DOM.phrase = $(".phrase");
     DOM.passphrase = $(".passphrase");
     DOM.generateContainer = $(".generate-container");
         DOM.entropyWordCount.text(wordCount);
         DOM.entropyBinary.text(entropy.binaryStr);
         DOM.entropyBitsPerEvent.text(bitsPerEvent);
+        // detect and warn of filtering
+        var rawNoSpaces = DOM.entropy.val().replace(/\s/g, "");
+        var cleanNoSpaces = entropy.cleanStr.replace(/\s/g, "");
+        var isFiltered = rawNoSpaces.length != cleanNoSpaces.length;
+        if (isFiltered) {
+            DOM.entropyFilterWarning.removeClass('hidden');
+        }
+        else {
+            DOM.entropyFilterWarning.addClass('hidden');
+        }
     }
 
     function getEntropyTypeStr(entropy) {
index 8965f80a8d3935ad0da5bfb333dc77eec6c2327e..34eff9630659d25f8f375fa93cb108f858fba82e 100644 (file)
--- a/tests.js
+++ b/tests.js
@@ -4306,6 +4306,44 @@ page.open(url, function(status) {
 });
 },
 
+// github issue 99
+// https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159
+// "warn me emphatically when they have detected invalid input" to the entropy field
+// A warning is shown when entropy is filtered and discarded
+function() {
+page.open(url, function(status) {
+    // use entropy
+    page.evaluate(function() {
+        $(".use-entropy").prop("checked", true).trigger("change");
+        $(".entropy").val("00000000 00000000 00000000 00000000").trigger("input");
+    });
+    // check the filter warning does not show
+    waitForGenerate(function() {
+        var warningIsHidden = page.evaluate(function() {
+            return $(".entropy-container .filter-warning").hasClass("hidden");
+        });
+        if (!warningIsHidden) {
+            console.log("Entropy filter warning is showing when it should not");
+            fail();
+        }
+        page.evaluate(function() {
+            $(".entropy").val("10000000 zxcvbn 00000000 00000000 00000000").trigger("input");
+        });
+        // check the filter warning shows
+        waitForEntropyFeedback(function() {
+            var warningIsHidden = page.evaluate(function() {
+                return $(".entropy-container .filter-warning").hasClass("hidden");
+            });
+            if (warningIsHidden) {
+                console.log("Entropy filter warning is not showing when it should");
+                fail();
+            }
+            next();
+        });
+    });
+});
+},
+
 // If you wish to add more tests, do so here...
 
 // Here is a blank test template