]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/commitdiff
Show entropy from PRNG and word indexes
authorIan Coleman <ian@iancoleman.io>
Wed, 22 Nov 2017 04:28:58 +0000 (15:28 +1100)
committerIan Coleman <ian@iancoleman.io>
Wed, 22 Nov 2017 04:37:36 +0000 (15:37 +1100)
see issue #132

src/index.html
src/js/index.js
tests/spec/tests.js

index f481473001d4f990b29e3f416d45c23bd59ecb73..ac1ab48e7dd8e477161411b82c43ca77e6255738 100644 (file)
                                     <div class="filtered col-sm-9 form-control-static"></div>
                                     <label class="col-sm-3 control-label">Raw Binary</label>
                                     <div class="binary col-sm-9 form-control-static"></div>
+                                    <label class="col-sm-3 control-label">Word Indexes</label>
+                                    <div class="word-indexes col-sm-9 form-control-static">&nbsp;</div>
                                     <label class="col-sm-3 control-label">Mnemonic Length</label>
                                     <div class="col-sm-9">
                                         <select class="mnemonic-length form-control">
                             <div class="col-sm-10 checkbox">
                                 <label>
                                     <input type="checkbox" class="use-entropy">
-                                    <span>Supply my own source of entropy</span>
+                                    <span>Show entropy details</span>
                                 </label>
                             </div>
                         </div>
index 261a6d19c43005d77809bae797f7f1726fdbee0e..58090c34a410638579d133e8d1b961212fbeb971 100644 (file)
@@ -37,6 +37,7 @@
     DOM.entropyBitsPerEvent = DOM.entropyContainer.find(".bits-per-event");
     DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
     DOM.entropyBinary = DOM.entropyContainer.find(".binary");
+    DOM.entropyWordIndexes = DOM.entropyContainer.find(".word-indexes");
     DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
     DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
     DOM.phrase = $(".phrase");
         var passphrase = DOM.passphrase.val();
         calcBip32RootKeyFromSeed(phrase, passphrase);
         calcForDerivationPath();
+        // Show the word indexes
+        showWordIndexes();
     }
 
     function tabChanged() {
             showValidationError(errorText);
             return;
         }
+        // get the amount of entropy to use
         var numWords = parseInt(DOM.generatedStrength.val());
         var strength = numWords / 3 * 32;
-        var words = mnemonic.generate(strength);
+        var buffer = new Uint8Array(strength / 8);
+        // create secure entropy
+        var data = crypto.getRandomValues(buffer);
+        // show the words
+        var words = mnemonic.toMnemonic(data);
         DOM.phrase.val(words);
+        // show the entropy
+        var entropyHex = uint8ArrayToHex(data);
+        DOM.entropy.val(entropyHex);
+        // ensure entropy fields are consistent with what is being displayed
+        DOM.entropyMnemonicLength.val("raw");
         return words;
     }
 
         var phrase = mnemonic.toMnemonic(entropyArr);
         // Set the mnemonic in the UI
         DOM.phrase.val(phrase);
+        // Show the word indexes
+        showWordIndexes();
     }
 
     function clearEntropyFeedback() {
         return parseInt(lastBitClean);
     }
 
+    function uint8ArrayToHex(a) {
+        var s = ""
+        for (var i=0; i<a.length; i++) {
+            var h = a[i].toString(16);
+            while (h.length < 2) {
+                h = "0" + h;
+            }
+            s = s + h;
+        }
+        return s;
+    }
+
+    function showWordIndexes() {
+        var phrase = DOM.phrase.val();
+        var words = phraseToWordArray(phrase);
+        var wordIndexes = [];
+        var language = getLanguage();
+        for (var i=0; i<words.length; i++) {
+            var word = words[i];
+            var wordIndex = WORDLISTS[language].indexOf(word);
+            wordIndexes.push(wordIndex);
+        }
+        var wordIndexesStr = wordIndexes.join(", ");
+        DOM.entropyWordIndexes.text(wordIndexesStr);
+    }
+
     var networks = [
         {
             name: "BCH - Bitcoin Cash",
index 2b28d739eb354beaa2e5b20ab3897097e9e10445..409219b1d6b418d18c298fd11ff96bf101f92e25 100644 (file)
@@ -2643,4 +2643,31 @@ it('Can generate BIP141 addresses with P2WPKH semanitcs', function(done) {
     });
 });
 
+it('Shows the entropy used by the PRNG when clicking generate', function(done) {
+    driver.findElement(By.css('.generate')).click();
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.entropy'))
+            .getAttribute("value")
+            .then(function(entropy) {
+                expect(entropy).not.toBe("");
+                done();
+            });
+    });
+});
+
+it('Shows the index of each word in the mnemonic', function(done) {
+    driver.findElement(By.css('.phrase'))
+        .sendKeys("abandon abandon ability");
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.use-entropy'))
+            .click();
+        driver.findElement(By.css('.word-indexes'))
+            .getText()
+            .then(function(indexes) {
+                expect(indexes).toBe("0, 0, 1");
+                done();
+            });
+    });
+});
+
 });