@e-sig/core 0.5.1 → 0.7.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.
Files changed (102) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +92 -0
  3. package/dist/index.d.ts +7 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +7 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/pem-signer.d.ts +26 -5
  8. package/dist/pem-signer.d.ts.map +1 -1
  9. package/dist/pem-signer.js +84 -13
  10. package/dist/pem-signer.js.map +1 -1
  11. package/dist/pq-cert.d.ts +76 -0
  12. package/dist/pq-cert.d.ts.map +1 -0
  13. package/dist/pq-cert.js +295 -0
  14. package/dist/pq-cert.js.map +1 -0
  15. package/dist/pq-embed.d.ts +22 -0
  16. package/dist/pq-embed.d.ts.map +1 -0
  17. package/dist/pq-embed.js +119 -0
  18. package/dist/pq-embed.js.map +1 -0
  19. package/dist/pq-lifecycle.d.ts +59 -0
  20. package/dist/pq-lifecycle.d.ts.map +1 -0
  21. package/dist/pq-lifecycle.js +55 -0
  22. package/dist/pq-lifecycle.js.map +1 -0
  23. package/dist/pq-seal.d.ts +183 -0
  24. package/dist/pq-seal.d.ts.map +1 -0
  25. package/dist/pq-seal.js +345 -0
  26. package/dist/pq-seal.js.map +1 -0
  27. package/dist/pq-verify.d.ts +99 -0
  28. package/dist/pq-verify.d.ts.map +1 -0
  29. package/dist/pq-verify.js +135 -0
  30. package/dist/pq-verify.js.map +1 -0
  31. package/dist/render-pdf.d.ts +5 -5
  32. package/dist/render-pdf.d.ts.map +1 -1
  33. package/dist/render-pdf.js +51 -17
  34. package/dist/render-pdf.js.map +1 -1
  35. package/dist/sign-document.d.ts +16 -0
  36. package/dist/sign-document.d.ts.map +1 -1
  37. package/dist/sign-document.js +10 -0
  38. package/dist/sign-document.js.map +1 -1
  39. package/dist/sign-pdf.d.ts +66 -4
  40. package/dist/sign-pdf.d.ts.map +1 -1
  41. package/dist/sign-pdf.js +51 -2
  42. package/dist/sign-pdf.js.map +1 -1
  43. package/dist/types.d.ts +36 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/vendor/placeholder-plain/LICENSE-signpdf.md +47 -0
  46. package/dist/vendor/placeholder-plain/createBufferPageWithAnnotation.d.ts +6 -0
  47. package/dist/vendor/placeholder-plain/createBufferPageWithAnnotation.d.ts.map +1 -0
  48. package/dist/vendor/placeholder-plain/createBufferPageWithAnnotation.js +38 -0
  49. package/dist/vendor/placeholder-plain/createBufferPageWithAnnotation.js.map +1 -0
  50. package/dist/vendor/placeholder-plain/createBufferRootWithAcroform.d.ts +6 -0
  51. package/dist/vendor/placeholder-plain/createBufferRootWithAcroform.d.ts.map +1 -0
  52. package/dist/vendor/placeholder-plain/createBufferRootWithAcroform.js +15 -0
  53. package/dist/vendor/placeholder-plain/createBufferRootWithAcroform.js.map +1 -0
  54. package/dist/vendor/placeholder-plain/createBufferTrailer.d.ts +4 -0
  55. package/dist/vendor/placeholder-plain/createBufferTrailer.d.ts.map +1 -0
  56. package/dist/vendor/placeholder-plain/createBufferTrailer.js +26 -0
  57. package/dist/vendor/placeholder-plain/createBufferTrailer.js.map +1 -0
  58. package/dist/vendor/placeholder-plain/findObject.d.ts +4 -0
  59. package/dist/vendor/placeholder-plain/findObject.d.ts.map +1 -0
  60. package/dist/vendor/placeholder-plain/findObject.js +18 -0
  61. package/dist/vendor/placeholder-plain/findObject.js.map +1 -0
  62. package/dist/vendor/placeholder-plain/getIndexFromRef.d.ts +4 -0
  63. package/dist/vendor/placeholder-plain/getIndexFromRef.d.ts.map +1 -0
  64. package/dist/vendor/placeholder-plain/getIndexFromRef.js +13 -0
  65. package/dist/vendor/placeholder-plain/getIndexFromRef.js.map +1 -0
  66. package/dist/vendor/placeholder-plain/getPageRef.d.ts +6 -0
  67. package/dist/vendor/placeholder-plain/getPageRef.d.ts.map +1 -0
  68. package/dist/vendor/placeholder-plain/getPageRef.js +18 -0
  69. package/dist/vendor/placeholder-plain/getPageRef.js.map +1 -0
  70. package/dist/vendor/placeholder-plain/getPagesDictionaryRef.d.ts +3 -0
  71. package/dist/vendor/placeholder-plain/getPagesDictionaryRef.d.ts.map +1 -0
  72. package/dist/vendor/placeholder-plain/getPagesDictionaryRef.js +12 -0
  73. package/dist/vendor/placeholder-plain/getPagesDictionaryRef.js.map +1 -0
  74. package/dist/vendor/placeholder-plain/index.d.ts +2 -0
  75. package/dist/vendor/placeholder-plain/index.d.ts.map +1 -0
  76. package/dist/vendor/placeholder-plain/index.js +4 -0
  77. package/dist/vendor/placeholder-plain/index.js.map +1 -0
  78. package/dist/vendor/placeholder-plain/pdfObject.d.ts +13 -0
  79. package/dist/vendor/placeholder-plain/pdfObject.d.ts.map +1 -0
  80. package/dist/vendor/placeholder-plain/pdfObject.js +142 -0
  81. package/dist/vendor/placeholder-plain/pdfObject.js.map +1 -0
  82. package/dist/vendor/placeholder-plain/pdfkitAddPlaceholder.d.ts +49 -0
  83. package/dist/vendor/placeholder-plain/pdfkitAddPlaceholder.d.ts.map +1 -0
  84. package/dist/vendor/placeholder-plain/pdfkitAddPlaceholder.js +115 -0
  85. package/dist/vendor/placeholder-plain/pdfkitAddPlaceholder.js.map +1 -0
  86. package/dist/vendor/placeholder-plain/plainAddPlaceholder.d.ts +41 -0
  87. package/dist/vendor/placeholder-plain/plainAddPlaceholder.d.ts.map +1 -0
  88. package/dist/vendor/placeholder-plain/plainAddPlaceholder.js +95 -0
  89. package/dist/vendor/placeholder-plain/plainAddPlaceholder.js.map +1 -0
  90. package/dist/vendor/placeholder-plain/readPdf.d.ts +20 -0
  91. package/dist/vendor/placeholder-plain/readPdf.d.ts.map +1 -0
  92. package/dist/vendor/placeholder-plain/readPdf.js +47 -0
  93. package/dist/vendor/placeholder-plain/readPdf.js.map +1 -0
  94. package/dist/vendor/placeholder-plain/readRefTable.d.ts +17 -0
  95. package/dist/vendor/placeholder-plain/readRefTable.d.ts.map +1 -0
  96. package/dist/vendor/placeholder-plain/readRefTable.js +84 -0
  97. package/dist/vendor/placeholder-plain/readRefTable.js.map +1 -0
  98. package/dist/vendor/placeholder-plain/xrefToRefMap.d.ts +3 -0
  99. package/dist/vendor/placeholder-plain/xrefToRefMap.d.ts.map +1 -0
  100. package/dist/vendor/placeholder-plain/xrefToRefMap.js +38 -0
  101. package/dist/vendor/placeholder-plain/xrefToRefMap.js.map +1 -0
  102. package/package.json +10 -8
@@ -0,0 +1,115 @@
1
+ // Vendored from @signpdf/placeholder-pdfkit010@3.3.0 (MIT). See LICENSE-signpdf.md.
2
+ // Faithful TypeScript port — logic and byte-emitting paths are unchanged.
3
+ // This is the only module @signpdf/placeholder-plain used from
4
+ // @signpdf/placeholder-pdfkit010; vendoring it severs the
5
+ // pdfkit@0.10.0 (peer) -> crypto-js@3.3.0 dependency chain.
6
+ import { DEFAULT_BYTE_RANGE_PLACEHOLDER, DEFAULT_SIGNATURE_LENGTH, SUBFILTER_ADOBE_PKCS7_DETACHED, ANNOTATION_FLAGS, SIG_FLAGS, PDFKitReferenceMock, } from "@signpdf/utils";
7
+ /**
8
+ * Adds the objects that are needed for Adobe.PPKLite to read the signature.
9
+ * Also includes a placeholder for the actual signature.
10
+ * Returns an Object with all the added PDFReferences.
11
+ */
12
+ export const pdfkitAddPlaceholder = ({ pdf, pdfBuffer, reason, contactInfo, name, location, signingTime = undefined, signatureLength = DEFAULT_SIGNATURE_LENGTH, byteRangePlaceholder = DEFAULT_BYTE_RANGE_PLACEHOLDER, subFilter = SUBFILTER_ADOBE_PKCS7_DETACHED, widgetRect = [0, 0, 0, 0], appName = undefined, }) => {
13
+ /* eslint-disable no-underscore-dangle,no-param-reassign */
14
+ // Generate the signature placeholder
15
+ const signature = pdf.ref({
16
+ Type: "Sig",
17
+ Filter: "Adobe.PPKLite",
18
+ SubFilter: subFilter,
19
+ ByteRange: [0, byteRangePlaceholder, byteRangePlaceholder, byteRangePlaceholder],
20
+ Contents: Buffer.from(String.fromCharCode(0).repeat(signatureLength)),
21
+ Reason: new String(reason), // eslint-disable-line no-new-wrappers
22
+ M: signingTime ?? new Date(),
23
+ ContactInfo: new String(contactInfo), // eslint-disable-line no-new-wrappers
24
+ Name: new String(name), // eslint-disable-line no-new-wrappers
25
+ Location: new String(location), // eslint-disable-line no-new-wrappers
26
+ Prop_Build: {
27
+ Filter: {
28
+ Name: "Adobe.PPKLite",
29
+ },
30
+ ...(appName
31
+ ? {
32
+ App: {
33
+ Name: appName,
34
+ },
35
+ }
36
+ : {}),
37
+ },
38
+ });
39
+ // Check if pdf already contains acroform field
40
+ const isAcroFormExists = typeof pdf._root.data.AcroForm !== "undefined";
41
+ let fieldIds = [];
42
+ let acroFormId;
43
+ if (isAcroFormExists) {
44
+ /* FIXME: We're working with a PDFDocument.
45
+ * Needing to work with strings here doesn't make sense.
46
+ * It only exists to support plainAddPlaceholder the reference to /AcroForm
47
+ * would be external to PDFKit at this point.
48
+ */
49
+ const acroFormPosition = pdfBuffer.lastIndexOf("/Type /AcroForm");
50
+ let acroFormStart = acroFormPosition;
51
+ // 10 is the distance between "/Type /AcroForm" and AcroFrom ID
52
+ const charsUntilIdEnd = 10;
53
+ const acroFormIdEnd = acroFormPosition - charsUntilIdEnd;
54
+ // Let's find AcroForm ID by trying to find the "\n" before the ID
55
+ // 12 is a enough space to find the "\n"
56
+ // (generally it's 2 or 3, but I'm giving a big space though)
57
+ const maxAcroFormIdLength = 12;
58
+ let index = charsUntilIdEnd + 1;
59
+ for (index; index < charsUntilIdEnd + maxAcroFormIdLength; index += 1) {
60
+ const acroFormIdString = pdfBuffer.slice(acroFormPosition - index, acroFormIdEnd).toString();
61
+ if (acroFormIdString[0] === "\n") {
62
+ break;
63
+ }
64
+ acroFormStart = acroFormPosition - index;
65
+ }
66
+ const pdfSlice = pdfBuffer.slice(acroFormStart);
67
+ const acroForm = pdfSlice.slice(0, pdfSlice.indexOf("endobj")).toString();
68
+ acroFormId = parseInt(pdf._root.data.AcroForm.toString());
69
+ const acroFormFields = acroForm.slice(acroForm.indexOf("/Fields [") + 9, acroForm.indexOf("]"));
70
+ fieldIds = acroFormFields
71
+ .split(" ")
72
+ .filter(Boolean)
73
+ .filter((element, i) => i % 3 === 0)
74
+ .map((fieldId) => new PDFKitReferenceMock(fieldId));
75
+ }
76
+ const signatureName = "Signature";
77
+ // Generate signature annotation widget
78
+ const widget = pdf.ref({
79
+ Type: "Annot",
80
+ Subtype: "Widget",
81
+ FT: "Sig",
82
+ Rect: widgetRect,
83
+ V: signature,
84
+ T: new String(signatureName + (fieldIds.length + 1)), // eslint-disable-line no-new-wrappers
85
+ F: ANNOTATION_FLAGS.PRINT,
86
+ P: pdf.page.dictionary, // eslint-disable-line no-underscore-dangle
87
+ });
88
+ pdf.page.dictionary.data.Annots = [widget];
89
+ // Include the widget in a page
90
+ let form;
91
+ if (!isAcroFormExists) {
92
+ // Create a form (with the widget) and link in the _root
93
+ form = pdf.ref({
94
+ Type: "AcroForm",
95
+ SigFlags: SIG_FLAGS.SIGNATURES_EXIST | SIG_FLAGS.APPEND_ONLY,
96
+ Fields: [...fieldIds, widget],
97
+ });
98
+ }
99
+ else {
100
+ // Use existing acroform and extend the fields with newly created widgets
101
+ form = pdf.ref({
102
+ Type: "AcroForm",
103
+ SigFlags: SIG_FLAGS.SIGNATURES_EXIST | SIG_FLAGS.APPEND_ONLY,
104
+ Fields: [...fieldIds, widget],
105
+ }, acroFormId);
106
+ }
107
+ pdf._root.data.AcroForm = form;
108
+ return {
109
+ signature,
110
+ form,
111
+ widget,
112
+ };
113
+ /* eslint-enable no-underscore-dangle,no-param-reassign */
114
+ };
115
+ //# sourceMappingURL=pdfkitAddPlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfkitAddPlaceholder.js","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/pdfkitAddPlaceholder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface PlainAddPlaceholderInput {
2
+ pdfBuffer: Buffer;
3
+ reason: string;
4
+ contactInfo: string;
5
+ name: string;
6
+ location: string;
7
+ signingTime?: Date;
8
+ signatureLength?: number;
9
+ /** One of SUBFILTER_* from @signpdf/utils */
10
+ subFilter?: string;
11
+ /**
12
+ * [x1, y1, x2, y2] widget rectangle.
13
+ *
14
+ * ATTRIBUTION INTEROP: the UUAID provenance verifier's PDF attribution-scope
15
+ * whitelist (IAASO-0004) requires the invisible `[0 0 0 0]` /Rect and denies
16
+ * any other value. `signPdf` never passes this, so today every document we
17
+ * emit is in scope — but a visible-signature feature would drop attribution
18
+ * on day one. Coordinate with the UUAID lane before wiring it up.
19
+ */
20
+ widgetRect?: number[];
21
+ /**
22
+ * Name of the application generating the signature (emitted as
23
+ * `/Prop_Build /App <</Name ...>>`).
24
+ *
25
+ * ATTRIBUTION INTEROP: `App` is not in that verifier's allowed nested
26
+ * Prop_Build key set, so setting this denies attribution. Same rule as
27
+ * `widgetRect` — `signPdf` never passes it; coordinate before it does.
28
+ */
29
+ appName?: string;
30
+ }
31
+ /**
32
+ * Adds a signature placeholder to a PDF Buffer.
33
+ *
34
+ * This contrasts with the default pdfkit-based implementation.
35
+ * Parsing is done using simple string operations.
36
+ * Adding is done with `Buffer.concat`.
37
+ * This allows node-signpdf to be used on any PDF and
38
+ * not only on a freshly created through PDFKit one.
39
+ */
40
+ export declare const plainAddPlaceholder: ({ pdfBuffer, reason, contactInfo, name, location, signingTime, signatureLength, subFilter, widgetRect, appName, }: PlainAddPlaceholderInput) => Buffer;
41
+ //# sourceMappingURL=plainAddPlaceholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plainAddPlaceholder.d.ts","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/plainAddPlaceholder.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,mHAWjC,wBAAwB,KAAG,MA8D7B,CAAC"}
@@ -0,0 +1,95 @@
1
+ // Vendored from @signpdf/placeholder-plain@3.3.0 (MIT). See LICENSE-signpdf.md.
2
+ // Faithful TypeScript port — logic and byte-emitting paths are unchanged.
3
+ /* eslint-disable no-underscore-dangle */
4
+ import { DEFAULT_SIGNATURE_LENGTH, SUBFILTER_ADOBE_PKCS7_DETACHED, removeTrailingNewLine, PDFKitReferenceMock, } from "@signpdf/utils";
5
+ // NOT @signpdf/utils' PDFObject: that one splices any value containing "<<"
6
+ // into the dictionary raw and emits names unescaped, which lets caller-supplied
7
+ // option strings inject keys into the signature dictionary. See pdfObject.ts.
8
+ import { PDFObject } from "./pdfObject.js";
9
+ import { pdfkitAddPlaceholder } from "./pdfkitAddPlaceholder.js";
10
+ import getIndexFromRef from "./getIndexFromRef.js";
11
+ import readPdf from "./readPdf.js";
12
+ import getPageRef from "./getPageRef.js";
13
+ import createBufferRootWithAcroform from "./createBufferRootWithAcroform.js";
14
+ import createBufferPageWithAnnotation from "./createBufferPageWithAnnotation.js";
15
+ import createBufferTrailer from "./createBufferTrailer.js";
16
+ const getAcroFormRef = (slice) => {
17
+ const bufferRootWithAcroformRefRegex = /\/AcroForm\s+(\d+\s\d+\sR)/g;
18
+ const match = bufferRootWithAcroformRefRegex.exec(slice);
19
+ if (match != null && match[1] != null && match[1] !== "") {
20
+ return match[1];
21
+ }
22
+ return undefined;
23
+ };
24
+ /**
25
+ * Adds a signature placeholder to a PDF Buffer.
26
+ *
27
+ * This contrasts with the default pdfkit-based implementation.
28
+ * Parsing is done using simple string operations.
29
+ * Adding is done with `Buffer.concat`.
30
+ * This allows node-signpdf to be used on any PDF and
31
+ * not only on a freshly created through PDFKit one.
32
+ */
33
+ export const plainAddPlaceholder = ({ pdfBuffer, reason, contactInfo, name, location, signingTime = undefined, signatureLength = DEFAULT_SIGNATURE_LENGTH, subFilter = SUBFILTER_ADOBE_PKCS7_DETACHED, widgetRect = [0, 0, 0, 0], appName = undefined, }) => {
34
+ let pdf = removeTrailingNewLine(pdfBuffer);
35
+ const info = readPdf(pdf);
36
+ const pageRef = getPageRef(pdf, info);
37
+ const pageIndex = getIndexFromRef(info.xref, pageRef);
38
+ const addedReferences = new Map();
39
+ const pdfKitMock = {
40
+ ref: (input, knownIndex) => {
41
+ info.xref.maxIndex += 1;
42
+ const index = knownIndex != null ? knownIndex : info.xref.maxIndex;
43
+ addedReferences.set(index, pdf.length + 1); // + 1 new line
44
+ pdf = Buffer.concat([
45
+ pdf,
46
+ Buffer.from("\n"),
47
+ Buffer.from(`${index} 0 obj\n`),
48
+ Buffer.from(PDFObject.convert(input)),
49
+ Buffer.from("\nendobj\n"),
50
+ ]);
51
+ return new PDFKitReferenceMock(info.xref.maxIndex);
52
+ },
53
+ page: {
54
+ dictionary: new PDFKitReferenceMock(pageIndex, {
55
+ data: {
56
+ Annots: [],
57
+ },
58
+ }),
59
+ },
60
+ _root: {
61
+ data: {},
62
+ },
63
+ };
64
+ const acroFormRef = getAcroFormRef(info.root);
65
+ if (acroFormRef) {
66
+ pdfKitMock._root.data.AcroForm = acroFormRef;
67
+ }
68
+ const { form, widget } = pdfkitAddPlaceholder({
69
+ pdf: pdfKitMock,
70
+ pdfBuffer,
71
+ reason,
72
+ contactInfo,
73
+ name,
74
+ location,
75
+ signingTime,
76
+ signatureLength,
77
+ subFilter,
78
+ widgetRect,
79
+ appName,
80
+ });
81
+ if (!getAcroFormRef(pdf.toString())) {
82
+ const rootIndex = getIndexFromRef(info.xref, info.rootRef);
83
+ addedReferences.set(rootIndex, pdf.length + 1);
84
+ pdf = Buffer.concat([pdf, Buffer.from("\n"), createBufferRootWithAcroform(pdf, info, form)]);
85
+ }
86
+ addedReferences.set(pageIndex, pdf.length + 1);
87
+ pdf = Buffer.concat([
88
+ pdf,
89
+ Buffer.from("\n"),
90
+ createBufferPageWithAnnotation(pdf, info, pageRef, widget),
91
+ ]);
92
+ pdf = Buffer.concat([pdf, Buffer.from("\n"), createBufferTrailer(pdf, info, addedReferences)]);
93
+ return pdf;
94
+ };
95
+ //# sourceMappingURL=plainAddPlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plainAddPlaceholder.js","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/plainAddPlaceholder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ReadRefTableReturnType } from "./readRefTable.js";
2
+ export declare const getValue: (trailer: Buffer, key: string) => string | undefined;
3
+ export interface ReadPdfReturnType {
4
+ xref: ReadRefTableReturnType;
5
+ rootRef: string;
6
+ root: string;
7
+ infoRef: string | undefined;
8
+ trailerStart: number;
9
+ previousXrefs: unknown[];
10
+ xRefPosition: number;
11
+ }
12
+ /**
13
+ * Simplified parsing of a PDF Buffer.
14
+ * Extracts reference table, root info and trailer start.
15
+ *
16
+ * See section 7.5.5 (File Trailer) of the PDF specs.
17
+ */
18
+ declare const readPdf: (pdfBuffer: Buffer) => ReadPdfReturnType;
19
+ export default readPdf;
20
+ //# sourceMappingURL=readPdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readPdf.d.ts","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/readPdf.ts"],"names":[],"mappings":"AAEA,OAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG9E,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,SAchE,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,QAAA,MAAM,OAAO,GAAI,WAAW,MAAM,KAAG,iBAqBpC,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,47 @@
1
+ // Vendored from @signpdf/placeholder-plain@3.3.0 (MIT). See LICENSE-signpdf.md.
2
+ // Faithful TypeScript port — logic and byte-emitting paths are unchanged.
3
+ import readRefTable from "./readRefTable.js";
4
+ import findObject from "./findObject.js";
5
+ export const getValue = (trailer, key) => {
6
+ let index = trailer.indexOf(key);
7
+ if (index === -1) {
8
+ return undefined;
9
+ }
10
+ const slice = trailer.slice(index);
11
+ index = slice.indexOf("/", 1);
12
+ if (index === -1) {
13
+ index = slice.indexOf(">", 1);
14
+ }
15
+ return slice
16
+ .slice(key.length + 1, index)
17
+ .toString()
18
+ .trim(); // key + at least one space
19
+ };
20
+ /**
21
+ * Simplified parsing of a PDF Buffer.
22
+ * Extracts reference table, root info and trailer start.
23
+ *
24
+ * See section 7.5.5 (File Trailer) of the PDF specs.
25
+ */
26
+ const readPdf = (pdfBuffer) => {
27
+ // Extract the trailer dictionary.
28
+ const trailerStart = pdfBuffer.lastIndexOf("trailer");
29
+ // The trailer is followed by xref. Then an EOF. EOF's length is 6 characters.
30
+ const trailer = pdfBuffer.slice(trailerStart, pdfBuffer.length - 6);
31
+ const xRefPosition = parseInt(trailer.slice(trailer.lastIndexOf("startxref") + 10).toString());
32
+ const refTable = readRefTable(pdfBuffer);
33
+ const rootRef = getValue(trailer, "/Root");
34
+ const root = findObject(pdfBuffer, refTable, rootRef).toString();
35
+ const infoRef = getValue(trailer, "/Info");
36
+ return {
37
+ xref: refTable,
38
+ rootRef,
39
+ root,
40
+ infoRef,
41
+ trailerStart,
42
+ previousXrefs: [],
43
+ xRefPosition,
44
+ };
45
+ };
46
+ export default readPdf;
47
+ //# sourceMappingURL=readPdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readPdf.js","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/readPdf.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,0EAA0E;AAC1E,OAAO,YAA6C,MAAM,mBAAmB,CAAC;AAC9E,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,GAAW,EAAsB,EAAE;IAC3E,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC;SAC5B,QAAQ,EAAE;SACV,IAAI,EAAE,CAAC,CAAC,2BAA2B;AACxC,CAAC,CAAC;AAYF;;;;;GAKG;AACH,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAqB,EAAE;IACvD,kCAAkC;IAClC,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACtD,8EAA8E;IAC9E,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,QAAQ,CAC3B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAChE,CAAC;IACF,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAW,CAAC;IACrD,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,IAAI;QACJ,OAAO;QACP,YAAY;QACZ,aAAa,EAAE,EAAE;QACjB,YAAY;KACb,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type FullXrefTable = Map<number, number>;
2
+ export interface ReadRefTableReturnType {
3
+ startingIndex: number;
4
+ maxIndex: number;
5
+ offsets: FullXrefTable;
6
+ }
7
+ interface GetXrefReturnType {
8
+ size: number;
9
+ prev: number | undefined;
10
+ xRefContent: Map<number, number>;
11
+ }
12
+ export declare const getLastTrailerPosition: (pdf: Buffer) => number;
13
+ export declare const getXref: (pdf: Buffer, position: number) => GetXrefReturnType;
14
+ export declare const getFullXrefTable: (pdf: Buffer) => FullXrefTable;
15
+ declare const readRefTable: (pdf: Buffer) => ReadRefTableReturnType;
16
+ export default readRefTable;
17
+ //# sourceMappingURL=readRefTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readRefTable.d.ts","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/readRefTable.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,MAOpD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,iBAsDvD,CAAC;AAYF,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,aAG9C,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,sBASnC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,84 @@
1
+ // Vendored from @signpdf/placeholder-plain@3.3.0 (MIT). See LICENSE-signpdf.md.
2
+ // Faithful TypeScript port — logic and byte-emitting paths are unchanged.
3
+ // (Upstream carried `prev` as the matched digit string and let Buffer.slice
4
+ // coerce it; parseInt of an all-digit string yields the identical position.)
5
+ import { SignPdfError } from "@signpdf/utils";
6
+ import xrefToRefMap from "./xrefToRefMap.js";
7
+ export const getLastTrailerPosition = (pdf) => {
8
+ const trailerStart = pdf.lastIndexOf(Buffer.from("trailer", "utf8"));
9
+ const trailer = pdf.slice(trailerStart, pdf.length - 6);
10
+ const xRefPosition = trailer
11
+ .slice(trailer.lastIndexOf(Buffer.from("startxref", "utf8")) + 10)
12
+ .toString();
13
+ return parseInt(xRefPosition);
14
+ };
15
+ export const getXref = (pdf, position) => {
16
+ let refTable = pdf.slice(position); // slice starting from where xref starts
17
+ const realPosition = refTable.indexOf(Buffer.from("xref", "utf8"));
18
+ if (realPosition === -1) {
19
+ throw new SignPdfError(`Could not find xref anywhere at or after ${position}.`, SignPdfError.TYPE_PARSE);
20
+ }
21
+ if (realPosition > 0) {
22
+ const prefix = refTable.slice(0, realPosition);
23
+ if (prefix.toString().replace(/\s*/g, "") !== "") {
24
+ throw new SignPdfError(`Expected xref at ${position} but found other content.`, SignPdfError.TYPE_PARSE);
25
+ }
26
+ }
27
+ const nextEofPosition = refTable.indexOf(Buffer.from("%%EOF", "utf8"));
28
+ if (nextEofPosition === -1) {
29
+ throw new SignPdfError("Expected EOF after xref and trailer but could not find one.", SignPdfError.TYPE_PARSE);
30
+ }
31
+ refTable = refTable.slice(0, nextEofPosition);
32
+ refTable = refTable.slice(realPosition + 4); // move ahead with the "xref"
33
+ refTable = refTable.slice(refTable.indexOf("\n") + 1); // move after the next new line
34
+ // extract the size
35
+ const sizeString = refTable.toString().split("/Size")[1];
36
+ if (!sizeString) {
37
+ throw new SignPdfError("Size not found in xref table.", SignPdfError.TYPE_PARSE);
38
+ }
39
+ const sizeMatch = /^\s*(\d+)/.exec(sizeString);
40
+ if (sizeMatch === null) {
41
+ throw new SignPdfError("Failed to parse size of xref table.", SignPdfError.TYPE_PARSE);
42
+ }
43
+ const size = parseInt(sizeMatch[1]);
44
+ const [objects, infos] = refTable.toString().split("trailer");
45
+ const isContainingPrev = infos.split("/Prev")[1] != null;
46
+ let prev;
47
+ if (isContainingPrev) {
48
+ const pagesRefRegex = /Prev (\d+)/g;
49
+ const match = pagesRefRegex.exec(infos);
50
+ const [, prevPosition] = match;
51
+ prev = parseInt(prevPosition);
52
+ }
53
+ const xRefContent = xrefToRefMap(objects);
54
+ return {
55
+ size,
56
+ prev,
57
+ xRefContent,
58
+ };
59
+ };
60
+ const getFullXref = (pdf, xRefPosition) => {
61
+ const lastXrefTable = getXref(pdf, xRefPosition);
62
+ if (lastXrefTable.prev === undefined) {
63
+ return lastXrefTable.xRefContent;
64
+ }
65
+ const partOfXrefTable = getFullXref(pdf, lastXrefTable.prev);
66
+ const mergedXrefTable = new Map([...partOfXrefTable, ...lastXrefTable.xRefContent]);
67
+ return mergedXrefTable;
68
+ };
69
+ export const getFullXrefTable = (pdf) => {
70
+ const lastTrailerPosition = getLastTrailerPosition(pdf);
71
+ return getFullXref(pdf, lastTrailerPosition);
72
+ };
73
+ const readRefTable = (pdf) => {
74
+ const fullXrefTable = getFullXrefTable(pdf);
75
+ const startingIndex = 0;
76
+ const maxIndex = Math.max(...fullXrefTable.keys());
77
+ return {
78
+ startingIndex,
79
+ maxIndex,
80
+ offsets: fullXrefTable,
81
+ };
82
+ };
83
+ export default readRefTable;
84
+ //# sourceMappingURL=readRefTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readRefTable.js","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/readRefTable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const xrefToRefMap: (xrefString: string) => Map<number, number>;
2
+ export default xrefToRefMap;
3
+ //# sourceMappingURL=xrefToRefMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xrefToRefMap.d.ts","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/xrefToRefMap.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,YAAY,GAAI,YAAY,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAmC5D,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,38 @@
1
+ // Vendored from @signpdf/placeholder-plain@3.3.0 (MIT). See LICENSE-signpdf.md.
2
+ // Faithful TypeScript port — logic and byte-emitting paths are unchanged.
3
+ import { SignPdfError } from "@signpdf/utils";
4
+ const xrefToRefMap = (xrefString) => {
5
+ const lines = xrefString.split("\n").filter((l) => l !== "");
6
+ let index = 0;
7
+ let expectedLines = 0;
8
+ const xref = new Map();
9
+ lines.forEach((line) => {
10
+ const split = line.split(" ");
11
+ if (split.length === 2) {
12
+ index = parseInt(split[0]);
13
+ expectedLines = parseInt(split[1]);
14
+ return;
15
+ }
16
+ if (expectedLines <= 0) {
17
+ throw new SignPdfError("Too many lines in xref table.", SignPdfError.TYPE_PARSE);
18
+ }
19
+ expectedLines -= 1;
20
+ const [offset, , inUse] = split;
21
+ if (inUse.trim() === "f") {
22
+ index += 1;
23
+ return;
24
+ }
25
+ if (inUse.trim() !== "n") {
26
+ throw new SignPdfError(`Unknown in-use flag "${inUse}". Expected "n" or "f".`, SignPdfError.TYPE_PARSE);
27
+ }
28
+ if (!/^\d+$/.test(offset.trim())) {
29
+ throw new SignPdfError(`Expected integer offset. Got "${offset}".`, SignPdfError.TYPE_PARSE);
30
+ }
31
+ const storeOffset = parseInt(offset.trim());
32
+ xref.set(index, storeOffset);
33
+ index += 1;
34
+ });
35
+ return xref;
36
+ };
37
+ export default xrefToRefMap;
38
+ //# sourceMappingURL=xrefToRefMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xrefToRefMap.js","sourceRoot":"","sources":["../../../src/vendor/placeholder-plain/xrefToRefMap.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,0EAA0E;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAuB,EAAE;IAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,YAAY,CAAC,+BAA+B,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QACnF,CAAC;QACD,aAAa,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,MAAM,EAAE,AAAD,EAAG,KAAK,CAAC,GAAG,KAAK,CAAC;QAChC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACzB,MAAM,IAAI,YAAY,CACpB,wBAAwB,KAAK,yBAAyB,EACtD,YAAY,CAAC,UAAU,CACxB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,YAAY,CAAC,iCAAiC,MAAM,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@e-sig/core",
3
- "version": "0.5.1",
4
- "description": "Self-contained PKCS#7 PDF signing no SaaS, no metering, no per-doc fees. Render→sign→verify engine + pluggable persistence interfaces + end-to-end signDocument() orchestrator.",
3
+ "version": "0.7.0",
4
+ "description": "Self-contained PKCS#7 PDF signing \u2014 no SaaS, no metering, no per-doc fees. Render\u2192sign\u2192verify engine + pluggable persistence interfaces + end-to-end signDocument() orchestrator.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -27,6 +27,11 @@
27
27
  "types": "./dist/fs-adapters.d.ts",
28
28
  "import": "./dist/fs-adapters.js",
29
29
  "default": "./dist/fs-adapters.js"
30
+ },
31
+ "./pq-seal": {
32
+ "types": "./dist/pq-seal.d.ts",
33
+ "import": "./dist/pq-seal.js",
34
+ "default": "./dist/pq-seal.js"
30
35
  }
31
36
  },
32
37
  "files": [
@@ -36,7 +41,7 @@
36
41
  "LICENSE"
37
42
  ],
38
43
  "scripts": {
39
- "build": "tsc -p tsconfig.build.json",
44
+ "build": "tsc -p tsconfig.build.json && node -e \"fs.copyFileSync('src/vendor/placeholder-plain/LICENSE-signpdf.md','dist/vendor/placeholder-plain/LICENSE-signpdf.md')\"",
40
45
  "clean": "rm -rf dist",
41
46
  "prepublishOnly": "npm run clean && npm run build",
42
47
  "pretest": "npm run build",
@@ -69,7 +74,7 @@
69
74
  },
70
75
  "homepage": "https://github.com/vmvtech/esig-suite/tree/main/packages/esig-core#readme",
71
76
  "dependencies": {
72
- "@signpdf/placeholder-plain": "^3.3.0",
77
+ "@noble/post-quantum": "^0.6.1",
73
78
  "@signpdf/signpdf": "^3.3.0",
74
79
  "@signpdf/utils": "^3.3.0",
75
80
  "node-forge": "^1.4.0",
@@ -88,13 +93,10 @@
88
93
  "@types/node": "^22.0.0",
89
94
  "@types/node-forge": "^1.3.0",
90
95
  "typescript": "^5.4.0",
91
- "vitest": "^2.1.9"
96
+ "vitest": "^4.1.10"
92
97
  },
93
98
  "publishConfig": {
94
99
  "registry": "https://registry.npmjs.org",
95
100
  "access": "public"
96
- },
97
- "overrides": {
98
- "crypto-js": "^4.2.0"
99
101
  }
100
102
  }