@e-sig/core 0.4.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 (52) hide show
  1. package/CONSUMING.md +97 -0
  2. package/LICENSE +21 -0
  3. package/README.md +298 -0
  4. package/dist/adapters.d.ts +79 -0
  5. package/dist/adapters.d.ts.map +1 -0
  6. package/dist/adapters.js +10 -0
  7. package/dist/adapters.js.map +1 -0
  8. package/dist/cert-issuer.d.ts +47 -0
  9. package/dist/cert-issuer.d.ts.map +1 -0
  10. package/dist/cert-issuer.js +132 -0
  11. package/dist/cert-issuer.js.map +1 -0
  12. package/dist/cert-lifecycle.d.ts +16 -0
  13. package/dist/cert-lifecycle.d.ts.map +1 -0
  14. package/dist/cert-lifecycle.js +30 -0
  15. package/dist/cert-lifecycle.js.map +1 -0
  16. package/dist/index.d.ts +11 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +21 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/pem-signer.d.ts +42 -0
  21. package/dist/pem-signer.d.ts.map +1 -0
  22. package/dist/pem-signer.js +276 -0
  23. package/dist/pem-signer.js.map +1 -0
  24. package/dist/render-pdf.d.ts +33 -0
  25. package/dist/render-pdf.d.ts.map +1 -0
  26. package/dist/render-pdf.js +86 -0
  27. package/dist/render-pdf.js.map +1 -0
  28. package/dist/sign-document.d.ts +54 -0
  29. package/dist/sign-document.d.ts.map +1 -0
  30. package/dist/sign-document.js +93 -0
  31. package/dist/sign-document.js.map +1 -0
  32. package/dist/sign-pdf.d.ts +46 -0
  33. package/dist/sign-pdf.d.ts.map +1 -0
  34. package/dist/sign-pdf.js +60 -0
  35. package/dist/sign-pdf.js.map +1 -0
  36. package/dist/signature-block.d.ts +23 -0
  37. package/dist/signature-block.d.ts.map +1 -0
  38. package/dist/signature-block.js +63 -0
  39. package/dist/signature-block.js.map +1 -0
  40. package/dist/timestamp.d.ts +59 -0
  41. package/dist/timestamp.d.ts.map +1 -0
  42. package/dist/timestamp.js +278 -0
  43. package/dist/timestamp.js.map +1 -0
  44. package/dist/types.d.ts +44 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +10 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/verify-pdf.d.ts +33 -0
  49. package/dist/verify-pdf.d.ts.map +1 -0
  50. package/dist/verify-pdf.js +338 -0
  51. package/dist/verify-pdf.js.map +1 -0
  52. package/package.json +92 -0
@@ -0,0 +1,338 @@
1
+ // src/lib/integrations/esig/core/verify-pdf.ts
2
+ //
3
+ // Portable CRYPTOGRAPHIC verifier for PKCS#7-signed PDFs. Returns diagnostics
4
+ // rather than throwing — callers decide whether to surface failures.
5
+ //
6
+ // `ok:true` means the signature is cryptographically valid over this exact
7
+ // document, i.e. ALL of:
8
+ // 1. Structure — the /ByteRange dictionary tiles the file around the
9
+ // /Contents hole, and the PKCS#7 blob DER-parses.
10
+ // 2. Integrity (digest) — SHA-256 recomputed over the ByteRange-covered bytes
11
+ // equals the `messageDigest` signed attribute. A single flipped byte in the
12
+ // covered region fails this check.
13
+ // 3. Authenticity (signature) — the RSA signature over DER(signedAttrs) taken
14
+ // as a SET verifies against the embedded signer certificate's public key.
15
+ //
16
+ // A tampered document therefore returns ok:false (not ok:true), which is the
17
+ // whole point of a signature verifier. `verifyPdfStructure` is retained as the
18
+ // historical name; `verifyPdfSignature` is the preferred alias.
19
+ //
20
+ // RFC 3161 (CAdES-T): if the SignerInfo carries an id-aa-timeStampToken
21
+ // UNSIGNED attribute, we surface `timestamped:true` plus best-effort genTime /
22
+ // TSA common name, AND enforce the §2.4.2 binding check — the TST's
23
+ // messageImprint MUST equal sha256(signerInfo.signature). A mismatch is a hard
24
+ // failure (ok:false). Absence of a timestamp is fine (backward compatible:
25
+ // timestamped:false, ok unaffected).
26
+ //
27
+ // NOTE: this validates the signature MATH against the certificate embedded in
28
+ // the document. It does NOT establish trust in that certificate (chain to a
29
+ // trust anchor, revocation, AATL/EUTL membership) — self-issued signer certs
30
+ // are their own trust root, so trust is an out-of-band, deployment-level concern.
31
+ import crypto from "node:crypto";
32
+ import forge from "node-forge";
33
+ import { OID_TIMESTAMP_TOKEN, parseTstInfo } from "./timestamp.js";
34
+ const asn1 = forge.asn1;
35
+ /** OID id-messageDigest (PKCS#9 signed attribute). */
36
+ const OID_MESSAGE_DIGEST = "1.2.840.113549.1.9.4";
37
+ export function verifyPdfStructure(signed) {
38
+ const failures = [];
39
+ const text = signed.toString("binary");
40
+ const result = { ok: false, failures, timestamped: false };
41
+ const m = text.match(/\/ByteRange\s*\[\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*\]/);
42
+ if (!m) {
43
+ failures.push("no /ByteRange dictionary found");
44
+ return result;
45
+ }
46
+ const [a, b, c, d] = m.slice(1, 5).map(Number);
47
+ result.byteRange = [a, b, c, d];
48
+ const covered = b + d;
49
+ const hole = c - (a + b);
50
+ if (covered + hole !== signed.length) {
51
+ failures.push(`byte ranges (${covered}) + hole (${hole}) != file size (${signed.length})`);
52
+ return result;
53
+ }
54
+ result.pkcs7BudgetSize = hole - 2;
55
+ const contentsRegion = signed.slice(a + b + 1, c - 1);
56
+ const hexBlob = contentsRegion.toString("binary").replace(/[^0-9a-fA-F]/g, "");
57
+ const trimmedHex = hexBlob.replace(/(00)+$/, "");
58
+ const pkcs7Der = Buffer.from(trimmedHex, "hex").toString("binary");
59
+ result.pkcs7ActualSize = pkcs7Der.length;
60
+ try {
61
+ const root = forge.asn1.fromDer(pkcs7Der);
62
+ const p7 = forge.pkcs7.messageFromAsn1(root);
63
+ if (!p7.certificates || p7.certificates.length === 0) {
64
+ failures.push("PKCS#7 has no embedded certificates");
65
+ return result;
66
+ }
67
+ const signerCert = p7.certificates[0];
68
+ const subject = signerCert.subject;
69
+ result.signerCommonName = subject.getField("CN")?.value;
70
+ result.signerOrganization = subject.getField("O")?.value;
71
+ // ---- Cryptographic verification (integrity + authenticity) ----
72
+ // Recompute the digest over the ByteRange-covered bytes and RSA-verify the
73
+ // signature over the signed attributes. This is what makes ok:true mean
74
+ // "valid signature", not merely "well-formed structure".
75
+ const covered = Buffer.concat([
76
+ signed.subarray(a, a + b),
77
+ signed.subarray(c, c + d),
78
+ ]);
79
+ const crypto_ = verifySignerCrypto(root, signerCert, covered);
80
+ result.digestValid = crypto_.digestValid;
81
+ result.signatureValid = crypto_.signatureValid;
82
+ for (const f of crypto_.failures)
83
+ failures.push(f);
84
+ // RFC 3161: inspect the first SignerInfo for an id-aa-timeStampToken.
85
+ const ts = inspectTimestamp(root);
86
+ if (ts.present) {
87
+ result.timestamped = true;
88
+ result.timestampTime = ts.timestampTime;
89
+ result.tsaCommonName = ts.tsaCommonName;
90
+ // §2.4.2 binding: TST messageImprint == sha256(signatureValue).
91
+ if (ts.sigValueHex && ts.messageImprintHashHex) {
92
+ const expected = sha256Hex(ts.sigValueHex);
93
+ if (expected !== ts.messageImprintHashHex.toLowerCase()) {
94
+ failures.push("timestamp messageImprint does not match signature value");
95
+ }
96
+ }
97
+ else if (!ts.messageImprintHashHex) {
98
+ failures.push("timestamp present but messageImprint could not be read");
99
+ }
100
+ }
101
+ }
102
+ catch (e) {
103
+ failures.push(`PKCS#7 parse error: ${e.message}`);
104
+ return result;
105
+ }
106
+ result.ok = failures.length === 0;
107
+ return result;
108
+ }
109
+ /**
110
+ * Preferred name for {@link verifyPdfStructure}. Performs full cryptographic
111
+ * verification (structure + digest + signature); `ok:true` means the signature
112
+ * is valid over the exact document bytes.
113
+ */
114
+ export const verifyPdfSignature = verifyPdfStructure;
115
+ /**
116
+ * Cryptographically verify the first SignerInfo of a detached PKCS#7:
117
+ * digestValid — SHA-256(coveredContent) === messageDigest signed attribute
118
+ * signatureValid — RSA-verify(signature) over DER(signedAttrs re-tagged SET)
119
+ * against the signer certificate's public key
120
+ *
121
+ * node-forge's high-level `pkcs7.verify()` does not support externally-detached
122
+ * content (the signed bytes live in the PDF, not the CMS), so we walk the ASN.1
123
+ * directly. The re-encoding of the [0] IMPLICIT signedAttrs as a UNIVERSAL SET
124
+ * OF reproduces exactly the bytes forge signed (same element order), so a
125
+ * forge-produced signature verifies byte-for-byte.
126
+ */
127
+ function verifySignerCrypto(contentInfo, signerCert, coveredContent) {
128
+ const failures = [];
129
+ let digestValid = false;
130
+ let signatureValid = false;
131
+ try {
132
+ const signerInfo = firstSignerInfo(contentInfo);
133
+ if (!signerInfo) {
134
+ failures.push("could not locate SignerInfo for cryptographic verification");
135
+ return { digestValid, signatureValid, failures };
136
+ }
137
+ // signedAttrs = the [0] IMPLICIT context node; signature = the UNIVERSAL
138
+ // OCTET STRING (encryptedDigest). unsignedAttrs would be [1] — skip it.
139
+ let signedAttrs;
140
+ let signatureValue;
141
+ for (const child of signerInfo.value) {
142
+ if (child.tagClass === asn1.Class.CONTEXT_SPECIFIC && child.type === 0) {
143
+ signedAttrs = child;
144
+ }
145
+ if (child.tagClass === asn1.Class.UNIVERSAL &&
146
+ child.type === asn1.Type.OCTETSTRING &&
147
+ typeof child.value === "string") {
148
+ signatureValue = child.value;
149
+ }
150
+ }
151
+ if (!signedAttrs || !Array.isArray(signedAttrs.value)) {
152
+ failures.push("SignerInfo has no signed attributes (cannot verify)");
153
+ return { digestValid, signatureValid, failures };
154
+ }
155
+ // (1) messageDigest signed attribute vs recomputed digest of covered bytes.
156
+ const messageDigest = extractSignedAttrValue(signedAttrs, OID_MESSAGE_DIGEST);
157
+ if (!messageDigest) {
158
+ failures.push("messageDigest signed attribute missing");
159
+ }
160
+ else {
161
+ const recomputed = crypto.createHash("sha256").update(coveredContent).digest();
162
+ const claimed = Buffer.from(messageDigest, "binary");
163
+ digestValid =
164
+ recomputed.length === claimed.length &&
165
+ crypto.timingSafeEqual(recomputed, claimed);
166
+ if (!digestValid) {
167
+ failures.push("document digest does not match messageDigest attribute — content altered after signing");
168
+ }
169
+ }
170
+ // (2) RSA signature over DER(signedAttrs as SET OF) vs signer public key.
171
+ if (!signatureValue) {
172
+ failures.push("SignerInfo signature value missing");
173
+ }
174
+ else {
175
+ const setDer = asn1.toDer(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, signedAttrs.value)).getBytes();
176
+ const md = forge.md.sha256.create();
177
+ md.update(setDer);
178
+ try {
179
+ signatureValid = signerCert.publicKey.verify(md.digest().getBytes(), signatureValue);
180
+ if (!signatureValid) {
181
+ failures.push("signature does not verify against the signer certificate");
182
+ }
183
+ }
184
+ catch (e) {
185
+ signatureValid = false;
186
+ failures.push(`signature verification threw: ${e.message}`);
187
+ }
188
+ }
189
+ }
190
+ catch (e) {
191
+ failures.push(`cryptographic verification error: ${e.message}`);
192
+ }
193
+ return { digestValid, signatureValid, failures };
194
+ }
195
+ /** Locate the first SignerInfo SEQUENCE inside a PKCS#7 SignedData ASN.1 tree. */
196
+ function firstSignerInfo(contentInfo) {
197
+ if (!Array.isArray(contentInfo.value))
198
+ return undefined;
199
+ let signedData;
200
+ for (const child of contentInfo.value) {
201
+ if (child.tagClass === asn1.Class.CONTEXT_SPECIFIC && Array.isArray(child.value)) {
202
+ signedData = child.value[0];
203
+ }
204
+ }
205
+ if (!signedData || !Array.isArray(signedData.value))
206
+ return undefined;
207
+ let signerInfos;
208
+ for (const child of signedData.value) {
209
+ if (child.tagClass === asn1.Class.UNIVERSAL &&
210
+ child.type === asn1.Type.SET &&
211
+ Array.isArray(child.value)) {
212
+ signerInfos = child; // last UNIVERSAL SET = signerInfos (first = digestAlgorithms)
213
+ }
214
+ }
215
+ if (!signerInfos || !Array.isArray(signerInfos.value) || signerInfos.value.length === 0) {
216
+ return undefined;
217
+ }
218
+ return signerInfos.value[0];
219
+ }
220
+ /**
221
+ * From a signed-attributes node ([0] IMPLICIT SET OF Attribute), return the
222
+ * value bytes (forge binary string) of the attribute with the given OID, or
223
+ * undefined. Attribute ::= SEQUENCE { OID, SET OF AttributeValue }.
224
+ */
225
+ function extractSignedAttrValue(signedAttrs, oid) {
226
+ for (const attr of signedAttrs.value) {
227
+ if (!Array.isArray(attr.value) || attr.value.length < 2)
228
+ continue;
229
+ const oidNode = attr.value[0];
230
+ if (oidNode.type !== asn1.Type.OID || safeOid(oidNode.value) !== oid)
231
+ continue;
232
+ const set = attr.value[1];
233
+ if (!Array.isArray(set.value) || set.value.length === 0)
234
+ return undefined;
235
+ const val = set.value[0];
236
+ return typeof val.value === "string" ? val.value : undefined;
237
+ }
238
+ return undefined;
239
+ }
240
+ /**
241
+ * Walk the parsed PKCS#7 ASN.1 to the first SignerInfo, returning its
242
+ * signatureValue (hex) and, if present, the embedded TimeStampToken metadata.
243
+ */
244
+ function inspectTimestamp(contentInfo) {
245
+ if (!Array.isArray(contentInfo.value))
246
+ return { present: false };
247
+ // content [0] EXPLICIT → SignedData SEQUENCE
248
+ let signedData;
249
+ for (const child of contentInfo.value) {
250
+ if (child.tagClass === asn1.Class.CONTEXT_SPECIFIC && Array.isArray(child.value)) {
251
+ signedData = child.value[0];
252
+ }
253
+ }
254
+ if (!signedData || !Array.isArray(signedData.value))
255
+ return { present: false };
256
+ // signerInfos = the last UNIVERSAL SET among SignedData children.
257
+ let signerInfos;
258
+ for (const child of signedData.value) {
259
+ if (child.tagClass === asn1.Class.UNIVERSAL &&
260
+ child.type === asn1.Type.SET &&
261
+ Array.isArray(child.value)) {
262
+ signerInfos = child;
263
+ }
264
+ }
265
+ if (!signerInfos || !Array.isArray(signerInfos.value) || signerInfos.value.length === 0) {
266
+ return { present: false };
267
+ }
268
+ const signerInfo = signerInfos.value[0];
269
+ if (!Array.isArray(signerInfo.value))
270
+ return { present: false };
271
+ const siChildren = signerInfo.value;
272
+ // SignerInfo signature is the last UNIVERSAL OCTET STRING (encryptedDigest).
273
+ // unsignedAttrs, if present, is a [1] IMPLICIT context-specific node.
274
+ let sigValueHex;
275
+ let unsignedAttrs;
276
+ for (const child of siChildren) {
277
+ if (child.tagClass === asn1.Class.UNIVERSAL &&
278
+ child.type === asn1.Type.OCTETSTRING &&
279
+ typeof child.value === "string") {
280
+ sigValueHex = forge.util.bytesToHex(child.value);
281
+ }
282
+ if (child.tagClass === asn1.Class.CONTEXT_SPECIFIC && child.type === 1) {
283
+ unsignedAttrs = child;
284
+ }
285
+ }
286
+ if (!unsignedAttrs || !Array.isArray(unsignedAttrs.value)) {
287
+ return { present: false, sigValueHex };
288
+ }
289
+ // Find the Attribute whose attrType OID is id-aa-timeStampToken.
290
+ for (const attr of unsignedAttrs.value) {
291
+ if (!Array.isArray(attr.value) || attr.value.length < 2)
292
+ continue;
293
+ const oidNode = attr.value[0];
294
+ if (oidNode.type !== asn1.Type.OID || safeOid(oidNode.value) !== OID_TIMESTAMP_TOKEN) {
295
+ continue;
296
+ }
297
+ const setNode = attr.value[1];
298
+ if (!Array.isArray(setNode.value) || setNode.value.length === 0)
299
+ continue;
300
+ const token = setNode.value[0];
301
+ const info = parseTstInfo(token);
302
+ return {
303
+ present: true,
304
+ sigValueHex,
305
+ messageImprintHashHex: info.messageImprintHashHex,
306
+ timestampTime: toIsoGeneralizedTime(info.genTime),
307
+ tsaCommonName: info.tsaCommonName,
308
+ };
309
+ }
310
+ return { present: false, sigValueHex };
311
+ }
312
+ function safeOid(der) {
313
+ try {
314
+ return asn1.derToOid(der);
315
+ }
316
+ catch {
317
+ return "";
318
+ }
319
+ }
320
+ /** sha256 of a hex string, returned as lowercase hex. */
321
+ function sha256Hex(hex) {
322
+ const md = forge.md.sha256.create();
323
+ md.update(forge.util.hexToBytes(hex));
324
+ return md.digest().toHex().toLowerCase();
325
+ }
326
+ /** Convert an ASN.1 GeneralizedTime (e.g. 20260528123456Z) to ISO 8601. */
327
+ function toIsoGeneralizedTime(gt) {
328
+ if (!gt)
329
+ return undefined;
330
+ const m = gt.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:\.\d+)?Z?$/);
331
+ if (!m)
332
+ return gt;
333
+ const [, y, mo, d, h, mi, s] = m;
334
+ const iso = `${y}-${mo}-${d}T${h}:${mi}:${s}Z`;
335
+ const parsed = new Date(iso);
336
+ return Number.isNaN(parsed.getTime()) ? gt : parsed.toISOString();
337
+ }
338
+ //# sourceMappingURL=verify-pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-pdf.js","sourceRoot":"","sources":["../src/verify-pdf.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "@e-sig/core",
3
+ "version": "0.4.0",
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.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "./signature-block": {
17
+ "types": "./dist/signature-block.d.ts",
18
+ "import": "./dist/signature-block.js",
19
+ "default": "./dist/signature-block.js"
20
+ },
21
+ "./adapters": {
22
+ "types": "./dist/adapters.d.ts",
23
+ "import": "./dist/adapters.js",
24
+ "default": "./dist/adapters.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist/",
29
+ "README.md",
30
+ "CONSUMING.md",
31
+ "LICENSE"
32
+ ],
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.build.json",
35
+ "clean": "rm -rf dist",
36
+ "prepublishOnly": "npm run clean && npm run build",
37
+ "pretest": "npm run build",
38
+ "test": "vitest run",
39
+ "test:watch": "vitest"
40
+ },
41
+ "engines": {
42
+ "node": ">=20"
43
+ },
44
+ "keywords": [
45
+ "pdf",
46
+ "esignature",
47
+ "e-signature",
48
+ "pkcs7",
49
+ "pades",
50
+ "etsi",
51
+ "cades",
52
+ "self-hosted",
53
+ "documenso",
54
+ "docuseal",
55
+ "self-contained",
56
+ "esign",
57
+ "ueta",
58
+ "hipaa"
59
+ ],
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "https://github.com/vmvtech/esig-suite.git",
63
+ "directory": "packages/esig-core"
64
+ },
65
+ "homepage": "https://github.com/vmvtech/esig-suite/tree/main/packages/esig-core#readme",
66
+ "dependencies": {
67
+ "@signpdf/placeholder-plain": "^3.3.0",
68
+ "@signpdf/signpdf": "^3.3.0",
69
+ "@signpdf/utils": "^3.3.0",
70
+ "node-forge": "^1.4.0",
71
+ "puppeteer-core": "^24.0.0 || ^25.0.0"
72
+ },
73
+ "peerDependencies": {
74
+ "@sparticuz/chromium": "^140.0.0 || ^148.0.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "@sparticuz/chromium": {
78
+ "optional": true
79
+ }
80
+ },
81
+ "devDependencies": {
82
+ "@sparticuz/chromium": "^140.0.0",
83
+ "@types/node": "^22.0.0",
84
+ "@types/node-forge": "^1.3.0",
85
+ "typescript": "^5.4.0",
86
+ "vitest": "^2.1.9"
87
+ },
88
+ "publishConfig": {
89
+ "registry": "https://registry.npmjs.org",
90
+ "access": "public"
91
+ }
92
+ }