From ac279072418d93118e45cb7d8058d2090836322f Mon Sep 17 00:00:00 2001 From: David Dias Date: Sun, 2 Apr 2017 20:06:26 -0400 Subject: [PATCH] feat: set privKey pubKey --- package.json | 2 +- src/index.js | 43 +++++++++++++---- test/{index.spec.js => peer-id.spec.js} | 61 +++++++++++++++++++------ 3 files changed, 81 insertions(+), 25 deletions(-) rename test/{index.spec.js => peer-id.spec.js} (84%) diff --git a/package.json b/package.json index e13fca2..832429b 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "pre-commit": "^1.2.2" }, "dependencies": { - "async": "^2.2.0", + "async": "^2.3.0", "libp2p-crypto": "~0.8.7", "lodash": "^4.17.4", "multihashes": "~0.4.5" diff --git a/src/index.js b/src/index.js index 0e78285..f8bef08 100644 --- a/src/index.js +++ b/src/index.js @@ -35,26 +35,32 @@ class PeerId { return this._privKey } + set privKey (privKey) { + this._privKey = privKey + } + get pubKey () { if (this._pubKey) { return this._pubKey } - if (this.privKey) { - return this.privKey.public + if (this._privKey) { + return this._privKey.public } } - // Return the protobuf version of the public key, - // matching go ipfs formatting + set pubKey (pubKey) { + this._pubKey = pubKey + } + + // Return the protobuf version of the public key, matching go ipfs formatting marshalPubKey () { if (this.pubKey) { return crypto.marshalPublicKey(this.pubKey) } } - // Return the protobuf version of the private key, - // matching go ipfs formatting + // Return the protobuf version of the private key, matching go ipfs formatting marshalPrivKey () { if (this.privKey) { return crypto.marshalPrivateKey(this.privKey) @@ -98,6 +104,22 @@ class PeerId { throw new Error('not valid Id') } } + + /* + * Check if this PeerId instance is valid (privKey -> pubKey -> Id) + */ + isValid (callback) { + // TODO Needs better checking + if (this.privKey && + this.privKey.public && + this.privKey.public.bytes && + Buffer.isBuffer(this.pubKey.bytes) && + this.privKey.public.bytes.equals(this.pubKey.bytes)) { + callback() + } else { + callback(new Error('Keys not match')) + } + } } exports = module.exports = PeerId @@ -139,16 +161,17 @@ exports.createFromB58String = function (str) { // Public Key input will be a buffer exports.createFromPubKey = function (key, callback) { + if (typeof callback !== 'function') { + throw new Error('callback is required') + } + let buf = key if (typeof buf === 'string') { buf = new Buffer(key, 'base64') } - if (typeof callback !== 'function') { - throw new Error('callback is required') - } - const pubKey = crypto.unmarshalPublicKey(buf) + pubKey.hash((err, digest) => { if (err) { return callback(err) diff --git a/test/index.spec.js b/test/peer-id.spec.js similarity index 84% rename from test/index.spec.js rename to test/peer-id.spec.js index c822c87..41eac88 100644 --- a/test/index.spec.js +++ b/test/peer-id.spec.js @@ -197,17 +197,56 @@ describe('PeerId', () => { }) }) + it('set privKey (valid)', (done) => { + PeerId.create((err, peerId) => { + expect(err).to.not.exist() + peerId.privKey = peerId._privKey + peerId.isValid(done) + }) + }) + + it('set pubKey (valid)', (done) => { + PeerId.create((err, peerId) => { + expect(err).to.not.exist() + peerId.pubKey = peerId._pubKey + peerId.isValid(done) + }) + }) + + it('set privKey (invalid)', (done) => { + PeerId.create((err, peerId) => { + expect(err).to.not.exist() + peerId.privKey = new Buffer('bufff') + peerId.isValid((err) => { + expect(err).to.exist() + done() + }) + }) + }) + + it('set pubKey (invalid)', (done) => { + PeerId.create((err, peerId) => { + expect(err).to.not.exist() + peerId.pubKey = new Buffer('buffff') + peerId.isValid((err) => { + expect(err).to.exist() + done() + }) + }) + }) + describe('throws on inconsistent data', () => { - let k1, k2, k3 + let k1 + let k2 + let k3 + before((done) => { parallel([ (cb) => crypto.generateKeyPair('RSA', 1024, cb), (cb) => crypto.generateKeyPair('RSA', 1024, cb), (cb) => crypto.generateKeyPair('RSA', 1024, cb) ], (err, keys) => { - if (err) { - return done(err) - } + expect(err).to.not.exist() k1 = keys[0] k2 = keys[1] @@ -219,11 +258,8 @@ describe('PeerId', () => { it('missmatch private - public key', (done) => { k1.public.hash((err, digest) => { expect(err).to.not.exist() - expect( - () => new PeerId(digest, k1, k2.public) - ).to.throw( - /inconsistent arguments/ - ) + expect(() => new PeerId(digest, k1, k2.public)) + .to.throw(/inconsistent arguments/) done() }) }) @@ -231,11 +267,8 @@ describe('PeerId', () => { it('missmatch id - private - public key', (done) => { k1.public.hash((err, digest) => { expect(err).to.not.exist() - expect( - () => new PeerId(digest, k1, k3.public) - ).to.throw( - /inconsistent arguments/ - ) + expect(() => new PeerId(digest, k1, k3.public)) + .to.throw(/inconsistent arguments/) done() }) })