@credo-ts/openid4vc 0.6.0-pr-2195-20250322195244 → 0.6.0-pr-2324-20250625125220
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/build/openid4vc-holder/OpenId4VcHolderApi.d.ts +10 -6
- package/build/openid4vc-holder/OpenId4VcHolderApi.js +2 -4
- package/build/openid4vc-holder/OpenId4VcHolderApi.js.map +1 -1
- package/build/openid4vc-holder/OpenId4VciHolderService.d.ts +14 -19
- package/build/openid4vc-holder/OpenId4VciHolderService.js +425 -203
- package/build/openid4vc-holder/OpenId4VciHolderService.js.map +1 -1
- package/build/openid4vc-holder/OpenId4VciHolderServiceOptions.d.ts +117 -37
- package/build/openid4vc-holder/OpenId4VciHolderServiceOptions.js +1 -0
- package/build/openid4vc-holder/OpenId4VciHolderServiceOptions.js.map +1 -1
- package/build/openid4vc-holder/OpenId4vpHolderService.js +24 -15
- package/build/openid4vc-holder/OpenId4vpHolderService.js.map +1 -1
- package/build/openid4vc-issuer/OpenId4VcIssuerModuleConfig.d.ts +21 -0
- package/build/openid4vc-issuer/OpenId4VcIssuerModuleConfig.js +11 -0
- package/build/openid4vc-issuer/OpenId4VcIssuerModuleConfig.js.map +1 -1
- package/build/openid4vc-issuer/OpenId4VcIssuerService.d.ts +7 -3
- package/build/openid4vc-issuer/OpenId4VcIssuerService.js +387 -167
- package/build/openid4vc-issuer/OpenId4VcIssuerService.js.map +1 -1
- package/build/openid4vc-issuer/OpenId4VcIssuerServiceOptions.d.ts +67 -27
- package/build/openid4vc-issuer/index.d.ts +1 -1
- package/build/openid4vc-issuer/index.js +2 -1
- package/build/openid4vc-issuer/index.js.map +1 -1
- package/build/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.d.ts +29 -5
- package/build/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.js +2 -0
- package/build/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.js.map +1 -1
- package/build/openid4vc-issuer/repository/OpenId4VcIssuerRecord.d.ts +12 -7
- package/build/openid4vc-issuer/repository/OpenId4VcIssuerRecord.js +15 -3
- package/build/openid4vc-issuer/repository/OpenId4VcIssuerRecord.js.map +1 -1
- package/build/openid4vc-issuer/router/accessTokenEndpoint.js +41 -13
- package/build/openid4vc-issuer/router/accessTokenEndpoint.js.map +1 -1
- package/build/openid4vc-issuer/router/authorizationChallengeEndpoint.js +102 -33
- package/build/openid4vc-issuer/router/authorizationChallengeEndpoint.js.map +1 -1
- package/build/openid4vc-issuer/router/credentialEndpoint.js +42 -10
- package/build/openid4vc-issuer/router/credentialEndpoint.js.map +1 -1
- package/build/openid4vc-issuer/router/jwksEndpoint.js +2 -2
- package/build/openid4vc-issuer/router/jwksEndpoint.js.map +1 -1
- package/build/openid4vc-issuer/util/txCode.d.ts +1 -1
- package/build/openid4vc-issuer/util/txCode.js +3 -1
- package/build/openid4vc-issuer/util/txCode.js.map +1 -1
- package/build/openid4vc-verifier/OpenId4VpVerifierService.d.ts +1 -1
- package/build/openid4vc-verifier/OpenId4VpVerifierService.js +70 -65
- package/build/openid4vc-verifier/OpenId4VpVerifierService.js.map +1 -1
- package/build/openid4vc-verifier/OpenId4VpVerifierServiceOptions.d.ts +7 -1
- package/build/shared/callbacks.d.ts +6 -4
- package/build/shared/callbacks.js +212 -69
- package/build/shared/callbacks.js.map +1 -1
- package/build/shared/models/CredentialHolderBinding.d.ts +65 -11
- package/build/shared/models/OpenId4VcJwtIssuer.d.ts +10 -5
- package/build/shared/models/OpenId4VciCredentialFormatProfile.d.ts +1 -0
- package/build/shared/models/OpenId4VciCredentialFormatProfile.js +1 -0
- package/build/shared/models/OpenId4VciCredentialFormatProfile.js.map +1 -1
- package/build/shared/router/tenants.js +2 -2
- package/build/shared/router/tenants.js.map +1 -1
- package/build/shared/utils.d.ts +4 -9
- package/build/shared/utils.js +27 -44
- package/build/shared/utils.js.map +1 -1
- package/package.json +14 -14
|
@@ -7,101 +7,237 @@ exports.getOid4vcJwtSignCallback = getOid4vcJwtSignCallback;
|
|
|
7
7
|
exports.getOid4vcCallbacks = getOid4vcCallbacks;
|
|
8
8
|
exports.dynamicOid4vciClientAuthentication = dynamicOid4vciClientAuthentication;
|
|
9
9
|
const core_1 = require("@credo-ts/core");
|
|
10
|
+
const core_2 = require("@credo-ts/core");
|
|
10
11
|
const oauth2_1 = require("@openid4vc/oauth2");
|
|
11
12
|
const utils_1 = require("./utils");
|
|
12
13
|
function getOid4vcJwtVerifyCallback(agentContext, options) {
|
|
13
|
-
const jwsService = agentContext.dependencyManager.resolve(
|
|
14
|
+
const jwsService = agentContext.dependencyManager.resolve(core_2.JwsService);
|
|
14
15
|
return async (signer, { compact, header, payload }) => {
|
|
15
16
|
let trustedCertificates = options?.trustedCertificates;
|
|
16
17
|
if (signer.method === 'x5c' &&
|
|
17
18
|
(header.typ === 'oauth-authz-req+jwt' || options?.isAuthorizationRequestJwt) &&
|
|
18
19
|
!trustedCertificates) {
|
|
19
|
-
const x509Config = agentContext.dependencyManager.resolve(
|
|
20
|
-
const certificateChain = signer.x5c?.map((cert) =>
|
|
20
|
+
const x509Config = agentContext.dependencyManager.resolve(core_2.X509ModuleConfig);
|
|
21
|
+
const certificateChain = signer.x5c?.map((cert) => core_2.X509Certificate.fromEncodedCertificate(cert));
|
|
21
22
|
trustedCertificates = await x509Config.getTrustedCertificatesForVerification?.(agentContext, {
|
|
22
23
|
certificateChain,
|
|
23
24
|
verification: {
|
|
24
25
|
type: 'oauth2SecuredAuthorizationRequest',
|
|
25
26
|
authorizationRequest: {
|
|
26
27
|
jwt: compact,
|
|
27
|
-
payload:
|
|
28
|
+
payload: core_2.JwtPayload.fromJson(payload),
|
|
28
29
|
},
|
|
29
30
|
},
|
|
30
31
|
});
|
|
31
32
|
}
|
|
32
|
-
|
|
33
|
+
if (signer.method === 'x5c' &&
|
|
34
|
+
(header.typ === 'keyattestation+jwt' || header.typ === 'key-attestation+jwt') &&
|
|
35
|
+
options?.issuanceSessionId &&
|
|
36
|
+
!trustedCertificates) {
|
|
37
|
+
const x509Config = agentContext.dependencyManager.resolve(core_2.X509ModuleConfig);
|
|
38
|
+
const certificateChain = signer.x5c?.map((cert) => core_2.X509Certificate.fromEncodedCertificate(cert));
|
|
39
|
+
trustedCertificates = await x509Config.getTrustedCertificatesForVerification?.(agentContext, {
|
|
40
|
+
certificateChain,
|
|
41
|
+
verification: {
|
|
42
|
+
type: 'openId4VciKeyAttestation',
|
|
43
|
+
openId4VcIssuanceSessionId: options.issuanceSessionId,
|
|
44
|
+
keyAttestation: {
|
|
45
|
+
jwt: compact,
|
|
46
|
+
payload: core_2.JwtPayload.fromJson(payload),
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (signer.method === 'x5c' &&
|
|
52
|
+
header.typ === 'oauth-client-attestation+jwt' &&
|
|
53
|
+
options?.issuanceSessionId &&
|
|
54
|
+
!trustedCertificates) {
|
|
55
|
+
const x509Config = agentContext.dependencyManager.resolve(core_2.X509ModuleConfig);
|
|
56
|
+
const certificateChain = signer.x5c?.map((cert) => core_2.X509Certificate.fromEncodedCertificate(cert));
|
|
57
|
+
trustedCertificates = await x509Config.getTrustedCertificatesForVerification?.(agentContext, {
|
|
58
|
+
certificateChain,
|
|
59
|
+
verification: {
|
|
60
|
+
type: 'oauth2ClientAttestation',
|
|
61
|
+
openId4VcIssuanceSessionId: options.issuanceSessionId,
|
|
62
|
+
clientAttestation: {
|
|
63
|
+
jwt: compact,
|
|
64
|
+
payload: core_2.JwtPayload.fromJson(payload),
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const alg = signer.alg;
|
|
70
|
+
if (!Object.values(core_1.Kms.KnownJwaSignatureAlgorithms).includes(alg)) {
|
|
71
|
+
throw new core_2.CredoError(`Unsupported jwa signatre algorithm '${alg}'`);
|
|
72
|
+
}
|
|
73
|
+
const jwsSigner = signer.method === 'did'
|
|
74
|
+
? {
|
|
75
|
+
method: 'did',
|
|
76
|
+
didUrl: signer.didUrl,
|
|
77
|
+
jwk: await (0, utils_1.getPublicJwkFromDid)(agentContext, signer.didUrl),
|
|
78
|
+
}
|
|
79
|
+
: signer.method === 'jwk'
|
|
80
|
+
? {
|
|
81
|
+
method: 'jwk',
|
|
82
|
+
jwk: core_1.Kms.PublicJwk.fromUnknown(signer.publicJwk),
|
|
83
|
+
}
|
|
84
|
+
: signer.method === 'x5c'
|
|
85
|
+
? {
|
|
86
|
+
method: 'x5c',
|
|
87
|
+
x5c: signer.x5c,
|
|
88
|
+
jwk: core_2.X509Certificate.fromEncodedCertificate(signer.x5c[0]).publicJwk,
|
|
89
|
+
}
|
|
90
|
+
: undefined;
|
|
91
|
+
if (!jwsSigner) {
|
|
92
|
+
throw new core_2.CredoError(`Unable to verify jws with unsupported jws signer method '${signer.method}'`);
|
|
93
|
+
}
|
|
94
|
+
const { isValid, jwsSigners } = await jwsService.verifyJws(agentContext, {
|
|
33
95
|
jws: compact,
|
|
34
96
|
trustedCertificates,
|
|
35
|
-
|
|
36
|
-
jwkResolver: async () => {
|
|
37
|
-
if (signer.method === 'jwk') {
|
|
38
|
-
return (0, core_1.getJwkFromJson)(signer.publicJwk);
|
|
39
|
-
}
|
|
40
|
-
if (signer.method === 'did') {
|
|
41
|
-
const key = await (0, utils_1.getKeyFromDid)(agentContext, signer.didUrl);
|
|
42
|
-
return (0, core_1.getJwkFromKey)(key);
|
|
43
|
-
}
|
|
44
|
-
throw new core_1.CredoError(`Unexpected call to jwk resolver for signer method ${signer.method}`);
|
|
45
|
-
},
|
|
97
|
+
jwsSigner,
|
|
46
98
|
});
|
|
47
99
|
if (!isValid) {
|
|
48
100
|
return { verified: false, signerJwk: undefined };
|
|
49
101
|
}
|
|
50
|
-
const
|
|
51
|
-
const signerJwk = (0, core_1.getJwkFromKey)(signerKey).toJson();
|
|
52
|
-
if (signer.method === 'did') {
|
|
53
|
-
signerJwk.kid = signer.didUrl;
|
|
54
|
-
}
|
|
102
|
+
const signerJwk = jwsSigners[0].jwk.toJson();
|
|
55
103
|
return { verified: true, signerJwk };
|
|
56
104
|
};
|
|
57
105
|
}
|
|
58
106
|
function getOid4vcEncryptJweCallback(agentContext) {
|
|
107
|
+
const kms = agentContext.dependencyManager.resolve(core_1.Kms.KeyManagementApi);
|
|
59
108
|
return async (jweEncryptor, compact) => {
|
|
60
109
|
if (jweEncryptor.method !== 'jwk') {
|
|
61
|
-
throw new
|
|
110
|
+
throw new core_2.CredoError(`Jwt encryption method '${jweEncryptor.method}' is not supported for jwt signer. Only 'jwk' is supported.`);
|
|
111
|
+
}
|
|
112
|
+
// TODO: we should probably add a key id or ference to the jweEncryptor/jwsSigner in
|
|
113
|
+
// oid4vc-ts so we can keep a reference to the key
|
|
114
|
+
const jwk = core_1.Kms.PublicJwk.fromUnknown(jweEncryptor.publicJwk);
|
|
115
|
+
if (!jwk.hasKeyId) {
|
|
116
|
+
throw new core_2.CredoError('Expected kid to be defined on the JWK');
|
|
62
117
|
}
|
|
63
|
-
const jwk = (0, core_1.getJwkFromJson)(jweEncryptor.publicJwk);
|
|
64
|
-
const key = jwk.key;
|
|
65
118
|
if (jweEncryptor.alg !== 'ECDH-ES') {
|
|
66
|
-
throw new
|
|
119
|
+
throw new core_2.CredoError("Only 'ECDH-ES' is supported as 'alg' value for JARM response encryption");
|
|
67
120
|
}
|
|
68
121
|
if (jweEncryptor.enc !== 'A256GCM' && jweEncryptor.enc !== 'A128GCM' && jweEncryptor.enc !== 'A128CBC-HS256') {
|
|
69
|
-
throw new
|
|
122
|
+
throw new core_2.CredoError("Only 'A256GCM', 'A128GCM', and 'A128CBC-HS256' is supported as 'enc' value for JARM response encryption");
|
|
70
123
|
}
|
|
71
|
-
|
|
72
|
-
|
|
124
|
+
const jwkJson = jwk.toJson();
|
|
125
|
+
if (jwkJson.kty !== 'EC' && jwkJson.kty !== 'OKP') {
|
|
126
|
+
throw new core_2.CredoError(`Expected EC or OKP jwk for encryption, found ${core_1.Kms.getJwkHumanDescription(jwkJson)}`);
|
|
73
127
|
}
|
|
74
|
-
if (
|
|
75
|
-
throw new
|
|
128
|
+
if (jwkJson.crv === 'Ed25519') {
|
|
129
|
+
throw new core_2.CredoError(`Expected ${jwkJson.kty} with crv X25519, found ${core_1.Kms.getJwkHumanDescription(jwkJson)}`);
|
|
76
130
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
header: { kid: jweEncryptor.publicJwk.kid },
|
|
81
|
-
encryptionAlgorithm: jweEncryptor.enc,
|
|
82
|
-
apu: jweEncryptor.apu ? core_1.TypedArrayEncoder.toBase64URL(core_1.TypedArrayEncoder.fromString(jweEncryptor.apu)) : undefined,
|
|
83
|
-
apv: jweEncryptor.apv ? core_1.TypedArrayEncoder.toBase64URL(core_1.TypedArrayEncoder.fromString(jweEncryptor.apv)) : undefined,
|
|
131
|
+
// TODO: create a JWE service that handles this
|
|
132
|
+
const ephmeralKey = await kms.createKey({
|
|
133
|
+
type: jwkJson,
|
|
84
134
|
});
|
|
85
|
-
|
|
135
|
+
try {
|
|
136
|
+
const header = {
|
|
137
|
+
kid: jweEncryptor.publicJwk.kid,
|
|
138
|
+
apu: jweEncryptor.apu,
|
|
139
|
+
apv: jweEncryptor.apv,
|
|
140
|
+
enc: jweEncryptor.enc,
|
|
141
|
+
alg: 'ECDH-ES',
|
|
142
|
+
epk: ephmeralKey.publicJwk,
|
|
143
|
+
};
|
|
144
|
+
const encodedHeader = core_2.JsonEncoder.toBase64URL(header);
|
|
145
|
+
const encrypted = await kms.encrypt({
|
|
146
|
+
key: {
|
|
147
|
+
keyAgreement: {
|
|
148
|
+
// FIXME: We can make the keyId optional for ECDH-ES
|
|
149
|
+
// That way we don't have to store the key
|
|
150
|
+
keyId: ephmeralKey.keyId,
|
|
151
|
+
algorithm: 'ECDH-ES',
|
|
152
|
+
apu: jweEncryptor.apu ? core_2.TypedArrayEncoder.fromBase64(jweEncryptor.apu) : undefined,
|
|
153
|
+
apv: jweEncryptor.apv ? core_2.TypedArrayEncoder.fromBase64(jweEncryptor.apv) : undefined,
|
|
154
|
+
externalPublicJwk: jwkJson,
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
data: core_2.Buffer.from(compact),
|
|
158
|
+
encryption: {
|
|
159
|
+
algorithm: jweEncryptor.enc,
|
|
160
|
+
aad: core_2.Buffer.from(encodedHeader),
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
if (!encrypted.iv || !encrypted.tag) {
|
|
164
|
+
throw new core_2.CredoError("Expected 'iv' and 'tag' to be defined");
|
|
165
|
+
}
|
|
166
|
+
const compactJwe = `${encodedHeader}..${core_2.TypedArrayEncoder.toBase64URL(encrypted.iv)}.${core_2.TypedArrayEncoder.toBase64URL(encrypted.encrypted)}.${core_2.TypedArrayEncoder.toBase64URL(encrypted.tag)}`;
|
|
167
|
+
return { encryptionJwk: jweEncryptor.publicJwk, jwe: compactJwe };
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
// Delete the key
|
|
171
|
+
await kms.deleteKey({
|
|
172
|
+
keyId: ephmeralKey.keyId,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
86
175
|
};
|
|
87
176
|
}
|
|
88
177
|
function getOid4vcDecryptJweCallback(agentContext) {
|
|
178
|
+
const kms = agentContext.resolve(core_1.Kms.KeyManagementApi);
|
|
89
179
|
return async (jwe, options) => {
|
|
180
|
+
// TODO: use custom header zod schema to limit which algorithms can be used
|
|
90
181
|
const { header } = (0, oauth2_1.decodeJwtHeader)({ jwt: jwe });
|
|
91
|
-
|
|
182
|
+
let kid = options?.jwk?.kid ?? header.kid;
|
|
92
183
|
if (!kid) {
|
|
93
|
-
throw new
|
|
184
|
+
throw new core_2.CredoError('Uanbel to decrypt jwe. No kid or jwk found');
|
|
94
185
|
}
|
|
95
|
-
|
|
96
|
-
if (
|
|
97
|
-
|
|
186
|
+
// Previously we used the fingerprint as the kid for JARM
|
|
187
|
+
// We try to parse it as fingerprint if it starts with z (base58 encoding)
|
|
188
|
+
// It's not 100%
|
|
189
|
+
if (kid.startsWith('z')) {
|
|
190
|
+
try {
|
|
191
|
+
const publicJwk = core_1.Kms.PublicJwk.fromFingerprint(kid);
|
|
192
|
+
if (publicJwk)
|
|
193
|
+
kid = publicJwk.legacyKeyId;
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// no-op
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// TODO: decodeJwe method in oid4vc-ts
|
|
200
|
+
// encryption key is not used (we don't use key wrapping)
|
|
201
|
+
const [encodedHeader /* encryptionKey */, , encodedIv, encodedCiphertext, encodedTag] = jwe.split('.');
|
|
202
|
+
if (header.alg !== 'ECDH-ES') {
|
|
203
|
+
throw new core_2.CredoError("Only 'ECDH-ES' is supported as 'alg' value for JARM response decryption");
|
|
204
|
+
}
|
|
205
|
+
if (header.enc !== 'A256GCM' && header.enc !== 'A128GCM' && header.enc !== 'A128CBC-HS256') {
|
|
206
|
+
throw new core_2.CredoError("Only 'A256GCM', 'A128GCM', and 'A128CBC-HS256' is supported as 'enc' value for JARM response decryption");
|
|
98
207
|
}
|
|
99
208
|
let decryptedPayload;
|
|
209
|
+
let publicJwk;
|
|
210
|
+
const epk = core_1.Kms.PublicJwk.fromUnknown(header.epk);
|
|
100
211
|
try {
|
|
101
|
-
const decrypted = await
|
|
102
|
-
|
|
212
|
+
const decrypted = await kms.decrypt({
|
|
213
|
+
encrypted: core_2.TypedArrayEncoder.fromBase64(encodedCiphertext),
|
|
214
|
+
decryption: {
|
|
215
|
+
algorithm: header.enc,
|
|
216
|
+
// aad is the base64 encoded bytes (not just the bytes)
|
|
217
|
+
aad: core_2.TypedArrayEncoder.fromString(encodedHeader),
|
|
218
|
+
iv: core_2.TypedArrayEncoder.fromBase64(encodedIv),
|
|
219
|
+
tag: core_2.TypedArrayEncoder.fromBase64(encodedTag),
|
|
220
|
+
},
|
|
221
|
+
key: {
|
|
222
|
+
keyAgreement: {
|
|
223
|
+
algorithm: header.alg,
|
|
224
|
+
externalPublicJwk: epk.toJson(),
|
|
225
|
+
keyId: kid,
|
|
226
|
+
apu: typeof header.apu === 'string' ? core_2.TypedArrayEncoder.fromBase64(header.apu) : undefined,
|
|
227
|
+
apv: typeof header.apv === 'string' ? core_2.TypedArrayEncoder.fromBase64(header.apv) : undefined,
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
// TODO: decrypt should return the public jwk instance
|
|
232
|
+
publicJwk = core_1.Kms.PublicJwk.fromUnknown(await kms.getPublicKey({
|
|
233
|
+
keyId: kid,
|
|
234
|
+
}));
|
|
235
|
+
decryptedPayload = core_2.TypedArrayEncoder.toUtf8String(decrypted.data);
|
|
103
236
|
}
|
|
104
|
-
catch (
|
|
237
|
+
catch (error) {
|
|
238
|
+
agentContext.config.logger.error('Error decrypting JWE', {
|
|
239
|
+
error,
|
|
240
|
+
});
|
|
105
241
|
return {
|
|
106
242
|
decrypted: false,
|
|
107
243
|
encryptionJwk: options?.jwk,
|
|
@@ -111,58 +247,65 @@ function getOid4vcDecryptJweCallback(agentContext) {
|
|
|
111
247
|
}
|
|
112
248
|
return {
|
|
113
249
|
decrypted: true,
|
|
114
|
-
decryptionJwk:
|
|
250
|
+
decryptionJwk: publicJwk.toJson(),
|
|
115
251
|
payload: decryptedPayload,
|
|
116
252
|
header,
|
|
117
253
|
};
|
|
118
254
|
};
|
|
119
255
|
}
|
|
120
256
|
function getOid4vcJwtSignCallback(agentContext) {
|
|
121
|
-
const jwsService = agentContext.dependencyManager.resolve(
|
|
257
|
+
const jwsService = agentContext.dependencyManager.resolve(core_2.JwsService);
|
|
122
258
|
return async (signer, { payload, header }) => {
|
|
123
|
-
if (signer.method === 'custom' || signer.method === '
|
|
124
|
-
throw new
|
|
259
|
+
if (signer.method === 'custom' || signer.method === 'federation') {
|
|
260
|
+
throw new core_2.CredoError(`Jwt signer method 'custom' and 'federation' are not supported for jwt signer.`);
|
|
125
261
|
}
|
|
126
262
|
if (signer.method === 'x5c') {
|
|
127
|
-
const leafCertificate =
|
|
263
|
+
const leafCertificate = core_2.X509Service.getLeafCertificate(agentContext, { certificateChain: signer.x5c });
|
|
128
264
|
const jws = await jwsService.createJwsCompact(agentContext, {
|
|
129
265
|
protectedHeaderOptions: { ...header, alg: signer.alg, jwk: undefined },
|
|
130
|
-
payload:
|
|
131
|
-
|
|
266
|
+
payload: core_2.JwtPayload.fromJson(payload),
|
|
267
|
+
keyId: signer.kid ?? leafCertificate.publicJwk.keyId,
|
|
132
268
|
});
|
|
133
|
-
return { jwt: jws, signerJwk:
|
|
269
|
+
return { jwt: jws, signerJwk: leafCertificate.publicJwk.toJson() };
|
|
134
270
|
}
|
|
135
|
-
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
271
|
+
// TOOD: createJwsCompact should return the Jwk, so we don't have to reoslve it here
|
|
272
|
+
const publicJwk = signer.method === 'did'
|
|
273
|
+
? await (0, utils_1.getPublicJwkFromDid)(agentContext, signer.didUrl)
|
|
274
|
+
: core_1.Kms.PublicJwk.fromUnknown(signer.publicJwk);
|
|
275
|
+
if (!publicJwk.supportedSignatureAlgorithms.includes(signer.alg)) {
|
|
276
|
+
throw new core_2.CredoError(`jwk ${publicJwk.jwkTypehumanDescription} does not support JWS signature alg '${signer.alg}'`);
|
|
139
277
|
}
|
|
140
278
|
const jwt = await jwsService.createJwsCompact(agentContext, {
|
|
141
279
|
protectedHeaderOptions: {
|
|
142
280
|
...header,
|
|
143
|
-
jwk: header.jwk ?
|
|
281
|
+
jwk: header.jwk ? publicJwk : undefined,
|
|
282
|
+
alg: signer.alg,
|
|
144
283
|
},
|
|
145
|
-
payload:
|
|
146
|
-
|
|
284
|
+
payload: core_2.JsonEncoder.toBuffer(payload),
|
|
285
|
+
keyId: signer.kid ?? publicJwk.keyId,
|
|
147
286
|
});
|
|
148
|
-
return { jwt, signerJwk:
|
|
287
|
+
return { jwt, signerJwk: publicJwk.toJson() };
|
|
149
288
|
};
|
|
150
289
|
}
|
|
151
290
|
function getOid4vcCallbacks(agentContext, options) {
|
|
291
|
+
const kms = agentContext.resolve(core_1.Kms.KeyManagementApi);
|
|
152
292
|
return {
|
|
153
|
-
hash: (data, alg) =>
|
|
154
|
-
generateRandom: (length) =>
|
|
293
|
+
hash: (data, alg) => core_2.Hasher.hash(data, alg.toLowerCase()),
|
|
294
|
+
generateRandom: (length) => kms.randomBytes({ length }),
|
|
155
295
|
signJwt: getOid4vcJwtSignCallback(agentContext),
|
|
156
|
-
clientAuthentication: (
|
|
296
|
+
clientAuthentication: () => {
|
|
297
|
+
throw new core_2.CredoError('Did not expect client authentication to be called.');
|
|
298
|
+
},
|
|
157
299
|
verifyJwt: getOid4vcJwtVerifyCallback(agentContext, {
|
|
158
300
|
trustedCertificates: options?.trustedCertificates,
|
|
159
301
|
isAuthorizationRequestJwt: options?.isVerifyOpenId4VpAuthorizationRequest,
|
|
302
|
+
issuanceSessionId: options?.issuanceSessionId,
|
|
160
303
|
}),
|
|
161
304
|
fetch: agentContext.config.agentDependencies.fetch,
|
|
162
305
|
encryptJwe: getOid4vcEncryptJweCallback(agentContext),
|
|
163
306
|
decryptJwe: getOid4vcDecryptJweCallback(agentContext),
|
|
164
307
|
getX509CertificateMetadata: (certificate) => {
|
|
165
|
-
const leafCertificate =
|
|
308
|
+
const leafCertificate = core_2.X509Service.getLeafCertificate(agentContext, { certificateChain: [certificate] });
|
|
166
309
|
return {
|
|
167
310
|
sanDnsNames: leafCertificate.sanDnsNames,
|
|
168
311
|
sanUriNames: leafCertificate.sanUriNames,
|
|
@@ -176,14 +319,14 @@ function getOid4vcCallbacks(agentContext, options) {
|
|
|
176
319
|
*/
|
|
177
320
|
function dynamicOid4vciClientAuthentication(agentContext, issuerRecord) {
|
|
178
321
|
return (callbackOptions) => {
|
|
179
|
-
const authorizationServer = issuerRecord.authorizationServerConfigs?.find((a) => a.issuer === callbackOptions.
|
|
322
|
+
const authorizationServer = issuerRecord.authorizationServerConfigs?.find((a) => a.issuer === callbackOptions.authorizationServerMetadata.issuer);
|
|
180
323
|
if (!authorizationServer) {
|
|
181
324
|
// No client authentication if authorization server is not configured
|
|
182
|
-
agentContext.config.logger.debug(`Unknown authorization server '${callbackOptions.
|
|
325
|
+
agentContext.config.logger.debug(`Unknown authorization server '${callbackOptions.authorizationServerMetadata.issuer}' for issuer '${issuerRecord.issuerId}' for request to '${callbackOptions.url}'`);
|
|
183
326
|
return;
|
|
184
327
|
}
|
|
185
328
|
if (!authorizationServer.clientAuthentication) {
|
|
186
|
-
throw new
|
|
329
|
+
throw new core_2.CredoError(`Unable to authenticate to authorization server '${authorizationServer.issuer}' for issuer '${issuerRecord.issuerId}' for request to '${callbackOptions.url}'. Make sure to configure a 'clientId' and 'clientSecret' for the authorization server on the issuer record.`);
|
|
187
330
|
}
|
|
188
331
|
return (0, oauth2_1.clientAuthenticationDynamic)({
|
|
189
332
|
clientId: authorizationServer.clientAuthentication.clientId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../src/shared/callbacks.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../src/shared/callbacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,67 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { Kms } from '@credo-ts/core';
|
|
2
|
+
import { Openid4vciIssuer } from '@openid4vc/openid4vci';
|
|
3
|
+
type VerifiedCredentialRequestAttestationProof = Awaited<ReturnType<InstanceType<typeof Openid4vciIssuer>['verifyCredentialRequestAttestationProof']>>;
|
|
4
|
+
type VerifiedCredentialRequestJwtProof = Awaited<ReturnType<InstanceType<typeof Openid4vciIssuer>['verifyCredentialRequestJwtProof']>>['keyAttestation'];
|
|
5
|
+
export type OpenId4VcCredentialHolderAttestationBinding = {
|
|
6
|
+
method: 'attestation';
|
|
7
|
+
/**
|
|
8
|
+
* The key attestation JWT to use to request issuance of the credentials based
|
|
9
|
+
* on the attested_keys.
|
|
10
|
+
*
|
|
11
|
+
* When the `keyAttestationJwt` contains a `nonce` payload value it will be sent
|
|
12
|
+
* as an `attestation` proof (without signing using a key in the attested key).
|
|
13
|
+
* NOTE that the `nonce` value must match with the `c_nonce` value from the issuer.
|
|
14
|
+
*
|
|
15
|
+
* If no nonce is provided, the `jwt` proof type will be used and the proof will be
|
|
16
|
+
* signed using the first key from the `attested_keys` array.
|
|
17
|
+
*/
|
|
18
|
+
keyAttestationJwt: string;
|
|
5
19
|
};
|
|
6
|
-
export
|
|
20
|
+
export interface OpenId4VcCredentialHolderDidBinding {
|
|
21
|
+
method: 'did';
|
|
22
|
+
didUrls: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface OpenId4VcCredentialHolderJwkBinding {
|
|
7
25
|
method: 'jwk';
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
export type
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
26
|
+
keys: Kms.PublicJwk[];
|
|
27
|
+
}
|
|
28
|
+
export type VerifiedOpenId4VcCredentialHolderBinding = {
|
|
29
|
+
proofType: 'jwt' | 'attestation';
|
|
30
|
+
/**
|
|
31
|
+
* The key attestation that was provided to attest the keys.
|
|
32
|
+
* Always defined if `proofType` is `attestation`, as well
|
|
33
|
+
* as when `key_attestations_required` is defined in the
|
|
34
|
+
* credential issuer metadata
|
|
35
|
+
*/
|
|
36
|
+
keyAttestation?: VerifiedCredentialRequestAttestationProof | VerifiedCredentialRequestJwtProof;
|
|
37
|
+
/**
|
|
38
|
+
* The binding method of the keys.
|
|
39
|
+
*
|
|
40
|
+
* Binding method `did` is only supported for proof type `jwt`.
|
|
41
|
+
*/
|
|
42
|
+
bindingMethod: 'did' | 'jwk';
|
|
43
|
+
} & ({
|
|
44
|
+
bindingMethod: 'did';
|
|
45
|
+
/**
|
|
46
|
+
* The DIDs that were provided as part of the `jwt` proofs in the credential request
|
|
47
|
+
*/
|
|
48
|
+
keys: Array<{
|
|
49
|
+
method: 'did';
|
|
50
|
+
jwk: Kms.PublicJwk;
|
|
51
|
+
didUrl: string;
|
|
52
|
+
}>;
|
|
53
|
+
} | {
|
|
54
|
+
bindingMethod: 'jwk';
|
|
55
|
+
/**
|
|
56
|
+
* The keys that were provided as part of the credential request proof.
|
|
57
|
+
* - If `proofType` is `attestation` these keys were extracted from the signed key attestation, but no proof was signed using one of the attested keys
|
|
58
|
+
* - If `proofType` is `jwt` and `attestation` is defined, the keys were extracted from the attestation, and proof was signed using one of the attested keys
|
|
59
|
+
* - Otherwise if `proofType` is `jwt` and no `attestation` is defined, the keys were not attested, and for each individual key a proof was signed using that key.
|
|
60
|
+
*/
|
|
61
|
+
keys: Array<{
|
|
62
|
+
method: 'jwk';
|
|
63
|
+
jwk: Kms.PublicJwk;
|
|
64
|
+
}>;
|
|
65
|
+
});
|
|
66
|
+
export type OpenId4VcCredentialHolderBinding = OpenId4VcCredentialHolderDidBinding | OpenId4VcCredentialHolderJwkBinding | OpenId4VcCredentialHolderAttestationBinding;
|
|
67
|
+
export {};
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Kms, X509Certificate } from '@credo-ts/core';
|
|
2
2
|
export interface OpenId4VcJwtIssuerDid {
|
|
3
3
|
method: 'did';
|
|
4
|
+
/**
|
|
5
|
+
* The did url pointing to a specific verification method.
|
|
6
|
+
*
|
|
7
|
+
* Note a created DID record MUST exist for the did url, enabling extraction of the KMS key id from the did record.
|
|
8
|
+
*/
|
|
4
9
|
didUrl: string;
|
|
5
10
|
}
|
|
6
11
|
export interface OpenId4VcIssuerX5c {
|
|
7
12
|
method: 'x5c';
|
|
8
13
|
/**
|
|
9
|
-
*
|
|
10
|
-
* Array of base64-encoded certificate strings in the DER-format.
|
|
14
|
+
* Array of X.509 certificates
|
|
11
15
|
*
|
|
12
16
|
* The certificate containing the public key corresponding to the key used to digitally sign the JWS MUST be the first certificate.
|
|
17
|
+
* The first certificate MUST also have a key id configured on the public key to enable signing with the KMS.
|
|
13
18
|
*/
|
|
14
|
-
x5c:
|
|
19
|
+
x5c: X509Certificate[];
|
|
15
20
|
/**
|
|
16
21
|
* The issuer of the JWT. Should be a HTTPS URI.
|
|
17
22
|
*
|
|
@@ -22,6 +27,6 @@ export interface OpenId4VcIssuerX5c {
|
|
|
22
27
|
}
|
|
23
28
|
export interface OpenId4VcJwtIssuerJwk {
|
|
24
29
|
method: 'jwk';
|
|
25
|
-
jwk:
|
|
30
|
+
jwk: Kms.PublicJwk;
|
|
26
31
|
}
|
|
27
32
|
export type OpenId4VcJwtIssuer = OpenId4VcJwtIssuerDid | OpenId4VcIssuerX5c | OpenId4VcJwtIssuerJwk;
|
|
@@ -7,6 +7,7 @@ var OpenId4VciCredentialFormatProfile;
|
|
|
7
7
|
OpenId4VciCredentialFormatProfile["JwtVcJsonLd"] = "jwt_vc_json-ld";
|
|
8
8
|
OpenId4VciCredentialFormatProfile["LdpVc"] = "ldp_vc";
|
|
9
9
|
OpenId4VciCredentialFormatProfile["SdJwtVc"] = "vc+sd-jwt";
|
|
10
|
+
OpenId4VciCredentialFormatProfile["SdJwtDc"] = "dc+sd-jwt";
|
|
10
11
|
OpenId4VciCredentialFormatProfile["MsoMdoc"] = "mso_mdoc";
|
|
11
12
|
})(OpenId4VciCredentialFormatProfile || (exports.OpenId4VciCredentialFormatProfile = OpenId4VciCredentialFormatProfile = {}));
|
|
12
13
|
//# sourceMappingURL=OpenId4VciCredentialFormatProfile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenId4VciCredentialFormatProfile.js","sourceRoot":"","sources":["../../../src/shared/models/OpenId4VciCredentialFormatProfile.ts"],"names":[],"mappings":";;;AAAA,IAAY,
|
|
1
|
+
{"version":3,"file":"OpenId4VciCredentialFormatProfile.js","sourceRoot":"","sources":["../../../src/shared/models/OpenId4VciCredentialFormatProfile.ts"],"names":[],"mappings":";;;AAAA,IAAY,iCAOX;AAPD,WAAY,iCAAiC;IAC3C,8DAAyB,CAAA;IACzB,mEAA8B,CAAA;IAC9B,qDAAgB,CAAA;IAChB,0DAAqB,CAAA;IACrB,0DAAqB,CAAA;IACrB,yDAAoB,CAAA;AACtB,CAAC,EAPW,iCAAiC,iDAAjC,iCAAiC,QAO5C"}
|
|
@@ -15,7 +15,7 @@ async function getAgentContextForActorId(rootAgentContext, actorId) {
|
|
|
15
15
|
});
|
|
16
16
|
if (tenant) {
|
|
17
17
|
const agentContextProvider = rootAgentContext.dependencyManager.resolve(core_1.InjectionSymbols.AgentContextProvider);
|
|
18
|
-
return agentContextProvider.getAgentContextForContextCorrelationId(tenant.id);
|
|
18
|
+
return agentContextProvider.getAgentContextForContextCorrelationId(`tenant-${tenant.id}`);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
return rootAgentContext;
|
|
@@ -37,7 +37,7 @@ async function storeActorIdForContextCorrelationId(agentContext, actorId) {
|
|
|
37
37
|
const tenantsApi = (0, core_1.getApiForModuleByName)(agentContext, 'TenantsModule');
|
|
38
38
|
// We don't want to query the tenant record if the current context is the root context
|
|
39
39
|
if (tenantsApi && tenantsApi.rootAgentContext.contextCorrelationId !== agentContext.contextCorrelationId) {
|
|
40
|
-
const tenantRecord = await tenantsApi.getTenantById(agentContext.contextCorrelationId);
|
|
40
|
+
const tenantRecord = await tenantsApi.getTenantById(agentContext.contextCorrelationId.replace('tenant-', ''));
|
|
41
41
|
const currentOpenId4VcActorIds = tenantRecord.metadata.get(OPENID4VC_ACTOR_IDS_METADATA_KEY) ?? [];
|
|
42
42
|
const openId4VcActorIds = [...currentOpenId4VcActorIds, actorId];
|
|
43
43
|
tenantRecord.metadata.set(OPENID4VC_ACTOR_IDS_METADATA_KEY, openId4VcActorIds);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../../src/shared/router/tenants.ts"],"names":[],"mappings":";;AAOA,8DAmBC;AAYD,kFAiBC;AApDD,yCAAwE;AAExE,MAAM,gCAAgC,GAAG,8BAA8B,CAAA;AAEhE,KAAK,UAAU,yBAAyB,CAAC,gBAA8B,EAAE,OAAe;IAC7F,uFAAuF;IACvF,oFAAoF;IACpF,uFAAuF;IACvF,MAAM,UAAU,GAAG,IAAA,4BAAqB,EAAgB,gBAAgB,EAAE,eAAe,CAAC,CAAA;IAC1F,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC;YACnD,CAAC,gCAAgC,CAAC,EAAE,CAAC,OAAO,CAAC;SAC9C,CAAC,CAAA;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,CACrE,uBAAgB,CAAC,oBAAoB,CACtC,CAAA;YACD,OAAO,oBAAoB,CAAC,sCAAsC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../../src/shared/router/tenants.ts"],"names":[],"mappings":";;AAOA,8DAmBC;AAYD,kFAiBC;AApDD,yCAAwE;AAExE,MAAM,gCAAgC,GAAG,8BAA8B,CAAA;AAEhE,KAAK,UAAU,yBAAyB,CAAC,gBAA8B,EAAE,OAAe;IAC7F,uFAAuF;IACvF,oFAAoF;IACpF,uFAAuF;IACvF,MAAM,UAAU,GAAG,IAAA,4BAAqB,EAAgB,gBAAgB,EAAE,eAAe,CAAC,CAAA;IAC1F,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC;YACnD,CAAC,gCAAgC,CAAC,EAAE,CAAC,OAAO,CAAC;SAC9C,CAAC,CAAA;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,CACrE,uBAAgB,CAAC,oBAAoB,CACtC,CAAA;YACD,OAAO,oBAAoB,CAAC,sCAAsC,CAAC,UAAU,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,mCAAmC,CAAC,YAA0B,EAAE,OAAe;IACnG,uGAAuG;IACvG,wGAAwG;IACxG,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAA,4BAAqB,EAAgB,YAAY,EAAE,eAAe,CAAC,CAAA;IAEtF,sFAAsF;IACtF,IAAI,UAAU,IAAI,UAAU,CAAC,gBAAgB,CAAC,oBAAoB,KAAK,YAAY,CAAC,oBAAoB,EAAE,CAAC;QACzG,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;QAE7G,MAAM,wBAAwB,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAW,gCAAgC,CAAC,IAAI,EAAE,CAAA;QAC5G,MAAM,iBAAiB,GAAG,CAAC,GAAG,wBAAwB,EAAE,OAAO,CAAC,CAAA;QAEhE,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,CAAA;QAC9E,YAAY,CAAC,MAAM,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,CAAA;QACxE,MAAM,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC"}
|
package/build/shared/utils.d.ts
CHANGED
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AgentContext, DidPurpose, Kms } from '@credo-ts/core';
|
|
2
2
|
import type { JwtSigner, JwtSignerX5c } from '@openid4vc/oauth2';
|
|
3
3
|
import type { OpenId4VcJwtIssuer } from './models';
|
|
4
4
|
/**
|
|
5
5
|
* Returns the JWA Signature Algorithms that are supported by the wallet.
|
|
6
|
-
*
|
|
7
|
-
* This is an approximation based on the supported key types of the wallet.
|
|
8
|
-
* This is not 100% correct as a supporting a key type does not mean you support
|
|
9
|
-
* all the algorithms for that key type. However, this needs refactoring of the wallet
|
|
10
|
-
* that is planned for the 0.5.0 release.
|
|
11
6
|
*/
|
|
12
|
-
export declare function getSupportedJwaSignatureAlgorithms(agentContext: AgentContext):
|
|
13
|
-
export declare function
|
|
7
|
+
export declare function getSupportedJwaSignatureAlgorithms(agentContext: AgentContext): Kms.KnownJwaSignatureAlgorithm[];
|
|
8
|
+
export declare function getPublicJwkFromDid(agentContext: AgentContext, didUrl: string, allowedPurposes?: DidPurpose[]): Promise<Kms.PublicJwk<import("@credo-ts/core/src/modules/kms/jwk/PublicJwk").SupportedPublicJwk>>;
|
|
14
9
|
export declare function requestSignerToJwtIssuer(agentContext: AgentContext, requestSigner: OpenId4VcJwtIssuer): Promise<Exclude<JwtSigner, JwtSignerX5c> | (JwtSignerX5c & {
|
|
15
10
|
issuer: string;
|
|
16
11
|
})>;
|
|
17
|
-
export declare function
|
|
12
|
+
export declare function getProofTypeFromPublicJwk(agentContext: AgentContext, key: Kms.PublicJwk): string;
|
|
18
13
|
export declare function addSecondsToDate(date: Date, seconds: number): Date;
|
|
19
14
|
export declare function dateToSeconds(date: Date): number;
|
|
20
15
|
export declare function parseIfJson<T>(input: T): T | Record<string, unknown>;
|