@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.
- package/CONSUMING.md +97 -0
- package/LICENSE +21 -0
- package/README.md +298 -0
- package/dist/adapters.d.ts +79 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +10 -0
- package/dist/adapters.js.map +1 -0
- package/dist/cert-issuer.d.ts +47 -0
- package/dist/cert-issuer.d.ts.map +1 -0
- package/dist/cert-issuer.js +132 -0
- package/dist/cert-issuer.js.map +1 -0
- package/dist/cert-lifecycle.d.ts +16 -0
- package/dist/cert-lifecycle.d.ts.map +1 -0
- package/dist/cert-lifecycle.js +30 -0
- package/dist/cert-lifecycle.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/pem-signer.d.ts +42 -0
- package/dist/pem-signer.d.ts.map +1 -0
- package/dist/pem-signer.js +276 -0
- package/dist/pem-signer.js.map +1 -0
- package/dist/render-pdf.d.ts +33 -0
- package/dist/render-pdf.d.ts.map +1 -0
- package/dist/render-pdf.js +86 -0
- package/dist/render-pdf.js.map +1 -0
- package/dist/sign-document.d.ts +54 -0
- package/dist/sign-document.d.ts.map +1 -0
- package/dist/sign-document.js +93 -0
- package/dist/sign-document.js.map +1 -0
- package/dist/sign-pdf.d.ts +46 -0
- package/dist/sign-pdf.d.ts.map +1 -0
- package/dist/sign-pdf.js +60 -0
- package/dist/sign-pdf.js.map +1 -0
- package/dist/signature-block.d.ts +23 -0
- package/dist/signature-block.d.ts.map +1 -0
- package/dist/signature-block.js +63 -0
- package/dist/signature-block.js.map +1 -0
- package/dist/timestamp.d.ts +59 -0
- package/dist/timestamp.d.ts.map +1 -0
- package/dist/timestamp.js +278 -0
- package/dist/timestamp.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/verify-pdf.d.ts +33 -0
- package/dist/verify-pdf.d.ts.map +1 -0
- package/dist/verify-pdf.js +338 -0
- package/dist/verify-pdf.js.map +1 -0
- 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
|
+
}
|