X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=b36e9926cdd96baa71c77f9c076c1d0f281e2e33;hp=01543f9545dbcd64222755c859f2be902d8102d7;hb=d6cade868f67c10da6fcf20e51643439e9d3be77;hpb=a78f4e280cb62edf892ad32b3797c657fe527bbc diff --git a/src/js/index.js b/src/js/index.js index 01543f9..b36e992 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -90,6 +90,8 @@ DOM.hardenedAddresses = $(".hardened-addresses"); DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container"); DOM.useBitpayAddresses = $(".use-bitpay-addresses"); + DOM.useBip38 = $(".use-bip38"); + DOM.bip38Password = $(".bip38-password"); DOM.addresses = $(".addresses"); DOM.csvTab = $("#csv-tab a"); DOM.csv = $(".csv"); @@ -133,6 +135,8 @@ DOM.bip141semantics.on("change", tabChanged); DOM.tab.on("shown.bs.tab", tabChanged); DOM.hardenedAddresses.on("change", calcForDerivationPath); + DOM.useBip38.on("change", calcForDerivationPath); + DOM.bip38Password.on("change", calcForDerivationPath); DOM.indexToggle.on("click", toggleIndexes); DOM.addressToggle.on("click", toggleAddresses); DOM.publicKeyToggle.on("click", togglePublicKeys); @@ -723,7 +727,8 @@ DOM.extendedPubKey.val(extendedPubKey); // Display the addresses and privkeys clearAddressesList(); - displayAddresses(0, 20); + var initialAddressCount = parseInt(DOM.rowsToAdd.val()); + displayAddresses(0, initialAddressCount); } function displayAddresses(start, total) { @@ -766,6 +771,8 @@ var self = this; this.shouldGenerate = true; var useHardenedAddresses = DOM.hardenedAddresses.prop("checked"); + var useBip38 = DOM.useBip38.prop("checked"); + var bip38password = DOM.bip38Password.val(); var isSegwit = segwitSelected(); var segwitAvailable = networkHasSegwit(); var isP2wpkh = p2wpkhSelected(); @@ -780,6 +787,7 @@ if (!self.shouldGenerate) { return; } + // derive HDkey for this row of the table var key = "NA"; if (useHardenedAddresses) { key = bip32ExtendedKey.deriveHardened(index); @@ -787,19 +795,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'); @@ -1200,13 +1225,14 @@ var entropyTypeStr = getEntropyTypeStr(entropy); var wordCount = Math.floor(numberOfBits / 32) * 3; var bitsPerEvent = entropy.bitsPerEvent.toFixed(2); + var spacedBinaryStr = entropy.binaryStr.match(/.{1,11}/g).join(" " ); DOM.entropyFiltered.html(entropy.cleanHtml); DOM.entropyType.text(entropyTypeStr); DOM.entropyCrackTime.text(timeToCrack); DOM.entropyEventCount.text(entropy.base.ints.length); DOM.entropyBits.text(numberOfBits); DOM.entropyWordCount.text(wordCount); - DOM.entropyBinary.text(entropy.binaryStr); + DOM.entropyBinary.text(spacedBinaryStr); DOM.entropyBitsPerEvent.text(bitsPerEvent); // detect and warn of filtering var rawNoSpaces = DOM.entropy.val().replace(/\s/g, ""); @@ -1452,6 +1478,14 @@ } var networks = [ + { + name: "AXE - Axe", + segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.axe; + setHdCoin(0); + }, + }, { name: "BCH - Bitcoin Cash", segwitAvailable: false, @@ -1461,6 +1495,14 @@ setHdCoin(145); }, }, + { + name: "BLK - BlackCoin", + segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.blackcoin; + setHdCoin(10); + }, + }, { name: "BTC - Bitcoin", segwitAvailable: true, @@ -1517,6 +1559,14 @@ setHdCoin(1); }, }, + { + name: "DNR - Denarius", + segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.denarius; + setHdCoin(0); + }, + }, { name: "DOGE - Dogecoin", segwitAvailable: false, @@ -1701,7 +1751,7 @@ network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(144); }, - } + }, ] var clients = [