edockit 0.2.4 → 0.4.0-dev.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 (69) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +81 -175
  3. package/TRUSTED-LIST.md +308 -0
  4. package/dist/certificate-c46e14a0.js +560 -0
  5. package/dist/certificate-c46e14a0.js.map +1 -0
  6. package/dist/certificate-fc0e06f7.js +571 -0
  7. package/dist/certificate-fc0e06f7.js.map +1 -0
  8. package/dist/core/canonicalization/XMLCanonicalizer.d.ts +9 -3
  9. package/dist/core/rsa-digestinfo-workaround.d.ts +29 -0
  10. package/dist/core/trustedlist/build.d.ts +41 -0
  11. package/dist/core/trustedlist/bundled-provider.d.ts +2 -0
  12. package/dist/core/trustedlist/contract.d.ts +19 -0
  13. package/dist/core/trustedlist/dom.d.ts +12 -0
  14. package/dist/core/trustedlist/extract.d.ts +6 -0
  15. package/dist/core/trustedlist/http.d.ts +8 -0
  16. package/dist/core/trustedlist/identity.d.ts +7 -0
  17. package/dist/core/trustedlist/index.d.ts +18 -0
  18. package/dist/core/trustedlist/loader.d.ts +5 -0
  19. package/dist/core/trustedlist/matcher.d.ts +11 -0
  20. package/dist/core/trustedlist/normalize.d.ts +14 -0
  21. package/dist/core/trustedlist/reference-provider.d.ts +12 -0
  22. package/dist/core/trustedlist/types.d.ts +114 -0
  23. package/dist/core/unzip.d.ts +0 -0
  24. package/dist/core/verification.d.ts +50 -0
  25. package/dist/data/trusted-list.d.ts +3 -0
  26. package/dist/identity-1a3dddc3.js +902 -0
  27. package/dist/identity-1a3dddc3.js.map +1 -0
  28. package/dist/identity-b3a70fc1.js +897 -0
  29. package/dist/identity-b3a70fc1.js.map +1 -0
  30. package/dist/index.cjs.js +1275 -7892
  31. package/dist/index.cjs.js.map +1 -1
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.esm.js +783 -7399
  34. package/dist/index.esm.js.map +1 -1
  35. package/dist/index.umd.js +12 -15
  36. package/dist/index.umd.js.map +1 -1
  37. package/dist/loader-1ac52e12.js +217 -0
  38. package/dist/loader-1ac52e12.js.map +1 -0
  39. package/dist/loader-43d8e17a.js +222 -0
  40. package/dist/loader-43d8e17a.js.map +1 -0
  41. package/dist/normalize-60f2d7e6.js +6270 -0
  42. package/dist/normalize-60f2d7e6.js.map +1 -0
  43. package/dist/normalize-70da6516.js +6214 -0
  44. package/dist/normalize-70da6516.js.map +1 -0
  45. package/dist/reference-provider-1cd85b7b.js +217 -0
  46. package/dist/reference-provider-1cd85b7b.js.map +1 -0
  47. package/dist/reference-provider-53240217.js +211 -0
  48. package/dist/reference-provider-53240217.js.map +1 -0
  49. package/dist/trusted-list-build.cjs.js +575 -0
  50. package/dist/trusted-list-build.cjs.js.map +1 -0
  51. package/dist/trusted-list-build.d.ts +4 -0
  52. package/dist/trusted-list-build.esm.js +564 -0
  53. package/dist/trusted-list-build.esm.js.map +1 -0
  54. package/dist/trusted-list-bundled.cjs.js +30436 -0
  55. package/dist/trusted-list-bundled.cjs.js.map +1 -0
  56. package/dist/trusted-list-bundled.d.ts +1 -0
  57. package/dist/trusted-list-bundled.esm.js +30432 -0
  58. package/dist/trusted-list-bundled.esm.js.map +1 -0
  59. package/dist/trusted-list-http.cjs.js +85 -0
  60. package/dist/trusted-list-http.cjs.js.map +1 -0
  61. package/dist/trusted-list-http.d.ts +1 -0
  62. package/dist/trusted-list-http.esm.js +81 -0
  63. package/dist/trusted-list-http.esm.js.map +1 -0
  64. package/dist/trusted-list.cjs.js +35 -0
  65. package/dist/trusted-list.cjs.js.map +1 -0
  66. package/dist/trusted-list.d.ts +9 -0
  67. package/dist/trusted-list.esm.js +10 -0
  68. package/dist/trusted-list.esm.js.map +1 -0
  69. package/package.json +34 -2
@@ -0,0 +1,217 @@
1
+ /*!
2
+ * MIT License
3
+ * Copyright (c) 2025 Edgars Jēkabsons, ZenomyTech SIA
4
+ */
5
+ import { Z as base64UrlToHex, X as normalizeDistinguishedName, a3 as normalizeHex, a0 as getTrustListPurposeMaskForServiceType, a1 as hexToBase64Url, a2 as isTrustedServiceStatus } from './normalize-70da6516.js';
6
+
7
+ function addToIndex(index, key, service) {
8
+ if (!key) {
9
+ return;
10
+ }
11
+ const normalizedKey = key.trim();
12
+ if (!normalizedKey) {
13
+ return;
14
+ }
15
+ const existing = index.get(normalizedKey);
16
+ if (existing) {
17
+ existing.push(service);
18
+ return;
19
+ }
20
+ index.set(normalizedKey, [service]);
21
+ }
22
+ function buildIndexes(services) {
23
+ const indexes = {
24
+ bySki: new Map(),
25
+ bySpkiSha256: new Map(),
26
+ bySubjectDn: new Map(),
27
+ };
28
+ for (const service of services) {
29
+ addToIndex(indexes.bySki, normalizeHex(service.skiHex), service);
30
+ addToIndex(indexes.bySpkiSha256, normalizeHex(service.spkiSha256Hex), service);
31
+ addToIndex(indexes.bySubjectDn, service.subjectDn, service);
32
+ }
33
+ return indexes;
34
+ }
35
+ function dedupeHistory(history) {
36
+ const deduped = [];
37
+ for (const item of history) {
38
+ const previous = deduped[deduped.length - 1];
39
+ if (previous &&
40
+ previous.status === item.status &&
41
+ previous.from === item.from &&
42
+ previous.to === item.to) {
43
+ continue;
44
+ }
45
+ deduped.push(item);
46
+ }
47
+ return deduped;
48
+ }
49
+ function parseTimestampToUnixSeconds(input) {
50
+ const parsedDate = new Date(input);
51
+ if (Number.isNaN(parsedDate.getTime())) {
52
+ throw new Error(`Invalid trusted-list timestamp "${input}"`);
53
+ }
54
+ return Math.floor(parsedDate.getTime() / 1000);
55
+ }
56
+ function mergeCompactIntervals(intervals) {
57
+ const merged = [];
58
+ for (const [fromUnix, toUnix] of intervals) {
59
+ const previous = merged[merged.length - 1];
60
+ if (!previous) {
61
+ merged.push([fromUnix, toUnix]);
62
+ continue;
63
+ }
64
+ const previousToUnix = previous[1];
65
+ if (previousToUnix === null || fromUnix <= previousToUnix) {
66
+ previous[1] =
67
+ previousToUnix === null || toUnix === null ? null : Math.max(previousToUnix, toUnix);
68
+ continue;
69
+ }
70
+ merged.push([fromUnix, toUnix]);
71
+ }
72
+ return merged;
73
+ }
74
+ function collapseTrustedIntervals(history) {
75
+ const trustedIntervals = history
76
+ .filter((entry) => isTrustedServiceStatus(entry.status))
77
+ .map((entry) => [
78
+ parseTimestampToUnixSeconds(entry.from),
79
+ entry.to ? parseTimestampToUnixSeconds(entry.to) : null,
80
+ ]);
81
+ return mergeCompactIntervals(trustedIntervals);
82
+ }
83
+ function hydrateTrustIntervals(trustIntervals) {
84
+ return trustIntervals.map(([fromUnix, toUnix]) => ({
85
+ fromUnix,
86
+ toUnix,
87
+ }));
88
+ }
89
+ function sortCompactServices(left, right) {
90
+ const leftKey = JSON.stringify(left);
91
+ const rightKey = JSON.stringify(right);
92
+ return leftKey.localeCompare(rightKey);
93
+ }
94
+ function createEmptyTrustedListBundle() {
95
+ return {
96
+ v: 2,
97
+ generatedAt: new Date(0).toISOString(),
98
+ sources: [],
99
+ dns: [],
100
+ services: [],
101
+ };
102
+ }
103
+ function buildTrustedListData(bundle) {
104
+ const services = bundle.services.map((serviceRecord) => {
105
+ const [spkiSha256Base64Url, skiBase64Url, subjectDnIdx, country, purposeMask, trustIntervals] = serviceRecord;
106
+ const subjectDn = bundle.dns[subjectDnIdx];
107
+ if (subjectDn === undefined) {
108
+ throw new Error(`Trusted list bundle contains unknown DN code ${subjectDnIdx}`);
109
+ }
110
+ return {
111
+ skiHex: base64UrlToHex(skiBase64Url),
112
+ spkiSha256Hex: base64UrlToHex(spkiSha256Base64Url),
113
+ subjectDn: normalizeDistinguishedName(subjectDn),
114
+ country,
115
+ purposeMask,
116
+ trustIntervals: hydrateTrustIntervals(trustIntervals),
117
+ };
118
+ });
119
+ return {
120
+ version: bundle.v,
121
+ generatedAt: bundle.generatedAt,
122
+ sources: bundle.sources.map(([id, label, lotlUrl]) => ({
123
+ id,
124
+ label,
125
+ lotlUrl,
126
+ })),
127
+ services,
128
+ indexes: buildIndexes(services),
129
+ };
130
+ }
131
+ function buildCompactTrustedListBundle(services, sources, generatedAt = new Date().toISOString()) {
132
+ const dedupedServices = dedupeTrustedServices(services);
133
+ const distinguishedNameCodebook = new Map();
134
+ const dns = [];
135
+ const compactServiceMap = new Map();
136
+ const getDistinguishedNameCode = (value) => {
137
+ const existing = distinguishedNameCodebook.get(value);
138
+ if (existing !== undefined) {
139
+ return existing;
140
+ }
141
+ const nextIndex = dns.length;
142
+ dns.push(value);
143
+ distinguishedNameCodebook.set(value, nextIndex);
144
+ return nextIndex;
145
+ };
146
+ for (const service of dedupedServices) {
147
+ const purposeMask = getTrustListPurposeMaskForServiceType(service.serviceType);
148
+ if (!purposeMask) {
149
+ continue;
150
+ }
151
+ const subjectDn = normalizeDistinguishedName(service.subjectDn);
152
+ if (!subjectDn) {
153
+ continue;
154
+ }
155
+ const trustIntervals = collapseTrustedIntervals(service.history);
156
+ if (trustIntervals.length === 0) {
157
+ continue;
158
+ }
159
+ const compactServiceKey = JSON.stringify([
160
+ hexToBase64Url(service.spkiSha256Hex),
161
+ hexToBase64Url(service.skiHex),
162
+ subjectDn,
163
+ service.country,
164
+ trustIntervals,
165
+ ]);
166
+ const existingService = compactServiceMap.get(compactServiceKey);
167
+ if (existingService) {
168
+ existingService[4] = (existingService[4] | purposeMask);
169
+ continue;
170
+ }
171
+ compactServiceMap.set(compactServiceKey, [
172
+ hexToBase64Url(service.spkiSha256Hex),
173
+ hexToBase64Url(service.skiHex),
174
+ getDistinguishedNameCode(subjectDn),
175
+ service.country,
176
+ purposeMask,
177
+ trustIntervals,
178
+ ]);
179
+ }
180
+ return {
181
+ v: 2,
182
+ generatedAt,
183
+ sources: sources.map((source) => [source.id, source.label, source.lotlUrl]),
184
+ dns,
185
+ services: Array.from(compactServiceMap.values()).sort(sortCompactServices),
186
+ };
187
+ }
188
+ function dedupeTrustedServices(services) {
189
+ const serviceMap = new Map();
190
+ for (const service of services) {
191
+ const normalizedService = {
192
+ ...service,
193
+ skiHex: normalizeHex(service.skiHex),
194
+ spkiSha256Hex: normalizeHex(service.spkiSha256Hex) || "",
195
+ subjectDn: normalizeDistinguishedName(service.subjectDn),
196
+ history: dedupeHistory([...service.history].sort((left, right) => left.from.localeCompare(right.from))),
197
+ };
198
+ const key = JSON.stringify([
199
+ normalizedService.skiHex,
200
+ normalizedService.spkiSha256Hex,
201
+ normalizedService.subjectDn,
202
+ normalizedService.country,
203
+ normalizedService.tspName,
204
+ normalizedService.serviceType,
205
+ normalizedService.source,
206
+ normalizedService.sourceLabel,
207
+ normalizedService.history,
208
+ ]);
209
+ if (!serviceMap.has(key)) {
210
+ serviceMap.set(key, normalizedService);
211
+ }
212
+ }
213
+ return Array.from(serviceMap.values());
214
+ }
215
+
216
+ export { buildCompactTrustedListBundle as a, buildTrustedListData as b, createEmptyTrustedListBundle as c, dedupeTrustedServices as d };
217
+ //# sourceMappingURL=loader-1ac52e12.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-1ac52e12.js","sources":["../src/core/trustedlist/loader.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,222 @@
1
+ /*!
2
+ * MIT License
3
+ * Copyright (c) 2025 Edgars Jēkabsons, ZenomyTech SIA
4
+ */
5
+ 'use strict';
6
+
7
+ var normalize = require('./normalize-60f2d7e6.js');
8
+
9
+ function addToIndex(index, key, service) {
10
+ if (!key) {
11
+ return;
12
+ }
13
+ const normalizedKey = key.trim();
14
+ if (!normalizedKey) {
15
+ return;
16
+ }
17
+ const existing = index.get(normalizedKey);
18
+ if (existing) {
19
+ existing.push(service);
20
+ return;
21
+ }
22
+ index.set(normalizedKey, [service]);
23
+ }
24
+ function buildIndexes(services) {
25
+ const indexes = {
26
+ bySki: new Map(),
27
+ bySpkiSha256: new Map(),
28
+ bySubjectDn: new Map(),
29
+ };
30
+ for (const service of services) {
31
+ addToIndex(indexes.bySki, normalize.normalizeHex(service.skiHex), service);
32
+ addToIndex(indexes.bySpkiSha256, normalize.normalizeHex(service.spkiSha256Hex), service);
33
+ addToIndex(indexes.bySubjectDn, service.subjectDn, service);
34
+ }
35
+ return indexes;
36
+ }
37
+ function dedupeHistory(history) {
38
+ const deduped = [];
39
+ for (const item of history) {
40
+ const previous = deduped[deduped.length - 1];
41
+ if (previous &&
42
+ previous.status === item.status &&
43
+ previous.from === item.from &&
44
+ previous.to === item.to) {
45
+ continue;
46
+ }
47
+ deduped.push(item);
48
+ }
49
+ return deduped;
50
+ }
51
+ function parseTimestampToUnixSeconds(input) {
52
+ const parsedDate = new Date(input);
53
+ if (Number.isNaN(parsedDate.getTime())) {
54
+ throw new Error(`Invalid trusted-list timestamp "${input}"`);
55
+ }
56
+ return Math.floor(parsedDate.getTime() / 1000);
57
+ }
58
+ function mergeCompactIntervals(intervals) {
59
+ const merged = [];
60
+ for (const [fromUnix, toUnix] of intervals) {
61
+ const previous = merged[merged.length - 1];
62
+ if (!previous) {
63
+ merged.push([fromUnix, toUnix]);
64
+ continue;
65
+ }
66
+ const previousToUnix = previous[1];
67
+ if (previousToUnix === null || fromUnix <= previousToUnix) {
68
+ previous[1] =
69
+ previousToUnix === null || toUnix === null ? null : Math.max(previousToUnix, toUnix);
70
+ continue;
71
+ }
72
+ merged.push([fromUnix, toUnix]);
73
+ }
74
+ return merged;
75
+ }
76
+ function collapseTrustedIntervals(history) {
77
+ const trustedIntervals = history
78
+ .filter((entry) => normalize.isTrustedServiceStatus(entry.status))
79
+ .map((entry) => [
80
+ parseTimestampToUnixSeconds(entry.from),
81
+ entry.to ? parseTimestampToUnixSeconds(entry.to) : null,
82
+ ]);
83
+ return mergeCompactIntervals(trustedIntervals);
84
+ }
85
+ function hydrateTrustIntervals(trustIntervals) {
86
+ return trustIntervals.map(([fromUnix, toUnix]) => ({
87
+ fromUnix,
88
+ toUnix,
89
+ }));
90
+ }
91
+ function sortCompactServices(left, right) {
92
+ const leftKey = JSON.stringify(left);
93
+ const rightKey = JSON.stringify(right);
94
+ return leftKey.localeCompare(rightKey);
95
+ }
96
+ function createEmptyTrustedListBundle() {
97
+ return {
98
+ v: 2,
99
+ generatedAt: new Date(0).toISOString(),
100
+ sources: [],
101
+ dns: [],
102
+ services: [],
103
+ };
104
+ }
105
+ function buildTrustedListData(bundle) {
106
+ const services = bundle.services.map((serviceRecord) => {
107
+ const [spkiSha256Base64Url, skiBase64Url, subjectDnIdx, country, purposeMask, trustIntervals] = serviceRecord;
108
+ const subjectDn = bundle.dns[subjectDnIdx];
109
+ if (subjectDn === undefined) {
110
+ throw new Error(`Trusted list bundle contains unknown DN code ${subjectDnIdx}`);
111
+ }
112
+ return {
113
+ skiHex: normalize.base64UrlToHex(skiBase64Url),
114
+ spkiSha256Hex: normalize.base64UrlToHex(spkiSha256Base64Url),
115
+ subjectDn: normalize.normalizeDistinguishedName(subjectDn),
116
+ country,
117
+ purposeMask,
118
+ trustIntervals: hydrateTrustIntervals(trustIntervals),
119
+ };
120
+ });
121
+ return {
122
+ version: bundle.v,
123
+ generatedAt: bundle.generatedAt,
124
+ sources: bundle.sources.map(([id, label, lotlUrl]) => ({
125
+ id,
126
+ label,
127
+ lotlUrl,
128
+ })),
129
+ services,
130
+ indexes: buildIndexes(services),
131
+ };
132
+ }
133
+ function buildCompactTrustedListBundle(services, sources, generatedAt = new Date().toISOString()) {
134
+ const dedupedServices = dedupeTrustedServices(services);
135
+ const distinguishedNameCodebook = new Map();
136
+ const dns = [];
137
+ const compactServiceMap = new Map();
138
+ const getDistinguishedNameCode = (value) => {
139
+ const existing = distinguishedNameCodebook.get(value);
140
+ if (existing !== undefined) {
141
+ return existing;
142
+ }
143
+ const nextIndex = dns.length;
144
+ dns.push(value);
145
+ distinguishedNameCodebook.set(value, nextIndex);
146
+ return nextIndex;
147
+ };
148
+ for (const service of dedupedServices) {
149
+ const purposeMask = normalize.getTrustListPurposeMaskForServiceType(service.serviceType);
150
+ if (!purposeMask) {
151
+ continue;
152
+ }
153
+ const subjectDn = normalize.normalizeDistinguishedName(service.subjectDn);
154
+ if (!subjectDn) {
155
+ continue;
156
+ }
157
+ const trustIntervals = collapseTrustedIntervals(service.history);
158
+ if (trustIntervals.length === 0) {
159
+ continue;
160
+ }
161
+ const compactServiceKey = JSON.stringify([
162
+ normalize.hexToBase64Url(service.spkiSha256Hex),
163
+ normalize.hexToBase64Url(service.skiHex),
164
+ subjectDn,
165
+ service.country,
166
+ trustIntervals,
167
+ ]);
168
+ const existingService = compactServiceMap.get(compactServiceKey);
169
+ if (existingService) {
170
+ existingService[4] = (existingService[4] | purposeMask);
171
+ continue;
172
+ }
173
+ compactServiceMap.set(compactServiceKey, [
174
+ normalize.hexToBase64Url(service.spkiSha256Hex),
175
+ normalize.hexToBase64Url(service.skiHex),
176
+ getDistinguishedNameCode(subjectDn),
177
+ service.country,
178
+ purposeMask,
179
+ trustIntervals,
180
+ ]);
181
+ }
182
+ return {
183
+ v: 2,
184
+ generatedAt,
185
+ sources: sources.map((source) => [source.id, source.label, source.lotlUrl]),
186
+ dns,
187
+ services: Array.from(compactServiceMap.values()).sort(sortCompactServices),
188
+ };
189
+ }
190
+ function dedupeTrustedServices(services) {
191
+ const serviceMap = new Map();
192
+ for (const service of services) {
193
+ const normalizedService = {
194
+ ...service,
195
+ skiHex: normalize.normalizeHex(service.skiHex),
196
+ spkiSha256Hex: normalize.normalizeHex(service.spkiSha256Hex) || "",
197
+ subjectDn: normalize.normalizeDistinguishedName(service.subjectDn),
198
+ history: dedupeHistory([...service.history].sort((left, right) => left.from.localeCompare(right.from))),
199
+ };
200
+ const key = JSON.stringify([
201
+ normalizedService.skiHex,
202
+ normalizedService.spkiSha256Hex,
203
+ normalizedService.subjectDn,
204
+ normalizedService.country,
205
+ normalizedService.tspName,
206
+ normalizedService.serviceType,
207
+ normalizedService.source,
208
+ normalizedService.sourceLabel,
209
+ normalizedService.history,
210
+ ]);
211
+ if (!serviceMap.has(key)) {
212
+ serviceMap.set(key, normalizedService);
213
+ }
214
+ }
215
+ return Array.from(serviceMap.values());
216
+ }
217
+
218
+ exports.buildCompactTrustedListBundle = buildCompactTrustedListBundle;
219
+ exports.buildTrustedListData = buildTrustedListData;
220
+ exports.createEmptyTrustedListBundle = createEmptyTrustedListBundle;
221
+ exports.dedupeTrustedServices = dedupeTrustedServices;
222
+ //# sourceMappingURL=loader-43d8e17a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-43d8e17a.js","sources":["../src/core/trustedlist/loader.ts"],"sourcesContent":[null],"names":["normalizeHex","isTrustedServiceStatus","base64UrlToHex","normalizeDistinguishedName","getTrustListPurposeMaskForServiceType","hexToBase64Url"],"mappings":"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"}