mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-07 03:12:14 +00:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fcc7d12109 | ||
|
|
5dfe77e4a3 | ||
|
|
e21e32da31 | ||
|
|
ba678b1147 | ||
|
|
0b39e9dca7 | ||
|
|
cc61ec30c5 | ||
|
|
0f0a888e13 | ||
|
|
2ef27fb80b | ||
|
|
423fb969c6 | ||
|
|
9fae1ffbcc | ||
|
|
78db37f663 | ||
|
|
28e1cd455c | ||
|
|
47debf07ed | ||
|
|
cfc0c4d743 |
27987
bip39-standalone.html
27987
bip39-standalone.html
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
27917
src/js/bitcoinjs-bip38-2.0.2.js
Normal file
27917
src/js/bitcoinjs-bip38-2.0.2.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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: {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user