<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"> </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>
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",
});
});
+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();
+ });
+ });
+});
+
});