Merge pull request #24 from diasdavid/feat/marshal-unmarshal

Feat/marshal unmarshal
This commit is contained in:
David Dias
2016-05-23 15:31:38 +01:00
4 changed files with 57 additions and 24 deletions

View File

@ -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
View File

@ -0,0 +1,7 @@
#!/usr/local/bin/node
'use strict'
const PeerId = require('./index.js')
console.log(JSON.stringify(PeerId.create().toJSON(), null, ' '))

View File

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

View File

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