UNPKG

identifi-lib

Version:

Basic tools for reading and writing Identifi messages and identities.

146 lines (114 loc) 3.68 kB
'use strict'; exports.__esModule = true; var _util = require('./util'); var _util2 = _interopRequireDefault(_util); var _gun = require('gun'); var _gun2 = _interopRequireDefault(_gun); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /*eslint no-useless-escape: "off", camelcase: "off" */ var myKey = void 0; /** * Key management utils */ var Key = function () { function Key() { _classCallCheck(this, Key); } /** * Load default key from datadir/private.key on node.js or from local storage 'identifi.myKey' in browser. * * If default key does not exist, it is generated. * @param {string} datadir directory to find key from. In browser, localStorage is used instead. * @returns {Promise(Object)} keypair object */ Key.getDefault = async function getDefault() { var datadir = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.'; if (myKey) { return myKey; } if (_util2.default.isNode) { var fs = require('fs'); var privKeyFile = datadir + '/private.key'; if (fs.existsSync(privKeyFile)) { var f = fs.readFileSync(privKeyFile, 'utf8'); myKey = Key.fromJwk(f); } else { myKey = await Key.generate(); fs.writeFileSync(privKeyFile, Key.toJwk(myKey)); fs.chmodSync(privKeyFile, 400); } if (!myKey) { throw new Error('loading default key failed - check ' + datadir + '/private.key'); } } else { var jwk = window.localStorage.getItem('identifi.myKey'); if (jwk) { myKey = Key.fromJwk(jwk); } else { myKey = await Key.generate(); window.localStorage.setItem('identifi.myKey', Key.toJwk(myKey)); } if (!myKey) { throw new Error('loading default key failed - check localStorage identifi.myKey'); } } return myKey; }; /** * Serialize key as JSON Web key * @param {Object} key key to serialize * @returns {String} JSON Web Key string */ Key.toJwk = function toJwk(key) { return JSON.stringify(key); }; /** * Get keyID * @param {Object} key key to get an id for. Currently just returns the public key string. * @returns {String} JSON Web Key string */ Key.getId = function getId(key) { if (!(key && key.pub)) { throw new Error('missing param'); } return key.pub; // hack until GUN supports lookups by keyID //return util.getHash(key.pub); }; /** * Get a keypair from a JSON Web Key object. * @param {Object} jwk JSON Web Key * @returns {String} */ Key.fromJwk = function fromJwk(jwk) { return JSON.parse(jwk); }; /** * Generate a new keypair * @returns {Promise(Object)} Gun.SEA keypair object */ Key.generate = function generate() { return _gun2.default.SEA.pair(); }; /** * Sign a message * @param {String} msg message to sign * @param {Object} pair signing keypair * @returns {Promise(String)} signed message string */ Key.sign = async function sign(msg, pair) { var sig = await _gun2.default.SEA.sign(msg, pair); return 'a' + sig; }; /** * Verify a signed message * @param {String} msg message to verify * @param {Object} pubKey public key of the signer * @returns {Promise(String)} signature string */ Key.verify = function verify(msg, pubKey) { return _gun2.default.SEA.verify(msg.slice(1), pubKey); }; return Key; }(); exports.default = Key; module.exports = exports['default'];