edockit 0.3.0 → 0.4.0-dev.1

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 (68) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +81 -198
  3. package/TRUSTED-LIST.md +308 -0
  4. package/dist/certificate-3c9dcdac.js +549 -0
  5. package/dist/certificate-3c9dcdac.js.map +1 -0
  6. package/dist/certificate-c7123a37.js +581 -0
  7. package/dist/certificate-c7123a37.js.map +1 -0
  8. package/dist/core/canonicalization/XMLCanonicalizer.d.ts +9 -3
  9. package/dist/core/trustedlist/build.d.ts +41 -0
  10. package/dist/core/trustedlist/bundled-provider.d.ts +2 -0
  11. package/dist/core/trustedlist/contract.d.ts +19 -0
  12. package/dist/core/trustedlist/dom.d.ts +12 -0
  13. package/dist/core/trustedlist/extract.d.ts +6 -0
  14. package/dist/core/trustedlist/http.d.ts +8 -0
  15. package/dist/core/trustedlist/identity.d.ts +7 -0
  16. package/dist/core/trustedlist/index.d.ts +18 -0
  17. package/dist/core/trustedlist/loader.d.ts +5 -0
  18. package/dist/core/trustedlist/matcher.d.ts +11 -0
  19. package/dist/core/trustedlist/normalize.d.ts +14 -0
  20. package/dist/core/trustedlist/reference-provider.d.ts +12 -0
  21. package/dist/core/trustedlist/types.d.ts +114 -0
  22. package/dist/core/unzip.d.ts +0 -0
  23. package/dist/core/verification.d.ts +22 -0
  24. package/dist/data/trusted-list.d.ts +3 -0
  25. package/dist/identity-c9e5052e.js +410 -0
  26. package/dist/identity-c9e5052e.js.map +1 -0
  27. package/dist/identity-fca881b1.js +406 -0
  28. package/dist/identity-fca881b1.js.map +1 -0
  29. package/dist/index.cjs.js +540 -8838
  30. package/dist/index.cjs.js.map +1 -1
  31. package/dist/index.d.ts +4 -2
  32. package/dist/index.esm.js +498 -8795
  33. package/dist/index.esm.js.map +1 -1
  34. package/dist/index.umd.js +23 -17
  35. package/dist/index.umd.js.map +1 -1
  36. package/dist/loader-7a0f771f.js +222 -0
  37. package/dist/loader-7a0f771f.js.map +1 -0
  38. package/dist/loader-ad1a5051.js +217 -0
  39. package/dist/loader-ad1a5051.js.map +1 -0
  40. package/dist/normalize-50862581.js +456 -0
  41. package/dist/normalize-50862581.js.map +1 -0
  42. package/dist/normalize-9626be7c.js +479 -0
  43. package/dist/normalize-9626be7c.js.map +1 -0
  44. package/dist/reference-provider-3838ebfb.js +217 -0
  45. package/dist/reference-provider-3838ebfb.js.map +1 -0
  46. package/dist/reference-provider-9bbbaab8.js +211 -0
  47. package/dist/reference-provider-9bbbaab8.js.map +1 -0
  48. package/dist/trusted-list-build.cjs.js +580 -0
  49. package/dist/trusted-list-build.cjs.js.map +1 -0
  50. package/dist/trusted-list-build.d.ts +4 -0
  51. package/dist/trusted-list-build.esm.js +569 -0
  52. package/dist/trusted-list-build.esm.js.map +1 -0
  53. package/dist/trusted-list-bundled.cjs.js +30439 -0
  54. package/dist/trusted-list-bundled.cjs.js.map +1 -0
  55. package/dist/trusted-list-bundled.d.ts +1 -0
  56. package/dist/trusted-list-bundled.esm.js +30435 -0
  57. package/dist/trusted-list-bundled.esm.js.map +1 -0
  58. package/dist/trusted-list-http.cjs.js +85 -0
  59. package/dist/trusted-list-http.cjs.js.map +1 -0
  60. package/dist/trusted-list-http.d.ts +1 -0
  61. package/dist/trusted-list-http.esm.js +81 -0
  62. package/dist/trusted-list-http.esm.js.map +1 -0
  63. package/dist/trusted-list.cjs.js +38 -0
  64. package/dist/trusted-list.cjs.js.map +1 -0
  65. package/dist/trusted-list.d.ts +9 -0
  66. package/dist/trusted-list.esm.js +13 -0
  67. package/dist/trusted-list.esm.js.map +1 -0
  68. package/package.json +32 -2
@@ -0,0 +1,549 @@
1
+ /*!
2
+ * MIT License
3
+ * Copyright (c) 2025 Edgars Jēkabsons, ZenomyTech SIA
4
+ */
5
+ import * as xmldom from '@xmldom/xmldom';
6
+ import * as xpath from 'xpath';
7
+ import { X509Certificate } from '@peculiar/x509';
8
+
9
+ /**
10
+ * Recursive DOM traversal to find elements with a given tag name
11
+ * (Fallback method when XPath is not available or fails)
12
+ *
13
+ * @param parent The parent element to search within
14
+ * @param selector CSS-like selector with namespace support (e.g., "ds:SignedInfo, SignedInfo")
15
+ * @returns Array of matching elements
16
+ */
17
+ function findElementsByTagNameRecursive(parent, selector) {
18
+ const results = [];
19
+ const selectors = selector.split(",").map((s) => s.trim());
20
+ // Parse each selector part to extract namespace and local name
21
+ const parsedSelectors = [];
22
+ for (const sel of selectors) {
23
+ const parts = sel.split(/\\:|:/).filter(Boolean);
24
+ if (parts.length === 1) {
25
+ parsedSelectors.push({ name: parts[0] });
26
+ }
27
+ else if (parts.length === 2) {
28
+ parsedSelectors.push({ ns: parts[0], name: parts[1] });
29
+ }
30
+ }
31
+ // Recursive search function - keep the original node references
32
+ function searchNode(node) {
33
+ if (!node)
34
+ return;
35
+ if (node.nodeType === 1) {
36
+ // Element node - make sure we're working with an actual DOM Element
37
+ const element = node;
38
+ const nodeName = element.nodeName;
39
+ const localName = element.localName;
40
+ // Check if this element matches any of our selectors
41
+ for (const sel of parsedSelectors) {
42
+ // Match by full nodeName (which might include namespace prefix)
43
+ if (sel.ns && nodeName === `${sel.ns}:${sel.name}`) {
44
+ results.push(element); // Store the actual DOM element reference
45
+ break;
46
+ }
47
+ // Match by local name only
48
+ if (localName === sel.name || nodeName === sel.name) {
49
+ results.push(element); // Store the actual DOM element reference
50
+ break;
51
+ }
52
+ // Match by checking if nodeName ends with the local name
53
+ if (nodeName.endsWith(`:${sel.name}`)) {
54
+ results.push(element); // Store the actual DOM element reference
55
+ break;
56
+ }
57
+ }
58
+ }
59
+ // Search all child nodes
60
+ if (node.childNodes) {
61
+ for (let i = 0; i < node.childNodes.length; i++) {
62
+ searchNode(node.childNodes[i]);
63
+ }
64
+ }
65
+ }
66
+ searchNode(parent);
67
+ return results;
68
+ }
69
+ // Known XML namespaces used in XML Signatures and related standards
70
+ const NAMESPACES = {
71
+ ds: "http://www.w3.org/2000/09/xmldsig#",
72
+ dsig11: "http://www.w3.org/2009/xmldsig11#",
73
+ dsig2: "http://www.w3.org/2010/xmldsig2#",
74
+ ec: "http://www.w3.org/2001/10/xml-exc-c14n#",
75
+ dsig_more: "http://www.w3.org/2001/04/xmldsig-more#",
76
+ xenc: "http://www.w3.org/2001/04/xmlenc#",
77
+ xenc11: "http://www.w3.org/2009/xmlenc11#",
78
+ xades: "http://uri.etsi.org/01903/v1.3.2#",
79
+ xades141: "http://uri.etsi.org/01903/v1.4.1#",
80
+ asic: "http://uri.etsi.org/02918/v1.2.1#",
81
+ };
82
+ /**
83
+ * Create an XML parser that works in both browser and Node environments
84
+ */
85
+ function createXMLParser() {
86
+ // Check if we're in a browser environment with native DOM support
87
+ if (typeof window !== "undefined" && window.DOMParser) {
88
+ return new window.DOMParser();
89
+ }
90
+ // We're in Node.js, so use xmldom
91
+ return new xmldom.DOMParser();
92
+ }
93
+ /**
94
+ * Uses XPath to find a single element in an XML document
95
+ *
96
+ * @param parent The parent element or document to search within
97
+ * @param xpathExpression The XPath expression to evaluate
98
+ * @param namespaces Optional namespace mapping (defaults to common XML signature namespaces)
99
+ * @returns The found element or null
100
+ */
101
+ function queryByXPath(parent, xpathExpression, namespaces = NAMESPACES) {
102
+ try {
103
+ // Browser environment with native XPath
104
+ if (typeof document !== "undefined" && typeof document.evaluate === "function") {
105
+ // Use the document that owns the parent node, not the global document
106
+ const ownerDoc = "ownerDocument" in parent ? parent.ownerDocument : parent;
107
+ if (!ownerDoc || typeof ownerDoc.evaluate !== "function") {
108
+ // XMLDocuments from DOMParser don't have evaluate - silently return null
109
+ // (caller should use DOM traversal fallback)
110
+ return null;
111
+ }
112
+ const nsResolver = createNsResolverForBrowser(namespaces);
113
+ const result = ownerDoc.evaluate(xpathExpression, parent, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
114
+ return result.singleNodeValue;
115
+ }
116
+ // Node.js environment with xpath module
117
+ else {
118
+ const xpathLib = xpath;
119
+ const nsResolver = createNsResolverForNode(namespaces);
120
+ // Use a try-catch here to handle specific XPath issues
121
+ try {
122
+ const nodes = xpathLib.select(xpathExpression, parent, nsResolver);
123
+ return nodes.length > 0 ? nodes[0] : null;
124
+ }
125
+ catch (err) {
126
+ // If we get a namespace error, try a simpler XPath with just local-name()
127
+ if (typeof err === "object" &&
128
+ err !== null &&
129
+ "message" in err &&
130
+ typeof err.message === "string" &&
131
+ err.message.includes("Cannot resolve QName")) {
132
+ // Extract the element name we're looking for from the XPath
133
+ const match = xpathExpression.match(/local-name\(\)='([^']+)'/);
134
+ if (match && match[1]) {
135
+ const elementName = match[1];
136
+ const simplifiedXPath = `.//*[local-name()='${elementName}']`;
137
+ const nodes = xpathLib.select(simplifiedXPath, parent);
138
+ return nodes.length > 0 ? nodes[0] : null;
139
+ }
140
+ }
141
+ throw err; // Re-throw if we couldn't handle it
142
+ }
143
+ }
144
+ }
145
+ catch (e) {
146
+ console.error(`XPath evaluation failed for "${xpathExpression}":`, e);
147
+ return null;
148
+ }
149
+ }
150
+ /**
151
+ * Uses XPath to find all matching elements in an XML document
152
+ *
153
+ * @param parent The parent element or document to search within
154
+ * @param xpathExpression The XPath expression to evaluate
155
+ * @param namespaces Optional namespace mapping (defaults to common XML signature namespaces)
156
+ * @returns Array of matching elements
157
+ */
158
+ function queryAllByXPath(parent, xpathExpression, namespaces = NAMESPACES) {
159
+ try {
160
+ // Browser environment with native XPath
161
+ if (typeof document !== "undefined" && typeof document.evaluate === "function") {
162
+ // Use the document that owns the parent node, not the global document
163
+ const ownerDoc = "ownerDocument" in parent ? parent.ownerDocument : parent;
164
+ if (!ownerDoc || typeof ownerDoc.evaluate !== "function") {
165
+ // XMLDocuments from DOMParser don't have evaluate - silently return empty
166
+ // (caller should use DOM traversal fallback)
167
+ return [];
168
+ }
169
+ const nsResolver = createNsResolverForBrowser(namespaces);
170
+ const result = ownerDoc.evaluate(xpathExpression, parent, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
171
+ const elements = [];
172
+ for (let i = 0; i < result.snapshotLength; i++) {
173
+ elements.push(result.snapshotItem(i));
174
+ }
175
+ return elements;
176
+ }
177
+ // Node.js environment with xpath module
178
+ else {
179
+ const xpathLib = xpath;
180
+ const nsResolver = createNsResolverForNode(namespaces);
181
+ // Use a try-catch here to handle specific XPath issues
182
+ try {
183
+ const nodes = xpathLib.select(xpathExpression, parent, nsResolver);
184
+ return nodes;
185
+ }
186
+ catch (err) {
187
+ // If we get a namespace error, try a simpler XPath with just local-name()
188
+ if (typeof err === "object" &&
189
+ err !== null &&
190
+ "message" in err &&
191
+ typeof err.message === "string" &&
192
+ err.message.includes("Cannot resolve QName")) {
193
+ // Extract the element name we're looking for from the XPath
194
+ const match = xpathExpression.match(/local-name\(\)='([^']+)'/);
195
+ if (match && match[1]) {
196
+ const elementName = match[1];
197
+ const simplifiedXPath = `.//*[local-name()='${elementName}']`;
198
+ const nodes = xpathLib.select(simplifiedXPath, parent);
199
+ return nodes;
200
+ }
201
+ }
202
+ throw err; // Re-throw if we couldn't handle it
203
+ }
204
+ }
205
+ }
206
+ catch (e) {
207
+ console.error(`XPath evaluation failed for "${xpathExpression}":`, e);
208
+ return [];
209
+ }
210
+ }
211
+ /**
212
+ * Helper function to create a namespace resolver for browser environments
213
+ */
214
+ function createNsResolverForBrowser(namespaces) {
215
+ return function (prefix) {
216
+ if (prefix === null)
217
+ return null;
218
+ return namespaces[prefix] || null;
219
+ };
220
+ }
221
+ /**
222
+ * Helper function to create a namespace resolver for Node.js environments
223
+ */
224
+ function createNsResolverForNode(namespaces) {
225
+ return namespaces;
226
+ }
227
+ /**
228
+ * Converts a CSS-like selector (with namespace support) to an XPath expression
229
+ *
230
+ * @param selector CSS-like selector (e.g., "ds:SignedInfo, SignedInfo")
231
+ * @returns Equivalent XPath expression
232
+ */
233
+ function selectorToXPath(selector) {
234
+ // Split by comma to handle alternative selectors
235
+ const parts = selector.split(",").map((s) => s.trim());
236
+ const xpathParts = [];
237
+ for (const part of parts) {
238
+ // Handle namespaced selectors (both prefix:name and prefix\\:name formats)
239
+ const segments = part.split(/\\:|:/).filter(Boolean);
240
+ if (segments.length === 1) {
241
+ // Simple element name without namespace
242
+ // Match any element with the right local name
243
+ xpathParts.push(`.//*[local-name()='${segments[0]}']`);
244
+ }
245
+ else if (segments.length === 2) {
246
+ // Element with namespace prefix - only use local-name() or specific namespace prefix
247
+ // that we know is registered, avoiding the generic 'ns:' prefix
248
+ xpathParts.push(`.//${segments[0]}:${segments[1]} | .//*[local-name()='${segments[1]}']`);
249
+ }
250
+ }
251
+ // Join with | operator (XPath's OR)
252
+ return xpathParts.join(" | ");
253
+ }
254
+ /**
255
+ * Enhanced querySelector that uses XPath for better namespace handling
256
+ * (Drop-in replacement for the original querySelector function)
257
+ *
258
+ * @param parent The parent element or document to search within
259
+ * @param selector A CSS-like selector (with namespace handling)
260
+ * @returns The found element or null
261
+ */
262
+ function querySelector(parent, selector) {
263
+ // First try native querySelector if we're in a browser
264
+ if (typeof parent.querySelector === "function") {
265
+ try {
266
+ const result = parent.querySelector(selector);
267
+ if (result)
268
+ return result;
269
+ }
270
+ catch (e) {
271
+ // Fallback to XPath if querySelector fails (e.g., due to namespace issues)
272
+ }
273
+ }
274
+ // First try with our enhanced DOM traversal methods (more reliable in some cases)
275
+ const elements = findElementsByTagNameRecursive(parent, selector);
276
+ if (elements.length > 0) {
277
+ return elements[0];
278
+ }
279
+ // Then try XPath as a fallback
280
+ try {
281
+ const xpathExpr = selectorToXPath(selector);
282
+ return queryByXPath(parent, xpathExpr);
283
+ }
284
+ catch (e) {
285
+ console.warn("XPath query failed, using direct DOM traversal as fallback");
286
+ return null;
287
+ }
288
+ }
289
+ /**
290
+ * Enhanced querySelectorAll that uses XPath for better namespace handling
291
+ * (Drop-in replacement for the original querySelectorAll function)
292
+ *
293
+ * @param parent The parent element or document to search within
294
+ * @param selector A CSS-like selector (with namespace handling)
295
+ * @returns Array of matching elements
296
+ */
297
+ function querySelectorAll(parent, selector) {
298
+ // First try native querySelectorAll if we're in a browser
299
+ if (typeof parent.querySelectorAll === "function") {
300
+ try {
301
+ const results = parent.querySelectorAll(selector);
302
+ if (results.length > 0) {
303
+ const elements = [];
304
+ for (let i = 0; i < results.length; i++) {
305
+ elements.push(results[i]);
306
+ }
307
+ return elements;
308
+ }
309
+ }
310
+ catch (e) {
311
+ // Fallback to XPath if querySelectorAll fails (e.g., due to namespace issues)
312
+ }
313
+ }
314
+ // First try with our enhanced DOM traversal methods (more reliable in some cases)
315
+ const elements = findElementsByTagNameRecursive(parent, selector);
316
+ if (elements.length > 0) {
317
+ return elements;
318
+ }
319
+ // Then try XPath as a fallback
320
+ try {
321
+ const xpathExpr = selectorToXPath(selector);
322
+ return queryAllByXPath(parent, xpathExpr);
323
+ }
324
+ catch (e) {
325
+ console.warn("XPath query failed, using direct DOM traversal as fallback");
326
+ return [];
327
+ }
328
+ }
329
+ /**
330
+ * Serialize a DOM node to XML string
331
+ */
332
+ function serializeToXML(node) {
333
+ // Check if we're in a browser environment with native XMLSerializer
334
+ if (typeof window !== "undefined" && window.XMLSerializer) {
335
+ return new window.XMLSerializer().serializeToString(node);
336
+ }
337
+ // Node.js — use xmldom
338
+ return new xmldom.XMLSerializer().serializeToString(node);
339
+ }
340
+
341
+ /**
342
+ * Format a certificate string as a proper PEM certificate
343
+ * @param certBase64 Base64-encoded certificate
344
+ * @returns Formatted PEM certificate
345
+ */
346
+ function formatPEM(certBase64) {
347
+ if (!certBase64)
348
+ return "";
349
+ // Remove any whitespace from the base64 string
350
+ const cleanBase64 = certBase64.replace(/\s+/g, "");
351
+ // Split the base64 into lines of 64 characters
352
+ const lines = [];
353
+ for (let i = 0; i < cleanBase64.length; i += 64) {
354
+ lines.push(cleanBase64.substring(i, i + 64));
355
+ }
356
+ // Format as PEM certificate
357
+ return `-----BEGIN CERTIFICATE-----\n${lines.join("\n")}\n-----END CERTIFICATE-----`;
358
+ }
359
+ /**
360
+ * Extract subject information from an X.509 certificate
361
+ * @param certificate X509Certificate instance
362
+ * @returns Signer information object
363
+ */
364
+ function extractSignerInfo(certificate) {
365
+ const result = {
366
+ validFrom: certificate.notBefore,
367
+ validTo: certificate.notAfter,
368
+ issuer: {},
369
+ };
370
+ // Try to extract fields using various approaches
371
+ // Approach 1: Try direct access to typed subject properties
372
+ try {
373
+ if (typeof certificate.subject === "object" && certificate.subject !== null) {
374
+ // Handle subject properties
375
+ const subject = certificate.subject;
376
+ result.commonName = subject.commonName;
377
+ result.organization = subject.organizationName;
378
+ result.country = subject.countryName;
379
+ }
380
+ // Handle issuer properties
381
+ if (typeof certificate.issuer === "object" && certificate.issuer !== null) {
382
+ const issuer = certificate.issuer;
383
+ result.issuer.commonName = issuer.commonName;
384
+ result.issuer.organization = issuer.organizationName;
385
+ result.issuer.country = issuer.countryName;
386
+ }
387
+ }
388
+ catch (e) {
389
+ console.warn("Could not extract subject/issuer as objects:", e);
390
+ }
391
+ // Approach 2: Parse subject/issuer as strings if they are strings
392
+ try {
393
+ if (typeof certificate.subject === "string") {
394
+ const subjectStr = certificate.subject;
395
+ // Parse the string format (usually CN=name,O=org,C=country)
396
+ const subjectParts = subjectStr.split(",");
397
+ for (const part of subjectParts) {
398
+ const [key, value] = part.trim().split("=");
399
+ if (key === "CN")
400
+ result.commonName = result.commonName || value;
401
+ if (key === "O")
402
+ result.organization = result.organization || value;
403
+ if (key === "C")
404
+ result.country = result.country || value;
405
+ if (key === "SN")
406
+ result.surname = value;
407
+ if (key === "G" || key === "GN")
408
+ result.givenName = value;
409
+ if (key === "SERIALNUMBER" || key === "2.5.4.5")
410
+ result.serialNumber = value?.replace("PNOLV-", "");
411
+ }
412
+ }
413
+ if (typeof certificate.issuer === "string") {
414
+ const issuerStr = certificate.issuer;
415
+ // Parse the string format
416
+ const issuerParts = issuerStr.split(",");
417
+ for (const part of issuerParts) {
418
+ const [key, value] = part.trim().split("=");
419
+ if (key === "CN")
420
+ result.issuer.commonName = result.issuer.commonName || value;
421
+ if (key === "O")
422
+ result.issuer.organization = result.issuer.organization || value;
423
+ if (key === "C")
424
+ result.issuer.country = result.issuer.country || value;
425
+ }
426
+ }
427
+ }
428
+ catch (e) {
429
+ console.warn("Could not extract subject/issuer as strings:", e);
430
+ }
431
+ // Approach 3: Try to use getField method if available
432
+ try {
433
+ if ("subjectName" in certificate && certificate.subjectName?.getField) {
434
+ const subjectName = certificate.subjectName;
435
+ // Only set if not already set from previous approaches
436
+ result.commonName = result.commonName || subjectName.getField("CN")?.[0];
437
+ result.surname = result.surname || subjectName.getField("SN")?.[0];
438
+ result.givenName = result.givenName || subjectName.getField("G")?.[0];
439
+ result.serialNumber =
440
+ result.serialNumber || subjectName.getField("2.5.4.5")?.[0]?.replace("PNOLV-", "");
441
+ result.country = result.country || subjectName.getField("C")?.[0];
442
+ result.organization = result.organization || subjectName.getField("O")?.[0];
443
+ }
444
+ }
445
+ catch (e) {
446
+ console.warn("Could not extract fields using getField method:", e);
447
+ }
448
+ // Get the serial number from the certificate if not found in subject
449
+ if (!result.serialNumber && certificate.serialNumber) {
450
+ result.serialNumber = certificate.serialNumber;
451
+ }
452
+ return result;
453
+ }
454
+ /**
455
+ * Parse a certificate from base64 data
456
+ * @param certData Base64-encoded certificate data
457
+ * @returns Parsed certificate information
458
+ */
459
+ async function parseCertificate(certData) {
460
+ try {
461
+ let pemCert = certData;
462
+ // Check if it's already in PEM format, if not, convert it
463
+ if (!certData.includes("-----BEGIN CERTIFICATE-----")) {
464
+ // Only clean non-PEM format data before conversion
465
+ const cleanedCertData = certData.replace(/[\r\n\s]/g, "");
466
+ pemCert = formatPEM(cleanedCertData);
467
+ }
468
+ const cert = new X509Certificate(pemCert);
469
+ const signerInfo = extractSignerInfo(cert);
470
+ return {
471
+ subject: {
472
+ commonName: signerInfo.commonName,
473
+ organization: signerInfo.organization,
474
+ country: signerInfo.country,
475
+ surname: signerInfo.surname,
476
+ givenName: signerInfo.givenName,
477
+ serialNumber: signerInfo.serialNumber,
478
+ },
479
+ validFrom: signerInfo.validFrom,
480
+ validTo: signerInfo.validTo,
481
+ issuer: signerInfo.issuer,
482
+ serialNumber: cert.serialNumber,
483
+ };
484
+ }
485
+ catch (error) {
486
+ console.error("Certificate parsing error:", error);
487
+ throw new Error("Failed to parse certificate: " + (error instanceof Error ? error.message : String(error)));
488
+ }
489
+ }
490
+ /**
491
+ * Check if a certificate was valid at a specific time
492
+ * @param cert Certificate object or info
493
+ * @param checkTime The time to check validity against (defaults to current time)
494
+ * @returns Validity check result
495
+ */
496
+ function checkCertificateValidity(cert, checkTime = new Date()) {
497
+ // Extract validity dates based on input type
498
+ const validFrom = "notBefore" in cert ? cert.notBefore : cert.validFrom;
499
+ const validTo = "notAfter" in cert ? cert.notAfter : cert.validTo;
500
+ // Check if certificate is valid at the specified time
501
+ if (checkTime < validFrom) {
502
+ return {
503
+ isValid: false,
504
+ reason: `Certificate not yet valid. Valid from ${validFrom.toISOString()}`,
505
+ };
506
+ }
507
+ if (checkTime > validTo) {
508
+ return {
509
+ isValid: false,
510
+ reason: `Certificate expired. Valid until ${validTo.toISOString()}`,
511
+ };
512
+ }
513
+ return { isValid: true };
514
+ }
515
+ /**
516
+ * Helper function to get signer display name from certificate
517
+ * @param certInfo Certificate information
518
+ * @returns Formatted display name
519
+ */
520
+ function getSignerDisplayName(certInfo) {
521
+ const { subject } = certInfo;
522
+ if (subject.givenName && subject.surname) {
523
+ return `${subject.givenName} ${subject.surname}`;
524
+ }
525
+ if (subject.commonName) {
526
+ return subject.commonName;
527
+ }
528
+ // Fallback to serial number if available
529
+ return subject.serialNumber || "Unknown Signer";
530
+ }
531
+ /**
532
+ * Helper function to format certificate validity period in a human-readable format
533
+ * @param certInfo Certificate information
534
+ * @returns Formatted validity period
535
+ */
536
+ function formatValidityPeriod(certInfo) {
537
+ const { validFrom, validTo } = certInfo;
538
+ const formatDate = (date) => {
539
+ return date.toLocaleDateString(undefined, {
540
+ year: "numeric",
541
+ month: "long",
542
+ day: "numeric",
543
+ });
544
+ };
545
+ return `${formatDate(validFrom)} to ${formatDate(validTo)}`;
546
+ }
547
+
548
+ export { querySelector as a, checkCertificateValidity as b, createXMLParser as c, formatPEM as d, extractSignerInfo as e, formatValidityPeriod as f, getSignerDisplayName as g, parseCertificate as p, querySelectorAll as q, serializeToXML as s };
549
+ //# sourceMappingURL=certificate-3c9dcdac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certificate-3c9dcdac.js","sources":["../src/utils/xmlParser.ts","../src/core/certificate.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}