From 963c58ed2488046fba729aef683d7933b98f66d3 Mon Sep 17 00:00:00 2001 From: bee-san Date: Wed, 27 Dec 2023 12:44:38 +0000 Subject: [PATCH] updated linebreaks --- src/core/lib/LZNT1.mjs | 176 ++++++++++----------- src/core/operations/LZNT1Decompress.mjs | 82 +++++----- tests/operations/tests/LZNT1Decompress.mjs | 42 ++--- 3 files changed, 150 insertions(+), 150 deletions(-) diff --git a/src/core/lib/LZNT1.mjs b/src/core/lib/LZNT1.mjs index 85f8b34f..9a1c7fab 100644 --- a/src/core/lib/LZNT1.mjs +++ b/src/core/lib/LZNT1.mjs @@ -1,88 +1,88 @@ -/** - * - * LZNT1 Decompress. - * - * @author 0xThiebaut [thiebaut.dev] - * @copyright Crown Copyright 2023 - * @license Apache-2.0 - * - * https://github.com/Velocidex/go-ntfs/blob/master/parser%2Flznt1.go - */ - -import Utils from "../Utils.mjs"; -import OperationError from "../errors/OperationError.mjs"; - -const COMPRESSED_MASK = 1 << 15, - SIZE_MASK = (1 << 12) - 1; - -/** - * @param {number} offset - * @returns {number} - */ -function getDisplacement(offset) { - let result = 0; - while (offset >= 0x10) { - offset >>= 1; - result += 1; - } - return result; -} - -/** - * @param {byteArray} compressed - * @returns {byteArray} - */ -export function decompress(compressed) { - const decompressed = Array(); - let coffset = 0; - - while (coffset + 2 <= compressed.length) { - const doffset = decompressed.length; - - const blockHeader = Utils.byteArrayToInt(compressed.slice(coffset, coffset + 2), "little"); - coffset += 2; - - const size = blockHeader & SIZE_MASK; - const blockEnd = coffset + size + 1; - - if (size === 0) { - break; - } else if (compressed.length < coffset + size) { - throw new OperationError("Malformed LZNT1 stream: Block too small! Has the stream been truncated?"); - } - - if ((blockHeader & COMPRESSED_MASK) !== 0) { - while (coffset < blockEnd) { - let header = compressed[coffset++]; - - for (let i = 0; i < 8 && coffset < blockEnd; i++) { - if ((header & 1) === 0) { - decompressed.push(compressed[coffset++]); - } else { - const pointer = Utils.byteArrayToInt(compressed.slice(coffset, coffset + 2), "little"); - coffset += 2; - - const displacement = getDisplacement(decompressed.length - doffset - 1); - const symbolOffset = (pointer >> (12 - displacement)) + 1; - const symbolLength = (pointer & (0xFFF >> displacement)) + 2; - const shiftOffset = decompressed.length - symbolOffset; - - for (let shiftDelta = 0; shiftDelta < symbolLength + 1; shiftDelta++) { - const shift = shiftOffset + shiftDelta; - if (shift < 0 || decompressed.length <= shift) { - throw new OperationError("Malformed LZNT1 stream: Invalid shift!"); - } - decompressed.push(decompressed[shift]); - } - } - header >>= 1; - } - } - } else { - decompressed.push(...compressed.slice(coffset, coffset + size + 1)); - coffset += size + 1; - } - } - - return decompressed; -} +/** + * + * LZNT1 Decompress. + * + * @author 0xThiebaut [thiebaut.dev] + * @copyright Crown Copyright 2023 + * @license Apache-2.0 + * + * https://github.com/Velocidex/go-ntfs/blob/master/parser%2Flznt1.go + */ + +import Utils from "../Utils.mjs"; +import OperationError from "../errors/OperationError.mjs"; + +const COMPRESSED_MASK = 1 << 15, + SIZE_MASK = (1 << 12) - 1; + +/** + * @param {number} offset + * @returns {number} + */ +function getDisplacement(offset) { + let result = 0; + while (offset >= 0x10) { + offset >>= 1; + result += 1; + } + return result; +} + +/** + * @param {byteArray} compressed + * @returns {byteArray} + */ +export function decompress(compressed) { + const decompressed = Array(); + let coffset = 0; + + while (coffset + 2 <= compressed.length) { + const doffset = decompressed.length; + + const blockHeader = Utils.byteArrayToInt(compressed.slice(coffset, coffset + 2), "little"); + coffset += 2; + + const size = blockHeader & SIZE_MASK; + const blockEnd = coffset + size + 1; + + if (size === 0) { + break; + } else if (compressed.length < coffset + size) { + throw new OperationError("Malformed LZNT1 stream: Block too small! Has the stream been truncated?"); + } + + if ((blockHeader & COMPRESSED_MASK) !== 0) { + while (coffset < blockEnd) { + let header = compressed[coffset++]; + + for (let i = 0; i < 8 && coffset < blockEnd; i++) { + if ((header & 1) === 0) { + decompressed.push(compressed[coffset++]); + } else { + const pointer = Utils.byteArrayToInt(compressed.slice(coffset, coffset + 2), "little"); + coffset += 2; + + const displacement = getDisplacement(decompressed.length - doffset - 1); + const symbolOffset = (pointer >> (12 - displacement)) + 1; + const symbolLength = (pointer & (0xFFF >> displacement)) + 2; + const shiftOffset = decompressed.length - symbolOffset; + + for (let shiftDelta = 0; shiftDelta < symbolLength + 1; shiftDelta++) { + const shift = shiftOffset + shiftDelta; + if (shift < 0 || decompressed.length <= shift) { + throw new OperationError("Malformed LZNT1 stream: Invalid shift!"); + } + decompressed.push(decompressed[shift]); + } + } + header >>= 1; + } + } + } else { + decompressed.push(...compressed.slice(coffset, coffset + size + 1)); + coffset += size + 1; + } + } + + return decompressed; +} diff --git a/src/core/operations/LZNT1Decompress.mjs b/src/core/operations/LZNT1Decompress.mjs index 3c793c3f..b5308e77 100644 --- a/src/core/operations/LZNT1Decompress.mjs +++ b/src/core/operations/LZNT1Decompress.mjs @@ -1,41 +1,41 @@ -/** - * @author 0xThiebaut [thiebaut.dev] - * @copyright Crown Copyright 2023 - * @license Apache-2.0 - */ - -import Operation from "../Operation.mjs"; -import {decompress} from "../lib/LZNT1.mjs"; - -/** - * LZNT1 Decompress operation - */ -class LZNT1Decompress extends Operation { - - /** - * LZNT1 Decompress constructor - */ - constructor() { - super(); - - this.name = "LZNT1 Decompress"; - this.module = "Compression"; - this.description = "Decompresses data using the LZNT1 algorithm.

Similar to the Windows API RtlDecompressBuffer."; - this.infoURL = "https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-xca/5655f4a3-6ba4-489b-959f-e1f407c52f15"; - this.inputType = "byteArray"; - this.outputType = "byteArray"; - this.args = []; - } - - /** - * @param {byteArray} input - * @param {Object[]} args - * @returns {byteArray} - */ - run(input, args) { - return decompress(input); - } - -} - -export default LZNT1Decompress; +/** + * @author 0xThiebaut [thiebaut.dev] + * @copyright Crown Copyright 2023 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import {decompress} from "../lib/LZNT1.mjs"; + +/** + * LZNT1 Decompress operation + */ +class LZNT1Decompress extends Operation { + + /** + * LZNT1 Decompress constructor + */ + constructor() { + super(); + + this.name = "LZNT1 Decompress"; + this.module = "Compression"; + this.description = "Decompresses data using the LZNT1 algorithm.

Similar to the Windows API RtlDecompressBuffer."; + this.infoURL = "https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-xca/5655f4a3-6ba4-489b-959f-e1f407c52f15"; + this.inputType = "byteArray"; + this.outputType = "byteArray"; + this.args = []; + } + + /** + * @param {byteArray} input + * @param {Object[]} args + * @returns {byteArray} + */ + run(input, args) { + return decompress(input); + } + +} + +export default LZNT1Decompress; diff --git a/tests/operations/tests/LZNT1Decompress.mjs b/tests/operations/tests/LZNT1Decompress.mjs index ba0f855b..cda7f675 100644 --- a/tests/operations/tests/LZNT1Decompress.mjs +++ b/tests/operations/tests/LZNT1Decompress.mjs @@ -1,22 +1,22 @@ -/** - * LZNT1 Decompress tests. - * - * @author 0xThiebaut [thiebaut.dev] - * @copyright Crown Copyright 2023 - * @license Apache-2.0 - */ -import TestRegister from "../../lib/TestRegister.mjs"; - -TestRegister.addTests([ - { - name: "LZNT1 Decompress", - input: "\x1a\xb0\x00compress\x00edtestda\x04ta\x07\x88alot", - expectedOutput: "compressedtestdatacompressedalot", - recipeConfig: [ - { - op: "LZNT1 Decompress", - args: [] - } - ], - } +/** + * LZNT1 Decompress tests. + * + * @author 0xThiebaut [thiebaut.dev] + * @copyright Crown Copyright 2023 + * @license Apache-2.0 + */ +import TestRegister from "../../lib/TestRegister.mjs"; + +TestRegister.addTests([ + { + name: "LZNT1 Decompress", + input: "\x1a\xb0\x00compress\x00edtestda\x04ta\x07\x88alot", + expectedOutput: "compressedtestdatacompressedalot", + recipeConfig: [ + { + op: "LZNT1 Decompress", + args: [] + } + ], + } ]); \ No newline at end of file