From fbcb478560db44b6fb18ca03188211c4a4132028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20B=C3=ADlek?= Date: Fri, 5 Feb 2016 04:43:56 +0100 Subject: [PATCH 1/3] Adding function to decide if HDNode is public Public === neutered. Private === not neutered --- src/hdnode.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hdnode.js b/src/hdnode.js index 80ae630..ff97d46 100644 --- a/src/hdnode.js +++ b/src/hdnode.js @@ -170,7 +170,7 @@ HDNode.prototype.toBase58 = function (__isPrivate) { // Version var network = this.keyPair.network - var version = this.keyPair.d ? network.bip32.private : network.bip32.public + var version = (!this.isNeutered()) ? network.bip32.private : network.bip32.public var buffer = new Buffer(78) // 4 bytes: version bytes @@ -190,7 +190,7 @@ HDNode.prototype.toBase58 = function (__isPrivate) { this.chainCode.copy(buffer, 13) // 33 bytes: the public key or private key data - if (this.keyPair.d) { + if (!this.isNeutered()) { // 0x00 + k for private keys buffer.writeUInt8(0, 45) this.keyPair.d.toBuffer(32).copy(buffer, 46) @@ -211,7 +211,7 @@ HDNode.prototype.derive = function (index) { // Hardened child if (isHardened) { - if (!this.keyPair.d) throw new TypeError('Could not derive hardened child key') + if (this.isNeutered()) throw new TypeError('Could not derive hardened child key') // data = 0x00 || ser256(kpar) || ser32(index) data[0] = 0x00 @@ -239,7 +239,7 @@ HDNode.prototype.derive = function (index) { // Private parent key -> private child key var derivedKeyPair - if (this.keyPair.d) { + if (!this.isNeutered()) { // ki = parse256(IL) + kpar (mod n) var ki = pIL.add(this.keyPair.d).mod(curve.n) @@ -281,6 +281,12 @@ HDNode.prototype.deriveHardened = function (index) { return this.derive(index + HDNode.HIGHEST_BIT) } +// Private === not neutered +// Public === neutered +HDNode.prototype.isNeutered = function () { + return !(this.keyPair.d) +} + HDNode.prototype.toString = HDNode.prototype.toBase58 module.exports = HDNode From 3df2976e2c729b0e6f7f323bcae27a095aadf958 Mon Sep 17 00:00:00 2001 From: Karel Bilek Date: Fri, 5 Feb 2016 20:12:54 +0100 Subject: [PATCH 2/3] Using private key for testing neuterization To test removing private information, it's probably better to start with them :) --- test/hdnode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hdnode.js b/test/hdnode.js index afa9887..0335682 100644 --- a/test/hdnode.js +++ b/test/hdnode.js @@ -240,7 +240,7 @@ describe('HDNode', function () { var f = fixtures.valid[0] it('strips all private information', function () { - var hd = HDNode.fromBase58(f.master.base58, NETWORKS_LIST) + var hd = HDNode.fromBase58(f.master.base58Priv, NETWORKS_LIST) var hdn = hd.neutered() assert.strictEqual(hdn.keyPair.d, undefined) From bfd294c31ea57e8c3360be5ab1fd7149955833a5 Mon Sep 17 00:00:00 2001 From: Karel Bilek Date: Fri, 5 Feb 2016 20:24:41 +0100 Subject: [PATCH 3/3] Adding tests for isNeutered --- test/hdnode.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/hdnode.js b/test/hdnode.js index 0335682..e8f3184 100644 --- a/test/hdnode.js +++ b/test/hdnode.js @@ -192,6 +192,7 @@ describe('HDNode', function () { assert.strictEqual(hd.toBase58(), f.master.base58) assert.strictEqual(hd.keyPair.network, network) + assert.strictEqual(hd.isNeutered(), true) }) }) @@ -202,6 +203,7 @@ describe('HDNode', function () { assert.strictEqual(hd.toBase58(), f.master.base58Priv) assert.strictEqual(hd.keyPair.network, network) + assert.strictEqual(hd.isNeutered(), false) }) }) @@ -248,6 +250,8 @@ describe('HDNode', function () { assert.strictEqual(hdn.chainCode, hd.chainCode) assert.strictEqual(hdn.depth, hd.depth) assert.strictEqual(hdn.index, hd.index) + assert.strictEqual(hdn.isNeutered(), true) + assert.strictEqual(hd.isNeutered(), false) }) })