Innovenergy_trunk/frontend/node_modules/testcafe-safe-storage/lib/crypto.js

98 lines
9.0 KiB
JavaScript
Raw Normal View History

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const crypto_1 = __importDefault(require("crypto"));
const util_1 = require("util");
const file_js_1 = require("./file.js");
const ASYMMETRIC_KEYS_ALGO = 'rsa';
const ASYMMETRIC_KEYS_CIPHER = 'aes-256-cbc';
const ASYMMETRIC_KEYS_LENGTH = 4096;
const ASYMMETRIC_KEYS_FORMAT = {
format: 'pem',
type: 'pkcs8'
};
const SYMMETRIC_ALGO = 'aes-256-gcm';
// NOTE: AES-256 requires a 256 bit key. 256 bits === 32 bytes
const PASSPHRASE_SIZE = 32;
const generateKeyPair = (0, util_1.promisify)(crypto_1.default.generateKeyPair);
const randomBytes = (0, util_1.promisify)(crypto_1.default.randomBytes);
const scrypt = (0, util_1.promisify)(crypto_1.default.scrypt);
class CryptoContext {
async _generateNonce() {
return await randomBytes(PASSPHRASE_SIZE);
}
async _generateKeyPair() {
return await generateKeyPair(ASYMMETRIC_KEYS_ALGO, { modulusLength: ASYMMETRIC_KEYS_LENGTH });
}
async _generatePassphrase(nonce) {
const bytes = await randomBytes(PASSPHRASE_SIZE);
return await scrypt(bytes, nonce, PASSPHRASE_SIZE);
}
async _saveNonce(nonce) {
await (0, file_js_1.save)(file_js_1.FILE_TYPE.NONCE, nonce);
}
async _savePrivateKey(privateKey, nonce) {
const data = privateKey.export(Object.assign({ cipher: ASYMMETRIC_KEYS_CIPHER, passphrase: nonce }, ASYMMETRIC_KEYS_FORMAT));
await (0, file_js_1.save)(file_js_1.FILE_TYPE.PRIVATE_KEY, data);
}
async _savePassphrase(passphrase, publicKey) {
await (0, file_js_1.save)(file_js_1.FILE_TYPE.PASSPHRASE, crypto_1.default.publicEncrypt(publicKey, passphrase));
}
async _saveAuthTag(authTag) {
await (0, file_js_1.save)(file_js_1.FILE_TYPE.AUTH_TAG, authTag);
}
async _loadAuthTag() {
return await (0, file_js_1.load)(file_js_1.FILE_TYPE.AUTH_TAG);
}
async _loadNonce() {
return await (0, file_js_1.load)(file_js_1.FILE_TYPE.NONCE);
}
async _loadPrivateKey(nonce) {
const data = await (0, file_js_1.load)(file_js_1.FILE_TYPE.PRIVATE_KEY);
return crypto_1.default.createPrivateKey(Object.assign({ key: data, passphrase: nonce }, ASYMMETRIC_KEYS_FORMAT));
}
async _loadPassphrase(privateKey) {
const data = await (0, file_js_1.load)(file_js_1.FILE_TYPE.PASSPHRASE);
return crypto_1.default.privateDecrypt(privateKey, data);
}
async _generateEncryptionKeys() {
const nonce = await this._generateNonce();
const passphrase = await this._generatePassphrase(nonce);
const { publicKey, privateKey } = await this._generateKeyPair();
await this._saveNonce(nonce);
await this._savePrivateKey(privateKey, nonce);
await this._savePassphrase(passphrase, publicKey);
return { nonce, passphrase };
}
async _loadDecryptionKeys() {
const authTag = await this._loadAuthTag();
const nonce = await this._loadNonce();
const privateKey = await this._loadPrivateKey(nonce);
const passphrase = await this._loadPassphrase(privateKey);
return { authTag, nonce, passphrase };
}
async _createCipher() {
const { nonce, passphrase } = await this._generateEncryptionKeys();
return crypto_1.default.createCipheriv(SYMMETRIC_ALGO, passphrase, nonce);
}
async _createDecipher() {
const { nonce, passphrase, authTag } = await this._loadDecryptionKeys();
const decipher = await crypto_1.default.createDecipheriv(SYMMETRIC_ALGO, passphrase, nonce);
decipher.setAuthTag(authTag);
return decipher;
}
async encrypt(data) {
const cipher = await this._createCipher();
const result = Buffer.concat([cipher.update(data), cipher.final()]);
await this._saveAuthTag(cipher.getAuthTag());
return result;
}
async decrypt(data) {
const decipher = await this._createDecipher();
return Buffer.concat([decipher.update(data), decipher.final()]);
}
}
exports.default = CryptoContext;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NyeXB0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUFpRztBQUNqRywrQkFBaUM7QUFDakMsdUNBRW1CO0FBRW5CLE1BQU0sb0JBQW9CLEdBQUssS0FBSyxDQUFDO0FBQ3JDLE1BQU0sc0JBQXNCLEdBQUcsYUFBYSxDQUFDO0FBQzdDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBRXBDLE1BQU0sc0JBQXNCLEdBQUc7SUFDM0IsTUFBTSxFQUFFLEtBQUs7SUFDYixJQUFJLEVBQUksT0FBTztDQUNULENBQUM7QUFFWCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUM7QUFFckMsOERBQThEO0FBQzlELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQWdCM0IsTUFBTSxlQUFlLEdBQUcsSUFBQSxnQkFBUyxFQUFDLGdCQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDMUQsTUFBTSxXQUFXLEdBQU8sSUFBQSxnQkFBUyxFQUFDLGdCQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEQsTUFBTSxNQUFNLEdBQVksSUFBQSxnQkFBUyxFQUF5QyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXpGLE1BQXFCLGFBQWE7SUFDOUIsS0FBSyxDQUFDLGNBQWM7UUFDaEIsT0FBTyxNQUFNLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQjtRQUNsQixPQUFPLE1BQU0sZUFBZSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFFLEtBQWE7UUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFakQsT0FBTyxNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUs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