jcc_wallet
Version:
Toolkit of wallet to manage multiple chains & support multiple keystores for each chain
90 lines • 3.95 kB
JavaScript
;
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