@cj-tech-master/excelts 9.5.4 → 9.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/modules/archive/compression/streaming-compress.browser.js +29 -0
- package/dist/browser/modules/archive/compression/streaming-compress.js +9 -0
- package/dist/browser/modules/archive/compression/worker-pool/pool.browser.js +26 -1
- package/dist/browser/modules/archive/fs/archive-file.d.ts +8 -5
- package/dist/browser/modules/archive/fs/archive-file.js +78 -16
- package/dist/browser/modules/archive/unzip/stream.browser.js +43 -2
- package/dist/browser/modules/excel/chart/chart-ex-builder.js +7 -2
- package/dist/browser/modules/excel/chart/chart-ex-renderer.js +4 -9
- package/dist/browser/modules/excel/chart/chart-ex-types.d.ts +0 -12
- package/dist/browser/modules/excel/chart/chart.d.ts +1 -5
- package/dist/browser/modules/excel/chart/chart.js +1 -7
- package/dist/browser/modules/excel/chart/types.d.ts +0 -6
- package/dist/browser/modules/excel/stream/workbook-reader.browser.js +25 -1
- package/dist/browser/modules/excel/stream/workbook-reader.js +9 -0
- package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +40 -0
- package/dist/browser/modules/excel/stream/workbook-writer.browser.js +228 -13
- package/dist/browser/modules/excel/utils/string-buf.d.ts +5 -26
- package/dist/browser/modules/excel/utils/string-buf.js +4 -81
- package/dist/browser/modules/excel/workbook.browser.js +135 -25
- package/dist/browser/modules/excel/xlsx/xform/chart/chart-space-xform.js +6 -20
- package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +19 -9
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +32 -8
- package/dist/browser/modules/excel/xlsx/xlsx.d.ts +10 -2
- package/dist/browser/modules/excel/xlsx/xlsx.js +9 -1
- package/dist/browser/modules/pdf/excel-bridge.d.ts +30 -1
- package/dist/browser/modules/pdf/excel-bridge.js +32 -0
- package/dist/browser/modules/pdf/font/metrics.d.ts +3 -52
- package/dist/browser/modules/pdf/font/metrics.js +3 -237
- package/dist/browser/modules/pdf/index.d.ts +1 -1
- package/dist/browser/modules/pdf/index.js +1 -1
- package/dist/browser/modules/pdf/render-layout-to-pdf.d.ts +66 -0
- package/dist/browser/modules/pdf/render-layout-to-pdf.js +647 -0
- package/dist/browser/modules/pdf/word-bridge.d.ts +80 -12
- package/dist/browser/modules/pdf/word-bridge.js +122 -274
- package/dist/browser/modules/stream/index.base.d.ts +2 -0
- package/dist/browser/modules/stream/index.base.js +2 -1
- package/dist/browser/modules/stream/internal/sink-adapter.d.ts +65 -0
- package/dist/browser/modules/stream/internal/sink-adapter.js +198 -0
- package/dist/browser/modules/stream/pull-stream.d.ts +19 -2
- package/dist/browser/modules/stream/pull-stream.js +51 -5
- package/dist/browser/modules/stream/types.d.ts +13 -1
- package/dist/browser/modules/word/advanced/diff.d.ts +61 -0
- package/dist/browser/modules/word/advanced/diff.js +167 -0
- package/dist/browser/modules/word/advanced/drawing-shapes.d.ts +269 -0
- package/dist/browser/modules/word/advanced/drawing-shapes.js +268 -0
- package/dist/browser/modules/word/advanced/field-engine.d.ts +43 -0
- package/dist/browser/modules/word/advanced/field-engine.js +1225 -0
- package/dist/browser/modules/word/advanced/glossary.d.ts +86 -0
- package/dist/browser/modules/word/advanced/glossary.js +79 -0
- package/dist/browser/modules/word/advanced/math-convert.d.ts +30 -0
- package/dist/browser/modules/word/advanced/math-convert.js +595 -0
- package/dist/browser/modules/word/advanced/ole-objects.d.ts +115 -0
- package/dist/browser/modules/word/advanced/ole-objects.js +271 -0
- package/dist/browser/modules/word/advanced/style-map.d.ts +105 -0
- package/dist/browser/modules/word/advanced/style-map.js +322 -0
- package/dist/browser/modules/word/advanced/validation.d.ts +56 -0
- package/dist/browser/modules/word/advanced/validation.js +1065 -0
- package/dist/browser/modules/word/advanced/vba-project.d.ts +91 -0
- package/dist/browser/modules/word/advanced/vba-project.js +265 -0
- package/dist/browser/modules/word/bridge/excel-bridge.d.ts +127 -0
- package/dist/browser/modules/word/bridge/excel-bridge.js +980 -0
- package/dist/browser/modules/word/builder/document-handle.d.ts +151 -0
- package/dist/browser/modules/word/builder/document-handle.js +664 -0
- package/dist/browser/modules/word/builder/paragraph-builders.d.ts +61 -0
- package/dist/browser/modules/word/builder/paragraph-builders.js +90 -0
- package/dist/browser/modules/word/builder/run-builders.d.ts +374 -0
- package/dist/browser/modules/word/builder/run-builders.js +600 -0
- package/dist/browser/modules/word/builder/table-builders.d.ts +23 -0
- package/dist/browser/modules/word/builder/table-builders.js +45 -0
- package/dist/browser/modules/word/constants.d.ts +39 -1
- package/dist/browser/modules/word/constants.js +109 -1
- package/dist/browser/modules/word/convert/conversion-ir.d.ts +210 -0
- package/dist/browser/modules/word/convert/conversion-ir.js +31 -0
- package/dist/browser/modules/word/convert/docx-to-semantic.d.ts +39 -0
- package/dist/browser/modules/word/convert/docx-to-semantic.js +499 -0
- package/dist/browser/modules/word/convert/flat-opc.d.ts +44 -0
- package/dist/browser/modules/word/convert/flat-opc.js +385 -0
- package/dist/browser/modules/word/convert/html/html-import.d.ts +50 -0
- package/dist/browser/modules/word/convert/html/html-import.js +1907 -0
- package/dist/{types/modules/word → browser/modules/word/convert/html}/html-renderer.d.ts +14 -1
- package/dist/{esm/modules/word → browser/modules/word/convert/html}/html-renderer.js +420 -69
- package/dist/browser/modules/word/convert/html/html.d.ts +15 -0
- package/dist/browser/modules/word/convert/html/html.js +15 -0
- package/dist/browser/modules/word/convert/markdown/markdown-import.d.ts +68 -0
- package/dist/browser/modules/word/convert/markdown/markdown-import.js +1325 -0
- package/dist/browser/modules/word/convert/markdown/markdown-renderer.d.ts +25 -0
- package/dist/browser/modules/word/convert/markdown/markdown-renderer.js +634 -0
- package/dist/browser/modules/word/convert/markdown/markdown.d.ts +15 -0
- package/dist/browser/modules/word/convert/markdown/markdown.js +15 -0
- package/dist/browser/modules/word/convert/odt/odt.d.ts +41 -0
- package/dist/browser/modules/word/convert/odt/odt.js +1932 -0
- package/dist/browser/modules/word/{color-utils.d.ts → core/color-utils.d.ts} +8 -1
- package/dist/browser/modules/word/core/color-utils.js +43 -0
- package/dist/browser/modules/word/core/internal-utils.d.ts +90 -0
- package/dist/browser/modules/word/core/internal-utils.js +209 -0
- package/dist/browser/modules/word/core/mapper.d.ts +44 -0
- package/dist/browser/modules/word/core/mapper.js +427 -0
- package/dist/browser/modules/word/core/opc-paths.d.ts +33 -0
- package/dist/browser/modules/word/core/opc-paths.js +48 -0
- package/dist/browser/modules/word/core/text-utils.d.ts +38 -0
- package/dist/browser/modules/word/core/text-utils.js +202 -0
- package/dist/browser/modules/word/core/walker.d.ts +119 -0
- package/dist/browser/modules/word/core/walker.js +570 -0
- package/dist/browser/modules/word/crypto.d.ts +14 -9
- package/dist/browser/modules/word/crypto.js +13 -7
- package/dist/browser/modules/word/document-io.d.ts +59 -27
- package/dist/browser/modules/word/document-io.js +80 -197
- package/dist/browser/modules/word/errors.d.ts +44 -1
- package/dist/browser/modules/word/errors.js +54 -2
- package/dist/browser/modules/word/excel.d.ts +14 -0
- package/dist/browser/modules/word/excel.js +13 -0
- package/dist/browser/modules/word/font/font-embed.d.ts +112 -0
- package/dist/browser/modules/word/font/font-embed.js +646 -0
- package/dist/{esm/modules/word → browser/modules/word/font}/font-obfuscation.js +4 -9
- package/dist/browser/modules/word/font/hyphenation.d.ts +65 -0
- package/dist/browser/modules/word/font/hyphenation.js +4210 -0
- package/dist/browser/modules/word/font/text-shaping.d.ts +58 -0
- package/dist/browser/modules/word/font/text-shaping.js +635 -0
- package/dist/browser/modules/word/html.d.ts +7 -6
- package/dist/browser/modules/word/html.js +6 -5
- package/dist/browser/modules/word/incremental-edit.d.ts +123 -0
- package/dist/browser/modules/word/incremental-edit.js +361 -0
- package/dist/browser/modules/word/index.base.d.ts +194 -10
- package/dist/browser/modules/word/index.base.js +138 -29
- package/dist/browser/modules/word/layout/layout-constants.d.ts +17 -0
- package/dist/browser/modules/word/layout/layout-constants.js +17 -0
- package/dist/browser/modules/word/layout/layout-full.d.ts +53 -0
- package/dist/browser/modules/word/layout/layout-full.js +1696 -0
- package/dist/browser/modules/word/layout/layout-model.d.ts +344 -0
- package/dist/browser/modules/word/layout/layout-model.js +16 -0
- package/dist/browser/modules/word/layout/layout.d.ts +63 -0
- package/dist/browser/modules/word/layout/layout.js +1167 -0
- package/dist/browser/modules/word/layout/render-page.d.ts +57 -0
- package/dist/browser/modules/word/layout/render-page.js +1238 -0
- package/dist/browser/modules/word/markdown.d.ts +14 -0
- package/dist/browser/modules/word/markdown.js +13 -0
- package/dist/browser/modules/word/patcher.d.ts +62 -0
- package/dist/browser/modules/word/patcher.js +537 -0
- package/dist/browser/modules/word/query/compat.d.ts +25 -0
- package/dist/browser/modules/word/query/compat.js +58 -0
- package/dist/browser/modules/word/query/data-binding.d.ts +22 -0
- package/dist/browser/modules/word/query/data-binding.js +392 -0
- package/dist/browser/modules/word/query/form-fields.d.ts +41 -0
- package/dist/browser/modules/word/query/form-fields.js +268 -0
- package/dist/browser/modules/word/query/format-search.d.ts +99 -0
- package/dist/browser/modules/word/query/format-search.js +329 -0
- package/dist/browser/modules/word/query/mail-merge.d.ts +25 -0
- package/dist/browser/modules/word/query/mail-merge.js +111 -0
- package/dist/browser/modules/word/query/merge.d.ts +50 -0
- package/dist/browser/modules/word/query/merge.js +617 -0
- package/dist/browser/modules/word/query/replace.d.ts +47 -0
- package/dist/browser/modules/word/query/replace.js +301 -0
- package/dist/browser/modules/word/query/revisions.d.ts +67 -0
- package/dist/browser/modules/word/query/revisions.js +879 -0
- package/dist/browser/modules/word/query/search.d.ts +129 -0
- package/dist/browser/modules/word/query/search.js +346 -0
- package/dist/browser/modules/word/query/split.d.ts +44 -0
- package/dist/browser/modules/word/query/split.js +135 -0
- package/dist/browser/modules/word/query/style-resolve.d.ts +104 -0
- package/dist/browser/modules/word/query/style-resolve.js +368 -0
- package/dist/browser/modules/word/reader/chart-parser.d.ts +20 -0
- package/dist/browser/modules/word/reader/chart-parser.js +810 -0
- package/dist/browser/modules/word/reader/comments-parser.d.ts +26 -0
- package/dist/browser/modules/word/reader/comments-parser.js +92 -0
- package/dist/browser/modules/word/reader/doc-props-parsers.d.ts +15 -0
- package/dist/browser/modules/word/reader/doc-props-parsers.js +190 -0
- package/dist/browser/modules/word/reader/docx-reader.d.ts +27 -0
- package/dist/browser/modules/word/reader/docx-reader.js +2557 -0
- package/dist/browser/modules/word/reader/drawing-helpers.d.ts +27 -0
- package/dist/browser/modules/word/reader/drawing-helpers.js +84 -0
- package/dist/browser/modules/word/reader/form-field-parser.d.ts +21 -0
- package/dist/browser/modules/word/reader/form-field-parser.js +82 -0
- package/dist/browser/modules/word/reader/image-parsers.d.ts +11 -0
- package/dist/browser/modules/word/reader/image-parsers.js +291 -0
- package/dist/browser/modules/word/reader/math-parser.d.ts +12 -0
- package/dist/browser/modules/word/reader/math-parser.js +422 -0
- package/dist/browser/modules/word/reader/metadata-parsers.d.ts +17 -0
- package/dist/browser/modules/word/reader/metadata-parsers.js +87 -0
- package/dist/browser/modules/word/reader/numbering-parser.d.ts +13 -0
- package/dist/browser/modules/word/reader/numbering-parser.js +166 -0
- package/dist/browser/modules/word/reader/paragraph-section-parsers.d.ts +12 -0
- package/dist/browser/modules/word/reader/paragraph-section-parsers.js +503 -0
- package/dist/browser/modules/word/reader/parse-utils.d.ts +91 -0
- package/dist/browser/modules/word/reader/parse-utils.js +249 -0
- package/dist/browser/modules/word/reader/properties-parsers.d.ts +21 -0
- package/dist/browser/modules/word/reader/properties-parsers.js +332 -0
- package/dist/browser/modules/word/reader/reader-context.d.ts +69 -0
- package/dist/browser/modules/word/reader/reader-context.js +61 -0
- package/dist/browser/modules/word/reader/sdt-helpers.d.ts +29 -0
- package/dist/browser/modules/word/reader/sdt-helpers.js +111 -0
- package/dist/browser/modules/word/reader/settings-parser.d.ts +8 -0
- package/dist/browser/modules/word/reader/settings-parser.js +263 -0
- package/dist/browser/modules/word/reader/styles-parser.d.ts +12 -0
- package/dist/browser/modules/word/reader/styles-parser.js +147 -0
- package/dist/browser/modules/word/reader/table-properties-parsers.d.ts +12 -0
- package/dist/browser/modules/word/reader/table-properties-parsers.js +234 -0
- package/dist/browser/modules/word/reader/theme-parser.d.ts +8 -0
- package/dist/browser/modules/word/reader/theme-parser.js +167 -0
- package/dist/browser/modules/word/reader/watermark-parser.d.ts +15 -0
- package/dist/browser/modules/word/reader/watermark-parser.js +110 -0
- package/dist/browser/modules/word/security/cfb-reader.d.ts +37 -0
- package/dist/browser/modules/word/security/cfb-reader.js +410 -0
- package/dist/browser/modules/word/{digital-signatures.d.ts → security/digital-signatures.d.ts} +19 -11
- package/dist/browser/modules/word/{digital-signatures.js → security/digital-signatures.js} +34 -34
- package/dist/browser/modules/word/security/document-protection.d.ts +93 -0
- package/dist/browser/modules/word/security/document-protection.js +201 -0
- package/dist/{types/modules/word → browser/modules/word/security}/encryption.d.ts +51 -4
- package/dist/browser/modules/word/security/encryption.js +602 -0
- package/dist/browser/modules/word/security/policy.d.ts +80 -0
- package/dist/browser/modules/word/security/policy.js +102 -0
- package/dist/browser/modules/word/template/template-chart.d.ts +56 -0
- package/dist/browser/modules/word/template/template-chart.js +167 -0
- package/dist/browser/modules/word/template/template-datasource.d.ts +154 -0
- package/dist/browser/modules/word/template/template-datasource.js +541 -0
- package/dist/browser/modules/word/template/template-engine.d.ts +121 -0
- package/dist/browser/modules/word/template/template-engine.js +1435 -0
- package/dist/browser/modules/word/types.d.ts +224 -25
- package/dist/browser/modules/word/units.d.ts +26 -0
- package/dist/browser/modules/word/units.js +43 -14
- package/dist/browser/modules/word/{writers → writer}/chart-writer.js +164 -23
- package/dist/browser/modules/word/writer/checkbox-writer.d.ts +17 -0
- package/dist/browser/modules/word/writer/checkbox-writer.js +79 -0
- package/dist/{types/modules/word/writers → browser/modules/word/writer}/comment-writer.d.ts +2 -1
- package/dist/browser/modules/word/{writers → writer}/comment-writer.js +8 -6
- package/dist/browser/modules/word/writer/common-parts.d.ts +57 -0
- package/dist/browser/modules/word/writer/common-parts.js +101 -0
- package/dist/{types/modules/word → browser/modules/word/writer}/content-types.d.ts +2 -2
- package/dist/{esm/modules/word → browser/modules/word/writer}/content-types.js +14 -6
- package/dist/browser/modules/word/writer/document-writer.d.ts +24 -0
- package/dist/browser/modules/word/writer/document-writer.js +473 -0
- package/dist/browser/modules/word/writer/docx-packager.d.ts +35 -0
- package/dist/browser/modules/word/writer/docx-packager.js +1515 -0
- package/dist/{types/modules/word/writers → browser/modules/word/writer}/footnote-writer.d.ts +3 -2
- package/dist/{esm/modules/word/writers → browser/modules/word/writer}/footnote-writer.js +13 -10
- package/dist/{types/modules/word/writers → browser/modules/word/writer}/header-footer-writer.d.ts +3 -2
- package/dist/{esm/modules/word/writers → browser/modules/word/writer}/header-footer-writer.js +39 -21
- package/dist/{types/modules/word/writers → browser/modules/word/writer}/image-writer.d.ts +1 -1
- package/dist/browser/modules/word/{writers → writer}/image-writer.js +11 -7
- package/dist/browser/modules/word/writer/math-writer.d.ts +20 -0
- package/dist/{esm/modules/word/writers → browser/modules/word/writer}/math-writer.js +21 -1
- package/dist/browser/modules/word/{writers → writer}/numbering-writer.d.ts +1 -1
- package/dist/{esm/modules/word/writers → browser/modules/word/writer}/numbering-writer.js +11 -4
- package/dist/browser/modules/word/{writers → writer}/paragraph-writer.d.ts +2 -1
- package/dist/browser/modules/word/{writers → writer}/paragraph-writer.js +73 -38
- package/dist/browser/modules/word/{writers → writer}/parts-writer.d.ts +3 -3
- package/dist/{esm/modules/word/writers → browser/modules/word/writer}/parts-writer.js +91 -12
- package/dist/browser/modules/word/writer/reference-scanners.d.ts +42 -0
- package/dist/browser/modules/word/writer/reference-scanners.js +111 -0
- package/dist/browser/modules/word/writer/relationships.d.ts +52 -0
- package/dist/browser/modules/word/writer/relationships.js +117 -0
- package/dist/browser/modules/word/writer/render-context.d.ts +124 -0
- package/dist/browser/modules/word/writer/render-context.js +46 -0
- package/dist/browser/modules/word/{writers → writer}/run-writer.d.ts +10 -1
- package/dist/{esm/modules/word/writers → browser/modules/word/writer}/run-writer.js +126 -24
- package/dist/browser/modules/word/writer/sdt-writer.d.ts +25 -0
- package/dist/browser/modules/word/writer/sdt-writer.js +189 -0
- package/dist/browser/modules/word/writer/stream-buf.d.ts +37 -0
- package/dist/browser/modules/word/writer/stream-buf.js +73 -0
- package/dist/browser/modules/word/writer/streaming-writer.d.ts +344 -0
- package/dist/browser/modules/word/writer/streaming-writer.js +1382 -0
- package/dist/browser/modules/word/writer/string-buf.d.ts +8 -0
- package/dist/browser/modules/word/writer/string-buf.js +7 -0
- package/dist/browser/modules/word/{writers → writer}/styles-writer.js +32 -1
- package/dist/browser/modules/word/{writers → writer}/table-writer.d.ts +2 -1
- package/dist/browser/modules/word/{writers → writer}/table-writer.js +94 -11
- package/dist/browser/modules/xml/types.d.ts +22 -0
- package/dist/browser/utils/crypto.browser.d.ts +3 -1
- package/dist/browser/utils/crypto.browser.js +3 -1
- package/dist/browser/utils/crypto.d.ts +4 -1
- package/dist/browser/utils/crypto.js +4 -1
- package/dist/browser/utils/font-metrics.d.ts +63 -0
- package/dist/browser/utils/font-metrics.js +293 -0
- package/dist/browser/utils/string-buf.d.ts +42 -0
- package/dist/browser/utils/string-buf.js +89 -0
- package/dist/browser/utils/theme-colors.d.ts +55 -0
- package/dist/browser/utils/theme-colors.js +120 -0
- package/dist/cjs/modules/archive/compression/streaming-compress.browser.js +29 -0
- package/dist/cjs/modules/archive/compression/streaming-compress.js +9 -0
- package/dist/cjs/modules/archive/compression/worker-pool/pool.browser.js +26 -1
- package/dist/cjs/modules/archive/fs/archive-file.js +78 -16
- package/dist/cjs/modules/archive/unzip/stream.browser.js +43 -2
- package/dist/cjs/modules/excel/chart/chart-ex-builder.js +7 -2
- package/dist/cjs/modules/excel/chart/chart-ex-renderer.js +4 -9
- package/dist/cjs/modules/excel/chart/chart.js +1 -7
- package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +25 -1
- package/dist/cjs/modules/excel/stream/workbook-reader.js +9 -0
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +228 -13
- package/dist/cjs/modules/excel/utils/string-buf.js +5 -81
- package/dist/cjs/modules/excel/workbook.browser.js +135 -25
- package/dist/cjs/modules/excel/xlsx/xform/chart/chart-space-xform.js +6 -20
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +32 -8
- package/dist/cjs/modules/excel/xlsx/xlsx.js +9 -1
- package/dist/cjs/modules/pdf/excel-bridge.js +33 -0
- package/dist/cjs/modules/pdf/font/metrics.js +11 -244
- package/dist/cjs/modules/pdf/index.js +2 -1
- package/dist/cjs/modules/pdf/render-layout-to-pdf.js +651 -0
- package/dist/cjs/modules/pdf/word-bridge.js +155 -274
- package/dist/cjs/modules/stream/index.base.js +4 -2
- package/dist/cjs/modules/stream/internal/sink-adapter.js +202 -0
- package/dist/cjs/modules/stream/pull-stream.js +51 -5
- package/dist/cjs/modules/word/advanced/diff.js +170 -0
- package/dist/cjs/modules/word/advanced/drawing-shapes.js +279 -0
- package/dist/cjs/modules/word/advanced/field-engine.js +1229 -0
- package/dist/cjs/modules/word/advanced/glossary.js +87 -0
- package/dist/cjs/modules/word/advanced/math-convert.js +599 -0
- package/dist/cjs/modules/word/advanced/ole-objects.js +277 -0
- package/dist/cjs/modules/word/advanced/style-map.js +329 -0
- package/dist/cjs/modules/word/advanced/validation.js +1068 -0
- package/dist/cjs/modules/word/advanced/vba-project.js +274 -0
- package/dist/cjs/modules/word/bridge/excel-bridge.js +1020 -0
- package/dist/cjs/modules/word/builder/document-handle.js +667 -0
- package/dist/cjs/modules/word/builder/paragraph-builders.js +109 -0
- package/dist/cjs/modules/word/builder/run-builders.js +676 -0
- package/dist/cjs/modules/word/builder/table-builders.js +53 -0
- package/dist/cjs/modules/word/constants.js +111 -2
- package/dist/cjs/modules/word/convert/conversion-ir.js +34 -0
- package/dist/cjs/modules/word/convert/docx-to-semantic.js +502 -0
- package/dist/cjs/modules/word/convert/flat-opc.js +390 -0
- package/dist/cjs/modules/word/convert/html/html-import.js +1910 -0
- package/dist/cjs/modules/word/{html-renderer.js → convert/html/html-renderer.js} +420 -69
- package/dist/cjs/modules/word/convert/html/html.js +20 -0
- package/dist/cjs/modules/word/convert/markdown/markdown-import.js +1329 -0
- package/dist/cjs/modules/word/convert/markdown/markdown-renderer.js +637 -0
- package/dist/cjs/modules/word/convert/markdown/markdown.js +21 -0
- package/dist/cjs/modules/word/convert/odt/odt.js +1936 -0
- package/dist/cjs/modules/word/core/color-utils.js +47 -0
- package/dist/cjs/modules/word/core/internal-utils.js +219 -0
- package/dist/cjs/modules/word/core/mapper.js +430 -0
- package/dist/cjs/modules/word/core/opc-paths.js +53 -0
- package/dist/cjs/modules/word/core/text-utils.js +210 -0
- package/dist/cjs/modules/word/core/walker.js +577 -0
- package/dist/cjs/modules/word/crypto.js +19 -8
- package/dist/cjs/modules/word/document-io.js +117 -197
- package/dist/cjs/modules/word/errors.js +59 -13
- package/dist/cjs/modules/word/excel.js +22 -0
- package/dist/cjs/modules/word/font/font-embed.js +652 -0
- package/dist/cjs/modules/word/{font-obfuscation.js → font/font-obfuscation.js} +4 -9
- package/dist/cjs/modules/word/font/hyphenation.js +4216 -0
- package/dist/cjs/modules/word/font/text-shaping.js +640 -0
- package/dist/cjs/modules/word/html.js +9 -7
- package/dist/cjs/modules/word/incremental-edit.js +366 -0
- package/dist/cjs/modules/word/index.base.js +370 -137
- package/dist/cjs/modules/word/layout/layout-constants.js +20 -0
- package/dist/cjs/modules/word/layout/layout-full.js +1699 -0
- package/dist/cjs/modules/word/layout/layout-model.js +17 -0
- package/dist/cjs/modules/word/layout/layout.js +1170 -0
- package/dist/cjs/modules/word/layout/render-page.js +1243 -0
- package/dist/cjs/modules/word/markdown.js +19 -0
- package/dist/cjs/modules/word/patcher.js +539 -0
- package/dist/cjs/modules/word/query/compat.js +61 -0
- package/dist/cjs/modules/word/query/data-binding.js +395 -0
- package/dist/cjs/modules/word/query/form-fields.js +272 -0
- package/dist/cjs/modules/word/query/format-search.js +334 -0
- package/dist/cjs/modules/word/query/mail-merge.js +114 -0
- package/dist/cjs/modules/word/query/merge.js +620 -0
- package/dist/cjs/modules/word/query/replace.js +304 -0
- package/dist/cjs/modules/word/query/revisions.js +885 -0
- package/dist/cjs/modules/word/query/search.js +361 -0
- package/dist/cjs/modules/word/query/split.js +138 -0
- package/dist/cjs/modules/word/query/style-resolve.js +374 -0
- package/dist/cjs/modules/word/reader/chart-parser.js +814 -0
- package/dist/cjs/modules/word/reader/comments-parser.js +96 -0
- package/dist/cjs/modules/word/reader/doc-props-parsers.js +194 -0
- package/dist/cjs/modules/word/reader/docx-reader.js +2560 -0
- package/dist/cjs/modules/word/reader/drawing-helpers.js +90 -0
- package/dist/cjs/modules/word/reader/form-field-parser.js +85 -0
- package/dist/cjs/modules/word/reader/image-parsers.js +293 -0
- package/dist/cjs/modules/word/reader/math-parser.js +424 -0
- package/dist/cjs/modules/word/reader/metadata-parsers.js +93 -0
- package/dist/cjs/modules/word/reader/numbering-parser.js +168 -0
- package/dist/cjs/modules/word/reader/paragraph-section-parsers.js +505 -0
- package/dist/cjs/modules/word/reader/parse-utils.js +271 -0
- package/dist/cjs/modules/word/reader/properties-parsers.js +338 -0
- package/dist/cjs/modules/word/reader/reader-context.js +66 -0
- package/dist/cjs/modules/word/reader/sdt-helpers.js +114 -0
- package/dist/cjs/modules/word/reader/settings-parser.js +265 -0
- package/dist/cjs/modules/word/reader/styles-parser.js +149 -0
- package/dist/cjs/modules/word/reader/table-properties-parsers.js +237 -0
- package/dist/cjs/modules/word/reader/theme-parser.js +169 -0
- package/dist/cjs/modules/word/reader/watermark-parser.js +113 -0
- package/dist/cjs/modules/word/security/cfb-reader.js +414 -0
- package/dist/cjs/modules/word/{digital-signatures.js → security/digital-signatures.js} +34 -34
- package/dist/cjs/modules/word/security/document-protection.js +208 -0
- package/dist/cjs/modules/word/security/encryption.js +612 -0
- package/dist/cjs/modules/word/security/policy.js +106 -0
- package/dist/cjs/modules/word/template/template-chart.js +170 -0
- package/dist/cjs/modules/word/template/template-datasource.js +549 -0
- package/dist/cjs/modules/word/template/template-engine.js +1430 -0
- package/dist/cjs/modules/word/units.js +44 -14
- package/dist/cjs/modules/word/{writers → writer}/chart-writer.js +163 -22
- package/dist/cjs/modules/word/writer/checkbox-writer.js +82 -0
- package/dist/cjs/modules/word/{writers → writer}/comment-writer.js +8 -6
- package/dist/cjs/modules/word/writer/common-parts.js +104 -0
- package/dist/cjs/modules/word/{content-types.js → writer/content-types.js} +14 -6
- package/dist/cjs/modules/word/writer/document-writer.js +478 -0
- package/dist/cjs/modules/word/writer/docx-packager.js +1551 -0
- package/dist/cjs/modules/word/{writers → writer}/footnote-writer.js +13 -10
- package/dist/cjs/modules/word/{writers → writer}/header-footer-writer.js +38 -20
- package/dist/cjs/modules/word/{writers → writer}/image-writer.js +11 -7
- package/dist/cjs/modules/word/{writers → writer}/math-writer.js +21 -1
- package/dist/cjs/modules/word/{writers → writer}/numbering-writer.js +11 -4
- package/dist/cjs/modules/word/{writers → writer}/paragraph-writer.js +72 -37
- package/dist/cjs/modules/word/{writers → writer}/parts-writer.js +91 -12
- package/dist/cjs/modules/word/writer/reference-scanners.js +120 -0
- package/dist/cjs/modules/word/writer/relationships.js +124 -0
- package/dist/cjs/modules/word/writer/render-context.js +51 -0
- package/dist/cjs/modules/word/{writers → writer}/run-writer.js +127 -24
- package/dist/cjs/modules/word/writer/sdt-writer.js +192 -0
- package/dist/cjs/modules/word/writer/stream-buf.js +76 -0
- package/dist/cjs/modules/word/writer/streaming-writer.js +1387 -0
- package/dist/cjs/modules/word/writer/string-buf.js +11 -0
- package/dist/cjs/modules/word/{writers → writer}/styles-writer.js +32 -1
- package/dist/cjs/modules/word/{writers → writer}/table-writer.js +94 -11
- package/dist/cjs/utils/crypto.browser.js +3 -1
- package/dist/cjs/utils/crypto.js +4 -1
- package/dist/cjs/utils/font-metrics.js +303 -0
- package/dist/cjs/utils/string-buf.js +92 -0
- package/dist/cjs/utils/theme-colors.js +126 -0
- package/dist/esm/modules/archive/compression/streaming-compress.browser.js +29 -0
- package/dist/esm/modules/archive/compression/streaming-compress.js +9 -0
- package/dist/esm/modules/archive/compression/worker-pool/pool.browser.js +26 -1
- package/dist/esm/modules/archive/fs/archive-file.js +78 -16
- package/dist/esm/modules/archive/unzip/stream.browser.js +43 -2
- package/dist/esm/modules/excel/chart/chart-ex-builder.js +7 -2
- package/dist/esm/modules/excel/chart/chart-ex-renderer.js +4 -9
- package/dist/esm/modules/excel/chart/chart.js +1 -7
- package/dist/esm/modules/excel/stream/workbook-reader.browser.js +25 -1
- package/dist/esm/modules/excel/stream/workbook-reader.js +9 -0
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +228 -13
- package/dist/esm/modules/excel/utils/string-buf.js +4 -81
- package/dist/esm/modules/excel/workbook.browser.js +135 -25
- package/dist/esm/modules/excel/xlsx/xform/chart/chart-space-xform.js +6 -20
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +32 -8
- package/dist/esm/modules/excel/xlsx/xlsx.js +9 -1
- package/dist/esm/modules/pdf/excel-bridge.js +32 -0
- package/dist/esm/modules/pdf/font/metrics.js +3 -237
- package/dist/esm/modules/pdf/index.js +1 -1
- package/dist/esm/modules/pdf/render-layout-to-pdf.js +647 -0
- package/dist/esm/modules/pdf/word-bridge.js +122 -274
- package/dist/esm/modules/stream/index.base.js +2 -1
- package/dist/esm/modules/stream/internal/sink-adapter.js +198 -0
- package/dist/esm/modules/stream/pull-stream.js +51 -5
- package/dist/esm/modules/word/advanced/diff.js +167 -0
- package/dist/esm/modules/word/advanced/drawing-shapes.js +268 -0
- package/dist/esm/modules/word/advanced/field-engine.js +1225 -0
- package/dist/esm/modules/word/advanced/glossary.js +79 -0
- package/dist/esm/modules/word/advanced/math-convert.js +595 -0
- package/dist/esm/modules/word/advanced/ole-objects.js +271 -0
- package/dist/esm/modules/word/advanced/style-map.js +322 -0
- package/dist/esm/modules/word/advanced/validation.js +1065 -0
- package/dist/esm/modules/word/advanced/vba-project.js +265 -0
- package/dist/esm/modules/word/bridge/excel-bridge.js +980 -0
- package/dist/esm/modules/word/builder/document-handle.js +664 -0
- package/dist/esm/modules/word/builder/paragraph-builders.js +90 -0
- package/dist/esm/modules/word/builder/run-builders.js +600 -0
- package/dist/esm/modules/word/builder/table-builders.js +45 -0
- package/dist/esm/modules/word/constants.js +109 -1
- package/dist/esm/modules/word/convert/conversion-ir.js +31 -0
- package/dist/esm/modules/word/convert/docx-to-semantic.js +499 -0
- package/dist/esm/modules/word/convert/flat-opc.js +385 -0
- package/dist/esm/modules/word/convert/html/html-import.js +1907 -0
- package/dist/{browser/modules/word → esm/modules/word/convert/html}/html-renderer.js +420 -69
- package/dist/esm/modules/word/convert/html/html.js +15 -0
- package/dist/esm/modules/word/convert/markdown/markdown-import.js +1325 -0
- package/dist/esm/modules/word/convert/markdown/markdown-renderer.js +634 -0
- package/dist/esm/modules/word/convert/markdown/markdown.js +15 -0
- package/dist/esm/modules/word/convert/odt/odt.js +1932 -0
- package/dist/esm/modules/word/core/color-utils.js +43 -0
- package/dist/esm/modules/word/core/internal-utils.js +209 -0
- package/dist/esm/modules/word/core/mapper.js +427 -0
- package/dist/esm/modules/word/core/opc-paths.js +48 -0
- package/dist/esm/modules/word/core/text-utils.js +202 -0
- package/dist/esm/modules/word/core/walker.js +570 -0
- package/dist/esm/modules/word/crypto.js +13 -7
- package/dist/esm/modules/word/document-io.js +80 -197
- package/dist/esm/modules/word/errors.js +54 -2
- package/dist/esm/modules/word/excel.js +13 -0
- package/dist/esm/modules/word/font/font-embed.js +646 -0
- package/dist/{browser/modules/word → esm/modules/word/font}/font-obfuscation.js +4 -9
- package/dist/esm/modules/word/font/hyphenation.js +4210 -0
- package/dist/esm/modules/word/font/text-shaping.js +635 -0
- package/dist/esm/modules/word/html.js +6 -5
- package/dist/esm/modules/word/incremental-edit.js +361 -0
- package/dist/esm/modules/word/index.base.js +138 -29
- package/dist/esm/modules/word/layout/layout-constants.js +17 -0
- package/dist/esm/modules/word/layout/layout-full.js +1696 -0
- package/dist/esm/modules/word/layout/layout-model.js +16 -0
- package/dist/esm/modules/word/layout/layout.js +1167 -0
- package/dist/esm/modules/word/layout/render-page.js +1238 -0
- package/dist/esm/modules/word/markdown.js +13 -0
- package/dist/esm/modules/word/patcher.js +537 -0
- package/dist/esm/modules/word/query/compat.js +58 -0
- package/dist/esm/modules/word/query/data-binding.js +392 -0
- package/dist/esm/modules/word/query/form-fields.js +268 -0
- package/dist/esm/modules/word/query/format-search.js +329 -0
- package/dist/esm/modules/word/query/mail-merge.js +111 -0
- package/dist/esm/modules/word/query/merge.js +617 -0
- package/dist/esm/modules/word/query/replace.js +301 -0
- package/dist/esm/modules/word/query/revisions.js +879 -0
- package/dist/esm/modules/word/query/search.js +346 -0
- package/dist/esm/modules/word/query/split.js +135 -0
- package/dist/esm/modules/word/query/style-resolve.js +368 -0
- package/dist/esm/modules/word/reader/chart-parser.js +810 -0
- package/dist/esm/modules/word/reader/comments-parser.js +92 -0
- package/dist/esm/modules/word/reader/doc-props-parsers.js +190 -0
- package/dist/esm/modules/word/reader/docx-reader.js +2557 -0
- package/dist/esm/modules/word/reader/drawing-helpers.js +84 -0
- package/dist/esm/modules/word/reader/form-field-parser.js +82 -0
- package/dist/esm/modules/word/reader/image-parsers.js +291 -0
- package/dist/esm/modules/word/reader/math-parser.js +422 -0
- package/dist/esm/modules/word/reader/metadata-parsers.js +87 -0
- package/dist/esm/modules/word/reader/numbering-parser.js +166 -0
- package/dist/esm/modules/word/reader/paragraph-section-parsers.js +503 -0
- package/dist/esm/modules/word/reader/parse-utils.js +249 -0
- package/dist/esm/modules/word/reader/properties-parsers.js +332 -0
- package/dist/esm/modules/word/reader/reader-context.js +61 -0
- package/dist/esm/modules/word/reader/sdt-helpers.js +111 -0
- package/dist/esm/modules/word/reader/settings-parser.js +263 -0
- package/dist/esm/modules/word/reader/styles-parser.js +147 -0
- package/dist/esm/modules/word/reader/table-properties-parsers.js +234 -0
- package/dist/esm/modules/word/reader/theme-parser.js +167 -0
- package/dist/esm/modules/word/reader/watermark-parser.js +110 -0
- package/dist/esm/modules/word/security/cfb-reader.js +410 -0
- package/dist/esm/modules/word/{digital-signatures.js → security/digital-signatures.js} +34 -34
- package/dist/esm/modules/word/security/document-protection.js +201 -0
- package/dist/esm/modules/word/security/encryption.js +602 -0
- package/dist/esm/modules/word/security/policy.js +102 -0
- package/dist/esm/modules/word/template/template-chart.js +167 -0
- package/dist/esm/modules/word/template/template-datasource.js +541 -0
- package/dist/esm/modules/word/template/template-engine.js +1435 -0
- package/dist/esm/modules/word/units.js +43 -14
- package/dist/esm/modules/word/{writers → writer}/chart-writer.js +164 -23
- package/dist/esm/modules/word/writer/checkbox-writer.js +79 -0
- package/dist/esm/modules/word/{writers → writer}/comment-writer.js +8 -6
- package/dist/esm/modules/word/writer/common-parts.js +101 -0
- package/dist/{browser/modules/word → esm/modules/word/writer}/content-types.js +14 -6
- package/dist/esm/modules/word/writer/document-writer.js +473 -0
- package/dist/esm/modules/word/writer/docx-packager.js +1515 -0
- package/dist/{browser/modules/word/writers → esm/modules/word/writer}/footnote-writer.js +13 -10
- package/dist/{browser/modules/word/writers → esm/modules/word/writer}/header-footer-writer.js +39 -21
- package/dist/esm/modules/word/{writers → writer}/image-writer.js +11 -7
- package/dist/{browser/modules/word/writers → esm/modules/word/writer}/math-writer.js +21 -1
- package/dist/{browser/modules/word/writers → esm/modules/word/writer}/numbering-writer.js +11 -4
- package/dist/esm/modules/word/{writers → writer}/paragraph-writer.js +73 -38
- package/dist/{browser/modules/word/writers → esm/modules/word/writer}/parts-writer.js +91 -12
- package/dist/esm/modules/word/writer/reference-scanners.js +111 -0
- package/dist/esm/modules/word/writer/relationships.js +117 -0
- package/dist/esm/modules/word/writer/render-context.js +46 -0
- package/dist/{browser/modules/word/writers → esm/modules/word/writer}/run-writer.js +126 -24
- package/dist/esm/modules/word/writer/sdt-writer.js +189 -0
- package/dist/esm/modules/word/writer/stream-buf.js +73 -0
- package/dist/esm/modules/word/writer/streaming-writer.js +1382 -0
- package/dist/esm/modules/word/writer/string-buf.js +7 -0
- package/dist/esm/modules/word/{writers → writer}/styles-writer.js +32 -1
- package/dist/esm/modules/word/{writers → writer}/table-writer.js +94 -11
- package/dist/esm/utils/crypto.browser.js +3 -1
- package/dist/esm/utils/crypto.js +4 -1
- package/dist/esm/utils/font-metrics.js +293 -0
- package/dist/esm/utils/string-buf.js +89 -0
- package/dist/esm/utils/theme-colors.js +120 -0
- package/dist/iife/excelts.iife.js +70692 -70337
- package/dist/iife/excelts.iife.js.map +1 -1
- package/dist/iife/excelts.iife.min.js +57 -57
- package/dist/types/modules/archive/fs/archive-file.d.ts +8 -5
- package/dist/types/modules/excel/chart/chart-ex-types.d.ts +0 -12
- package/dist/types/modules/excel/chart/chart.d.ts +1 -5
- package/dist/types/modules/excel/chart/types.d.ts +0 -6
- package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +40 -0
- package/dist/types/modules/excel/utils/string-buf.d.ts +5 -26
- package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +19 -9
- package/dist/types/modules/excel/xlsx/xlsx.d.ts +10 -2
- package/dist/types/modules/pdf/excel-bridge.d.ts +30 -1
- package/dist/types/modules/pdf/font/metrics.d.ts +3 -52
- package/dist/types/modules/pdf/index.d.ts +1 -1
- package/dist/types/modules/pdf/render-layout-to-pdf.d.ts +66 -0
- package/dist/types/modules/pdf/word-bridge.d.ts +80 -12
- package/dist/types/modules/stream/index.base.d.ts +2 -0
- package/dist/types/modules/stream/internal/sink-adapter.d.ts +65 -0
- package/dist/types/modules/stream/pull-stream.d.ts +19 -2
- package/dist/types/modules/stream/types.d.ts +13 -1
- package/dist/types/modules/word/advanced/diff.d.ts +61 -0
- package/dist/types/modules/word/advanced/drawing-shapes.d.ts +269 -0
- package/dist/types/modules/word/advanced/field-engine.d.ts +43 -0
- package/dist/types/modules/word/advanced/glossary.d.ts +86 -0
- package/dist/types/modules/word/advanced/math-convert.d.ts +30 -0
- package/dist/types/modules/word/advanced/ole-objects.d.ts +115 -0
- package/dist/types/modules/word/advanced/style-map.d.ts +105 -0
- package/dist/types/modules/word/advanced/validation.d.ts +56 -0
- package/dist/types/modules/word/advanced/vba-project.d.ts +91 -0
- package/dist/types/modules/word/bridge/excel-bridge.d.ts +127 -0
- package/dist/types/modules/word/builder/document-handle.d.ts +151 -0
- package/dist/types/modules/word/builder/paragraph-builders.d.ts +61 -0
- package/dist/types/modules/word/builder/run-builders.d.ts +374 -0
- package/dist/types/modules/word/builder/table-builders.d.ts +23 -0
- package/dist/types/modules/word/constants.d.ts +39 -1
- package/dist/types/modules/word/convert/conversion-ir.d.ts +210 -0
- package/dist/types/modules/word/convert/docx-to-semantic.d.ts +39 -0
- package/dist/types/modules/word/convert/flat-opc.d.ts +44 -0
- package/dist/types/modules/word/convert/html/html-import.d.ts +50 -0
- package/dist/{browser/modules/word → types/modules/word/convert/html}/html-renderer.d.ts +14 -1
- package/dist/types/modules/word/convert/html/html.d.ts +15 -0
- package/dist/types/modules/word/convert/markdown/markdown-import.d.ts +68 -0
- package/dist/types/modules/word/convert/markdown/markdown-renderer.d.ts +25 -0
- package/dist/types/modules/word/convert/markdown/markdown.d.ts +15 -0
- package/dist/types/modules/word/convert/odt/odt.d.ts +41 -0
- package/dist/types/modules/word/{color-utils.d.ts → core/color-utils.d.ts} +8 -1
- package/dist/types/modules/word/core/internal-utils.d.ts +90 -0
- package/dist/types/modules/word/core/mapper.d.ts +44 -0
- package/dist/types/modules/word/core/opc-paths.d.ts +33 -0
- package/dist/types/modules/word/core/text-utils.d.ts +38 -0
- package/dist/types/modules/word/core/walker.d.ts +119 -0
- package/dist/types/modules/word/crypto.d.ts +14 -9
- package/dist/types/modules/word/document-io.d.ts +59 -27
- package/dist/types/modules/word/errors.d.ts +44 -1
- package/dist/types/modules/word/excel.d.ts +14 -0
- package/dist/types/modules/word/font/font-embed.d.ts +112 -0
- package/dist/types/modules/word/font/hyphenation.d.ts +65 -0
- package/dist/types/modules/word/font/text-shaping.d.ts +58 -0
- package/dist/types/modules/word/html.d.ts +7 -6
- package/dist/types/modules/word/incremental-edit.d.ts +123 -0
- package/dist/types/modules/word/index.base.d.ts +194 -10
- package/dist/types/modules/word/layout/layout-constants.d.ts +17 -0
- package/dist/types/modules/word/layout/layout-full.d.ts +53 -0
- package/dist/types/modules/word/layout/layout-model.d.ts +344 -0
- package/dist/types/modules/word/layout/layout.d.ts +63 -0
- package/dist/types/modules/word/layout/render-page.d.ts +57 -0
- package/dist/types/modules/word/markdown.d.ts +14 -0
- package/dist/types/modules/word/patcher.d.ts +62 -0
- package/dist/types/modules/word/query/compat.d.ts +25 -0
- package/dist/types/modules/word/query/data-binding.d.ts +22 -0
- package/dist/types/modules/word/query/form-fields.d.ts +41 -0
- package/dist/types/modules/word/query/format-search.d.ts +99 -0
- package/dist/types/modules/word/query/mail-merge.d.ts +25 -0
- package/dist/types/modules/word/query/merge.d.ts +50 -0
- package/dist/types/modules/word/query/replace.d.ts +47 -0
- package/dist/types/modules/word/query/revisions.d.ts +67 -0
- package/dist/types/modules/word/query/search.d.ts +129 -0
- package/dist/types/modules/word/query/split.d.ts +44 -0
- package/dist/types/modules/word/query/style-resolve.d.ts +104 -0
- package/dist/types/modules/word/reader/chart-parser.d.ts +20 -0
- package/dist/types/modules/word/reader/comments-parser.d.ts +26 -0
- package/dist/types/modules/word/reader/doc-props-parsers.d.ts +15 -0
- package/dist/types/modules/word/reader/docx-reader.d.ts +27 -0
- package/dist/types/modules/word/reader/drawing-helpers.d.ts +27 -0
- package/dist/types/modules/word/reader/form-field-parser.d.ts +21 -0
- package/dist/types/modules/word/reader/image-parsers.d.ts +11 -0
- package/dist/types/modules/word/reader/math-parser.d.ts +12 -0
- package/dist/types/modules/word/reader/metadata-parsers.d.ts +17 -0
- package/dist/types/modules/word/reader/numbering-parser.d.ts +13 -0
- package/dist/types/modules/word/reader/paragraph-section-parsers.d.ts +12 -0
- package/dist/types/modules/word/reader/parse-utils.d.ts +91 -0
- package/dist/types/modules/word/reader/properties-parsers.d.ts +21 -0
- package/dist/types/modules/word/reader/reader-context.d.ts +69 -0
- package/dist/types/modules/word/reader/sdt-helpers.d.ts +29 -0
- package/dist/types/modules/word/reader/settings-parser.d.ts +8 -0
- package/dist/types/modules/word/reader/styles-parser.d.ts +12 -0
- package/dist/types/modules/word/reader/table-properties-parsers.d.ts +12 -0
- package/dist/types/modules/word/reader/theme-parser.d.ts +8 -0
- package/dist/types/modules/word/reader/watermark-parser.d.ts +15 -0
- package/dist/types/modules/word/security/cfb-reader.d.ts +37 -0
- package/dist/types/modules/word/{digital-signatures.d.ts → security/digital-signatures.d.ts} +19 -11
- package/dist/types/modules/word/security/document-protection.d.ts +93 -0
- package/dist/{browser/modules/word → types/modules/word/security}/encryption.d.ts +51 -4
- package/dist/types/modules/word/security/policy.d.ts +80 -0
- package/dist/types/modules/word/template/template-chart.d.ts +56 -0
- package/dist/types/modules/word/template/template-datasource.d.ts +154 -0
- package/dist/types/modules/word/template/template-engine.d.ts +121 -0
- package/dist/types/modules/word/types.d.ts +224 -25
- package/dist/types/modules/word/units.d.ts +26 -0
- package/dist/types/modules/word/writer/checkbox-writer.d.ts +17 -0
- package/dist/{browser/modules/word/writers → types/modules/word/writer}/comment-writer.d.ts +2 -1
- package/dist/types/modules/word/writer/common-parts.d.ts +57 -0
- package/dist/{browser/modules/word → types/modules/word/writer}/content-types.d.ts +2 -2
- package/dist/types/modules/word/writer/document-writer.d.ts +24 -0
- package/dist/types/modules/word/writer/docx-packager.d.ts +35 -0
- package/dist/{browser/modules/word/writers → types/modules/word/writer}/footnote-writer.d.ts +3 -2
- package/dist/{browser/modules/word/writers → types/modules/word/writer}/header-footer-writer.d.ts +3 -2
- package/dist/{browser/modules/word/writers → types/modules/word/writer}/image-writer.d.ts +1 -1
- package/dist/types/modules/word/writer/math-writer.d.ts +20 -0
- package/dist/types/modules/word/{writers → writer}/numbering-writer.d.ts +1 -1
- package/dist/types/modules/word/{writers → writer}/paragraph-writer.d.ts +2 -1
- package/dist/types/modules/word/{writers → writer}/parts-writer.d.ts +3 -3
- package/dist/types/modules/word/writer/reference-scanners.d.ts +42 -0
- package/dist/types/modules/word/writer/relationships.d.ts +52 -0
- package/dist/types/modules/word/writer/render-context.d.ts +124 -0
- package/dist/types/modules/word/{writers → writer}/run-writer.d.ts +10 -1
- package/dist/types/modules/word/writer/sdt-writer.d.ts +25 -0
- package/dist/types/modules/word/writer/stream-buf.d.ts +37 -0
- package/dist/types/modules/word/writer/streaming-writer.d.ts +344 -0
- package/dist/types/modules/word/writer/string-buf.d.ts +8 -0
- package/dist/types/modules/word/{writers → writer}/table-writer.d.ts +2 -1
- package/dist/types/modules/xml/types.d.ts +22 -0
- package/dist/types/utils/crypto.browser.d.ts +3 -1
- package/dist/types/utils/crypto.d.ts +4 -1
- package/dist/types/utils/font-metrics.d.ts +63 -0
- package/dist/types/utils/string-buf.d.ts +42 -0
- package/dist/types/utils/theme-colors.d.ts +55 -0
- package/package.json +121 -39
- package/dist/browser/modules/word/color-utils.js +0 -94
- package/dist/browser/modules/word/document.d.ts +0 -657
- package/dist/browser/modules/word/document.js +0 -1533
- package/dist/browser/modules/word/docx-packager.d.ts +0 -14
- package/dist/browser/modules/word/docx-packager.js +0 -822
- package/dist/browser/modules/word/docx-reader.d.ts +0 -11
- package/dist/browser/modules/word/docx-reader.js +0 -4929
- package/dist/browser/modules/word/encryption.js +0 -274
- package/dist/browser/modules/word/internal-utils.d.ts +0 -23
- package/dist/browser/modules/word/internal-utils.js +0 -54
- package/dist/browser/modules/word/namespaces.d.ts +0 -159
- package/dist/browser/modules/word/namespaces.js +0 -189
- package/dist/browser/modules/word/relationships.d.ts +0 -30
- package/dist/browser/modules/word/relationships.js +0 -48
- package/dist/browser/modules/word/writers/checkbox-writer.d.ts +0 -9
- package/dist/browser/modules/word/writers/checkbox-writer.js +0 -42
- package/dist/browser/modules/word/writers/document-writer.d.ts +0 -16
- package/dist/browser/modules/word/writers/document-writer.js +0 -461
- package/dist/browser/modules/word/writers/math-writer.d.ts +0 -9
- package/dist/cjs/modules/word/color-utils.js +0 -97
- package/dist/cjs/modules/word/document.js +0 -1645
- package/dist/cjs/modules/word/docx-packager.js +0 -825
- package/dist/cjs/modules/word/docx-reader.js +0 -4932
- package/dist/cjs/modules/word/encryption.js +0 -282
- package/dist/cjs/modules/word/internal-utils.js +0 -59
- package/dist/cjs/modules/word/namespaces.js +0 -192
- package/dist/cjs/modules/word/relationships.js +0 -55
- package/dist/cjs/modules/word/writers/checkbox-writer.js +0 -45
- package/dist/cjs/modules/word/writers/document-writer.js +0 -465
- package/dist/esm/modules/word/color-utils.js +0 -94
- package/dist/esm/modules/word/document.js +0 -1533
- package/dist/esm/modules/word/docx-packager.js +0 -822
- package/dist/esm/modules/word/docx-reader.js +0 -4929
- package/dist/esm/modules/word/encryption.js +0 -274
- package/dist/esm/modules/word/internal-utils.js +0 -54
- package/dist/esm/modules/word/namespaces.js +0 -189
- package/dist/esm/modules/word/relationships.js +0 -48
- package/dist/esm/modules/word/writers/checkbox-writer.js +0 -42
- package/dist/esm/modules/word/writers/document-writer.js +0 -461
- package/dist/types/modules/word/document.d.ts +0 -657
- package/dist/types/modules/word/docx-packager.d.ts +0 -14
- package/dist/types/modules/word/docx-reader.d.ts +0 -11
- package/dist/types/modules/word/internal-utils.d.ts +0 -23
- package/dist/types/modules/word/namespaces.d.ts +0 -159
- package/dist/types/modules/word/relationships.d.ts +0 -30
- package/dist/types/modules/word/writers/checkbox-writer.d.ts +0 -9
- package/dist/types/modules/word/writers/document-writer.d.ts +0 -16
- package/dist/types/modules/word/writers/math-writer.d.ts +0 -9
- /package/dist/browser/modules/word/{font-obfuscation.d.ts → font/font-obfuscation.d.ts} +0 -0
- /package/dist/browser/modules/word/{writers → writer}/chart-writer.d.ts +0 -0
- /package/dist/browser/modules/word/{writers → writer}/section-writer.d.ts +0 -0
- /package/dist/browser/modules/word/{writers → writer}/section-writer.js +0 -0
- /package/dist/browser/modules/word/{writers → writer}/styles-writer.d.ts +0 -0
- /package/dist/browser/modules/word/{writers → writer}/textbox-writer.d.ts +0 -0
- /package/dist/browser/modules/word/{writers → writer}/textbox-writer.js +0 -0
- /package/dist/browser/modules/word/{writers → writer}/toc-writer.d.ts +0 -0
- /package/dist/browser/modules/word/{writers → writer}/toc-writer.js +0 -0
- /package/dist/cjs/modules/word/{writers → writer}/section-writer.js +0 -0
- /package/dist/cjs/modules/word/{writers → writer}/textbox-writer.js +0 -0
- /package/dist/cjs/modules/word/{writers → writer}/toc-writer.js +0 -0
- /package/dist/esm/modules/word/{writers → writer}/section-writer.js +0 -0
- /package/dist/esm/modules/word/{writers → writer}/textbox-writer.js +0 -0
- /package/dist/esm/modules/word/{writers → writer}/toc-writer.js +0 -0
- /package/dist/types/modules/word/{font-obfuscation.d.ts → font/font-obfuscation.d.ts} +0 -0
- /package/dist/types/modules/word/{writers → writer}/chart-writer.d.ts +0 -0
- /package/dist/types/modules/word/{writers → writer}/section-writer.d.ts +0 -0
- /package/dist/types/modules/word/{writers → writer}/styles-writer.d.ts +0 -0
- /package/dist/types/modules/word/{writers → writer}/textbox-writer.d.ts +0 -0
- /package/dist/types/modules/word/{writers → writer}/toc-writer.d.ts +0 -0
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DOCX Agile Encryption (MS-OFFCRYPTO)
|
|
4
|
+
*
|
|
5
|
+
* Implements ECMA-376 Agile Encryption (used by Office 2010+) for encrypted
|
|
6
|
+
* DOCX files. Encrypted DOCX files use the CFB (Compound File Binary) format
|
|
7
|
+
* to wrap the ZIP content.
|
|
8
|
+
*
|
|
9
|
+
* This module provides:
|
|
10
|
+
* - Password-based encryption/decryption of DOCX content
|
|
11
|
+
* - EncryptionInfo XML generation/parsing
|
|
12
|
+
*
|
|
13
|
+
* All AES and SHA primitives are delegated to `@utils/crypto`, which uses
|
|
14
|
+
* synchronous `node:crypto` APIs in Node and Web Crypto in the browser.
|
|
15
|
+
* The KDF inner loop runs ~100,000 hashes per derived key; on Node we go
|
|
16
|
+
* through the synchronous fast path so a round-trip completes in well
|
|
17
|
+
* under a second instead of the multi-second microtask churn that the
|
|
18
|
+
* old `await crypto.subtle.digest()` loop produced.
|
|
19
|
+
*
|
|
20
|
+
* References:
|
|
21
|
+
* - MS-OFFCRYPTO: Office Document Cryptography Structure
|
|
22
|
+
* - ECMA-376 Part 3: Markup Compatibility and Extensibility
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.AGILE_BLOCK_KEYS = void 0;
|
|
26
|
+
exports.isEncryptedDocx = isEncryptedDocx;
|
|
27
|
+
exports.deriveEncryptionKey = deriveEncryptionKey;
|
|
28
|
+
exports.verifyPassword = verifyPassword;
|
|
29
|
+
exports.decryptPackage = decryptPackage;
|
|
30
|
+
exports.parseEncryptionInfoXml = parseEncryptionInfoXml;
|
|
31
|
+
exports.decryptDocx = decryptDocx;
|
|
32
|
+
exports.encryptDocx = encryptDocx;
|
|
33
|
+
const crypto_1 = require("../../../utils/crypto.js");
|
|
34
|
+
const internal_utils_1 = require("../core/internal-utils");
|
|
35
|
+
const errors_1 = require("../errors");
|
|
36
|
+
const cfb_reader_1 = require("./cfb-reader");
|
|
37
|
+
/** Detect whether a buffer is an encrypted Office document (CFB format). */
|
|
38
|
+
function isEncryptedDocx(buffer) {
|
|
39
|
+
// CFB signature: D0CF11E0A1B11AE1
|
|
40
|
+
if (buffer.length < 8) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return (buffer[0] === 0xd0 &&
|
|
44
|
+
buffer[1] === 0xcf &&
|
|
45
|
+
buffer[2] === 0x11 &&
|
|
46
|
+
buffer[3] === 0xe0 &&
|
|
47
|
+
buffer[4] === 0xa1 &&
|
|
48
|
+
buffer[5] === 0xb1 &&
|
|
49
|
+
buffer[6] === 0x1a &&
|
|
50
|
+
buffer[7] === 0xe1);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Detect whether the platform's `@utils/crypto.hash` supports the requested
|
|
54
|
+
* algorithm synchronously. Node's implementation accepts every OpenSSL
|
|
55
|
+
* digest (SHA-1/256/384/512, MD5); the browser implementation only ships
|
|
56
|
+
* synchronous SHA-256 and MD5 — anything else throws.
|
|
57
|
+
*
|
|
58
|
+
* The detection result is cached per algorithm so we only pay the probe
|
|
59
|
+
* cost once.
|
|
60
|
+
*/
|
|
61
|
+
const _syncHashCache = new Map();
|
|
62
|
+
function canHashSync(algorithm) {
|
|
63
|
+
const cached = _syncHashCache.get(algorithm);
|
|
64
|
+
if (cached !== undefined) {
|
|
65
|
+
return cached;
|
|
66
|
+
}
|
|
67
|
+
let ok = false;
|
|
68
|
+
try {
|
|
69
|
+
(0, crypto_1.hash)(algorithm, new Uint8Array(0));
|
|
70
|
+
ok = true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
ok = false;
|
|
74
|
+
}
|
|
75
|
+
_syncHashCache.set(algorithm, ok);
|
|
76
|
+
return ok;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Derive an encryption key from a password using the agile encryption KDF.
|
|
80
|
+
*
|
|
81
|
+
* Per MS-OFFCRYPTO 2.3.4.11:
|
|
82
|
+
* H_0 = H(salt + password)
|
|
83
|
+
* H_i = H(iterator + H_{i-1}) for i = 0..spinCount-1
|
|
84
|
+
* H_final = H(H_{spinCount} + blockKey)
|
|
85
|
+
* Key = first keySize bytes of H_final
|
|
86
|
+
*/
|
|
87
|
+
async function deriveEncryptionKey(password, info, blockKey) {
|
|
88
|
+
const pwdBytes = stringToUtf16LE(password);
|
|
89
|
+
const hashName = mapHashName(info.hashAlgorithm);
|
|
90
|
+
// Reusable 4-byte iterator + scratch buffer to avoid per-iteration
|
|
91
|
+
// allocations inside the spin loop. The scratch holds [iter || H_{i-1}]
|
|
92
|
+
// and is rebuilt in place.
|
|
93
|
+
const iterAndPrev = new Uint8Array(4 + getHashSizeFor(hashName));
|
|
94
|
+
const iterView = new DataView(iterAndPrev.buffer, 0, 4);
|
|
95
|
+
let h;
|
|
96
|
+
if (canHashSync(hashName)) {
|
|
97
|
+
// Fast path: ~100,000 synchronous digests, no microtask churn.
|
|
98
|
+
h = (0, crypto_1.hash)(hashName, concat(info.keySalt, pwdBytes));
|
|
99
|
+
for (let i = 0; i < info.spinCount; i++) {
|
|
100
|
+
iterView.setUint32(0, i, true);
|
|
101
|
+
iterAndPrev.set(h, 4);
|
|
102
|
+
h = (0, crypto_1.hash)(hashName, iterAndPrev);
|
|
103
|
+
}
|
|
104
|
+
h = (0, crypto_1.hash)(hashName, concat(h, blockKey));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Browser fallback: Web Crypto SHA-1/384/512 are async-only.
|
|
108
|
+
h = await (0, crypto_1.hashAsync)(hashName, concat(info.keySalt, pwdBytes));
|
|
109
|
+
for (let i = 0; i < info.spinCount; i++) {
|
|
110
|
+
iterView.setUint32(0, i, true);
|
|
111
|
+
iterAndPrev.set(h, 4);
|
|
112
|
+
h = await (0, crypto_1.hashAsync)(hashName, iterAndPrev);
|
|
113
|
+
}
|
|
114
|
+
h = await (0, crypto_1.hashAsync)(hashName, concat(h, blockKey));
|
|
115
|
+
}
|
|
116
|
+
// Truncate to keySize. The hash size MUST be at least the requested
|
|
117
|
+
// key length — otherwise we'd hand the AES layer a short key buffer
|
|
118
|
+
// that either fails import or produces a key the counterparty can't
|
|
119
|
+
// validate. Reject misconfigured EncryptionInfo up-front with a clear
|
|
120
|
+
// error.
|
|
121
|
+
const keyBytes = info.keyBits / 8;
|
|
122
|
+
if (h.length < keyBytes) {
|
|
123
|
+
throw new Error(`deriveEncryptionKey: hash output of ${h.length} bytes is too ` +
|
|
124
|
+
`short for keyBits=${info.keyBits} (need ${keyBytes}). ` +
|
|
125
|
+
`Use a hash algorithm with a larger digest size (e.g. SHA-512 ` +
|
|
126
|
+
`for keyBits ≤ 512).`);
|
|
127
|
+
}
|
|
128
|
+
return h.slice(0, keyBytes);
|
|
129
|
+
}
|
|
130
|
+
/** Block keys as defined in MS-OFFCRYPTO 2.3.4.13. */
|
|
131
|
+
exports.AGILE_BLOCK_KEYS = {
|
|
132
|
+
/** For encrypting verifier hash input. */
|
|
133
|
+
verifierHashInput: new Uint8Array([0xfe, 0xa7, 0xd2, 0x76, 0x3b, 0x4b, 0x9e, 0x79]),
|
|
134
|
+
/** For encrypting verifier hash value. */
|
|
135
|
+
verifierHashValue: new Uint8Array([0xd7, 0xaa, 0x0f, 0x6d, 0x30, 0x61, 0x34, 0x4e]),
|
|
136
|
+
/** For encrypting the main key. */
|
|
137
|
+
encryptedKey: new Uint8Array([0x14, 0x6e, 0x0b, 0xe7, 0xab, 0xac, 0xd0, 0xd6]),
|
|
138
|
+
/** For data integrity HMAC key. */
|
|
139
|
+
dataIntegrityKey: new Uint8Array([0x5f, 0xb2, 0xad, 0x01, 0x0c, 0xb9, 0xe1, 0xf6]),
|
|
140
|
+
/** For data integrity HMAC value. */
|
|
141
|
+
dataIntegrityValue: new Uint8Array([0xa0, 0x67, 0x7f, 0x02, 0xb2, 0x2c, 0x84, 0x33])
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Verify a password against the encryption info.
|
|
145
|
+
*
|
|
146
|
+
* @returns True if password is correct.
|
|
147
|
+
*/
|
|
148
|
+
async function verifyPassword(password, info) {
|
|
149
|
+
try {
|
|
150
|
+
// Derive verifier hash input key
|
|
151
|
+
const verifierInputKey = await deriveEncryptionKey(password, info, exports.AGILE_BLOCK_KEYS.verifierHashInput);
|
|
152
|
+
// Decrypt the verifier hash input (PKCS#7 padded by encryption write path)
|
|
153
|
+
const verifierInput = aesCbcPkcs7Decrypt(info.encryptedVerifierHashInput, verifierInputKey, info.keySalt);
|
|
154
|
+
// Hash the verifier input
|
|
155
|
+
const hashAlg = mapHashName(info.hashAlgorithm);
|
|
156
|
+
const computedHash = await (0, crypto_1.hashAsync)(hashAlg, verifierInput);
|
|
157
|
+
// Derive verifier hash value key
|
|
158
|
+
const verifierValueKey = await deriveEncryptionKey(password, info, exports.AGILE_BLOCK_KEYS.verifierHashValue);
|
|
159
|
+
// Decrypt the verifier hash value (PKCS#7 padded by encryption write path)
|
|
160
|
+
const expectedHash = aesCbcPkcs7Decrypt(info.encryptedVerifierHashValue, verifierValueKey, info.keySalt);
|
|
161
|
+
// Compare (truncate to hashSize in case of padding)
|
|
162
|
+
return bytesEqual(computedHash.slice(0, info.hashSize), expectedHash.slice(0, info.hashSize));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Decrypt the package data using the password.
|
|
170
|
+
*
|
|
171
|
+
* @param encryptedPackage - The EncryptedPackage stream from CFB.
|
|
172
|
+
* @param info - Agile encryption parameters.
|
|
173
|
+
* @param password - The user password.
|
|
174
|
+
* @param maxDecryptedSize - Optional upper bound on the decrypted size; if the
|
|
175
|
+
* `totalSize` header claims a larger value, throw rather than allocate.
|
|
176
|
+
* Defaults to 512 MiB so adversarial files cannot trigger arbitrary-size
|
|
177
|
+
* allocations before security policy is applied at the unzip layer.
|
|
178
|
+
* @returns The decrypted (unencrypted) package bytes.
|
|
179
|
+
*/
|
|
180
|
+
async function decryptPackage(encryptedPackage, info, password, maxDecryptedSize = 512 * 1024 * 1024) {
|
|
181
|
+
// Derive key encryption key
|
|
182
|
+
const keyEncryptionKey = await deriveEncryptionKey(password, info, exports.AGILE_BLOCK_KEYS.encryptedKey);
|
|
183
|
+
// Decrypt the actual package key (PKCS#7 padded by encryption write path)
|
|
184
|
+
const packageKey = aesCbcPkcs7Decrypt(info.encryptedKeyValue, keyEncryptionKey, info.keySalt);
|
|
185
|
+
if (encryptedPackage.length < 8) {
|
|
186
|
+
throw new errors_1.DocxDecryptionError("EncryptedPackage too small (missing 8-byte size header)");
|
|
187
|
+
}
|
|
188
|
+
// First 8 bytes are the total decrypted size (uint64 LE)
|
|
189
|
+
const totalSizeView = new DataView(encryptedPackage.buffer, encryptedPackage.byteOffset, 8);
|
|
190
|
+
const totalSize = Number(totalSizeView.getBigUint64(0, true));
|
|
191
|
+
// Sanity check the declared size: it cannot legally exceed the encrypted
|
|
192
|
+
// body length, and we refuse to allocate above the configured bound.
|
|
193
|
+
const encryptedBodyLength = encryptedPackage.length - 8;
|
|
194
|
+
if (!Number.isFinite(totalSize) ||
|
|
195
|
+
totalSize < 0 ||
|
|
196
|
+
totalSize > encryptedBodyLength ||
|
|
197
|
+
totalSize > maxDecryptedSize) {
|
|
198
|
+
throw new errors_1.DocxDecryptionError(`EncryptedPackage declared size (${totalSize}) is invalid or exceeds the maximum allowed (${maxDecryptedSize})`);
|
|
199
|
+
}
|
|
200
|
+
// Decrypt in 4096-byte segments
|
|
201
|
+
const segmentSize = 4096;
|
|
202
|
+
const encData = encryptedPackage.slice(8);
|
|
203
|
+
const segments = [];
|
|
204
|
+
const segCount = Math.ceil(encData.length / segmentSize);
|
|
205
|
+
const hashName = mapHashName(info.hashAlgorithm);
|
|
206
|
+
const idxBytes = new Uint8Array(4);
|
|
207
|
+
const idxView = new DataView(idxBytes.buffer);
|
|
208
|
+
for (let i = 0; i < segCount; i++) {
|
|
209
|
+
const segStart = i * segmentSize;
|
|
210
|
+
const segEnd = Math.min(segStart + segmentSize, encData.length);
|
|
211
|
+
const segData = encData.slice(segStart, segEnd);
|
|
212
|
+
// Segment IV is hash(salt + segment_index_LE), truncated to block size.
|
|
213
|
+
idxView.setUint32(0, i, true);
|
|
214
|
+
const segIv = (await (0, crypto_1.hashAsync)(hashName, concat(info.keySalt, idxBytes))).slice(0, info.blockSize);
|
|
215
|
+
// Package segments use zero padding (MS-OFFCRYPTO §2.3.4.15). Use the
|
|
216
|
+
// raw (no-padding) AES-CBC decrypt — never the PKCS#7 path, which
|
|
217
|
+
// would silently mis-strip valid-looking trailing zeros.
|
|
218
|
+
segments.push((0, crypto_1.aesCbcDecryptRaw)(segData, packageKey, ivToBlockSize(segIv)));
|
|
219
|
+
}
|
|
220
|
+
// Concatenate and truncate to total size
|
|
221
|
+
const result = new Uint8Array(totalSize);
|
|
222
|
+
let offset = 0;
|
|
223
|
+
for (const seg of segments) {
|
|
224
|
+
const copyLen = Math.min(seg.length, totalSize - offset);
|
|
225
|
+
result.set(seg.slice(0, copyLen), offset);
|
|
226
|
+
offset += copyLen;
|
|
227
|
+
if (offset >= totalSize) {
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
// =============================================================================
|
|
234
|
+
// Internal Crypto Helpers
|
|
235
|
+
//
|
|
236
|
+
// All AES and SHA work is delegated to `@utils/crypto`. Node uses
|
|
237
|
+
// synchronous `node:crypto`, the browser variant uses Web Crypto / pure
|
|
238
|
+
// JS — same API on both sides.
|
|
239
|
+
// =============================================================================
|
|
240
|
+
function mapHashName(name) {
|
|
241
|
+
const map = {
|
|
242
|
+
SHA1: "SHA-1",
|
|
243
|
+
SHA256: "SHA-256",
|
|
244
|
+
SHA384: "SHA-384",
|
|
245
|
+
SHA512: "SHA-512"
|
|
246
|
+
};
|
|
247
|
+
return map[name] ?? "SHA-512";
|
|
248
|
+
}
|
|
249
|
+
/** Static lookup so the KDF spin loop doesn't pay a per-call cost. */
|
|
250
|
+
function getHashSizeFor(hashName) {
|
|
251
|
+
switch (hashName) {
|
|
252
|
+
case "SHA-1":
|
|
253
|
+
return 20;
|
|
254
|
+
case "SHA-256":
|
|
255
|
+
return 32;
|
|
256
|
+
case "SHA-384":
|
|
257
|
+
return 48;
|
|
258
|
+
case "SHA-512":
|
|
259
|
+
return 64;
|
|
260
|
+
default:
|
|
261
|
+
// Conservative upper bound: any reasonable hash output fits in 64 bytes.
|
|
262
|
+
// Callers that go through this path are misconfigured anyway and will
|
|
263
|
+
// be rejected by the keyBits sanity check after the first digest.
|
|
264
|
+
return 64;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Decrypt an AES-CBC blob whose plaintext was written with PKCS#7 padding.
|
|
269
|
+
* Used for the encryptedKeyValue / encryptedVerifierHashInput /
|
|
270
|
+
* encryptedVerifierHashValue blobs. The IV is truncated/extended to 16
|
|
271
|
+
* bytes per the OOXML spec.
|
|
272
|
+
*/
|
|
273
|
+
function aesCbcPkcs7Decrypt(data, key, iv) {
|
|
274
|
+
return (0, crypto_1.aesCbcDecrypt)(data, key, ivToBlockSize(iv));
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Encrypt with AES-CBC + PKCS#7 padding — the Agile spec's standard
|
|
278
|
+
* choice for verifier blobs and the encrypted package key.
|
|
279
|
+
*/
|
|
280
|
+
function aesCbcPkcs7Encrypt(data, key, iv) {
|
|
281
|
+
return (0, crypto_1.aesCbcEncrypt)(data, key, ivToBlockSize(iv));
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Encrypt with AES-CBC and zero-padding (no PKCS#7). Used by package
|
|
285
|
+
* segment encryption: data is already padded to a 16-byte boundary by
|
|
286
|
+
* the caller, and the on-disk format does not include a PKCS#7 trailer.
|
|
287
|
+
*/
|
|
288
|
+
function aesCbcZeroPadEncrypt(data, key, iv) {
|
|
289
|
+
return (0, crypto_1.aesCbcEncryptRaw)(data, key, ivToBlockSize(iv));
|
|
290
|
+
}
|
|
291
|
+
/** Truncate or right-pad an IV to the AES block size (16 bytes). */
|
|
292
|
+
function ivToBlockSize(iv) {
|
|
293
|
+
if (iv.length === 16) {
|
|
294
|
+
return iv;
|
|
295
|
+
}
|
|
296
|
+
const out = new Uint8Array(16);
|
|
297
|
+
out.set(iv.slice(0, 16));
|
|
298
|
+
return out;
|
|
299
|
+
}
|
|
300
|
+
function concat(a, b) {
|
|
301
|
+
const result = new Uint8Array(a.length + b.length);
|
|
302
|
+
result.set(a, 0);
|
|
303
|
+
result.set(b, a.length);
|
|
304
|
+
return result;
|
|
305
|
+
}
|
|
306
|
+
function stringToUtf16LE(s) {
|
|
307
|
+
const buf = new Uint8Array(s.length * 2);
|
|
308
|
+
for (let i = 0; i < s.length; i++) {
|
|
309
|
+
const code = s.charCodeAt(i);
|
|
310
|
+
buf[i * 2] = code & 0xff;
|
|
311
|
+
buf[i * 2 + 1] = (code >> 8) & 0xff;
|
|
312
|
+
}
|
|
313
|
+
return buf;
|
|
314
|
+
}
|
|
315
|
+
function bytesEqual(a, b) {
|
|
316
|
+
if (a.length !== b.length) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
let diff = 0;
|
|
320
|
+
for (let i = 0; i < a.length; i++) {
|
|
321
|
+
diff |= a[i] ^ b[i];
|
|
322
|
+
}
|
|
323
|
+
return diff === 0;
|
|
324
|
+
}
|
|
325
|
+
// =============================================================================
|
|
326
|
+
// EncryptionInfo XML Parser
|
|
327
|
+
// =============================================================================
|
|
328
|
+
/**
|
|
329
|
+
* Parse an EncryptionInfo XML stream from a CFB-wrapped encrypted DOCX.
|
|
330
|
+
*
|
|
331
|
+
* This is the UTF-8 XML part after the 8-byte version/flags header.
|
|
332
|
+
*
|
|
333
|
+
* @param xmlStr - The EncryptionInfo XML content.
|
|
334
|
+
* @returns Parsed agile encryption info.
|
|
335
|
+
*/
|
|
336
|
+
function parseEncryptionInfoXml(xmlStr) {
|
|
337
|
+
// Simple regex-based extraction for the key <keyEncryptors><keyEncryptor>... element
|
|
338
|
+
const keyDataMatch = /<keyData\s([\s\S]*?)\/>/.exec(xmlStr);
|
|
339
|
+
const pwdEncryptorMatch = /<p:encryptedKey\s([\s\S]*?)\/>/.exec(xmlStr);
|
|
340
|
+
if (!keyDataMatch || !pwdEncryptorMatch) {
|
|
341
|
+
throw new errors_1.DocxDecryptionError("Invalid EncryptionInfo XML - missing keyData or encryptedKey");
|
|
342
|
+
}
|
|
343
|
+
const pwdData = parseAttrs(pwdEncryptorMatch[1]);
|
|
344
|
+
// Required cryptographic fields — empty/missing values cannot decrypt and
|
|
345
|
+
// produce confusing CryptoOperation errors downstream. Fail fast with a
|
|
346
|
+
// clear message instead.
|
|
347
|
+
const requireField = (name) => {
|
|
348
|
+
const v = pwdData[name];
|
|
349
|
+
if (v === undefined || v === "") {
|
|
350
|
+
throw new errors_1.DocxDecryptionError(`Invalid EncryptionInfo XML - missing or empty required field: ${name}`);
|
|
351
|
+
}
|
|
352
|
+
return v;
|
|
353
|
+
};
|
|
354
|
+
const keyBitsRaw = parseInt(pwdData.keyBits ?? "256", 10);
|
|
355
|
+
if (keyBitsRaw !== 128 && keyBitsRaw !== 192 && keyBitsRaw !== 256) {
|
|
356
|
+
throw new errors_1.DocxDecryptionError(`Unsupported keyBits in EncryptionInfo: ${pwdData.keyBits} (expected 128, 192, or 256)`);
|
|
357
|
+
}
|
|
358
|
+
const hashAlgRaw = pwdData.hashAlgorithm ?? "SHA512";
|
|
359
|
+
if (hashAlgRaw !== "SHA1" &&
|
|
360
|
+
hashAlgRaw !== "SHA256" &&
|
|
361
|
+
hashAlgRaw !== "SHA384" &&
|
|
362
|
+
hashAlgRaw !== "SHA512") {
|
|
363
|
+
throw new errors_1.DocxDecryptionError(`Unsupported hashAlgorithm in EncryptionInfo: ${hashAlgRaw} (expected SHA1/SHA256/SHA384/SHA512)`);
|
|
364
|
+
}
|
|
365
|
+
// Validate numeric fields against sane ranges. EncryptionInfo XML is
|
|
366
|
+
// parsed straight from the CFB stream of an arbitrary input file, so
|
|
367
|
+
// every numeric attribute is attacker-controlled. Without bounds
|
|
368
|
+
// checks:
|
|
369
|
+
// - spinCount: a hostile file specifying spinCount=10⁹ would freeze
|
|
370
|
+
// the verifier-derivation loop in deriveEncryptionKey.
|
|
371
|
+
// - hashSize/blockSize: used as slice lengths and AES IV sizes.
|
|
372
|
+
// Outsized values silently produce wrong keys / IVs and obscure
|
|
373
|
+
// decryption errors; negative or NaN crashes downstream.
|
|
374
|
+
// Limits are deliberately wider than what real Office files emit so we
|
|
375
|
+
// don't reject legitimate documents.
|
|
376
|
+
const spinCount = parseInt(pwdData.spinCount ?? "100000", 10);
|
|
377
|
+
if (!Number.isFinite(spinCount) || spinCount < 0 || spinCount > 10000000) {
|
|
378
|
+
throw new errors_1.DocxDecryptionError(`Invalid spinCount in EncryptionInfo: ${pwdData.spinCount} (expected 0..10_000_000)`);
|
|
379
|
+
}
|
|
380
|
+
const hashSize = parseInt(pwdData.hashSize ?? "64", 10);
|
|
381
|
+
// Largest legitimate hash here is SHA-512 → 64 bytes. Cap at 128 to
|
|
382
|
+
// accommodate hypothetical extensions while still rejecting crazy values.
|
|
383
|
+
if (!Number.isFinite(hashSize) || hashSize < 1 || hashSize > 128) {
|
|
384
|
+
throw new errors_1.DocxDecryptionError(`Invalid hashSize in EncryptionInfo: ${pwdData.hashSize} (expected 1..128)`);
|
|
385
|
+
}
|
|
386
|
+
const blockSize = parseInt(pwdData.blockSize ?? "16", 10);
|
|
387
|
+
// AES is fixed at 16; some tooling emits 8 for legacy ciphers. Anything
|
|
388
|
+
// outside [8, 64] is bogus.
|
|
389
|
+
if (!Number.isFinite(blockSize) || blockSize < 8 || blockSize > 64) {
|
|
390
|
+
throw new errors_1.DocxDecryptionError(`Invalid blockSize in EncryptionInfo: ${pwdData.blockSize} (expected 8..64)`);
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
cipherAlgorithm: "AES",
|
|
394
|
+
cipherChaining: "ChainingModeCBC",
|
|
395
|
+
keyBits: keyBitsRaw,
|
|
396
|
+
hashAlgorithm: hashAlgRaw,
|
|
397
|
+
hashSize,
|
|
398
|
+
spinCount,
|
|
399
|
+
keySalt: (0, internal_utils_1.base64ToBytes)(requireField("saltValue")),
|
|
400
|
+
encryptedVerifierHashInput: (0, internal_utils_1.base64ToBytes)(requireField("encryptedVerifierHashInput")),
|
|
401
|
+
encryptedVerifierHashValue: (0, internal_utils_1.base64ToBytes)(requireField("encryptedVerifierHashValue")),
|
|
402
|
+
encryptedKeyValue: (0, internal_utils_1.base64ToBytes)(requireField("encryptedKeyValue")),
|
|
403
|
+
blockSize
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
function parseAttrs(str) {
|
|
407
|
+
const attrs = {};
|
|
408
|
+
const re = /(\w+)="([^"]*)"/g;
|
|
409
|
+
let match;
|
|
410
|
+
while ((match = re.exec(str)) !== null) {
|
|
411
|
+
attrs[match[1]] = match[2];
|
|
412
|
+
}
|
|
413
|
+
return attrs;
|
|
414
|
+
}
|
|
415
|
+
// =============================================================================
|
|
416
|
+
// High-level Encrypted DOCX Reader
|
|
417
|
+
// =============================================================================
|
|
418
|
+
/**
|
|
419
|
+
* Read an encrypted DOCX file by providing a password.
|
|
420
|
+
*
|
|
421
|
+
* Handles the full pipeline:
|
|
422
|
+
* 1. Parse CFB container
|
|
423
|
+
* 2. Extract EncryptionInfo and EncryptedPackage streams
|
|
424
|
+
* 3. Verify password and decrypt
|
|
425
|
+
* 4. Return the decrypted DOCX ZIP bytes
|
|
426
|
+
*
|
|
427
|
+
* @param buffer - The encrypted DOCX file (CFB format).
|
|
428
|
+
* @param password - The password to decrypt with.
|
|
429
|
+
* @param maxDecryptedSize - Optional cap on the decrypted size (defaults to 512 MiB).
|
|
430
|
+
* @returns The decrypted DOCX ZIP bytes (can be passed to readDocx).
|
|
431
|
+
* @throws Error if the file is not encrypted, password is wrong, or decryption fails.
|
|
432
|
+
*/
|
|
433
|
+
async function decryptDocx(buffer, password, maxDecryptedSize) {
|
|
434
|
+
if (!isEncryptedDocx(buffer)) {
|
|
435
|
+
throw new errors_1.DocxDecryptionError("Not an encrypted DOCX file (CFB signature not found)");
|
|
436
|
+
}
|
|
437
|
+
// Parse CFB container
|
|
438
|
+
const entries = (0, cfb_reader_1.readCfb)(buffer);
|
|
439
|
+
// Find EncryptionInfo stream
|
|
440
|
+
const _encInfoEntry = entries.find(e => e.name === "EncryptionInfo" || e.name === "\x06DataSpaces");
|
|
441
|
+
// The actual EncryptionInfo stream
|
|
442
|
+
const encInfoStream = entries.find(e => e.name === "EncryptionInfo");
|
|
443
|
+
if (!encInfoStream) {
|
|
444
|
+
throw new errors_1.DocxDecryptionError("CFB: EncryptionInfo stream not found");
|
|
445
|
+
}
|
|
446
|
+
// Find EncryptedPackage stream
|
|
447
|
+
const encPkgEntry = entries.find(e => e.name === "EncryptedPackage");
|
|
448
|
+
if (!encPkgEntry) {
|
|
449
|
+
throw new errors_1.DocxDecryptionError("CFB: EncryptedPackage stream not found");
|
|
450
|
+
}
|
|
451
|
+
// Parse EncryptionInfo — first 4 bytes are version major + minor + flags.
|
|
452
|
+
const infoData = encInfoStream.data;
|
|
453
|
+
const versionView = new DataView(infoData.buffer, infoData.byteOffset, 4);
|
|
454
|
+
const versionMajor = versionView.getUint16(0, true);
|
|
455
|
+
const versionMinor = versionView.getUint16(2, true);
|
|
456
|
+
// MS-OFFCRYPTO §2.3 distinguishes encryption families primarily by the
|
|
457
|
+
// (major, minor) pair: Agile is 4.4, Extensible is 4.3, ECMA-376 Standard
|
|
458
|
+
// Encryption is 4.2, RC4 CryptoAPI is 4.x with minor < 2, etc. We
|
|
459
|
+
// currently implement only Agile.
|
|
460
|
+
if (versionMajor === 4 && versionMinor === 4) {
|
|
461
|
+
// Agile encryption — XML follows after 8 bytes
|
|
462
|
+
const xmlStr = internal_utils_1.utf8Decoder.decode(infoData.slice(8));
|
|
463
|
+
const info = parseEncryptionInfoXml(xmlStr);
|
|
464
|
+
// Verify password
|
|
465
|
+
const valid = await verifyPassword(password, info);
|
|
466
|
+
if (!valid) {
|
|
467
|
+
throw new errors_1.DocxDecryptionError("Incorrect password");
|
|
468
|
+
}
|
|
469
|
+
// Decrypt package
|
|
470
|
+
return decryptPackage(encPkgEntry.data, info, password, maxDecryptedSize);
|
|
471
|
+
}
|
|
472
|
+
throw new errors_1.DocxDecryptionError(`Unsupported encryption version: ${versionMajor}.${versionMinor}. ` +
|
|
473
|
+
`Only Agile Encryption (4.4) is supported.`);
|
|
474
|
+
}
|
|
475
|
+
// =============================================================================
|
|
476
|
+
// Encrypt DOCX
|
|
477
|
+
// =============================================================================
|
|
478
|
+
/**
|
|
479
|
+
* Encrypt a DOCX ZIP file with a password using Agile Encryption (MS-OFFCRYPTO).
|
|
480
|
+
*
|
|
481
|
+
* Produces a CFB (OLE2 Compound File) containing:
|
|
482
|
+
* - EncryptionInfo stream (Agile encryption XML)
|
|
483
|
+
* - EncryptedPackage stream (segment-encrypted ZIP data)
|
|
484
|
+
*
|
|
485
|
+
* The output can be opened by Microsoft Word with the given password.
|
|
486
|
+
*
|
|
487
|
+
* @param zipBytes - The unencrypted DOCX content (ZIP format).
|
|
488
|
+
* @param password - The password to encrypt with.
|
|
489
|
+
* @param options - Encryption options (key length, hash algorithm, spin count).
|
|
490
|
+
* @returns The encrypted DOCX as a CFB-formatted Uint8Array.
|
|
491
|
+
*/
|
|
492
|
+
async function encryptDocx(zipBytes, password, options) {
|
|
493
|
+
const keyBits = options?.keyBits ?? 256;
|
|
494
|
+
const hashAlgorithm = options?.hashAlgorithm ?? "SHA512";
|
|
495
|
+
const spinCount = options?.spinCount ?? 100000;
|
|
496
|
+
const hashName = mapHashName(hashAlgorithm);
|
|
497
|
+
const hashSize = getHashSizeFor(hashName);
|
|
498
|
+
const keyBytes = keyBits / 8;
|
|
499
|
+
const blockSize = 16;
|
|
500
|
+
// 1. Generate random salt (16 bytes) and package key
|
|
501
|
+
const keySalt = (0, internal_utils_1.randomBytes)(16);
|
|
502
|
+
const packageKey = (0, internal_utils_1.randomBytes)(keyBytes);
|
|
503
|
+
// 2. Generate key encryption key (for encrypting the package key)
|
|
504
|
+
const keyEncryptionKey = await deriveEncryptionKey(password, { keySalt, spinCount, hashAlgorithm, keyBits }, exports.AGILE_BLOCK_KEYS.encryptedKey);
|
|
505
|
+
// 3. Encrypt the package key
|
|
506
|
+
const encryptedKeyValue = aesCbcPkcs7Encrypt(packageKey, keyEncryptionKey, keySalt);
|
|
507
|
+
// 4. Generate verifier: random 16 bytes, hash them, encrypt both
|
|
508
|
+
const verifierInput = (0, internal_utils_1.randomBytes)(16);
|
|
509
|
+
const verifierHash = await (0, crypto_1.hashAsync)(hashName, verifierInput);
|
|
510
|
+
const verifierInputKey = await deriveEncryptionKey(password, { keySalt, spinCount, hashAlgorithm, keyBits }, exports.AGILE_BLOCK_KEYS.verifierHashInput);
|
|
511
|
+
const encryptedVerifierHashInput = aesCbcPkcs7Encrypt(verifierInput, verifierInputKey, keySalt);
|
|
512
|
+
const verifierValueKey = await deriveEncryptionKey(password, { keySalt, spinCount, hashAlgorithm, keyBits }, exports.AGILE_BLOCK_KEYS.verifierHashValue);
|
|
513
|
+
const encryptedVerifierHashValue = aesCbcPkcs7Encrypt(verifierHash, verifierValueKey, keySalt);
|
|
514
|
+
// 5. Encrypt the ZIP data in 4096-byte segments
|
|
515
|
+
const encryptedPackage = await encryptPackageData(zipBytes, packageKey, keySalt, hashName, blockSize);
|
|
516
|
+
// 6. Generate EncryptionInfo XML
|
|
517
|
+
const encInfoXml = buildEncryptionInfoXml({
|
|
518
|
+
keyBits,
|
|
519
|
+
hashAlgorithm,
|
|
520
|
+
hashSize,
|
|
521
|
+
spinCount,
|
|
522
|
+
blockSize,
|
|
523
|
+
keySalt,
|
|
524
|
+
encryptedVerifierHashInput,
|
|
525
|
+
encryptedVerifierHashValue,
|
|
526
|
+
encryptedKeyValue
|
|
527
|
+
});
|
|
528
|
+
// Prepend 8-byte version header: version 4.4 + flags 0x40
|
|
529
|
+
const xmlBytes = internal_utils_1.utf8Encoder.encode(encInfoXml);
|
|
530
|
+
const encInfoStream = new Uint8Array(8 + xmlBytes.length);
|
|
531
|
+
const encInfoView = new DataView(encInfoStream.buffer);
|
|
532
|
+
encInfoView.setUint16(0, 4, true); // version major
|
|
533
|
+
encInfoView.setUint16(2, 4, true); // version minor
|
|
534
|
+
encInfoView.setUint32(4, 0x40, true); // flags (agile)
|
|
535
|
+
encInfoStream.set(xmlBytes, 8);
|
|
536
|
+
// 7. Package into CFB
|
|
537
|
+
const cfbBytes = (0, cfb_reader_1.writeCfb)([
|
|
538
|
+
{ name: "EncryptionInfo", data: encInfoStream },
|
|
539
|
+
{ name: "EncryptedPackage", data: encryptedPackage }
|
|
540
|
+
]);
|
|
541
|
+
return cfbBytes;
|
|
542
|
+
}
|
|
543
|
+
// =============================================================================
|
|
544
|
+
// Encrypt Helpers
|
|
545
|
+
// =============================================================================
|
|
546
|
+
/**
|
|
547
|
+
* Encrypt the package data in 4096-byte segments.
|
|
548
|
+
*
|
|
549
|
+
* Format: [8 bytes: total size LE uint64] [encrypted segment 0] [encrypted segment 1] ...
|
|
550
|
+
* Each segment IV = hash(salt + segment_index_LE) truncated to 16 bytes.
|
|
551
|
+
*/
|
|
552
|
+
async function encryptPackageData(data, packageKey, keySalt, hashName, blockSize) {
|
|
553
|
+
const segmentSize = 4096;
|
|
554
|
+
const segCount = Math.ceil(data.length / segmentSize);
|
|
555
|
+
const encSegments = [];
|
|
556
|
+
const idxBytes = new Uint8Array(4);
|
|
557
|
+
const idxView = new DataView(idxBytes.buffer);
|
|
558
|
+
for (let i = 0; i < segCount; i++) {
|
|
559
|
+
const segStart = i * segmentSize;
|
|
560
|
+
const segEnd = Math.min(segStart + segmentSize, data.length);
|
|
561
|
+
let segData = data.slice(segStart, segEnd);
|
|
562
|
+
// Pad last segment to multiple of blockSize if needed
|
|
563
|
+
if (segData.length % blockSize !== 0) {
|
|
564
|
+
const padded = new Uint8Array(Math.ceil(segData.length / blockSize) * blockSize);
|
|
565
|
+
padded.set(segData);
|
|
566
|
+
segData = padded;
|
|
567
|
+
}
|
|
568
|
+
// Segment IV = hash(salt + segment_index_LE) truncated to blockSize
|
|
569
|
+
idxView.setUint32(0, i, true);
|
|
570
|
+
const segIv = (await (0, crypto_1.hashAsync)(hashName, concat(keySalt, idxBytes))).slice(0, blockSize);
|
|
571
|
+
encSegments.push(aesCbcZeroPadEncrypt(segData, packageKey, segIv));
|
|
572
|
+
}
|
|
573
|
+
// Total size (8 bytes LE uint64) + concatenated encrypted segments
|
|
574
|
+
const totalEncLen = encSegments.reduce((sum, s) => sum + s.length, 0);
|
|
575
|
+
const result = new Uint8Array(8 + totalEncLen);
|
|
576
|
+
const sizeView = new DataView(result.buffer);
|
|
577
|
+
sizeView.setBigUint64(0, BigInt(data.length), true);
|
|
578
|
+
let offset = 8;
|
|
579
|
+
for (const seg of encSegments) {
|
|
580
|
+
result.set(seg, offset);
|
|
581
|
+
offset += seg.length;
|
|
582
|
+
}
|
|
583
|
+
return result;
|
|
584
|
+
}
|
|
585
|
+
/** Build the Agile EncryptionInfo XML document. */
|
|
586
|
+
function buildEncryptionInfoXml(params) {
|
|
587
|
+
const { keyBits, hashAlgorithm, hashSize, spinCount, blockSize, keySalt, encryptedVerifierHashInput, encryptedVerifierHashValue, encryptedKeyValue } = params;
|
|
588
|
+
const saltB64 = (0, internal_utils_1.bytesToBase64)(keySalt);
|
|
589
|
+
const vhiB64 = (0, internal_utils_1.bytesToBase64)(encryptedVerifierHashInput);
|
|
590
|
+
const vhvB64 = (0, internal_utils_1.bytesToBase64)(encryptedVerifierHashValue);
|
|
591
|
+
const ekvB64 = (0, internal_utils_1.bytesToBase64)(encryptedKeyValue);
|
|
592
|
+
return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n' +
|
|
593
|
+
'<encryption xmlns="http://schemas.microsoft.com/office/2006/encryption" ' +
|
|
594
|
+
'xmlns:p="http://schemas.microsoft.com/office/2006/keyEncryptor/password" ' +
|
|
595
|
+
'xmlns:c="http://schemas.microsoft.com/office/2006/keyEncryptor/certificate">\r\n' +
|
|
596
|
+
`<keyData saltSize="16" blockSize="${blockSize}" keyBits="${keyBits}" ` +
|
|
597
|
+
`hashSize="${hashSize}" cipherAlgorithm="AES" cipherChaining="ChainingModeCBC" ` +
|
|
598
|
+
`hashAlgorithm="${hashAlgorithm}" saltValue="${saltB64}"/>\r\n` +
|
|
599
|
+
'<dataIntegrity encryptedHmacKey="" encryptedHmacValue=""/>\r\n' +
|
|
600
|
+
"<keyEncryptors>\r\n" +
|
|
601
|
+
'<keyEncryptor uri="http://schemas.microsoft.com/office/2006/keyEncryptor/password">\r\n' +
|
|
602
|
+
`<p:encryptedKey spinCount="${spinCount}" saltSize="16" blockSize="${blockSize}" ` +
|
|
603
|
+
`keyBits="${keyBits}" hashSize="${hashSize}" cipherAlgorithm="AES" ` +
|
|
604
|
+
`cipherChaining="ChainingModeCBC" hashAlgorithm="${hashAlgorithm}" ` +
|
|
605
|
+
`saltValue="${saltB64}" ` +
|
|
606
|
+
`encryptedVerifierHashInput="${vhiB64}" ` +
|
|
607
|
+
`encryptedVerifierHashValue="${vhvB64}" ` +
|
|
608
|
+
`encryptedKeyValue="${ekvB64}"/>\r\n` +
|
|
609
|
+
"</keyEncryptor>\r\n" +
|
|
610
|
+
"</keyEncryptors>\r\n" +
|
|
611
|
+
"</encryption>");
|
|
612
|
+
}
|