mpp-sdk
Version:
SDK to talk to the Memento Payments Platform
44 lines (43 loc) • 2.15 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.keyPair = void 0;
const tslib_1 = require("tslib");
const base64_arraybuffer_1 = require("base64-arraybuffer");
// This is not currently used but is kept in case we are able to use the key
// exchange method again
const keyPair = (getSensitiveDetails) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
// Generate key pair
// RSA_ECB_OAEP_SHA256_MGF1_2048
const keyPair = yield crypto.subtle.generateKey({
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
}, true, ["decrypt", "encrypt"]);
// Export the public key and PEM encode it
const exported = yield crypto.subtle.exportKey("spki", keyPair.publicKey);
const exportedAsBase64 = (0, base64_arraybuffer_1.encode)(exported);
const pemPublicKey = `-----BEGIN PUBLIC KEY-----\n${exportedAsBase64}\n-----END PUBLIC KEY-----`;
const response = yield getSensitiveDetails({
encryption_key: pemPublicKey,
});
// If we got the encrypted card details we decrypt them
if (response.data.card_details) {
// Helper function that decrypts and returns the decrypted value as a
// string
const decrypt = (data) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const decrypted = yield crypto.subtle.decrypt({ name: "RSA-OAEP" }, keyPair.privateKey, (0, base64_arraybuffer_1.decode)(data));
// Encode to string
return String.fromCharCode.apply(null, [...new Uint8Array(decrypted)]);
});
// Decrypt card and cvv number at the same time
const decryptCardNumber = decrypt(response.data.card_details.card_number);
const decryptCvv = decrypt(response.data.card_details.cvv);
yield Promise.all([decryptCardNumber, decryptCvv]);
// Overwrite the response with the decrypted values
response.data.card_details.card_number = yield decryptCardNumber;
response.data.card_details.cvv = yield decryptCvv;
}
return response;
});
exports.keyPair = keyPair;
;