edockit 0.4.0-dev.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 (49) hide show
  1. package/dist/{certificate-c46e14a0.js → certificate-3c9dcdac.js} +16 -27
  2. package/dist/certificate-3c9dcdac.js.map +1 -0
  3. package/dist/{certificate-fc0e06f7.js → certificate-c7123a37.js} +37 -27
  4. package/dist/certificate-c7123a37.js.map +1 -0
  5. package/dist/identity-c9e5052e.js +410 -0
  6. package/dist/identity-c9e5052e.js.map +1 -0
  7. package/dist/identity-fca881b1.js +406 -0
  8. package/dist/identity-fca881b1.js.map +1 -0
  9. package/dist/index.cjs.js +40 -1244
  10. package/dist/index.cjs.js.map +1 -1
  11. package/dist/index.esm.js +36 -1240
  12. package/dist/index.esm.js.map +1 -1
  13. package/dist/index.umd.js +23 -17
  14. package/dist/index.umd.js.map +1 -1
  15. package/dist/{loader-43d8e17a.js → loader-7a0f771f.js} +2 -2
  16. package/dist/{loader-43d8e17a.js.map → loader-7a0f771f.js.map} +1 -1
  17. package/dist/{loader-1ac52e12.js → loader-ad1a5051.js} +2 -2
  18. package/dist/{loader-1ac52e12.js.map → loader-ad1a5051.js.map} +1 -1
  19. package/dist/normalize-50862581.js +456 -0
  20. package/dist/normalize-50862581.js.map +1 -0
  21. package/dist/normalize-9626be7c.js +479 -0
  22. package/dist/normalize-9626be7c.js.map +1 -0
  23. package/dist/{reference-provider-1cd85b7b.js → reference-provider-3838ebfb.js} +4 -4
  24. package/dist/{reference-provider-1cd85b7b.js.map → reference-provider-3838ebfb.js.map} +1 -1
  25. package/dist/{reference-provider-53240217.js → reference-provider-9bbbaab8.js} +4 -4
  26. package/dist/{reference-provider-53240217.js.map → reference-provider-9bbbaab8.js.map} +1 -1
  27. package/dist/trusted-list-build.cjs.js +8 -3
  28. package/dist/trusted-list-build.cjs.js.map +1 -1
  29. package/dist/trusted-list-build.esm.js +8 -3
  30. package/dist/trusted-list-build.esm.js.map +1 -1
  31. package/dist/trusted-list-bundled.cjs.js +7 -4
  32. package/dist/trusted-list-bundled.cjs.js.map +1 -1
  33. package/dist/trusted-list-bundled.esm.js +7 -4
  34. package/dist/trusted-list-bundled.esm.js.map +1 -1
  35. package/dist/trusted-list.cjs.js +7 -4
  36. package/dist/trusted-list.cjs.js.map +1 -1
  37. package/dist/trusted-list.esm.js +7 -4
  38. package/dist/trusted-list.esm.js.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/certificate-c46e14a0.js.map +0 -1
  41. package/dist/certificate-fc0e06f7.js.map +0 -1
  42. package/dist/identity-1a3dddc3.js +0 -902
  43. package/dist/identity-1a3dddc3.js.map +0 -1
  44. package/dist/identity-b3a70fc1.js +0 -897
  45. package/dist/identity-b3a70fc1.js.map +0 -1
  46. package/dist/normalize-60f2d7e6.js +0 -6270
  47. package/dist/normalize-60f2d7e6.js.map +0 -1
  48. package/dist/normalize-70da6516.js +0 -6214
  49. package/dist/normalize-70da6516.js.map +0 -1
@@ -0,0 +1,406 @@
1
+ /*!
2
+ * MIT License
3
+ * Copyright (c) 2025 Edgars Jēkabsons, ZenomyTech SIA
4
+ */
5
+ import { X509Certificate } from '@peculiar/x509';
6
+ import { AsnParser, AsnConvert, OctetString } from '@peculiar/asn1-schema';
7
+ import { CertID, Request, TBSRequest, OCSPRequest, OCSPResponse, OCSPResponseStatus, BasicOCSPResponse } from '@peculiar/asn1-ocsp';
8
+ import { Certificate, AlgorithmIdentifier } from '@peculiar/asn1-x509';
9
+ import { g as fetchIssuerCertificate, c as arrayBufferToPEM, h as fetchOCSP, i as hexToArrayBuffer, n as normalizeDistinguishedName, d as arrayBufferToHex, j as normalizeKeyIdentifier } from './normalize-50862581.js';
10
+
11
+ // src/core/revocation/ocsp.ts
12
+ /**
13
+ * OID for Authority Information Access extension
14
+ */
15
+ const id_pe_authorityInfoAccess = "1.3.6.1.5.5.7.1.1";
16
+ /**
17
+ * SHA-1 algorithm identifier for OCSP
18
+ */
19
+ const SHA1_OID = "1.3.14.3.2.26";
20
+ /**
21
+ * Compute SHA-1 hash of data (cross-platform)
22
+ */
23
+ async function computeSHA1(data) {
24
+ if (typeof crypto !== "undefined" && crypto.subtle) {
25
+ return crypto.subtle.digest("SHA-1", data);
26
+ }
27
+ // Node.js fallback
28
+ const nodeCrypto = require("crypto");
29
+ const hash = nodeCrypto.createHash("sha1");
30
+ hash.update(Buffer.from(data));
31
+ return hash.digest().buffer;
32
+ }
33
+ /**
34
+ * Extract OCSP responder URLs from certificate
35
+ * @param cert X509Certificate to extract OCSP URLs from
36
+ * @returns Array of OCSP responder URLs
37
+ */
38
+ function extractOCSPUrls(cert) {
39
+ try {
40
+ const aiaExt = cert.getExtension(id_pe_authorityInfoAccess);
41
+ if (!aiaExt) {
42
+ return [];
43
+ }
44
+ // Get OCSP URLs from the extension
45
+ return aiaExt.ocsp.filter((gn) => gn.type === "url").map((gn) => gn.value);
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ /**
52
+ * Extract CA Issuers URLs from certificate (for fetching issuer cert)
53
+ * @param cert X509Certificate to extract URLs from
54
+ * @returns Array of CA Issuers URLs
55
+ */
56
+ function extractCAIssuersUrls(cert) {
57
+ try {
58
+ const aiaExt = cert.getExtension(id_pe_authorityInfoAccess);
59
+ if (!aiaExt) {
60
+ return [];
61
+ }
62
+ return aiaExt.caIssuers.filter((gn) => gn.type === "url").map((gn) => gn.value);
63
+ }
64
+ catch {
65
+ return [];
66
+ }
67
+ }
68
+ /**
69
+ * Find issuer certificate from certificate chain
70
+ * @param cert Certificate to find issuer for
71
+ * @param chain Array of PEM-formatted certificates
72
+ * @returns Issuer certificate or null if not found
73
+ */
74
+ function findIssuerInChain(cert, chain) {
75
+ const issuerName = cert.issuer;
76
+ for (const pemCert of chain) {
77
+ try {
78
+ const chainCert = new X509Certificate(pemCert);
79
+ // Check if this cert's subject matches our cert's issuer
80
+ if (chainCert.subject === issuerName) {
81
+ return chainCert;
82
+ }
83
+ }
84
+ catch {
85
+ // Skip invalid certificates
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ /**
91
+ * Fetch issuer certificate from AIA extension
92
+ * @param cert Certificate to fetch issuer for
93
+ * @param timeout Timeout in ms
94
+ * @param proxyUrl Optional CORS proxy URL
95
+ * @returns Issuer certificate or null
96
+ */
97
+ async function fetchIssuerFromAIA(cert, timeout = 5000, proxyUrl) {
98
+ const urls = extractCAIssuersUrls(cert);
99
+ for (const url of urls) {
100
+ try {
101
+ const result = await fetchIssuerCertificate(url, timeout, proxyUrl);
102
+ if (result.ok && result.data) {
103
+ // Try to parse as DER first, then PEM
104
+ try {
105
+ return new X509Certificate(result.data);
106
+ }
107
+ catch {
108
+ // Try converting to PEM
109
+ const pem = arrayBufferToPEM(result.data);
110
+ return new X509Certificate(pem);
111
+ }
112
+ }
113
+ }
114
+ catch {
115
+ // Try next URL
116
+ }
117
+ }
118
+ return null;
119
+ }
120
+ /**
121
+ * Build OCSP request for a certificate
122
+ * @param cert Certificate to check
123
+ * @param issuerCert Issuer certificate
124
+ * @returns DER-encoded OCSP request
125
+ */
126
+ async function buildOCSPRequest(cert, issuerCert) {
127
+ // Get issuer name hash (SHA-1 of issuer's DN in DER)
128
+ // Parse the raw certificate to get the proper ASN.1 structures for serialization
129
+ const issuerCertAsn = AsnParser.parse(issuerCert.rawData, Certificate);
130
+ const issuerNameDer = AsnConvert.serialize(issuerCertAsn.tbsCertificate.subject);
131
+ const issuerNameHash = await computeSHA1(issuerNameDer);
132
+ // Get issuer key hash (SHA-1 of issuer's public key BIT STRING value, not the full SPKI)
133
+ const issuerKeyHash = await computeSHA1(issuerCertAsn.tbsCertificate.subjectPublicKeyInfo.subjectPublicKey);
134
+ // Get certificate serial number
135
+ const serialNumber = hexToArrayBuffer(cert.serialNumber);
136
+ // Build CertID
137
+ const certId = new CertID({
138
+ hashAlgorithm: new AlgorithmIdentifier({ algorithm: SHA1_OID }),
139
+ issuerNameHash: new OctetString(issuerNameHash),
140
+ issuerKeyHash: new OctetString(issuerKeyHash),
141
+ serialNumber: serialNumber,
142
+ });
143
+ // Build request
144
+ const request = new Request({ reqCert: certId });
145
+ // Build TBS request
146
+ const tbsRequest = new TBSRequest({
147
+ requestList: [request],
148
+ });
149
+ // Build OCSP request
150
+ const ocspRequest = new OCSPRequest({ tbsRequest });
151
+ return AsnConvert.serialize(ocspRequest);
152
+ }
153
+ /**
154
+ * Parse OCSP response and extract revocation status
155
+ * @param responseData DER-encoded OCSP response
156
+ * @returns Revocation result
157
+ */
158
+ function parseOCSPResponse(responseData) {
159
+ const now = new Date();
160
+ try {
161
+ const response = AsnConvert.parse(responseData, OCSPResponse);
162
+ // Check response status
163
+ switch (response.responseStatus) {
164
+ case OCSPResponseStatus.successful:
165
+ break;
166
+ case OCSPResponseStatus.malformedRequest:
167
+ return {
168
+ isValid: false,
169
+ status: "error",
170
+ method: "ocsp",
171
+ reason: "OCSP responder returned: malformed request",
172
+ checkedAt: now,
173
+ };
174
+ case OCSPResponseStatus.internalError:
175
+ return {
176
+ isValid: false,
177
+ status: "error",
178
+ method: "ocsp",
179
+ reason: "OCSP responder returned: internal error",
180
+ checkedAt: now,
181
+ };
182
+ case OCSPResponseStatus.tryLater:
183
+ return {
184
+ isValid: false,
185
+ status: "unknown",
186
+ method: "ocsp",
187
+ reason: "OCSP responder returned: try later",
188
+ checkedAt: now,
189
+ };
190
+ case OCSPResponseStatus.sigRequired:
191
+ return {
192
+ isValid: false,
193
+ status: "error",
194
+ method: "ocsp",
195
+ reason: "OCSP responder requires signature",
196
+ checkedAt: now,
197
+ };
198
+ case OCSPResponseStatus.unauthorized:
199
+ return {
200
+ isValid: false,
201
+ status: "error",
202
+ method: "ocsp",
203
+ reason: "OCSP responder returned: unauthorized",
204
+ checkedAt: now,
205
+ };
206
+ default:
207
+ return {
208
+ isValid: false,
209
+ status: "error",
210
+ method: "ocsp",
211
+ reason: `OCSP responder returned unknown status: ${response.responseStatus}`,
212
+ checkedAt: now,
213
+ };
214
+ }
215
+ // Parse response bytes
216
+ if (!response.responseBytes) {
217
+ return {
218
+ isValid: false,
219
+ status: "error",
220
+ method: "ocsp",
221
+ reason: "OCSP response has no response bytes",
222
+ checkedAt: now,
223
+ };
224
+ }
225
+ // Parse BasicOCSPResponse
226
+ const basicResponse = AsnConvert.parse(response.responseBytes.response.buffer, BasicOCSPResponse);
227
+ // Get the first single response
228
+ const responses = basicResponse.tbsResponseData.responses;
229
+ if (!responses || responses.length === 0) {
230
+ return {
231
+ isValid: false,
232
+ status: "error",
233
+ method: "ocsp",
234
+ reason: "OCSP response contains no certificate status",
235
+ checkedAt: now,
236
+ };
237
+ }
238
+ const singleResponse = responses[0];
239
+ const certStatus = singleResponse.certStatus;
240
+ // Check certificate status
241
+ if (certStatus.good !== undefined) {
242
+ return {
243
+ isValid: true,
244
+ status: "good",
245
+ method: "ocsp",
246
+ checkedAt: now,
247
+ };
248
+ }
249
+ else if (certStatus.revoked) {
250
+ return {
251
+ isValid: false,
252
+ status: "revoked",
253
+ method: "ocsp",
254
+ reason: certStatus.revoked.revocationReason !== undefined
255
+ ? `Certificate revoked (reason: ${certStatus.revoked.revocationReason})`
256
+ : "Certificate revoked",
257
+ revokedAt: certStatus.revoked.revocationTime,
258
+ checkedAt: now,
259
+ };
260
+ }
261
+ else if (certStatus.unknown !== undefined) {
262
+ return {
263
+ isValid: false,
264
+ status: "unknown",
265
+ method: "ocsp",
266
+ reason: "OCSP responder does not know about this certificate",
267
+ checkedAt: now,
268
+ };
269
+ }
270
+ return {
271
+ isValid: false,
272
+ status: "error",
273
+ method: "ocsp",
274
+ reason: "Unexpected certificate status in OCSP response",
275
+ checkedAt: now,
276
+ };
277
+ }
278
+ catch (error) {
279
+ return {
280
+ isValid: false,
281
+ status: "error",
282
+ method: "ocsp",
283
+ reason: `Failed to parse OCSP response: ${error instanceof Error ? error.message : String(error)}`,
284
+ checkedAt: now,
285
+ };
286
+ }
287
+ }
288
+ /**
289
+ * Check certificate revocation via OCSP
290
+ * @param cert Certificate to check
291
+ * @param issuerCert Issuer certificate (optional, will try to find/fetch)
292
+ * @param options OCSP check options
293
+ * @returns Revocation result
294
+ */
295
+ async function checkOCSP(cert, issuerCert, options = {}) {
296
+ const { timeout = 5000, certificateChain = [], proxyUrl } = options;
297
+ const now = new Date();
298
+ // Get OCSP URLs
299
+ const ocspUrls = extractOCSPUrls(cert);
300
+ if (ocspUrls.length === 0) {
301
+ return {
302
+ isValid: false,
303
+ status: "unknown",
304
+ method: "ocsp",
305
+ reason: "Certificate has no OCSP responder URL",
306
+ checkedAt: now,
307
+ };
308
+ }
309
+ // Try to find issuer certificate
310
+ let issuer = issuerCert;
311
+ if (!issuer) {
312
+ // Try certificate chain first
313
+ issuer = findIssuerInChain(cert, certificateChain);
314
+ }
315
+ if (!issuer) {
316
+ // Try AIA extension
317
+ issuer = await fetchIssuerFromAIA(cert, timeout, proxyUrl);
318
+ }
319
+ if (!issuer) {
320
+ return {
321
+ isValid: false,
322
+ status: "unknown",
323
+ method: "ocsp",
324
+ reason: "Could not find or fetch issuer certificate for OCSP",
325
+ checkedAt: now,
326
+ };
327
+ }
328
+ // Build OCSP request
329
+ let request;
330
+ try {
331
+ request = await buildOCSPRequest(cert, issuer);
332
+ }
333
+ catch (error) {
334
+ return {
335
+ isValid: false,
336
+ status: "error",
337
+ method: "ocsp",
338
+ reason: `Failed to build OCSP request: ${error instanceof Error ? error.message : String(error)}`,
339
+ checkedAt: now,
340
+ };
341
+ }
342
+ // Try each OCSP URL
343
+ for (const url of ocspUrls) {
344
+ try {
345
+ const result = await fetchOCSP(url, request, timeout, proxyUrl);
346
+ if (result.ok && result.data) {
347
+ return parseOCSPResponse(result.data);
348
+ }
349
+ }
350
+ catch {
351
+ // Try next URL
352
+ }
353
+ }
354
+ return {
355
+ isValid: false,
356
+ status: "error",
357
+ method: "ocsp",
358
+ reason: "All OCSP requests failed",
359
+ checkedAt: now,
360
+ };
361
+ }
362
+
363
+ const AUTHORITY_KEY_IDENTIFIER_OID = "2.5.29.35";
364
+ const SUBJECT_KEY_IDENTIFIER_OID = "2.5.29.14";
365
+ async function computeSha256Hex(input) {
366
+ const digest = await crypto.subtle.digest("SHA-256", input);
367
+ return arrayBufferToHex(digest);
368
+ }
369
+ function getAuthorityKeyIdentifierHex(certificate) {
370
+ const authorityKeyIdentifier = certificate.getExtension(AUTHORITY_KEY_IDENTIFIER_OID);
371
+ return normalizeKeyIdentifier(authorityKeyIdentifier?.keyId);
372
+ }
373
+ function getSubjectKeyIdentifierHex(certificate) {
374
+ const subjectKeyIdentifier = certificate.getExtension(SUBJECT_KEY_IDENTIFIER_OID);
375
+ return normalizeKeyIdentifier(subjectKeyIdentifier?.keyId);
376
+ }
377
+ async function extractIssuerIdentityFromCertificate(certificatePem, options = {}) {
378
+ const signerCertificate = new X509Certificate(certificatePem);
379
+ let issuerCertificate = options.certificateChain && options.certificateChain.length > 0
380
+ ? findIssuerInChain(signerCertificate, options.certificateChain)
381
+ : null;
382
+ if (!issuerCertificate && options.fetchOptions) {
383
+ issuerCertificate = await fetchIssuerFromAIA(signerCertificate, options.fetchOptions.timeout, options.fetchOptions.proxyUrl);
384
+ }
385
+ return {
386
+ issuerSubjectDn: normalizeDistinguishedName(signerCertificate.issuer),
387
+ authorityKeyIdentifierHex: getAuthorityKeyIdentifierHex(signerCertificate),
388
+ issuerCertificate: issuerCertificate
389
+ ? {
390
+ subjectDn: normalizeDistinguishedName(issuerCertificate.subject),
391
+ spkiSha256Hex: await computeSha256Hex(issuerCertificate.publicKey.rawData),
392
+ }
393
+ : null,
394
+ };
395
+ }
396
+ async function extractCertificateIdentityFromCertificate(certificatePem) {
397
+ const certificate = new X509Certificate(certificatePem);
398
+ return {
399
+ subjectDn: normalizeDistinguishedName(certificate.subject),
400
+ subjectKeyIdentifierHex: getSubjectKeyIdentifierHex(certificate),
401
+ spkiSha256Hex: await computeSha256Hex(certificate.publicKey.rawData),
402
+ };
403
+ }
404
+
405
+ export { extractCertificateIdentityFromCertificate as a, checkOCSP as c, extractIssuerIdentityFromCertificate as e };
406
+ //# sourceMappingURL=identity-fca881b1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-fca881b1.js","sources":["../src/core/revocation/ocsp.ts","../src/core/trustedlist/identity.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}