HDWallet: extract BIP32 params search function
This commit is contained in:
parent
759aeb9abc
commit
708e27aa2d
1 changed files with 21 additions and 17 deletions
|
@ -11,6 +11,23 @@ var networks = require('./networks')
|
||||||
var sec = require('./sec')
|
var sec = require('./sec')
|
||||||
var ecparams = sec("secp256k1")
|
var ecparams = sec("secp256k1")
|
||||||
|
|
||||||
|
function findBIP32ParamsByVersion(version) {
|
||||||
|
for (var name in networks) {
|
||||||
|
var network = networks[name]
|
||||||
|
|
||||||
|
for (var type in network.bip32) {
|
||||||
|
if (version != network.bip32[type]) continue
|
||||||
|
|
||||||
|
return {
|
||||||
|
isPrivate: (type === 'priv'),
|
||||||
|
network: network
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(false, 'Could not find version ' + version.toString(16))
|
||||||
|
}
|
||||||
|
|
||||||
function HDWallet(K, chainCode, network) {
|
function HDWallet(K, chainCode, network) {
|
||||||
network = network || networks.bitcoin
|
network = network || networks.bitcoin
|
||||||
|
|
||||||
|
@ -67,20 +84,7 @@ HDWallet.fromBuffer = function(buffer) {
|
||||||
|
|
||||||
// 4 byte: version bytes
|
// 4 byte: version bytes
|
||||||
var version = buffer.readUInt32BE(0)
|
var version = buffer.readUInt32BE(0)
|
||||||
|
var params = findBIP32ParamsByVersion(version)
|
||||||
var hdNetwork, isPrivate
|
|
||||||
for (var name in networks) {
|
|
||||||
var network = networks[name]
|
|
||||||
|
|
||||||
for (var type in network.bip32) {
|
|
||||||
if (version != network.bip32[type]) continue
|
|
||||||
|
|
||||||
hdNetwork = network
|
|
||||||
isPrivate = (type === 'priv')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(hdNetwork, 'Could not find version ' + version.toString(16))
|
|
||||||
|
|
||||||
// 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, ...
|
// 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, ...
|
||||||
var depth = buffer.readUInt8(4)
|
var depth = buffer.readUInt8(4)
|
||||||
|
@ -104,18 +108,18 @@ HDWallet.fromBuffer = function(buffer) {
|
||||||
var data = buffer.slice(45, 78)
|
var data = buffer.slice(45, 78)
|
||||||
|
|
||||||
var hd
|
var hd
|
||||||
if (isPrivate) {
|
if (params.isPrivate) {
|
||||||
assert.strictEqual(data.readUInt8(0), 0x00, 'Invalid private key')
|
assert.strictEqual(data.readUInt8(0), 0x00, 'Invalid private key')
|
||||||
data = data.slice(1)
|
data = data.slice(1)
|
||||||
|
|
||||||
var D = BigInteger.fromBuffer(data)
|
var D = BigInteger.fromBuffer(data)
|
||||||
hd = new HDWallet(D, chainCode, hdNetwork)
|
hd = new HDWallet(D, chainCode, params.network)
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
var decode = ECPointFp.decodeFrom(ecparams.getCurve(), data)
|
var decode = ECPointFp.decodeFrom(ecparams.getCurve(), data)
|
||||||
assert.equal(decode.compressed, true, 'Invalid public key')
|
assert.equal(decode.compressed, true, 'Invalid public key')
|
||||||
|
|
||||||
hd = new HDWallet(decode.Q, chainCode, hdNetwork)
|
hd = new HDWallet(decode.Q, chainCode, params.network)
|
||||||
}
|
}
|
||||||
|
|
||||||
hd.depth = depth
|
hd.depth = depth
|
||||||
|
|
Loading…
Add table
Reference in a new issue