identifi-lib
Version:
Basic tools for reading and writing Identifi messages and identities.
146 lines (114 loc) • 3.68 kB
JavaScript
;
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'];