From cc61ec30c5647b08cf11d918a6656cfc922e4586 Mon Sep 17 00:00:00 2001 From: Ian Coleman Date: Tue, 6 Feb 2018 09:43:13 +1100 Subject: [PATCH] Encrypt private keys with BIP38 with fakes for missing UI elements --- src/js/index.js | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/js/index.js b/src/js/index.js index 5a1037b..6aee5dc 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -766,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(); @@ -780,6 +782,7 @@ if (!self.shouldGenerate) { return; } + // derive HDkey for this row of the table var key = "NA"; if (useHardenedAddresses) { key = bip32ExtendedKey.deriveHardened(index); @@ -787,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(32); + var privKeyBuffer = keyPair.d.toBuffer(32); privkey = privKeyBuffer.toString('hex'); var addressBuffer = ethUtil.privateToAddress(privKeyBuffer); var hexAddress = addressBuffer.toString('hex'); -- 2.41.0