js-peer-id/src/index.js

187 lines
4.8 KiB
JavaScript
Raw Normal View History

2015-07-08 14:51:49 -07:00
/*
* Id is an object representation of a peer Id. a peer Id is a multihash
*/
var fs = require('fs')
2015-07-08 14:51:49 -07:00
var multihashing = require('multihashing')
var base58 = require('bs58')
2015-11-05 18:51:53 +00:00
var forge = require('node-forge')
var protobuf = require('protocol-buffers')
//protobuf read from file
var messages = protobuf(fs.readFileSync(__dirname+'/crypto.proto'))
2015-07-08 14:51:49 -07:00
exports = module.exports = Id
2015-11-05 17:47:44 +00:00
exports.Buffer = Buffer
2015-07-17 08:14:44 -07:00
function Id (id, privKey, pubKey) {
2015-07-08 14:51:49 -07:00
var self = this
if (!(self instanceof Id)) {
throw new Error('Id must be called with new')
}
self.privKey = privKey
self.pubKey = pubKey
self.id = id // multihash - sha256 - buffer
// pretty print
self.toPrint = function () {
return {
id: self.toB58String(),
2015-07-08 14:51:49 -07:00
privKey: privKey.toString('hex'),
pubKey: pubKey.toString('hex')
}
}
// encode/decode functions
self.toHexString = function () {
return self.id.toString('hex')
}
self.toBytes = function () {
return self.id
}
self.toB58String = function () {
return base58.encode(self.id)
}
}
//unwrap the private key protobuf stream
function unmarshal (key) {
var dpb = messages.PrivateKey.decode(key)
return dpb
2015-11-05 18:51:53 +00:00
}
//create a public key protobuf to be base64 string stored in config
function marshal (data, type) {
if(type == 'Public'){
var epb = messages.PublicKey.encode({
Type: 0,
Data: data
})
}
if(type == 'Private'){
var epb = messages.PrivateKey.encode({
Type: 0,
Data: data
})
}
2015-07-08 14:51:49 -07:00
return epb
}
// generation
2015-07-08 14:51:49 -07:00
exports.create = function () {
//generate keys
var pair = forge.rsa.generateKeyPair({bits:2048, e: 0x10001})
//Create Public Key
//return the RSA public key to asn1 object and DER encode
var asnPub = forge.pki.publicKeyToAsn1(pair.publicKey)
//create der buffer of public key asn.1 object
var derPub = forge.asn1.toDer(asnPub)
//create forge buffer of der public key buffer
var fDerBuf = forge.util.createBuffer(derPub.data, 'binary')
//convert forge buffer to node buffer public key
var nDerBuf = new Buffer(fDerBuf.getBytes(), 'binary')
//protobuf the new DER bytes to the PublicKey Data: field
var marPubKey = marshal(nDerBuf, 'Public')
//encode the protobuf public key to base64 string
var pubKeyb64 = marPubKey.toString('base64')
//create Private Key
//return the RSA private key to asn1 object and DER encode
var asnPriv = forge.pki.privateKeyToAsn1(pair.privateKey)
//create der buffer of private key asn.1 object
var derPriv = forge.asn1.toDer(asnPriv)
//create forge buffer of der private key buffer
var fDerBufPriv = forge.util.createBuffer(derPriv.data, 'binary')
2015-07-08 14:51:49 -07:00
//convert forge buffer to node buffer private key
var nDerBufPriv = new Buffer(fDerBufPriv.getBytes(), 'binary')
2015-07-08 14:51:49 -07:00
//protobuf the new DER bytes to the PrivateKey Data: field
var marPrivKey = marshal(nDerBufPriv, 'Private')
//encode the protobuf private key to base64 string
var privKeyb64 = marPrivKey.toString('base64')
var mhId = multihashing(marPubKey, 'sha2-256')
return new Id(mhId, privKeyb64, pubKeyb64)
2015-07-08 14:51:49 -07:00
}
exports.createFromHexString = function (str) {
return new Id(new Buffer(str), 'hex')
}
exports.createFromBytes = function (buf) {
return new Id(buf)
}
exports.createFromB58String = function (str) {
return new Id(new Buffer(base58.decode(str)))
}
exports.createFromPubKey = function (pubKey) {
var buf = new Buffer(pubKey, 'base64')
2015-07-08 14:51:49 -07:00
var mhId = multihashing(pubKey, 'sha2-256')
return new Id(mhId, null, pubKey)
}
2015-11-05 18:51:53 +00:00
exports.createFromPrivKey = function (privKey) {
//create a buffer from the base64 encoded string
var buf = new Buffer(privKey, 'base64')
//get the private key data from the protobuf
var mpk = unmarshal(buf)
//create a forge buffer
var fbuf = forge.util.createBuffer(mpk.Data.toString('binary'))
//create an asn1 object from the private key bytes saved in the protobuf Data: field
var asnPriv = forge.asn1.fromDer(fbuf)
//get the RSA privatekey data from the asn1 object
var privateKey = forge.pki.privateKeyFromAsn1(asnPriv)
//set the RSA public key to the modulus and exponent of the private key
var publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e)
//return the RSA public to asn1 object and DER encode
var asnPub = forge.pki.publicKeyToAsn1(publicKey)
//create der buffer of public key asn.1 object
var derPub = forge.asn1.toDer(asnPub)
//create forge buffer of der buffer
var fDerBuf = forge.util.createBuffer(derPub.data, 'binary')
//convert forge buffer to node buffer
var nDerBuf = new Buffer(fDerBuf.getBytes(), 'binary')
//protobuf the new DER bytes to the PublicKey Data: field
var marPubKey = marshal(nDerBuf, 'Public')
//encode the protobuf public key to base64 string
var pubKeyb64 = marPubKey.toString('base64')
var mhId = multihashing(marPubKey, 'sha2-256')
return new Id(mhId, privKey, pubKeyb64)
2015-07-08 14:51:49 -07:00
}