From 27d71c745dabd334d0e1c51014e298ef833fc666 Mon Sep 17 00:00:00 2001 From: Karam KIM Date: Tue, 19 Apr 2022 18:19:53 +0900 Subject: [PATCH 1/2] feat: add ViewText (distribution document) parser --- .pnp.cjs | 22 +++++ ...aes-js-npm-3.1.1-c9780f09d6-388d21adba.zip | Bin 0 -> 3043 bytes ...aes-js-npm-3.1.2-d7549a23a2-062154d50b.zip | Bin 0 -> 24445 bytes package.json | 2 + src/parser/parse.ts | 19 ++-- src/parser/parseViewText.ts | 81 ++++++++++++++++++ yarn.lock | 16 ++++ 7 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 .yarn/cache/@types-aes-js-npm-3.1.1-c9780f09d6-388d21adba.zip create mode 100644 .yarn/cache/aes-js-npm-3.1.2-d7549a23a2-062154d50b.zip create mode 100644 src/parser/parseViewText.ts diff --git a/.pnp.cjs b/.pnp.cjs index d503e1e..e7de48e 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -48,10 +48,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@rollup/plugin-commonjs", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:15.0.0"], ["@rollup/plugin-node-resolve", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:9.0.0"], ["@rollup/plugin-strip", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:2.0.0"], + ["@types/aes-js", "npm:3.1.1"], ["@types/jest", "npm:26.0.10"], ["@types/pako", "npm:1.0.1"], ["@typescript-eslint/eslint-plugin", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:3.9.1"], ["@typescript-eslint/parser", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:3.9.1"], + ["aes-js", "npm:3.1.2"], ["babel-jest", "virtual:3bf5cb85a2e664643c98d2e719d27af43974598ccaa6ea3c355c3ae5c1d5177e21a427bd1a7e70bdce3b4affdbcea39f2ffaa213984380213caeec2a5a6a00da#npm:26.3.0"], ["cfb", "npm:1.2.0"], ["eslint", "npm:7.7.0"], @@ -5696,6 +5698,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD", }] ]], + ["@types/aes-js", [ + ["npm:3.1.1", { + "packageLocation": "./.yarn/cache/@types-aes-js-npm-3.1.1-c9780f09d6-388d21adba.zip/node_modules/@types/aes-js/", + "packageDependencies": [ + ["@types/aes-js", "npm:3.1.1"] + ], + "linkType": "HARD", + }] + ]], ["@types/babel__core", [ ["npm:7.1.9", { "packageLocation": "./.yarn/cache/@types-babel__core-npm-7.1.9-23e959fd72-d92c530efc.zip/node_modules/@types/babel__core/", @@ -6907,6 +6918,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD", }] ]], + ["aes-js", [ + ["npm:3.1.2", { + "packageLocation": "./.yarn/cache/aes-js-npm-3.1.2-d7549a23a2-062154d50b.zip/node_modules/aes-js/", + "packageDependencies": [ + ["aes-js", "npm:3.1.2"] + ], + "linkType": "HARD", + }] + ]], ["agent-base", [ ["npm:6.0.2", { "packageLocation": "./.yarn/cache/agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip/node_modules/agent-base/", @@ -14749,10 +14769,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@rollup/plugin-commonjs", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:15.0.0"], ["@rollup/plugin-node-resolve", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:9.0.0"], ["@rollup/plugin-strip", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:2.0.0"], + ["@types/aes-js", "npm:3.1.1"], ["@types/jest", "npm:26.0.10"], ["@types/pako", "npm:1.0.1"], ["@typescript-eslint/eslint-plugin", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:3.9.1"], ["@typescript-eslint/parser", "virtual:4e4824ddb2bb82a661ef35e7cd03b85962fa8bd39755461bf5f82f22c0044638d264b1390f9aadc6399be3743d686ffbf74edc5194d4caf1c8f6ba822d1bc5d3#npm:3.9.1"], + ["aes-js", "npm:3.1.2"], ["babel-jest", "virtual:3bf5cb85a2e664643c98d2e719d27af43974598ccaa6ea3c355c3ae5c1d5177e21a427bd1a7e70bdce3b4affdbcea39f2ffaa213984380213caeec2a5a6a00da#npm:26.3.0"], ["cfb", "npm:1.2.0"], ["eslint", "npm:7.7.0"], diff --git a/.yarn/cache/@types-aes-js-npm-3.1.1-c9780f09d6-388d21adba.zip b/.yarn/cache/@types-aes-js-npm-3.1.1-c9780f09d6-388d21adba.zip new file mode 100644 index 0000000000000000000000000000000000000000..29ccd61be2718d362d13b1de4599109e14400214 GIT binary patch literal 3043 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 ahamqy$t+Ed9Ni0K+`YJV^OMZH_x3*%a^ST9 literal 0 HcmV?d00001 diff --git a/.yarn/cache/aes-js-npm-3.1.2-d7549a23a2-062154d50b.zip b/.yarn/cache/aes-js-npm-3.1.2-d7549a23a2-062154d50b.zip new file mode 100644 index 0000000000000000000000000000000000000000..321154329c1487a541c3188ad010bc0d88707961 GIT binary patch literal 24445 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 V8Yb2s)3JZ`pQyhk|M7`Y{s*XBjN { + randomSeed = (randomSeed * 214013 + 2531011) & 0xFFFFFFFF + return (randomSeed >> 16) & 0x7FFF + } +} + +function decrypt(cipherText: ArrayBuffer, decKey: ArrayBuffer) { + // eslint-disable-next-line new-cap + const aesEcb = new aesjs.ModeOfOperation.ecb(new Uint8Array(decKey)) + const decryptedBytes = aesEcb.decrypt(new Uint8Array(cipherText)) + return decryptedBytes +} + +function getDecryptionKey(data: ArrayBuffer) : ArrayBuffer { + const sha1Encoded = new Uint8Array(data) + const sha1Decoded = new Uint8Array(sha1Encoded.length) + const seed = (new DataView(data.slice(0, 4))).getInt32(0, true) + const offset = 4 + (seed & 0xF) + const rand = createRand(seed) + for (let j = 0, n = 0, k = 0; j < 256; j += 1, n -= 1) { + if (n === 0) { + k = rand() & 0xFF + n = (rand() & 0xF) + 1 + } + sha1Decoded[j] = sha1Encoded[j] ^ k + } + const sha1ucsstr = sha1Decoded.slice(offset, 80) + return sha1ucsstr.slice(0, 16) +} + +function parseViewTextSection(entry: CFB$Entry): Section { + const content = new Uint8Array(entry.content) + const reader = new ByteReader(content.buffer) + const [_tagID, _level, size] = reader.readRecord() + const distDocData = reader.read(size) + const encryptedData = reader.read(reader.remainByte()) + const decKey = getDecryptionKey(distDocData) + const decrypted = decrypt(encryptedData, decKey) + const decodedContent: Uint8Array = inflate(decrypted, { windowBits: -15 }) + const section: Section = new SectionParser(decodedContent).parse() + return section +} + +function parseViewText(container: CFB$Container): Section[] { + const view = find(container, 'Root Entry/ViewText/') + const viewPaths = container.FullPaths.filter((e: string) => RegExp('Root Entry/ViewText/Section[0-9]+').test(e)) + const sections: Section[] = [] + + if (view && viewPaths.length > 0) { + for (let i = 0; i < viewPaths.length; i += 1) { + const entry = find(container, `Root Entry/ViewText/Section${i}`) + if (entry != null) { + sections.push(parseViewTextSection(entry)) + } + } + } + + return sections +} + +export default parseViewText diff --git a/yarn.lock b/yarn.lock index 3a818d4..1904788 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3393,6 +3393,13 @@ __metadata: languageName: node linkType: hard +"@types/aes-js@npm:^3": + version: 3.1.1 + resolution: "@types/aes-js@npm:3.1.1" + checksum: 388d21adbaa70548f9e94947430f53b54d13f99408fc6461227c2529b9dbaa5397a135e8bb4584206c65a3ef837b868b34602816dc7c20f1537ea9ef23a74bd9 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.7": version: 7.1.9 resolution: "@types/babel__core@npm:7.1.9" @@ -4324,6 +4331,13 @@ __metadata: languageName: node linkType: hard +"aes-js@npm:^3.1.2": + version: 3.1.2 + resolution: "aes-js@npm:3.1.2" + checksum: 062154d50b1e433cc8c3b8ca7879f3a6375d5e79c2a507b2b6c4ec920b4cd851bf2afa7f65c98761a9da89c0ab618cbe6529e8e9a1c71f93290b53128fb8f712 + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -10935,10 +10949,12 @@ fsevents@~2.3.2: "@rollup/plugin-commonjs": ^15.0.0 "@rollup/plugin-node-resolve": ^9.0.0 "@rollup/plugin-strip": ^2.0.0 + "@types/aes-js": ^3 "@types/jest": ^26.0.10 "@types/pako": ^1.0.1 "@typescript-eslint/eslint-plugin": ^3.6.1 "@typescript-eslint/parser": ^3.9.1 + aes-js: ^3.1.2 babel-jest: ^26.3.0 cfb: ^1.2.0 eslint: ^7.7.0 From 658fb337164aceb970622fbdf6abf065ec1dcd31 Mon Sep 17 00:00:00 2001 From: Karam KIM Date: Tue, 19 Apr 2022 23:13:43 +0900 Subject: [PATCH 2/2] fix: remove unnecessary eslint-disable, replace viewPaths RegExp with startsWith --- src/parser/parseViewText.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/parser/parseViewText.ts b/src/parser/parseViewText.ts index a9b2446..963c9cf 100644 --- a/src/parser/parseViewText.ts +++ b/src/parser/parseViewText.ts @@ -1,6 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/naming-convention */ - // Reference 1 : https://cdn.hancom.com/link/docs/%ED%95%9C%EA%B8%80%EB%AC%B8%EC%84%9C%ED%8C%8C%EC%9D%BC%ED%98%95%EC%8B%9D_%EB%B0%B0%ED%8F%AC%EC%9A%A9%EB%AC%B8%EC%84%9C_revision1.2.hwp // Reference 2 : https://groups.google.com/g/hwp-foss/c/d2KL2ypR89Q @@ -51,7 +48,7 @@ function getDecryptionKey(data: ArrayBuffer) : ArrayBuffer { function parseViewTextSection(entry: CFB$Entry): Section { const content = new Uint8Array(entry.content) const reader = new ByteReader(content.buffer) - const [_tagID, _level, size] = reader.readRecord() + const [, , size] = reader.readRecord() const distDocData = reader.read(size) const encryptedData = reader.read(reader.remainByte()) const decKey = getDecryptionKey(distDocData) @@ -63,7 +60,7 @@ function parseViewTextSection(entry: CFB$Entry): Section { function parseViewText(container: CFB$Container): Section[] { const view = find(container, 'Root Entry/ViewText/') - const viewPaths = container.FullPaths.filter((e: string) => RegExp('Root Entry/ViewText/Section[0-9]+').test(e)) + const viewPaths = container.FullPaths.filter((e: string) => e.startsWith('Root Entry/ViewText/Section')) const sections: Section[] = [] if (view && viewPaths.length > 0) {