@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
package/build/shared/utils.js
CHANGED
|
@@ -1,66 +1,51 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getSupportedJwaSignatureAlgorithms = getSupportedJwaSignatureAlgorithms;
|
|
4
|
-
exports.
|
|
4
|
+
exports.getPublicJwkFromDid = getPublicJwkFromDid;
|
|
5
5
|
exports.requestSignerToJwtIssuer = requestSignerToJwtIssuer;
|
|
6
|
-
exports.
|
|
6
|
+
exports.getProofTypeFromPublicJwk = getProofTypeFromPublicJwk;
|
|
7
7
|
exports.addSecondsToDate = addSecondsToDate;
|
|
8
8
|
exports.dateToSeconds = dateToSeconds;
|
|
9
9
|
exports.parseIfJson = parseIfJson;
|
|
10
10
|
const core_1 = require("@credo-ts/core");
|
|
11
|
+
const core_2 = require("@credo-ts/core");
|
|
11
12
|
/**
|
|
12
13
|
* Returns the JWA Signature Algorithms that are supported by the wallet.
|
|
13
|
-
*
|
|
14
|
-
* This is an approximation based on the supported key types of the wallet.
|
|
15
|
-
* This is not 100% correct as a supporting a key type does not mean you support
|
|
16
|
-
* all the algorithms for that key type. However, this needs refactoring of the wallet
|
|
17
|
-
* that is planned for the 0.5.0 release.
|
|
18
14
|
*/
|
|
19
15
|
function getSupportedJwaSignatureAlgorithms(agentContext) {
|
|
20
|
-
const
|
|
21
|
-
//
|
|
22
|
-
const supportedJwaSignatureAlgorithms =
|
|
23
|
-
// Map the supported key types to the supported JWK class
|
|
24
|
-
.map(core_1.getJwkClassFromKeyType)
|
|
25
|
-
// Filter out the undefined values
|
|
26
|
-
.filter((jwkClass) => jwkClass !== undefined)
|
|
27
|
-
// Extract the supported JWA signature algorithms from the JWK class
|
|
28
|
-
.flatMap((jwkClass) => jwkClass.supportedSignatureAlgorithms);
|
|
16
|
+
const kms = agentContext.resolve(core_1.Kms.KeyManagementApi);
|
|
17
|
+
// If we can sign with an algorithm we assume it's supported (also for verification)
|
|
18
|
+
const supportedJwaSignatureAlgorithms = Object.values(core_1.Kms.KnownJwaSignatureAlgorithms).filter((algorithm) => kms.supportedBackendsForOperation({ operation: 'sign', algorithm }).length > 0);
|
|
29
19
|
return supportedJwaSignatureAlgorithms;
|
|
30
20
|
}
|
|
31
|
-
async function
|
|
32
|
-
const didsApi = agentContext.dependencyManager.resolve(
|
|
21
|
+
async function getPublicJwkFromDid(agentContext, didUrl, allowedPurposes = ['authentication']) {
|
|
22
|
+
const didsApi = agentContext.dependencyManager.resolve(core_2.DidsApi);
|
|
33
23
|
const didDocument = await didsApi.resolveDidDocument(didUrl);
|
|
34
24
|
const verificationMethod = didDocument.dereferenceKey(didUrl, allowedPurposes);
|
|
35
|
-
return (0,
|
|
25
|
+
return (0, core_2.getPublicJwkFromVerificationMethod)(verificationMethod);
|
|
36
26
|
}
|
|
37
27
|
async function requestSignerToJwtIssuer(agentContext, requestSigner) {
|
|
38
28
|
if (requestSigner.method === 'did') {
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
if (!alg)
|
|
42
|
-
throw new core_1.CredoError(`No supported signature algorithms for key type: ${key.keyType}`);
|
|
29
|
+
const dids = agentContext.resolve(core_2.DidsApi);
|
|
30
|
+
const { publicJwk } = await dids.resolveVerificationMethodFromCreatedDidRecord(requestSigner.didUrl);
|
|
43
31
|
return {
|
|
44
32
|
method: requestSigner.method,
|
|
45
33
|
didUrl: requestSigner.didUrl,
|
|
46
|
-
alg,
|
|
34
|
+
alg: publicJwk.signatureAlgorithm,
|
|
35
|
+
kid: publicJwk.keyId,
|
|
47
36
|
};
|
|
48
37
|
}
|
|
49
38
|
if (requestSigner.method === 'x5c') {
|
|
50
|
-
const leafCertificate =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const jwk = (0, core_1.getJwkFromKey)(leafCertificate.publicKey);
|
|
54
|
-
const alg = jwk.supportedSignatureAlgorithms[0];
|
|
55
|
-
if (!alg) {
|
|
56
|
-
throw new core_1.CredoError(`No supported signature algorithms found key type: '${jwk.keyType}'`);
|
|
39
|
+
const leafCertificate = requestSigner.x5c[0];
|
|
40
|
+
if (!leafCertificate) {
|
|
41
|
+
throw new core_2.CredoError('Unable to extract leaf certificate, x5c certificate chain is empty');
|
|
57
42
|
}
|
|
58
43
|
if (!requestSigner.issuer.startsWith('https://') &&
|
|
59
44
|
!(requestSigner.issuer.startsWith('http://') && agentContext.config.allowInsecureHttpUrls)) {
|
|
60
|
-
throw new
|
|
45
|
+
throw new core_2.CredoError('The X509 certificate issuer must be a HTTPS URI.');
|
|
61
46
|
}
|
|
62
47
|
if (!leafCertificate.sanUriNames.includes(requestSigner.issuer) &&
|
|
63
|
-
!leafCertificate.sanDnsNames.includes((0,
|
|
48
|
+
!leafCertificate.sanDnsNames.includes((0, core_2.getDomainFromUrl)(requestSigner.issuer))) {
|
|
64
49
|
const sanUriMessage = leafCertificate.sanUriNames.length > 0
|
|
65
50
|
? `SAN-URI names are ${leafCertificate.sanUriNames.join(', ')}`
|
|
66
51
|
: 'there are no SAN-URI names';
|
|
@@ -71,27 +56,25 @@ async function requestSignerToJwtIssuer(agentContext, requestSigner) {
|
|
|
71
56
|
}
|
|
72
57
|
return {
|
|
73
58
|
...requestSigner,
|
|
74
|
-
|
|
59
|
+
x5c: requestSigner.x5c.map((certificate) => certificate.toString('base64url')),
|
|
60
|
+
alg: leafCertificate.publicJwk.signatureAlgorithm,
|
|
61
|
+
kid: leafCertificate.publicJwk.keyId,
|
|
75
62
|
};
|
|
76
63
|
}
|
|
77
64
|
if (requestSigner.method === 'jwk') {
|
|
78
|
-
const alg = requestSigner.jwk.supportedSignatureAlgorithms[0];
|
|
79
|
-
if (!alg) {
|
|
80
|
-
throw new core_1.CredoError(`No supported signature algorithms for key type: '${requestSigner.jwk.keyType}'`);
|
|
81
|
-
}
|
|
82
65
|
return {
|
|
83
66
|
...requestSigner,
|
|
84
67
|
publicJwk: requestSigner.jwk.toJson(),
|
|
85
|
-
alg,
|
|
68
|
+
alg: requestSigner.jwk.signatureAlgorithm,
|
|
86
69
|
};
|
|
87
70
|
}
|
|
88
|
-
throw new
|
|
71
|
+
throw new core_2.CredoError(`Unsupported jwt issuer method '${requestSigner.method}'`);
|
|
89
72
|
}
|
|
90
|
-
function
|
|
91
|
-
const signatureSuiteRegistry = agentContext.dependencyManager.resolve(
|
|
92
|
-
const supportedSignatureSuites = signatureSuiteRegistry.
|
|
73
|
+
function getProofTypeFromPublicJwk(agentContext, key) {
|
|
74
|
+
const signatureSuiteRegistry = agentContext.dependencyManager.resolve(core_2.SignatureSuiteRegistry);
|
|
75
|
+
const supportedSignatureSuites = signatureSuiteRegistry.getAllByPublicJwkType(key);
|
|
93
76
|
if (supportedSignatureSuites.length === 0) {
|
|
94
|
-
throw new
|
|
77
|
+
throw new core_2.CredoError(`Couldn't find a supported signature suite for the given key ${key.jwkTypehumanDescription}.`);
|
|
95
78
|
}
|
|
96
79
|
return supportedSignatureSuites[0].proofType;
|
|
97
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/shared/utils.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/shared/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@credo-ts/openid4vc",
|
|
3
3
|
"main": "build/index",
|
|
4
4
|
"types": "build/index",
|
|
5
|
-
"version": "0.6.0-pr-
|
|
5
|
+
"version": "0.6.0-pr-2324-20250625125220",
|
|
6
6
|
"files": [
|
|
7
7
|
"build"
|
|
8
8
|
],
|
|
@@ -17,22 +17,22 @@
|
|
|
17
17
|
"directory": "packages/openid4vc"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"class-transformer": "
|
|
21
|
-
"rxjs": "^7.8.
|
|
22
|
-
"zod": "^3.
|
|
23
|
-
"@openid4vc/openid4vci": "0.3.0-alpha-
|
|
24
|
-
"@openid4vc/oauth2": "0.3.0-alpha-
|
|
25
|
-
"@openid4vc/openid4vp": "0.3.0-alpha-
|
|
26
|
-
"@openid4vc/utils": "0.3.0-alpha-
|
|
27
|
-
"@credo-ts/core": "0.6.0-pr-
|
|
20
|
+
"class-transformer": "0.5.1",
|
|
21
|
+
"rxjs": "^7.8.2",
|
|
22
|
+
"zod": "^3.25.56",
|
|
23
|
+
"@openid4vc/openid4vci": "0.3.0-alpha-20250602121005",
|
|
24
|
+
"@openid4vc/oauth2": "0.3.0-alpha-20250602121005",
|
|
25
|
+
"@openid4vc/openid4vp": "0.3.0-alpha-20250602121005",
|
|
26
|
+
"@openid4vc/utils": "0.3.0-alpha-20250602121005",
|
|
27
|
+
"@credo-ts/core": "0.6.0-pr-2324-20250625125220"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@types/express": "^4.17.
|
|
30
|
+
"@types/express": "^4.17.23",
|
|
31
31
|
"express": "^4.21.2",
|
|
32
|
-
"nock": "^14.0.
|
|
33
|
-
"rimraf": "^
|
|
34
|
-
"typescript": "~5.
|
|
35
|
-
"@credo-ts/tenants": "0.6.0-pr-
|
|
32
|
+
"nock": "^14.0.5",
|
|
33
|
+
"rimraf": "^6.0.1",
|
|
34
|
+
"typescript": "~5.8.3",
|
|
35
|
+
"@credo-ts/tenants": "0.6.0-pr-2324-20250625125220"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "pnpm run clean && pnpm run compile",
|