pdf-lite 1.0.0
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/.commitlintrc.cjs +25 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- package/.github/workflows/docs.yaml +93 -0
- package/.github/workflows/prepare-release.yaml +79 -0
- package/.github/workflows/release.yaml +80 -0
- package/.github/workflows/test.yaml +35 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/.prettierignore +4 -0
- package/.prettierrc +4 -0
- package/CONTRIBUTING.md +109 -0
- package/EXAMPLES.md +1515 -0
- package/LICENSE +21 -0
- package/README.md +285 -0
- package/examples/001-create-pdf.ts +112 -0
- package/examples/002-create-encrypted-pdf.ts +121 -0
- package/examples/003-sign-pdf.ts +347 -0
- package/examples/004-incremental-update.ts +206 -0
- package/examples/005-modify-acroform.ts +374 -0
- package/examples/006-tokeniser-example.ts +131 -0
- package/examples/007-decoder-example.ts +197 -0
- package/package.json +72 -0
- package/packages/pdf-lite/README.md +3 -0
- package/packages/pdf-lite/package.json +68 -0
- package/packages/pdf-lite/scripts/create-encryption-tests.sh +41 -0
- package/packages/pdf-lite/scripts/gen-signing-keys.sh +290 -0
- package/packages/pdf-lite/scripts/generate-all-signing-keys.sh +70 -0
- package/packages/pdf-lite/src/core/decoder.ts +454 -0
- package/packages/pdf-lite/src/core/generators.ts +128 -0
- package/packages/pdf-lite/src/core/incremental-parser.ts +221 -0
- package/packages/pdf-lite/src/core/index.ts +2 -0
- package/packages/pdf-lite/src/core/objects/pdf-array.ts +54 -0
- package/packages/pdf-lite/src/core/objects/pdf-boolean.ts +19 -0
- package/packages/pdf-lite/src/core/objects/pdf-comment.ts +50 -0
- package/packages/pdf-lite/src/core/objects/pdf-date.ts +74 -0
- package/packages/pdf-lite/src/core/objects/pdf-dictionary.ts +171 -0
- package/packages/pdf-lite/src/core/objects/pdf-hexadecimal.ts +54 -0
- package/packages/pdf-lite/src/core/objects/pdf-indirect-object.ts +137 -0
- package/packages/pdf-lite/src/core/objects/pdf-name.ts +19 -0
- package/packages/pdf-lite/src/core/objects/pdf-null.ts +15 -0
- package/packages/pdf-lite/src/core/objects/pdf-number.ts +98 -0
- package/packages/pdf-lite/src/core/objects/pdf-object-reference.ts +30 -0
- package/packages/pdf-lite/src/core/objects/pdf-object.ts +107 -0
- package/packages/pdf-lite/src/core/objects/pdf-start-xref.ts +39 -0
- package/packages/pdf-lite/src/core/objects/pdf-stream.ts +687 -0
- package/packages/pdf-lite/src/core/objects/pdf-string.ts +38 -0
- package/packages/pdf-lite/src/core/objects/pdf-trailer.ts +57 -0
- package/packages/pdf-lite/src/core/objects/pdf-xref-table.ts +264 -0
- package/packages/pdf-lite/src/core/parser.ts +22 -0
- package/packages/pdf-lite/src/core/ref.ts +102 -0
- package/packages/pdf-lite/src/core/serializer.ts +68 -0
- package/packages/pdf-lite/src/core/streams/object-stream.ts +20 -0
- package/packages/pdf-lite/src/core/tokeniser.ts +687 -0
- package/packages/pdf-lite/src/core/tokens/boolean-token.ts +20 -0
- package/packages/pdf-lite/src/core/tokens/byte-offset-token.ts +20 -0
- package/packages/pdf-lite/src/core/tokens/comment-token.ts +32 -0
- package/packages/pdf-lite/src/core/tokens/end-array-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/end-dictionary-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/end-object-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/end-stream-token.ts +11 -0
- package/packages/pdf-lite/src/core/tokens/hexadecimal-token.ts +22 -0
- package/packages/pdf-lite/src/core/tokens/name-token.ts +19 -0
- package/packages/pdf-lite/src/core/tokens/null-token.ts +9 -0
- package/packages/pdf-lite/src/core/tokens/number-token.ts +164 -0
- package/packages/pdf-lite/src/core/tokens/object-reference-token.ts +24 -0
- package/packages/pdf-lite/src/core/tokens/start-array-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/start-dictionary-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/start-object-token.ts +28 -0
- package/packages/pdf-lite/src/core/tokens/start-stream-token.ts +52 -0
- package/packages/pdf-lite/src/core/tokens/start-xref-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/stream-chunk-token.ts +8 -0
- package/packages/pdf-lite/src/core/tokens/string-token.ts +17 -0
- package/packages/pdf-lite/src/core/tokens/token.ts +43 -0
- package/packages/pdf-lite/src/core/tokens/trailer-token.ts +12 -0
- package/packages/pdf-lite/src/core/tokens/whitespace-token.ts +43 -0
- package/packages/pdf-lite/src/core/tokens/xref-table-entry-token.ts +65 -0
- package/packages/pdf-lite/src/core/tokens/xref-table-section-start-token.ts +31 -0
- package/packages/pdf-lite/src/core/tokens/xref-table-start-token.ts +13 -0
- package/packages/pdf-lite/src/crypto/ciphers/aes128.ts +63 -0
- package/packages/pdf-lite/src/crypto/ciphers/aes256.ts +50 -0
- package/packages/pdf-lite/src/crypto/ciphers/rc4.ts +82 -0
- package/packages/pdf-lite/src/crypto/constants.ts +10 -0
- package/packages/pdf-lite/src/crypto/key-derivation/key-derivation-aes256.ts +213 -0
- package/packages/pdf-lite/src/crypto/key-derivation/key-derivation.ts +122 -0
- package/packages/pdf-lite/src/crypto/key-gen/key-gen-aes256.ts +79 -0
- package/packages/pdf-lite/src/crypto/key-gen/key-gen-rc4-128.ts +190 -0
- package/packages/pdf-lite/src/crypto/key-gen/key-gen-rc4-40.ts +129 -0
- package/packages/pdf-lite/src/crypto/types.ts +6 -0
- package/packages/pdf-lite/src/crypto/utils.ts +81 -0
- package/packages/pdf-lite/src/filters/ascii85.ts +128 -0
- package/packages/pdf-lite/src/filters/asciihex.ts +55 -0
- package/packages/pdf-lite/src/filters/flate.ts +39 -0
- package/packages/pdf-lite/src/filters/lzw.ts +144 -0
- package/packages/pdf-lite/src/filters/pass-through.ts +37 -0
- package/packages/pdf-lite/src/filters/runlength.ts +92 -0
- package/packages/pdf-lite/src/filters/types.ts +21 -0
- package/packages/pdf-lite/src/index.ts +4 -0
- package/packages/pdf-lite/src/pdf/errors.ts +5 -0
- package/packages/pdf-lite/src/pdf/index.ts +4 -0
- package/packages/pdf-lite/src/pdf/pdf-document.ts +924 -0
- package/packages/pdf-lite/src/pdf/pdf-reader.ts +57 -0
- package/packages/pdf-lite/src/pdf/pdf-revision.ts +234 -0
- package/packages/pdf-lite/src/pdf/pdf-xref-lookup.ts +527 -0
- package/packages/pdf-lite/src/security/crypt-filters/aesv2.ts +58 -0
- package/packages/pdf-lite/src/security/crypt-filters/aesv3.ts +56 -0
- package/packages/pdf-lite/src/security/crypt-filters/base.ts +140 -0
- package/packages/pdf-lite/src/security/crypt-filters/identity.ts +40 -0
- package/packages/pdf-lite/src/security/crypt-filters/v2.ts +59 -0
- package/packages/pdf-lite/src/security/handlers/base.ts +625 -0
- package/packages/pdf-lite/src/security/handlers/pubSec.ts +413 -0
- package/packages/pdf-lite/src/security/handlers/utils.ts +304 -0
- package/packages/pdf-lite/src/security/handlers/v1.ts +225 -0
- package/packages/pdf-lite/src/security/handlers/v2.ts +128 -0
- package/packages/pdf-lite/src/security/handlers/v4.ts +379 -0
- package/packages/pdf-lite/src/security/handlers/v5.ts +298 -0
- package/packages/pdf-lite/src/security/types.ts +158 -0
- package/packages/pdf-lite/src/signing/document-security-store.ts +224 -0
- package/packages/pdf-lite/src/signing/index.ts +3 -0
- package/packages/pdf-lite/src/signing/signatures/adbe-pkcs7-detached.ts +154 -0
- package/packages/pdf-lite/src/signing/signatures/adbe-pkcs7-sha1.ts +161 -0
- package/packages/pdf-lite/src/signing/signatures/adbe-x509-rsa-sha1.ts +106 -0
- package/packages/pdf-lite/src/signing/signatures/base.ts +229 -0
- package/packages/pdf-lite/src/signing/signatures/etsi-cades-detached.ts +229 -0
- package/packages/pdf-lite/src/signing/signatures/etsi-rfc3161.ts +92 -0
- package/packages/pdf-lite/src/signing/signatures/index.ts +6 -0
- package/packages/pdf-lite/src/signing/signer.ts +120 -0
- package/packages/pdf-lite/src/signing/types.ts +86 -0
- package/packages/pdf-lite/src/signing/utils.ts +71 -0
- package/packages/pdf-lite/src/types.ts +44 -0
- package/packages/pdf-lite/src/utils/IterableReadableStream.ts +30 -0
- package/packages/pdf-lite/src/utils/algos.ts +446 -0
- package/packages/pdf-lite/src/utils/assert.ts +42 -0
- package/packages/pdf-lite/src/utils/bytesToHex.ts +18 -0
- package/packages/pdf-lite/src/utils/bytesToHexBytes.ts +27 -0
- package/packages/pdf-lite/src/utils/bytesToString.ts +17 -0
- package/packages/pdf-lite/src/utils/concatUint8Arrays.ts +26 -0
- package/packages/pdf-lite/src/utils/escapeString.ts +49 -0
- package/packages/pdf-lite/src/utils/hexBytesToBytes.ts +22 -0
- package/packages/pdf-lite/src/utils/hexBytesToString.ts +21 -0
- package/packages/pdf-lite/src/utils/hexToBytes.ts +18 -0
- package/packages/pdf-lite/src/utils/padBytes.ts +25 -0
- package/packages/pdf-lite/src/utils/predictors.ts +332 -0
- package/packages/pdf-lite/src/utils/replaceInBuffer.ts +56 -0
- package/packages/pdf-lite/src/utils/stringToBytes.ts +22 -0
- package/packages/pdf-lite/src/utils/stringToHexBytes.ts +23 -0
- package/packages/pdf-lite/src/utils/unescapeString.ts +123 -0
- package/packages/pdf-lite/test/acceptance/__snapshots__/versions.node.test.ts.snap +60766 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.3/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-aes-128.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-aes-256.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-rc4-128.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-rc4-40.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.5/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.6/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.7/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-aes-128.pdf +43 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-aes-256.pdf +43 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-rc4-128.pdf +43 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-rc4-40.pdf +44 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic.pdf +79 -0
- package/packages/pdf-lite/test/acceptance/versions.node.test.ts +41 -0
- package/packages/pdf-lite/test/unit/__snapshots__/decoder.node.test.ts.snap +86947 -0
- package/packages/pdf-lite/test/unit/__snapshots__/tokeniser.node.test.ts.snap +131829 -0
- package/packages/pdf-lite/test/unit/ciphers.test.ts +61 -0
- package/packages/pdf-lite/test/unit/decoder.node.test.ts +21 -0
- package/packages/pdf-lite/test/unit/decoder.test.ts +567 -0
- package/packages/pdf-lite/test/unit/filters.test.ts +67 -0
- package/packages/pdf-lite/test/unit/fixtures/basic.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-aes-128.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-aes-256.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-rc4-128.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-rc4-40.pdf +43 -0
- package/packages/pdf-lite/test/unit/fixtures/protectedAdobeLivecycle.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/rsa-2048/index.ts +187 -0
- package/packages/pdf-lite/test/unit/fixtures/template.pdf +0 -0
- package/packages/pdf-lite/test/unit/incremental-update.test.ts +0 -0
- package/packages/pdf-lite/test/unit/objects.test.ts +0 -0
- package/packages/pdf-lite/test/unit/pdf-document-signing.test.ts +0 -0
- package/packages/pdf-lite/test/unit/pdf-revision.test.ts +195 -0
- package/packages/pdf-lite/test/unit/pdf.browser.test.ts +0 -0
- package/packages/pdf-lite/test/unit/predictors.test.ts +226 -0
- package/packages/pdf-lite/test/unit/ref.test.ts +158 -0
- package/packages/pdf-lite/test/unit/security-handlers.test.ts +645 -0
- package/packages/pdf-lite/test/unit/serializer.test.ts +81 -0
- package/packages/pdf-lite/test/unit/signature-objects.test.ts +814 -0
- package/packages/pdf-lite/test/unit/string-escaping.test.ts +84 -0
- package/packages/pdf-lite/test/unit/tokeniser.node.test.ts +38 -0
- package/packages/pdf-lite/test/unit/tokeniser.test.ts +1213 -0
- package/packages/pdf-lite/test/unit/utils.test.ts +248 -0
- package/packages/pdf-lite/test/unit/xref-lookup.test.ts +72 -0
- package/packages/pdf-lite/tsconfig.json +4 -0
- package/packages/pdf-lite/tsconfig.prod.json +8 -0
- package/packages/pdf-lite/typedoc.json +14 -0
- package/packages/pdf-lite/vitest.config.ts +43 -0
- package/pnpm-workspace.yaml +2 -0
- package/renovate.json +34 -0
- package/scripts/build-examples.ts +30 -0
- package/scripts/bump-version.sh +56 -0
- package/scripts/gen-html-docs.sh +21 -0
- package/scripts/gen-md-docs.sh +15 -0
- package/scripts/prepare-release.sh +33 -0
- package/tsconfig.json +22 -0
- package/tsconfig.prod.json +12 -0
- package/typedoc.json +34 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { flate } from '../../src/filters/flate.js'
|
|
3
|
+
import { ascii85 } from '../../src/filters/ascii85.js'
|
|
4
|
+
import { runLength } from '../../src/filters/runlength.js'
|
|
5
|
+
import { asciiHex } from '../../src/filters/asciihex.js'
|
|
6
|
+
import { lzw } from '../../src/filters/lzw.js'
|
|
7
|
+
import { stringToBytes } from '../../src/utils/stringToBytes.js'
|
|
8
|
+
|
|
9
|
+
function toText(data: Uint8Array) {
|
|
10
|
+
return new TextDecoder().decode(data)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe('PDF filters', () => {
|
|
14
|
+
describe('FlateDecode', () => {
|
|
15
|
+
it('should encode and decode', async () => {
|
|
16
|
+
const text = 'Hello World'
|
|
17
|
+
const filter = flate()
|
|
18
|
+
const data = stringToBytes(text)
|
|
19
|
+
const encoded = await filter.encode(data)
|
|
20
|
+
const decoded = await filter.decode(encoded)
|
|
21
|
+
expect(toText(decoded)).toEqual(text)
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
describe('ASCII85', () => {
|
|
26
|
+
it('should encode and decode', async () => {
|
|
27
|
+
const text = 'Hello World!'
|
|
28
|
+
const filter = ascii85()
|
|
29
|
+
const data = stringToBytes(text)
|
|
30
|
+
const encoded = await filter.encode(data)
|
|
31
|
+
const decoded = await filter.decode(encoded)
|
|
32
|
+
expect(toText(decoded)).toEqual(text)
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
describe('RunLength', () => {
|
|
37
|
+
it('should encode and decode', async () => {
|
|
38
|
+
const text = 'AAABBBCCCCDDDDDEEEEEEEEEEEEEEFFFFF'
|
|
39
|
+
const filter = runLength()
|
|
40
|
+
const data = stringToBytes(text)
|
|
41
|
+
const encoded = await filter.encode(data)
|
|
42
|
+
const decoded = await filter.decode(encoded)
|
|
43
|
+
expect(toText(decoded)).toEqual(text)
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
describe('ASCIIHex', () => {
|
|
48
|
+
it('should encode and decode', async () => {
|
|
49
|
+
const text = 'Hello World!'
|
|
50
|
+
const filter = asciiHex()
|
|
51
|
+
const data = stringToBytes(text)
|
|
52
|
+
const encoded = await filter.encode(data)
|
|
53
|
+
const decoded = await filter.decode(encoded)
|
|
54
|
+
expect(toText(decoded)).toEqual(text)
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
describe('LZW', () => {
|
|
59
|
+
it('should decode a simple PDF LZW stream', async () => {
|
|
60
|
+
const text = 'Hello World!'
|
|
61
|
+
const filter = lzw()
|
|
62
|
+
const encoded = await filter.encode(stringToBytes(text))
|
|
63
|
+
const decoded = await filter.decode(encoded)
|
|
64
|
+
expect(toText(decoded)).toEqual(text)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
})
|
|
Binary file
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
%PDF-2.0
|
|
2
|
+
%����
|
|
3
|
+
1 0 obj
|
|
4
|
+
<< /AcroForm 2 0 R /Pages 3 0 R /Type /Catalog >>
|
|
5
|
+
endobj
|
|
6
|
+
2 0 obj
|
|
7
|
+
<< /NeedAppearances true /Producer <1101501c41f1> >>
|
|
8
|
+
endobj
|
|
9
|
+
3 0 obj
|
|
10
|
+
<< /Count 1 /Kids [ 4 0 R ] /Type /Pages >>
|
|
11
|
+
endobj
|
|
12
|
+
4 0 obj
|
|
13
|
+
<< /Contents 5 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 3 0 R /Resources << /Font 6 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> /Type /Page >>
|
|
14
|
+
endobj
|
|
15
|
+
5 0 obj
|
|
16
|
+
<< /Length 84 /Filter /FlateDecode >>
|
|
17
|
+
stream
|
|
18
|
+
\0ήM�(r('�TgC�r�!{+���L4{"H,���;���|���"�K�:�Ki+�~!:,���mr`��?!�Ws%�^p8b�endstream
|
|
19
|
+
endobj
|
|
20
|
+
6 0 obj
|
|
21
|
+
<< /F1 7 0 R >>
|
|
22
|
+
endobj
|
|
23
|
+
7 0 obj
|
|
24
|
+
<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >>
|
|
25
|
+
endobj
|
|
26
|
+
8 0 obj
|
|
27
|
+
<< /Filter /Standard /Length 40 /O <f86213eb0ced81f097947f3b343e34cac8ca92ce8f6fee2556fa31ec1fe968af> /P -4 /R 2 /U <3d85de05ebd0fa07a9d161c41ad34d272273126e93053f4287f86875cc77d577> /V 1 >>
|
|
28
|
+
endobj
|
|
29
|
+
xref
|
|
30
|
+
0 9
|
|
31
|
+
0000000000 65535 f
|
|
32
|
+
0000000015 00000 n
|
|
33
|
+
0000000080 00000 n
|
|
34
|
+
0000000148 00000 n
|
|
35
|
+
0000000207 00000 n
|
|
36
|
+
0000000406 00000 n
|
|
37
|
+
0000000560 00000 n
|
|
38
|
+
0000000591 00000 n
|
|
39
|
+
0000000698 00000 n
|
|
40
|
+
trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<0cb4c77edde8d0dfcfa4658d52075bfa><0cb4c77edde8d0dfcfa4658d52075bfa>] /Encrypt 8 0 R >>
|
|
41
|
+
startxref
|
|
42
|
+
904
|
|
43
|
+
%%EOF
|
|
Binary file
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
const rsaPrivateKeyPem = `-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCR5nNNtbxtqK4Y
|
|
3
|
+
M97lInYpKeY1TvU/8Gsb1Xash/pIFh9SoUvi1iJQUjJTm1u0fmzwkCEFcjDm1iB2
|
|
4
|
+
39JoVhKDeK5/559i4evLycR6K+dSeUhERgox5Yh6GfA6ayVp7skegHGPGOfl73jc
|
|
5
|
+
M+EAzi7VC8HDWPQ6yT7aP3fnipfgsImpF+mjbzc05R0cY8+1wlBOd/wieq6IFiQD
|
|
6
|
+
NGi4vj4fClxuLSBSjK19rqfipux6Tc+EapcXSCfvSNAWZyCgicog92VHnESUXpFQ
|
|
7
|
+
Oz8HHfPX7nlcsExDh207Uoct8TURasUmId/qomka3ISWD3bq0Im1kXmPZ9b5bcdU
|
|
8
|
+
g7S7XMeTAgMBAAECggEALRxzh1ILXl6a4bncD73tigG9/7qXovrrqzH/3Q24KaTJ
|
|
9
|
+
b4uWwp7SAkK/89Dj9HVoqqLtytjJXP5VEFxZGtCOLd9ZGQwdYH4ZIawTl3DOt9Xv
|
|
10
|
+
Lcj4KwBdB9/QQsfRTCU8QzWUpxmcziASnwddaRnXKiFV+lgdP7XsvJ+GK+3S0vJb
|
|
11
|
+
GbWKXNnsJqf+2x1ec7Wog0JLUbTMRDVR6/S3PcMXTMCrMe1JMwwGEoZQJje/v5aW
|
|
12
|
+
21Iz/3bpVNZQcY2wIH73LheS7cslIcYA1m5RMX488JvluwHNOeUP5vvD+fPenv0q
|
|
13
|
+
Pclwu0b3p3J/tfznjyEJnEU3QjbjwIypNmVNpTTmZQKBgQDLju/7kjFj34ZHmYTW
|
|
14
|
+
IcnuSrqjRmwZoX9AmFwubH3mFOZb0HOdXI6Cw2AmTIpnMHjRH2/JDC8hnyICTnRk
|
|
15
|
+
JPlMA3c2r/OcJwTZce1uKFuilUy/KPUiQkqBjTAnKqk6+AN5vYySVLr28ai5Vi6P
|
|
16
|
+
XXaZPTzPjdCKCGRwlR2qfzzVJwKBgQC3fNj2iH+nEiIA2WbUODe5hZ8OozEdpW/k
|
|
17
|
+
q8EMihagi6kD8z3NXkrqCxmE1TLGbDj7kM+hyTCNCL6xiLptHcpr7BTT/7bSMdg/
|
|
18
|
+
iNx9ybmdHtFTh8gfh3WinQ01QhQDo6yS9ZJFUgpacuePo2XcAs+BEEBa8+AbryDa
|
|
19
|
+
WCaTJp81tQKBgQCC7XAsJo8AByCOYw8Oz/LbA1PiewRCxB5eROFdtsiPubelLIGA
|
|
20
|
+
oKzFLLdmSurmjkXXdFnpPZ3/CSTNyPqSAzoaC0ydbzTIpkw3NFEb/ndaLp+LgOOS
|
|
21
|
+
4oKbq11ig80PscBCiImnATq0ZSE5/FW8PshurfW0JioQ7m7z/uVy6Z4OFwKBgQCP
|
|
22
|
+
gdTLFL0KNVNk6KPVDVcAAbMCJr6OWkrmRTLKlOHXlQOOtFq82aer3xyJWJnKuO/k
|
|
23
|
+
SUErXwha9eD3R2HPX8JmoBE2McSSJyvjnS4eL3y9l1HOi98IUdC+ayjeY5z1r7iU
|
|
24
|
+
g/5vuxef4EidfgV3ircyUTyUJjM8U79VJiadZlKVFQKBgQCjGuvxyko8YWcusR96
|
|
25
|
+
poNTnCqNAXZxszBzONM4nIZX09etnEcBOhqkPvnRLRzlo8Y6JhgG4NMOzMj+Osvt
|
|
26
|
+
tioF3ABHNQrj1rw2xQzHxfJ5emCiA6X5i9W+fLjJEC+KtB0p6jQRYHPGSJT+Chks
|
|
27
|
+
lUhFDEgPWJPQFVaVp3xaCOqgNw==
|
|
28
|
+
-----END PRIVATE KEY-----`
|
|
29
|
+
|
|
30
|
+
const rsaCert = `-----BEGIN CERTIFICATE-----
|
|
31
|
+
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
|
|
61
|
+
-----END CERTIFICATE-----`
|
|
62
|
+
|
|
63
|
+
const rsaCaCert = `-----BEGIN CERTIFICATE-----
|
|
64
|
+
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
|
|
94
|
+
-----END CERTIFICATE-----`
|
|
95
|
+
|
|
96
|
+
const rsaCaCrl = `-----BEGIN X509 CRL-----
|
|
97
|
+
MIICtTCBngIBATANBgkqhkiG9w0BAQsFADBcMQswCQYDVQQGEwJVUzENMAsGA1UE
|
|
98
|
+
CAwEVGVzdDEOMAwGA1UEBwwFTG9jYWwxDjAMBgNVBAoMBU15T3JnMQswCQYDVQQL
|
|
99
|
+
DAJDQTERMA8GA1UEAwwITXlSb290Q0EXDTI1MTEyNDE3Mzg1NFoXDTI1MTIyNDE3
|
|
100
|
+
Mzg1NFqgDjAMMAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBCwUAA4ICAQASqR5UWbR9
|
|
101
|
+
f5j0QcdMEkMjshYB2YI4Og/2mQpDNTzAjYNh8OBIL5w1qMCzWUDIyLXIw4a05/ck
|
|
102
|
+
vHYzmum9+MlbLt3rmampW1CMxEMkupstcNIAErVxKd5zjril+7Ztx7zpjB2OMBrm
|
|
103
|
+
zFoRa9ufzjZPvW59zj/t0hH3l1+jT7vL97FQy6oBhScHVGTGVeTFSmqpa0VKXhYW
|
|
104
|
+
4N9ZYspn85B4oezVnF47179X4+USe0WxTu/iV7pS5rl4lLtzMf7cIuC8mGSmmFE/
|
|
105
|
+
hDBCunW6ZKsrvjIHnRqRcWb7tsvNjvk91wtQBUHZiPP+FxiOBaV9pQ1c5prjv5oJ
|
|
106
|
+
OrSH2LGN37De4GEM5h4gMI8iv/zh7le/43EK0P2BukenYfFW26L0XwdDDEOZAgwQ
|
|
107
|
+
olK2fJzJK91cT4gJ2xbiiQpc1+xlSXoA2Zl1CPtxYPnvZpvBLHMrsa/ldXD9IA64
|
|
108
|
+
QPSHdTbryObHDbROi4Agu61L4nRq8ukne5wYFe8WVqQYcDbos3qyeJxU4++VjgvK
|
|
109
|
+
gGsr+iObzUNTJ/fWDVYCGkwVsbkKNIaj9pVj90isMvmaW3SG6Prp9cz7mp1WUTvD
|
|
110
|
+
Um3TOsfSrR8Lb+1IipRJLFj3OBm6Lu+VQcPPzS0NKTHwox5JB/Dae1i4mV7hgQYs
|
|
111
|
+
ooQoANPkqo5x2yZ08coYoxIX09tGDGA0vg==
|
|
112
|
+
-----END X509 CRL-----`
|
|
113
|
+
|
|
114
|
+
const rsaOcspResponse = `-----BEGIN OCSP RESPONSE-----
|
|
115
|
+
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
|
|
152
|
+
xRg+QxDtBuekSrHgE1FZTs/PqGRiEQpm+w==
|
|
153
|
+
-----END OCSP RESPONSE-----`
|
|
154
|
+
|
|
155
|
+
function pemToUint8Array(
|
|
156
|
+
pem: string | Uint8Array<ArrayBuffer>,
|
|
157
|
+
): Uint8Array<ArrayBuffer> {
|
|
158
|
+
pem = typeof pem === 'string' ? pem : new TextDecoder().decode(pem)
|
|
159
|
+
|
|
160
|
+
// Remove all headers, footers, and whitespace
|
|
161
|
+
const b64 = pem
|
|
162
|
+
.trim()
|
|
163
|
+
.replace(/-----BEGIN [^-]+-----/, '')
|
|
164
|
+
.replace(/-----END [^-]+-----/, '')
|
|
165
|
+
.replace(/\s+/g, '')
|
|
166
|
+
|
|
167
|
+
const binary = atob(b64)
|
|
168
|
+
const bytes = new Uint8Array(binary.length)
|
|
169
|
+
for (let i = 0; i < binary.length; i++) {
|
|
170
|
+
bytes[i] = binary.charCodeAt(i)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return bytes
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export const rsaSigningKeys = {
|
|
177
|
+
privateKey: pemToUint8Array(rsaPrivateKeyPem),
|
|
178
|
+
cert: pemToUint8Array(rsaCert),
|
|
179
|
+
caCert: pemToUint8Array(rsaCaCert),
|
|
180
|
+
caCrl: pemToUint8Array(rsaCaCrl),
|
|
181
|
+
ocspResponse: pemToUint8Array(rsaOcspResponse),
|
|
182
|
+
privateKeyPem: rsaPrivateKeyPem,
|
|
183
|
+
certPem: rsaCert,
|
|
184
|
+
caCertPem: rsaCaCert,
|
|
185
|
+
caCrlPem: rsaCaCrl,
|
|
186
|
+
ocspResponsePem: rsaOcspResponse,
|
|
187
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { PdfRevision } from '../../src/pdf/pdf-revision'
|
|
3
|
+
import { PdfIndirectObject } from '../../src/core/objects/pdf-indirect-object'
|
|
4
|
+
import { PdfDictionary } from '../../src/core/objects/pdf-dictionary'
|
|
5
|
+
import { PdfName } from '../../src/core/objects/pdf-name'
|
|
6
|
+
|
|
7
|
+
describe('PdfRevision', () => {
|
|
8
|
+
describe('constructor', () => {
|
|
9
|
+
it('should create an empty revision', () => {
|
|
10
|
+
const revision = new PdfRevision()
|
|
11
|
+
expect(revision.objects).toBeDefined()
|
|
12
|
+
expect(revision.locked).toBe(false)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('should create a revision with initial objects', () => {
|
|
16
|
+
const obj = new PdfIndirectObject({
|
|
17
|
+
objectNumber: 1,
|
|
18
|
+
generationNumber: 0,
|
|
19
|
+
content: new PdfDictionary({ Type: new PdfName('Test') }),
|
|
20
|
+
})
|
|
21
|
+
const revision = new PdfRevision({ objects: [obj] })
|
|
22
|
+
expect(revision.objects).toContain(obj)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('should create a locked revision when specified', () => {
|
|
26
|
+
const revision = new PdfRevision({ locked: true })
|
|
27
|
+
expect(revision.locked).toBe(true)
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
describe('addObject', () => {
|
|
32
|
+
it('should add an object to the revision', () => {
|
|
33
|
+
const revision = new PdfRevision()
|
|
34
|
+
const obj = new PdfIndirectObject({
|
|
35
|
+
objectNumber: 1,
|
|
36
|
+
generationNumber: 0,
|
|
37
|
+
content: new PdfDictionary({ Type: new PdfName('Test') }),
|
|
38
|
+
})
|
|
39
|
+
revision.addObject(obj)
|
|
40
|
+
expect(revision.contains(obj)).toBe(true)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('should throw error when adding to a locked revision', () => {
|
|
44
|
+
const revision = new PdfRevision({ locked: true })
|
|
45
|
+
const obj = new PdfIndirectObject({
|
|
46
|
+
objectNumber: 1,
|
|
47
|
+
generationNumber: 0,
|
|
48
|
+
content: new PdfDictionary(),
|
|
49
|
+
})
|
|
50
|
+
expect(() => revision.addObject(obj)).toThrow(
|
|
51
|
+
'Cannot add object to locked PDF revision',
|
|
52
|
+
)
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
describe('deleteObject', () => {
|
|
57
|
+
it('should remove an object from the revision', () => {
|
|
58
|
+
const obj = new PdfIndirectObject({
|
|
59
|
+
objectNumber: 1,
|
|
60
|
+
generationNumber: 0,
|
|
61
|
+
content: new PdfDictionary(),
|
|
62
|
+
})
|
|
63
|
+
const revision = new PdfRevision({ objects: [obj] })
|
|
64
|
+
revision.deleteObject(obj)
|
|
65
|
+
expect(revision.contains(obj)).toBe(false)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('should throw error when deleting from a locked revision', () => {
|
|
69
|
+
const obj = new PdfIndirectObject({
|
|
70
|
+
objectNumber: 1,
|
|
71
|
+
generationNumber: 0,
|
|
72
|
+
content: new PdfDictionary(),
|
|
73
|
+
})
|
|
74
|
+
const revision = new PdfRevision({ objects: [obj], locked: true })
|
|
75
|
+
expect(() => revision.deleteObject(obj)).toThrow(
|
|
76
|
+
'Cannot delete object from locked PDF revision',
|
|
77
|
+
)
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('should handle deletion of non-existent object gracefully', () => {
|
|
81
|
+
const revision = new PdfRevision()
|
|
82
|
+
const obj = new PdfIndirectObject({
|
|
83
|
+
objectNumber: 1,
|
|
84
|
+
generationNumber: 0,
|
|
85
|
+
content: new PdfDictionary(),
|
|
86
|
+
})
|
|
87
|
+
// Should not throw
|
|
88
|
+
revision.deleteObject(obj)
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
describe('contains', () => {
|
|
93
|
+
it('should return true for objects in the revision', () => {
|
|
94
|
+
const obj = new PdfIndirectObject({
|
|
95
|
+
objectNumber: 1,
|
|
96
|
+
generationNumber: 0,
|
|
97
|
+
content: new PdfDictionary(),
|
|
98
|
+
})
|
|
99
|
+
const revision = new PdfRevision({ objects: [obj] })
|
|
100
|
+
expect(revision.contains(obj)).toBe(true)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
it('should return false for objects not in the revision', () => {
|
|
104
|
+
const revision = new PdfRevision()
|
|
105
|
+
const obj = new PdfIndirectObject({
|
|
106
|
+
objectNumber: 1,
|
|
107
|
+
generationNumber: 0,
|
|
108
|
+
content: new PdfDictionary(),
|
|
109
|
+
})
|
|
110
|
+
expect(revision.contains(obj)).toBe(false)
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
describe('exists', () => {
|
|
115
|
+
it('should return true when an equal object exists', () => {
|
|
116
|
+
const obj1 = new PdfIndirectObject({
|
|
117
|
+
objectNumber: 1,
|
|
118
|
+
generationNumber: 0,
|
|
119
|
+
content: new PdfDictionary({ Type: new PdfName('Test') }),
|
|
120
|
+
})
|
|
121
|
+
const revision = new PdfRevision({ objects: [obj1] })
|
|
122
|
+
const obj2 = new PdfIndirectObject({
|
|
123
|
+
objectNumber: 1,
|
|
124
|
+
generationNumber: 0,
|
|
125
|
+
content: new PdfDictionary({ Type: new PdfName('Test') }),
|
|
126
|
+
})
|
|
127
|
+
expect(revision.exists(obj2)).toBe(true)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
it('should return false when no equal object exists', () => {
|
|
131
|
+
const revision = new PdfRevision()
|
|
132
|
+
const obj = new PdfIndirectObject({
|
|
133
|
+
objectNumber: 1,
|
|
134
|
+
generationNumber: 0,
|
|
135
|
+
content: new PdfDictionary({ Type: new PdfName('Test') }),
|
|
136
|
+
})
|
|
137
|
+
expect(revision.exists(obj)).toBe(false)
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
describe('unshift', () => {
|
|
142
|
+
it('should add objects at the beginning of the revision', () => {
|
|
143
|
+
const obj1 = new PdfIndirectObject({
|
|
144
|
+
objectNumber: 1,
|
|
145
|
+
generationNumber: 0,
|
|
146
|
+
content: new PdfDictionary(),
|
|
147
|
+
})
|
|
148
|
+
const obj2 = new PdfIndirectObject({
|
|
149
|
+
objectNumber: 2,
|
|
150
|
+
generationNumber: 0,
|
|
151
|
+
content: new PdfDictionary(),
|
|
152
|
+
})
|
|
153
|
+
const revision = new PdfRevision({ objects: [obj1] })
|
|
154
|
+
revision.unshift(obj2)
|
|
155
|
+
expect(revision.objects.indexOf(obj2)).toBeLessThan(
|
|
156
|
+
revision.objects.indexOf(obj1),
|
|
157
|
+
)
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
describe('clone', () => {
|
|
162
|
+
it('should create a deep copy of the revision', () => {
|
|
163
|
+
const obj = new PdfIndirectObject({
|
|
164
|
+
objectNumber: 1,
|
|
165
|
+
generationNumber: 0,
|
|
166
|
+
content: new PdfDictionary({ Type: new PdfName('Test') }),
|
|
167
|
+
})
|
|
168
|
+
const revision = new PdfRevision({ objects: [obj] })
|
|
169
|
+
const cloned = revision.clone()
|
|
170
|
+
expect(cloned).not.toBe(revision)
|
|
171
|
+
expect(cloned.objects).not.toBe(revision.objects)
|
|
172
|
+
expect(cloned.objects.length).toBe(revision.objects.length)
|
|
173
|
+
})
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
describe('trailerDict', () => {
|
|
177
|
+
it('should return the trailer dictionary from the xref', () => {
|
|
178
|
+
const revision = new PdfRevision()
|
|
179
|
+
expect(revision.trailerDict).toBe(revision.xref.trailerDict)
|
|
180
|
+
})
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
describe('update', () => {
|
|
184
|
+
it('should update the revision and xref', () => {
|
|
185
|
+
const obj = new PdfIndirectObject({
|
|
186
|
+
objectNumber: 1,
|
|
187
|
+
generationNumber: 0,
|
|
188
|
+
content: new PdfDictionary(),
|
|
189
|
+
})
|
|
190
|
+
const revision = new PdfRevision({ objects: [obj] })
|
|
191
|
+
// Just ensure update doesn't throw
|
|
192
|
+
expect(() => revision.update()).not.toThrow()
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
})
|
|
Binary file
|