X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=6aee5dc8852d9c5d58c7fb33281cd1b57d1c1fa9;hp=f13063cdc5b0ee6cec1190776194b2a03e4d5e6e;hb=cc61ec30c5647b08cf11d918a6656cfc922e4586;hpb=d00c719932123feb4135b4ef537b28e8eb735cd5 diff --git a/src/js/index.js b/src/js/index.js index f13063c..6aee5dc 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -53,6 +53,7 @@ DOM.bip32tab = $("#bip32-tab"); DOM.bip44tab = $("#bip44-tab"); DOM.bip49tab = $("#bip49-tab"); + DOM.bip84tab = $("#bip84-tab"); DOM.bip141tab = $("#bip141-tab"); DOM.bip32panel = $("#bip32"); DOM.bip44panel = $("#bip44"); @@ -74,6 +75,13 @@ DOM.bip49accountXprv = $("#bip49 .account-xprv"); DOM.bip49accountXpub = $("#bip49 .account-xpub"); DOM.bip49change = $("#bip49 .change"); + DOM.bip84path = $("#bip84-path"); + DOM.bip84purpose = $("#bip84 .purpose"); + DOM.bip84coin = $("#bip84 .coin"); + DOM.bip84account = $("#bip84 .account"); + DOM.bip84accountXprv = $("#bip84 .account-xprv"); + DOM.bip84accountXpub = $("#bip84 .account-xpub"); + DOM.bip84change = $("#bip84 .change"); DOM.bip141unavailable = $("#bip141 .unavailable"); DOM.bip141available = $("#bip141 .available"); DOM.bip141path = $("#bip141-path"); @@ -83,6 +91,8 @@ DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container"); DOM.useBitpayAddresses = $(".use-bitpay-addresses"); DOM.addresses = $(".addresses"); + DOM.csvTab = $("#csv-tab a"); + DOM.csv = $(".csv"); DOM.rowsToAdd = $(".rows-to-add"); DOM.more = $(".more"); DOM.moreRowsStartIndex = $(".more-rows-start-index"); @@ -117,6 +127,8 @@ DOM.bip44change.on("input", calcForDerivationPath); DOM.bip49account.on("input", calcForDerivationPath); DOM.bip49change.on("input", calcForDerivationPath); + DOM.bip84account.on("input", calcForDerivationPath); + DOM.bip84change.on("input", calcForDerivationPath); DOM.bip141path.on("input", calcForDerivationPath); DOM.bip141semantics.on("change", tabChanged); DOM.tab.on("shown.bs.tab", tabChanged); @@ -125,6 +137,7 @@ DOM.addressToggle.on("click", toggleAddresses); DOM.publicKeyToggle.on("click", togglePublicKeys); DOM.privateKeyToggle.on("click", togglePrivateKeys); + DOM.csvTab.on("click", updateCsv); DOM.languages.on("click", languageChanged); DOM.useBitpayAddresses.on("change", useBitpayAddressesChange); setQrEvents(DOM.showQrEls); @@ -357,6 +370,9 @@ else if (bip49TabSelected()) { displayBip49Info(); } + else if (bip84TabSelected()) { + displayBip84Info(); + } displayBip32Info(); } @@ -559,6 +575,21 @@ console.log("Using derivation path from BIP49 tab: " + derivationPath); return derivationPath; } + else if (bip84TabSelected()) { + var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84); + var coin = parseIntNoNaN(DOM.bip84coin.val(), 0); + var account = parseIntNoNaN(DOM.bip84account.val(), 0); + var change = parseIntNoNaN(DOM.bip84change.val(), 0); + var path = "m/"; + path += purpose + "'/"; + path += coin + "'/"; + path += account + "'/"; + path += change; + DOM.bip84path.val(path); + var derivationPath = DOM.bip84path.val(); + console.log("Using derivation path from BIP84 tab: " + derivationPath); + return derivationPath; + } else if (bip32TabSelected()) { var derivationPath = DOM.bip32path.val(); console.log("Using derivation path from BIP32 tab: " + derivationPath); @@ -659,6 +690,24 @@ DOM.bip49accountXpub.val(accountXpub); } + function displayBip84Info() { + // Get the derivation path for the account + var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84); + var coin = parseIntNoNaN(DOM.bip84coin.val(), 0); + var account = parseIntNoNaN(DOM.bip84account.val(), 0); + var path = "m/"; + path += purpose + "'/"; + path += coin + "'/"; + path += account + "'/"; + // Calculate the account extended keys + var accountExtendedKey = calcBip32ExtendedKey(path); + var accountXprv = accountExtendedKey.toBase58(); + var accountXpub = accountExtendedKey.neutered().toBase58(); + // Display the extended keys + DOM.bip84accountXprv.val(accountXprv); + DOM.bip84accountXpub.val(accountXpub); + } + function displayBip32Info() { // Display the key DOM.seed.val(seed); @@ -699,11 +748,12 @@ } function segwitSelected() { - return bip49TabSelected() || bip141TabSelected(); + return bip49TabSelected() || bip84TabSelected() || bip141TabSelected(); } function p2wpkhSelected() { - return bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh"; + return bip84TabSelected() || + bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh"; } function p2wpkhInP2shSelected() { @@ -716,6 +766,8 @@ var self = this; this.shouldGenerate = true; var useHardenedAddresses = DOM.hardenedAddresses.prop("checked"); + var useBip38 = false; // TODO get from DOM + var bip38password = "bip38password"; // TODO get from DOM var isSegwit = segwitSelected(); var segwitAvailable = networkHasSegwit(); var isP2wpkh = p2wpkhSelected(); @@ -730,6 +782,7 @@ if (!self.shouldGenerate) { return; } + // derive HDkey for this row of the table var key = "NA"; if (useHardenedAddresses) { key = bip32ExtendedKey.deriveHardened(index); @@ -737,19 +790,36 @@ else { key = bip32ExtendedKey.derive(index); } - var address = key.getAddress().toString(); + // bip38 requires uncompressed keys + // see https://github.com/iancoleman/bip39/issues/140#issuecomment-352164035 + var keyPair = key.keyPair; + var useUncompressed = useBip38; + if (useUncompressed) { + keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { compressed: false }); + } + // get address + var address = keyPair.getAddress().toString(); + // get privkey + var hasPrivkey = !key.isNeutered(); var privkey = "NA"; - if (!key.isNeutered()) { - privkey = key.keyPair.toWIF(network); + if (hasPrivkey) { + privkey = keyPair.toWIF(network); + // BIP38 encode private key if required + if (useBip38) { + privkey = bitcoinjsBip38.encrypt(keyPair.d.toBuffer(), false, bip38password, function(p) { + console.log("Progressed " + p.percent.toFixed(1) + "% for index " + index); + }); + } } - var pubkey = key.getPublicKeyBuffer().toString('hex'); + // get pubkey + var pubkey = keyPair.getPublicKeyBuffer().toString('hex'); var indexText = getDerivationPath() + "/" + index; if (useHardenedAddresses) { indexText = indexText + "'"; } // Ethereum values are different if (networks[DOM.network.val()].name == "ETH - Ethereum") { - var privKeyBuffer = key.keyPair.d.toBuffer(); + var privKeyBuffer = keyPair.d.toBuffer(32); privkey = privKeyBuffer.toString('hex'); var addressBuffer = ethUtil.privateToAddress(privKeyBuffer); var hexAddress = addressBuffer.toString('hex'); @@ -781,10 +851,10 @@ address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network) } } - console.log(address); addAddressToList(indexText, address, pubkey, privkey); if (isLast) { hidePending(); + updateCsv(); } }, 50) } @@ -825,6 +895,7 @@ function clearAddressesList() { DOM.addresses.empty(); + DOM.csv.val(""); stopGenerating(); } @@ -1285,6 +1356,10 @@ return DOM.bip49tab.hasClass("active"); } + function bip84TabSelected() { + return DOM.bip84tab.hasClass("active"); + } + function bip141TabSelected() { return DOM.bip141tab.hasClass("active"); } @@ -1292,6 +1367,7 @@ function setHdCoin(coinValue) { DOM.bip44coin.val(coinValue); DOM.bip49coin.val(coinValue); + DOM.bip84coin.val(coinValue); } function showSegwitAvailable() { @@ -1375,7 +1451,35 @@ DOM.entropyWordIndexes.text(wordIndexesStr); } + function updateCsv() { + var tableCsv = "path,address,public key,private key\n"; + var rows = DOM.addresses.find("tr"); + for (var i=0; i