mirror of
https://github.com/fluencelabs/js-peer-id
synced 2025-06-21 05:51:36 +00:00
Merge pull request #24 from diasdavid/feat/marshal-unmarshal
Feat/marshal unmarshal
This commit is contained in:
@ -3,6 +3,7 @@
|
|||||||
"version": "0.6.6",
|
"version": "0.6.6",
|
||||||
"description": "IPFS Peer Id implementation in Node.js",
|
"description": "IPFS Peer Id implementation in Node.js",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
|
"bin": "src/bin.js",
|
||||||
"jsnext:main": "src/index.js",
|
"jsnext:main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "aegir-lint",
|
"lint": "aegir-lint",
|
||||||
@ -31,7 +32,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/diasdavid/js-peer-id",
|
"homepage": "https://github.com/diasdavid/js-peer-id",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"aegir": "^2.1.1",
|
"aegir": "^3.0.4",
|
||||||
"buffer-loader": "0.0.1",
|
"buffer-loader": "0.0.1",
|
||||||
"chai": "^3.5.0",
|
"chai": "^3.5.0",
|
||||||
"pre-commit": "^1.1.2"
|
"pre-commit": "^1.1.2"
|
||||||
@ -46,7 +47,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/diasdavid/js-peer-id.git"
|
"url": "https://github.com/diasdavid/js-peer-id.git"
|
||||||
},
|
},
|
||||||
"dignified": {
|
"aegir": {
|
||||||
"webpack": {
|
"webpack": {
|
||||||
"resolve": {
|
"resolve": {
|
||||||
"alias": {
|
"alias": {
|
||||||
|
7
src/bin.js
Executable file
7
src/bin.js
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/local/bin/node
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const PeerId = require('./index.js')
|
||||||
|
|
||||||
|
console.log(JSON.stringify(PeerId.create().toJSON(), null, ' '))
|
61
src/index.js
61
src/index.js
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Id is an object representation of a peer Id. a peer Id is a multihash
|
* Id is an object representation of a peer Id. a peer Id is a multihash
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
@ -10,17 +11,16 @@ const forge = require('node-forge')
|
|||||||
const protobuf = require('protocol-buffers')
|
const protobuf = require('protocol-buffers')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
|
||||||
// protobuf read from file
|
const pbCrypto = protobuf(fs.readFileSync(path.resolve(__dirname, '../protos/crypto.proto')))
|
||||||
const messages = protobuf(fs.readFileSync(path.resolve(__dirname, '../protos/crypto.proto')))
|
|
||||||
|
|
||||||
exports = module.exports = Id
|
exports = module.exports = PeerId
|
||||||
|
|
||||||
exports.Buffer = Buffer
|
exports.Buffer = Buffer
|
||||||
|
|
||||||
function Id (id, privKey, pubKey) {
|
function PeerId (id, privKey, pubKey) {
|
||||||
const self = this
|
const self = this
|
||||||
|
|
||||||
if (!(self instanceof Id)) {
|
if (!(self instanceof PeerId)) {
|
||||||
throw new Error('Id must be called with new')
|
throw new Error('Id must be called with new')
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,6 +37,14 @@ function Id (id, privKey, pubKey) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.toJSON = function () {
|
||||||
|
return {
|
||||||
|
id: self.id.toString('hex'),
|
||||||
|
privKey: self.privKey.toString('hex'),
|
||||||
|
pubKey: self.pubKey.toString('hex')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// encode/decode functions
|
// encode/decode functions
|
||||||
self.toHexString = function () {
|
self.toHexString = function () {
|
||||||
return self.id.toString('hex')
|
return self.id.toString('hex')
|
||||||
@ -52,23 +60,25 @@ function Id (id, privKey, pubKey) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// unwrap the private key protobuf
|
// unwrap the private key protobuf
|
||||||
function unmarshal (key) {
|
function keyUnmarshal (key) {
|
||||||
return messages.PrivateKey.decode(key)
|
return pbCrypto.PrivateKey.decode(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a public key protobuf to be base64 string stored in config
|
// create a public key protobuf to be base64 string stored in config
|
||||||
function marshal (data, type) {
|
function keyMarshal (data, type) {
|
||||||
var epb
|
const RSA = 0
|
||||||
|
|
||||||
|
let epb
|
||||||
if (type === 'Public') {
|
if (type === 'Public') {
|
||||||
epb = messages.PublicKey.encode({
|
epb = pbCrypto.PublicKey.encode({
|
||||||
Type: 0,
|
Type: RSA,
|
||||||
Data: data
|
Data: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'Private') {
|
if (type === 'Private') {
|
||||||
epb = messages.PrivateKey.encode({
|
epb = pbCrypto.PrivateKey.encode({
|
||||||
Type: 0,
|
Type: RSA,
|
||||||
Data: data
|
Data: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -88,10 +98,10 @@ function formatKey (key, type) {
|
|||||||
const nDerBuf = new Buffer(fDerBuf.getBytes(), 'binary')
|
const nDerBuf = new Buffer(fDerBuf.getBytes(), 'binary')
|
||||||
|
|
||||||
// protobuf the new DER bytes to the PublicKey Data: field
|
// protobuf the new DER bytes to the PublicKey Data: field
|
||||||
const marshalKey = marshal(nDerBuf, type)
|
const marsheledKey = keyMarshal(nDerBuf, type)
|
||||||
|
|
||||||
// encode the protobuf public key to base64 string
|
// encode the protobuf public key to base64 string
|
||||||
const b64 = marshalKey.toString('base64')
|
const b64 = marsheledKey.toString('base64')
|
||||||
return b64
|
return b64
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,26 +130,26 @@ exports.create = function (opts) {
|
|||||||
|
|
||||||
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
|
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
|
||||||
|
|
||||||
return new Id(mhId, bufProtoPriv64, bufProtoPub64)
|
return new PeerId(mhId, bufProtoPriv64, bufProtoPub64)
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.createFromHexString = function (str) {
|
exports.createFromHexString = function (str) {
|
||||||
return new Id(new Buffer(str, 'hex'))
|
return new PeerId(new Buffer(str, 'hex'))
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.createFromBytes = function (buf) {
|
exports.createFromBytes = function (buf) {
|
||||||
return new Id(buf)
|
return new PeerId(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.createFromB58String = function (str) {
|
exports.createFromB58String = function (str) {
|
||||||
return new Id(new Buffer(base58.decode(str)))
|
return new PeerId(new Buffer(base58.decode(str)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public Key input will be a buffer
|
// Public Key input will be a buffer
|
||||||
exports.createFromPubKey = function (pubKey) {
|
exports.createFromPubKey = function (pubKey) {
|
||||||
const buf = new Buffer(pubKey, 'base64')
|
const buf = new Buffer(pubKey, 'base64')
|
||||||
const mhId = multihashing(buf, 'sha2-256')
|
const mhId = multihashing(buf, 'sha2-256')
|
||||||
return new Id(mhId, null, pubKey)
|
return new PeerId(mhId, null, pubKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Private key input will be a string
|
// Private key input will be a string
|
||||||
@ -148,7 +158,7 @@ exports.createFromPrivKey = function (privKey) {
|
|||||||
const buf = new Buffer(privKey, 'base64')
|
const buf = new Buffer(privKey, 'base64')
|
||||||
|
|
||||||
// get the private key data from the protobuf
|
// get the private key data from the protobuf
|
||||||
const mpk = unmarshal(buf)
|
const mpk = keyUnmarshal(buf)
|
||||||
|
|
||||||
// create a forge buffer
|
// create a forge buffer
|
||||||
const fbuf = forge.util.createBuffer(mpk.Data.toString('binary'))
|
const fbuf = forge.util.createBuffer(mpk.Data.toString('binary'))
|
||||||
@ -171,5 +181,12 @@ exports.createFromPrivKey = function (privKey) {
|
|||||||
// buffer the public key for consistency before storing
|
// buffer the public key for consistency before storing
|
||||||
const bufProtoPub64 = new Buffer(protoPublic64, 'base64')
|
const bufProtoPub64 = new Buffer(protoPublic64, 'base64')
|
||||||
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
|
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
|
||||||
return new Id(mhId, privKey, bufProtoPub64)
|
return new PeerId(mhId, privKey, bufProtoPub64)
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.createFromJSON = function (obj) {
|
||||||
|
return new PeerId(
|
||||||
|
new Buffer(obj.id, 'hex'),
|
||||||
|
new Buffer(obj.privKey, 'hex'),
|
||||||
|
new Buffer(obj.pubKey, 'hex'))
|
||||||
}
|
}
|
||||||
|
@ -93,4 +93,12 @@ describe('id', function (done) {
|
|||||||
expect(id.toBytes().toString('hex')).to.equal(testIdBytes.toString('hex'))
|
expect(id.toBytes().toString('hex')).to.equal(testIdBytes.toString('hex'))
|
||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('toJSON', (done) => {
|
||||||
|
const id = PeerId.create()
|
||||||
|
expect(id.toB58String()).to.equal(PeerId.createFromJSON(id.toJSON()).toB58String())
|
||||||
|
expect(id.privKey).to.deep.equal(PeerId.createFromJSON(id.toJSON()).privKey)
|
||||||
|
expect(id.pubKey).to.deep.equal(PeerId.createFromJSON(id.toJSON()).pubKey)
|
||||||
|
done()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user