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.
- package/LICENSE +21 -0
- package/README.md +20 -0
- package/dist/ParsingEngine.d.ts +3 -0
- package/dist/ParsingEngine.d.ts.map +1 -0
- package/dist/ParsingEngine.js +25 -0
- package/dist/PublicKeyResolverEngine.d.ts +3 -0
- package/dist/PublicKeyResolverEngine.d.ts.map +1 -0
- package/dist/PublicKeyResolverEngine.js +24 -0
- package/dist/VerifyingEngine.d.ts +3 -0
- package/dist/VerifyingEngine.d.ts.map +1 -0
- package/dist/VerifyingEngine.js +27 -0
- package/dist/credential-parsers/MsoMdocParser.d.ts +6 -0
- package/dist/credential-parsers/MsoMdocParser.d.ts.map +1 -0
- package/dist/credential-parsers/MsoMdocParser.js +164 -0
- package/dist/credential-parsers/SDJWTVCParser.d.ts +6 -0
- package/dist/credential-parsers/SDJWTVCParser.d.ts.map +1 -0
- package/dist/credential-parsers/SDJWTVCParser.js +214 -0
- package/dist/credential-verifiers/MsoMdocVerifier.d.ts +8 -0
- package/dist/credential-verifiers/MsoMdocVerifier.d.ts.map +1 -0
- package/dist/credential-verifiers/MsoMdocVerifier.js +213 -0
- package/dist/credential-verifiers/SDJWTVCValidation.d.ts +52 -0
- package/dist/credential-verifiers/SDJWTVCValidation.d.ts.map +1 -0
- package/dist/credential-verifiers/SDJWTVCValidation.js +248 -0
- package/dist/credential-verifiers/SDJWTVCVerifier.d.ts +15 -0
- package/dist/credential-verifiers/SDJWTVCVerifier.d.ts.map +1 -0
- package/dist/credential-verifiers/SDJWTVCVerifier.js +394 -0
- package/dist/defaultHttpClient.d.ts +3 -0
- package/dist/defaultHttpClient.d.ts.map +1 -0
- package/dist/defaultHttpClient.js +18 -0
- package/dist/error.d.ts +134 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +160 -0
- package/dist/functions/convertDataUriToImage.d.ts +2 -0
- package/dist/functions/convertDataUriToImage.d.ts.map +1 -0
- package/dist/functions/convertDataUriToImage.js +38 -0
- package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts +5 -0
- package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts.map +1 -0
- package/dist/functions/convertOpenid4vciToSdjwtvcClaims.js +31 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts +11 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts.map +1 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciClaims.js +35 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts +19 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts.map +1 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.js +56 -0
- package/dist/functions/formatDate.d.ts +2 -0
- package/dist/functions/formatDate.d.ts.map +1 -0
- package/dist/functions/formatDate.js +50 -0
- package/dist/functions/index.d.ts +3 -0
- package/dist/functions/index.d.ts.map +1 -0
- package/dist/functions/index.js +19 -0
- package/dist/functions/openID4VCICredentialRendering.d.ts +5 -0
- package/dist/functions/openID4VCICredentialRendering.d.ts.map +1 -0
- package/dist/functions/openID4VCICredentialRendering.js +93 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/interfaces.d.ts +112 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +3 -0
- package/dist/rendering.d.ts +3 -0
- package/dist/rendering.d.ts.map +1 -0
- package/dist/rendering.js +56 -0
- package/dist/resolvers/RemoteJwksResolver.d.ts +17 -0
- package/dist/resolvers/RemoteJwksResolver.d.ts.map +1 -0
- package/dist/resolvers/RemoteJwksResolver.js +138 -0
- package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts +710 -0
- package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts.map +1 -0
- package/dist/schemas/CredentialConfigurationSupportedSchema.js +60 -0
- package/dist/schemas/CredentialOfferSchema.d.ts +40 -0
- package/dist/schemas/CredentialOfferSchema.d.ts.map +1 -0
- package/dist/schemas/CredentialOfferSchema.js +14 -0
- package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts +49 -0
- package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts.map +1 -0
- package/dist/schemas/OpenidAuthorizationServerMetadataSchema.js +21 -0
- package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts +1030 -0
- package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts.map +1 -0
- package/dist/schemas/OpenidCredentialIssuerMetadataSchema.js +35 -0
- package/dist/schemas/SdJwtVcPayloadSchema.d.ts +79 -0
- package/dist/schemas/SdJwtVcPayloadSchema.d.ts.map +1 -0
- package/dist/schemas/SdJwtVcPayloadSchema.js +27 -0
- package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts +930 -0
- package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts.map +1 -0
- package/dist/schemas/SdJwtVcTypeMetadataSchema.js +105 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +22 -0
- package/dist/status/TokenStatusListVerifier.d.ts +41 -0
- package/dist/status/TokenStatusListVerifier.d.ts.map +1 -0
- package/dist/status/TokenStatusListVerifier.js +410 -0
- package/dist/trust/AlgorithmPolicy.d.ts +27 -0
- package/dist/trust/AlgorithmPolicy.d.ts.map +1 -0
- package/dist/trust/AlgorithmPolicy.js +60 -0
- package/dist/trust/TrustRegistry.d.ts +49 -0
- package/dist/trust/TrustRegistry.d.ts.map +1 -0
- package/dist/trust/TrustRegistry.js +114 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/utils/escapeSVG.d.ts +2 -0
- package/dist/utils/escapeSVG.d.ts.map +1 -0
- package/dist/utils/escapeSVG.js +18 -0
- package/dist/utils/getIssuerMetadata.d.ts +8 -0
- package/dist/utils/getIssuerMetadata.d.ts.map +1 -0
- package/dist/utils/getIssuerMetadata.js +33 -0
- package/dist/utils/getSdJwtVcMetadata.d.ts +12 -0
- package/dist/utils/getSdJwtVcMetadata.d.ts.map +1 -0
- package/dist/utils/getSdJwtVcMetadata.js +274 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/matchLocalizedDisplay.d.ts +6 -0
- package/dist/utils/matchLocalizedDisplay.d.ts.map +1 -0
- package/dist/utils/matchLocalizedDisplay.js +16 -0
- package/dist/utils/util.d.ts +6 -0
- package/dist/utils/util.d.ts.map +1 -0
- package/dist/utils/util.js +53 -0
- package/dist/utils/verifyCertificate.d.ts +2 -0
- package/dist/utils/verifyCertificate.d.ts.map +1 -0
- package/dist/utils/verifyCertificate.js +100 -0
- package/dist/utils/verifySRIFromObject.d.ts +10 -0
- package/dist/utils/verifySRIFromObject.d.ts.map +1 -0
- package/dist/utils/verifySRIFromObject.js +32 -0
- package/dist/utils/verifyX5C.d.ts +11 -0
- package/dist/utils/verifyX5C.d.ts.map +1 -0
- package/dist/utils/verifyX5C.js +19 -0
- package/dist/x509/X509ChainVerifier.d.ts +59 -0
- package/dist/x509/X509ChainVerifier.d.ts.map +1 -0
- package/dist/x509/X509ChainVerifier.js +458 -0
- package/package.json +82 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveHolderAlgorithm = void 0;
|
|
4
|
+
exports.SDJWTVCVerifier = SDJWTVCVerifier;
|
|
5
|
+
const core_1 = require("@sd-jwt/core");
|
|
6
|
+
const jose_1 = require("jose");
|
|
7
|
+
const error_1 = require("../error");
|
|
8
|
+
const util_1 = require("../utils/util");
|
|
9
|
+
const X509ChainVerifier_1 = require("../x509/X509ChainVerifier");
|
|
10
|
+
const SDJWTVCValidation_1 = require("./SDJWTVCValidation");
|
|
11
|
+
function resultError(error) {
|
|
12
|
+
return { success: false, error };
|
|
13
|
+
}
|
|
14
|
+
function isCompactJwt(value) {
|
|
15
|
+
const parts = value.split(".");
|
|
16
|
+
return parts.length === 3 && parts.every((part) => /^[A-Za-z0-9_-]+$/.test(part));
|
|
17
|
+
}
|
|
18
|
+
function audienceMatches(expected, actual) {
|
|
19
|
+
if (typeof actual === "string")
|
|
20
|
+
return actual === expected;
|
|
21
|
+
return (Array.isArray(actual) &&
|
|
22
|
+
actual.length > 0 &&
|
|
23
|
+
actual.every((item) => typeof item === "string") &&
|
|
24
|
+
actual.includes(expected));
|
|
25
|
+
}
|
|
26
|
+
function hasClaimPath(claims, path) {
|
|
27
|
+
if (!path)
|
|
28
|
+
return false;
|
|
29
|
+
let current = claims;
|
|
30
|
+
for (const segment of path.split(".")) {
|
|
31
|
+
if (typeof current !== "object" ||
|
|
32
|
+
current === null ||
|
|
33
|
+
Array.isArray(current) ||
|
|
34
|
+
!Object.prototype.hasOwnProperty.call(current, segment)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
current = current[segment];
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
var SDJWTVCValidation_2 = require("./SDJWTVCValidation");
|
|
42
|
+
Object.defineProperty(exports, "deriveHolderAlgorithm", { enumerable: true, get: function () { return SDJWTVCValidation_2.deriveHolderAlgorithm; } });
|
|
43
|
+
function SDJWTVCVerifier(args) {
|
|
44
|
+
const policy = (0, SDJWTVCValidation_1.normalizeSDJWTVCVerificationPolicy)(args.policy);
|
|
45
|
+
const x509ChainVerifier = args.x509ChainVerifier ?? new X509ChainVerifier_1.X509ChainVerifier();
|
|
46
|
+
const encoder = new TextEncoder();
|
|
47
|
+
if (policy.requireStatusCheck && !args.statusListVerifier) {
|
|
48
|
+
throw new TypeError("A TokenStatusListVerifier is required when requireStatusCheck is enabled");
|
|
49
|
+
}
|
|
50
|
+
const hasherAndAlgorithm = {
|
|
51
|
+
hasher: (data, alg) => {
|
|
52
|
+
const encoded = typeof data === "string" ? encoder.encode(data) : new Uint8Array(data);
|
|
53
|
+
return args.context.subtle.digest(alg, encoded).then((value) => new Uint8Array(value));
|
|
54
|
+
},
|
|
55
|
+
alg: "sha-256",
|
|
56
|
+
};
|
|
57
|
+
async function parseAndValidate(rawCredential, opts) {
|
|
58
|
+
if (!rawCredential.includes("~")) {
|
|
59
|
+
return resultError(error_1.CredentialVerificationError.InvalidFormat);
|
|
60
|
+
}
|
|
61
|
+
const parts = rawCredential.split("~");
|
|
62
|
+
const issuerJwt = parts[0];
|
|
63
|
+
const finalPart = parts[parts.length - 1];
|
|
64
|
+
if (!issuerJwt || !isCompactJwt(issuerJwt)) {
|
|
65
|
+
return resultError(error_1.CredentialVerificationError.InvalidFormat);
|
|
66
|
+
}
|
|
67
|
+
const kbJwt = finalPart ? finalPart : undefined;
|
|
68
|
+
if (kbJwt && !isCompactJwt(kbJwt)) {
|
|
69
|
+
return resultError(error_1.CredentialVerificationError.InvalidFormat);
|
|
70
|
+
}
|
|
71
|
+
const rawDisclosures = parts.slice(1, -1);
|
|
72
|
+
if (rawDisclosures.some((disclosure) => !/^[A-Za-z0-9_-]+$/.test(disclosure))) {
|
|
73
|
+
return resultError(error_1.CredentialVerificationError.InvalidDisclosures);
|
|
74
|
+
}
|
|
75
|
+
let sdJwt;
|
|
76
|
+
let claims;
|
|
77
|
+
try {
|
|
78
|
+
sdJwt = await core_1.SDJwt.fromEncode(rawCredential, hasherAndAlgorithm.hasher);
|
|
79
|
+
claims = await sdJwt.getClaims(hasherAndAlgorithm.hasher);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return resultError(error_1.CredentialVerificationError.InvalidFormat);
|
|
83
|
+
}
|
|
84
|
+
const header = sdJwt.jwt?.header;
|
|
85
|
+
const payload = sdJwt.jwt?.payload;
|
|
86
|
+
if (!header || !payload || typeof header !== "object" || typeof payload !== "object") {
|
|
87
|
+
return resultError(error_1.CredentialVerificationError.InvalidFormat);
|
|
88
|
+
}
|
|
89
|
+
const headerResult = (0, SDJWTVCValidation_1.validateCredentialHeader)(header, policy);
|
|
90
|
+
if (!headerResult.success)
|
|
91
|
+
return headerResult;
|
|
92
|
+
const payloadResult = (0, SDJWTVCValidation_1.validateCredentialPayload)(payload, policy, args.context.clockTolerance);
|
|
93
|
+
if (!payloadResult.success)
|
|
94
|
+
return payloadResult;
|
|
95
|
+
const disclosuresResult = (0, SDJWTVCValidation_1.validateDisclosures)({
|
|
96
|
+
sdJwt,
|
|
97
|
+
rawDisclosures,
|
|
98
|
+
payload,
|
|
99
|
+
policy,
|
|
100
|
+
});
|
|
101
|
+
if (!disclosuresResult.success)
|
|
102
|
+
return disclosuresResult;
|
|
103
|
+
if (opts.expectedIssuer !== undefined && payload.iss !== opts.expectedIssuer) {
|
|
104
|
+
return resultError(error_1.CredentialVerificationError.UnexpectedIssuer);
|
|
105
|
+
}
|
|
106
|
+
if (opts.expectedCredentialType !== undefined &&
|
|
107
|
+
payload.vct !== opts.expectedCredentialType) {
|
|
108
|
+
return resultError(error_1.CredentialVerificationError.UnexpectedCredentialType);
|
|
109
|
+
}
|
|
110
|
+
if (opts.requiredClaimKeys?.some((claimPath) => !hasClaimPath(claims, claimPath))) {
|
|
111
|
+
return resultError(error_1.CredentialVerificationError.MissingRequiredClaims);
|
|
112
|
+
}
|
|
113
|
+
const rawWithoutKbJwt = kbJwt
|
|
114
|
+
? `${parts.slice(0, -1).join("~")}~`
|
|
115
|
+
: rawCredential;
|
|
116
|
+
return {
|
|
117
|
+
success: true,
|
|
118
|
+
value: {
|
|
119
|
+
sdJwt,
|
|
120
|
+
issuerJwt,
|
|
121
|
+
rawWithoutKbJwt,
|
|
122
|
+
rawDisclosures,
|
|
123
|
+
header,
|
|
124
|
+
payload,
|
|
125
|
+
claims,
|
|
126
|
+
kbJwt,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async function getHolderPublicKey(parsed) {
|
|
131
|
+
const cnf = parsed.claims.cnf;
|
|
132
|
+
if (typeof cnf !== "object" ||
|
|
133
|
+
cnf === null ||
|
|
134
|
+
Array.isArray(cnf) ||
|
|
135
|
+
typeof cnf.jwk !== "object" ||
|
|
136
|
+
cnf.jwk === null ||
|
|
137
|
+
Array.isArray(cnf.jwk)) {
|
|
138
|
+
return resultError(error_1.CredentialVerificationError.CannotExtractHolderPublicKey);
|
|
139
|
+
}
|
|
140
|
+
const jwk = cnf.jwk;
|
|
141
|
+
const algorithmResult = (0, SDJWTVCValidation_1.deriveHolderAlgorithm)(jwk);
|
|
142
|
+
if (!algorithmResult.success)
|
|
143
|
+
return algorithmResult;
|
|
144
|
+
if (!policy.allowedHolderAlgorithms.includes(algorithmResult.value)) {
|
|
145
|
+
return resultError(error_1.CredentialVerificationError.HolderKeyAlgorithmMismatch);
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
return {
|
|
149
|
+
success: true,
|
|
150
|
+
value: {
|
|
151
|
+
key: await (0, jose_1.importJWK)(jwk, algorithmResult.value),
|
|
152
|
+
jwk: { ...jwk },
|
|
153
|
+
alg: algorithmResult.value,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return resultError(error_1.CredentialVerificationError.CannotImportHolderPublicKey);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function getIssuerPublicKey(parsed) {
|
|
162
|
+
const x5c = parsed.header.x5c;
|
|
163
|
+
const alg = parsed.header.alg;
|
|
164
|
+
if (x5c !== undefined) {
|
|
165
|
+
if (!Array.isArray(x5c) ||
|
|
166
|
+
x5c.length === 0 ||
|
|
167
|
+
!x5c.every((item) => typeof item === "string")) {
|
|
168
|
+
return resultError(error_1.CredentialVerificationError.InvalidCertificateChain);
|
|
169
|
+
}
|
|
170
|
+
const certificateValidationResult = await x509ChainVerifier.verify({
|
|
171
|
+
x5c,
|
|
172
|
+
trustedCertificates: args.context.trustedCertificates,
|
|
173
|
+
algorithm: alg,
|
|
174
|
+
expectedHostname: new URL(parsed.payload.iss).hostname,
|
|
175
|
+
validationTime: policy.now(),
|
|
176
|
+
});
|
|
177
|
+
if (!certificateValidationResult.success) {
|
|
178
|
+
console.error("[ubid-common][SDJWTVCVerifier] X.509 verification failed", {
|
|
179
|
+
error: certificateValidationResult.error,
|
|
180
|
+
issuer: parsed.payload.iss,
|
|
181
|
+
algorithm: alg,
|
|
182
|
+
expectedHostname: new URL(parsed.payload.iss).hostname,
|
|
183
|
+
});
|
|
184
|
+
return resultError(error_1.CredentialVerificationError.InvalidCertificateChain);
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
return {
|
|
188
|
+
success: true,
|
|
189
|
+
value: await (0, jose_1.importX509)(certificateValidationResult.value.leafCertificatePem, alg),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return resultError(error_1.CredentialVerificationError.CannotImportIssuerPublicKey);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const kid = parsed.header.kid;
|
|
197
|
+
const resolutionResult = await args.pkResolverEngine.resolve({
|
|
198
|
+
identifier: parsed.payload.iss,
|
|
199
|
+
kid: typeof kid === "string" ? kid : undefined,
|
|
200
|
+
alg,
|
|
201
|
+
tokenType: "credential",
|
|
202
|
+
credentialType: parsed.payload.vct,
|
|
203
|
+
});
|
|
204
|
+
if (!resolutionResult.success) {
|
|
205
|
+
console.error("[ubid-common][SDJWTVCVerifier] issuer key resolution failed", {
|
|
206
|
+
error: resolutionResult.error,
|
|
207
|
+
issuer: parsed.payload.iss,
|
|
208
|
+
kid: typeof kid === "string" ? kid : undefined,
|
|
209
|
+
algorithm: alg,
|
|
210
|
+
credentialType: parsed.payload.vct,
|
|
211
|
+
});
|
|
212
|
+
return resultError(error_1.CredentialVerificationError.CannotResolveIssuerPublicKey);
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
return {
|
|
216
|
+
success: true,
|
|
217
|
+
value: await (0, jose_1.importJWK)(resolutionResult.value.jwk, alg),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return resultError(error_1.CredentialVerificationError.CannotImportIssuerPublicKey);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async function verifyIssuerSignature(parsed) {
|
|
225
|
+
const issuerKeyResult = await getIssuerPublicKey(parsed);
|
|
226
|
+
if (!issuerKeyResult.success)
|
|
227
|
+
return issuerKeyResult;
|
|
228
|
+
try {
|
|
229
|
+
await (0, jose_1.jwtVerify)(parsed.issuerJwt, issuerKeyResult.value, {
|
|
230
|
+
algorithms: [parsed.header.alg],
|
|
231
|
+
clockTolerance: args.context.clockTolerance,
|
|
232
|
+
currentDate: policy.now(),
|
|
233
|
+
});
|
|
234
|
+
return { success: true, value: true };
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (error instanceof Error && (error.name === "JWTExpired" || error.name === "JWTClaimValidationFailed")) {
|
|
238
|
+
return resultError(error_1.CredentialVerificationError.ExpiredCredential);
|
|
239
|
+
}
|
|
240
|
+
return resultError(error_1.CredentialVerificationError.InvalidSignature);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function verifyKbJwt(parsed, holder, opts) {
|
|
244
|
+
if (!parsed.kbJwt) {
|
|
245
|
+
return resultError(error_1.CredentialVerificationError.KeyBindingRequired);
|
|
246
|
+
}
|
|
247
|
+
if (!opts.expectedNonce || !opts.expectedAudience) {
|
|
248
|
+
return resultError(error_1.CredentialVerificationError.MissingOpts);
|
|
249
|
+
}
|
|
250
|
+
let header;
|
|
251
|
+
try {
|
|
252
|
+
header = (0, jose_1.decodeProtectedHeader)(parsed.kbJwt);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedHeader);
|
|
256
|
+
}
|
|
257
|
+
if (header.typ !== "kb+jwt" ||
|
|
258
|
+
header.alg !== holder.alg ||
|
|
259
|
+
header.alg === "none" ||
|
|
260
|
+
header.b64 !== undefined ||
|
|
261
|
+
header.jku !== undefined ||
|
|
262
|
+
header.x5u !== undefined ||
|
|
263
|
+
header.jwk !== undefined ||
|
|
264
|
+
header.x5c !== undefined ||
|
|
265
|
+
(header.crit !== undefined && (!Array.isArray(header.crit) || header.crit.length > 0))) {
|
|
266
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedHeader);
|
|
267
|
+
}
|
|
268
|
+
let verifiedPayload;
|
|
269
|
+
try {
|
|
270
|
+
const verified = await (0, jose_1.jwtVerify)(parsed.kbJwt, holder.key, {
|
|
271
|
+
algorithms: [holder.alg],
|
|
272
|
+
clockTolerance: args.context.clockTolerance,
|
|
273
|
+
currentDate: policy.now(),
|
|
274
|
+
});
|
|
275
|
+
verifiedPayload = verified.payload;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedSignatureValidation);
|
|
279
|
+
}
|
|
280
|
+
const { sd_hash: sdHash, nonce, aud, iat } = verifiedPayload;
|
|
281
|
+
if (typeof sdHash !== "string" ||
|
|
282
|
+
!sdHash ||
|
|
283
|
+
typeof nonce !== "string" ||
|
|
284
|
+
!nonce ||
|
|
285
|
+
!(typeof aud === "string" ||
|
|
286
|
+
(Array.isArray(aud) &&
|
|
287
|
+
aud.length > 0 &&
|
|
288
|
+
aud.every((item) => typeof item === "string") &&
|
|
289
|
+
new Set(aud).size === aud.length)) ||
|
|
290
|
+
typeof iat !== "number" ||
|
|
291
|
+
!Number.isSafeInteger(iat) ||
|
|
292
|
+
iat < 0) {
|
|
293
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedMissingParameters);
|
|
294
|
+
}
|
|
295
|
+
const now = Math.floor(policy.now().getTime() / 1000);
|
|
296
|
+
if (iat > now + args.context.clockTolerance ||
|
|
297
|
+
iat < now - policy.kbJwtMaxAgeSeconds - args.context.clockTolerance) {
|
|
298
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedIat);
|
|
299
|
+
}
|
|
300
|
+
if (!audienceMatches(opts.expectedAudience, aud)) {
|
|
301
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedUnexpectedAudience);
|
|
302
|
+
}
|
|
303
|
+
if (nonce !== opts.expectedNonce) {
|
|
304
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedUnexpectedNonce);
|
|
305
|
+
}
|
|
306
|
+
const disclosureAlgorithm = typeof parsed.payload._sd_alg === "string" ? parsed.payload._sd_alg : "sha-256";
|
|
307
|
+
const hashBuffer = await args.context.subtle.digest(disclosureAlgorithm, encoder.encode(parsed.rawWithoutKbJwt));
|
|
308
|
+
if ((0, util_1.toBase64Url)(hashBuffer) !== sdHash) {
|
|
309
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedWrongSdHash);
|
|
310
|
+
}
|
|
311
|
+
if (policy.replayGuard) {
|
|
312
|
+
try {
|
|
313
|
+
const accepted = await policy.replayGuard.consume({
|
|
314
|
+
kbJwt: parsed.kbJwt,
|
|
315
|
+
nonce,
|
|
316
|
+
audience: aud,
|
|
317
|
+
iat,
|
|
318
|
+
holderJwk: holder.jwk,
|
|
319
|
+
});
|
|
320
|
+
if (!accepted) {
|
|
321
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedReplay);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
return resultError(error_1.CredentialVerificationError.KbJwtVerificationFailedReplay);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return { success: true, value: true };
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
async verify({ rawCredential, opts }) {
|
|
332
|
+
if (typeof rawCredential !== "string") {
|
|
333
|
+
return resultError(error_1.CredentialVerificationError.InvalidDatatype);
|
|
334
|
+
}
|
|
335
|
+
const parsedResult = await parseAndValidate(rawCredential, opts);
|
|
336
|
+
if (!parsedResult.success)
|
|
337
|
+
return parsedResult;
|
|
338
|
+
const parsed = parsedResult.value;
|
|
339
|
+
const issuerSignatureResult = await verifyIssuerSignature(parsed);
|
|
340
|
+
if (!issuerSignatureResult.success)
|
|
341
|
+
return issuerSignatureResult;
|
|
342
|
+
const holderResult = await getHolderPublicKey(parsed);
|
|
343
|
+
if (!holderResult.success)
|
|
344
|
+
return holderResult;
|
|
345
|
+
if (parsed.kbJwt) {
|
|
346
|
+
const kbResult = await verifyKbJwt(parsed, holderResult.value, opts);
|
|
347
|
+
if (!kbResult.success)
|
|
348
|
+
return kbResult;
|
|
349
|
+
}
|
|
350
|
+
else if (opts.requireKeyBinding === true) {
|
|
351
|
+
return resultError(error_1.CredentialVerificationError.KeyBindingRequired);
|
|
352
|
+
}
|
|
353
|
+
let credentialStatus;
|
|
354
|
+
if (args.statusListVerifier && parsed.claims.status !== undefined) {
|
|
355
|
+
credentialStatus = await args.statusListVerifier.verify({
|
|
356
|
+
credentialIssuer: parsed.payload.iss,
|
|
357
|
+
status: parsed.claims.status,
|
|
358
|
+
});
|
|
359
|
+
if (!credentialStatus.success) {
|
|
360
|
+
return resultError(error_1.CredentialVerificationError.CredentialStatusVerificationFailed);
|
|
361
|
+
}
|
|
362
|
+
if (credentialStatus.value.status === "revoked") {
|
|
363
|
+
return resultError(error_1.CredentialVerificationError.CredentialRevoked);
|
|
364
|
+
}
|
|
365
|
+
if (credentialStatus.value.status === "suspended") {
|
|
366
|
+
return resultError(error_1.CredentialVerificationError.CredentialSuspended);
|
|
367
|
+
}
|
|
368
|
+
if (credentialStatus.value.status === "application-specific") {
|
|
369
|
+
return resultError(error_1.CredentialVerificationError.CredentialStatusApplicationSpecific);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else if (policy.requireStatusCheck) {
|
|
373
|
+
return resultError(error_1.CredentialVerificationError.CredentialStatusRequired);
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
success: true,
|
|
377
|
+
value: {
|
|
378
|
+
valid: true,
|
|
379
|
+
holderPublicKey: { ...holderResult.value.jwk },
|
|
380
|
+
credentialStatus: credentialStatus?.success
|
|
381
|
+
? credentialStatus.value.status
|
|
382
|
+
: undefined,
|
|
383
|
+
statusListUri: credentialStatus?.success
|
|
384
|
+
? credentialStatus.value.uri
|
|
385
|
+
: undefined,
|
|
386
|
+
statusListIndex: credentialStatus?.success
|
|
387
|
+
? credentialStatus.value.index
|
|
388
|
+
: undefined,
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU0RKV1RWQ1ZlcmlmaWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyZWRlbnRpYWwtdmVyaWZpZXJzL1NESldUVkNWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3RkEsMENBbVpDO0FBM2VELHVDQUFxQztBQUVyQywrQkFPYztBQVFkLG9DQUF1RDtBQUV2RCx3Q0FBNEM7QUFFNUMsaUVBR21DO0FBQ25DLDJEQU82QjtBQWE3QixTQUFTLFdBQVcsQ0FBQyxLQUFrQztJQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYTtJQUNsQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFFBQWdCLEVBQUUsTUFBZTtJQUN6RCxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUM7SUFDM0QsT0FBTyxDQUNOLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUM7UUFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FDekIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUErQixFQUFFLElBQVk7SUFDbEUsSUFBSSxD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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultHttpClient.d.ts","sourceRoot":"","sources":["../src/defaultHttpClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,eAAO,MAAM,iBAAiB,EAAE,UAS/B,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.defaultHttpClient = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
exports.defaultHttpClient = {
|
|
9
|
+
async get(url, headers, opts) {
|
|
10
|
+
const response = await axios_1.default.get(url, { ...opts, headers: headers });
|
|
11
|
+
return { status: response.status, data: response.data, headers: response.headers };
|
|
12
|
+
},
|
|
13
|
+
async post(url, data, headers, opts) {
|
|
14
|
+
const response = await axios_1.default.post(url, data, { ...opts, headers: headers });
|
|
15
|
+
return { status: response.status, data: response.data, headers: response.headers };
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdEh0dHBDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdEh0dHBDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBR2IsUUFBQSxpQkFBaUIsR0FBZTtJQUM1QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSTtRQUMzQixNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQWMsRUFBRSxDQUFDLENBQUM7UUFDNUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEYsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BGLENBQUM7Q0FDRCxDQUFBIn0=
|
package/dist/error.d.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
export declare enum CredentialParsingError {
|
|
2
|
+
CouldNotParse = "CouldNotParse",
|
|
3
|
+
InvalidSdJwtVcPayload = "InvalidSdJwtVcPayload",
|
|
4
|
+
InvalidDatatype = "InvalidDatatype",
|
|
5
|
+
NotSupportedCredentialType = "NotSupportedCredentialType",
|
|
6
|
+
HeaderFail = "HeaderFail",
|
|
7
|
+
InfiniteRecursion = "InfiniteRecursion",
|
|
8
|
+
PayloadFail = "PayloadFail",
|
|
9
|
+
VctmDecodeFail = "VctmDecodeFail",
|
|
10
|
+
UnknownError = "UnknownError",
|
|
11
|
+
NotFound = "NotFound",
|
|
12
|
+
NotFoundExtends = "NotFoundExtends",
|
|
13
|
+
IntegrityMissing = "IntegrityMissing",
|
|
14
|
+
JwtVcIssuerMismatch = "JwtVcIssuerMismatch",
|
|
15
|
+
IntegrityFail = "IntegrityFail",
|
|
16
|
+
SchemaShapeFail = "SchemaShapeFail",
|
|
17
|
+
JwtVcIssuerFail = "JwtVcIssuerFail",
|
|
18
|
+
FailFetchIssuerMetadata = "FailFetchIssuerMetadata",
|
|
19
|
+
FailSchemaIssuerMetadata = "FailSchemaIssuerMetadata"
|
|
20
|
+
}
|
|
21
|
+
export declare const CredentialParsingWarnings: Set<CredentialParsingError>;
|
|
22
|
+
export declare function isCredentialParsingWarnings(code: CredentialParsingError): boolean;
|
|
23
|
+
export declare enum GetMatchingCredentialsError {
|
|
24
|
+
PresentationDefinitionParseError = "PresentationDefinitionParseError"
|
|
25
|
+
}
|
|
26
|
+
export declare enum ValidatePresentationRequirementsError {
|
|
27
|
+
PresentationSubmissionParameterIsMissing = "PresentationSubmissionParameterIsMissing",
|
|
28
|
+
ConstraintsAreNotSatisfied = "ConstraintsAreNotSatisfied",
|
|
29
|
+
PresentationSubmissionParsingFailed = "PresentationSubmissionParsingFailed",
|
|
30
|
+
FailedToParseAtLeastOnePresentation = "FailedToParseAtLeastOnePresentation",
|
|
31
|
+
InvalidVpToken = "InvalidVpToken",
|
|
32
|
+
CredentialParsingError = "CredentialParsingError",
|
|
33
|
+
CouldNotFindAssociatedInputDescriptorBasedOnPresentationSubmission = "CouldNotFindAssociatedInputDescriptorBasedOnPresentationSubmission",
|
|
34
|
+
CouldNotVerifyParsedCredentialWithInputDescriptor = "CouldNotVerifyParsedCredentialWithInputDescriptor",
|
|
35
|
+
UnsupportedFormat = "UnsupportedFormat"
|
|
36
|
+
}
|
|
37
|
+
export declare enum CredentialVerificationError {
|
|
38
|
+
UnknownProblem = "UnknownProblem",
|
|
39
|
+
VerificationProcessNotStarted = "VerificationProcessNotStarted",// will be used when the verifier functions cannot start the verification process because of format
|
|
40
|
+
InvalidDatatype = "InvalidDatatype",
|
|
41
|
+
InvalidFormat = "InvalidFormat",
|
|
42
|
+
MissingOpts = "MissingOpts",
|
|
43
|
+
InvalidCertificateChain = "InvalidCertificateChain",
|
|
44
|
+
InvalidSignature = "InvalidSignature",
|
|
45
|
+
CannotResolveIssuerPublicKey = "CannotResolveIssuerPublicKey",
|
|
46
|
+
CannotImportIssuerPublicKey = "CannotImportIssuerPublicKey",
|
|
47
|
+
NotTrustedIssuer = "NotTrustedIssuer",
|
|
48
|
+
VctRegistryNotConfigured = "VctRegistryNotConfigured",
|
|
49
|
+
ExpiredCredential = "ExpiredCredential",
|
|
50
|
+
InvalidCredentialHeader = "InvalidCredentialHeader",
|
|
51
|
+
InvalidCredentialPayload = "InvalidCredentialPayload",
|
|
52
|
+
InvalidDisclosures = "InvalidDisclosures",
|
|
53
|
+
UnexpectedIssuer = "UnexpectedIssuer",
|
|
54
|
+
UnexpectedCredentialType = "UnexpectedCredentialType",
|
|
55
|
+
MissingRequiredClaims = "MissingRequiredClaims",
|
|
56
|
+
CannotImportHolderPublicKey = "CannotImportHolderPublicKey",
|
|
57
|
+
CannotExtractHolderPublicKey = "CannotExtractHolderPublicKey",
|
|
58
|
+
HolderKeyAlgorithmMismatch = "HolderKeyAlgorithmMismatch",
|
|
59
|
+
KeyBindingRequired = "KeyBindingRequired",
|
|
60
|
+
KbJwtVerificationFailedHeader = "KbJwtVerificationFailedHeader",
|
|
61
|
+
KbJwtVerificationFailedIat = "KbJwtVerificationFailedIat",
|
|
62
|
+
KbJwtVerificationFailedReplay = "KbJwtVerificationFailedReplay",
|
|
63
|
+
KbJwtVerificationFailedMissingParameters = "KbJwtVerificationFailedMissingParameters",
|
|
64
|
+
KbJwtVerificationFailedWrongSdHash = "KbJwtVerificationFailedWrongSdHash",
|
|
65
|
+
KbJwtVerificationFailedUnexpectedAudience = "KbJwtVerificationFailedUnexpectedAudience",
|
|
66
|
+
KbJwtVerificationFailedUnexpectedNonce = "KbJwtVerificationFailedUnexpectedNonce",
|
|
67
|
+
KbJwtVerificationFailedSignatureValidation = "KbJwtVerificationFailedSignatureValidation",
|
|
68
|
+
CredentialStatusRequired = "CredentialStatusRequired",
|
|
69
|
+
CredentialStatusVerificationFailed = "CredentialStatusVerificationFailed",
|
|
70
|
+
CredentialRevoked = "CredentialRevoked",
|
|
71
|
+
CredentialSuspended = "CredentialSuspended",
|
|
72
|
+
CredentialStatusApplicationSpecific = "CredentialStatusApplicationSpecific",
|
|
73
|
+
MsoMdocMissingDeviceKeyInfo = "MsoMdocMissingDeviceKeyInfo",
|
|
74
|
+
MsoMdocInvalidDeviceSignature = "MsoMdocInvalidDeviceSignature"
|
|
75
|
+
}
|
|
76
|
+
export declare enum TokenStatusListVerificationError {
|
|
77
|
+
InvalidReference = "InvalidReference",
|
|
78
|
+
StatusListUriNotTrusted = "StatusListUriNotTrusted",
|
|
79
|
+
FetchFailed = "FetchFailed",
|
|
80
|
+
InvalidResponse = "InvalidResponse",
|
|
81
|
+
ResponseTooLarge = "ResponseTooLarge",
|
|
82
|
+
InvalidHeader = "InvalidHeader",
|
|
83
|
+
CannotResolveSigningKey = "CannotResolveSigningKey",
|
|
84
|
+
CannotImportSigningKey = "CannotImportSigningKey",
|
|
85
|
+
InvalidSignature = "InvalidSignature",
|
|
86
|
+
InvalidPayload = "InvalidPayload",
|
|
87
|
+
ExpiredStatusList = "ExpiredStatusList",
|
|
88
|
+
DecompressionFailed = "DecompressionFailed",
|
|
89
|
+
DecompressedListTooLarge = "DecompressedListTooLarge",
|
|
90
|
+
IndexOutOfRange = "IndexOutOfRange"
|
|
91
|
+
}
|
|
92
|
+
export declare enum X509ChainVerificationError {
|
|
93
|
+
EmptyChain = "EmptyChain",
|
|
94
|
+
NoTrustAnchors = "NoTrustAnchors",
|
|
95
|
+
ChainTooLong = "ChainTooLong",
|
|
96
|
+
ChainTooLarge = "ChainTooLarge",
|
|
97
|
+
InvalidCertificateEncoding = "InvalidCertificateEncoding",
|
|
98
|
+
DuplicateCertificate = "DuplicateCertificate",
|
|
99
|
+
InvalidTrustAnchor = "InvalidTrustAnchor",
|
|
100
|
+
InvalidChainOrder = "InvalidChainOrder",
|
|
101
|
+
InvalidValidationTime = "InvalidValidationTime",
|
|
102
|
+
CertificateNotYetValid = "CertificateNotYetValid",
|
|
103
|
+
CertificateExpired = "CertificateExpired",
|
|
104
|
+
WeakCertificateSignature = "WeakCertificateSignature",
|
|
105
|
+
UnsupportedCriticalExtension = "UnsupportedCriticalExtension",
|
|
106
|
+
LeafIsCertificateAuthority = "LeafIsCertificateAuthority",
|
|
107
|
+
InvalidLeafKeyUsage = "InvalidLeafKeyUsage",
|
|
108
|
+
AlgorithmMismatch = "AlgorithmMismatch",
|
|
109
|
+
ExtendedKeyUsageMismatch = "ExtendedKeyUsageMismatch",
|
|
110
|
+
InvalidExpectedHostname = "InvalidExpectedHostname",
|
|
111
|
+
HostnameMismatch = "HostnameMismatch",
|
|
112
|
+
InvalidCertificateChain = "InvalidCertificateChain",
|
|
113
|
+
UntrustedRoot = "UntrustedRoot",
|
|
114
|
+
CertificateRevoked = "CertificateRevoked",
|
|
115
|
+
RevocationStatusUnavailable = "RevocationStatusUnavailable"
|
|
116
|
+
}
|
|
117
|
+
export declare enum PublicKeyResolutionError {
|
|
118
|
+
CannotResolvePublicKey = "CannotResolvePublicKey",
|
|
119
|
+
IssuerNotTrusted = "IssuerNotTrusted",
|
|
120
|
+
MissingKeyIdentifier = "MissingKeyIdentifier",
|
|
121
|
+
MissingAlgorithm = "MissingAlgorithm",
|
|
122
|
+
AlgorithmNotAllowed = "AlgorithmNotAllowed",
|
|
123
|
+
KeyNotFound = "KeyNotFound",
|
|
124
|
+
DuplicateKeyIdentifier = "DuplicateKeyIdentifier",
|
|
125
|
+
InvalidJwksResponse = "InvalidJwksResponse",
|
|
126
|
+
KeyNotAllowed = "KeyNotAllowed",
|
|
127
|
+
CredentialTypeNotAllowed = "CredentialTypeNotAllowed",
|
|
128
|
+
RemoteJwksFetchFailed = "RemoteJwksFetchFailed"
|
|
129
|
+
}
|
|
130
|
+
export declare enum CredentialRenderingError {
|
|
131
|
+
IntegrityCheckFailed = "IntegrityCheckFailed",
|
|
132
|
+
CouldNotFetchSvg = "CouldNotFetchSvg"
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,oBAAY,sBAAsB;IACjC,aAAa,kBAAkB;IAC/B,qBAAqB,0BAA0B;IAC/C,eAAe,oBAAoB;IACnC,0BAA0B,+BAA+B;IACzD,UAAU,eAAe;IACzB,iBAAiB,sBAAsB;IACvC,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;IACrB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,mBAAmB,wBAAwB;IAC3C,aAAa,kBAAkB;IAC/B,eAAe,oBAAoB;IACnC,eAAe,oBAAoB;IACnC,uBAAuB,4BAA4B;IACnD,wBAAwB,6BAA6B;CACrD;AAED,eAAO,MAAM,yBAAyB,6BASpC,CAAC;AAEH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAEjF;AAED,oBAAY,2BAA2B;IACtC,gCAAgC,qCAAqC;CACrE;AAED,oBAAY,qCAAqC;IAChD,wCAAwC,6CAA6C;IACrF,0BAA0B,+BAA+B;IACzD,mCAAmC,wCAAwC;IAC3E,mCAAmC,wCAAwC;IAC3E,cAAc,mBAAmB;IACjC,sBAAsB,2BAA2B;IACjD,kEAAkE,uEAAuE;IACzI,iDAAiD,sDAAsD;IACvG,iBAAiB,sBAAsB;CAEvC;AAED,oBAAY,2BAA2B;IACtC,cAAc,mBAAmB;IACjC,6BAA6B,kCAAkC,CAAE,mGAAmG;IACpK,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,uBAAuB,4BAA4B;IAGnD,gBAAgB,qBAAqB;IACrC,4BAA4B,iCAAiC;IAC7D,2BAA2B,gCAAgC;IAC3D,gBAAgB,qBAAqB;IACrC,wBAAwB,6BAA6B;IAErD,iBAAiB,sBAAsB;IACvC,uBAAuB,4BAA4B;IACnD,wBAAwB,6BAA6B;IACrD,kBAAkB,uBAAuB;IACzC,gBAAgB,qBAAqB;IACrC,wBAAwB,6BAA6B;IACrD,qBAAqB,0BAA0B;IAE/C,2BAA2B,gCAAgC;IAC3D,4BAA4B,iCAAiC;IAC7D,0BAA0B,+BAA+B;IAGzD,kBAAkB,uBAAuB;IACzC,6BAA6B,kCAAkC;IAC/D,0BAA0B,+BAA+B;IACzD,6BAA6B,kCAAkC;IAC/D,wCAAwC,6CAA6C;IACrF,kCAAkC,uCAAuC;IACzE,yCAAyC,8CAA8C;IACvF,sCAAsC,2CAA2C;IACjF,0CAA0C,+CAA+C;IAGzF,wBAAwB,6BAA6B;IACrD,kCAAkC,uCAAuC;IACzE,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,mCAAmC,wCAAwC;IAG3E,2BAA2B,gCAAgC;IAC3D,6BAA6B,kCAAkC;CAC/D;AAED,oBAAY,gCAAgC;IAC3C,gBAAgB,qBAAqB;IACrC,uBAAuB,4BAA4B;IACnD,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;IAC/B,uBAAuB,4BAA4B;IACnD,sBAAsB,2BAA2B;IACjD,gBAAgB,qBAAqB;IACrC,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,wBAAwB,6BAA6B;IACrD,eAAe,oBAAoB;CACnC;AAED,oBAAY,0BAA0B;IACrC,UAAU,eAAe;IACzB,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,0BAA0B,+BAA+B;IACzD,oBAAoB,yBAAyB;IAC7C,kBAAkB,uBAAuB;IACzC,iBAAiB,sBAAsB;IACvC,qBAAqB,0BAA0B;IAC/C,sBAAsB,2BAA2B;IACjD,kBAAkB,uBAAuB;IACzC,wBAAwB,6BAA6B;IACrD,4BAA4B,iCAAiC;IAC7D,0BAA0B,+BAA+B;IACzD,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,wBAAwB,6BAA6B;IACrD,uBAAuB,4BAA4B;IACnD,gBAAgB,qBAAqB;IACrC,uBAAuB,4BAA4B;IACnD,aAAa,kBAAkB;IAC/B,kBAAkB,uBAAuB;IACzC,2BAA2B,gCAAgC;CAC3D;AAED,oBAAY,wBAAwB;IACnC,sBAAsB,2BAA2B;IACjD,gBAAgB,qBAAqB;IACrC,oBAAoB,yBAAyB;IAC7C,gBAAgB,qBAAqB;IACrC,mBAAmB,wBAAwB;IAC3C,WAAW,gBAAgB;IAC3B,sBAAsB,2BAA2B;IACjD,mBAAmB,wBAAwB;IAC3C,aAAa,kBAAkB;IAC/B,wBAAwB,6BAA6B;IACrD,qBAAqB,0BAA0B;CAC/C;AAED,oBAAY,wBAAwB;IACnC,oBAAoB,yBAAyB;IAC7C,gBAAgB,qBAAqB;CACrC"}
|