44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
|
|
const fs = require('node:fs');
|
||
|
|
const path = require('node:path');
|
||
|
|
const crypto = require('node:crypto');
|
||
|
|
|
||
|
|
const BOSS_AES_KEY = process.env.BOSS_AES_KEY;
|
||
|
|
const BOSS_HMAC_KEY = process.env.BOSS_HMAC_KEY;
|
||
|
|
|
||
|
|
async function run() {
|
||
|
|
try {
|
||
|
|
if (!BOSS_AES_KEY || !BOSS_HMAC_KEY) {
|
||
|
|
process.stderr.write("decrypt: missing environment keys\n");
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
|
||
|
|
const data = fs.readFileSync(process.argv[2]);
|
||
|
|
|
||
|
|
const IV = Buffer.concat([
|
||
|
|
data.subarray(0x0C, 0x18),
|
||
|
|
Buffer.from([0x00, 0x00, 0x00, 0x01])
|
||
|
|
]);
|
||
|
|
|
||
|
|
const decipher = crypto.createDecipheriv('aes-128-ctr', Buffer.from(BOSS_AES_KEY, 'hex'), IV);
|
||
|
|
const decrypted = Buffer.concat([decipher.update(data.subarray(0x20)), decipher.final()]);
|
||
|
|
|
||
|
|
const hmac = decrypted.subarray(0, 0x20);
|
||
|
|
const content = decrypted.subarray(0x20);
|
||
|
|
|
||
|
|
const calculatedHmac = crypto.createHmac('sha256', Buffer.from(BOSS_HMAC_KEY, 'hex'))
|
||
|
|
.update(content)
|
||
|
|
.digest();
|
||
|
|
|
||
|
|
if (!calculatedHmac.equals(hmac)) {
|
||
|
|
process.stderr.write("Console HMAC check failed. Is the key correct?\n");
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
|
||
|
|
process.stdout.write(content);
|
||
|
|
} catch (err) {
|
||
|
|
process.stderr.write(`decrypt.js: ${err.message}\n`);
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
run();
|