Compare commits

...

14 Commits
0.3.2 ... 0.3.3

Author SHA1 Message Date
Ian Coleman
fcc7d12109 Release v0.3.3 2018-02-06 10:36:38 +11:00
Ian Coleman
5dfe77e4a3 Fix tests which generate more rows 2018-02-06 10:33:21 +11:00
Ian Coleman
e21e32da31 Add BIP38 test 2018-02-06 10:14:22 +11:00
Ian Coleman
ba678b1147 Allow initial number of rows to be set by user 2018-02-06 09:57:28 +11:00
Ian Coleman
0b39e9dca7 Add BIP38 interface elements 2018-02-06 09:57:23 +11:00
Ian Coleman
cc61ec30c5 Encrypt private keys with BIP38
with fakes for missing UI elements
2018-02-06 09:43:13 +11:00
Ian Coleman
0f0a888e13 Add bitcoinjs-bip38-2.0.2 library
Created using browserify:
git clone https://github.com/bitcoinjs/bip38.git
git checkout v2.0.2
npm install
npm run unit
browserify index.js --standalone bitcoinjs-bip38 > bitcoinjs-bip38-2.0.2.js
2018-02-06 09:42:10 +11:00
Ian Coleman
2ef27fb80b Remove commented-out lines of code from test 2018-01-16 10:37:37 +11:00
Ian Coleman
423fb969c6 Test AXE network 2018-01-16 10:34:42 +11:00
Ian Coleman
9fae1ffbcc Increase allowed rendering time tests
Firefox was only generating 15 of 20 rows in the address table
2018-01-16 10:33:08 +11:00
Ian Coleman
78db37f663 LeftPad ethereum private keys with zeros if needed 2018-01-16 10:33:08 +11:00
iancoleman
28e1cd455c Merge pull request #154 from AXErunners/master
Add AXE
2018-01-16 09:05:18 +11:00
-k
47debf07ed AXE support
prefix fixed
2018-01-07 00:55:48 -05:00
-k
cfc0c4d743 AXE support 2018-01-06 23:57:11 -05:00
7 changed files with 56033 additions and 25 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,10 @@
# 0.3.3
* Add AXE network
* Ethereum private key generation bugfix
* Add BIP38 support
* Allow initial number of rows to be set by the user
# 0.3.2
* Add Onixcoin

View File

@@ -15,7 +15,7 @@
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.3.2</p>
<p class="version">v0.3.3</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -603,6 +603,16 @@
</label>
</div>
</div>
<div class="col-md-12">
<div class="checkbox">
<label>
<input type="checkbox" class="use-bip38">
<span>Encrypt private keys using BIP38 and this password:</span>
</label>
<input class="bip38-password">
<span>Enabling BIP38 means each key will take take several minutes to generate.</span>
</div>
</div>
<ul class="addresses-type nav nav-tabs" role="tablist">
<li id="table-tab" class="active">
<a href="#table" role="tab" data-toggle="tab">Table</a>
@@ -873,6 +883,7 @@
<script src="js/kjua-0.1.1.min.js"></script>
<script src="js/bitcoinjs-3.3.0.js"></script>
<script src="js/bitcoinjs-extensions.js"></script>
<script src="js/bitcoinjs-bip38-2.0.2.js"></script>
<script src="js/segwit-parameters.js"></script>
<script src="js/ethereumjs-util.js"></script>
<script src="js/ripple-util.js"></script>

File diff suppressed because it is too large Load Diff

View File

@@ -108,6 +108,17 @@ bitcoinjs.bitcoin.networks.peercoin = {
wif: 0xb7
};
bitcoinjs.bitcoin.networks.axe = {
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x4B,
scriptHash: 0xCB, // TODO set this correctly
wif: 0xCB
};
bitcoinjs.bitcoin.networks.slimcoin = {
messagePrefix: 'unused',
bip32: {

View File

@@ -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();
var privkey = "NA";
if (!key.isNeutered()) {
privkey = key.keyPair.toWIF(network);
// 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 });
}
var pubkey = key.getPublicKeyBuffer().toString('hex');
// get address
var address = keyPair.getAddress().toString();
// get privkey
var hasPrivkey = !key.isNeutered();
var privkey = "NA";
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);
});
}
}
// 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');
@@ -1452,6 +1477,14 @@
}
var networks = [
{
name: "AXE - Axe",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.axe;
setHdCoin(0);
},
},
{
name: "BCH - Bitcoin Cash",
segwitAvailable: false,

View File

@@ -30,9 +30,10 @@ var until = webdriver.until;
var newDriver = null;
var driver = null;
// Delays in ms
var generateDelay = 1000;
var generateDelay = 1500;
var feedbackDelay = 500;
var entropyFeedbackDelay = 500;
var bip38delay = 15000;
// url uses file:// scheme
var path = require('path')
@@ -605,6 +606,13 @@ it('Allows selection of monacoin', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of AXE', function(done) {
var params = {
selectText: "AXE - Axe",
firstAddress: "XQ4HLxUVS3egk5ff1o9e2vJFJKSSsUH3B7",
};
testNetwork(done, params);
});
// BIP39 seed is set from phrase
it('Sets the bip39 seed from the prhase', function(done) {
@@ -933,13 +941,13 @@ it('Can generate more rows in the table', function(done) {
// A custom number of additional addresses can be generated
it('Can generate more rows in the table', function(done) {
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('1');
driver.findElement(By.css('.more'))
.click();
driver.sleep(generateDelay).then(function() {
@@ -2159,10 +2167,11 @@ it('Can change details while old addresses are still being generated', function(
driver.findElement(By.css('.phrase'))
.sendKeys("abandon abandon ability");
driver.sleep(generateDelay).then(function() {
// generate more addresses
driver.findElement(By.css('.more'))
.click();
// change tabs which should cancel the previous generating
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('20');
driver.findElement(By.css('#bip32-tab a'))
.click()
driver.sleep(generateDelay).then(function() {
@@ -2175,7 +2184,7 @@ it('Can change details while old addresses are still being generated', function(
});
});
});
});
}, generateDelay + 5000);
// Github issue 49
// padding for binary should give length with multiple of 256
@@ -2850,4 +2859,53 @@ it('Can display the table as csv', function(done) {
});
});
it('LeftPads ethereum keys that are less than 32 bytes', function(done) {
// see https://github.com/iancoleman/bip39/issues/155
selectNetwork("ETH - Ethereum");
driver.findElement(By.css('#bip32-tab a'))
.click()
driver.findElement(By.css('#bip32-path'))
.clear();
driver.findElement(By.css('#bip32-path'))
.sendKeys("m/44'/60'/0'");
driver.findElement(By.css('.phrase'))
.sendKeys('scout sort custom elite radar rare vivid thing trophy gesture cover snake change narrow kite list nation sustain buffalo erode open balance system young');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118");
done();
});
});
});
it('Can encrypt private keys using BIP38', function(done) {
// see https://github.com/iancoleman/bip39/issues/140
driver.executeScript(function() {
$(".use-bip38").prop("checked", true);
});
driver.findElement(By.css('.bip38-password'))
.sendKeys('bip38password');
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(bip38delay).then(function() {
// address
getFirstRowValue(function(address) {
expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB");
// pubkey
getFirstRowValue(function(pubkey) {
expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1");
// privkey
getFirstRowValue(function(privkey) {
expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM");
done();
}, ".privkey");
}, ".pubkey");
}, ".address");
});
}, bip38delay + 5000);
});