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