UNPKG

jcc_wallet

Version:

Toolkit of wallet to manage multiple chains & support multiple keystores for each chain

90 lines 3.95 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.encryptWallet = exports.encryptContact = exports.encrypt = exports.decrypt = void 0; var crypto_1 = __importDefault(require("crypto")); var jcc_common_1 = require("jcc_common"); var keccak_1 = __importDefault(require("keccak")); var randombytes_1 = __importDefault(require("randombytes")); var scryptsy_1 = __importDefault(require("scryptsy")); var constant_1 = require("../constant"); /** * decrypt wallet with password * * @param {string} password * @param {IKeystoreModel} encryptData * @returns {(string)} return secret if success, otherwise throws `keystore is invalid` if the keystore is invalid or * throws `password is wrong` if the password is wrong */ var decrypt = function (password, encryptData) { if ((0, jcc_common_1.isEmptyObject)(encryptData) || (0, jcc_common_1.isEmptyObject)(encryptData.crypto) || (0, jcc_common_1.isEmptyObject)(encryptData.crypto.kdfparams)) { throw new Error(constant_1.KEYSTORE_IS_INVALID); } var iv = Buffer.from(encryptData.crypto.iv, "hex"); var kdfparams = encryptData.crypto.kdfparams; var derivedKey = (0, scryptsy_1.default)(Buffer.from(password), Buffer.from(kdfparams.salt, "hex"), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen); var ciphertext = Buffer.from(encryptData.ciphertext, "hex"); var mac = (0, keccak_1.default)("keccak256") .update(Buffer.concat([derivedKey.slice(16, 32), ciphertext])) .digest(); if (mac.toString("hex") !== encryptData.mac) { throw new Error(constant_1.PASSWORD_IS_WRONG); } var decipher = crypto_1.default.createDecipheriv("aes-128-ctr", derivedKey.slice(0, 16), iv); var seed = Buffer.concat([decipher.update(ciphertext), decipher.final()]); return seed.toString(); }; exports.decrypt = decrypt; /** * encrypt data with password * * @param {string} password * @param {string} data * @param {IEncryptModel} [opts={}] * @returns {IKeystoreModel} */ var encrypt = function (password, data, opts) { var iv = opts.iv || (0, randombytes_1.default)(16).toString("hex"); var kdfparams = { dklen: opts.dklen || 32, n: opts.n || 4096, p: opts.p || 1, r: opts.r || 8, salt: opts.salt || (0, randombytes_1.default)(32).toString("hex") }; var derivedKey = (0, scryptsy_1.default)(Buffer.from(password), Buffer.from(kdfparams.salt, "hex"), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen); var cipher = crypto_1.default.createCipheriv(opts.cipher || "aes-128-ctr", derivedKey.slice(0, 16), Buffer.from(iv, "hex")); var ciphertext = Buffer.concat([cipher.update(Buffer.from(data)), cipher.final()]); var mac = (0, keccak_1.default)("keccak256") .update(Buffer.concat([derivedKey.slice(16, 32), ciphertext])) .digest(); return { ciphertext: ciphertext.toString("hex"), crypto: { cipher: opts.cipher || "aes-128-ctr", iv: iv, kdf: "scrypt", kdfparams: kdfparams }, mac: mac.toString("hex") }; }; exports.encrypt = encrypt; var encryptContact = function (password, contacts, opts) { if (opts === void 0) { opts = {}; } return encrypt(password, JSON.stringify(contacts), opts); }; exports.encryptContact = encryptContact; var encryptWallet = function (password, keypairs, opts) { if (opts === void 0) { opts = {}; } var data = encrypt(password, keypairs.secret, opts); data.type = keypairs.type || "swt"; data.address = keypairs.address; data.default = typeof keypairs.default === "boolean" ? keypairs.default : true; data.alias = keypairs.alias || ""; return data; }; exports.encryptWallet = encryptWallet; //# sourceMappingURL=index.js.map