@chatereum/react-e2ee
Version:
A End-to-end encryption library for React and browser based JavaScript frameworks
122 lines (121 loc) • 5.79 kB
JavaScript
"use strict";
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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.decryptFileBuffer = exports.decryptFile = exports.encryptFileBuffer = exports.encryptFile = void 0;
const utils_1 = require("../../utils");
const config_json_1 = __importDefault(require("../../config/config.json"));
const crypto = window.crypto.subtle;
/**
* @deprecated This method will be removed in future release. Use encryptFileBuffer() instead
* @quickfix encryptFileBuffer
* @param public_key The public key
* @param file_buffer The file buffer
* @returns The encrypted file object
*/
const encryptFile = (public_key, file_buffer) => __awaiter(void 0, void 0, void 0, function* () {
const rsa_crypto_key = yield (0, utils_1.getPublicCryptoKey)(public_key);
const AES_KEY = yield crypto.generateKey({
name: config_json_1.default.pre.name,
length: config_json_1.default.pre.length
}, true, ['encrypt', 'decrypt']);
const raw_aes_key = (0, utils_1.arrayBufferToBase64)(yield crypto.exportKey(config_json_1.default.pre.exports, AES_KEY));
const encoded_aes = (0, utils_1.encodeMessage)(raw_aes_key);
const iv = window.crypto.getRandomValues(new Uint8Array(16));
const aes_encrypted = yield crypto.encrypt({
name: config_json_1.default.pre.name,
iv
}, AES_KEY, file_buffer);
const rsa_encrypted_aes = yield crypto.encrypt({
name: config_json_1.default.main.name
}, rsa_crypto_key, encoded_aes);
return {
cipher_buffer: aes_encrypted,
aes_key: (0, utils_1.arrayBufferToBase64)(rsa_encrypted_aes),
iv: (0, utils_1.uIntToBase64)(iv)
};
});
exports.encryptFile = encryptFile;
/**
*
* @param payload The payload containing all file details
* @returns Encrypted file
*/
const encryptFileBuffer = (payload) => __awaiter(void 0, void 0, void 0, function* () {
const { public_key, file_buffer } = payload;
const rsa_crypto_key = yield (0, utils_1.getPublicCryptoKey)(public_key);
const AES_KEY = yield crypto.generateKey({
name: config_json_1.default.pre.name,
length: config_json_1.default.pre.length
}, true, ['encrypt', 'decrypt']);
const raw_aes_key = (0, utils_1.arrayBufferToBase64)(yield crypto.exportKey(config_json_1.default.pre.exports, AES_KEY));
const encoded_aes = (0, utils_1.encodeMessage)(raw_aes_key);
const iv = window.crypto.getRandomValues(new Uint8Array(16));
const aes_encrypted = yield crypto.encrypt({
name: config_json_1.default.pre.name,
iv
}, AES_KEY, file_buffer);
const rsa_encrypted_aes = yield crypto.encrypt({
name: config_json_1.default.main.name
}, rsa_crypto_key, encoded_aes);
return {
cipher_buffer: aes_encrypted,
aes_key: (0, utils_1.arrayBufferToBase64)(rsa_encrypted_aes),
iv: (0, utils_1.uIntToBase64)(iv)
};
});
exports.encryptFileBuffer = encryptFileBuffer;
/**
* @deprecated This method will be removed in future releases. Use decryptFileBuffer() instead
* @quickfix decryptFileBuffer
* @param aes_key The AES key
* @param iv The IV padding
* @param private_key The private key
* @param encrypted_buffer The encrypted buffer of file
* @returns The array buffer to convert to a file object
*/
const decryptFile = (aes_key, iv, private_key, encrypted_buffer) => __awaiter(void 0, void 0, void 0, function* () {
const rsa_crypto_key = yield (0, utils_1.getPrivateCryptoKey)(private_key);
const dec = new TextDecoder();
const aes_decrypted = yield crypto.decrypt({
name: config_json_1.default.main.name
}, rsa_crypto_key, (0, utils_1.base64ToArrayBuffer)(window.atob(aes_key)));
const decoded_aes = dec.decode(aes_decrypted);
const aes_crypto_key = yield (0, utils_1.getAESCryptoKey)(decoded_aes);
const decrypted = yield crypto.decrypt({
name: config_json_1.default.pre.name,
iv: (0, utils_1.base64ToUint8)(iv)
}, aes_crypto_key, encrypted_buffer);
return decrypted;
});
exports.decryptFile = decryptFile;
/**
* @param payload The encrypted file payload
* @returns The decrypted file array buffer
*/
const decryptFileBuffer = (payload) => __awaiter(void 0, void 0, void 0, function* () {
const { encrypted_buffer: { aes_key, iv, cipher_buffer }, private_key } = payload;
const rsa_crypto_key = yield (0, utils_1.getPrivateCryptoKey)(private_key);
const dec = new TextDecoder();
const aes_decrypted = yield crypto.decrypt({
name: config_json_1.default.main.name
}, rsa_crypto_key, (0, utils_1.base64ToArrayBuffer)(window.atob(aes_key)));
const decoded_aes = dec.decode(aes_decrypted);
const aes_crypto_key = yield (0, utils_1.getAESCryptoKey)(decoded_aes);
const decrypted = yield crypto.decrypt({
name: config_json_1.default.pre.name,
iv: (0, utils_1.base64ToUint8)(iv)
}, aes_crypto_key, cipher_buffer);
return decrypted;
});
exports.decryptFileBuffer = decryptFileBuffer;