|
|
@ -25,7 +25,7 @@ BIP32.prototype.set = function(obj) { |
|
|
|
this.parentFingerprint = obj.parentFingerprint || this.parentFingerprint; |
|
|
|
this.childIndex = obj.childIndex || this.childIndex; |
|
|
|
this.chainCode = obj.chainCode || this.chainCode; |
|
|
|
this.key = obj.key || this.key; |
|
|
|
this.keypair = obj.keypair || this.keypair; |
|
|
|
this.hasPrivateKey = typeof obj.hasPrivateKey !== 'undefined' ? obj.hasPrivateKey : this.hasPrivateKey; |
|
|
|
this.pubKeyHash = obj.pubKeyHash || this.pubKeyHash; |
|
|
|
this.extendedPublicKey = obj.extendedPublicKey || this.extendedPublicKey; |
|
|
@ -41,9 +41,9 @@ BIP32.prototype.fromRandom = function(networkstr) { |
|
|
|
this.parentFingerprint = new Buffer([0, 0, 0, 0]); |
|
|
|
this.childIndex = new Buffer([0, 0, 0, 0]); |
|
|
|
this.chainCode = Random.getRandomBuffer(32); |
|
|
|
this.key = (new Keypair()).fromRandom(); |
|
|
|
this.keypair = (new Keypair()).fromRandom(); |
|
|
|
this.hasPrivateKey = true; |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.key.pubkey.toBuffer()); |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.keypair.pubkey.toBuffer()); |
|
|
|
this.buildExtendedPublicKey(); |
|
|
|
this.buildExtendedPrivateKey(); |
|
|
|
}; |
|
|
@ -71,11 +71,11 @@ BIP32.prototype.fromSeed = function(bytes, networkstr) { |
|
|
|
this.childIndex = new Buffer([0, 0, 0, 0]); |
|
|
|
this.chainCode = hash.slice(32, 64); |
|
|
|
this.version = constants[networkstr].bip32privkey; |
|
|
|
this.key = new Keypair(); |
|
|
|
this.key.privkey = new Privkey({bn: bn.fromBuffer(hash.slice(0, 32))}); |
|
|
|
this.key.privkey2pubkey(); |
|
|
|
this.keypair = new Keypair(); |
|
|
|
this.keypair.privkey = new Privkey({bn: bn.fromBuffer(hash.slice(0, 32))}); |
|
|
|
this.keypair.privkey2pubkey(); |
|
|
|
this.hasPrivateKey = true; |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.key.pubkey.toBuffer()); |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.keypair.pubkey.toBuffer()); |
|
|
|
|
|
|
|
this.buildExtendedPublicKey(); |
|
|
|
this.buildExtendedPrivateKey(); |
|
|
@ -105,15 +105,15 @@ BIP32.prototype.initFromBytes = function(bytes) { |
|
|
|
this.version == constants.testnet.bip32pubkey); |
|
|
|
|
|
|
|
if (isPrivate && keyBytes[0] == 0) { |
|
|
|
this.key = new Keypair(); |
|
|
|
this.key.privkey = new Privkey({bn: bn.fromBuffer(keyBytes.slice(1, 33))}); |
|
|
|
this.key.privkey2pubkey(); |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.key.pubkey.toBuffer()); |
|
|
|
this.keypair = new Keypair(); |
|
|
|
this.keypair.privkey = new Privkey({bn: bn.fromBuffer(keyBytes.slice(1, 33))}); |
|
|
|
this.keypair.privkey2pubkey(); |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.keypair.pubkey.toBuffer()); |
|
|
|
this.hasPrivateKey = true; |
|
|
|
} else if (isPublic && (keyBytes[0] == 0x02 || keyBytes[0] == 0x03)) { |
|
|
|
this.key = new Keypair(); |
|
|
|
this.key.pubkey = (new Pubkey()).fromDER(keyBytes); |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.key.pubkey.toBuffer()); |
|
|
|
this.keypair = new Keypair(); |
|
|
|
this.keypair.pubkey = (new Pubkey()).fromDER(keyBytes); |
|
|
|
this.pubKeyHash = Hash.sha256ripemd160(this.keypair.pubkey.toBuffer()); |
|
|
|
this.hasPrivateKey = false; |
|
|
|
} else { |
|
|
|
throw new Error('Invalid key'); |
|
|
@ -153,7 +153,7 @@ BIP32.prototype.buildExtendedPublicKey = function() { |
|
|
|
new Buffer([(this.childIndex >>> 8) & 0xff]), |
|
|
|
new Buffer([this.childIndex & 0xff]), |
|
|
|
this.chainCode, |
|
|
|
this.key.pubkey.toBuffer() |
|
|
|
this.keypair.pubkey.toBuffer() |
|
|
|
]); |
|
|
|
} |
|
|
|
|
|
|
@ -186,7 +186,7 @@ BIP32.prototype.buildExtendedPrivateKey = function() { |
|
|
|
new Buffer([this.childIndex & 0xff]), |
|
|
|
this.chainCode, |
|
|
|
new Buffer([0]), |
|
|
|
this.key.privkey.bn.toBuffer({size: 32}) |
|
|
|
this.keypair.privkey.bn.toBuffer({size: 32}) |
|
|
|
]); |
|
|
|
} |
|
|
|
|
|
|
@ -257,9 +257,9 @@ BIP32.prototype.deriveChild = function(i) { |
|
|
|
var data = null; |
|
|
|
|
|
|
|
if (usePrivate) { |
|
|
|
data = Buffer.concat([new Buffer([0]), this.key.privkey.bn.toBuffer({size: 32}), ib]); |
|
|
|
data = Buffer.concat([new Buffer([0]), this.keypair.privkey.bn.toBuffer({size: 32}), ib]); |
|
|
|
} else { |
|
|
|
data = Buffer.concat([this.key.pubkey.toBuffer({size: 32}), ib]); |
|
|
|
data = Buffer.concat([this.keypair.pubkey.toBuffer({size: 32}), ib]); |
|
|
|
} |
|
|
|
|
|
|
|
var hash = Hash.sha512hmac(data, this.chainCode); |
|
|
@ -267,25 +267,25 @@ BIP32.prototype.deriveChild = function(i) { |
|
|
|
var ir = hash.slice(32, 64); |
|
|
|
|
|
|
|
// ki = IL + kpar (mod n).
|
|
|
|
var k = il.add(this.key.privkey.bn).mod(Point.getN()); |
|
|
|
var k = il.add(this.keypair.privkey.bn).mod(Point.getN()); |
|
|
|
|
|
|
|
ret = new BIP32(); |
|
|
|
ret.chainCode = ir; |
|
|
|
|
|
|
|
ret.key = new Keypair(); |
|
|
|
ret.key.privkey = new Privkey({bn: k}); |
|
|
|
ret.key.privkey2pubkey(); |
|
|
|
ret.keypair = new Keypair(); |
|
|
|
ret.keypair.privkey = new Privkey({bn: k}); |
|
|
|
ret.keypair.privkey2pubkey(); |
|
|
|
ret.hasPrivateKey = true; |
|
|
|
|
|
|
|
} else { |
|
|
|
var data = Buffer.concat([this.key.pubkey.toBuffer(), ib]); |
|
|
|
var data = Buffer.concat([this.keypair.pubkey.toBuffer(), ib]); |
|
|
|
var hash = Hash.sha512hmac(data, this.chainCode); |
|
|
|
var il = bn(hash.slice(0, 32)); |
|
|
|
var ir = hash.slice(32, 64); |
|
|
|
|
|
|
|
// Ki = (IL + kpar)*G = IL*G + Kpar
|
|
|
|
var ilG = Point.getG().mul(il); |
|
|
|
var Kpar = this.key.pubkey.point; |
|
|
|
var Kpar = this.keypair.pubkey.point; |
|
|
|
var Ki = ilG.add(Kpar); |
|
|
|
var newpub = new Pubkey(); |
|
|
|
newpub.point = Ki; |
|
|
@ -293,9 +293,9 @@ BIP32.prototype.deriveChild = function(i) { |
|
|
|
ret = new BIP32(); |
|
|
|
ret.chainCode = ir; |
|
|
|
|
|
|
|
var key = new Keypair(); |
|
|
|
key.pubkey = newpub; |
|
|
|
ret.key = key; |
|
|
|
var keypair = new Keypair(); |
|
|
|
keypair.pubkey = newpub; |
|
|
|
ret.keypair = keypair; |
|
|
|
ret.hasPrivateKey = false; |
|
|
|
} |
|
|
|
|
|
|
@ -304,7 +304,7 @@ BIP32.prototype.deriveChild = function(i) { |
|
|
|
ret.version = this.version; |
|
|
|
ret.depth = this.depth + 1; |
|
|
|
|
|
|
|
ret.pubKeyHash = Hash.sha256ripemd160(ret.key.pubkey.toBuffer()); |
|
|
|
ret.pubKeyHash = Hash.sha256ripemd160(ret.keypair.pubkey.toBuffer()); |
|
|
|
|
|
|
|
ret.buildExtendedPublicKey(); |
|
|
|
ret.buildExtendedPrivateKey(); |
|
|
|