Entropy can be supplied by user

This commit is contained in:
Ian Coleman
2016-11-03 16:34:56 +11:00
parent d737abf680
commit c6624d51f4
5 changed files with 4465 additions and 14 deletions
+105 -1
View File
@@ -14,14 +14,20 @@
var showPubKey = true;
var showPrivKey = true;
var entropyChangeTimeoutEvent = null;
var phraseChangeTimeoutEvent = null;
var rootKeyChangedTimeoutEvent = null;
var DOM = {};
DOM.network = $(".network");
DOM.phraseNetwork = $("#network-phrase");
DOM.useEntropy = $(".use-entropy");
DOM.entropyContainer = $(".entropy-container");
DOM.entropy = $(".entropy");
DOM.entropyError = $(".entropy-error");
DOM.phrase = $(".phrase");
DOM.passphrase = $(".passphrase");
DOM.generateContainer = $(".generate-container");
DOM.generate = $(".generate");
DOM.seed = $(".seed");
DOM.rootKey = $(".root-key");
@@ -53,6 +59,8 @@
function init() {
// Events
DOM.network.on("change", networkChanged);
DOM.useEntropy.on("change", setEntropyVisibility);
DOM.entropy.on("input", delayedEntropyChanged);
DOM.phrase.on("input", delayedPhraseChanged);
DOM.passphrase.on("input", delayedPhraseChanged);
DOM.generate.on("click", generateClicked);
@@ -89,6 +97,21 @@
}
}
function setEntropyVisibility() {
if (isUsingOwnEntropy()) {
DOM.entropyContainer.removeClass("hidden");
DOM.generateContainer.addClass("hidden");
DOM.phrase.prop("readonly", true);
DOM.entropy.focus();
entropyChanged();
}
else {
DOM.entropyContainer.addClass("hidden");
DOM.generateContainer.removeClass("hidden");
DOM.phrase.prop("readonly", false);
}
}
function delayedPhraseChanged() {
hideValidationError();
showPending();
@@ -116,6 +139,20 @@
hidePending();
}
function delayedEntropyChanged() {
hideValidationError();
showPending();
if (entropyChangeTimeoutEvent != null) {
clearTimeout(entropyChangeTimeoutEvent);
}
entropyChangeTimeoutEvent = setTimeout(entropyChanged, 400);
}
function entropyChanged() {
setMnemonicFromEntropy();
phraseChanged();
}
function delayedRootKeyChanged() {
// Warn if there is an existing mnemonic or passphrase.
if (DOM.phrase.val().length > 0 || DOM.passphrase.val().length > 0) {
@@ -168,6 +205,9 @@
}
function generateClicked() {
if (isUsingOwnEntropy()) {
return;
}
clearDisplay();
showPending();
setTimeout(function() {
@@ -599,7 +639,12 @@
}
function getLanguageFromUrl() {
return window.location.hash.substring(1);
for (var language in WORDLISTS) {
if (window.location.hash.indexOf(language) > -1) {
return language;
}
}
return "";
}
function setMnemonicLanguage() {
@@ -650,6 +695,65 @@
return phrase;
}
function isUsingOwnEntropy() {
return DOM.useEntropy.prop("checked");
}
function setMnemonicFromEntropy() {
hideEntropyError();
// Work out minimum base for entropy
var entropyStr = DOM.entropy.val();
var entropy = Entropy.fromString(entropyStr);
if (entropy.hexStr.length == 0) {
return;
}
// Show entropy details
var extraBits = 32 - (entropy.binaryStr.length % 32);
var extraChars = Math.ceil(extraBits * Math.log(2) / Math.log(entropy.base.asInt));
var strength = "an extremely weak";
if (entropy.hexStr.length >= 8) {
strength = "a very weak";
}
if (entropy.hexStr.length >= 12) {
strength = "a weak";
}
if (entropy.hexStr.length >= 24) {
strength = "a strong";
}
if (entropy.hexStr.length >= 32) {
strength = "a very strong";
}
if (entropy.hexStr.length >= 40) {
strength = "an extremely strong";
}
if (entropy.hexStr.length >=48) {
strength = "an even stronger"
}
var msg = "Have " + entropy.binaryStr.length + " bits of entropy, " + extraChars + " more " + entropy.base.str + " chars required to generate " + strength + " mnemonic: " + entropy.cleanStr;
showEntropyError(msg);
// Discard trailing entropy
var hexStr = entropy.hexStr.substring(0, Math.floor(entropy.hexStr.length / 8) * 8);
// Convert entropy string to numeric array
var entropyArr = [];
for (var i=0; i<hexStr.length / 2; i++) {
var entropyByte = parseInt(hexStr[i*2].concat(hexStr[i*2+1]), 16);
entropyArr.push(entropyByte)
}
// Convert entropy array to mnemonic
var phrase = mnemonic.toMnemonic(entropyArr);
// Set the mnemonic in the UI
DOM.phrase.val(phrase);
}
function hideEntropyError() {
DOM.entropyError.addClass("hidden");
}
function showEntropyError(msg) {
DOM.entropyError.text(msg);
DOM.entropyError.removeClass("hidden");
}
var networks = [
{
name: "Bitcoin",