Compare commits

...

26 Commits

Author SHA1 Message Date
156088db99 chore: release version v0.8.8 2017-07-21 09:30:10 -07:00
9c0c648001 chore: update contributors 2017-07-21 09:30:10 -07:00
a2934aa371 chore: update ci 2017-07-21 09:29:12 -07:00
ac98b7582a chore: update deps 2017-07-21 09:29:06 -07:00
0dc3c14f2b docs: update readme 2017-07-09 10:05:03 +01:00
af6575d06c chore: release version v0.8.7 2017-04-03 08:29:40 -04:00
ccf0b7875c chore: update contributors 2017-04-03 08:29:40 -04:00
733b40bb47 Merge pull request #60 from libp2p/feat/update-keys
feat: set privKey pubKey
2017-04-03 08:11:33 -04:00
ac27907241 feat: set privKey pubKey 2017-04-02 22:47:44 -04:00
e206c46549 chore: release version v0.8.6 2017-03-30 10:06:09 +01:00
41d3e5be5b chore: update contributors 2017-03-30 10:06:09 +01:00
bc213dd818 Merge pull request #58 from libp2p/feat/isEqual
feat: isEqual
2017-03-30 10:02:36 +01:00
3f4f670691 feat: isEqual 2017-03-30 09:47:11 +01:00
d2894bfa32 chore: release version v0.8.5 2017-03-27 14:20:31 +01:00
c3e3b70d09 chore: update contributors 2017-03-27 14:20:31 +01:00
f08866047d Merge pull request #57 from libp2p/feat/isPeerId
isPeerId
2017-03-27 14:17:09 +01:00
a3fe1a2f03 fix: avoid using constructor.name 2017-03-27 13:58:21 +01:00
0acc572fd3 feat: isPeerId 2017-03-27 13:23:18 +01:00
8c49610dff chore: update deps 2017-03-27 12:38:48 +01:00
e1ffe9bba5 chore: release version v0.8.4 2017-03-16 17:08:03 +00:00
e59010b439 chore: update contributors 2017-03-16 17:08:03 +00:00
60b1c09665 chore: release version v0.8.3 2017-03-16 17:07:10 +00:00
b28b8ef693 chore: update contributors 2017-03-16 17:07:10 +00:00
961b218a53 chore: update aegir and fix lint 2017-03-16 17:07:10 +00:00
0642070fdd Merge pull request #45 from libp2p/greenkeeper-aegir-10.0.0
Update aegir to version 10.0.0 🚀
2017-02-13 18:07:31 -08:00
a2afb2aeea chore(package): update aegir to version 10.0.0
https://greenkeeper.io/
2017-02-07 18:45:23 +01:00
6 changed files with 178 additions and 91 deletions

View File

@ -7,19 +7,19 @@ matrix:
env: CXX=g++-4.8 env: CXX=g++-4.8
- node_js: 6 - node_js: 6
env: env:
- SAUCE=true
- CXX=g++-4.8 - CXX=g++-4.8
- node_js: stable - node_js: stable
env: CXX=g++-4.8 env: CXX=g++-4.8
# Make sure we have new NPM. # Make sure we have new NPM.
before_install: before_install:
- npm install -g npm - npm install -g npm@4
script: script:
- npm run lint - npm run lint
- npm test - npm test
- npm run coverage - npm run coverage
- make test
before_script: before_script:
- export DISPLAY=:99.0 - export DISPLAY=:99.0
@ -29,7 +29,7 @@ after_success:
- npm run coverage-publish - npm run coverage-publish
addons: addons:
firefox: latest firefox: 'latest'
apt: apt:
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test

View File

@ -9,8 +9,6 @@
![](https://img.shields.io/badge/npm-%3E%3D3.0.0-orange.svg?style=flat-square) ![](https://img.shields.io/badge/npm-%3E%3D3.0.0-orange.svg?style=flat-square)
![](https://img.shields.io/badge/Node.js-%3E%3D4.0.0-orange.svg?style=flat-square) ![](https://img.shields.io/badge/Node.js-%3E%3D4.0.0-orange.svg?style=flat-square)
[![Sauce Test Status](https://saucelabs.com/browser-matrix/ipfs-js-peer-id.svg)](https://saucelabs.com/u/ipfs-js-peer-id)
> [IPFS](https://github.com/ipfs/ipfs) Peer ID implementation in JavaScript. > [IPFS](https://github.com/ipfs/ipfs) Peer ID implementation in JavaScript.
- [Description](#description) - [Description](#description)
@ -44,25 +42,21 @@
Generate, import, and export PeerIDs, for use with [IPFS](https://github.com/ipfs/ipfs). Generate, import, and export PeerIDs, for use with [IPFS](https://github.com/ipfs/ipfs).
*A Peer ID is the SHA-256 [multihash](https://github.com/multiformats/multihash) of a A Peer ID is the SHA-256 [multihash](https://github.com/multiformats/multihash) of a public key.
public key.*
*The public key is a base64 encoded string of a protobuf containing an RSA DER The public key is a base64 encoded string of a protobuf containing an RSA DER buffer. This uses a node buffer to pass the base64 encoded public key protobuf to the multihash for ID generation.
buffer. This uses a node buffer to pass the base64 encoded public key protobuf
to the multihash for ID generation.*
# Example # Example
```js ```JavaScript
var PeerId = require('peer-id') const PeerId = require('peer-id')
var bs58 = require('bs58')
PeerId.create({ bits: 1024 }, (err, id) => { PeerId.create({ bits: 1024 }, (err, id) => {
if (err) { throw err }
console.log(JSON.stringify(id.toJSON(), null, 2)) console.log(JSON.stringify(id.toJSON(), null, 2))
}) })
``` ```
```bash
```
{ {
"id": "Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi", "id": "Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi",
"privKey": "CAAS4AQwggJcAgEAAoGBAMBgbIqyOL26oV3nGPBYrdpbv..", "privKey": "CAAS4AQwggJcAgEAAoGBAMBgbIqyOL26oV3nGPBYrdpbv..",
@ -83,7 +77,7 @@ PeerId.create({ bits: 1024 }, (err, id) => {
## Node.js ## Node.js
```js ```js
var PeerId = require('peer-id') const PeerId = require('peer-id')
``` ```
## Browser: Browserify, Webpack, other bundlers ## Browser: Browserify, Webpack, other bundlers
@ -94,7 +88,7 @@ it and use with your favourite bundler without having to adjust asset management
process. process.
```js ```js
var PeerId = require('peer-id') const PeerId = require('peer-id')
``` ```
## Browser: `<script>` Tag ## Browser: `<script>` Tag
@ -203,6 +197,9 @@ Returns an `obj` of the form
Alias for `.toJSON()`. Alias for `.toJSON()`.
### `isEqual(id)`
- `id` can be a PeerId or a Buffer containing the id
# License # License

View File

@ -5,8 +5,10 @@ machine:
dependencies: dependencies:
pre: pre:
- google-chrome --version - google-chrome --version
- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - curl -L -o google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
- sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' - sudo dpkg -i google-chrome.deb || true
- sudo apt-get update - sudo apt-get update
- sudo apt-get --only-upgrade install google-chrome-stable - sudo apt-get install -f
- sudo apt-get install --only-upgrade lsb-base
- sudo dpkg -i google-chrome.deb
- google-chrome --version - google-chrome --version

View File

@ -1,6 +1,6 @@
{ {
"name": "peer-id", "name": "peer-id",
"version": "0.8.2", "version": "0.8.8",
"description": "IPFS Peer Id implementation in Node.js", "description": "IPFS Peer Id implementation in Node.js",
"main": "src/index.js", "main": "src/index.js",
"bin": "src/bin.js", "bin": "src/bin.js",
@ -34,14 +34,16 @@
}, },
"homepage": "https://github.com/libp2p/js-peer-id", "homepage": "https://github.com/libp2p/js-peer-id",
"devDependencies": { "devDependencies": {
"aegir": "^10.0.0", "aegir": "^11.0.2",
"chai": "^3.5.0", "chai": "^4.1.0",
"dirty-chai": "^2.0.1",
"pre-commit": "^1.2.2" "pre-commit": "^1.2.2"
}, },
"dependencies": { "dependencies": {
"libp2p-crypto": "~0.8.0", "async": "^2.5.0",
"multihashes": "~0.3.3", "libp2p-crypto": "~0.8.8",
"async": "^2.1.4" "lodash": "^4.17.4",
"multihashes": "~0.4.5"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -51,10 +53,10 @@
"David Dias <daviddias.p@gmail.com>", "David Dias <daviddias.p@gmail.com>",
"David Dias <mail@daviddias.me>", "David Dias <mail@daviddias.me>",
"Friedel Ziegelmayer <dignifiedquire@gmail.com>", "Friedel Ziegelmayer <dignifiedquire@gmail.com>",
"Greenkeeper <support@greenkeeper.io>",
"Prashanth Chandra <coolshanth94@gmail.com>", "Prashanth Chandra <coolshanth94@gmail.com>",
"Richard Littauer <richard.littauer@gmail.com>", "Richard Littauer <richard.littauer@gmail.com>",
"Stephen Whitmore <stephen.whitmore@gmail.com>", "Stephen Whitmore <stephen.whitmore@gmail.com>",
"greenkeeperio-bot <support@greenkeeper.io>",
"nginnever <ginneversource@gmail.com>", "nginnever <ginneversource@gmail.com>",
"npmcdn-to-unpkg-bot <npmcdn-to-unpkg-bot@users.noreply.github.com>" "npmcdn-to-unpkg-bot <npmcdn-to-unpkg-bot@users.noreply.github.com>"
] ]

View File

@ -35,26 +35,32 @@ class PeerId {
return this._privKey return this._privKey
} }
set privKey (privKey) {
this._privKey = privKey
}
get pubKey () { get pubKey () {
if (this._pubKey) { if (this._pubKey) {
return this._pubKey return this._pubKey
} }
if (this.privKey) { if (this._privKey) {
return this.privKey.public return this._privKey.public
} }
} }
// Return the protobuf version of the public key, set pubKey (pubKey) {
// matching go ipfs formatting this._pubKey = pubKey
}
// Return the protobuf version of the public key, matching go ipfs formatting
marshalPubKey () { marshalPubKey () {
if (this.pubKey) { if (this.pubKey) {
return crypto.marshalPublicKey(this.pubKey) return crypto.marshalPublicKey(this.pubKey)
} }
} }
// Return the protobuf version of the private key, // Return the protobuf version of the private key, matching go ipfs formatting
// matching go ipfs formatting
marshalPrivKey () { marshalPrivKey () {
if (this.privKey) { if (this.privKey) {
return crypto.marshalPrivateKey(this.privKey) return crypto.marshalPrivateKey(this.privKey)
@ -88,10 +94,35 @@ class PeerId {
toB58String () { toB58String () {
return this._idB58String return this._idB58String
} }
isEqual (id) {
if (Buffer.isBuffer(id)) {
return this.id.equals(id)
} else if (id.id) {
return this.id.equals(id.id)
} else {
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 exports = module.exports = PeerId
exports.Buffer = Buffer
// generation // generation
exports.create = function (opts, callback) { exports.create = function (opts, callback) {
@ -130,16 +161,17 @@ exports.createFromB58String = function (str) {
// Public Key input will be a buffer // Public Key input will be a buffer
exports.createFromPubKey = function (key, callback) { exports.createFromPubKey = function (key, callback) {
if (typeof callback !== 'function') {
throw new Error('callback is required')
}
let buf = key let buf = key
if (typeof buf === 'string') { if (typeof buf === 'string') {
buf = new Buffer(key, 'base64') buf = new Buffer(key, 'base64')
} }
if (typeof callback !== 'function') {
throw new Error('callback is required')
}
const pubKey = crypto.unmarshalPublicKey(buf) const pubKey = crypto.unmarshalPublicKey(buf)
pubKey.hash((err, digest) => { pubKey.hash((err, digest) => {
if (err) { if (err) {
return callback(err) return callback(err)
@ -219,6 +251,12 @@ exports.createFromJSON = function (obj, callback) {
} }
} }
exports.isPeerId = function (peerId) {
return Boolean(typeof peerId === 'object' &&
peerId._id &&
peerId._idB58String)
}
function toB64Opt (val) { function toB64Opt (val) {
if (val) { if (val) {
return val.toString('base64') return val.toString('base64')

View File

@ -2,7 +2,10 @@
/* eslint-env mocha */ /* eslint-env mocha */
'use strict' 'use strict'
const expect = require('chai').expect const chai = require('chai')
const dirtyChai = require('dirty-chai')
chai.use(dirtyChai)
const expect = chai.expect
const crypto = require('libp2p-crypto') const crypto = require('libp2p-crypto')
const mh = require('multihashes') const mh = require('multihashes')
const parallel = require('async/parallel') const parallel = require('async/parallel')
@ -23,15 +26,25 @@ describe('PeerId', () => {
it('create a new id', (done) => { it('create a new id', (done) => {
PeerId.create((err, id) => { PeerId.create((err, id) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(id.toB58String().length).to.equal(46) expect(id.toB58String().length).to.equal(46)
done() done()
}) })
}) })
it('isPeerId', (done) => {
PeerId.create((err, id) => {
expect(err).to.not.exist()
expect(PeerId.isPeerId(id)).to.equal(true)
expect(PeerId.isPeerId('aaa')).to.equal(false)
expect(PeerId.isPeerId(new Buffer('batatas'))).to.equal(false)
done()
})
})
it('throws on changing the id', (done) => { it('throws on changing the id', (done) => {
PeerId.create((err, id) => { PeerId.create((err, id) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(id.toB58String().length).to.equal(46) expect(id.toB58String().length).to.equal(46)
expect(() => { expect(() => {
id.id = new Buffer('hello') id.id = new Buffer('hello')
@ -57,7 +70,7 @@ describe('PeerId', () => {
it('Recreate from a Public Key', (done) => { it('Recreate from a Public Key', (done) => {
PeerId.createFromPubKey(testId.pubKey, (err, id) => { PeerId.createFromPubKey(testId.pubKey, (err, id) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(testIdB58String).to.equal(id.toB58String()) expect(testIdB58String).to.equal(id.toB58String())
done() done()
}) })
@ -65,12 +78,12 @@ describe('PeerId', () => {
it('Recreate from a Private Key', (done) => { it('Recreate from a Private Key', (done) => {
PeerId.createFromPrivKey(testId.privKey, (err, id) => { PeerId.createFromPrivKey(testId.privKey, (err, id) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(testIdB58String).to.equal(id.toB58String()) expect(testIdB58String).to.equal(id.toB58String())
const encoded = new Buffer(testId.privKey, 'base64') const encoded = new Buffer(testId.privKey, 'base64')
PeerId.createFromPrivKey(encoded, (err, id2) => { PeerId.createFromPrivKey(encoded, (err, id2) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(testIdB58String).to.equal(id2.toB58String()) expect(testIdB58String).to.equal(id2.toB58String())
done() done()
}) })
@ -79,10 +92,10 @@ describe('PeerId', () => {
it('Compare generated ID with one created from PubKey', (done) => { it('Compare generated ID with one created from PubKey', (done) => {
PeerId.create((err, id1) => { PeerId.create((err, id1) => {
expect(err).to.not.exist expect(err).to.not.exist()
PeerId.createFromPubKey(id1.marshalPubKey(), (err, id2) => { PeerId.createFromPubKey(id1.marshalPubKey(), (err, id2) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(id1.id).to.be.eql(id2.id) expect(id1.id).to.be.eql(id2.id)
done() done()
}) })
@ -91,9 +104,9 @@ describe('PeerId', () => {
it('Non-default # of bits', (done) => { it('Non-default # of bits', (done) => {
PeerId.create({ bits: 1024 }, (err, shortId) => { PeerId.create({ bits: 1024 }, (err, shortId) => {
expect(err).to.not.exist expect(err).to.not.exist()
PeerId.create({ bits: 4096 }, (err, longId) => { PeerId.create({ bits: 4096 }, (err, longId) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(shortId.privKey.bytes.length).is.below(longId.privKey.bytes.length) expect(shortId.privKey.bytes.length).is.below(longId.privKey.bytes.length)
done() done()
}) })
@ -102,9 +115,9 @@ describe('PeerId', () => {
it('Pretty printing', (done) => { it('Pretty printing', (done) => {
PeerId.create((err, id1) => { PeerId.create((err, id1) => {
expect(err).to.not.exist expect(err).to.not.exist()
PeerId.createFromPrivKey(id1.toPrint().privKey, (err, id2) => { PeerId.createFromPrivKey(id1.toPrint().privKey, (err, id2) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect(id1.toPrint()).to.be.eql(id2.toPrint()) expect(id1.toPrint()).to.be.eql(id2.toPrint())
done() done()
}) })
@ -116,28 +129,30 @@ describe('PeerId', () => {
expect(id.toBytes().toString('hex')).to.equal(testIdBytes.toString('hex')) expect(id.toBytes().toString('hex')).to.equal(testIdBytes.toString('hex'))
}) })
it('isEqual', (done) => {
parallel([
(cb) => PeerId.create(cb),
(cb) => PeerId.create(cb)
], (err, ids) => {
expect(err).to.not.exist()
expect(ids[0].isEqual(ids[0])).to.equal(true)
expect(ids[0].isEqual(ids[1])).to.equal(false)
expect(ids[0].isEqual(ids[0].id)).to.equal(true)
expect(ids[0].isEqual(ids[1].id)).to.equal(false)
done()
})
})
describe('fromJSON', () => { describe('fromJSON', () => {
it('full node', (done) => { it('full node', (done) => {
PeerId.create({bits: 1024}, (err, id) => { PeerId.create({ bits: 1024 }, (err, id) => {
expect(err).to.not.exist expect(err).to.not.exist()
PeerId.createFromJSON(id.toJSON(), (err, other) => { PeerId.createFromJSON(id.toJSON(), (err, other) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect( expect(id.toB58String()).to.equal(other.toB58String())
id.toB58String() expect(id.privKey.bytes).to.eql(other.privKey.bytes)
).to.equal( expect(id.pubKey.bytes).to.eql(other.pubKey.bytes)
other.toB58String()
)
expect(
id.privKey.bytes
).to.deep.equal(
other.privKey.bytes
)
expect(
id.pubKey.bytes
).to.deep.equal(
other.pubKey.bytes
)
done() done()
}) })
}) })
@ -145,16 +160,16 @@ describe('PeerId', () => {
it('only id', (done) => { it('only id', (done) => {
crypto.generateKeyPair('RSA', 1024, (err, key) => { crypto.generateKeyPair('RSA', 1024, (err, key) => {
expect(err).to.not.exist expect(err).to.not.exist()
key.public.hash((err, digest) => { key.public.hash((err, digest) => {
expect(err).to.not.exist expect(err).to.not.exist()
const id = PeerId.createFromBytes(digest) const id = PeerId.createFromBytes(digest)
expect(id.privKey).to.not.exist expect(id.privKey).to.not.exist()
expect(id.pubKey).to.not.exist expect(id.pubKey).to.not.exist()
PeerId.createFromJSON(id.toJSON(), (err, other) => { PeerId.createFromJSON(id.toJSON(), (err, other) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect( expect(
id.toB58String() id.toB58String()
).to.equal( ).to.equal(
@ -168,9 +183,9 @@ describe('PeerId', () => {
it('go interop', (done) => { it('go interop', (done) => {
PeerId.createFromJSON(goId, (err, id) => { PeerId.createFromJSON(goId, (err, id) => {
expect(err).to.not.exist expect(err).to.not.exist()
id.privKey.public.hash((err, digest) => { id.privKey.public.hash((err, digest) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect( expect(
mh.toB58String(digest) mh.toB58String(digest)
).to.be.eql( ).to.be.eql(
@ -182,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', () => { describe('throws on inconsistent data', () => {
let k1, k2, k3 let k1
let k2
let k3
before((done) => { before((done) => {
parallel([ parallel([
(cb) => crypto.generateKeyPair('RSA', 1024, cb), (cb) => crypto.generateKeyPair('RSA', 1024, cb),
(cb) => crypto.generateKeyPair('RSA', 1024, cb), (cb) => crypto.generateKeyPair('RSA', 1024, cb),
(cb) => crypto.generateKeyPair('RSA', 1024, cb) (cb) => crypto.generateKeyPair('RSA', 1024, cb)
], (err, keys) => { ], (err, keys) => {
if (err) { expect(err).to.not.exist()
return done(err)
}
k1 = keys[0] k1 = keys[0]
k2 = keys[1] k2 = keys[1]
@ -203,24 +257,18 @@ describe('PeerId', () => {
it('missmatch private - public key', (done) => { it('missmatch private - public key', (done) => {
k1.public.hash((err, digest) => { k1.public.hash((err, digest) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect( expect(() => new PeerId(digest, k1, k2.public))
() => new PeerId(digest, k1, k2.public) .to.throw(/inconsistent arguments/)
).to.throw(
/inconsistent arguments/
)
done() done()
}) })
}) })
it('missmatch id - private - public key', (done) => { it('missmatch id - private - public key', (done) => {
k1.public.hash((err, digest) => { k1.public.hash((err, digest) => {
expect(err).to.not.exist expect(err).to.not.exist()
expect( expect(() => new PeerId(digest, k1, k3.public))
() => new PeerId(digest, k1, k3.public) .to.throw(/inconsistent arguments/)
).to.throw(
/inconsistent arguments/
)
done() done()
}) })
}) })