Now handles encrypted private key.

This commit is contained in:
Brendon Duncan 2018-08-29 09:11:14 +12:00
commit 6c85cffb20
2 changed files with 33 additions and 12 deletions

View file

@ -109,6 +109,7 @@
amount: '', amount: '',
coin: '', coin: '',
copayInvitation: '', copayInvitation: '',
encryptedPrivateKey: '',
isValid: false, isValid: false,
label: '', label: '',
legacyAddress: '', legacyAddress: '',
@ -250,13 +251,14 @@
var addressLowerCase = address.toLowerCase(); var addressLowerCase = address.toLowerCase();
// Just a rough validation to exclude half-pasted addresses, or things obviously not bitcoin addresses // Just a rough validation to exclude half-pasted addresses, or things obviously not bitcoin addresses
//var cashAddrRe = /^((?:q|p)[a-z0-9]{41})|((?:Q|P)[A-Z0-9]{41})$/; //var cashAddrRe = /^((?:q|p)[a-z0-9]{41})|((?:Q|P)[A-Z0-9]{41})$/;
var copayRe = /^[0-9A-HJ-NP-Za-km-z]{70,80}$/; var copayInvitationRe = /^[0-9A-HJ-NP-Za-km-z]{70,80}$/;
//var legacyRe = /^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/; //var legacyRe = /^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/;
//var legacyTestnetRe = /^[mn][a-km-zA-HJ-NP-Z1-9]{25,34}$/; //var legacyTestnetRe = /^[mn][a-km-zA-HJ-NP-Z1-9]{25,34}$/;
var privateKeyUncompressedRe = /^5[1-9A-HJ-NP-Za-km-z]{50}$/; var privateKeyEncryptedRe = /^6P[1-9A-HJ-NP-Za-km-z]{56}$/;
var privateKeyUncompressedTestnetRe = /^9[1-9A-HJ-NP-Za-km-z]{50}$/; var privateKeyForUncompressedPublicKeyRe = /^5[1-9A-HJ-NP-Za-km-z]{50}$/;
var privateKeyCompressedRe = /^[KL][1-9A-HJ-NP-Za-km-z]{51}$/; var privateKeyForUncompressedPublicKeyTestnetRe = /^9[1-9A-HJ-NP-Za-km-z]{50}$/;
var privateKeyCompressedTestnetRe = /^[c][1-9A-HJ-NP-Za-km-z]{51}$/; var privateKeyForCompressedPublicKeyRe = /^[KL][1-9A-HJ-NP-Za-km-z]{51}$/;
var privateKeyForCompressedPublicKeyTestnetRe = /^[c][1-9A-HJ-NP-Za-km-z]{51}$/;
var bitpayAddrMainnet = bitpayAddrOnMainnet(address); var bitpayAddrMainnet = bitpayAddrOnMainnet(address);
var cashAddrTestnet = cashAddrOnTestnet(addressLowerCase); var cashAddrTestnet = cashAddrOnTestnet(addressLowerCase);
@ -267,54 +269,65 @@
parsed.address = addressLowerCase; parsed.address = addressLowerCase;
parsed.coin = 'bch'; parsed.coin = 'bch';
parsed.legacyAddress = cashAddrTestnet.toString(); parsed.legacyAddress = cashAddrTestnet.toString();
parsed.isValid = true;
} else if (cashAddrMainnet) { } else if (cashAddrMainnet) {
parsed.address = addressLowerCase; parsed.address = addressLowerCase;
parsed.coin = 'bch'; parsed.coin = 'bch';
parsed.legacyAddress = cashAddrMainnet.toString(); parsed.legacyAddress = cashAddrMainnet.toString();
parsed.testnet = false; parsed.testnet = false;
parsed.isValid = true;
} else if (bitcore.Address.isValid(address, 'livenet')) { } else if (bitcore.Address.isValid(address, 'livenet')) {
parsed.address = address; parsed.address = address;
parsed.legacyAddress = address; parsed.legacyAddress = address;
parsed.testnet = false; parsed.testnet = false;
parsed.isValid = true;
} else if (bitcore.Address.isValid(address, 'testnet')) { } else if (bitcore.Address.isValid(address, 'testnet')) {
parsed.address = address; parsed.address = address;
parsed.legacyAddress = address; parsed.legacyAddress = address;
parsed.testnet = true; parsed.testnet = true;
parsed.isValid = true;
} else if (bitpayAddrMainnet) { } else if (bitpayAddrMainnet) {
parsed.address = address; parsed.address = address;
parsed.coin = 'bch'; parsed.coin = 'bch';
parsed.legacyAddress = bitpayAddrMainnet.toString(); parsed.legacyAddress = bitpayAddrMainnet.toString();
parsed.testnet = false; parsed.testnet = false;
parsed.isValid = true;
} else if (copayRe.test(address) ) { } else if (copayInvitationRe.test(address) ) {
parsed.copayInvitation = address; parsed.copayInvitation = address;
parsed.isValid = true;
} else if (privateKeyUncompressedRe.test(address) || privateKeyCompressedRe.test(address)) { } else if (privateKeyForUncompressedPublicKeyRe.test(address) || privateKeyForCompressedPublicKeyRe.test(address)) {
privateKey = address; privateKey = address;
try { try {
new bitcore.PrivateKey(privateKey, 'livenet'); new bitcore.PrivateKey(privateKey, 'livenet');
parsed.wifPrivateKey = privateKey; parsed.wifPrivateKey = privateKey;
parsed.testnet = false; parsed.testnet = false;
parsed.isValid = true;
} catch (e) {} } catch (e) {}
} else if (privateKeyUncompressedTestnetRe.test(address) || privateKeyCompressedTestnetRe.test(address)) { } else if (privateKeyForUncompressedPublicKeyTestnetRe.test(address) || privateKeyForCompressedPublicKeyTestnetRe.test(address)) {
privateKey = address; privateKey = address;
try { try {
new bitcore.PrivateKey(privateKey, 'testnet'); new bitcore.PrivateKey(privateKey, 'testnet');
parsed.wifPrivateKey = privateKey; parsed.wifPrivateKey = privateKey;
parsed.testnet = true; parsed.testnet = true;
parsed.isValid = true;
} catch (e) {} } catch (e) {}
} else if (privateKeyEncryptedRe.test(address)) {
parsed.encryptedPrivateKey = address;
parsed.isValid = true;
} }
} else {
parsed.isValid = !!parsed.url; // BIP72
} }
// If has no address, must have Url.
parsed.isValid = !!(parsed.address || parsed.url || parsed.copayInvitation || parsed.wifPrivateKey);
return parsed; return parsed;
} }

View file

@ -240,6 +240,14 @@ fdescribe('bitcoinUriService', function() {
expect(parsed.isValid).toBe(false); expect(parsed.isValid).toBe(false);
}); });
it('private key encrypted with BIP38', function() {
var parsed = bitcoinUriService.parse('6PRN5nEDmX842gsBzJryPu8Tw5kcsaQq1GPLcjVQPcEStvbFAtz11JX9pX');
expect(parsed.isValid).toBe(true);
expect(parsed.encryptedPrivateKey).toBe('6PRN5nEDmX842gsBzJryPu8Tw5kcsaQq1GPLcjVQPcEStvbFAtz11JX9pX');
});
it('private key for compressed pubkey mainnet', function() { it('private key for compressed pubkey mainnet', function() {
var parsed = bitcoinUriService.parse('5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ'); var parsed = bitcoinUriService.parse('5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ');