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,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MsoMdocVerifier = MsoMdocVerifier;
|
|
4
|
+
const jose_1 = require("jose");
|
|
5
|
+
const error_1 = require("../error");
|
|
6
|
+
const util_1 = require("../utils/util");
|
|
7
|
+
const mdl_1 = require("@auth0/mdl");
|
|
8
|
+
const cbor_1 = require("@auth0/mdl/lib/cbor/");
|
|
9
|
+
const cose_kit_1 = require("cose-kit");
|
|
10
|
+
const X509ChainVerifier_1 = require("../x509/X509ChainVerifier");
|
|
11
|
+
function MsoMdocVerifier(args) {
|
|
12
|
+
let errors = [];
|
|
13
|
+
const logError = (error, message) => {
|
|
14
|
+
errors.push({ error, message });
|
|
15
|
+
};
|
|
16
|
+
const x509ChainVerifier = args.x509ChainVerifier ?? new X509ChainVerifier_1.X509ChainVerifier();
|
|
17
|
+
// Device authentication and digest checks remain delegated to @auth0/mdl.
|
|
18
|
+
// Certificate path validation is performed once by X509ChainVerifier.
|
|
19
|
+
const verifier = new mdl_1.Verifier([]);
|
|
20
|
+
async function verifyIssuerCertificate(issuerAuth) {
|
|
21
|
+
const x5chain = issuerAuth.x5chain;
|
|
22
|
+
if (!x5chain || x5chain.length === 0) {
|
|
23
|
+
logError(error_1.CredentialVerificationError.InvalidCertificateChain, "MSO issuerAuth does not contain x5chain");
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (args.context.trustedCertificates.length === 0) {
|
|
27
|
+
logError(error_1.CredentialVerificationError.NotTrustedIssuer, "No IACA trust anchors are configured");
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const result = await x509ChainVerifier.verify({
|
|
31
|
+
x5c: x5chain.map((certificate) => Buffer.from(certificate).toString("base64")),
|
|
32
|
+
trustedCertificates: args.context.trustedCertificates,
|
|
33
|
+
algorithm: issuerAuth.algName,
|
|
34
|
+
validationTime: issuerAuth.decodedPayload.validityInfo.signed,
|
|
35
|
+
});
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
logError(error_1.CredentialVerificationError.NotTrustedIssuer, `Invalid MSO issuer certificate chain: ${result.error}`);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
if (!issuerAuth.algName) {
|
|
42
|
+
logError(error_1.CredentialVerificationError.InvalidCertificateChain, "MSO issuerAuth algorithm is missing or unsupported");
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const publicKey = await (0, jose_1.importX509)(result.value.leafCertificatePem, issuerAuth.algName);
|
|
46
|
+
if (await issuerAuth.verify(publicKey) !== true) {
|
|
47
|
+
logError(error_1.CredentialVerificationError.InvalidSignature, "Invalid MSO issuerAuth signature");
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
logError(error_1.CredentialVerificationError.InvalidSignature, "Unable to verify MSO issuerAuth signature");
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const getSessionTranscriptBytesForOID4VPHandover = async (clId, respUri, nonce, mdocNonce) => (0, cbor_1.cborEncode)(mdl_1.DataItem.fromData([
|
|
58
|
+
null,
|
|
59
|
+
null,
|
|
60
|
+
[
|
|
61
|
+
await args.context.subtle.digest('SHA-256', new Uint8Array((0, cbor_1.cborEncode)([clId, mdocNonce]))),
|
|
62
|
+
await args.context.subtle.digest('SHA-256', new Uint8Array((0, cbor_1.cborEncode)([respUri, mdocNonce]))),
|
|
63
|
+
nonce
|
|
64
|
+
]
|
|
65
|
+
]));
|
|
66
|
+
async function expirationCheck(issuerSigned) {
|
|
67
|
+
const { validFrom, validUntil, signed } = issuerSigned.issuerAuth.decodedPayload.validityInfo;
|
|
68
|
+
if (Math.floor(validUntil.getTime() / 1000) + args.context.clockTolerance < Math.floor(new Date().getTime() / 1000)) {
|
|
69
|
+
logError(error_1.CredentialVerificationError.ExpiredCredential, "Credential is expired");
|
|
70
|
+
return error_1.CredentialVerificationError.ExpiredCredential;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
function extractHolderPublicKeyJwk(parsedDocument) {
|
|
75
|
+
if (parsedDocument.issuerSigned.issuerAuth.decodedPayload.deviceKeyInfo == undefined) {
|
|
76
|
+
logError(error_1.CredentialVerificationError.MsoMdocMissingDeviceKeyInfo, "MsoMdocMissingDeviceKeyInfo");
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const cosePublicKey = parsedDocument.issuerSigned.issuerAuth.decodedPayload.deviceKeyInfo.deviceKey;
|
|
80
|
+
const holderPublicKeyJwk = (0, cose_kit_1.COSEKeyToJWK)(cosePublicKey);
|
|
81
|
+
return holderPublicKeyJwk;
|
|
82
|
+
}
|
|
83
|
+
async function issuerSignedCheck(rawCredential) {
|
|
84
|
+
try {
|
|
85
|
+
const credentialBytes = (0, util_1.fromBase64Url)(rawCredential);
|
|
86
|
+
const issuerSigned = (0, cbor_1.cborDecode)(credentialBytes);
|
|
87
|
+
const [header, _, payload, sig] = issuerSigned.get('issuerAuth');
|
|
88
|
+
const decodedIssuerAuthPayload = (0, cbor_1.cborDecode)(payload);
|
|
89
|
+
const docType = decodedIssuerAuthPayload.data.get('docType');
|
|
90
|
+
const m = {
|
|
91
|
+
version: '1.0',
|
|
92
|
+
documents: [new Map([
|
|
93
|
+
['docType', docType],
|
|
94
|
+
['issuerSigned', issuerSigned]
|
|
95
|
+
])],
|
|
96
|
+
status: 0
|
|
97
|
+
};
|
|
98
|
+
const encoded = (0, cbor_1.cborEncode)(m);
|
|
99
|
+
const mdoc = (0, mdl_1.parse)(encoded);
|
|
100
|
+
const [parsedDocument] = mdoc.documents;
|
|
101
|
+
const expirationCheckRes = await expirationCheck(parsedDocument.issuerSigned);
|
|
102
|
+
if (expirationCheckRes !== null) {
|
|
103
|
+
return { holderPublicKeyJwk: null };
|
|
104
|
+
}
|
|
105
|
+
if (!await verifyIssuerCertificate(parsedDocument.issuerSigned.issuerAuth)) {
|
|
106
|
+
return { holderPublicKeyJwk: null };
|
|
107
|
+
}
|
|
108
|
+
const holderPublicKeyJwk = extractHolderPublicKeyJwk(parsedDocument);
|
|
109
|
+
return {
|
|
110
|
+
holderPublicKeyJwk
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// @ts-ignore
|
|
115
|
+
if (err?.name && err.name === "X509InvalidCertificateChain") {
|
|
116
|
+
logError(error_1.CredentialVerificationError.InvalidCertificateChain, "Invalid Certificate chain: " + JSON.stringify(err));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { holderPublicKeyJwk: null };
|
|
120
|
+
}
|
|
121
|
+
async function deviceResponseCheck(mdoc, opts) {
|
|
122
|
+
try {
|
|
123
|
+
const [parsedDocument] = mdoc.documents;
|
|
124
|
+
if (!parsedDocument.deviceSigned) { // not a DeviceResponse
|
|
125
|
+
return { holderPublicKeyJwk: null };
|
|
126
|
+
}
|
|
127
|
+
if (!await verifyIssuerCertificate(parsedDocument.issuerSigned.issuerAuth)) {
|
|
128
|
+
return { holderPublicKeyJwk: null };
|
|
129
|
+
}
|
|
130
|
+
const expiredResult = await expirationCheck(parsedDocument.issuerSigned);
|
|
131
|
+
if (expiredResult) {
|
|
132
|
+
return { holderPublicKeyJwk: null };
|
|
133
|
+
}
|
|
134
|
+
const holderPublicKeyJwk = extractHolderPublicKeyJwk(parsedDocument);
|
|
135
|
+
if (opts.expectedAudience && opts.responseUri && opts.expectedNonce && opts.holderNonce) {
|
|
136
|
+
await verifier.verify(mdoc.encode(), {
|
|
137
|
+
disableCertificateChainValidation: true,
|
|
138
|
+
encodedSessionTranscript: await getSessionTranscriptBytesForOID4VPHandover(opts.expectedAudience, opts.responseUri, opts.expectedNonce, opts.holderNonce)
|
|
139
|
+
});
|
|
140
|
+
return { holderPublicKeyJwk };
|
|
141
|
+
}
|
|
142
|
+
return { holderPublicKeyJwk: holderPublicKeyJwk };
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
if (err instanceof Error) {
|
|
146
|
+
if (err.name === "X509InvalidCertificateChain") {
|
|
147
|
+
logError(error_1.CredentialVerificationError.NotTrustedIssuer, "Issuer is not trusted");
|
|
148
|
+
return { holderPublicKeyJwk: null };
|
|
149
|
+
}
|
|
150
|
+
else if (err.name === "MDLError") {
|
|
151
|
+
logError(error_1.CredentialVerificationError.InvalidSignature, `MDLError: ${err.message}`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.error(err);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { holderPublicKeyJwk: null };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
async verify({ rawCredential, opts }) {
|
|
162
|
+
errors = [];
|
|
163
|
+
if (typeof rawCredential !== 'string') {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
error: error_1.CredentialVerificationError.InvalidDatatype,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const decodedCred = (0, util_1.fromBase64Url)(rawCredential);
|
|
171
|
+
const parsedMDOC = (0, mdl_1.parse)(decodedCred);
|
|
172
|
+
const { holderPublicKeyJwk } = await deviceResponseCheck(parsedMDOC, opts);
|
|
173
|
+
if (errors.length === 0 && holderPublicKeyJwk !== null) {
|
|
174
|
+
return {
|
|
175
|
+
success: true,
|
|
176
|
+
value: {
|
|
177
|
+
holderPublicKey: holderPublicKeyJwk,
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (errors.length > 0) {
|
|
182
|
+
return {
|
|
183
|
+
success: false,
|
|
184
|
+
error: errors.length > 0 ? errors[0].error : error_1.CredentialVerificationError.UnknownProblem,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
const { holderPublicKeyJwk } = await issuerSignedCheck(rawCredential);
|
|
190
|
+
if (errors.length === 0 && holderPublicKeyJwk !== null) {
|
|
191
|
+
return {
|
|
192
|
+
success: true,
|
|
193
|
+
value: {
|
|
194
|
+
holderPublicKey: holderPublicKeyJwk,
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
if (errors.length > 0) {
|
|
199
|
+
return {
|
|
200
|
+
success: false,
|
|
201
|
+
error: errors.length > 0 ? errors[0].error : error_1.CredentialVerificationError.UnknownProblem,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
console.error(errors);
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
error: error_1.CredentialVerificationError.UnknownProblem
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXNvTWRvY1ZlcmlmaWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyZWRlbnRpYWwtdmVyaWZpZXJzL01zb01kb2NWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWFBLDBDQW1SQztBQWhTRCwrQkFBdUM7QUFDdkMsb0NBQXVEO0FBRXZELHdDQUE4QztBQUM5QyxvQ0FBeUc7QUFFekcsK0NBQThEO0FBQzlELHVDQUF3QztBQUN4QyxpRUFHbUM7QUFFbkMsU0FBZ0IsZUFBZSxDQUFDLElBSS9CO0lBQ0EsSUFBSSxNQUFNLEdBQThELEVBQUUsQ0FBQztJQUMzRSxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWtDLEVBQUUsT0FBZSxFQUFRLEVBQUU7UUFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQTtJQUNELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUkscUNBQWlCLEVBQUUsQ0FBQztJQUU1RSwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLEtBQUssVUFBVSx1QkFBdUIsQ0FDckMsVUFBc0M7UUFFdEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEMsUUFBUSxDQUNQLG1DQUEyQixDQUFDLHVCQUF1QixFQUNuRCx5Q0FBeUMsQ0FDekMsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsUUFBUSxDQUNQLG1DQUEyQixDQUFD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
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { JWK } from "jose";
|
|
2
|
+
import type { SDJwt } from "@sd-jwt/core";
|
|
3
|
+
import { CredentialVerificationError } from "../error";
|
|
4
|
+
import { Result, VerifiableCredentialFormat } from "../types";
|
|
5
|
+
export interface SDJWTVCVerificationPolicy {
|
|
6
|
+
acceptedCredentialTypes?: readonly (VerifiableCredentialFormat.DC_SDJWT | VerifiableCredentialFormat.VC_SDJWT)[];
|
|
7
|
+
allowedHolderAlgorithms?: readonly string[];
|
|
8
|
+
allowedDisclosureAlgorithms?: readonly string[];
|
|
9
|
+
requireCredentialIat?: boolean;
|
|
10
|
+
requireCredentialExpiration?: boolean;
|
|
11
|
+
kbJwtMaxAgeSeconds?: number;
|
|
12
|
+
requireStatusCheck?: boolean;
|
|
13
|
+
now?: () => Date;
|
|
14
|
+
replayGuard?: KbJwtReplayGuard;
|
|
15
|
+
}
|
|
16
|
+
export interface KbJwtReplayInput {
|
|
17
|
+
kbJwt: string;
|
|
18
|
+
nonce: string;
|
|
19
|
+
audience: string | readonly string[];
|
|
20
|
+
iat: number;
|
|
21
|
+
holderJwk: JWK;
|
|
22
|
+
}
|
|
23
|
+
export interface KbJwtReplayGuard {
|
|
24
|
+
/**
|
|
25
|
+
* Atomically records the presentation and returns false when it was
|
|
26
|
+
* already consumed. Production implementations should use a shared,
|
|
27
|
+
* expiring store when the Verifier has more than one instance.
|
|
28
|
+
*/
|
|
29
|
+
consume(input: KbJwtReplayInput): Promise<boolean>;
|
|
30
|
+
}
|
|
31
|
+
export interface NormalizedSDJWTVCVerificationPolicy {
|
|
32
|
+
acceptedCredentialTypes: readonly string[];
|
|
33
|
+
allowedHolderAlgorithms: readonly string[];
|
|
34
|
+
allowedDisclosureAlgorithms: readonly string[];
|
|
35
|
+
requireCredentialIat: boolean;
|
|
36
|
+
requireCredentialExpiration: boolean;
|
|
37
|
+
kbJwtMaxAgeSeconds: number;
|
|
38
|
+
requireStatusCheck: boolean;
|
|
39
|
+
now: () => Date;
|
|
40
|
+
replayGuard?: KbJwtReplayGuard;
|
|
41
|
+
}
|
|
42
|
+
export declare function normalizeSDJWTVCVerificationPolicy(policy?: SDJWTVCVerificationPolicy): NormalizedSDJWTVCVerificationPolicy;
|
|
43
|
+
export declare function deriveHolderAlgorithm(jwk: JWK): Result<string, CredentialVerificationError>;
|
|
44
|
+
export declare function validateCredentialHeader(header: Record<string, unknown>, policy: NormalizedSDJWTVCVerificationPolicy): Result<true, CredentialVerificationError>;
|
|
45
|
+
export declare function validateCredentialPayload(payload: Record<string, unknown>, policy: NormalizedSDJWTVCVerificationPolicy, clockToleranceSeconds: number): Result<true, CredentialVerificationError>;
|
|
46
|
+
export declare function validateDisclosures(args: {
|
|
47
|
+
sdJwt: SDJwt;
|
|
48
|
+
rawDisclosures: readonly string[];
|
|
49
|
+
payload: Record<string, unknown>;
|
|
50
|
+
policy: NormalizedSDJWTVCVerificationPolicy;
|
|
51
|
+
}): Result<true, CredentialVerificationError>;
|
|
52
|
+
//# sourceMappingURL=SDJWTVCValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SDJWTVCValidation.d.ts","sourceRoot":"","sources":["../../src/credential-verifiers/SDJWTVCValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAe9D,MAAM,WAAW,yBAAyB;IACzC,uBAAuB,CAAC,EAAE,SAAS,CAClC,0BAA0B,CAAC,QAAQ,GAAG,0BAA0B,CAAC,QAAQ,CACzE,EAAE,CAAC;IACJ,uBAAuB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,2BAA2B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,mCAAmC;IACnD,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,2BAA2B,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,2BAA2B,EAAE,OAAO,CAAC;IACrC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,wBAAgB,kCAAkC,CACjD,MAAM,GAAE,yBAA8B,GACpC,mCAAmC,CAoCrC;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CA6C3F;AAUD,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,mCAAmC,GACzC,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAoB3C;AAED,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,mCAAmC,EAC3C,qBAAqB,EAAE,MAAM,GAC3B,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CA4C3C;AAoED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,mCAAmC,CAAC;CAC5C,GAAG,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CA+B5C"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeSDJWTVCVerificationPolicy = normalizeSDJWTVCVerificationPolicy;
|
|
4
|
+
exports.deriveHolderAlgorithm = deriveHolderAlgorithm;
|
|
5
|
+
exports.validateCredentialHeader = validateCredentialHeader;
|
|
6
|
+
exports.validateCredentialPayload = validateCredentialPayload;
|
|
7
|
+
exports.validateDisclosures = validateDisclosures;
|
|
8
|
+
const error_1 = require("../error");
|
|
9
|
+
const types_1 = require("../types");
|
|
10
|
+
const PRIVATE_JWK_PARAMETERS = ["d", "p", "q", "dp", "dq", "qi", "oth", "k"];
|
|
11
|
+
const NON_DISCLOSABLE_ROOT_CLAIMS = new Set([
|
|
12
|
+
"iss",
|
|
13
|
+
"nbf",
|
|
14
|
+
"exp",
|
|
15
|
+
"cnf",
|
|
16
|
+
"vct",
|
|
17
|
+
"vct#integrity",
|
|
18
|
+
"status",
|
|
19
|
+
]);
|
|
20
|
+
const RESERVED_DISCLOSURE_KEYS = new Set(["_sd", "_sd_alg", "..."]);
|
|
21
|
+
function normalizeSDJWTVCVerificationPolicy(policy = {}) {
|
|
22
|
+
const acceptedCredentialTypes = policy.acceptedCredentialTypes ?? [
|
|
23
|
+
types_1.VerifiableCredentialFormat.DC_SDJWT,
|
|
24
|
+
types_1.VerifiableCredentialFormat.VC_SDJWT,
|
|
25
|
+
];
|
|
26
|
+
const allowedHolderAlgorithms = policy.allowedHolderAlgorithms ?? ["ES256"];
|
|
27
|
+
const allowedDisclosureAlgorithms = policy.allowedDisclosureAlgorithms ?? ["sha-256"];
|
|
28
|
+
const kbJwtMaxAgeSeconds = policy.kbJwtMaxAgeSeconds ?? 300;
|
|
29
|
+
for (const [name, values] of [
|
|
30
|
+
["acceptedCredentialTypes", acceptedCredentialTypes],
|
|
31
|
+
["allowedHolderAlgorithms", allowedHolderAlgorithms],
|
|
32
|
+
["allowedDisclosureAlgorithms", allowedDisclosureAlgorithms],
|
|
33
|
+
]) {
|
|
34
|
+
if (values.length === 0 || values.some((value) => typeof value !== "string" || !value)) {
|
|
35
|
+
throw new TypeError(`${name} must contain non-empty strings`);
|
|
36
|
+
}
|
|
37
|
+
if (new Set(values).size !== values.length) {
|
|
38
|
+
throw new TypeError(`${name} must not contain duplicates`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!Number.isSafeInteger(kbJwtMaxAgeSeconds) || kbJwtMaxAgeSeconds <= 0) {
|
|
42
|
+
throw new TypeError("kbJwtMaxAgeSeconds must be a positive integer");
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
acceptedCredentialTypes: Object.freeze([...acceptedCredentialTypes]),
|
|
46
|
+
allowedHolderAlgorithms: Object.freeze([...allowedHolderAlgorithms]),
|
|
47
|
+
allowedDisclosureAlgorithms: Object.freeze([...allowedDisclosureAlgorithms]),
|
|
48
|
+
requireCredentialIat: policy.requireCredentialIat ?? true,
|
|
49
|
+
requireCredentialExpiration: policy.requireCredentialExpiration ?? false,
|
|
50
|
+
kbJwtMaxAgeSeconds,
|
|
51
|
+
requireStatusCheck: policy.requireStatusCheck ?? false,
|
|
52
|
+
now: policy.now ?? (() => new Date()),
|
|
53
|
+
replayGuard: policy.replayGuard,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function deriveHolderAlgorithm(jwk) {
|
|
57
|
+
if (!jwk || typeof jwk !== "object" || Array.isArray(jwk)) {
|
|
58
|
+
return { success: false, error: error_1.CredentialVerificationError.CannotExtractHolderPublicKey };
|
|
59
|
+
}
|
|
60
|
+
if (PRIVATE_JWK_PARAMETERS.some((parameter) => parameter in jwk) ||
|
|
61
|
+
(jwk.use !== undefined && jwk.use !== "sig") ||
|
|
62
|
+
(jwk.key_ops !== undefined &&
|
|
63
|
+
(!Array.isArray(jwk.key_ops) || !jwk.key_ops.includes("verify")))) {
|
|
64
|
+
return { success: false, error: error_1.CredentialVerificationError.HolderKeyAlgorithmMismatch };
|
|
65
|
+
}
|
|
66
|
+
let algorithm;
|
|
67
|
+
if (jwk.kty === "EC" &&
|
|
68
|
+
jwk.crv === "P-256" &&
|
|
69
|
+
typeof jwk.x === "string" &&
|
|
70
|
+
jwk.x &&
|
|
71
|
+
typeof jwk.y === "string" &&
|
|
72
|
+
jwk.y) {
|
|
73
|
+
algorithm = "ES256";
|
|
74
|
+
}
|
|
75
|
+
else if (jwk.kty === "EC" &&
|
|
76
|
+
jwk.crv === "secp256k1" &&
|
|
77
|
+
typeof jwk.x === "string" &&
|
|
78
|
+
jwk.x &&
|
|
79
|
+
typeof jwk.y === "string" &&
|
|
80
|
+
jwk.y) {
|
|
81
|
+
algorithm = "ES256K";
|
|
82
|
+
}
|
|
83
|
+
else if (jwk.kty === "OKP" &&
|
|
84
|
+
jwk.crv === "Ed25519" &&
|
|
85
|
+
typeof jwk.x === "string" &&
|
|
86
|
+
jwk.x) {
|
|
87
|
+
algorithm = "EdDSA";
|
|
88
|
+
}
|
|
89
|
+
if (!algorithm || (jwk.alg !== undefined && jwk.alg !== algorithm)) {
|
|
90
|
+
return { success: false, error: error_1.CredentialVerificationError.HolderKeyAlgorithmMismatch };
|
|
91
|
+
}
|
|
92
|
+
return { success: true, value: algorithm };
|
|
93
|
+
}
|
|
94
|
+
function isObject(value) {
|
|
95
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
96
|
+
}
|
|
97
|
+
function isNumericDate(value) {
|
|
98
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
99
|
+
}
|
|
100
|
+
function validateCredentialHeader(header, policy) {
|
|
101
|
+
if (typeof header.typ !== "string" ||
|
|
102
|
+
!policy.acceptedCredentialTypes.includes(header.typ) ||
|
|
103
|
+
typeof header.alg !== "string" ||
|
|
104
|
+
!header.alg ||
|
|
105
|
+
header.alg === "none" ||
|
|
106
|
+
header.b64 !== undefined ||
|
|
107
|
+
header.jku !== undefined ||
|
|
108
|
+
header.x5u !== undefined ||
|
|
109
|
+
header.jwk !== undefined) {
|
|
110
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidCredentialHeader };
|
|
111
|
+
}
|
|
112
|
+
if (header.crit !== undefined) {
|
|
113
|
+
if (!Array.isArray(header.crit) || header.crit.length > 0) {
|
|
114
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidCredentialHeader };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { success: true, value: true };
|
|
118
|
+
}
|
|
119
|
+
function validateCredentialPayload(payload, policy, clockToleranceSeconds) {
|
|
120
|
+
let issuerUrl;
|
|
121
|
+
try {
|
|
122
|
+
issuerUrl = new URL(String(payload.iss));
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidCredentialPayload };
|
|
126
|
+
}
|
|
127
|
+
if (issuerUrl.protocol !== "https:" ||
|
|
128
|
+
issuerUrl.username ||
|
|
129
|
+
issuerUrl.password ||
|
|
130
|
+
issuerUrl.search ||
|
|
131
|
+
issuerUrl.hash ||
|
|
132
|
+
typeof payload.vct !== "string" ||
|
|
133
|
+
payload.vct.length === 0) {
|
|
134
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidCredentialPayload };
|
|
135
|
+
}
|
|
136
|
+
for (const claim of ["iat", "nbf", "exp"]) {
|
|
137
|
+
if (payload[claim] !== undefined && !isNumericDate(payload[claim])) {
|
|
138
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidCredentialPayload };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (policy.requireCredentialIat && !isNumericDate(payload.iat)) {
|
|
142
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidCredentialPayload };
|
|
143
|
+
}
|
|
144
|
+
if (policy.requireCredentialExpiration && !isNumericDate(payload.exp)) {
|
|
145
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidCredentialPayload };
|
|
146
|
+
}
|
|
147
|
+
const now = Math.floor(policy.now().getTime() / 1000);
|
|
148
|
+
const iat = payload.iat;
|
|
149
|
+
const nbf = payload.nbf;
|
|
150
|
+
const exp = payload.exp;
|
|
151
|
+
if ((iat !== undefined && iat > now + clockToleranceSeconds) ||
|
|
152
|
+
(nbf !== undefined && nbf > now + clockToleranceSeconds) ||
|
|
153
|
+
(exp !== undefined && exp <= now - clockToleranceSeconds) ||
|
|
154
|
+
(iat !== undefined && exp !== undefined && iat >= exp) ||
|
|
155
|
+
(nbf !== undefined && exp !== undefined && nbf >= exp)) {
|
|
156
|
+
return { success: false, error: error_1.CredentialVerificationError.ExpiredCredential };
|
|
157
|
+
}
|
|
158
|
+
return { success: true, value: true };
|
|
159
|
+
}
|
|
160
|
+
function validateDisclosureGraph(value, disclosuresByDigest, usedDigests, isRoot) {
|
|
161
|
+
if (Array.isArray(value)) {
|
|
162
|
+
for (const item of value) {
|
|
163
|
+
if (isObject(item) && typeof item["..."] === "string") {
|
|
164
|
+
if (Object.keys(item).length !== 1)
|
|
165
|
+
return false;
|
|
166
|
+
const digest = item["..."];
|
|
167
|
+
const disclosure = disclosuresByDigest.get(digest);
|
|
168
|
+
if (!disclosure)
|
|
169
|
+
continue;
|
|
170
|
+
if (usedDigests.has(digest) || disclosure.key !== undefined)
|
|
171
|
+
return false;
|
|
172
|
+
usedDigests.add(digest);
|
|
173
|
+
if (!validateDisclosureGraph(disclosure.value, disclosuresByDigest, usedDigests, false)) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else if (!validateDisclosureGraph(item, disclosuresByDigest, usedDigests, false)) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
if (!isObject(value))
|
|
184
|
+
return true;
|
|
185
|
+
if (!isRoot && "_sd_alg" in value)
|
|
186
|
+
return false;
|
|
187
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
188
|
+
if (key !== "_sd") {
|
|
189
|
+
if (!validateDisclosureGraph(nested, disclosuresByDigest, usedDigests, false))
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (value._sd === undefined)
|
|
194
|
+
return true;
|
|
195
|
+
if (!Array.isArray(value._sd) ||
|
|
196
|
+
value._sd.some((digest) => typeof digest !== "string" || !digest) ||
|
|
197
|
+
new Set(value._sd).size !== value._sd.length) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
const disclosedKeys = new Set();
|
|
201
|
+
for (const digest of value._sd) {
|
|
202
|
+
const disclosure = disclosuresByDigest.get(digest);
|
|
203
|
+
if (!disclosure)
|
|
204
|
+
continue;
|
|
205
|
+
if (usedDigests.has(digest) ||
|
|
206
|
+
typeof disclosure.key !== "string" ||
|
|
207
|
+
!disclosure.key ||
|
|
208
|
+
RESERVED_DISCLOSURE_KEYS.has(disclosure.key) ||
|
|
209
|
+
disclosure.key in value ||
|
|
210
|
+
disclosedKeys.has(disclosure.key) ||
|
|
211
|
+
(isRoot && NON_DISCLOSABLE_ROOT_CLAIMS.has(disclosure.key))) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
disclosedKeys.add(disclosure.key);
|
|
215
|
+
usedDigests.add(digest);
|
|
216
|
+
if (!validateDisclosureGraph(disclosure.value, disclosuresByDigest, usedDigests, false)) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
function validateDisclosures(args) {
|
|
223
|
+
const disclosureAlgorithm = typeof args.payload._sd_alg === "string" ? args.payload._sd_alg : "sha-256";
|
|
224
|
+
if (!args.policy.allowedDisclosureAlgorithms.includes(disclosureAlgorithm)) {
|
|
225
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidDisclosures };
|
|
226
|
+
}
|
|
227
|
+
if (new Set(args.rawDisclosures).size !== args.rawDisclosures.length) {
|
|
228
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidDisclosures };
|
|
229
|
+
}
|
|
230
|
+
const disclosuresByDigest = new Map();
|
|
231
|
+
for (const disclosure of args.sdJwt.disclosures ?? []) {
|
|
232
|
+
if (!disclosure._digest || disclosuresByDigest.has(disclosure._digest)) {
|
|
233
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidDisclosures };
|
|
234
|
+
}
|
|
235
|
+
disclosuresByDigest.set(disclosure._digest, disclosure);
|
|
236
|
+
}
|
|
237
|
+
const usedDigests = new Set();
|
|
238
|
+
if (!validateDisclosureGraph(args.payload, disclosuresByDigest, usedDigests, true) ||
|
|
239
|
+
usedDigests.size !== disclosuresByDigest.size) {
|
|
240
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidDisclosures };
|
|
241
|
+
}
|
|
242
|
+
if (!args.payload._sd &&
|
|
243
|
+
args.rawDisclosures.length > 0) {
|
|
244
|
+
return { success: false, error: error_1.CredentialVerificationError.InvalidDisclosures };
|
|
245
|
+
}
|
|
246
|
+
return { success: true, value: true };
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU0RKV1RWQ1ZhbGlkYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY3JlZGVudGlhbC12ZXJpZmllcnMvU0RKV1RWQ1ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2REEsZ0ZBc0NDO0FBRUQsc0RBNkNDO0FBVUQsNERBdUJDO0FBRUQsOERBZ0RDO0FBb0VELGtEQW9DQztBQTNVRCxvQ0FBdUQ7QUFDdkQsb0NBQThEO0FBRTlELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFVLENBQUM7QUFDdEYsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMzQyxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLGVBQWU7SUFDZixRQUFRO0NBQ1IsQ0FBQyxDQUFDO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQThDcEUsU0FBZ0Isa0NBQWtDLENBQ2pELFNBQW9DLEVBQUU7SUFFdEMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsdUJBQXVCLElBQUk7UUFDakUsa0NBQTBCLENBQUMsUUFBUTtRQUNuQyxrQ0FBMEIsQ0FBQyxRQUFRO0tBQ25DLENBQUM7SUFDRixNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLElBQUksR0FBRyxDQUFDO0lBRTVELEtBQUssTUFBTSxDQUFD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
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Context, CredentialVerifier, HttpClient, PublicKeyResolverEngineI } from "../interfaces";
|
|
2
|
+
import type { TokenStatusListVerifierI } from "../status/TokenStatusListVerifier";
|
|
3
|
+
import { type X509ChainVerifierI } from "../x509/X509ChainVerifier";
|
|
4
|
+
import { SDJWTVCVerificationPolicy } from "./SDJWTVCValidation";
|
|
5
|
+
export { deriveHolderAlgorithm } from "./SDJWTVCValidation";
|
|
6
|
+
export type { KbJwtReplayGuard, KbJwtReplayInput, SDJWTVCVerificationPolicy, } from "./SDJWTVCValidation";
|
|
7
|
+
export declare function SDJWTVCVerifier(args: {
|
|
8
|
+
context: Context;
|
|
9
|
+
pkResolverEngine: PublicKeyResolverEngineI;
|
|
10
|
+
httpClient: HttpClient;
|
|
11
|
+
policy?: SDJWTVCVerificationPolicy;
|
|
12
|
+
statusListVerifier?: TokenStatusListVerifierI;
|
|
13
|
+
x509ChainVerifier?: X509ChainVerifierI;
|
|
14
|
+
}): CredentialVerifier;
|
|
15
|
+
//# sourceMappingURL=SDJWTVCVerifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SDJWTVCVerifier.d.ts","sourceRoot":"","sources":["../../src/credential-verifiers/SDJWTVCVerifier.ts"],"names":[],"mappings":"AAUA,OAAO,EACN,OAAO,EAEP,kBAAkB,EAClB,UAAU,EACV,wBAAwB,EACxB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAEN,KAAK,kBAAkB,EACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGN,yBAAyB,EAIzB,MAAM,qBAAqB,CAAC;AAiD7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EACX,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;CACvC,GAAG,kBAAkB,CA4YrB"}
|