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,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"}