UNPKG

coralpay-node-sdk

Version:
154 lines 17.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _PGPEncryption_decryptionKey, _PGPEncryption_encryptionKey, _PGPEncryption_init, _PGPEncryption_useLegacyOpenPGP; Object.defineProperty(exports, "__esModule", { value: true }); exports.PGPEncryption = void 0; const keymanager = __importStar(require("../keymanager")); const openpgp = __importStar(require("openpgp")); const openpgpLegacy = __importStar(require("openpgp-legacy")); openpgpLegacy.config.ignore_mdc_error = true; openpgpLegacy.config.use_native = true; const loadInsecureTwoByteHashPrivateKey = (text, passphrase) => __awaiter(void 0, void 0, void 0, function* () { const key = (yield openpgpLegacy.key.readArmored(text)).keys[0]; if (!key.isDecrypted()) { yield key.decrypt(passphrase !== null && passphrase !== void 0 ? passphrase : ""); } return key; }); class PGPEncryption { constructor(config) { this.config = config; _PGPEncryption_decryptionKey.set(this, void 0); _PGPEncryption_encryptionKey.set(this, void 0); _PGPEncryption_init.set(this, false); _PGPEncryption_useLegacyOpenPGP.set(this, false); } readPrivateKey() { return __awaiter(this, void 0, void 0, function* () { if (this.config.isInsecureTwoByteHashPrivateKey === true) { __classPrivateFieldSet(this, _PGPEncryption_useLegacyOpenPGP, true, "f"); return loadInsecureTwoByteHashPrivateKey(this.config.privatekey, this.config.passphrase); } return openpgp .readPrivateKey({ armoredKey: this.config.privatekey, }) .then((key) => { if (key.isDecrypted()) { return key; } return openpgp.decryptKey({ privateKey: key, passphrase: this.config.passphrase, }); }) .catch((error) => { if (error.message.includes("Encrypted private key is authenticated using an insecure two-byte hash")) { console.warn("WARNING: Private key was created using an insecure two-byte hash! Suggest to upgrade to a newer format"); __classPrivateFieldSet(this, _PGPEncryption_useLegacyOpenPGP, true, "f"); return loadInsecureTwoByteHashPrivateKey(this.config.privatekey, this.config.passphrase); } throw error; }); }); } init() { return __awaiter(this, void 0, void 0, function* () { const [encryptionKey, decryptionKey] = yield Promise.all([ keymanager.importKeys(this.config.publickey, { debug: true, showVersion: false }), this.readPrivateKey(), ]); __classPrivateFieldSet(this, _PGPEncryption_encryptionKey, encryptionKey, "f"); __classPrivateFieldSet(this, _PGPEncryption_decryptionKey, decryptionKey, "f"); __classPrivateFieldSet(this, _PGPEncryption_init, true, "f"); }); } encrypt(data) { return __awaiter(this, void 0, void 0, function* () { if (!__classPrivateFieldGet(this, _PGPEncryption_init, "f")) { yield this.init(); } this.config.logger("Encrypting Data ===>", data); const result = yield keymanager.encryptRequest(data, __classPrivateFieldGet(this, _PGPEncryption_encryptionKey, "f"), { format: "hex", debug: false, showVersion: false }); this.config.logger("Encryption Result ===>", result); return result; }); } decrypt(text, json = false) { return __awaiter(this, void 0, void 0, function* () { if (!__classPrivateFieldGet(this, _PGPEncryption_init, "f")) { yield this.init(); } this.config.logger("Decrypting Text ===>", text, "Possibly JSON ===>", json); const buffer = Buffer.from(text, "hex"); const result = yield Promise.resolve(__classPrivateFieldGet(this, _PGPEncryption_useLegacyOpenPGP, "f")).then((legacy) => __awaiter(this, void 0, void 0, function* () { if (legacy) { return openpgpLegacy .decrypt({ message: yield openpgpLegacy.message.read(buffer), privateKeys: __classPrivateFieldGet(this, _PGPEncryption_decryptionKey, "f"), }) .then((result) => result.data); } return openpgp .decrypt({ message: yield openpgp.readMessage({ binaryMessage: buffer, }), decryptionKeys: __classPrivateFieldGet(this, _PGPEncryption_decryptionKey, "f"), }) .then((result) => result.data); })); this.config.logger("Decryption Result ===>", result); if (json) { return JSON.parse(result); } return result; }); } } exports.PGPEncryption = PGPEncryption; _PGPEncryption_decryptionKey = new WeakMap(), _PGPEncryption_encryptionKey = new WeakMap(), _PGPEncryption_init = new WeakMap(), _PGPEncryption_useLegacyOpenPGP = new WeakMap(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMERBQTRDO0FBQzVDLGlEQUFtQztBQUNuQyw4REFBZ0Q7QUFFaEQsYUFBYSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDN0MsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBVXZDLE1BQU0saUNBQWlDLEdBQUcsQ0FBTyxJQUFZLEVBQUUsVUFBbUIsRUFBRSxFQUFFO0lBQ3JGLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLGFBQVYsVUFBVSxjQUFWLFVBQVUsR0FBSSxFQUFFLENBQUMsQ0FBQztLQUNwQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ1osQ0FBQyxDQUFBLENBQUM7QUFFRixNQUFhLGFBQWE7SUFLekIsWUFBb0IsTUFBMkI7UUFBM0IsV0FBTSxHQUFOLE1BQU0sQ0FBcUI7UUFKL0MsK0NBQTREO1FBQzVELCtDQUF3QjtRQUN4Qiw4QkFBUSxLQUFLLEVBQUM7UUFDZCwwQ0FBb0IsS0FBSyxFQUFDO0lBQ3dCLENBQUM7SUFFN0MsY0FBYzs7WUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixLQUFLLElBQUksRUFBRTtnQkFDekQsdUJBQUEsSUFBSSxtQ0FBcUIsSUFBSSxNQUFBLENBQUM7Z0JBQzlCLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FB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QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQU8sTUFBTSxFQUFFLEVBQUU7Z0JBQ2xGLElBQUksTUFBTSxFQUFFO29CQUNYLE9BQU8sYUFBYTt5QkFDbEIsT0FBTyxDQUFDO3dCQUNSLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzt3QkFDakQsV0FBVyxFQUFFLHVCQUFBLElBQUksb0NBQXdDO3FCQUN6RCxDQUFDO3lCQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNoQztnQkFFRCxPQUFPLE9BQU87cUJBQ1osT0FBTyxDQUFDO29CQUNSLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUM7d0JBQ2xDLGFBQWEsRUFBRSxNQUFNO3FCQUNyQixDQUFDO29CQUNGLGNBQWMsRUFBRSx1QkFBQSxJQUFJLG9DQUFxQztpQkFDekQsQ0FBQztxQkFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUEsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLEVBQUU7Z0JBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDZixDQUFDO0tBQUE7Q0FDRDtBQXhGRCxzQ0F3RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBrZXltYW5hZ2VyIGZyb20gXCIuLi9rZXltYW5hZ2VyXCI7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gXCJvcGVucGdwXCI7XG5pbXBvcnQgKiBhcyBvcGVucGdwTGVnYWN5IGZyb20gXCJvcGVucGdwLWxlZ2FjeVwiO1xuXG5vcGVucGdwTGVnYWN5LmNvbmZpZy5pZ25vcmVfbWRjX2Vycm9yID0gdHJ1ZTtcbm9wZW5wZ3BMZWdhY3kuY29uZmlnLnVzZV9uYXRpdmUgPSB0cnVlO1xuXG5pbnRlcmZhY2UgUEdQRW5jcnlwdGlvbkNvbmZpZyB7XG5cdHB1YmxpY2tleTogc3RyaW5nO1xuXHRwcml2YXRla2V5OiBzdHJpbmc7XG5cdHBhc3NwaHJhc2U/OiBzdHJpbmc7XG5cdGlzSW5zZWN1cmVUd29CeXRlSGFzaFByaXZhdGVLZXk/OiBib29sZWFuO1xuXHRsb2dnZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn1cblxuY29uc3QgbG9hZEluc2VjdXJlVHdvQnl0ZUhhc2hQcml2YXRlS2V5ID0gYXN5bmMgKHRleHQ6IHN0cmluZywgcGFzc3BocmFzZT86IHN0cmluZykgPT4ge1xuXHRjb25zdCBrZXkgPSAoYXdhaXQgb3BlbnBncExlZ2FjeS5rZXkucmVhZEFybW9yZWQodGV4dCkpLmtleXNbMF07XG5cdGlmICgha2V5LmlzRGVjcnlwdGVkKCkpIHtcblx0XHRhd2FpdCBrZXkuZGVjcnlwdChwYXNzcGhyYXNlID8/IFwiXCIpO1xuXHR9XG5cdHJldHVybiBrZXk7XG59O1xuXG5leHBvcnQgY2xhc3MgUEdQRW5jcnlwdGlvbiB7XG5cdCNkZWNyeXB0aW9uS2V5ITogb3BlbnBncC5Qcml2YXRlS2V5IHwgb3BlbnBncExlZ2FjeS5rZXkuS2V5O1xuXHQjZW5jcnlwdGlvbktleSE6IHN0cmluZztcblx0I2luaXQgPSBmYWxzZTtcblx0I3VzZUxlZ2FjeU9wZW5QR1AgPSBmYWxzZTtcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IFBHUEVuY3J5cHRpb25Db25maWcpIHt9XG5cblx0YXN5bmMgcmVhZFByaXZhdGVLZXkoKSB7XG5cdFx0aWYgKHRoaXMuY29uZmlnLmlzSW5zZWN1cmVUd29CeXRlSGFzaFByaXZhdGVLZXkgPT09IHRydWUpIHtcblx0XHRcdHRoaXMuI3VzZUxlZ2FjeU9wZW5QR1AgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIGxvYWRJbnNlY3VyZVR3b0J5dGVIYXNoUHJpdmF0ZUtleSh0aGlzLmNvbmZpZy5wcml2YXRla2V5LCB0aGlzLmNvbmZpZy5wYXNzcGhyYXNlKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9wZW5wZ3Bcblx0XHRcdC5yZWFkUHJpdmF0ZUtleSh7XG5cdFx0XHRcdGFybW9yZWRLZXk6IHRoaXMuY29uZmlnLnByaXZhdGVrZXksXG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKGtleSkgPT4ge1xuXHRcdFx0XHRpZiAoa2V5LmlzRGVjcnlwdGVkKCkpIHtcblx0XHRcdFx0XHRyZXR1cm4ga2V5O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvcGVucGdwLmRlY3J5cHRLZXkoe1xuXHRcdFx0XHRcdHByaXZhdGVLZXk6IGtleSxcblx0XHRcdFx0XHRwYXNzcGhyYXNlOiB0aGlzLmNvbmZpZy5wYXNzcGhyYXNlLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuXHRcdFx0XHRpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkVuY3J5cHRlZCBwcml2YXRlIGtleSBpcyBhdXRoZW50aWNhdGVkIHVzaW5nIGFuIGluc2VjdXJlIHR3by1ieXRlIGhhc2hcIikpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBQcml2YXRlIGtleSB3YXMgY3JlYXRlZCB1c2luZyBhbiBpbnNlY3VyZSB0d28tYnl0ZSBoYXNoISBTdWdnZXN0IHRvIHVwZ3JhZGUgdG8gYSBuZXdlciBmb3JtYXRcIik7XG5cdFx0XHRcdFx0dGhpcy4jdXNlTGVnYWN5T3BlblBHUCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIGxvYWRJbnNlY3VyZVR3b0J5dGVIYXNoUHJpdmF0ZUtleSh0aGlzLmNvbmZpZy5wcml2YXRla2V5LCB0aGlzLmNvbmZpZy5wYXNzcGhyYXNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgaW5pdCgpIHtcblx0XHRjb25zdCBbZW5jcnlwdGlvbktleSwgZGVjcnlwdGlvbktleV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRrZXltYW5hZ2VyLmltcG9ydEtleXModGhpcy5jb25maWcucHVibGlja2V5LCB7IGRlYnVnOiB0cnVlLCBzaG93VmVyc2lvbjogZmFsc2UgfSksXG5cdFx0XHR0aGlzLnJlYWRQcml2YXRlS2V5KCksXG5cdFx0XSk7XG5cdFx0dGhpcy4jZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXk7XG5cdFx0dGhpcy4jZGVjcnlwdGlvbktleSA9IGRlY3J5cHRpb25LZXk7XG5cdFx0dGhpcy4jaW5pdCA9IHRydWU7XG5cdH1cblxuXHRhc3luYyBlbmNyeXB0KGRhdGE6IHN0cmluZykge1xuXHRcdGlmICghdGhpcy4jaW5pdCkge1xuXHRcdFx0YXdhaXQgdGhpcy5pbml0KCk7XG5cdFx0fVxuXHRcdHRoaXMuY29uZmlnLmxvZ2dlcihcIkVuY3J5cHRpbmcgRGF0YSA9PT0+XCIsIGRhdGEpO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtleW1hbmFnZXIuZW5jcnlwdFJlcXVlc3QoZGF0YSwgdGhpcy4jZW5jcnlwdGlvbktleSwgeyBmb3JtYXQ6IFwiaGV4XCIsIGRlYnVnOiBmYWxzZSwgc2hvd1ZlcnNpb246IGZhbHNlIH0pO1xuXHRcdHRoaXMuY29uZmlnLmxvZ2dlcihcIkVuY3J5cHRpb24gUmVzdWx0ID09PT5cIiwgcmVzdWx0KTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0YXN5bmMgZGVjcnlwdDxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4odGV4dDogc3RyaW5nLCBqc29uOiB0cnVlKTogUHJvbWlzZTxUPjtcblx0YXN5bmMgZGVjcnlwdCh0ZXh0OiBzdHJpbmcsIGpzb24/OiBmYWxzZSk6IFByb21pc2U8c3RyaW5nPjtcblx0YXN5bmMgZGVjcnlwdCh0ZXh0OiBzdHJpbmcsIGpzb24gPSBmYWxzZSkge1xuXHRcdGlmICghdGhpcy4jaW5pdCkge1xuXHRcdFx0YXdhaXQgdGhpcy5pbml0KCk7XG5cdFx0fVxuXHRcdHRoaXMuY29uZmlnLmxvZ2dlcihcIkRlY3J5cHRpbmcgVGV4dCA9PT0+XCIsIHRleHQsIFwiUG9zc2libHkgSlNPTiA9PT0+XCIsIGpzb24pO1xuXHRcdGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHRleHQsIFwiaGV4XCIpO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSh0aGlzLiN1c2VMZWdhY3lPcGVuUEdQKS50aGVuKGFzeW5jIChsZWdhY3kpID0+IHtcblx0XHRcdGlmIChsZWdhY3kpIHtcblx0XHRcdFx0cmV0dXJuIG9wZW5wZ3BMZWdhY3lcblx0XHRcdFx0XHQuZGVjcnlwdCh7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBhd2FpdCBvcGVucGdwTGVnYWN5Lm1lc3NhZ2UucmVhZChidWZmZXIpLFxuXHRcdFx0XHRcdFx0cHJpdmF0ZUtleXM6IHRoaXMuI2RlY3J5cHRpb25LZXkgYXMgb3BlbnBncExlZ2FjeS5rZXkuS2V5LFxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGEpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3BlbnBncFxuXHRcdFx0XHQuZGVjcnlwdCh7XG5cdFx0XHRcdFx0bWVzc2FnZTogYXdhaXQgb3BlbnBncC5yZWFkTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRiaW5hcnlNZXNzYWdlOiBidWZmZXIsXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0ZGVjcnlwdGlvbktleXM6IHRoaXMuI2RlY3J5cHRpb25LZXkgYXMgb3BlbnBncC5Qcml2YXRlS2V5LFxuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigocmVzdWx0KSA9PiByZXN1bHQuZGF0YSk7XG5cdFx0fSk7XG5cdFx0dGhpcy5jb25maWcubG9nZ2VyKFwiRGVjcnlwdGlvbiBSZXN1bHQgPT09PlwiLCByZXN1bHQpO1xuXHRcdGlmIChqc29uKSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iXX0=