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.
- package/CHANGELOG.md +17 -0
- package/README.md +81 -198
- package/TRUSTED-LIST.md +308 -0
- package/dist/certificate-3c9dcdac.js +549 -0
- package/dist/certificate-3c9dcdac.js.map +1 -0
- package/dist/certificate-c7123a37.js +581 -0
- package/dist/certificate-c7123a37.js.map +1 -0
- package/dist/core/canonicalization/XMLCanonicalizer.d.ts +9 -3
- package/dist/core/trustedlist/build.d.ts +41 -0
- package/dist/core/trustedlist/bundled-provider.d.ts +2 -0
- package/dist/core/trustedlist/contract.d.ts +19 -0
- package/dist/core/trustedlist/dom.d.ts +12 -0
- package/dist/core/trustedlist/extract.d.ts +6 -0
- package/dist/core/trustedlist/http.d.ts +8 -0
- package/dist/core/trustedlist/identity.d.ts +7 -0
- package/dist/core/trustedlist/index.d.ts +18 -0
- package/dist/core/trustedlist/loader.d.ts +5 -0
- package/dist/core/trustedlist/matcher.d.ts +11 -0
- package/dist/core/trustedlist/normalize.d.ts +14 -0
- package/dist/core/trustedlist/reference-provider.d.ts +12 -0
- package/dist/core/trustedlist/types.d.ts +114 -0
- package/dist/core/unzip.d.ts +0 -0
- package/dist/core/verification.d.ts +22 -0
- package/dist/data/trusted-list.d.ts +3 -0
- package/dist/identity-c9e5052e.js +410 -0
- package/dist/identity-c9e5052e.js.map +1 -0
- package/dist/identity-fca881b1.js +406 -0
- package/dist/identity-fca881b1.js.map +1 -0
- package/dist/index.cjs.js +540 -8838
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.esm.js +498 -8795
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +23 -17
- package/dist/index.umd.js.map +1 -1
- package/dist/loader-7a0f771f.js +222 -0
- package/dist/loader-7a0f771f.js.map +1 -0
- package/dist/loader-ad1a5051.js +217 -0
- package/dist/loader-ad1a5051.js.map +1 -0
- package/dist/normalize-50862581.js +456 -0
- package/dist/normalize-50862581.js.map +1 -0
- package/dist/normalize-9626be7c.js +479 -0
- package/dist/normalize-9626be7c.js.map +1 -0
- package/dist/reference-provider-3838ebfb.js +217 -0
- package/dist/reference-provider-3838ebfb.js.map +1 -0
- package/dist/reference-provider-9bbbaab8.js +211 -0
- package/dist/reference-provider-9bbbaab8.js.map +1 -0
- package/dist/trusted-list-build.cjs.js +580 -0
- package/dist/trusted-list-build.cjs.js.map +1 -0
- package/dist/trusted-list-build.d.ts +4 -0
- package/dist/trusted-list-build.esm.js +569 -0
- package/dist/trusted-list-build.esm.js.map +1 -0
- package/dist/trusted-list-bundled.cjs.js +30439 -0
- package/dist/trusted-list-bundled.cjs.js.map +1 -0
- package/dist/trusted-list-bundled.d.ts +1 -0
- package/dist/trusted-list-bundled.esm.js +30435 -0
- package/dist/trusted-list-bundled.esm.js.map +1 -0
- package/dist/trusted-list-http.cjs.js +85 -0
- package/dist/trusted-list-http.cjs.js.map +1 -0
- package/dist/trusted-list-http.d.ts +1 -0
- package/dist/trusted-list-http.esm.js +81 -0
- package/dist/trusted-list-http.esm.js.map +1 -0
- package/dist/trusted-list.cjs.js +38 -0
- package/dist/trusted-list.cjs.js.map +1 -0
- package/dist/trusted-list.d.ts +9 -0
- package/dist/trusted-list.esm.js +13 -0
- package/dist/trusted-list.esm.js.map +1 -0
- package/package.json +32 -2
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* MIT License
|
|
3
|
+
* Copyright (c) 2025 Edgars Jēkabsons, ZenomyTech SIA
|
|
4
|
+
*/
|
|
5
|
+
import { r as isLikelyXmlTslUrl, s as getRelevantServiceType, u as getServiceStatusSuffix, n as normalizeDistinguishedName, j as normalizeKeyIdentifier, d as arrayBufferToHex, v as fetchBinary } from './normalize-50862581.js';
|
|
6
|
+
import { X509Certificate } from '@peculiar/x509';
|
|
7
|
+
import { c as createXMLParser, d as formatPEM } from './certificate-3c9dcdac.js';
|
|
8
|
+
import { c as createEmptyTrustedListBundle, a as buildCompactTrustedListBundle, d as dedupeTrustedServices, b as buildTrustedListData } from './loader-ad1a5051.js';
|
|
9
|
+
import '@peculiar/asn1-schema';
|
|
10
|
+
import '@peculiar/asn1-ocsp';
|
|
11
|
+
import '@peculiar/asn1-x509';
|
|
12
|
+
import { createHash } from 'node:crypto';
|
|
13
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
14
|
+
import { dirname } from 'node:path';
|
|
15
|
+
import '@xmldom/xmldom';
|
|
16
|
+
import 'xpath';
|
|
17
|
+
|
|
18
|
+
function isElement(node) {
|
|
19
|
+
return Boolean(node && node.nodeType === 1);
|
|
20
|
+
}
|
|
21
|
+
function localNameMatches(node, expectedLocalName) {
|
|
22
|
+
if (!isElement(node)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return (node.localName === expectedLocalName ||
|
|
26
|
+
node.nodeName === expectedLocalName ||
|
|
27
|
+
node.nodeName.endsWith(`:${expectedLocalName}`));
|
|
28
|
+
}
|
|
29
|
+
function getChildNodes(parent) {
|
|
30
|
+
const childNodes = "documentElement" in parent && parent.documentElement
|
|
31
|
+
? parent.documentElement.childNodes
|
|
32
|
+
: parent.childNodes;
|
|
33
|
+
const nodes = [];
|
|
34
|
+
for (let index = 0; index < childNodes.length; index += 1) {
|
|
35
|
+
nodes.push(childNodes[index]);
|
|
36
|
+
}
|
|
37
|
+
return nodes;
|
|
38
|
+
}
|
|
39
|
+
function walkDescendants(parent, callback) {
|
|
40
|
+
const visit = (node) => {
|
|
41
|
+
if (isElement(node)) {
|
|
42
|
+
if (callback(node)) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (!node.childNodes) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
for (let index = 0; index < node.childNodes.length; index += 1) {
|
|
50
|
+
if (visit(node.childNodes[index])) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
};
|
|
56
|
+
const startingNodes = "documentElement" in parent && parent.documentElement
|
|
57
|
+
? [parent.documentElement]
|
|
58
|
+
: getChildNodes(parent);
|
|
59
|
+
for (const node of startingNodes) {
|
|
60
|
+
if (visit(node)) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function parseXmlDocument(xml) {
|
|
66
|
+
return createXMLParser().parseFromString(xml, "application/xml");
|
|
67
|
+
}
|
|
68
|
+
function getDocumentElement(document) {
|
|
69
|
+
return document.documentElement || null;
|
|
70
|
+
}
|
|
71
|
+
function getChildElement(parent, localName) {
|
|
72
|
+
if (!parent) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
for (const childNode of getChildNodes(parent)) {
|
|
76
|
+
if (localNameMatches(childNode, localName)) {
|
|
77
|
+
return childNode;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
function getChildElements(parent, localName) {
|
|
83
|
+
if (!parent) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
return getChildNodes(parent).filter((childNode) => localNameMatches(childNode, localName));
|
|
87
|
+
}
|
|
88
|
+
function getDescendantElement(parent, localName) {
|
|
89
|
+
if (!parent) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
let foundElement = null;
|
|
93
|
+
walkDescendants(parent, (element) => {
|
|
94
|
+
if (!foundElement && localNameMatches(element, localName)) {
|
|
95
|
+
foundElement = element;
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
});
|
|
100
|
+
return foundElement;
|
|
101
|
+
}
|
|
102
|
+
function getElementText(element) {
|
|
103
|
+
const textContent = element?.textContent?.trim();
|
|
104
|
+
return textContent || undefined;
|
|
105
|
+
}
|
|
106
|
+
function getChildText(parent, localName) {
|
|
107
|
+
return getElementText(getChildElement(parent, localName));
|
|
108
|
+
}
|
|
109
|
+
function getDescendantText(parent, localName) {
|
|
110
|
+
return getElementText(getDescendantElement(parent, localName));
|
|
111
|
+
}
|
|
112
|
+
function getLanguageAttribute(element) {
|
|
113
|
+
const language = element.getAttribute("xml:lang") ||
|
|
114
|
+
element.getAttribute("lang") ||
|
|
115
|
+
element.getAttributeNS("http://www.w3.org/XML/1998/namespace", "lang");
|
|
116
|
+
return language?.trim() || undefined;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const SUBJECT_KEY_IDENTIFIER_OID = "2.5.29.14";
|
|
120
|
+
function getPreferredName(parent) {
|
|
121
|
+
if (!parent) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const names = getChildElements(parent, "Name");
|
|
125
|
+
if (names.length === 0) {
|
|
126
|
+
return parent.textContent?.trim() || undefined;
|
|
127
|
+
}
|
|
128
|
+
const englishName = names.find((name) => getLanguageAttribute(name)?.toLowerCase().startsWith("en"));
|
|
129
|
+
return (englishName?.textContent?.trim() ||
|
|
130
|
+
names.find((name) => name.textContent?.trim())?.textContent?.trim() ||
|
|
131
|
+
undefined);
|
|
132
|
+
}
|
|
133
|
+
async function computeSha256Hex(input) {
|
|
134
|
+
const digest = await crypto.subtle.digest("SHA-256", input);
|
|
135
|
+
return arrayBufferToHex(digest);
|
|
136
|
+
}
|
|
137
|
+
async function parseDigitalIdentity(digitalIdentityElement, context) {
|
|
138
|
+
const certificateValue = getDescendantText(digitalIdentityElement, "X509Certificate");
|
|
139
|
+
const subjectDnFromTsl = normalizeDistinguishedName(getDescendantText(digitalIdentityElement, "X509SubjectName") || null);
|
|
140
|
+
const skiFromTsl = normalizeKeyIdentifier(getDescendantText(digitalIdentityElement, "X509SKI") || null);
|
|
141
|
+
let subjectDnFromCertificate = "";
|
|
142
|
+
let skiFromCertificate = null;
|
|
143
|
+
let spkiSha256Hex = "";
|
|
144
|
+
if (certificateValue) {
|
|
145
|
+
try {
|
|
146
|
+
const certificate = new X509Certificate(formatPEM(certificateValue.replace(/\s+/g, "")));
|
|
147
|
+
const skiExtension = certificate.getExtension(SUBJECT_KEY_IDENTIFIER_OID);
|
|
148
|
+
subjectDnFromCertificate = normalizeDistinguishedName(certificate.subject);
|
|
149
|
+
skiFromCertificate = normalizeKeyIdentifier(skiExtension?.keyId);
|
|
150
|
+
spkiSha256Hex = await computeSha256Hex(certificate.publicKey.rawData);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Some live TSL history entries only expose subject name/SKI and may carry invalid or absent certs.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const subjectDn = subjectDnFromCertificate || subjectDnFromTsl;
|
|
157
|
+
const skiHex = skiFromCertificate || skiFromTsl;
|
|
158
|
+
if (!subjectDn && !skiHex && !spkiSha256Hex) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
subjectDn,
|
|
163
|
+
skiHex,
|
|
164
|
+
spkiSha256Hex,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function buildSnapshotsFromDigitalIdentities(identities, context) {
|
|
168
|
+
const identitiesWithSubject = identities.filter((identity) => identity.subjectDn);
|
|
169
|
+
if (identitiesWithSubject.length === 0) {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
const identitiesWithoutSubject = identities.filter((identity) => !identity.subjectDn && (identity.skiHex || identity.spkiSha256Hex));
|
|
173
|
+
const attachAnonymousIdentityEvidence = identitiesWithSubject.length === 1 && identitiesWithoutSubject.length > 0;
|
|
174
|
+
return identitiesWithSubject.map((identity, index) => {
|
|
175
|
+
const mergedIdentity = attachAnonymousIdentityEvidence && index === 0
|
|
176
|
+
? identitiesWithoutSubject.reduce((current, anonymousIdentity) => ({
|
|
177
|
+
...current,
|
|
178
|
+
skiHex: current.skiHex || anonymousIdentity.skiHex,
|
|
179
|
+
spkiSha256Hex: current.spkiSha256Hex || anonymousIdentity.spkiSha256Hex,
|
|
180
|
+
}), identity)
|
|
181
|
+
: identity;
|
|
182
|
+
return {
|
|
183
|
+
skiHex: mergedIdentity.skiHex,
|
|
184
|
+
spkiSha256Hex: mergedIdentity.spkiSha256Hex,
|
|
185
|
+
subjectDn: mergedIdentity.subjectDn,
|
|
186
|
+
country: context.country,
|
|
187
|
+
tspName: context.tspName,
|
|
188
|
+
serviceType: context.serviceType,
|
|
189
|
+
source: context.source.id,
|
|
190
|
+
sourceLabel: context.source.label,
|
|
191
|
+
status: context.status,
|
|
192
|
+
startTime: context.startTime,
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function mergeSnapshotIntoGroup(group, snapshot) {
|
|
197
|
+
return {
|
|
198
|
+
...group,
|
|
199
|
+
skiHex: group.skiHex || snapshot.skiHex,
|
|
200
|
+
spkiSha256Hex: group.spkiSha256Hex || snapshot.spkiSha256Hex,
|
|
201
|
+
snapshots: [...group.snapshots, snapshot],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function mergeSnapshotGroups(targetGroup, sourceGroup) {
|
|
205
|
+
return {
|
|
206
|
+
...targetGroup,
|
|
207
|
+
skiHex: targetGroup.skiHex || sourceGroup.skiHex,
|
|
208
|
+
spkiSha256Hex: targetGroup.spkiSha256Hex || sourceGroup.spkiSha256Hex,
|
|
209
|
+
snapshots: [...targetGroup.snapshots, ...sourceGroup.snapshots],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function buildTrustedServicesFromSnapshots(snapshots) {
|
|
213
|
+
const snapshotsByContext = new Map();
|
|
214
|
+
for (const snapshot of snapshots) {
|
|
215
|
+
const key = JSON.stringify([
|
|
216
|
+
snapshot.country,
|
|
217
|
+
snapshot.tspName,
|
|
218
|
+
snapshot.serviceType,
|
|
219
|
+
snapshot.source,
|
|
220
|
+
snapshot.sourceLabel,
|
|
221
|
+
snapshot.subjectDn,
|
|
222
|
+
]);
|
|
223
|
+
const existingSnapshots = snapshotsByContext.get(key);
|
|
224
|
+
if (existingSnapshots) {
|
|
225
|
+
existingSnapshots.push(snapshot);
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
snapshotsByContext.set(key, [snapshot]);
|
|
229
|
+
}
|
|
230
|
+
const services = [];
|
|
231
|
+
for (const contextSnapshots of snapshotsByContext.values()) {
|
|
232
|
+
const groups = [];
|
|
233
|
+
for (const snapshot of contextSnapshots) {
|
|
234
|
+
const matchingGroupIndexes = groups
|
|
235
|
+
.map((group, index) => ({ group, index }))
|
|
236
|
+
.filter(({ group }) => {
|
|
237
|
+
if (snapshot.skiHex && group.skiHex === snapshot.skiHex) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
if (snapshot.spkiSha256Hex && group.spkiSha256Hex === snapshot.spkiSha256Hex) {
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
return false;
|
|
244
|
+
})
|
|
245
|
+
.map(({ index }) => index);
|
|
246
|
+
if (matchingGroupIndexes.length === 0) {
|
|
247
|
+
const shouldAttachBySubjectOnly = !snapshot.skiHex && !snapshot.spkiSha256Hex && groups.length === 1;
|
|
248
|
+
if (shouldAttachBySubjectOnly) {
|
|
249
|
+
groups[0] = mergeSnapshotIntoGroup(groups[0], snapshot);
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
groups.push({
|
|
253
|
+
country: snapshot.country,
|
|
254
|
+
tspName: snapshot.tspName,
|
|
255
|
+
serviceType: snapshot.serviceType,
|
|
256
|
+
source: snapshot.source,
|
|
257
|
+
sourceLabel: snapshot.sourceLabel,
|
|
258
|
+
subjectDn: snapshot.subjectDn,
|
|
259
|
+
skiHex: snapshot.skiHex,
|
|
260
|
+
spkiSha256Hex: snapshot.spkiSha256Hex,
|
|
261
|
+
snapshots: [snapshot],
|
|
262
|
+
});
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
const [firstGroupIndex, ...otherGroupIndexes] = matchingGroupIndexes;
|
|
266
|
+
const primaryGroup = groups[firstGroupIndex];
|
|
267
|
+
let mergedGroup = mergeSnapshotIntoGroup(primaryGroup, snapshot);
|
|
268
|
+
for (const otherGroupIndex of otherGroupIndexes.sort((left, right) => right - left)) {
|
|
269
|
+
mergedGroup = mergeSnapshotGroups(mergedGroup, groups[otherGroupIndex]);
|
|
270
|
+
groups.splice(otherGroupIndex, 1);
|
|
271
|
+
}
|
|
272
|
+
const normalizedFirstIndex = groups.findIndex((group) => group === primaryGroup);
|
|
273
|
+
groups[normalizedFirstIndex >= 0 ? normalizedFirstIndex : 0] = mergedGroup;
|
|
274
|
+
}
|
|
275
|
+
services.push(...groups.map((group) => {
|
|
276
|
+
const sortedSnapshots = [...group.snapshots].sort((left, right) => left.startTime.localeCompare(right.startTime));
|
|
277
|
+
return {
|
|
278
|
+
skiHex: group.skiHex,
|
|
279
|
+
spkiSha256Hex: group.spkiSha256Hex,
|
|
280
|
+
subjectDn: group.subjectDn,
|
|
281
|
+
country: group.country,
|
|
282
|
+
tspName: group.tspName,
|
|
283
|
+
serviceType: group.serviceType,
|
|
284
|
+
source: group.source,
|
|
285
|
+
sourceLabel: group.sourceLabel,
|
|
286
|
+
history: sortedSnapshots.map((snapshot, index) => ({
|
|
287
|
+
status: snapshot.status,
|
|
288
|
+
from: snapshot.startTime,
|
|
289
|
+
to: sortedSnapshots[index + 1]?.startTime || null,
|
|
290
|
+
})),
|
|
291
|
+
};
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
294
|
+
return services;
|
|
295
|
+
}
|
|
296
|
+
async function extractServiceSnapshots(serviceElement, context) {
|
|
297
|
+
const snapshotContainers = [];
|
|
298
|
+
const currentServiceInfo = getChildElement(serviceElement, "ServiceInformation");
|
|
299
|
+
if (currentServiceInfo) {
|
|
300
|
+
snapshotContainers.push(currentServiceInfo);
|
|
301
|
+
}
|
|
302
|
+
const serviceHistory = getChildElement(serviceElement, "ServiceHistory");
|
|
303
|
+
snapshotContainers.push(...getChildElements(serviceHistory, "ServiceHistoryInstance"));
|
|
304
|
+
const snapshots = [];
|
|
305
|
+
for (const container of snapshotContainers) {
|
|
306
|
+
const serviceType = getRelevantServiceType(getChildText(container, "ServiceTypeIdentifier"));
|
|
307
|
+
if (!serviceType) {
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
const status = getServiceStatusSuffix(getChildText(container, "ServiceStatus"));
|
|
311
|
+
const startTime = getChildText(container, "StatusStartingTime");
|
|
312
|
+
if (!status || !startTime) {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
const serviceDigitalIdentity = getChildElement(container, "ServiceDigitalIdentity");
|
|
316
|
+
const digitalIdentities = getChildElements(serviceDigitalIdentity, "DigitalId");
|
|
317
|
+
const digitalIdentitySnapshots = (await Promise.all(digitalIdentities.map((digitalIdentity) => parseDigitalIdentity(digitalIdentity, {
|
|
318
|
+
country: context.country,
|
|
319
|
+
source: context.source,
|
|
320
|
+
serviceType,
|
|
321
|
+
tspName: context.tspName,
|
|
322
|
+
status,
|
|
323
|
+
startTime,
|
|
324
|
+
})))).filter((snapshot) => Boolean(snapshot));
|
|
325
|
+
snapshots.push(...buildSnapshotsFromDigitalIdentities(digitalIdentitySnapshots, {
|
|
326
|
+
country: context.country,
|
|
327
|
+
source: context.source,
|
|
328
|
+
serviceType,
|
|
329
|
+
tspName: context.tspName,
|
|
330
|
+
status,
|
|
331
|
+
startTime,
|
|
332
|
+
}));
|
|
333
|
+
}
|
|
334
|
+
return snapshots;
|
|
335
|
+
}
|
|
336
|
+
function parseLotlPointers(xml, source) {
|
|
337
|
+
const document = parseXmlDocument(xml);
|
|
338
|
+
const rootElement = getDocumentElement(document);
|
|
339
|
+
const schemeInformation = getChildElement(rootElement, "SchemeInformation");
|
|
340
|
+
const pointersToOtherTsl = getChildElement(schemeInformation || rootElement, "PointersToOtherTSL");
|
|
341
|
+
const pointers = getChildElements(pointersToOtherTsl, "OtherTSLPointer");
|
|
342
|
+
const dedupedPointers = new Map();
|
|
343
|
+
for (const pointer of pointers) {
|
|
344
|
+
const url = getChildText(pointer, "TSLLocation");
|
|
345
|
+
if (!url || !isLikelyXmlTslUrl(url)) {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
const territory = getDescendantText(pointer, "SchemeTerritory");
|
|
349
|
+
const dedupeKey = `${source.id}|${url}`;
|
|
350
|
+
if (!dedupedPointers.has(dedupeKey)) {
|
|
351
|
+
dedupedPointers.set(dedupeKey, {
|
|
352
|
+
url,
|
|
353
|
+
territory,
|
|
354
|
+
source,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return Array.from(dedupedPointers.values());
|
|
359
|
+
}
|
|
360
|
+
async function parseTrustedList(xml, context) {
|
|
361
|
+
const document = parseXmlDocument(xml);
|
|
362
|
+
const rootElement = getDocumentElement(document);
|
|
363
|
+
const schemeInformation = getChildElement(rootElement, "SchemeInformation");
|
|
364
|
+
const country = getChildText(schemeInformation, "SchemeTerritory") || context.territoryHint || "";
|
|
365
|
+
const providerList = getChildElement(rootElement, "TrustServiceProviderList");
|
|
366
|
+
const providers = getChildElements(providerList, "TrustServiceProvider");
|
|
367
|
+
const services = [];
|
|
368
|
+
for (const provider of providers) {
|
|
369
|
+
const tspInformation = getChildElement(provider, "TSPInformation");
|
|
370
|
+
const tspName = getPreferredName(getChildElement(tspInformation, "TSPName")) ||
|
|
371
|
+
getPreferredName(getChildElement(tspInformation, "TSPTradeName")) ||
|
|
372
|
+
country ||
|
|
373
|
+
"Unknown TSP";
|
|
374
|
+
const tspServices = getChildElements(getChildElement(provider, "TSPServices"), "TSPService");
|
|
375
|
+
for (const serviceElement of tspServices) {
|
|
376
|
+
const snapshots = await extractServiceSnapshots(serviceElement, {
|
|
377
|
+
country,
|
|
378
|
+
source: context.source,
|
|
379
|
+
tspName,
|
|
380
|
+
});
|
|
381
|
+
if (snapshots.length === 0) {
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
services.push(...buildTrustedServicesFromSnapshots(snapshots));
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return services;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const DEFAULT_TRUSTED_LIST_SOURCES = [
|
|
391
|
+
{
|
|
392
|
+
id: "eu",
|
|
393
|
+
label: "EU LOTL",
|
|
394
|
+
lotlUrl: "https://ec.europa.eu/tools/lotl/eu-lotl.xml",
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
id: "ades",
|
|
398
|
+
label: "AdES LOTL",
|
|
399
|
+
lotlUrl: "https://ec.europa.eu/tools/lotl/mra/ades-lotl.xml",
|
|
400
|
+
},
|
|
401
|
+
];
|
|
402
|
+
async function fetchXml(url, options = {}) {
|
|
403
|
+
const result = await fetchBinary(url, {
|
|
404
|
+
timeout: options.timeout ?? 10000,
|
|
405
|
+
accept: "application/xml, text/xml;q=0.9, */*;q=0.8",
|
|
406
|
+
proxyUrl: options.proxyUrl,
|
|
407
|
+
});
|
|
408
|
+
if (!result.ok || !result.data) {
|
|
409
|
+
throw new Error(`Failed to fetch "${url}": ${result.error || `HTTP ${result.status}`}`);
|
|
410
|
+
}
|
|
411
|
+
return new TextDecoder().decode(result.data);
|
|
412
|
+
}
|
|
413
|
+
async function fetchXmlWithWarnings(url, options = {}) {
|
|
414
|
+
try {
|
|
415
|
+
return await fetchXml(url, options);
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
// The Node-only builder intentionally skips broken endpoints, including
|
|
419
|
+
// TLS-chain failures such as UNABLE_TO_VERIFY_LEAF_SIGNATURE, rather than
|
|
420
|
+
// attempting local intermediate repair in the generic fetch path.
|
|
421
|
+
console.warn(`Trusted-list fetch warning for "${url}": ${error instanceof Error ? error.message : String(error)}`);
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
function isProbablyXmlDocument(xml) {
|
|
426
|
+
const trimmed = xml.trimStart();
|
|
427
|
+
return trimmed.startsWith("<");
|
|
428
|
+
}
|
|
429
|
+
async function parseTrustedListWithWarnings(xml, context) {
|
|
430
|
+
if (!isProbablyXmlDocument(xml)) {
|
|
431
|
+
console.warn(`Trusted-list parse warning for "${context.url}": response does not look like XML`);
|
|
432
|
+
return [];
|
|
433
|
+
}
|
|
434
|
+
try {
|
|
435
|
+
return await parseTrustedList(xml, {
|
|
436
|
+
source: context.source,
|
|
437
|
+
territoryHint: context.territoryHint,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
console.warn(`Trusted-list parse warning for "${context.url}": ${error instanceof Error ? error.message : String(error)}`);
|
|
442
|
+
return [];
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Low-level live fetch helper for LOTL/TSL processing.
|
|
447
|
+
*
|
|
448
|
+
* Primarily intended for Node.js build/update tooling. Browser callers generally
|
|
449
|
+
* need a proxy and should prefer the higher-level trusted-list update flow.
|
|
450
|
+
*/
|
|
451
|
+
async function fetchTrustedListBundle(sources = DEFAULT_TRUSTED_LIST_SOURCES, fetchOptions = {}) {
|
|
452
|
+
if (sources.length === 0) {
|
|
453
|
+
return createEmptyTrustedListBundle();
|
|
454
|
+
}
|
|
455
|
+
const lotlDocuments = await Promise.all(sources.map(async (source) => ({
|
|
456
|
+
source,
|
|
457
|
+
xml: await fetchXmlWithWarnings(source.lotlUrl, fetchOptions),
|
|
458
|
+
})));
|
|
459
|
+
const availableLotlDocuments = lotlDocuments.filter((document) => Boolean(document.xml));
|
|
460
|
+
if (availableLotlDocuments.length === 0) {
|
|
461
|
+
throw new Error("Failed to fetch any configured LOTL source");
|
|
462
|
+
}
|
|
463
|
+
const pointers = availableLotlDocuments.flatMap(({ source, xml }) => parseLotlPointers(xml, source));
|
|
464
|
+
const tslDocuments = await Promise.all(pointers.map(async (pointer) => ({
|
|
465
|
+
pointer,
|
|
466
|
+
xml: await fetchXmlWithWarnings(pointer.url, fetchOptions),
|
|
467
|
+
})));
|
|
468
|
+
const availableTslDocuments = tslDocuments.filter((document) => Boolean(document.xml));
|
|
469
|
+
const extractedServices = (await Promise.all(availableTslDocuments.map(({ pointer, xml }) => parseTrustedListWithWarnings(xml, {
|
|
470
|
+
source: pointer.source,
|
|
471
|
+
territoryHint: pointer.territory,
|
|
472
|
+
url: pointer.url,
|
|
473
|
+
})))).flat();
|
|
474
|
+
if (extractedServices.length === 0) {
|
|
475
|
+
throw new Error("Trusted-list update fetched LOTL data but extracted no trusted services");
|
|
476
|
+
}
|
|
477
|
+
return buildCompactTrustedListBundle(dedupeTrustedServices(extractedServices), sources, new Date().toISOString());
|
|
478
|
+
}
|
|
479
|
+
async function updateTrustedList(sources = DEFAULT_TRUSTED_LIST_SOURCES, fetchOptions = {}) {
|
|
480
|
+
const bundle = await fetchTrustedListBundle(sources, fetchOptions);
|
|
481
|
+
return buildTrustedListData(bundle);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
const DEFAULT_TRUSTED_LIST_BASE_URL = "/trusted-list";
|
|
485
|
+
function normalizeBaseUrl(baseUrl) {
|
|
486
|
+
const trimmedBaseUrl = baseUrl.trim() || DEFAULT_TRUSTED_LIST_BASE_URL;
|
|
487
|
+
const isAbsoluteUrl = /^(?:[a-z][a-z\d+\-.]*:)?\/\//i.test(trimmedBaseUrl);
|
|
488
|
+
const withLeadingSlash = trimmedBaseUrl.startsWith("/") || isAbsoluteUrl ? trimmedBaseUrl : `/${trimmedBaseUrl}`;
|
|
489
|
+
return withLeadingSlash.replace(/\/+$/g, "");
|
|
490
|
+
}
|
|
491
|
+
function formatTrustedListBundleId(generatedAt) {
|
|
492
|
+
const parsedDate = new Date(generatedAt);
|
|
493
|
+
if (Number.isNaN(parsedDate.getTime())) {
|
|
494
|
+
throw new Error(`Invalid trusted-list generatedAt timestamp "${generatedAt}"`);
|
|
495
|
+
}
|
|
496
|
+
return parsedDate
|
|
497
|
+
.toISOString()
|
|
498
|
+
.replace(/\.\d{3}Z$/, "Z")
|
|
499
|
+
.replace(/:/g, "-");
|
|
500
|
+
}
|
|
501
|
+
function renderTrustedListJson(bundle, options = {}) {
|
|
502
|
+
return `${JSON.stringify(bundle, null, options.pretty ? 2 : undefined)}\n`;
|
|
503
|
+
}
|
|
504
|
+
function buildTrustedListManifest(bundle, options = {}) {
|
|
505
|
+
const bundleId = formatTrustedListBundleId(bundle.generatedAt);
|
|
506
|
+
const bundleJson = renderTrustedListJson(bundle, {
|
|
507
|
+
pretty: options.pretty,
|
|
508
|
+
});
|
|
509
|
+
const bundleRelativePath = `bundles/${bundleId}.json`;
|
|
510
|
+
const baseUrl = normalizeBaseUrl(options.baseUrl || DEFAULT_TRUSTED_LIST_BASE_URL);
|
|
511
|
+
const manifest = {
|
|
512
|
+
schemaVersion: 1,
|
|
513
|
+
bundleId,
|
|
514
|
+
generatedAt: bundle.generatedAt,
|
|
515
|
+
url: `${baseUrl}/${bundleRelativePath}`,
|
|
516
|
+
sha256: createHash("sha256").update(bundleJson).digest("hex"),
|
|
517
|
+
};
|
|
518
|
+
return {
|
|
519
|
+
bundleId,
|
|
520
|
+
bundleJson,
|
|
521
|
+
bundleRelativePath,
|
|
522
|
+
manifest,
|
|
523
|
+
manifestJson: `${JSON.stringify(manifest, null, 2)}\n`,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
async function writeTrustedListBundle(options) {
|
|
527
|
+
const bundleJson = renderTrustedListJson(options.bundle, {
|
|
528
|
+
pretty: options.pretty,
|
|
529
|
+
});
|
|
530
|
+
const bundleId = formatTrustedListBundleId(options.bundle.generatedAt);
|
|
531
|
+
await mkdir(dirname(options.outputPath), { recursive: true });
|
|
532
|
+
await writeFile(options.outputPath, bundleJson, "utf8");
|
|
533
|
+
let manifest;
|
|
534
|
+
if (options.manifestOutputPath) {
|
|
535
|
+
const builtManifest = buildTrustedListManifest(options.bundle, {
|
|
536
|
+
baseUrl: options.baseUrl,
|
|
537
|
+
pretty: options.pretty,
|
|
538
|
+
});
|
|
539
|
+
manifest = builtManifest.manifest;
|
|
540
|
+
await mkdir(dirname(options.manifestOutputPath), { recursive: true });
|
|
541
|
+
await writeFile(options.manifestOutputPath, builtManifest.manifestJson, "utf8");
|
|
542
|
+
}
|
|
543
|
+
return {
|
|
544
|
+
bundle: options.bundle,
|
|
545
|
+
bundleId,
|
|
546
|
+
outputPath: options.outputPath,
|
|
547
|
+
bytesWritten: Buffer.byteLength(bundleJson, "utf8"),
|
|
548
|
+
...(manifest
|
|
549
|
+
? {
|
|
550
|
+
manifest,
|
|
551
|
+
manifestOutputPath: options.manifestOutputPath,
|
|
552
|
+
}
|
|
553
|
+
: {}),
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
async function generateTrustedListBundle(options) {
|
|
557
|
+
const { sources, timeout, proxyUrl, ...writeOptions } = options;
|
|
558
|
+
const bundle = await fetchTrustedListBundle(sources || DEFAULT_TRUSTED_LIST_SOURCES, {
|
|
559
|
+
timeout,
|
|
560
|
+
proxyUrl,
|
|
561
|
+
});
|
|
562
|
+
return writeTrustedListBundle({
|
|
563
|
+
...writeOptions,
|
|
564
|
+
bundle,
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export { DEFAULT_TRUSTED_LIST_SOURCES, buildTrustedListManifest, fetchTrustedListBundle, formatTrustedListBundleId, generateTrustedListBundle, renderTrustedListJson, updateTrustedList, writeTrustedListBundle };
|
|
569
|
+
//# sourceMappingURL=trusted-list-build.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-list-build.esm.js","sources":["../src/core/trustedlist/dom.ts","../src/core/trustedlist/extract.ts","../src/core/trustedlist/index.ts","../src/core/trustedlist/build.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
|