X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=41f826053cd76e3f9cd94023edc61803e1f533a5;hb=0edac945e597099d1cabfa684e3c172b3d70cf6c;hp=cac420ecc398b7d97359ab1abd62e416883051c3;hpb=8a93952c1ed5d7f6f9e496a2f81f684fa6ef9c79;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git diff --git a/src/js/index.js b/src/js/index.js index cac420e..41f8260 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -3,7 +3,7 @@ // mnemonics is populated as required by getLanguage var mnemonics = { "english": new Mnemonic("english") }; var mnemonic = mnemonics["english"]; - var seed = null + var seed = null; var bip32RootKey = null; var bip32ExtendedKey = null; var network = bitcoin.networks.bitcoin; @@ -19,6 +19,8 @@ var phraseChangeTimeoutEvent = null; var rootKeyChangedTimeoutEvent = null; + var generationProcesses = []; + var DOM = {}; DOM.network = $(".network"); DOM.phraseNetwork = $("#network-phrase"); @@ -228,11 +230,11 @@ // Calculate and display calcBip32RootKeyFromBase58(rootKeyBase58); calcForDerivationPath(); - hidePending(); } function calcForDerivationPath() { showPending(); + clearAddressesList(); hideValidationError(); // Get the derivation path var derivationPath = getDerivationPath(); @@ -324,6 +326,10 @@ } function calcBip32ExtendedKey(path) { + // Check there's a root key to derive from + if (!bip32RootKey) { + return bip32RootKey; + } var extendedKey = bip32RootKey; // Derive the key from the path var pathBits = path.split("/"); @@ -334,7 +340,12 @@ continue; } var hardened = bit[bit.length-1] == "'"; - if (hardened) { + var isPriv = "privKey" in extendedKey; + var invalidDerivationPath = hardened && !isPriv; + if (invalidDerivationPath) { + extendedKey = null; + } + else if (hardened) { extendedKey = extendedKey.deriveHardened(index); } else { @@ -453,6 +464,16 @@ } } } + // Check root key exists or else derivation path is useless! + if (!bip32RootKey) { + return "No root key"; + } + // Check no hardened derivation path when using xpub keys + var hardened = path.indexOf("'") > -1; + var isXpubkey = !("privKey" in bip32RootKey); + if (hardened && isXpubkey) { + return "Hardened derivation path is invalid with xpub key"; + } return false; } @@ -479,7 +500,11 @@ DOM.seed.val(seed); var rootKey = bip32RootKey.toBase58(); DOM.rootKey.val(rootKey); - var extendedPrivKey = bip32ExtendedKey.toBase58(); + var xprvkeyB58 = "NA"; + if (bip32ExtendedKey.privKey) { + xprvkeyB58 = bip32ExtendedKey.toBase58(); + } + var extendedPrivKey = xprvkeyB58; DOM.extendedPrivKey.val(extendedPrivKey); var extendedPubKey = bip32ExtendedKey.toBase58(false); DOM.extendedPubKey.val(extendedPubKey); @@ -489,14 +514,28 @@ } function displayAddresses(start, total) { - for (var i=0; i 0) { + var generation = generationProcesses.shift(); + generation.stop(); + } } function clearKey() { @@ -621,6 +681,9 @@ var closestWord = words[0]; for (var i=0; i