UNPKG

@walletpack/core

Version:

> TODO: description

642 lines (535 loc) 20.7 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _Blockchains = require("../../models/Blockchains"); var _PluginRepository = _interopRequireDefault(require("../../plugins/PluginRepository")); var Actions = _interopRequireWildcard(require("../../store/constants")); var _Crypto = _interopRequireDefault(require("../../util/Crypto")); var _Keypair = _interopRequireDefault(require("../../models/Keypair")); var _HardwareService = _interopRequireDefault(require("./HardwareService")); var _StoreService = _interopRequireDefault(require("../utility/StoreService")); var _IdGenerator = _interopRequireDefault(require("../../util/IdGenerator")); var _Seeder = _interopRequireDefault(require("./Seeder")); var _publicToPrivate2; var KeyPairService = /*#__PURE__*/ function () { function KeyPairService() { (0, _classCallCheck2["default"])(this, KeyPairService); } (0, _createClass2["default"])(KeyPairService, null, [{ key: "init", value: function init(_publicToPrivate) { _publicToPrivate2 = _publicToPrivate; } }, { key: "getImportedKeyBlockchains", value: function getImportedKeyBlockchains(privateKey) { var blockchains = []; _Blockchains.BlockchainsArray.map(function (blockchainKV) { try { var plugin = _PluginRepository["default"].plugin(blockchainKV.value); if (plugin.validPrivateKey(privateKey)) blockchains.push(blockchainKV.value); } catch (e) {} }); return blockchains; } }, { key: "isValidPrivateKey", value: function isValidPrivateKey(keypair) { return !!this.getImportedKeyBlockchains(keypair.privateKey).length; } }, { key: "convertHexPrivateToBuffer", value: function convertHexPrivateToBuffer(keypair) { if (typeof keypair.privateKey !== 'string') return false; var buffered = false; _Blockchains.BlockchainsArray.map(function (blockchainKV) { if (buffered) return; try { var plugin = _PluginRepository["default"].plugin(blockchainKV.value); if (plugin.validPrivateKey(keypair.privateKey)) { keypair.privateKey = plugin.hexPrivateToBuffer(keypair.privateKey); buffered = true; } } catch (e) {} }); } /*** * Tries to make a keypair in place from a private key * @param keypair */ }, { key: "makePublicKeys", value: function () { var _makePublicKeys = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee(keypair) { var _this = this; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: keypair.publicKeys = []; return _context.abrupt("return", Promise.all(_Blockchains.BlockchainsArray.map(function (blockchainKV) { return _this.addPublicKey(keypair, blockchainKV.value); }))); case 2: case "end": return _context.stop(); } } }, _callee); })); function makePublicKeys(_x) { return _makePublicKeys.apply(this, arguments); } return makePublicKeys; }() }, { key: "addPublicKey", value: function () { var _addPublicKey = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee2(keypair, blockchain) { var allowDecryption, seed, plugin, p, _args2 = arguments; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: allowDecryption = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : false; if (!keypair.publicKeys.find(function (x) { return x.blockchain === blockchain; })) { _context2.next = 3; break; } return _context2.abrupt("return", true); case 3: if (!(keypair.isEncrypted() && !allowDecryption)) { _context2.next = 7; break; } return _context2.abrupt("return", false); case 7: if (!(keypair.isEncrypted() && allowDecryption)) { _context2.next = 12; break; } _context2.next = 10; return _Seeder["default"].getSeed(); case 10: seed = _context2.sent; keypair.decrypt(seed); case 12: _context2.prev = 12; plugin = _PluginRepository["default"].plugin(blockchain); p = keypair.privateKey; if (typeof p !== 'string') p = plugin.bufferToHexPrivate(p); keypair.publicKeys.push({ blockchain: blockchain, key: plugin.privateToPublic(p, keypair.fork) }); _context2.next = 23; break; case 19: _context2.prev = 19; _context2.t0 = _context2["catch"](12); console.log('err', _context2.t0); return _context2.abrupt("return", false); case 23: return _context2.abrupt("return", true); case 24: case "end": return _context2.stop(); } } }, _callee2, null, [[12, 19]]); })); function addPublicKey(_x2, _x3) { return _addPublicKey.apply(this, arguments); } return addPublicKey; }() }, { key: "generateKeyPair", value: function () { var _generateKeyPair = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee3(keypair) { return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return _Crypto["default"].generatePrivateKey(); case 2: keypair.privateKey = _context3.sent; return _context3.abrupt("return", true); case 4: case "end": return _context3.stop(); } } }, _callee3); })); function generateKeyPair(_x4) { return _generateKeyPair.apply(this, arguments); } return generateKeyPair; }() }, { key: "convertKey", value: function convertKey(keypair, blockchain) { var clone = keypair.clone(); clone.id = _IdGenerator["default"].text(24); clone.name = "".concat((0, _Blockchains.blockchainName)(blockchain), " copy of ").concat(keypair.name); clone.blockchains = [blockchain]; clone.createdAt = +new Date(); return clone; } }, { key: "saveKeyPair", value: function () { var _saveKeyPair = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee4(keypair) { var scatter; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: if (!keypair.name.length) keypair.name = "Key-".concat(_IdGenerator["default"].text(8)); if (keypair.isUnique()) { _context4.next = 3; break; } return _context4.abrupt("return", { error: "Keypair already exists." }); case 3: scatter = _StoreService["default"].get().state.scatter.clone(); scatter.keychain.keypairs.push(_Keypair["default"].fromJson(keypair)); return _context4.abrupt("return", _StoreService["default"].get().dispatch(Actions.SET_SCATTER, scatter)); case 6: case "end": return _context4.stop(); } } }, _callee4); })); function saveKeyPair(_x5) { return _saveKeyPair.apply(this, arguments); } return saveKeyPair; }() }, { key: "updateKeyPair", value: function () { var _updateKeyPair = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee5(keypair) { var scatter; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: if (keypair.name.length) { _context5.next = 2; break; } return _context5.abrupt("return"); case 2: scatter = _StoreService["default"].get().state.scatter.clone(); scatter.keychain.keypairs.find(function (x) { return x.unique() === keypair.unique(); }).name = keypair.name; scatter.keychain.keypairs.find(function (x) { return x.unique() === keypair.unique(); }).blockchains = keypair.blockchains; return _context5.abrupt("return", _StoreService["default"].get().dispatch(Actions.SET_SCATTER, scatter)); case 6: case "end": return _context5.stop(); } } }, _callee5); })); function updateKeyPair(_x6) { return _updateKeyPair.apply(this, arguments); } return updateKeyPair; }() }, { key: "removeKeyPair", value: function () { var _removeKeyPair = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee6(keypair) { var scatter; return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: scatter = _StoreService["default"].get().state.scatter.clone(); scatter.keychain.removeKeyPair(keypair); return _context6.abrupt("return", _StoreService["default"].get().dispatch(Actions.SET_SCATTER, scatter)); case 3: case "end": return _context6.stop(); } } }, _callee6); })); function removeKeyPair(_x7) { return _removeKeyPair.apply(this, arguments); } return removeKeyPair; }() }, { key: "getKeyPairFromPublicKey", value: function getKeyPairFromPublicKey(publicKey) { var keypair = _StoreService["default"].get().state.scatter.keychain.keypairs.find(function (x) { return x.publicKeys.find(function (k) { return k.key === publicKey; }); }); if (keypair) return keypair.clone(); var identity = _StoreService["default"].get().state.scatter.keychain.identities.find(function (x) { return x.publicKey === publicKey; }); if (identity) { return _Keypair["default"].fromJson({ name: identity.name, publicKeys: [{ blockchain: 'eos', key: publicKey }], privateKey: identity.privateKey }); } return null; } }, { key: "publicToPrivate", value: function () { var _publicToPrivate3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee7(publicKey) { var p, keypair; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: if (!_publicToPrivate2) { _context7.next = 6; break; } _context7.next = 3; return _publicToPrivate2(publicKey); case 3: p = _context7.sent; if (!(p !== false)) { _context7.next = 6; break; } return _context7.abrupt("return", p); case 6: keypair = this.getKeyPairFromPublicKey(publicKey, true); _context7.t0 = keypair; _context7.next = 10; return _Seeder["default"].getSeed(); case 10: _context7.t1 = _context7.sent; _context7.t0.decrypt.call(_context7.t0, _context7.t1); if (!keypair) { _context7.next = 14; break; } return _context7.abrupt("return", keypair.privateKey); case 14: return _context7.abrupt("return", null); case 15: case "end": return _context7.stop(); } } }, _callee7, this); })); function publicToPrivate(_x8) { return _publicToPrivate3.apply(this, arguments); } return publicToPrivate; }() }, { key: "getHardwareKeyList", value: function () { var _getHardwareKeyList = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee9(external) { var _this2 = this; var delta, tries, _args9 = arguments; return _regenerator["default"].wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: delta = _args9.length > 1 && _args9[1] !== undefined ? _args9[1] : 0; tries = _args9.length > 2 && _args9[2] !== undefined ? _args9[2] : 0; if (!(typeof external["interface"].getAddress !== 'function')) { _context9.next = 4; break; } return _context9.abrupt("return", false); case 4: if (!(tries >= 5)) { _context9.next = 6; break; } return _context9.abrupt("return", false); case 6: return _context9.abrupt("return", external["interface"].getAddress(delta)["catch"]( /*#__PURE__*/ function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee8(err) { return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: if (!(err.toString().match('CLA_NOT_SUPPORTED') || err.toString().match('Cannot write to HID device'))) { _context8.next = 4; break; } _context8.next = 3; return _HardwareService["default"].openConnections(); case 3: return _context8.abrupt("return", _this2.getHardwareKeyList(external, delta, tries++)); case 4: return _context8.abrupt("return", false); case 5: case "end": return _context8.stop(); } } }, _callee8); })); return function (_x10) { return _ref.apply(this, arguments); }; }())); case 7: case "end": return _context9.stop(); } } }, _callee9); })); function getHardwareKeyList(_x9) { return _getHardwareKeyList.apply(this, arguments); } return getHardwareKeyList; }() }, { key: "loadFromHardware", value: function () { var _loadFromHardware = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee11(keypair) { var _this3 = this; var tries, _args11 = arguments; return _regenerator["default"].wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: tries = _args11.length > 1 && _args11[1] !== undefined ? _args11[1] : 0; if (!(typeof keypair.external["interface"].getPublicKey !== 'function')) { _context11.next = 3; break; } return _context11.abrupt("return", false); case 3: if (!(tries >= 5)) { _context11.next = 5; break; } return _context11.abrupt("return", false); case 5: return _context11.abrupt("return", keypair.external["interface"].getPublicKey().then(function (key) { if (_PluginRepository["default"].plugin(keypair.external.blockchain).validPublicKey(key)) { keypair.external.publicKey = key; keypair.publicKeys.push({ blockchain: keypair.external.blockchain, key: key }); return true; } else return false; })["catch"]( /*#__PURE__*/ function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee10(err) { return _regenerator["default"].wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: if (!err.toString().match('Cannot write to HID device')) { _context10.next = 4; break; } _context10.next = 3; return _HardwareService["default"].openConnections(); case 3: return _context10.abrupt("return", _this3.loadFromHardware(keypair, tries++)); case 4: return _context10.abrupt("return", false); case 5: case "end": return _context10.stop(); } } }, _callee10); })); return function (_x12) { return _ref2.apply(this, arguments); }; }())); case 6: case "end": return _context11.stop(); } } }, _callee11); })); function loadFromHardware(_x11) { return _loadFromHardware.apply(this, arguments); } return loadFromHardware; }() }, { key: "isHardware", value: function isHardware(publicKey) { var keypair = this.getKeyPairFromPublicKey(publicKey); if (!keypair) throw new Error('Keypair doesnt exist on keychain'); return keypair.external !== null; } }]); return KeyPairService; }(); exports["default"] = KeyPairService;