process.stdin.resume();
process.stdin.setEncoding('utf8');
'use strict';
const crypto = require('crypto');
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY; // Must be 256 bits (32 characters)
const IV_LENGTH = 16; // For AES, this is always 16
function encrypt(text) {
let iv = crypto.randomBytes(IV_LENGTH);
let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
function decrypt(text) {
let textParts = text.split(':');
let iv = Buffer.from(textParts.shift(), 'hex');
let encryptedText = Buffer.from(textParts.join(':'), 'hex');
let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
let decrypted = decipher.update(encryptedText);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
module.exports = { decrypt, encrypt };
cHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTsKcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmOCcpOwoKJ3VzZSBzdHJpY3QnOwoKY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7Cgpjb25zdCBFTkNSWVBUSU9OX0tFWSA9IHByb2Nlc3MuZW52LkVOQ1JZUFRJT05fS0VZOyAvLyBNdXN0IGJlIDI1NiBiaXRzICgzMiBjaGFyYWN0ZXJzKQpjb25zdCBJVl9MRU5HVEggPSAxNjsgLy8gRm9yIEFFUywgdGhpcyBpcyBhbHdheXMgMTYKCmZ1bmN0aW9uIGVuY3J5cHQodGV4dCkgewogbGV0IGl2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKElWX0xFTkdUSCk7CiBsZXQgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIEJ1ZmZlci5mcm9tKEVOQ1JZUFRJT05fS0VZKSwgaXYpOwogbGV0IGVuY3J5cHRlZCA9IGNpcGhlci51cGRhdGUodGV4dCk7CgogZW5jcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdGVkLCBjaXBoZXIuZmluYWwoKV0pOwoKIHJldHVybiBpdi50b1N0cmluZygnaGV4JykgKyAnOicgKyBlbmNyeXB0ZWQudG9TdHJpbmcoJ2hleCcpOwp9CgpmdW5jdGlvbiBkZWNyeXB0KHRleHQpIHsKIGxldCB0ZXh0UGFydHMgPSB0ZXh0LnNwbGl0KCc6Jyk7CiBsZXQgaXYgPSBCdWZmZXIuZnJvbSh0ZXh0UGFydHMuc2hpZnQoKSwgJ2hleCcpOwogbGV0IGVuY3J5cHRlZFRleHQgPSBCdWZmZXIuZnJvbSh0ZXh0UGFydHMuam9pbignOicpLCAnaGV4Jyk7CiBsZXQgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBCdWZmZXIuZnJvbShFTkNSWVBUSU9OX0tFWSksIGl2KTsKIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkVGV4dCk7CgogZGVjcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZGVjcnlwdGVkLCBkZWNpcGhlci5maW5hbCgpXSk7CgogcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZygpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsgZGVjcnlwdCwgZW5jcnlwdCB9Owo=