Merge pull request #60 from libp2p/feat/update-keys

feat: set privKey pubKey
This commit is contained in:
David Dias 2017-04-03 08:11:33 -04:00 committed by GitHub
commit 733b40bb47
3 changed files with 81 additions and 25 deletions

View File

@ -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"

View File

@ -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)

View File

@ -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()
})
})