ubid-common 0.1.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 (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/dist/ParsingEngine.d.ts +3 -0
  4. package/dist/ParsingEngine.d.ts.map +1 -0
  5. package/dist/ParsingEngine.js +25 -0
  6. package/dist/PublicKeyResolverEngine.d.ts +3 -0
  7. package/dist/PublicKeyResolverEngine.d.ts.map +1 -0
  8. package/dist/PublicKeyResolverEngine.js +24 -0
  9. package/dist/VerifyingEngine.d.ts +3 -0
  10. package/dist/VerifyingEngine.d.ts.map +1 -0
  11. package/dist/VerifyingEngine.js +27 -0
  12. package/dist/credential-parsers/MsoMdocParser.d.ts +6 -0
  13. package/dist/credential-parsers/MsoMdocParser.d.ts.map +1 -0
  14. package/dist/credential-parsers/MsoMdocParser.js +164 -0
  15. package/dist/credential-parsers/SDJWTVCParser.d.ts +6 -0
  16. package/dist/credential-parsers/SDJWTVCParser.d.ts.map +1 -0
  17. package/dist/credential-parsers/SDJWTVCParser.js +214 -0
  18. package/dist/credential-verifiers/MsoMdocVerifier.d.ts +8 -0
  19. package/dist/credential-verifiers/MsoMdocVerifier.d.ts.map +1 -0
  20. package/dist/credential-verifiers/MsoMdocVerifier.js +213 -0
  21. package/dist/credential-verifiers/SDJWTVCValidation.d.ts +52 -0
  22. package/dist/credential-verifiers/SDJWTVCValidation.d.ts.map +1 -0
  23. package/dist/credential-verifiers/SDJWTVCValidation.js +248 -0
  24. package/dist/credential-verifiers/SDJWTVCVerifier.d.ts +15 -0
  25. package/dist/credential-verifiers/SDJWTVCVerifier.d.ts.map +1 -0
  26. package/dist/credential-verifiers/SDJWTVCVerifier.js +394 -0
  27. package/dist/defaultHttpClient.d.ts +3 -0
  28. package/dist/defaultHttpClient.d.ts.map +1 -0
  29. package/dist/defaultHttpClient.js +18 -0
  30. package/dist/error.d.ts +134 -0
  31. package/dist/error.d.ts.map +1 -0
  32. package/dist/error.js +160 -0
  33. package/dist/functions/convertDataUriToImage.d.ts +2 -0
  34. package/dist/functions/convertDataUriToImage.d.ts.map +1 -0
  35. package/dist/functions/convertDataUriToImage.js +38 -0
  36. package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts +5 -0
  37. package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts.map +1 -0
  38. package/dist/functions/convertOpenid4vciToSdjwtvcClaims.js +31 -0
  39. package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts +11 -0
  40. package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts.map +1 -0
  41. package/dist/functions/convertSdjwtvcToOpenid4vciClaims.js +35 -0
  42. package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts +19 -0
  43. package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts.map +1 -0
  44. package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.js +56 -0
  45. package/dist/functions/formatDate.d.ts +2 -0
  46. package/dist/functions/formatDate.d.ts.map +1 -0
  47. package/dist/functions/formatDate.js +50 -0
  48. package/dist/functions/index.d.ts +3 -0
  49. package/dist/functions/index.d.ts.map +1 -0
  50. package/dist/functions/index.js +19 -0
  51. package/dist/functions/openID4VCICredentialRendering.d.ts +5 -0
  52. package/dist/functions/openID4VCICredentialRendering.d.ts.map +1 -0
  53. package/dist/functions/openID4VCICredentialRendering.js +93 -0
  54. package/dist/index.d.ts +19 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +35 -0
  57. package/dist/interfaces.d.ts +112 -0
  58. package/dist/interfaces.d.ts.map +1 -0
  59. package/dist/interfaces.js +3 -0
  60. package/dist/rendering.d.ts +3 -0
  61. package/dist/rendering.d.ts.map +1 -0
  62. package/dist/rendering.js +56 -0
  63. package/dist/resolvers/RemoteJwksResolver.d.ts +17 -0
  64. package/dist/resolvers/RemoteJwksResolver.d.ts.map +1 -0
  65. package/dist/resolvers/RemoteJwksResolver.js +138 -0
  66. package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts +710 -0
  67. package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts.map +1 -0
  68. package/dist/schemas/CredentialConfigurationSupportedSchema.js +60 -0
  69. package/dist/schemas/CredentialOfferSchema.d.ts +40 -0
  70. package/dist/schemas/CredentialOfferSchema.d.ts.map +1 -0
  71. package/dist/schemas/CredentialOfferSchema.js +14 -0
  72. package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts +49 -0
  73. package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts.map +1 -0
  74. package/dist/schemas/OpenidAuthorizationServerMetadataSchema.js +21 -0
  75. package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts +1030 -0
  76. package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts.map +1 -0
  77. package/dist/schemas/OpenidCredentialIssuerMetadataSchema.js +35 -0
  78. package/dist/schemas/SdJwtVcPayloadSchema.d.ts +79 -0
  79. package/dist/schemas/SdJwtVcPayloadSchema.d.ts.map +1 -0
  80. package/dist/schemas/SdJwtVcPayloadSchema.js +27 -0
  81. package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts +930 -0
  82. package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts.map +1 -0
  83. package/dist/schemas/SdJwtVcTypeMetadataSchema.js +105 -0
  84. package/dist/schemas/index.d.ts +6 -0
  85. package/dist/schemas/index.d.ts.map +1 -0
  86. package/dist/schemas/index.js +22 -0
  87. package/dist/status/TokenStatusListVerifier.d.ts +41 -0
  88. package/dist/status/TokenStatusListVerifier.d.ts.map +1 -0
  89. package/dist/status/TokenStatusListVerifier.js +410 -0
  90. package/dist/trust/AlgorithmPolicy.d.ts +27 -0
  91. package/dist/trust/AlgorithmPolicy.d.ts.map +1 -0
  92. package/dist/trust/AlgorithmPolicy.js +60 -0
  93. package/dist/trust/TrustRegistry.d.ts +49 -0
  94. package/dist/trust/TrustRegistry.d.ts.map +1 -0
  95. package/dist/trust/TrustRegistry.js +114 -0
  96. package/dist/types.d.ts +76 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +10 -0
  99. package/dist/utils/escapeSVG.d.ts +2 -0
  100. package/dist/utils/escapeSVG.d.ts.map +1 -0
  101. package/dist/utils/escapeSVG.js +18 -0
  102. package/dist/utils/getIssuerMetadata.d.ts +8 -0
  103. package/dist/utils/getIssuerMetadata.d.ts.map +1 -0
  104. package/dist/utils/getIssuerMetadata.js +33 -0
  105. package/dist/utils/getSdJwtVcMetadata.d.ts +12 -0
  106. package/dist/utils/getSdJwtVcMetadata.d.ts.map +1 -0
  107. package/dist/utils/getSdJwtVcMetadata.js +274 -0
  108. package/dist/utils/index.d.ts +2 -0
  109. package/dist/utils/index.d.ts.map +1 -0
  110. package/dist/utils/index.js +6 -0
  111. package/dist/utils/matchLocalizedDisplay.d.ts +6 -0
  112. package/dist/utils/matchLocalizedDisplay.d.ts.map +1 -0
  113. package/dist/utils/matchLocalizedDisplay.js +16 -0
  114. package/dist/utils/util.d.ts +6 -0
  115. package/dist/utils/util.d.ts.map +1 -0
  116. package/dist/utils/util.js +53 -0
  117. package/dist/utils/verifyCertificate.d.ts +2 -0
  118. package/dist/utils/verifyCertificate.d.ts.map +1 -0
  119. package/dist/utils/verifyCertificate.js +100 -0
  120. package/dist/utils/verifySRIFromObject.d.ts +10 -0
  121. package/dist/utils/verifySRIFromObject.d.ts.map +1 -0
  122. package/dist/utils/verifySRIFromObject.js +32 -0
  123. package/dist/utils/verifyX5C.d.ts +11 -0
  124. package/dist/utils/verifyX5C.d.ts.map +1 -0
  125. package/dist/utils/verifyX5C.js +19 -0
  126. package/dist/x509/X509ChainVerifier.d.ts +59 -0
  127. package/dist/x509/X509ChainVerifier.d.ts.map +1 -0
  128. package/dist/x509/X509ChainVerifier.js +458 -0
  129. package/package.json +82 -0
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveIssuerMetadata = resolveIssuerMetadata;
4
+ exports.getSdJwtVcMetadata = getSdJwtVcMetadata;
5
+ const util_1 = require("./util");
6
+ const verifySRIFromObject_1 = require("./verifySRIFromObject");
7
+ const error_1 = require("../error");
8
+ const SdJwtVcTypeMetadataSchema_1 = require("../schemas/SdJwtVcTypeMetadataSchema");
9
+ function validateTypeMetadataShape(metadata) {
10
+ const res = SdJwtVcTypeMetadataSchema_1.TypeMetadata.safeParse(metadata);
11
+ if (!res.success) {
12
+ console.error("❌ Type Metadata shape validation failed:", res.error.issues);
13
+ return error_1.CredentialParsingError.SchemaShapeFail;
14
+ }
15
+ return undefined;
16
+ }
17
+ function handleMetadataCode(code, warnings) {
18
+ if ((0, error_1.isCredentialParsingWarnings)(code)) {
19
+ warnings.push({ code });
20
+ return undefined; // continue flow
21
+ }
22
+ else {
23
+ console.warn(`❌ Metadata Error [${code}]`);
24
+ return { error: code }; // now error
25
+ }
26
+ }
27
+ function deepMerge(parent, child) {
28
+ if (Array.isArray(parent) && Array.isArray(child)) {
29
+ // Merge display[] by locale
30
+ if (parent[0]?.locale && child[0]?.locale) {
31
+ const map = new Map();
32
+ for (const item of parent) {
33
+ map.set(item.locale, item);
34
+ }
35
+ for (const item of child) {
36
+ if (map.has(item.locale)) {
37
+ // Recursively merge item with same locale
38
+ const merged = deepMerge(map.get(item.locale), item);
39
+ map.set(item.locale, merged);
40
+ }
41
+ else {
42
+ map.set(item.locale, item);
43
+ }
44
+ }
45
+ return Array.from(map.values());
46
+ }
47
+ // Merge claims[] by path
48
+ if (parent[0]?.path && child[0]?.path) {
49
+ const map = new Map();
50
+ for (const item of parent) {
51
+ map.set(JSON.stringify(item.path), item);
52
+ }
53
+ for (const item of child) {
54
+ if (map.has(JSON.stringify(item.path))) {
55
+ const merged = deepMerge(map.get(JSON.stringify(item.path)), item);
56
+ map.set(JSON.stringify(item.path), merged);
57
+ }
58
+ else {
59
+ map.set(JSON.stringify(item.path), item);
60
+ }
61
+ }
62
+ return Array.from(map.values());
63
+ }
64
+ // If they're not arrays of objects (i.e., primitives), override with child
65
+ if (typeof parent[0] !== 'object' ||
66
+ typeof child[0] !== 'object' ||
67
+ parent[0] === null ||
68
+ child[0] === null) {
69
+ return child;
70
+ }
71
+ // Otherwise, merge arrays of objects (default behavior)
72
+ return [...parent, ...child];
73
+ }
74
+ if (typeof parent === 'object' && typeof child === 'object' && parent !== null && child !== null) {
75
+ const result = { ...parent };
76
+ for (const key of Object.keys(child)) {
77
+ if (key in parent) {
78
+ result[key] = deepMerge(parent[key], child[key]); // RECURSIVE
79
+ }
80
+ else {
81
+ result[key] = child[key];
82
+ }
83
+ }
84
+ return result;
85
+ }
86
+ // Primitives: child overrides
87
+ return child;
88
+ }
89
+ async function fetchAndMergeMetadata(context, httpClient, metadataId, metadataArray, visited = new Set(), integrity, credentialPayload, warnings = []) {
90
+ if (visited.has(metadataId)) {
91
+ const resultCode = handleMetadataCode(error_1.CredentialParsingError.InfiniteRecursion, warnings);
92
+ if (resultCode)
93
+ return resultCode;
94
+ }
95
+ visited.add(metadataId);
96
+ let metadata;
97
+ if (metadataArray && Array.isArray(metadataArray)) {
98
+ metadata = metadataArray.find((m) => m.vct === metadataId);
99
+ if (!metadata) {
100
+ return undefined;
101
+ }
102
+ const resultShapeCheckCode = validateTypeMetadataShape(metadata);
103
+ if (resultShapeCheckCode) {
104
+ const resultCode = handleMetadataCode(resultShapeCheckCode, warnings);
105
+ if (resultCode)
106
+ return resultCode;
107
+ }
108
+ if (!integrity) {
109
+ const resultCode = handleMetadataCode(error_1.CredentialParsingError.IntegrityMissing, warnings);
110
+ if (resultCode)
111
+ return resultCode;
112
+ }
113
+ else {
114
+ const isValid = await (0, verifySRIFromObject_1.verifySRIFromObject)(context, metadata, integrity);
115
+ if (!isValid) {
116
+ const resultCode = handleMetadataCode(error_1.CredentialParsingError.IntegrityFail, warnings);
117
+ if (resultCode)
118
+ return resultCode;
119
+ }
120
+ }
121
+ }
122
+ else {
123
+ const result = await httpClient.get(metadataId, {}, { useCache: true });
124
+ if (!result ||
125
+ result.status !== 200 ||
126
+ typeof result.data !== 'object' ||
127
+ result.data === null ||
128
+ !('vct' in result.data)) {
129
+ return undefined;
130
+ }
131
+ const resultShapeCheckCode = validateTypeMetadataShape(result.data);
132
+ if (resultShapeCheckCode) {
133
+ const resultCode = handleMetadataCode(resultShapeCheckCode, warnings);
134
+ if (resultCode)
135
+ return resultCode;
136
+ }
137
+ if (integrity) {
138
+ const isValid = await (0, verifySRIFromObject_1.verifySRIFromObject)(context, result.data, integrity);
139
+ if (!isValid) {
140
+ const resultCode = handleMetadataCode(error_1.CredentialParsingError.IntegrityFail, warnings);
141
+ if (resultCode)
142
+ return resultCode;
143
+ }
144
+ }
145
+ metadata = result.data;
146
+ }
147
+ let merged;
148
+ if (typeof metadata.extends === 'string') {
149
+ const childIntegrity = metadata['extends#integrity'];
150
+ const parent = await fetchAndMergeMetadata(context, httpClient, metadata.extends, metadataArray || undefined, visited, childIntegrity, warnings);
151
+ if (parent === undefined) {
152
+ const resultCode = handleMetadataCode(error_1.CredentialParsingError.NotFoundExtends, warnings);
153
+ if (resultCode)
154
+ return resultCode;
155
+ return metadata;
156
+ }
157
+ if ('error' in parent)
158
+ return parent;
159
+ merged = deepMerge(parent, metadata);
160
+ }
161
+ else {
162
+ merged = metadata;
163
+ }
164
+ return merged;
165
+ }
166
+ async function resolveIssuerMetadata(httpClient, issuerUrl) {
167
+ try {
168
+ const issUrl = new URL(issuerUrl);
169
+ const result = await httpClient.get(`${issUrl.origin}/.well-known/jwt-vc-issuer`, {}, { useCache: true });
170
+ if (result &&
171
+ typeof result === 'object' &&
172
+ ('data' in result) &&
173
+ typeof result.data === 'object' &&
174
+ typeof result.data.issuer === 'string') {
175
+ if (result.data.issuer !== issUrl.origin) {
176
+ return { code: error_1.CredentialParsingError.JwtVcIssuerMismatch };
177
+ }
178
+ }
179
+ return undefined;
180
+ }
181
+ catch (err) {
182
+ return { code: error_1.CredentialParsingError.JwtVcIssuerFail };
183
+ }
184
+ }
185
+ function isValidHttpUrl(value) {
186
+ try {
187
+ const url = new URL(value);
188
+ return url.protocol.startsWith('http');
189
+ }
190
+ catch {
191
+ return false;
192
+ }
193
+ }
194
+ function isCredentialPayload(obj) {
195
+ return typeof obj === 'object' && obj !== null && 'iss' in obj && typeof obj.iss === 'string';
196
+ }
197
+ async function getSdJwtVcMetadata(context, httpClient, credential, parsedClaims, warnings = []) {
198
+ try {
199
+ // Decode Header
200
+ let credentialHeader;
201
+ try {
202
+ credentialHeader = JSON.parse(new TextDecoder().decode((0, util_1.fromBase64Url)(credential.split('.')[0])));
203
+ }
204
+ catch (e) {
205
+ console.warn('Failed to decode credential header:', e);
206
+ const resultCode = handleMetadataCode(error_1.CredentialParsingError.HeaderFail, warnings);
207
+ if (resultCode)
208
+ return resultCode;
209
+ }
210
+ if (!credentialHeader || typeof credentialHeader !== 'object') {
211
+ console.warn('Invalid or missing credential header structure.');
212
+ return { error: error_1.CredentialParsingError.HeaderFail };
213
+ }
214
+ const credentialPayload = parsedClaims;
215
+ if (!credentialPayload || !isCredentialPayload(credentialPayload)) {
216
+ return { error: error_1.CredentialParsingError.PayloadFail };
217
+ }
218
+ const vct = credentialPayload.vct;
219
+ if (vct && typeof vct === 'string' && isValidHttpUrl(vct)) {
220
+ // Check jwt-vc-issuer by iss
221
+ const checkIssuer = await resolveIssuerMetadata(httpClient, credentialPayload.iss);
222
+ if (checkIssuer) {
223
+ const resultCode = handleMetadataCode(checkIssuer.code, warnings);
224
+ if (resultCode)
225
+ return resultCode;
226
+ }
227
+ try {
228
+ const vctIntegrity = credentialPayload['vct#integrity'];
229
+ const mergedMetadata = await fetchAndMergeMetadata(context, httpClient, vct, undefined, new Set(), vctIntegrity, credentialPayload, warnings);
230
+ if (mergedMetadata) {
231
+ if ('error' in mergedMetadata) {
232
+ return { error: mergedMetadata.error };
233
+ }
234
+ else {
235
+ return { credentialMetadata: mergedMetadata, warnings };
236
+ }
237
+ }
238
+ }
239
+ catch (e) {
240
+ console.warn('Invalid vct URL:', vct, e);
241
+ }
242
+ }
243
+ if (credentialHeader.vctm && Array.isArray(credentialHeader.vctm)) {
244
+ const decodedVctmList = credentialHeader.vctm.map((encoded, index) => {
245
+ try {
246
+ return JSON.parse(new TextDecoder().decode((0, util_1.fromBase64Url)(encoded)));
247
+ }
248
+ catch (err) {
249
+ return { error: "VctmDecodeFail" };
250
+ }
251
+ });
252
+ const vctIntegrity = credentialPayload['vct#integrity'];
253
+ const vctmMergedMetadata = await fetchAndMergeMetadata(context, httpClient, credentialPayload.vct, decodedVctmList, new Set(), vctIntegrity, credentialPayload, warnings);
254
+ if (vctmMergedMetadata) {
255
+ if ('error' in vctmMergedMetadata) {
256
+ return { error: vctmMergedMetadata.error };
257
+ }
258
+ else {
259
+ // console.log('Final vctm Metadata:', vctmMergedMetadata);
260
+ return { credentialMetadata: vctmMergedMetadata, warnings };
261
+ }
262
+ }
263
+ }
264
+ // if no metafata found return NotFound
265
+ // here you add more ways to find metadata (eg registry)
266
+ warnings.push({ code: error_1.CredentialParsingError.NotFound });
267
+ return { credentialMetadata: undefined, warnings };
268
+ }
269
+ catch (err) {
270
+ console.log(err);
271
+ return { error: error_1.CredentialParsingError.UnknownError };
272
+ }
273
+ }
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U2RKd3RWY01ldGFkYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2dldFNkSnd0VmNNZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1NQSxzREF3QkM7QUFlRCxnREErRUM7QUF4VEQsaUNBQXVDO0FBQ3ZDLCtEQUE0RDtBQUU1RCxvQ0FBK0U7QUFDL0Usb0ZBQTBGO0FBRTFGLFNBQVMseUJBQXlCLENBQ2pDLFFBQTZCO0lBRTdCLE1BQU0sR0FBRyxHQUFHLHdDQUFrQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RSxPQUFPLDhCQUFzQixDQUFDLGVBQWUsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQzFCLElBQTRCLEVBQzVCLFFBQTJCO0lBRzNCLElBQUksSUFBQSxtQ0FBMkIsRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sU0FBUyxDQUFDLENBQUMsZ0JBQWdCO0lBQ25DLENBQUM7U0FBTSxDQUFDO1FBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsWUFBWTtJQUNyQyxDQUFDO0FBQ0YsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLE1BQVcsRUFBRSxLQUFVO0lBRXpDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMs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
@@ -0,0 +1,2 @@
1
+ export { verifyX5C } from './verifyX5C';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyX5C = void 0;
4
+ var verifyX5C_1 = require("./verifyX5C");
5
+ Object.defineProperty(exports, "verifyX5C", { enumerable: true, get: function () { return verifyX5C_1.verifyX5C; } });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQS9CLHNHQUFBLFNBQVMsT0FBQSJ9
@@ -0,0 +1,6 @@
1
+ type DisplayWithLocale = {
2
+ locale?: string;
3
+ };
4
+ export declare function matchDisplayByLocale<T extends DisplayWithLocale>(arr: T[] | undefined, preferredLangs: string[]): T | null;
5
+ export {};
6
+ //# sourceMappingURL=matchLocalizedDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchLocalizedDisplay.d.ts","sourceRoot":"","sources":["../../src/utils/matchLocalizedDisplay.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAC/D,GAAG,EAAE,CAAC,EAAE,GAAG,SAAS,EACpB,cAAc,EAAE,MAAM,EAAE,GACtB,CAAC,GAAG,IAAI,CAYV"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchDisplayByLocale = matchDisplayByLocale;
4
+ function matchDisplayByLocale(arr, preferredLangs) {
5
+ if (!Array.isArray(arr))
6
+ return null;
7
+ for (const lang of preferredLangs) {
8
+ const match = arr.find(d => d.locale === lang ||
9
+ d.locale?.startsWith(lang + '-') ||
10
+ lang?.startsWith(d.locale + '-'));
11
+ if (match)
12
+ return match;
13
+ }
14
+ return arr[0] ?? null;
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hMb2NhbGl6ZWREaXNwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL21hdGNoTG9jYWxpemVkRGlzcGxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLG9EQWVDO0FBZkQsU0FBZ0Isb0JBQW9CLENBQ25DLEdBQW9CLEVBQ3BCLGNBQXdCO0lBRXhCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXJDLEtBQUssTUFBTSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMxQixDQUFDLENBQUMsTUFBTSxLQUFLLElBQUk7WUFDakIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNoQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQ2hDLENBQUM7UUFDRixJQUFJLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3ZCLENBQUMifQ==
@@ -0,0 +1,6 @@
1
+ export declare function toBase64(binary: BufferSource): string;
2
+ export declare function toBase64Url(binary: BufferSource): string;
3
+ export declare function byteArrayEquals(a: BufferSource, b: BufferSource): boolean;
4
+ export declare function fromBase64(s: string): Uint8Array;
5
+ export declare function fromBase64Url(s: string): Uint8Array;
6
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/utils/util.ts"],"names":[],"mappings":"AAQA,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CASrD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAEzE;AAeD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAEhD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAEnD"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toBase64 = toBase64;
4
+ exports.toBase64Url = toBase64Url;
5
+ exports.byteArrayEquals = byteArrayEquals;
6
+ exports.fromBase64 = fromBase64;
7
+ exports.fromBase64Url = fromBase64Url;
8
+ function toU8(b) {
9
+ if (b instanceof ArrayBuffer) {
10
+ return new Uint8Array(b);
11
+ }
12
+ else {
13
+ return new Uint8Array(b.buffer);
14
+ }
15
+ }
16
+ function toBase64(binary) {
17
+ const uint8Array = toU8(binary);
18
+ const chunkSize = 0x8000; // 32KB
19
+ let result = '';
20
+ for (let i = 0; i < uint8Array.length; i += chunkSize) {
21
+ const chunk = uint8Array.subarray(i, i + chunkSize);
22
+ result += String.fromCharCode(...chunk);
23
+ }
24
+ return btoa(result);
25
+ }
26
+ function toBase64Url(binary) {
27
+ return toBase64(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
28
+ }
29
+ function byteArrayEquals(a, b) {
30
+ return toBase64(a) === toBase64(b);
31
+ }
32
+ function base64pad(s) {
33
+ const m = s.length % 4;
34
+ if (m === 0) {
35
+ return s;
36
+ }
37
+ else if (m === 2) {
38
+ return s + "==";
39
+ }
40
+ else if (m === 3) {
41
+ return s + "=";
42
+ }
43
+ else {
44
+ throw Error("Invalid length of Base64 encoded data");
45
+ }
46
+ }
47
+ function fromBase64(s) {
48
+ return new Uint8Array(Array.from(atob(base64pad(s))).map(c => c.charCodeAt(0)));
49
+ }
50
+ function fromBase64Url(s) {
51
+ return fromBase64(s.replace(/-/g, "+").replace(/_/g, "/"));
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsNEJBU0M7QUFFRCxrQ0FFQztBQUVELDBDQUVDO0FBZUQsZ0NBRUM7QUFFRCxzQ0FFQztBQTlDRCxTQUFTLElBQUksQ0FBQyxDQUFlO0lBQzVCLElBQUksQ0FBQyxZQUFZLFdBQVcsRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztTQUFNLENBQUM7UUFDUCxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0FBQ0YsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxNQUFvQjtJQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsT0FBTztJQUNqQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLE1BQW9CO0lBQy9DLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFFRCxTQUFnQixlQUFlLENBQUMsQ0FBZSxFQUFFLENBQWU7SUFDL0QsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxDQUFTO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO1NBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7U0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsQ0FBQztTQUFNLENBQUM7UUFDUCxNQUFNLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7QUFDRixDQUFDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLENBQVM7SUFDbkMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFnQixhQUFhLENBQUMsQ0FBUztJQUN0QyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQyJ9
@@ -0,0 +1,2 @@
1
+ export declare function verifyCertificate(leafCertPem: string, trustedCerts: string[]): Promise<boolean>;
2
+ //# sourceMappingURL=verifyCertificate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyCertificate.d.ts","sourceRoot":"","sources":["../../src/utils/verifyCertificate.ts"],"names":[],"mappings":"AAmDA,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,oBAwBlF"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.verifyCertificate = verifyCertificate;
40
+ const pkijs = __importStar(require("pkijs"));
41
+ const asn1js = __importStar(require("asn1js"));
42
+ const buffer_1 = require("buffer");
43
+ const uncrypto_1 = __importDefault(require("uncrypto"));
44
+ const crypto_1 = require("crypto");
45
+ pkijs.setEngine("webcrypto", uncrypto_1.default, new pkijs.CryptoEngine({ name: "", crypto: uncrypto_1.default, subtle: uncrypto_1.default.subtle }));
46
+ function pemToArrayBuffer(pem) {
47
+ const base64 = pem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\s)/g, "");
48
+ const binaryString = buffer_1.Buffer.from(base64, "base64").toString("binary");
49
+ const byteArray = new Uint8Array(binaryString.length);
50
+ for (let i = 0; i < binaryString.length; i++) {
51
+ byteArray[i] = binaryString.charCodeAt(i);
52
+ }
53
+ return byteArray.buffer;
54
+ }
55
+ function parseCertificate(pem) {
56
+ const certBuffer = pemToArrayBuffer(pem);
57
+ const asn1 = asn1js.fromBER(certBuffer);
58
+ return new pkijs.Certificate({ schema: asn1.result });
59
+ }
60
+ function normalizeDn(value) {
61
+ return value.replace(/\s+/g, " ").trim();
62
+ }
63
+ function verifyLeafAgainstRootFallback(leafPem, rootPem) {
64
+ try {
65
+ const leaf = new crypto_1.X509Certificate(leafPem);
66
+ const root = new crypto_1.X509Certificate(rootPem);
67
+ const issuerMatches = normalizeDn(leaf.issuer) === normalizeDn(root.subject);
68
+ if (!issuerMatches) {
69
+ return false;
70
+ }
71
+ const rootPublicKey = (0, crypto_1.createPublicKey)(root.publicKey);
72
+ return leaf.verify(root.publicKey);
73
+ //return leaf.verify(rootPublicKey);
74
+ }
75
+ catch (err) {
76
+ console.error("Fallback verify error:", err);
77
+ return false;
78
+ }
79
+ }
80
+ async function verifyCertificate(leafCertPem, trustedCerts) {
81
+ const leafCert = parseCertificate(leafCertPem);
82
+ const caCerts = trustedCerts.map((caCertPem) => parseCertificate(caCertPem));
83
+ const certChainEngine = new pkijs.CertificateChainValidationEngine({
84
+ trustedCerts: [...caCerts],
85
+ certs: [leafCert],
86
+ });
87
+ const verificationResult = await certChainEngine.verify();
88
+ console.log("verifyCertificate result =", verificationResult);
89
+ if (verificationResult.result) {
90
+ return true;
91
+ }
92
+ for (const trusted of trustedCerts) {
93
+ if (verifyLeafAgainstRootFallback(leafCertPem, trusted)) {
94
+ console.log("verifyCertificate fallback accepted leaf signed by trusted root");
95
+ return true;
96
+ }
97
+ }
98
+ return false;
99
+ }
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5Q2VydGlmaWNhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdmVyaWZ5Q2VydGlmaWNhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtREEsOENBd0JDO0FBM0VELDZDQUErQjtBQUMvQiwrQ0FBaUM7QUFDakMsbUNBQWdDO0FBQ2hDLHdEQUFpQztBQUNqQyxtQ0FBcUY7QUFFckYsS0FBSyxDQUFDLFNBQVMsQ0FDYixXQUFXLEVBQ1gsa0JBQVMsRUFDVCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBUyxFQUFFLE1BQU0sRUFBRSxrQkFBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQ2xGLENBQUM7QUFFRixTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyx5Q0FBeUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRSxNQUFNLFlBQVksR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0MsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFXO0lBQ25DLE1B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
@@ -0,0 +1,10 @@
1
+ import { Context } from "../interfaces";
2
+ export type Algorithm = 'sha256' | 'sha384' | 'sha512';
3
+ /**
4
+ * Verifies that a given object matches the expected SRI integrity string.
5
+ * @param obj - The object to verify
6
+ * @param expectedIntegrity - The SRI string (e.g. 'sha256-<base64hash>')
7
+ * @returns Promise resolving to true if valid, false otherwise
8
+ */
9
+ export declare function verifySRIFromObject(context: Context, obj: Record<string, any>, expectedIntegrity: string): Promise<boolean>;
10
+ //# sourceMappingURL=verifySRIFromObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifySRIFromObject.d.ts","sourceRoot":"","sources":["../../src/utils/verifySRIFromObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,iBAAiB,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC,CA2BlB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifySRIFromObject = verifySRIFromObject;
4
+ /**
5
+ * Verifies that a given object matches the expected SRI integrity string.
6
+ * @param obj - The object to verify
7
+ * @param expectedIntegrity - The SRI string (e.g. 'sha256-<base64hash>')
8
+ * @returns Promise resolving to true if valid, false otherwise
9
+ */
10
+ async function verifySRIFromObject(context, obj, expectedIntegrity) {
11
+ const [algorithm, expectedHash] = expectedIntegrity.split('-');
12
+ if (!algorithm || !expectedHash) {
13
+ throw new Error('Invalid integrity string format');
14
+ }
15
+ const jsonString = JSON.stringify(obj);
16
+ const encoder = new TextEncoder();
17
+ const data = encoder.encode(jsonString);
18
+ const algoMap = {
19
+ sha256: 'SHA-256',
20
+ sha384: 'SHA-384',
21
+ sha512: 'SHA-512',
22
+ };
23
+ const subtleAlgo = algoMap[algorithm.toLowerCase()];
24
+ if (!subtleAlgo) {
25
+ throw new Error(`Unsupported algorithm: ${algorithm}`);
26
+ }
27
+ const digest = await context.subtle.digest(subtleAlgo, data);
28
+ const hashArray = Array.from(new Uint8Array(digest));
29
+ const hashBase64 = btoa(String.fromCharCode(...hashArray));
30
+ return hashBase64 === expectedHash;
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5U1JJRnJvbU9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy92ZXJpZnlTUklGcm9tT2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsa0RBK0JDO0FBckNEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLG1CQUFtQixDQUN4QyxPQUFnQixFQUNoQixHQUF3QixFQUN4QixpQkFBeUI7SUFFekIsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUF3QixDQUFDO0lBRXRGLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNsQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sT0FBTyxHQUE4QjtRQUMxQyxNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztLQUNqQixDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQWUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRTNELE9BQU8sVUFBVSxLQUFLLFlBQVksQ0FBQztBQUNwQyxDQUFDIn0=
@@ -0,0 +1,11 @@
1
+ export interface VerifyX5COptions {
2
+ algorithm?: string;
3
+ expectedHostname?: string;
4
+ validationTime?: Date;
5
+ }
6
+ /**
7
+ * Compatibility adapter for consumers of the historical boolean API.
8
+ * All validation is delegated to the canonical X509ChainVerifier.
9
+ */
10
+ export declare function verifyX5C(x5c: string[], trustedCertificates: string[], options?: VerifyX5COptions): Promise<boolean>;
11
+ //# sourceMappingURL=verifyX5C.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyX5C.d.ts","sourceRoot":"","sources":["../../src/utils/verifyX5C.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC9B,GAAG,EAAE,MAAM,EAAE,EACb,mBAAmB,EAAE,MAAM,EAAE,EAC7B,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,OAAO,CAAC,CASlB"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyX5C = verifyX5C;
4
+ const X509ChainVerifier_1 = require("../x509/X509ChainVerifier");
5
+ /**
6
+ * Compatibility adapter for consumers of the historical boolean API.
7
+ * All validation is delegated to the canonical X509ChainVerifier.
8
+ */
9
+ async function verifyX5C(x5c, trustedCertificates, options = {}) {
10
+ const result = await new X509ChainVerifier_1.X509ChainVerifier().verify({
11
+ x5c,
12
+ trustedCertificates,
13
+ algorithm: options.algorithm,
14
+ expectedHostname: options.expectedHostname,
15
+ validationTime: options.validationTime,
16
+ });
17
+ return result.success;
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5WDVDLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3ZlcmlmeVg1Qy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDhCQWFDO0FBekJELGlFQUE4RDtBQVE5RDs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsU0FBUyxDQUM5QixHQUFhLEVBQ2IsbUJBQTZCLEVBQzdCLFVBQTRCLEVBQUU7SUFFOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLHFDQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ25ELEdBQUc7UUFDSCxtQkFBbUI7UUFDbkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7UUFDMUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO0tBQ3RDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN2QixDQUFDIn0=