Compare commits

..

3 Commits

Author SHA1 Message Date
989b413a96 chore: release version v0.13.0 2019-07-11 18:26:18 +01:00
52ed9c58a5 chore: update contributors 2019-07-11 18:26:18 +01:00
c3463c7421 feat: async await (#87)
BREAKING CHANGE: API refactored to use async/await
2019-07-11 18:09:21 +01:00
6 changed files with 213 additions and 402 deletions

View File

@ -1,15 +1,15 @@
<a name="0.12.4"></a> <a name="0.13.0"></a>
## [0.12.4](https://github.com/libp2p/js-peer-id/compare/v0.12.3...v0.12.4) (2019-07-23) # [0.13.0](https://github.com/libp2p/js-peer-id/compare/v0.12.2...v0.13.0) (2019-07-11)
<a name="0.12.3"></a>
## [0.12.3](https://github.com/libp2p/js-peer-id/compare/v0.12.2...v0.12.3) (2019-07-11)
### Features ### Features
* **peerid:** support creating from secp256k1; harmonize algo with Go ([fd07221](https://github.com/libp2p/js-peer-id/commit/fd07221)) * async await ([#87](https://github.com/libp2p/js-peer-id/issues/87)) ([c3463c7](https://github.com/libp2p/js-peer-id/commit/c3463c7))
### BREAKING CHANGES
* API refactored to use async/await

View File

@ -28,7 +28,7 @@
- [API](#api) - [API](#api)
- [Create](#create) - [Create](#create)
- [`new PeerId(id[, privKey, pubKey])`](#new-peeridid-privkey-pubkey) - [`new PeerId(id[, privKey, pubKey])`](#new-peeridid-privkey-pubkey)
- [`create([opts], callback)`](#createopts-callback) - [`create([opts])`](#createopts)
- [Import](#import) - [Import](#import)
- [`createFromHexString(str)`](#createfromhexstringstr) - [`createFromHexString(str)`](#createfromhexstringstr)
- [`createFromBytes(buf)`](#createfrombytesbuf) - [`createFromBytes(buf)`](#createfrombytesbuf)
@ -57,11 +57,10 @@ The public key is a base64 encoded string of a protobuf containing an RSA DER bu
```JavaScript ```JavaScript
const PeerId = require('peer-id') const PeerId = require('peer-id')
PeerId.create({ bits: 1024, keyType: 'rsa' }, (err, id) => { const id = await PeerId.create({ bits: 1024 })
if (err) { throw err } console.log(JSON.stringify(id.toJSON(), null, 2))
console.log(JSON.stringify(id.toJSON(), null, 2))
})
``` ```
```bash ```bash
{ {
"id": "Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi", "id": "Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi",
@ -124,14 +123,13 @@ const PeerId = require('peer-id')
The key format is detailed in [libp2p-crypto](https://github.com/libp2p/js-libp2p-crypto). The key format is detailed in [libp2p-crypto](https://github.com/libp2p/js-libp2p-crypto).
### `create([opts], callback)` ### `create([opts])`
Generates a new Peer ID, complete with public/private keypair. Generates a new Peer ID, complete with public/private keypair.
- `opts: Object`: Default: `{bits: 2048, keyType: 'rsa'}` - `opts: Object`: Default: `{bits: 2048}`
- `callback: Function`
Calls back `callback` with `err, id`. Returns `Promise<PeerId>`.
## Import ## Import
@ -139,32 +137,44 @@ Calls back `callback` with `err, id`.
Creates a Peer ID from hex string representing the key's multihash. Creates a Peer ID from hex string representing the key's multihash.
Returns `PeerId.
### `createFromBytes(buf)` ### `createFromBytes(buf)`
Creates a Peer ID from a buffer representing the key's multihash. Creates a Peer ID from a buffer representing the key's multihash.
Returns `PeerId`.
### `createFromB58String(str)` ### `createFromB58String(str)`
Creates a Peer ID from a Base58 string representing the key's multihash. Creates a Peer ID from a Base58 string representing the key's multihash.
Returns `PeerId`.
### `createFromPubKey(pubKey)` ### `createFromPubKey(pubKey)`
- `publicKey: Buffer` - `publicKey: Buffer`
Creates a Peer ID from a buffer containing a public key. Creates a Peer ID from a buffer containing a public key.
Returns `Promise<PeerId>`.
### `createFromPrivKey(privKey)` ### `createFromPrivKey(privKey)`
- `privKey: Buffer` - `privKey: Buffer`
Creates a Peer ID from a buffer containing a private key. Creates a Peer ID from a buffer containing a private key.
Returns `Promise<PeerId>`.
### `createFromJSON(obj)` ### `createFromJSON(obj)`
- `obj.id: String` - The multihash encoded in `base58` - `obj.id: String` - The multihash encoded in `base58`
- `obj.pubKey: String` - The public key in protobuf format, encoded in `base64` - `obj.pubKey: String` - The public key in protobuf format, encoded in `base64`
- `obj.privKey: String` - The private key in protobuf format, encoded in `base64` - `obj.privKey: String` - The private key in protobuf format, encoded in `base64`
Returns `Promise<PeerId>`.
## Export ## Export
### `toHexString()` ### `toHexString()`

View File

@ -1,6 +1,6 @@
{ {
"name": "peer-id", "name": "peer-id",
"version": "0.12.4", "version": "0.13.0",
"description": "IPFS Peer Id implementation in Node.js", "description": "IPFS Peer Id implementation in Node.js",
"leadMaintainer": "Pedro Teixeira <i@pgte.me>", "leadMaintainer": "Pedro Teixeira <i@pgte.me>",
"main": "src/index.js", "main": "src/index.js",
@ -34,28 +34,26 @@
}, },
"homepage": "https://github.com/libp2p/js-peer-id", "homepage": "https://github.com/libp2p/js-peer-id",
"devDependencies": { "devDependencies": {
"aegir": "^20.0.0", "aegir": "^19.0.5",
"bundlesize": "~0.17.1", "bundlesize": "~0.18.0",
"chai": "^4.2.0", "chai": "^4.2.0",
"dirty-chai": "^2.0.1" "dirty-chai": "^2.0.1"
}, },
"dependencies": { "dependencies": {
"libp2p-crypto": "~0.16.1",
"async": "^2.6.3",
"class-is": "^1.1.0", "class-is": "^1.1.0",
"multihashes": "~0.4.15" "libp2p-crypto": "~0.17.0",
"multihashes": "~0.4.14"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/libp2p/js-peer-id.git" "url": "https://github.com/libp2p/js-peer-id.git"
}, },
"contributors": [ "contributors": [
"Arve Knudsen <arve.knudsen@gmail.com>",
"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>",
"Henrique Dias <hacdias@gmail.com>",
"Hugo Dias <hugomrdias@gmail.com>", "Hugo Dias <hugomrdias@gmail.com>",
"Jacob Heun <jacobheun@gmail.com>",
"Maciej Krüger <mkg20001@gmail.com>", "Maciej Krüger <mkg20001@gmail.com>",
"Michael Garvin <gar+gh@danger.computer>", "Michael Garvin <gar+gh@danger.computer>",
"Pedro Teixeira <i@pgte.me>", "Pedro Teixeira <i@pgte.me>",

View File

@ -4,11 +4,9 @@
const PeerId = require('./index.js') const PeerId = require('./index.js')
PeerId.create((err, id) => { async function main () {
if (err) { const id = await PeerId.create()
throw err console.log(JSON.stringify(id.toJSON(), null, 2)) // eslint-disable-line no-console
} }
// eslint-disable-next-line main()
console.log(JSON.stringify(id.toJSON(), null, 2))
})

View File

@ -7,7 +7,6 @@
const mh = require('multihashes') const mh = require('multihashes')
const cryptoKeys = require('libp2p-crypto/src/keys') const cryptoKeys = require('libp2p-crypto/src/keys')
const assert = require('assert') const assert = require('assert')
const waterfall = require('async/waterfall')
const withIs = require('class-is') const withIs = require('class-is')
class PeerId { class PeerId {
@ -119,185 +118,111 @@ class PeerId {
/* /*
* Check if this PeerId instance is valid (privKey -> pubKey -> Id) * Check if this PeerId instance is valid (privKey -> pubKey -> Id)
*/ */
isValid (callback) { isValid () {
// TODO Needs better checking // TODO: needs better checking
if (this.privKey && return Boolean(this.privKey &&
this.privKey.public && this.privKey.public &&
this.privKey.public.bytes && this.privKey.public.bytes &&
Buffer.isBuffer(this.pubKey.bytes) && Buffer.isBuffer(this.pubKey.bytes) &&
this.privKey.public.bytes.equals(this.pubKey.bytes)) { this.privKey.public.bytes.equals(this.pubKey.bytes))
callback()
} else {
callback(new Error('Keys not match'))
}
} }
} }
const PeerIdWithIs = withIs(PeerId, { className: 'PeerId', symbolName: '@libp2p/js-peer-id/PeerId' }) const PeerIdWithIs = withIs(PeerId, {
className: 'PeerId',
symbolName: '@libp2p/js-peer-id/PeerId'
})
exports = module.exports = PeerIdWithIs exports = module.exports = PeerIdWithIs
const computeDigest = (pubKey, cb) => {
if (pubKey.bytes.length <= 42) {
const digest = mh.encode(pubKey.bytes, 'identity')
cb(null, digest)
} else {
pubKey.hash((err, digest) => {
cb(err, digest)
})
}
}
const computePeerId = (privKey, pubKey, cb) => {
computeDigest(pubKey, (err, digest) => {
if (err != null) {
cb(err)
} else {
cb(null, new PeerIdWithIs(digest, privKey, pubKey))
}
})
}
// generation // generation
exports.create = function (opts, callback) { exports.create = async (opts) => {
if (typeof opts === 'function') {
callback = opts
opts = {}
}
opts = opts || {} opts = opts || {}
opts.bits = opts.bits || 2048 opts.bits = opts.bits || 2048
opts.keyType = opts.keyType || 'RSA'
cryptoKeys.generateKeyPair(opts.keyType, opts.bits, (err, privKey) => { const key = await cryptoKeys.generateKeyPair('RSA', opts.bits)
if (err != null) { const digest = await key.public.hash()
callback(err)
} else { return new PeerIdWithIs(digest, key)
computePeerId(privKey, privKey.public, callback)
}
})
} }
exports.createFromHexString = function (str) { exports.createFromHexString = (str) => {
return new PeerIdWithIs(mh.fromHexString(str)) return new PeerIdWithIs(mh.fromHexString(str))
} }
exports.createFromBytes = function (buf) { exports.createFromBytes = (buf) => {
return new PeerIdWithIs(buf) return new PeerIdWithIs(buf)
} }
exports.createFromB58String = function (str) { exports.createFromB58String = (str) => {
return new PeerIdWithIs(mh.fromB58String(str)) return new PeerIdWithIs(mh.fromB58String(str))
} }
// Public Key input will be a buffer // Public Key input will be a buffer
exports.createFromPubKey = function (key, callback) { exports.createFromPubKey = async (key) => {
if (typeof callback !== 'function') { let buf = key
throw new Error('callback is required')
if (typeof buf === 'string') {
buf = Buffer.from(key, 'base64')
} }
let pubKey if (!Buffer.isBuffer(buf)) {
throw new Error('Supplied key is neither a base64 string nor a buffer')
try {
let buf = key
if (typeof buf === 'string') {
buf = Buffer.from(key, 'base64')
}
if (!Buffer.isBuffer(buf)) throw new Error('Supplied key is neither a base64 string nor a buffer')
pubKey = cryptoKeys.unmarshalPublicKey(buf)
} catch (err) {
return callback(err)
} }
computePeerId(null, pubKey, callback) const pubKey = await cryptoKeys.unmarshalPublicKey(buf)
const digest = await pubKey.hash()
return new PeerIdWithIs(digest, null, pubKey)
} }
// Private key input will be a string // Private key input will be a string
exports.createFromPrivKey = function (key, callback) { exports.createFromPrivKey = async (key) => {
if (typeof callback !== 'function') {
throw new Error('callback is required')
}
let buf = key let buf = key
try { if (typeof buf === 'string') {
if (typeof buf === 'string') { buf = Buffer.from(key, 'base64')
buf = Buffer.from(key, 'base64')
}
if (!Buffer.isBuffer(buf)) throw new Error('Supplied key is neither a base64 string nor a buffer')
} catch (err) {
return callback(err)
} }
cryptoKeys.unmarshalPrivateKey(buf, (err, privKey) => { if (!Buffer.isBuffer(buf)) {
if (err != null) { throw new Error('Supplied key is neither a base64 string nor a buffer')
callback(err) }
} else {
computePeerId(privKey, privKey.public, callback) const privKey = await cryptoKeys.unmarshalPrivateKey(buf)
} const digest = await privKey.public.hash()
})
return new PeerIdWithIs(digest, privKey, privKey.public)
} }
exports.createFromJSON = function (obj, callback) { exports.createFromJSON = async (obj) => {
if (typeof callback !== 'function') { let id = mh.fromB58String(obj.id)
throw new Error('callback is required') let rawPrivKey = obj.privKey && Buffer.from(obj.privKey, 'base64')
} let rawPubKey = obj.pubKey && Buffer.from(obj.pubKey, 'base64')
let pub = rawPubKey && await cryptoKeys.unmarshalPublicKey(rawPubKey)
let id
let rawPrivKey
let rawPubKey
let pub
try {
id = mh.fromB58String(obj.id)
rawPrivKey = obj.privKey && Buffer.from(obj.privKey, 'base64')
rawPubKey = obj.pubKey && Buffer.from(obj.pubKey, 'base64')
pub = rawPubKey && cryptoKeys.unmarshalPublicKey(rawPubKey)
} catch (err) {
return callback(err)
}
if (!rawPrivKey) { if (!rawPrivKey) {
callback(null, new PeerIdWithIs(id, null, pub)) return new PeerIdWithIs(id, null, pub)
return
} }
waterfall([ const privKey = await cryptoKeys.unmarshalPrivateKey(rawPrivKey)
(cb) => cryptoKeys.unmarshalPrivateKey(rawPrivKey, cb), const privDigest = await privKey.public.hash()
(priv, cb) => { let pubDigest
computeDigest(priv.public, (err, digest) => {
cb(err, digest, priv)
})
},
(privDigest, priv, cb) => {
if (pub) {
computeDigest(pub, (err, pubDigest) => {
cb(err, privDigest, priv, pubDigest)
})
} else {
cb(null, privDigest, priv)
}
}
], (err, privDigest, priv, pubDigest) => {
if (err) {
return callback(err)
}
if (pub && !privDigest.equals(pubDigest)) { if (pub) {
return callback(new Error('Public and private key do not match')) pubDigest = await pub.hash()
} }
if (id && !privDigest.equals(id)) { if (pub && !privDigest.equals(pubDigest)) {
return callback(new Error('Id and private key do not match')) throw new Error('Public and private key do not match')
} }
callback(null, new PeerIdWithIs(id, priv, pub)) if (id && !privDigest.equals(id)) {
}) throw new Error('Id and private key do not match')
}
return new PeerIdWithIs(id, privKey, pub)
} }
exports.isPeerId = function (peerId) { exports.isPeerId = (peerId) => {
return Boolean(typeof peerId === 'object' && return Boolean(typeof peerId === 'object' &&
peerId._id && peerId._id &&
peerId._idB58String) peerId._idB58String)

View File

@ -8,8 +8,6 @@ chai.use(dirtyChai)
const expect = chai.expect 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 waterfall = require('async/waterfall')
const PeerId = require('../src') const PeerId = require('../src')
@ -33,43 +31,24 @@ describe('PeerId', () => {
expect(PeerId).to.throw(Error) expect(PeerId).to.throw(Error)
}) })
it('create a new id', (done) => { it('create a new id', async () => {
PeerId.create(testOpts, (err, id) => { const id = await PeerId.create(testOpts)
expect(err).to.not.exist() expect(id.toB58String().length).to.equal(46)
expect(id.toB58String().length).to.equal(46)
done()
})
}) })
it('can be created for a Secp256k1 key', (done) => { it('isPeerId', async () => {
PeerId.create({ keyType: 'secp256k1', bits: 256 }, (err, id) => { const id = await PeerId.create(testOpts)
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity')) expect(PeerId.isPeerId(id)).to.equal(true)
expect(err).to.not.exist() expect(PeerId.isPeerId('aaa')).to.equal(false)
expect(id.toB58String()).to.equal(expB58) expect(PeerId.isPeerId(Buffer.from('batatas'))).to.equal(false)
done()
})
}) })
it('isPeerId', (done) => { it('throws on changing the id', async () => {
PeerId.create(testOpts, (err, id) => { const id = await PeerId.create(testOpts)
expect(err).to.not.exist() expect(id.toB58String().length).to.equal(46)
expect(PeerId.isPeerId(id)).to.equal(true) expect(() => {
expect(PeerId.isPeerId('aaa')).to.equal(false) id.id = Buffer.from('hello')
expect(PeerId.isPeerId(Buffer.from('batatas'))).to.equal(false) }).to.throw(/immutable/)
done()
})
})
it('throws on changing the id', function (done) {
this.timeout(10000)
PeerId.create(testOpts, (err, id) => {
expect(err).to.not.exist()
expect(id.toB58String().length).to.equal(46)
expect(() => {
id.id = Buffer.from('hello')
}).to.throw(/immutable/)
done()
})
}) })
it('recreate an Id from Hex string', () => { it('recreate an Id from Hex string', () => {
@ -87,104 +66,44 @@ describe('PeerId', () => {
expect(testIdB58String).to.equal(id.toB58String()) expect(testIdB58String).to.equal(id.toB58String())
}) })
it('Recreate from a Public Key', (done) => { it('Recreate from a Public Key', async () => {
PeerId.createFromPubKey(testId.pubKey, (err, id) => { const id = await PeerId.createFromPubKey(testId.pubKey)
expect(err).to.not.exist() expect(testIdB58String).to.equal(id.toB58String())
expect(testIdB58String).to.equal(id.toB58String())
done()
})
}) })
it('can be created from a Secp256k1 public key', (done) => { it('Recreate from a Private Key', async () => {
waterfall([ const id = await PeerId.createFromPrivKey(testId.privKey)
(cb) => { expect(testIdB58String).to.equal(id.toB58String())
crypto.keys.generateKeyPair('secp256k1', 256, cb) const encoded = Buffer.from(testId.privKey, 'base64')
}, const id2 = await PeerId.createFromPrivKey(encoded)
(privKey, cb) => { expect(testIdB58String).to.equal(id2.toB58String())
PeerId.createFromPubKey(privKey.public.bytes, cb) expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey())
}
], (err, id) => {
expect(err).to.not.exist()
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
done()
})
}) })
it('Recreate from a Private Key', (done) => { it('Compare generated ID with one created from PubKey', async () => {
PeerId.createFromPrivKey(testId.privKey, (err, id) => { const id1 = await PeerId.create(testOpts)
expect(err).to.not.exist() const id2 = await PeerId.createFromPubKey(id1.marshalPubKey())
expect(testIdB58String).to.equal(id.toB58String()) expect(id1.id).to.be.eql(id2.id)
const encoded = Buffer.from(testId.privKey, 'base64')
PeerId.createFromPrivKey(encoded, (err, id2) => {
expect(err).to.not.exist()
expect(testIdB58String).to.equal(id2.toB58String())
expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey())
done()
})
})
}) })
it('can be created from a Secp256k1 private key', (done) => { it('Works with default options', async function () {
waterfall([
(cb) => {
crypto.keys.generateKeyPair('secp256k1', 256, cb)
},
(privKey, cb) => {
PeerId.createFromPrivKey(privKey.bytes, cb)
}
], (err, id) => {
expect(err).to.not.exist()
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
done()
})
})
it('Compare generated ID with one created from PubKey', (done) => {
PeerId.create(testOpts, (err, id1) => {
expect(err).to.not.exist()
PeerId.createFromPubKey(id1.marshalPubKey(), (err, id2) => {
expect(err).to.not.exist()
expect(id1.id).to.be.eql(id2.id)
done()
})
})
})
it('Works with default options', function (done) {
this.timeout(10000) this.timeout(10000)
PeerId.create((err, id) => { const id = await PeerId.create()
expect(err).to.not.exist() expect(id.toB58String().length).to.equal(46)
expect(id.toB58String().length).to.equal(46)
done()
})
}) })
it('Non-default # of bits', function (done) { it('Non-default # of bits', async function () {
this.timeout(1000 * 60) this.timeout(1000 * 60)
PeerId.create(testOpts, (err, shortId) => { const shortId = await PeerId.create(testOpts)
expect(err).to.not.exist() const longId = await PeerId.create({ bits: 1024 })
PeerId.create({ bits: 1024 }, (err, longId) => { expect(shortId.privKey.bytes.length).is.below(longId.privKey.bytes.length)
expect(err).to.not.exist()
expect(shortId.privKey.bytes.length).is.below(longId.privKey.bytes.length)
done()
})
})
}) })
it('Pretty printing', (done) => { it('Pretty printing', async () => {
PeerId.create(testOpts, (err, id1) => { const id1 = await PeerId.create(testOpts)
expect(err).to.not.exist() const id2 = await PeerId.createFromPrivKey((id1.toJSON()).privKey)
PeerId.createFromPrivKey(id1.toJSON().privKey, (err, id2) => { expect(id1.toPrint()).to.be.eql(id2.toPrint())
expect(err).to.not.exist() expect(id1.toPrint()).to.equal('<peer.ID ' + id1.toB58String().substr(2, 6) + '>')
expect(id1.toPrint()).to.be.eql(id2.toPrint())
expect(id1.toPrint()).to.equal('<peer.ID ' + id1.toB58String().substr(2, 6) + '>')
done()
})
})
}) })
it('toBytes', () => { it('toBytes', () => {
@ -192,120 +111,88 @@ 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) => { it('isEqual', async () => {
parallel([ const ids = await Promise.all([
(cb) => PeerId.create(testOpts, cb), PeerId.create(testOpts),
(cb) => PeerId.create(testOpts, cb) PeerId.create(testOpts)
], (err, ids) => { ])
expect(err).to.not.exist()
expect(ids[0].isEqual(ids[0])).to.equal(true) expect(ids[0].isEqual(ids[0])).to.equal(true)
expect(ids[0].isEqual(ids[1])).to.equal(false) expect(ids[0].isEqual(ids[1])).to.equal(false)
expect(ids[0].isEqual(ids[0].id)).to.equal(true) expect(ids[0].isEqual(ids[0].id)).to.equal(true)
expect(ids[0].isEqual(ids[1].id)).to.equal(false) expect(ids[0].isEqual(ids[1].id)).to.equal(false)
done()
})
}) })
describe('fromJSON', () => { describe('fromJSON', () => {
it('full node', (done) => { it('full node', async () => {
PeerId.create(testOpts, (err, id) => { const id = await PeerId.create(testOpts)
expect(err).to.not.exist() const other = await PeerId.createFromJSON(id.toJSON())
expect(id.toB58String()).to.equal(other.toB58String())
PeerId.createFromJSON(id.toJSON(), (err, other) => { expect(id.privKey.bytes).to.eql(other.privKey.bytes)
expect(err).to.not.exist() expect(id.pubKey.bytes).to.eql(other.pubKey.bytes)
expect(id.toB58String()).to.equal(other.toB58String())
expect(id.privKey.bytes).to.eql(other.privKey.bytes)
expect(id.pubKey.bytes).to.eql(other.pubKey.bytes)
done()
})
})
}) })
it('only id', (done) => { it('only id', async () => {
crypto.keys.generateKeyPair('RSA', 1024, (err, key) => { const key = await crypto.keys.generateKeyPair('RSA', 1024)
expect(err).to.not.exist() const digest = await key.public.hash()
key.public.hash((err, digest) => { const id = PeerId.createFromBytes(digest)
expect(err).to.not.exist() expect(id.privKey).to.not.exist()
expect(id.pubKey).to.not.exist()
const id = PeerId.createFromBytes(digest) const other = await PeerId.createFromJSON(id.toJSON())
expect(id.privKey).to.not.exist() expect(id.toB58String()).to.equal(other.toB58String())
expect(id.pubKey).to.not.exist()
PeerId.createFromJSON(id.toJSON(), (err, other) => {
expect(err).to.not.exist()
expect(id.toB58String()).to.equal(other.toB58String())
done()
})
})
})
}) })
it('go interop', (done) => { it('go interop', async () => {
PeerId.createFromJSON(goId, (err, id) => { const id = await PeerId.createFromJSON(goId)
expect(err).to.not.exist() const digest = await id.privKey.public.hash()
id.privKey.public.hash((err, digest) => { expect(mh.toB58String(digest)).to.eql(goId.id)
expect(err).to.not.exist()
expect(mh.toB58String(digest)).to.eql(goId.id)
done()
})
})
}) })
}) })
it('set privKey (valid)', (done) => { it('set privKey (valid)', async () => {
PeerId.create(testOpts, (err, peerId) => { const peerId = await PeerId.create(testOpts)
expect(err).to.not.exist() peerId.privKey = peerId._privKey
peerId.privKey = peerId._privKey expect(peerId.isValid()).to.equal(true)
peerId.isValid(done)
})
}) })
it('set pubKey (valid)', (done) => { it('set pubKey (valid)', async () => {
PeerId.create(testOpts, (err, peerId) => { const peerId = await PeerId.create(testOpts)
expect(err).to.not.exist() peerId.pubKey = peerId._pubKey
peerId.pubKey = peerId._pubKey expect(peerId.isValid()).to.equal(true)
peerId.isValid(done)
})
}) })
it('set privKey (invalid)', (done) => { it('set privKey (invalid)', async () => {
PeerId.create(testOpts, (err, peerId) => { const peerId = await PeerId.create(testOpts)
expect(err).to.not.exist() peerId.privKey = Buffer.from('bufff')
peerId.privKey = Buffer.from('bufff') expect(peerId.isValid()).to.equal(false)
peerId.isValid((err) => {
expect(err).to.exist()
done()
})
})
}) })
it('set pubKey (invalid)', (done) => { it('set pubKey (invalid)', async () => {
PeerId.create(testOpts, (err, peerId) => { const peerId = await PeerId.create(testOpts)
expect(err).to.not.exist() peerId.pubKey = Buffer.from('bufff')
peerId.pubKey = Buffer.from('buffff') expect(peerId.isValid()).to.equal(false)
peerId.isValid((err) => {
expect(err).to.exist()
done()
})
})
}) })
describe('returns error via cb instead of crashing', () => { describe('returns error via cb instead of crashing', () => {
const garbage = [Buffer.from('00010203040506070809', 'hex'), {}, null, false, undefined, true, 1, 0, Buffer.from(''), 'aGVsbG93b3JsZA==', 'helloworld', ''] const garbage = [
Buffer.from('00010203040506070809', 'hex'),
{}, null, false, undefined, true, 1, 0,
Buffer.from(''), 'aGVsbG93b3JsZA==', 'helloworld', ''
]
const fncs = ['createFromPubKey', 'createFromPrivKey', 'createFromJSON'] const fncs = ['createFromPubKey', 'createFromPrivKey', 'createFromJSON']
garbage.forEach(garbage => { for (const gb of garbage) {
fncs.forEach(fnc => { for (const fn of fncs) {
it(fnc + '(' + util.inspect(garbage) + ')', cb => { it(`${fn} (${util.inspect(gb)})`, async () => {
PeerId[fnc](garbage, (err, res) => { try {
await PeerId[fn](gb)
} catch (err) {
expect(err).to.exist() expect(err).to.exist()
expect(res).to.not.exist() }
cb()
})
}) })
}) }
}) }
}) })
describe('throws on inconsistent data', () => { describe('throws on inconsistent data', () => {
@ -313,37 +200,30 @@ describe('PeerId', () => {
let k2 let k2
let k3 let k3
before((done) => { before(async () => {
parallel([ const keys = await Promise.all([
(cb) => crypto.keys.generateKeyPair('RSA', 512, cb), crypto.keys.generateKeyPair('RSA', 512),
(cb) => crypto.keys.generateKeyPair('RSA', 512, cb), crypto.keys.generateKeyPair('RSA', 512),
(cb) => crypto.keys.generateKeyPair('RSA', 512, cb) crypto.keys.generateKeyPair('RSA', 512)
], (err, keys) => { ])
expect(err).to.not.exist()
k1 = keys[0] k1 = keys[0]
k2 = keys[1] k2 = keys[1]
k3 = keys[2] k3 = keys[2]
done()
})
}) })
it('missmatch private - public key', (done) => { it('missmatch private - public key', async () => {
k1.public.hash((err, digest) => { const digest = await k1.public.hash()
expect(err).to.not.exist() expect(() => {
expect(() => new PeerId(digest, k1, k2.public)) new PeerId(digest, k1, k2.public) // eslint-disable-line no-new
.to.throw(/inconsistent arguments/) }).to.throw(/inconsistent arguments/)
done()
})
}) })
it('missmatch id - private - public key', (done) => { it('missmatch id - private - public key', async () => {
k1.public.hash((err, digest) => { const digest = await k1.public.hash()
expect(err).to.not.exist() expect(() => {
expect(() => new PeerId(digest, k1, k3.public)) new PeerId(digest, k1, k3.public) // eslint-disable-line no-new
.to.throw(/inconsistent arguments/) }).to.throw(/inconsistent arguments/)
done()
})
}) })
it('invalid id', () => { it('invalid id', () => {