feat(peerid): support creating from secp256k1; harmonize algo with Go (#95)

This commit is contained in:
Arve Knudsen
2019-07-11 21:31:39 +02:00
committed by Jacob Heun
parent 989b413a96
commit 17440a3f9a
4 changed files with 44 additions and 14 deletions

View File

@ -57,7 +57,7 @@ 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')
const id = await PeerId.create({ bits: 1024 }) const id = await PeerId.create({ bits: 1024, keyType: 'rsa' })
console.log(JSON.stringify(id.toJSON(), null, 2)) console.log(JSON.stringify(id.toJSON(), null, 2))
``` ```
@ -127,7 +127,7 @@ The key format is detailed in [libp2p-crypto](https://github.com/libp2p/js-libp2
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}` - `opts: Object`: Default: `{bits: 2048, keyType: 'rsa'}`
Returns `Promise<PeerId>`. Returns `Promise<PeerId>`.

View File

@ -42,7 +42,7 @@
"dependencies": { "dependencies": {
"class-is": "^1.1.0", "class-is": "^1.1.0",
"libp2p-crypto": "~0.17.0", "libp2p-crypto": "~0.17.0",
"multihashes": "~0.4.14" "multihashes": "~0.4.15"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -135,15 +135,27 @@ const PeerIdWithIs = withIs(PeerId, {
exports = module.exports = PeerIdWithIs exports = module.exports = PeerIdWithIs
const computeDigest = (pubKey) => {
if (pubKey.bytes.length <= 42) {
return mh.encode(pubKey.bytes, 'identity')
} else {
return pubKey.hash()
}
}
const computePeerId = async (privKey, pubKey) => {
const digest = await computeDigest(pubKey)
return new PeerIdWithIs(digest, privKey, pubKey)
}
// generation // generation
exports.create = async (opts) => { exports.create = async (opts) => {
opts = opts || {} opts = opts || {}
opts.bits = opts.bits || 2048 opts.bits = opts.bits || 2048
opts.keyType = opts.keyType || 'RSA'
const key = await cryptoKeys.generateKeyPair('RSA', opts.bits) const key = await cryptoKeys.generateKeyPair(opts.keyType, opts.bits)
const digest = await key.public.hash() return computePeerId(key, key.public)
return new PeerIdWithIs(digest, key)
} }
exports.createFromHexString = (str) => { exports.createFromHexString = (str) => {
@ -171,8 +183,7 @@ exports.createFromPubKey = async (key) => {
} }
const pubKey = await cryptoKeys.unmarshalPublicKey(buf) const pubKey = await cryptoKeys.unmarshalPublicKey(buf)
const digest = await pubKey.hash() return computePeerId(null, pubKey)
return new PeerIdWithIs(digest, null, pubKey)
} }
// Private key input will be a string // Private key input will be a string
@ -188,9 +199,7 @@ exports.createFromPrivKey = async (key) => {
} }
const privKey = await cryptoKeys.unmarshalPrivateKey(buf) const privKey = await cryptoKeys.unmarshalPrivateKey(buf)
const digest = await privKey.public.hash() return computePeerId(privKey, privKey.public)
return new PeerIdWithIs(digest, privKey, privKey.public)
} }
exports.createFromJSON = async (obj) => { exports.createFromJSON = async (obj) => {
@ -204,11 +213,12 @@ exports.createFromJSON = async (obj) => {
} }
const privKey = await cryptoKeys.unmarshalPrivateKey(rawPrivKey) const privKey = await cryptoKeys.unmarshalPrivateKey(rawPrivKey)
const privDigest = await privKey.public.hash() const privDigest = await computeDigest(privKey.public)
let pubDigest let pubDigest
if (pub) { if (pub) {
pubDigest = await pub.hash() pubDigest = await computeDigest(pub)
} }
if (pub && !privDigest.equals(pubDigest)) { if (pub && !privDigest.equals(pubDigest)) {

View File

@ -36,6 +36,12 @@ describe('PeerId', () => {
expect(id.toB58String().length).to.equal(46) expect(id.toB58String().length).to.equal(46)
}) })
it('can be created for a Secp256k1 key', async () => {
const id = await PeerId.create({ keyType: 'secp256k1', bits: 256 })
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
})
it('isPeerId', async () => { it('isPeerId', async () => {
const id = await PeerId.create(testOpts) const id = await PeerId.create(testOpts)
expect(PeerId.isPeerId(id)).to.equal(true) expect(PeerId.isPeerId(id)).to.equal(true)
@ -80,6 +86,20 @@ describe('PeerId', () => {
expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey()) expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey())
}) })
it('can be created from a Secp256k1 public key', async () => {
const privKey = await crypto.keys.generateKeyPair('secp256k1', 256)
const id = await PeerId.createFromPubKey(privKey.public.bytes)
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
})
it('can be created from a Secp256k1 private key', async () => {
const privKey = await crypto.keys.generateKeyPair('secp256k1', 256)
const id = await PeerId.createFromPrivKey(privKey.bytes)
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
})
it('Compare generated ID with one created from PubKey', async () => { it('Compare generated ID with one created from PubKey', async () => {
const id1 = await PeerId.create(testOpts) const id1 = await PeerId.create(testOpts)
const id2 = await PeerId.createFromPubKey(id1.marshalPubKey()) const id2 = await PeerId.createFromPubKey(id1.marshalPubKey())