mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-25 05:06:45 +00:00
electrum seed version system support
This commit is contained in:
parent
d0e5da0ec8
commit
1bf8c85a65
8 changed files with 104 additions and 23 deletions
2
drongo
2
drongo
|
@ -1 +1 @@
|
||||||
Subproject commit f6414a447550eb87a871c54c7e376713cae8eb9c
|
Subproject commit 9e5a7d0e8d31eb4e21d543081c23f7f0aaef9795
|
|
@ -58,11 +58,11 @@ public class FileWalletExportPane extends TitledDescriptionPane {
|
||||||
copy.decrypt(password.get(), "");
|
copy.decrypt(password.get(), "");
|
||||||
|
|
||||||
for(Keystore keystore : copy.getKeystores()) {
|
for(Keystore keystore : copy.getKeystores()) {
|
||||||
if(keystore.hasSeed() && keystore.getSeed().needPassphrase()) {
|
if(keystore.hasSeed() && keystore.getSeed().usesPassphrase()) {
|
||||||
KeystorePassphraseDialog passphraseDialog = new KeystorePassphraseDialog(keystore);
|
KeystorePassphraseDialog passphraseDialog = new KeystorePassphraseDialog(keystore);
|
||||||
Optional<String> passphrase = passphraseDialog.showAndWait();
|
Optional<String> passphrase = passphraseDialog.showAndWait();
|
||||||
if(passphrase.isPresent()) {
|
if(passphrase.isPresent()) {
|
||||||
keystore.setPassphrase(passphrase.get());
|
keystore.getSeed().setPassphrase(passphrase.get());
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ public class Bip39 implements KeystoreMnemonicImport {
|
||||||
public Keystore getKeystore(List<ChildNumber> derivation, List<String> mnemonicWords, String passphrase) throws ImportException {
|
public Keystore getKeystore(List<ChildNumber> derivation, List<String> mnemonicWords, String passphrase) throws ImportException {
|
||||||
try {
|
try {
|
||||||
Bip39MnemonicCode.INSTANCE.check(mnemonicWords);
|
Bip39MnemonicCode.INSTANCE.check(mnemonicWords);
|
||||||
DeterministicSeed seed = new DeterministicSeed(mnemonicWords, null, passphrase, System.currentTimeMillis());
|
DeterministicSeed seed = new DeterministicSeed(mnemonicWords, null, passphrase, System.currentTimeMillis(), DeterministicSeed.Type.BIP39);
|
||||||
return Keystore.fromSeed(seed, derivation);
|
return Keystore.fromSeed(seed, derivation);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ImportException(e);
|
throw new ImportException(e);
|
||||||
|
|
|
@ -5,19 +5,17 @@ import com.google.gson.reflect.TypeToken;
|
||||||
import com.sparrowwallet.drongo.ExtendedKey;
|
import com.sparrowwallet.drongo.ExtendedKey;
|
||||||
import com.sparrowwallet.drongo.KeyDerivation;
|
import com.sparrowwallet.drongo.KeyDerivation;
|
||||||
import com.sparrowwallet.drongo.Utils;
|
import com.sparrowwallet.drongo.Utils;
|
||||||
import com.sparrowwallet.drongo.crypto.ECIESKeyCrypter;
|
import com.sparrowwallet.drongo.crypto.*;
|
||||||
import com.sparrowwallet.drongo.crypto.ECKey;
|
|
||||||
import com.sparrowwallet.drongo.policy.Policy;
|
import com.sparrowwallet.drongo.policy.Policy;
|
||||||
import com.sparrowwallet.drongo.policy.PolicyType;
|
import com.sparrowwallet.drongo.policy.PolicyType;
|
||||||
import com.sparrowwallet.drongo.protocol.ScriptType;
|
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||||
import com.sparrowwallet.drongo.wallet.Keystore;
|
import com.sparrowwallet.drongo.wallet.*;
|
||||||
import com.sparrowwallet.drongo.wallet.KeystoreSource;
|
|
||||||
import com.sparrowwallet.drongo.wallet.Wallet;
|
|
||||||
import com.sparrowwallet.drongo.wallet.WalletModel;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Base64;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.zip.InflaterInputStream;
|
import java.util.zip.InflaterInputStream;
|
||||||
|
@ -92,7 +90,17 @@ public class Electrum implements KeystoreFileImport, WalletImport, WalletExport
|
||||||
ScriptType scriptType = null;
|
ScriptType scriptType = null;
|
||||||
|
|
||||||
for(ElectrumKeystore ek : ew.keystores.values()) {
|
for(ElectrumKeystore ek : ew.keystores.values()) {
|
||||||
Keystore keystore = new Keystore(ek.label != null ? ek.label : "Electrum " + ek.root_fingerprint);
|
Keystore keystore = new Keystore();
|
||||||
|
ExtendedKey xPub = ExtendedKey.fromDescriptor(ek.xpub);
|
||||||
|
String derivationPath = ek.derivation;
|
||||||
|
if(derivationPath == null) {
|
||||||
|
derivationPath = "m/0";
|
||||||
|
}
|
||||||
|
String masterFingerprint = ek.root_fingerprint;
|
||||||
|
if(masterFingerprint == null) {
|
||||||
|
masterFingerprint = Utils.bytesToHex(xPub.getParentFingerprint());
|
||||||
|
}
|
||||||
|
|
||||||
if("hardware".equals(ek.type)) {
|
if("hardware".equals(ek.type)) {
|
||||||
keystore.setSource(KeystoreSource.HW_USB);
|
keystore.setSource(KeystoreSource.HW_USB);
|
||||||
keystore.setWalletModel(WalletModel.fromType(ek.hw_type));
|
keystore.setWalletModel(WalletModel.fromType(ek.hw_type));
|
||||||
|
@ -100,16 +108,32 @@ public class Electrum implements KeystoreFileImport, WalletImport, WalletExport
|
||||||
throw new ImportException("Wallet has keystore of unknown hardware wallet type \"" + ek.hw_type + "\"");
|
throw new ImportException("Wallet has keystore of unknown hardware wallet type \"" + ek.hw_type + "\"");
|
||||||
}
|
}
|
||||||
} else if("bip32".equals(ek.type)) {
|
} else if("bip32".equals(ek.type)) {
|
||||||
if(ek.xprv != null) {
|
if(ek.xprv != null && ek.seed == null) {
|
||||||
|
throw new ImportException("Electrum does not support exporting BIP39 derived seeds.");
|
||||||
|
} else if(ek.seed != null) {
|
||||||
keystore.setSource(KeystoreSource.SW_SEED);
|
keystore.setSource(KeystoreSource.SW_SEED);
|
||||||
|
String seed = ek.seed;
|
||||||
|
String passphrase = ek.passphrase;
|
||||||
|
if(password != null) {
|
||||||
|
seed = decrypt(seed, password);
|
||||||
|
passphrase = decrypt(passphrase, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
keystore.setSeed(new DeterministicSeed(seed, null, passphrase, 0, DeterministicSeed.Type.ELECTRUM));
|
||||||
|
keystore.getSeed().setPassphrase(passphrase);
|
||||||
|
|
||||||
|
if(derivationPath == "m/0") {
|
||||||
|
derivationPath = "m/0'";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
keystore.setSource(KeystoreSource.SW_WATCH);
|
keystore.setSource(KeystoreSource.SW_WATCH);
|
||||||
}
|
}
|
||||||
keystore.setWalletModel(WalletModel.ELECTRUM);
|
keystore.setWalletModel(WalletModel.ELECTRUM);
|
||||||
}
|
}
|
||||||
ExtendedKey xPub = ExtendedKey.fromDescriptor(ek.xpub);
|
|
||||||
keystore.setKeyDerivation(new KeyDerivation(ek.root_fingerprint, ek.derivation));
|
keystore.setKeyDerivation(new KeyDerivation(masterFingerprint, derivationPath));
|
||||||
keystore.setExtendedPublicKey(xPub);
|
keystore.setExtendedPublicKey(xPub);
|
||||||
|
keystore.setLabel(ek.label != null ? ek.label : "Electrum " + masterFingerprint);
|
||||||
wallet.getKeystores().add(keystore);
|
wallet.getKeystores().add(keystore);
|
||||||
|
|
||||||
ExtendedKey.Header xpubHeader = ExtendedKey.Header.fromExtendedKey(ek.xpub);
|
ExtendedKey.Header xpubHeader = ExtendedKey.Header.fromExtendedKey(ek.xpub);
|
||||||
|
@ -140,6 +164,13 @@ public class Electrum implements KeystoreFileImport, WalletImport, WalletExport
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String decrypt(String encrypted, String password) {
|
||||||
|
byte[] passwordHash = Utils.sha256sha256(password.getBytes(StandardCharsets.UTF_8));
|
||||||
|
byte[] encryptedBytes = Base64.getDecoder().decode(encrypted);
|
||||||
|
byte[] decrypted = Utils.decryptAesCbcPkcs7(Arrays.copyOfRange(encryptedBytes, 0, 16), Arrays.copyOfRange(encryptedBytes, 16, encryptedBytes.length), passwordHash);
|
||||||
|
return new String(decrypted, StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getWalletImportDescription() {
|
public String getWalletImportDescription() {
|
||||||
return "Import an Electrum wallet";
|
return "Import an Electrum wallet";
|
||||||
|
@ -177,7 +208,12 @@ public class Electrum implements KeystoreFileImport, WalletImport, WalletExport
|
||||||
ek.xpub = keystore.getExtendedPublicKey().toString(xpubHeader);
|
ek.xpub = keystore.getExtendedPublicKey().toString(xpubHeader);
|
||||||
ek.xprv = keystore.getExtendedPrivateKey().toString(xprvHeader);
|
ek.xprv = keystore.getExtendedPrivateKey().toString(xprvHeader);
|
||||||
ek.pw_hash_version = 1;
|
ek.pw_hash_version = 1;
|
||||||
|
if(keystore.getSeed().getType() == DeterministicSeed.Type.ELECTRUM) {
|
||||||
|
ek.seed = keystore.getSeed().getMnemonicString();
|
||||||
|
ek.passphrase = keystore.getSeed().getPassphrase();
|
||||||
|
} else if(keystore.getSeed().getType() == DeterministicSeed.Type.BIP39) {
|
||||||
ew.seed_type = "bip39";
|
ew.seed_type = "bip39";
|
||||||
|
}
|
||||||
ew.use_encryption = false;
|
ew.use_encryption = false;
|
||||||
} else if(keystore.getSource() == KeystoreSource.SW_WATCH) {
|
} else if(keystore.getSource() == KeystoreSource.SW_WATCH) {
|
||||||
ek.type = "bip32";
|
ek.type = "bip32";
|
||||||
|
@ -245,6 +281,7 @@ public class Electrum implements KeystoreFileImport, WalletImport, WalletExport
|
||||||
public String type;
|
public String type;
|
||||||
public String derivation;
|
public String derivation;
|
||||||
public String seed;
|
public String seed;
|
||||||
|
public String passphrase;
|
||||||
public Integer pw_hash_version;
|
public Integer pw_hash_version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.sparrowwallet.sparrow.io;
|
package com.sparrowwallet.sparrow.io;
|
||||||
|
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
|
import com.sparrowwallet.drongo.Utils;
|
||||||
import com.sparrowwallet.drongo.policy.PolicyType;
|
import com.sparrowwallet.drongo.policy.PolicyType;
|
||||||
import com.sparrowwallet.drongo.protocol.ScriptType;
|
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||||
import com.sparrowwallet.drongo.wallet.Wallet;
|
import com.sparrowwallet.drongo.wallet.Wallet;
|
||||||
|
@ -22,7 +23,7 @@ public class ElectrumTest extends IoTest {
|
||||||
Assert.assertEquals(1, wallet.getDefaultPolicy().getNumSignaturesRequired());
|
Assert.assertEquals(1, wallet.getDefaultPolicy().getNumSignaturesRequired());
|
||||||
Assert.assertEquals("pkh(trezortest)", wallet.getDefaultPolicy().getMiniscript().getScript());
|
Assert.assertEquals("pkh(trezortest)", wallet.getDefaultPolicy().getMiniscript().getScript());
|
||||||
Assert.assertEquals("ab543c67", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
Assert.assertEquals("ab543c67", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
||||||
Assert.assertEquals("m/84'/0'/0'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
Assert.assertEquals("m/49'/0'/0'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
||||||
Assert.assertEquals("xpub6FFEQVG6QR28chQzgSJ7Gjx5j5BGLkCMgZ9bc41YJCXfwYiCKUQdcwm4Fe1stvzRjosz5udMedYZFRL56AeZXCsiVmnVUysio4jkAKTukmN", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
Assert.assertEquals("xpub6FFEQVG6QR28chQzgSJ7Gjx5j5BGLkCMgZ9bc41YJCXfwYiCKUQdcwm4Fe1stvzRjosz5udMedYZFRL56AeZXCsiVmnVUysio4jkAKTukmN", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
||||||
Assert.assertTrue(wallet.isValid());
|
Assert.assertTrue(wallet.isValid());
|
||||||
}
|
}
|
||||||
|
@ -42,7 +43,7 @@ public class ElectrumTest extends IoTest {
|
||||||
Assert.assertEquals(1, wallet.getDefaultPolicy().getNumSignaturesRequired());
|
Assert.assertEquals(1, wallet.getDefaultPolicy().getNumSignaturesRequired());
|
||||||
Assert.assertEquals("pkh(trezortest)", wallet.getDefaultPolicy().getMiniscript().getScript());
|
Assert.assertEquals("pkh(trezortest)", wallet.getDefaultPolicy().getMiniscript().getScript());
|
||||||
Assert.assertEquals("ab543c67", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
Assert.assertEquals("ab543c67", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
||||||
Assert.assertEquals("m/84'/0'/0'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
Assert.assertEquals("m/49'/0'/0'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
||||||
Assert.assertEquals("xpub6FFEQVG6QR28chQzgSJ7Gjx5j5BGLkCMgZ9bc41YJCXfwYiCKUQdcwm4Fe1stvzRjosz5udMedYZFRL56AeZXCsiVmnVUysio4jkAKTukmN", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
Assert.assertEquals("xpub6FFEQVG6QR28chQzgSJ7Gjx5j5BGLkCMgZ9bc41YJCXfwYiCKUQdcwm4Fe1stvzRjosz5udMedYZFRL56AeZXCsiVmnVUysio4jkAKTukmN", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,9 +95,31 @@ public class ElectrumTest extends IoTest {
|
||||||
Assert.assertEquals(PolicyType.SINGLE, wallet.getPolicyType());
|
Assert.assertEquals(PolicyType.SINGLE, wallet.getPolicyType());
|
||||||
Assert.assertEquals(ScriptType.P2WPKH, wallet.getScriptType());
|
Assert.assertEquals(ScriptType.P2WPKH, wallet.getScriptType());
|
||||||
Assert.assertEquals(1, wallet.getDefaultPolicy().getNumSignaturesRequired());
|
Assert.assertEquals(1, wallet.getDefaultPolicy().getNumSignaturesRequired());
|
||||||
Assert.assertEquals("pkh(electrum05aba071)", wallet.getDefaultPolicy().getMiniscript().getScript());
|
Assert.assertEquals("pkh(electrumf881eac5)", wallet.getDefaultPolicy().getMiniscript().getScript());
|
||||||
Assert.assertEquals("05aba071", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
Assert.assertEquals("f881eac5", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
||||||
Assert.assertEquals("m/0'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
Assert.assertEquals("m/0'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
||||||
Assert.assertEquals("xpub67vv394epQsLhdjNGx7dfgURicP7XwBMuHPTVAMdXcXhDuC9VP8SqVvh2cYqKWm9xoUd6YynWK8JzRcXpmeuZFRH7i1kt8fR9GXoJSiHk1E", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
Assert.assertEquals("xpub69iSRreMB6fu24sU8Tdxv7yYGqzPkDwPkwqUfKJTxW3p8afW7XvTewVCapuX3dQjdD197iF65WcjYaNpFbwWT3RyuZ1KJ3ToJNVWKWyAJ6f", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSinglesigSeedExport() throws ImportException, ExportException, IOException {
|
||||||
|
Electrum electrum = new Electrum();
|
||||||
|
byte[] walletBytes = ByteStreams.toByteArray(getInputStream("electrum-singlesig-seed-wallet.json"));
|
||||||
|
Wallet wallet = electrum.importWallet(new ByteArrayInputStream(walletBytes), null);
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
electrum.exportWallet(wallet, baos);
|
||||||
|
Assert.assertEquals("e14c40c638e2c83d1f20e5ee9cd744bc2ba1ef64fa939926f3778fc8735e891f56852f687b32bbd044f272d2831137e3eeba61fd1f285fa73dcc97d9f2be3cd1", Utils.bytesToHex(wallet.getKeystores().get(0).getSeed().getSeedBytes()));
|
||||||
|
|
||||||
|
wallet = electrum.importWallet(new ByteArrayInputStream(baos.toByteArray()), null);
|
||||||
|
Assert.assertTrue(wallet.isValid());
|
||||||
|
Assert.assertEquals(PolicyType.SINGLE, wallet.getPolicyType());
|
||||||
|
Assert.assertEquals(ScriptType.P2WPKH, wallet.getScriptType());
|
||||||
|
Assert.assertEquals(1, wallet.getDefaultPolicy().getNumSignaturesRequired());
|
||||||
|
Assert.assertEquals("pkh(electrum59c5474f)", wallet.getDefaultPolicy().getMiniscript().getScript());
|
||||||
|
Assert.assertEquals("59c5474f", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
||||||
|
Assert.assertEquals("m/0'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
||||||
|
Assert.assertEquals("xpub68YmVxWbxqjpxbUqqaPrgkBQPBSJuq6gEaL22uuytSEojtS2x5eLPN2uspUuyigtnMkoHrFSF1KwoXPwjzuaUjErUwztxfHquAwuaQhSd9J", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
||||||
|
Assert.assertEquals(wallet.getKeystores().get(0).getSeed().getMnemonicString(), "coach fan denial rifle frost rival join install one wasp cool antique");
|
||||||
|
Assert.assertEquals("e14c40c638e2c83d1f20e5ee9cd744bc2ba1ef64fa939926f3778fc8735e891f56852f687b32bbd044f272d2831137e3eeba61fd1f285fa73dcc97d9f2be3cd1", Utils.bytesToHex(wallet.getKeystores().get(0).getSeed().getSeedBytes()));
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1 +1 @@
|
||||||
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
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"keystore": {
|
||||||
|
"passphrase": "thisisapassphrase",
|
||||||
|
"pw_hash_version": 1,
|
||||||
|
"seed": "coach fan denial rifle frost rival join install one wasp cool antique",
|
||||||
|
"type": "bip32",
|
||||||
|
"xprv": "zprvAZDwhnKYRqGVShncQGS6jnRgB5tiPcMphaSroKJ967TayHjLurfD5h2i4wkwDVBC4REYf1aDp8sXG7ShPXxgUHBPUWMi6aFNc6x8hXtJ5WF",
|
||||||
|
"xpub": "zpub6nDJ7HrSGCpnfBs5WHy76vNQj7jCo55g4oNTbhhkeSzZr64VTPyTdVMBvEQ5yXzjbdzQnoSZAL33a6d5BPjc5Cc4DdPk8UvpSd5CMXhCKEi"
|
||||||
|
},
|
||||||
|
"seed_type": "segwit",
|
||||||
|
"seed_version": 18,
|
||||||
|
"spent_outpoints": {},
|
||||||
|
"stored_height": 630454,
|
||||||
|
"transactions": {},
|
||||||
|
"tx_fees": {},
|
||||||
|
"txi": {},
|
||||||
|
"txo": {},
|
||||||
|
"use_encryption": false,
|
||||||
|
"verified_tx3": {},
|
||||||
|
"wallet_type": "standard"
|
||||||
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
"fiat_value": {},
|
"fiat_value": {},
|
||||||
"invoices": {},
|
"invoices": {},
|
||||||
"keystore": {
|
"keystore": {
|
||||||
"derivation": "m/84'/0'/0'",
|
"derivation": "m/49'/0'/0'",
|
||||||
"hw_type": "trezor",
|
"hw_type": "trezor",
|
||||||
"label": "trezortest",
|
"label": "trezortest",
|
||||||
"root_fingerprint": "ab543c67",
|
"root_fingerprint": "ab543c67",
|
||||||
|
|
Loading…
Reference in a new issue