coralpay-node-sdk
Version:
Coral Pay NodeJS SDK
154 lines • 17.8 kB
JavaScript
"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=