import {QmcMapCipher, QmcRC4Cipher, QmcStaticCipher} from "@/decrypt/qmc_cipher"; import fs from 'fs' test("static cipher [0x7ff8,0x8000) ", () => { const expected = new Uint8Array([ 0xD8, 0x52, 0xF7, 0x67, 0x90, 0xCA, 0xD6, 0x4A, 0x4A, 0xD6, 0xCA, 0x90, 0x67, 0xF7, 0x52, 0xD8, ]) const c = new QmcStaticCipher() const buf = new Uint8Array(16) c.decrypt(buf, 0x7ff8) expect(buf).toStrictEqual(expected) }) test("static cipher [0,0x10) ", () => { const expected = new Uint8Array([ 0xC3, 0x4A, 0xD6, 0xCA, 0x90, 0x67, 0xF7, 0x52, 0xD8, 0xA1, 0x66, 0x62, 0x9F, 0x5B, 0x09, 0x00, ]) const c = new QmcStaticCipher() const buf = new Uint8Array(16) c.decrypt(buf, 0) expect(buf).toStrictEqual(expected) }) test("map cipher: get mask", () => { const expected = new Uint8Array([ 0xBB, 0x7D, 0x80, 0xBE, 0xFF, 0x38, 0x81, 0xFB, 0xBB, 0xFF, 0x82, 0x3C, 0xFF, 0xBA, 0x83, 0x79, ]) const key = new Uint8Array(256) for (let i = 0; i < 256; i++) key[i] = i const buf = new Uint8Array(16) const c = new QmcMapCipher(key) c.decrypt(buf, 0) expect(buf).toStrictEqual(expected) }) function loadTestDataCipher(name: string): { key: Uint8Array, cipherText: Uint8Array, clearText: Uint8Array } { return { key: fs.readFileSync(`testdata/${name}_key.bin`), cipherText: fs.readFileSync(`testdata/${name}_raw.bin`), clearText: fs.readFileSync(`testdata/${name}_target.bin`) } } test("map cipher: real file", async () => { const cases = ["mflac_map", "mgg_map"] for (const name of cases) { const {key, clearText, cipherText} = loadTestDataCipher(name) const c = new QmcMapCipher(key) c.decrypt(cipherText, 0) expect(cipherText).toStrictEqual(clearText) } }) test("rc4 cipher: real file", async () => { const cases = ["mflac0_rc4"] for (const name of cases) { const {key, clearText, cipherText} = loadTestDataCipher(name) const c = new QmcRC4Cipher(key) c.decrypt(cipherText, 0) expect(cipherText).toStrictEqual(clearText) } }) test("rc4 cipher: first segment", async () => { const cases = ["mflac0_rc4"] for (const name of cases) { const {key, clearText, cipherText} = loadTestDataCipher(name) const c = new QmcRC4Cipher(key) const buf = cipherText.slice(0, 128) c.decrypt(buf, 0) expect(buf).toStrictEqual(clearText.slice(0, 128)) } }) test("rc4 cipher: align block (128~5120)", async () => { const cases = ["mflac0_rc4"] for (const name of cases) { const {key, clearText, cipherText} = loadTestDataCipher(name) const c = new QmcRC4Cipher(key) const buf = cipherText.slice(128, 5120) c.decrypt(buf, 128) expect(buf).toStrictEqual(clearText.slice(128, 5120)) } }) test("rc4 cipher: simple block (5120~10240)", async () => { const cases = ["mflac0_rc4"] for (const name of cases) { const {key, clearText, cipherText} = loadTestDataCipher(name) const c = new QmcRC4Cipher(key) const buf = cipherText.slice(5120, 10240) c.decrypt(buf, 5120) expect(buf).toStrictEqual(clearText.slice(5120, 10240)) } })