@credo-ts/core 0.7.3 → 0.7.4
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/agent/TrustedIssuerContext.d.mts +11 -1
- package/build/agent/TrustedIssuerContext.d.mts.map +1 -1
- package/build/agent/TrustedIssuerContext.mjs +7 -0
- package/build/agent/TrustedIssuerContext.mjs.map +1 -1
- package/build/agent/TrustedIssuersForVerification.d.mts +11 -1
- package/build/agent/TrustedIssuersForVerification.d.mts.map +1 -1
- package/build/index.d.mts +3 -3
- package/build/index.mjs +2 -2
- package/build/modules/dcql/DcqlService.d.mts.map +1 -1
- package/build/modules/dcql/DcqlService.mjs +24 -12
- package/build/modules/dcql/DcqlService.mjs.map +1 -1
- package/build/modules/dids/domain/verificationMethod/JsonWebKey2020.d.mts +24 -24
- package/build/modules/dids/methods/jwk/DidJwk.d.mts +24 -24
- package/build/modules/dids/services/DidResolverService.d.mts +4 -0
- package/build/modules/dids/services/DidResolverService.d.mts.map +1 -1
- package/build/modules/dids/services/DidResolverService.mjs +21 -5
- package/build/modules/dids/services/DidResolverService.mjs.map +1 -1
- package/build/modules/kms/KeyManagementApi.d.mts +14 -14
- package/build/modules/kms/jwk/jwa.d.mts +1 -1
- package/build/modules/kms/jwk/knownJwk.d.mts +4 -4
- package/build/modules/kms/jwk/kty/ec/P256PublicJwk.d.mts +1 -1
- package/build/modules/kms/jwk/kty/ec/P384PublicJwk.d.mts +1 -1
- package/build/modules/kms/jwk/kty/ec/P521PublicJwk.d.mts +1 -1
- package/build/modules/kms/jwk/kty/ec/Secp256k1PublicJwk.d.mts +1 -1
- package/build/modules/kms/jwk/kty/okp/Ed25519PublicJwk.d.mts +2 -2
- package/build/modules/kms/jwk/kty/okp/X25519PublicJwk.d.mts +1 -1
- package/build/modules/kms/jwk/kty/okp/okpJwk.d.mts +2 -2
- package/build/modules/kms/options/KmsCreateKeyOptions.d.mts +3 -3
- package/build/modules/kms/options/KmsSignOptions.d.mts +1 -1
- package/build/modules/kms/options/KmsVerifyOptions.d.mts +2 -2
- package/build/modules/mdoc/repository/MdocRecord.d.mts +1 -1
- package/build/modules/sd-jwt-vc/repository/SdJwtVcRecord.d.mts +1 -1
- package/build/modules/sd-jwt-vc/utils.mjs +4 -4
- package/build/modules/sd-jwt-vc/utils.mjs.map +1 -1
- package/build/modules/vc/W3cCredentialServiceOptions.d.mts +5 -5
- package/build/modules/vc/W3cCredentialServiceOptions.d.mts.map +1 -1
- package/build/modules/vc/W3cV2CredentialService.d.mts +5 -1
- package/build/modules/vc/W3cV2CredentialService.d.mts.map +1 -1
- package/build/modules/vc/W3cV2CredentialService.mjs +72 -26
- package/build/modules/vc/W3cV2CredentialService.mjs.map +1 -1
- package/build/modules/vc/W3cV2CredentialServiceOptions.d.mts +14 -6
- package/build/modules/vc/W3cV2CredentialServiceOptions.d.mts.map +1 -1
- package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.d.mts +0 -18
- package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.d.mts.map +1 -1
- package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.mjs +38 -36
- package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.mjs.map +1 -1
- package/build/modules/vc/data-integrity/v2-di-utils.mjs +17 -35
- package/build/modules/vc/data-integrity/v2-di-utils.mjs.map +1 -1
- package/build/modules/vc/jwt-vc/W3cJwtCredentialService.d.mts +0 -23
- package/build/modules/vc/jwt-vc/W3cJwtCredentialService.d.mts.map +1 -1
- package/build/modules/vc/jwt-vc/W3cJwtCredentialService.mjs +17 -68
- package/build/modules/vc/jwt-vc/W3cJwtCredentialService.mjs.map +1 -1
- package/build/modules/vc/jwt-vc/W3cV2JwtCredentialService.d.mts.map +1 -1
- package/build/modules/vc/jwt-vc/W3cV2JwtCredentialService.mjs +11 -17
- package/build/modules/vc/jwt-vc/W3cV2JwtCredentialService.mjs.map +1 -1
- package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.d.mts +5 -0
- package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.d.mts.map +1 -1
- package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.mjs +18 -4
- package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.mjs.map +1 -1
- package/build/modules/vc/models/W3cV2VerifyResult.d.mts +6 -0
- package/build/modules/vc/models/W3cV2VerifyResult.d.mts.map +1 -1
- package/build/modules/vc/resolveSigner.mjs +74 -0
- package/build/modules/vc/resolveSigner.mjs.map +1 -0
- package/build/modules/vc/sd-jwt-vc/W3cV2SdJwtCredentialService.d.mts.map +1 -1
- package/build/modules/vc/sd-jwt-vc/W3cV2SdJwtCredentialService.mjs +16 -18
- package/build/modules/vc/sd-jwt-vc/W3cV2SdJwtCredentialService.mjs.map +1 -1
- package/build/modules/vc/sd-jwt-vc/disclosureFrame.d.mts +1 -1
- package/build/modules/vc/sd-jwt-vc/disclosureFrame.d.mts.map +1 -1
- package/build/modules/vc/sd-jwt-vc/disclosureFrame.mjs +2 -1
- package/build/modules/vc/sd-jwt-vc/disclosureFrame.mjs.map +1 -1
- package/build/modules/vc/v2-jwt-utils.mjs +54 -55
- package/build/modules/vc/v2-jwt-utils.mjs.map +1 -1
- package/build/modules/x509/X509ModuleConfig.d.mts +5 -13
- package/build/modules/x509/X509ModuleConfig.d.mts.map +1 -1
- package/build/modules/x509/X509ModuleConfig.mjs +2 -1
- package/build/modules/x509/X509ModuleConfig.mjs.map +1 -1
- package/build/modules/x509/X509RevocationService.d.mts.map +1 -1
- package/build/modules/x509/X509RevocationService.mjs +17 -20
- package/build/modules/x509/X509RevocationService.mjs.map +1 -1
- package/build/modules/x509/X509Service.mjs +1 -1
- package/build/modules/x509/X509Service.mjs.map +1 -1
- package/build/modules/x509/X509ServiceOptions.d.mts +4 -6
- package/build/modules/x509/X509ServiceOptions.d.mts.map +1 -1
- package/build/modules/x509/X509ValidationOptions.d.mts +19 -2
- package/build/modules/x509/X509ValidationOptions.d.mts.map +1 -1
- package/build/modules/x509/X509ValidationOptions.mjs +21 -1
- package/build/modules/x509/X509ValidationOptions.mjs.map +1 -1
- package/build/modules/x509/index.d.mts +2 -2
- package/build/modules/x509/index.mjs +2 -2
- package/build/modules/x509/utils/crlFetcher.mjs +1 -11
- package/build/modules/x509/utils/crlFetcher.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -49,8 +49,8 @@ export declare const zKmsJwkPublicAsymmetric: z$1.ZodDiscriminatedUnion<[z$1.Zod
|
|
|
49
49
|
}, z$1.core.$strip>, z$1.ZodObject<{
|
|
50
50
|
kty: z$1.ZodLiteral<"OKP">;
|
|
51
51
|
crv: z$1.ZodEnum<{
|
|
52
|
-
Ed25519: "Ed25519";
|
|
53
52
|
X25519: "X25519";
|
|
53
|
+
Ed25519: "Ed25519";
|
|
54
54
|
}>;
|
|
55
55
|
x: z$1.ZodString;
|
|
56
56
|
d: z$1.ZodOptional<z$1.ZodString>;
|
|
@@ -122,8 +122,8 @@ export declare const zKmsJwkPublic: z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
|
|
|
122
122
|
}, z$1.core.$strip>, z$1.ZodObject<{
|
|
123
123
|
kty: z$1.ZodLiteral<"OKP">;
|
|
124
124
|
crv: z$1.ZodEnum<{
|
|
125
|
-
Ed25519: "Ed25519";
|
|
126
125
|
X25519: "X25519";
|
|
126
|
+
Ed25519: "Ed25519";
|
|
127
127
|
}>;
|
|
128
128
|
x: z$1.ZodString;
|
|
129
129
|
d: z$1.ZodOptional<z$1.ZodString>;
|
|
@@ -198,8 +198,8 @@ export declare const zKmsJwkPrivate: z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
|
|
|
198
198
|
d: z$1.ZodString;
|
|
199
199
|
kty: z$1.ZodLiteral<"OKP">;
|
|
200
200
|
crv: z$1.ZodEnum<{
|
|
201
|
-
Ed25519: "Ed25519";
|
|
202
201
|
X25519: "X25519";
|
|
202
|
+
Ed25519: "Ed25519";
|
|
203
203
|
}>;
|
|
204
204
|
x: z$1.ZodString;
|
|
205
205
|
kid: z$1.ZodOptional<z$1.ZodString>;
|
|
@@ -261,8 +261,8 @@ export declare const zKmsJwkPrivateAsymmetric: z$1.ZodDiscriminatedUnion<[z$1.Zo
|
|
|
261
261
|
d: z$1.ZodString;
|
|
262
262
|
kty: z$1.ZodLiteral<"OKP">;
|
|
263
263
|
crv: z$1.ZodEnum<{
|
|
264
|
-
Ed25519: "Ed25519";
|
|
265
264
|
X25519: "X25519";
|
|
265
|
+
Ed25519: "Ed25519";
|
|
266
266
|
}>;
|
|
267
267
|
x: z$1.ZodString;
|
|
268
268
|
kid: z$1.ZodOptional<z$1.ZodString>;
|
|
@@ -11,7 +11,7 @@ export declare class P256PublicJwk implements PublicJwkType<Jwk> {
|
|
|
11
11
|
static supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
12
12
|
static multicodecPrefix: number;
|
|
13
13
|
supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
14
|
-
supportedSignatureAlgorithms: ("HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
14
|
+
supportedSignatureAlgorithms: ("Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K")[];
|
|
15
15
|
multicodecPrefix: number;
|
|
16
16
|
constructor(jwk: Jwk);
|
|
17
17
|
get publicKey(): {
|
|
@@ -11,7 +11,7 @@ export declare class P384PublicJwk implements PublicJwkType<Jwk> {
|
|
|
11
11
|
static supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
12
12
|
static multicodecPrefix: number;
|
|
13
13
|
supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
14
|
-
supportedSignatureAlgorithms: ("HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
14
|
+
supportedSignatureAlgorithms: ("Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K")[];
|
|
15
15
|
multicodecPrefix: number;
|
|
16
16
|
constructor(jwk: Jwk);
|
|
17
17
|
get publicKey(): {
|
|
@@ -11,7 +11,7 @@ export declare class P521PublicJwk implements PublicJwkType<Jwk> {
|
|
|
11
11
|
static supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
12
12
|
static multicodecPrefix: number;
|
|
13
13
|
supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
14
|
-
supportedSignatureAlgorithms: ("HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
14
|
+
supportedSignatureAlgorithms: ("Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K")[];
|
|
15
15
|
multicodecPrefix: number;
|
|
16
16
|
constructor(jwk: Jwk);
|
|
17
17
|
get publicKey(): {
|
|
@@ -11,7 +11,7 @@ export declare class Secp256k1PublicJwk implements PublicJwkType<Jwk> {
|
|
|
11
11
|
static supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
12
12
|
static multicodecPrefix: number;
|
|
13
13
|
supportedEncryptionKeyAgreementAlgorithms: "ECDH-ES"[];
|
|
14
|
-
supportedSignatureAlgorithms: ("HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
14
|
+
supportedSignatureAlgorithms: ("Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K")[];
|
|
15
15
|
multicodecPrefix: number;
|
|
16
16
|
constructor(jwk: Jwk);
|
|
17
17
|
get publicKey(): {
|
|
@@ -11,7 +11,7 @@ export declare class Ed25519PublicJwk implements PublicJwkType<Jwk> {
|
|
|
11
11
|
static supportedEncryptionKeyAgreementAlgorithms: KnownJwaKeyAgreementAlgorithm[];
|
|
12
12
|
static multicodecPrefix: number;
|
|
13
13
|
supportedEncryptionKeyAgreementAlgorithms: ("ECDH-ES" | "ECDH-ES+A128KW" | "ECDH-ES+A192KW" | "ECDH-ES+A256KW" | "ECDH-HSALSA20" | "HPKE-0" | "HPKE-3" | "HPKE-7")[];
|
|
14
|
-
supportedSignatureAlgorithms: ("HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
14
|
+
supportedSignatureAlgorithms: ("Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K")[];
|
|
15
15
|
multicodecPrefix: number;
|
|
16
16
|
constructor(jwk: Jwk);
|
|
17
17
|
get publicKey(): {
|
|
@@ -28,7 +28,7 @@ export declare class Ed25519PublicJwk implements PublicJwkType<Jwk> {
|
|
|
28
28
|
static fromMulticodec(multicodec: Uint8Array): Ed25519PublicJwk;
|
|
29
29
|
toX25519PublicJwk(): {
|
|
30
30
|
kty: "OKP";
|
|
31
|
-
crv: "
|
|
31
|
+
crv: "X25519" | "Ed25519";
|
|
32
32
|
x: string;
|
|
33
33
|
d?: string | undefined;
|
|
34
34
|
kid?: string | undefined;
|
|
@@ -11,7 +11,7 @@ export declare class X25519PublicJwk implements PublicJwkType<Jwk> {
|
|
|
11
11
|
static supportedSignatureAlgorithms: KnownJwaSignatureAlgorithm[];
|
|
12
12
|
static multicodecPrefix: number;
|
|
13
13
|
supportedEncryptionKeyAgreementAlgorithms: "ECDH-HSALSA20"[];
|
|
14
|
-
supportedSignatureAlgorithms: ("HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
14
|
+
supportedSignatureAlgorithms: ("Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K")[];
|
|
15
15
|
multicodecPrefix: number;
|
|
16
16
|
constructor(jwk: Jwk);
|
|
17
17
|
get publicKey(): {
|
|
@@ -3,8 +3,8 @@ import { z as z$1 } from "zod";
|
|
|
3
3
|
export declare const zKmsJwkPublicOkp: z$1.ZodObject<{
|
|
4
4
|
kty: z$1.ZodLiteral<"OKP">;
|
|
5
5
|
crv: z$1.ZodEnum<{
|
|
6
|
-
Ed25519: "Ed25519";
|
|
7
6
|
X25519: "X25519";
|
|
7
|
+
Ed25519: "Ed25519";
|
|
8
8
|
}>;
|
|
9
9
|
x: z$1.ZodString;
|
|
10
10
|
d: z$1.ZodOptional<z$1.ZodString>;
|
|
@@ -23,8 +23,8 @@ export declare const zKmsJwkPrivateOkp: z$1.ZodObject<{
|
|
|
23
23
|
d: z$1.ZodString;
|
|
24
24
|
kty: z$1.ZodLiteral<"OKP">;
|
|
25
25
|
crv: z$1.ZodEnum<{
|
|
26
|
-
Ed25519: "Ed25519";
|
|
27
26
|
X25519: "X25519";
|
|
27
|
+
Ed25519: "Ed25519";
|
|
28
28
|
}>;
|
|
29
29
|
x: z$1.ZodString;
|
|
30
30
|
kid: z$1.ZodOptional<z$1.ZodString>;
|
|
@@ -19,8 +19,8 @@ export type KmsCreateKeyTypeEc = z$1.output<typeof zKmsCreateKeyTypeEc>;
|
|
|
19
19
|
declare const zKmsCreateKeyTypeOkp: z$1.ZodObject<{
|
|
20
20
|
kty: z$1.ZodLiteral<"OKP">;
|
|
21
21
|
crv: z$1.ZodEnum<{
|
|
22
|
-
Ed25519: "Ed25519";
|
|
23
22
|
X25519: "X25519";
|
|
23
|
+
Ed25519: "Ed25519";
|
|
24
24
|
}>;
|
|
25
25
|
}, z$1.core.$strip>;
|
|
26
26
|
export type KmsCreateKeyTypeOkp = z$1.output<typeof zKmsCreateKeyTypeOkp>;
|
|
@@ -59,8 +59,8 @@ export declare const zKmsCreateKeyTypeAsymmetric: z$1.ZodUnion<readonly [z$1.Zod
|
|
|
59
59
|
}, z$1.core.$strip>, z$1.ZodObject<{
|
|
60
60
|
kty: z$1.ZodLiteral<"OKP">;
|
|
61
61
|
crv: z$1.ZodEnum<{
|
|
62
|
-
Ed25519: "Ed25519";
|
|
63
62
|
X25519: "X25519";
|
|
63
|
+
Ed25519: "Ed25519";
|
|
64
64
|
}>;
|
|
65
65
|
}, z$1.core.$strip>, z$1.ZodObject<{
|
|
66
66
|
kty: z$1.ZodLiteral<"RSA">;
|
|
@@ -78,8 +78,8 @@ export declare const zKmsCreateKeyType: z$1.ZodUnion<readonly [z$1.ZodObject<{
|
|
|
78
78
|
}, z$1.core.$strip>, z$1.ZodObject<{
|
|
79
79
|
kty: z$1.ZodLiteral<"OKP">;
|
|
80
80
|
crv: z$1.ZodEnum<{
|
|
81
|
-
Ed25519: "Ed25519";
|
|
82
81
|
X25519: "X25519";
|
|
82
|
+
Ed25519: "Ed25519";
|
|
83
83
|
}>;
|
|
84
84
|
}, z$1.core.$strip>, z$1.ZodObject<{
|
|
85
85
|
kty: z$1.ZodLiteral<"RSA">;
|
|
@@ -3,6 +3,7 @@ import { z as z$1 } from "zod";
|
|
|
3
3
|
export declare const zKmsSignOptions: z$1.ZodObject<{
|
|
4
4
|
keyId: z$1.ZodString;
|
|
5
5
|
algorithm: z$1.ZodEnum<{
|
|
6
|
+
Ed25519: "Ed25519";
|
|
6
7
|
HS256: "HS256";
|
|
7
8
|
HS384: "HS384";
|
|
8
9
|
HS512: "HS512";
|
|
@@ -16,7 +17,6 @@ export declare const zKmsSignOptions: z$1.ZodObject<{
|
|
|
16
17
|
PS384: "PS384";
|
|
17
18
|
PS512: "PS512";
|
|
18
19
|
EdDSA: "EdDSA";
|
|
19
|
-
Ed25519: "Ed25519";
|
|
20
20
|
ES256K: "ES256K";
|
|
21
21
|
}>;
|
|
22
22
|
data: z$1.ZodInstanceOf<Uint8Array<ArrayBufferLike>>;
|
|
@@ -49,8 +49,8 @@ export declare const zKmsVerifyOptions: z$1.ZodObject<{
|
|
|
49
49
|
}, z$1.core.$strip>, z$1.ZodObject<{
|
|
50
50
|
kty: z$1.ZodLiteral<"OKP">;
|
|
51
51
|
crv: z$1.ZodEnum<{
|
|
52
|
-
Ed25519: "Ed25519";
|
|
53
52
|
X25519: "X25519";
|
|
53
|
+
Ed25519: "Ed25519";
|
|
54
54
|
}>;
|
|
55
55
|
x: z$1.ZodString;
|
|
56
56
|
d: z$1.ZodOptional<z$1.ZodString>;
|
|
@@ -67,6 +67,7 @@ export declare const zKmsVerifyOptions: z$1.ZodObject<{
|
|
|
67
67
|
keyId: z$1.ZodOptional<z$1.ZodNever>;
|
|
68
68
|
}, z$1.core.$strip>]>;
|
|
69
69
|
algorithm: z$1.ZodEnum<{
|
|
70
|
+
Ed25519: "Ed25519";
|
|
70
71
|
HS256: "HS256";
|
|
71
72
|
HS384: "HS384";
|
|
72
73
|
HS512: "HS512";
|
|
@@ -80,7 +81,6 @@ export declare const zKmsVerifyOptions: z$1.ZodObject<{
|
|
|
80
81
|
PS384: "PS384";
|
|
81
82
|
PS512: "PS512";
|
|
82
83
|
EdDSA: "EdDSA";
|
|
83
|
-
Ed25519: "Ed25519";
|
|
84
84
|
ES256K: "ES256K";
|
|
85
85
|
}>;
|
|
86
86
|
data: z$1.ZodInstanceOf<Uint8Array<ArrayBufferLike>>;
|
|
@@ -58,7 +58,7 @@ export declare class MdocRecord extends BaseRecord<DefaultMdocRecordTags> {
|
|
|
58
58
|
static fromMdoc(mdoc: Mdoc): MdocRecord;
|
|
59
59
|
getTags(): {
|
|
60
60
|
docType: string;
|
|
61
|
-
alg: "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
61
|
+
alg: "Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K";
|
|
62
62
|
multiInstanceState: CredentialMultiInstanceState;
|
|
63
63
|
};
|
|
64
64
|
clone(): this;
|
|
@@ -89,7 +89,7 @@ export declare class SdJwtVcRecord extends BaseRecord<DefaultSdJwtVcRecordTags>
|
|
|
89
89
|
vct: string;
|
|
90
90
|
extendedVctValues: string[];
|
|
91
91
|
sdAlg: string;
|
|
92
|
-
alg: "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "
|
|
92
|
+
alg: "Ed25519" | "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | "ES256K";
|
|
93
93
|
multiInstanceState: CredentialMultiInstanceState;
|
|
94
94
|
};
|
|
95
95
|
clone(): this;
|
|
@@ -19,20 +19,20 @@ async function resolveSigningPublicJwkFromDidUrl(agentContext, didUrl) {
|
|
|
19
19
|
const { publicJwk } = await agentContext.dependencyManager.resolve(DidsApi).resolveVerificationMethodFromCreatedDidRecord(didUrl);
|
|
20
20
|
return publicJwk;
|
|
21
21
|
}
|
|
22
|
-
async function resolveDidUrl(agentContext, didUrl) {
|
|
22
|
+
async function resolveDidUrl(agentContext, didUrl, purposes = ["assertionMethod"]) {
|
|
23
23
|
const didDocument = await agentContext.dependencyManager.resolve(DidResolverService).resolveDidDocument(agentContext, didUrl);
|
|
24
24
|
return {
|
|
25
|
-
verificationMethod: didDocument.dereferenceKey(didUrl,
|
|
25
|
+
verificationMethod: didDocument.dereferenceKey(didUrl, purposes),
|
|
26
26
|
didDocument
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
-
async function extractKeyFromHolderBinding(agentContext, holder, { forSigning = false, jwkKeyId } = {}) {
|
|
29
|
+
async function extractKeyFromHolderBinding(agentContext, holder, { forSigning = false, jwkKeyId, didPurposes } = {}) {
|
|
30
30
|
if (holder.method === "did") {
|
|
31
31
|
if (!parseDid(holder.didUrl).fragment) throw new CredoError(`didUrl '${holder.didUrl}' does not contain a '#'. Unable to derive key from did document`);
|
|
32
32
|
let publicJwk;
|
|
33
33
|
if (forSigning) publicJwk = await resolveSigningPublicJwkFromDidUrl(agentContext, holder.didUrl);
|
|
34
34
|
else {
|
|
35
|
-
const { verificationMethod } = await resolveDidUrl(agentContext, holder.didUrl);
|
|
35
|
+
const { verificationMethod } = await resolveDidUrl(agentContext, holder.didUrl, didPurposes);
|
|
36
36
|
publicJwk = getPublicJwkFromVerificationMethod(verificationMethod);
|
|
37
37
|
}
|
|
38
38
|
const supportedSignatureAlgorithms = publicJwk.supportedSignatureAlgorithms;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/modules/sd-jwt-vc/utils.ts"],"sourcesContent":["import type { Signer, Verifier } from '@sd-jwt/core'\nimport { AgentContext } from '../../agent'\nimport type { HashName } from '../../crypto'\nimport { CredoError } from '../../error'\nimport { TypedArrayEncoder } from '../../utils'\nimport { DidResolverService, DidsApi, getPublicJwkFromVerificationMethod, parseDid } from '../dids'\nimport { isKnownJwaSignatureAlgorithm, type Jwk, KeyManagementApi, PublicJwk } from '../kms'\nimport { X509Certificate } from '../x509/X509Certificate'\nimport { SdJwtVcError } from './SdJwtVcError'\nimport type { SdJwtVcHolderBinding, SdJwtVcIssuer } from './SdJwtVcOptions'\n\nexport async function resolveSigningPublicJwkFromDidUrl(agentContext: AgentContext, didUrl: string) {\n const dids = agentContext.dependencyManager.resolve(DidsApi)\n\n const { publicJwk } = await dids.resolveVerificationMethodFromCreatedDidRecord(didUrl)\n return publicJwk\n}\n\nexport async function resolveDidUrl(agentContext: AgentContext, didUrl: string) {\n const didResolver = agentContext.dependencyManager.resolve(DidResolverService)\n const didDocument = await didResolver.resolveDidDocument(agentContext, didUrl)\n\n return {\n verificationMethod: didDocument.dereferenceKey(didUrl, ['assertionMethod']),\n didDocument,\n }\n}\n\nexport async function extractKeyFromHolderBinding(\n agentContext: AgentContext,\n holder: SdJwtVcHolderBinding,\n { forSigning = false, jwkKeyId }: { forSigning?: boolean; jwkKeyId?: string } = {}\n) {\n if (holder.method === 'did') {\n const parsedDid = parseDid(holder.didUrl)\n if (!parsedDid.fragment) {\n throw new CredoError(`didUrl '${holder.didUrl}' does not contain a '#'. Unable to derive key from did document`)\n }\n\n let publicJwk: PublicJwk\n if (forSigning) {\n publicJwk = await resolveSigningPublicJwkFromDidUrl(agentContext, holder.didUrl)\n } else {\n const { verificationMethod } = await resolveDidUrl(agentContext, holder.didUrl)\n publicJwk = getPublicJwkFromVerificationMethod(verificationMethod)\n }\n\n const supportedSignatureAlgorithms = publicJwk.supportedSignatureAlgorithms\n if (supportedSignatureAlgorithms.length === 0) {\n throw new CredoError(`No supported JWA signature algorithms found for key ${publicJwk.jwkTypeHumanDescription}`)\n }\n const alg = supportedSignatureAlgorithms[0]\n\n return {\n alg,\n publicJwk,\n cnf: {\n // We need to include the whole didUrl here, otherwise the verifier\n // won't know which did it is associated with\n kid: holder.didUrl,\n },\n }\n }\n if (holder.method === 'jwk') {\n const publicJwk = holder.jwk\n const alg = publicJwk.supportedSignatureAlgorithms[0]\n\n if (forSigning) {\n publicJwk.keyId = jwkKeyId ?? publicJwk.legacyKeyId\n }\n\n return {\n alg,\n publicJwk,\n cnf: {\n jwk: publicJwk.toJson(),\n },\n }\n }\n\n throw new CredoError(\"Unsupported credential holder binding. Only 'did' and 'jwk' are supported at the moment.\")\n}\n\n/**\n * Set the `alg` from a JWT header on the public jwk, so signing and verification use the\n * algorithm of the JWT rather than the first supported signature algorithm of the key.\n *\n * Throws an error if the alg is not a known JWA signature algorithm, or if the alg is not\n * supported by the jwk.\n */\nexport function setJwkAlgFromJwtHeader(publicJwk: PublicJwk, jwtHeaderAlg: unknown) {\n if (typeof jwtHeaderAlg !== 'string' || !isKnownJwaSignatureAlgorithm(jwtHeaderAlg)) {\n throw new CredoError(`Expected JWT header 'alg' to be a known JWA signature algorithm, found '${jwtHeaderAlg}'`)\n }\n\n publicJwk.alg = jwtHeaderAlg\n}\n\n/**\n * Hashing algorithms that can be used for the disclosure digests of an SD-JWT, and are placed\n * in the `_sd_alg` claim.\n *\n * `sha-1` is omitted, as SD-JWT requires a hash algorithm that is considered secure at the\n * time of issuance.\n *\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-selective-disclosure-jwt-22.html#name-hash-function-claim\n */\nexport const sdJwtHashingAlgorithms: Array<Exclude<HashName, 'sha-1'>> = ['sha-256', 'sha-384', 'sha-512']\n\n/**\n * Get the hashing algorithm to use for the disclosure digests of an SD-JWT, defaulting to `sha-256`.\n *\n * The sign options already exclude insecure hashing algorithms on a type level, but this is\n * enforced at runtime as well, as the value can originate from JavaScript callers or dynamic input.\n */\nexport function getSdJwtHashingAlgorithm(hashingAlgorithm?: HashName): Exclude<HashName, 'sha-1'> {\n const hashAlg = hashingAlgorithm ?? 'sha-256'\n\n if (!sdJwtHashingAlgorithms.includes(hashAlg as Exclude<HashName, 'sha-1'>)) {\n throw new CredoError(\n `Unsupported hashing algorithm '${hashAlg}' for the disclosure digests of an SD-JWT. Supported hashing algorithms are ${sdJwtHashingAlgorithms.join(', ')}`\n )\n }\n\n return hashAlg as Exclude<HashName, 'sha-1'>\n}\n\nexport function getSdJwtSigner(agentContext: AgentContext, key: PublicJwk): Signer {\n const kms = agentContext.resolve(KeyManagementApi)\n\n return async (input: string) => {\n const result = await kms.sign({\n keyId: key.keyId,\n data: TypedArrayEncoder.fromUtf8String(input),\n algorithm: key.signatureAlgorithm,\n })\n\n return TypedArrayEncoder.toBase64Url(result.signature)\n }\n}\n\nexport function getSdJwtVerifier(agentContext: AgentContext, key: PublicJwk): Verifier {\n const kms = agentContext.resolve(KeyManagementApi)\n\n return async (message: string, signatureBase64Url: string) => {\n const result = await kms.verify({\n signature: TypedArrayEncoder.fromBase64Url(signatureBase64Url),\n key: {\n publicJwk: key.toJson(),\n },\n data: TypedArrayEncoder.fromUtf8String(message),\n algorithm: key.signatureAlgorithm,\n })\n\n return result.verified\n }\n}\n\nexport interface CnfPayload {\n jwk?: Jwk\n kid?: string\n}\n\nexport function parseHolderBindingFromCredential(payload?: Record<string, unknown>): SdJwtVcHolderBinding | null {\n if (!payload) {\n throw new CredoError('Unable to extract payload from SD-JWT VC')\n }\n\n if (!payload.cnf) {\n return null\n }\n const cnf: CnfPayload = payload.cnf\n\n if (cnf.jwk) {\n return {\n method: 'jwk',\n jwk: PublicJwk.fromUnknown(cnf.jwk),\n }\n }\n if (cnf.kid) {\n if (!cnf.kid.startsWith('did:') || !cnf.kid.includes('#')) {\n throw new CredoError('Invalid holder kid for did. Only absolute KIDs for cnf are supported')\n }\n return {\n method: 'did',\n didUrl: cnf.kid,\n }\n }\n\n throw new CredoError(\"Unsupported credential holder binding. Only 'did' and 'jwk' are supported at the moment.\")\n}\n\nexport function parseIssuerFromCredential(\n header?: Record<string, unknown>,\n payload?: Record<string, unknown>\n): SdJwtVcIssuer {\n if (!payload || !header) throw new SdJwtVcError('SD-JWT is missing payload')\n const iss = payload.iss as string | undefined\n\n if (header?.x5c) {\n if (!Array.isArray(header.x5c)) {\n throw new SdJwtVcError('Invalid x5c header in credential. Not an array.')\n }\n if (header.x5c.length === 0) {\n throw new SdJwtVcError('Invalid x5c header in credential. Empty array.')\n }\n if (header.x5c.some((x5c) => typeof x5c !== 'string')) {\n throw new SdJwtVcError('Invalid x5c header in credential. Not an array of strings.')\n }\n\n const certificateChain = header.x5c.map((cert) => X509Certificate.fromEncodedCertificate(cert))\n\n return {\n method: 'x5c',\n x5c: certificateChain,\n issuer: iss,\n }\n }\n\n if (iss?.startsWith('did:')) {\n // If `did` is used, we require a relative KID to be present to identify\n // the key used by issuer to sign the sd-jwt-vc\n if (!header.kid) {\n throw new SdJwtVcError('Credential does not contain a kid in the header')\n }\n\n const issuerKid = header.kid as string\n\n let didUrl: string\n if (issuerKid.startsWith('#')) {\n didUrl = `${iss}${issuerKid}`\n } else if (issuerKid.startsWith('did:')) {\n const didFromKid = parseDid(issuerKid)\n if (didFromKid.did !== iss) {\n throw new SdJwtVcError(\n `kid in header is an absolute DID URL, but the did (${didFromKid.did}) does not match with the 'iss' did (${iss})`\n )\n }\n\n didUrl = issuerKid\n } else {\n throw new SdJwtVcError(\n 'Invalid issuer kid for did. Only absolute or relative (starting with #) did urls are supported.'\n )\n }\n\n return {\n method: 'did',\n didUrl,\n }\n }\n\n throw new SdJwtVcError('Unsupported signing method for SD-JWT VC. Only did and x5c are supported at the moment.')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/modules/sd-jwt-vc/utils.ts"],"sourcesContent":["import type { Signer, Verifier } from '@sd-jwt/core'\nimport { AgentContext } from '../../agent'\nimport type { HashName } from '../../crypto'\nimport { CredoError } from '../../error'\nimport { TypedArrayEncoder } from '../../utils'\nimport { type DidPurpose, DidResolverService, DidsApi, getPublicJwkFromVerificationMethod, parseDid } from '../dids'\nimport { isKnownJwaSignatureAlgorithm, type Jwk, KeyManagementApi, PublicJwk } from '../kms'\nimport { X509Certificate } from '../x509/X509Certificate'\nimport { SdJwtVcError } from './SdJwtVcError'\nimport type { SdJwtVcHolderBinding, SdJwtVcIssuer } from './SdJwtVcOptions'\n\nexport async function resolveSigningPublicJwkFromDidUrl(agentContext: AgentContext, didUrl: string) {\n const dids = agentContext.dependencyManager.resolve(DidsApi)\n\n const { publicJwk } = await dids.resolveVerificationMethodFromCreatedDidRecord(didUrl)\n return publicJwk\n}\n\nexport async function resolveDidUrl(\n agentContext: AgentContext,\n didUrl: string,\n purposes: DidPurpose[] = ['assertionMethod']\n) {\n const didResolver = agentContext.dependencyManager.resolve(DidResolverService)\n const didDocument = await didResolver.resolveDidDocument(agentContext, didUrl)\n\n return {\n verificationMethod: didDocument.dereferenceKey(didUrl, purposes),\n didDocument,\n }\n}\n\nexport async function extractKeyFromHolderBinding(\n agentContext: AgentContext,\n holder: SdJwtVcHolderBinding,\n {\n forSigning = false,\n jwkKeyId,\n didPurposes,\n }: { forSigning?: boolean; jwkKeyId?: string; didPurposes?: DidPurpose[] } = {}\n) {\n if (holder.method === 'did') {\n const parsedDid = parseDid(holder.didUrl)\n if (!parsedDid.fragment) {\n throw new CredoError(`didUrl '${holder.didUrl}' does not contain a '#'. Unable to derive key from did document`)\n }\n\n let publicJwk: PublicJwk\n if (forSigning) {\n publicJwk = await resolveSigningPublicJwkFromDidUrl(agentContext, holder.didUrl)\n } else {\n const { verificationMethod } = await resolveDidUrl(agentContext, holder.didUrl, didPurposes)\n publicJwk = getPublicJwkFromVerificationMethod(verificationMethod)\n }\n\n const supportedSignatureAlgorithms = publicJwk.supportedSignatureAlgorithms\n if (supportedSignatureAlgorithms.length === 0) {\n throw new CredoError(`No supported JWA signature algorithms found for key ${publicJwk.jwkTypeHumanDescription}`)\n }\n const alg = supportedSignatureAlgorithms[0]\n\n return {\n alg,\n publicJwk,\n cnf: {\n // We need to include the whole didUrl here, otherwise the verifier\n // won't know which did it is associated with\n kid: holder.didUrl,\n },\n }\n }\n if (holder.method === 'jwk') {\n const publicJwk = holder.jwk\n const alg = publicJwk.supportedSignatureAlgorithms[0]\n\n if (forSigning) {\n publicJwk.keyId = jwkKeyId ?? publicJwk.legacyKeyId\n }\n\n return {\n alg,\n publicJwk,\n cnf: {\n jwk: publicJwk.toJson(),\n },\n }\n }\n\n throw new CredoError(\"Unsupported credential holder binding. Only 'did' and 'jwk' are supported at the moment.\")\n}\n\n/**\n * Set the `alg` from a JWT header on the public jwk, so signing and verification use the\n * algorithm of the JWT rather than the first supported signature algorithm of the key.\n *\n * Throws an error if the alg is not a known JWA signature algorithm, or if the alg is not\n * supported by the jwk.\n */\nexport function setJwkAlgFromJwtHeader(publicJwk: PublicJwk, jwtHeaderAlg: unknown) {\n if (typeof jwtHeaderAlg !== 'string' || !isKnownJwaSignatureAlgorithm(jwtHeaderAlg)) {\n throw new CredoError(`Expected JWT header 'alg' to be a known JWA signature algorithm, found '${jwtHeaderAlg}'`)\n }\n\n publicJwk.alg = jwtHeaderAlg\n}\n\n/**\n * Hashing algorithms that can be used for the disclosure digests of an SD-JWT, and are placed\n * in the `_sd_alg` claim.\n *\n * `sha-1` is omitted, as SD-JWT requires a hash algorithm that is considered secure at the\n * time of issuance.\n *\n * @see https://www.ietf.org/archive/id/draft-ietf-oauth-selective-disclosure-jwt-22.html#name-hash-function-claim\n */\nexport const sdJwtHashingAlgorithms: Array<Exclude<HashName, 'sha-1'>> = ['sha-256', 'sha-384', 'sha-512']\n\n/**\n * Get the hashing algorithm to use for the disclosure digests of an SD-JWT, defaulting to `sha-256`.\n *\n * The sign options already exclude insecure hashing algorithms on a type level, but this is\n * enforced at runtime as well, as the value can originate from JavaScript callers or dynamic input.\n */\nexport function getSdJwtHashingAlgorithm(hashingAlgorithm?: HashName): Exclude<HashName, 'sha-1'> {\n const hashAlg = hashingAlgorithm ?? 'sha-256'\n\n if (!sdJwtHashingAlgorithms.includes(hashAlg as Exclude<HashName, 'sha-1'>)) {\n throw new CredoError(\n `Unsupported hashing algorithm '${hashAlg}' for the disclosure digests of an SD-JWT. Supported hashing algorithms are ${sdJwtHashingAlgorithms.join(', ')}`\n )\n }\n\n return hashAlg as Exclude<HashName, 'sha-1'>\n}\n\nexport function getSdJwtSigner(agentContext: AgentContext, key: PublicJwk): Signer {\n const kms = agentContext.resolve(KeyManagementApi)\n\n return async (input: string) => {\n const result = await kms.sign({\n keyId: key.keyId,\n data: TypedArrayEncoder.fromUtf8String(input),\n algorithm: key.signatureAlgorithm,\n })\n\n return TypedArrayEncoder.toBase64Url(result.signature)\n }\n}\n\nexport function getSdJwtVerifier(agentContext: AgentContext, key: PublicJwk): Verifier {\n const kms = agentContext.resolve(KeyManagementApi)\n\n return async (message: string, signatureBase64Url: string) => {\n const result = await kms.verify({\n signature: TypedArrayEncoder.fromBase64Url(signatureBase64Url),\n key: {\n publicJwk: key.toJson(),\n },\n data: TypedArrayEncoder.fromUtf8String(message),\n algorithm: key.signatureAlgorithm,\n })\n\n return result.verified\n }\n}\n\nexport interface CnfPayload {\n jwk?: Jwk\n kid?: string\n}\n\nexport function parseHolderBindingFromCredential(payload?: Record<string, unknown>): SdJwtVcHolderBinding | null {\n if (!payload) {\n throw new CredoError('Unable to extract payload from SD-JWT VC')\n }\n\n if (!payload.cnf) {\n return null\n }\n const cnf: CnfPayload = payload.cnf\n\n if (cnf.jwk) {\n return {\n method: 'jwk',\n jwk: PublicJwk.fromUnknown(cnf.jwk),\n }\n }\n if (cnf.kid) {\n if (!cnf.kid.startsWith('did:') || !cnf.kid.includes('#')) {\n throw new CredoError('Invalid holder kid for did. Only absolute KIDs for cnf are supported')\n }\n return {\n method: 'did',\n didUrl: cnf.kid,\n }\n }\n\n throw new CredoError(\"Unsupported credential holder binding. Only 'did' and 'jwk' are supported at the moment.\")\n}\n\nexport function parseIssuerFromCredential(\n header?: Record<string, unknown>,\n payload?: Record<string, unknown>\n): SdJwtVcIssuer {\n if (!payload || !header) throw new SdJwtVcError('SD-JWT is missing payload')\n const iss = payload.iss as string | undefined\n\n if (header?.x5c) {\n if (!Array.isArray(header.x5c)) {\n throw new SdJwtVcError('Invalid x5c header in credential. Not an array.')\n }\n if (header.x5c.length === 0) {\n throw new SdJwtVcError('Invalid x5c header in credential. Empty array.')\n }\n if (header.x5c.some((x5c) => typeof x5c !== 'string')) {\n throw new SdJwtVcError('Invalid x5c header in credential. Not an array of strings.')\n }\n\n const certificateChain = header.x5c.map((cert) => X509Certificate.fromEncodedCertificate(cert))\n\n return {\n method: 'x5c',\n x5c: certificateChain,\n issuer: iss,\n }\n }\n\n if (iss?.startsWith('did:')) {\n // If `did` is used, we require a relative KID to be present to identify\n // the key used by issuer to sign the sd-jwt-vc\n if (!header.kid) {\n throw new SdJwtVcError('Credential does not contain a kid in the header')\n }\n\n const issuerKid = header.kid as string\n\n let didUrl: string\n if (issuerKid.startsWith('#')) {\n didUrl = `${iss}${issuerKid}`\n } else if (issuerKid.startsWith('did:')) {\n const didFromKid = parseDid(issuerKid)\n if (didFromKid.did !== iss) {\n throw new SdJwtVcError(\n `kid in header is an absolute DID URL, but the did (${didFromKid.did}) does not match with the 'iss' did (${iss})`\n )\n }\n\n didUrl = issuerKid\n } else {\n throw new SdJwtVcError(\n 'Invalid issuer kid for did. Only absolute or relative (starting with #) did urls are supported.'\n )\n }\n\n return {\n method: 'did',\n didUrl,\n }\n }\n\n throw new SdJwtVcError('Unsupported signing method for SD-JWT VC. Only did and x5c are supported at the moment.')\n}\n"],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ import { ProofPurpose } from "./linked-data-proofs/proof-purposes/ProofPurpose.m
|
|
|
13
13
|
import "./linked-data-proofs/index.mjs";
|
|
14
14
|
import { W3cCredentialRecord } from "./repository/W3cCredentialRecord.mjs";
|
|
15
15
|
import "./repository/index.mjs";
|
|
16
|
-
import { TrustedIssuerDid } from "../../agent/TrustedIssuersForVerification.mjs";
|
|
16
|
+
import { GetTrustedIssuersForCredential, TrustedIssuerDid } from "../../agent/TrustedIssuersForVerification.mjs";
|
|
17
17
|
import "../kms/index.mjs";
|
|
18
18
|
//#region src/modules/vc/W3cCredentialServiceOptions.d.ts
|
|
19
19
|
export type W3cSignCredentialOptions<Format extends ClaimFormat.JwtVc | ClaimFormat.LdpVc | undefined = undefined> = Format extends ClaimFormat.JwtVc ? W3cJwtSignCredentialOptions : Format extends ClaimFormat.LdpVc ? W3cJsonLdSignCredentialOptions : W3cJwtSignCredentialOptions | W3cJsonLdSignCredentialOptions;
|
|
@@ -69,9 +69,9 @@ interface W3cVerifyCredentialOptionsBase {
|
|
|
69
69
|
*/
|
|
70
70
|
verifyCredentialStatus?: boolean;
|
|
71
71
|
/**
|
|
72
|
-
* Trusted issuers for the verification.
|
|
72
|
+
* Trusted issuers for the verification, or a callback that resolves them for each credential.
|
|
73
73
|
*/
|
|
74
|
-
trustedIssuers?: TrustedIssuerDid[];
|
|
74
|
+
trustedIssuers?: TrustedIssuerDid[] | GetTrustedIssuersForCredential;
|
|
75
75
|
}
|
|
76
76
|
export interface W3cJwtVerifyCredentialOptions extends W3cVerifyCredentialOptionsBase {
|
|
77
77
|
credential: W3cJwtVerifiableCredential | string;
|
|
@@ -148,9 +148,9 @@ interface W3cVerifyPresentationOptionsBase {
|
|
|
148
148
|
*/
|
|
149
149
|
verifyCredentialStatus?: boolean;
|
|
150
150
|
/**
|
|
151
|
-
* Trusted issuers for the verification.
|
|
151
|
+
* Trusted issuers for the verification, or a callback that resolves them for each credential.
|
|
152
152
|
*/
|
|
153
|
-
trustedIssuers?: TrustedIssuerDid[];
|
|
153
|
+
trustedIssuers?: TrustedIssuerDid[] | GetTrustedIssuersForCredential;
|
|
154
154
|
}
|
|
155
155
|
export interface W3cJwtVerifyPresentationOptions extends W3cVerifyPresentationOptionsBase {
|
|
156
156
|
presentation: W3cJwtVerifiablePresentation | string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"W3cCredentialServiceOptions.d.mts","names":[],"sources":["../../../src/modules/vc/W3cCredentialServiceOptions.ts"],"mappings":";;;;;;;;;;;;;;;;;;YAWY,yBAAyB,eAAe,YAAY,QAAQ,YAAY,iCAClF,eAAe,YAAY,QACvB,8BACA,eAAe,YAAY,QACzB,iCACA,8BAA8B;YAC1B,2BAA2B,eAAe,YAAY,QAAQ,YAAY,iCACpF,eAAe,YAAY,QACvB,gCACA,eAAe,YAAY,QACzB,mCACA,gCAAgC;YAC5B,2BAA2B,eAAe,YAAY,QAAQ,YAAY,iCACpF,eAAe,YAAY,QACvB,gCACA,eAAe,YAAY,QACzB,mCACA,gCAAgC;YAC5B,+BAA+B,kCAAkC;UAEnE;;;;;;EAMR,QAAQ;;;;EAKR,YAAY;;;;;;EAOZ;;iBAGe,oCAAoC;EACnD,QAAQ,YAAY;;;;;;EAOpB,KAAK;;iBAGU,uCAAuC;;;;;EAKtD,QAAQ,YAAY;;;;;;EAOpB;EAEA,eAAe;EACf;;UAGQ;EACR;;;;EAKA;;;;EAKA,iBAAiB;;
|
|
1
|
+
{"version":3,"file":"W3cCredentialServiceOptions.d.mts","names":[],"sources":["../../../src/modules/vc/W3cCredentialServiceOptions.ts"],"mappings":";;;;;;;;;;;;;;;;;;YAWY,yBAAyB,eAAe,YAAY,QAAQ,YAAY,iCAClF,eAAe,YAAY,QACvB,8BACA,eAAe,YAAY,QACzB,iCACA,8BAA8B;YAC1B,2BAA2B,eAAe,YAAY,QAAQ,YAAY,iCACpF,eAAe,YAAY,QACvB,gCACA,eAAe,YAAY,QACzB,mCACA,gCAAgC;YAC5B,2BAA2B,eAAe,YAAY,QAAQ,YAAY,iCACpF,eAAe,YAAY,QACvB,gCACA,eAAe,YAAY,QACzB,mCACA,gCAAgC;YAC5B,+BAA+B,kCAAkC;UAEnE;;;;;;EAMR,QAAQ;;;;EAKR,YAAY;;;;;;EAOZ;;iBAGe,oCAAoC;EACnD,QAAQ,YAAY;;;;;;EAOpB,KAAK;;iBAGU,uCAAuC;;;;;EAKtD,QAAQ,YAAY;;;;;;EAOpB;EAEA,eAAe;EACf;;UAGQ;EACR;;;;EAKA;;;;EAKA,iBAAiB,qBAAqB;;iBAGvB,sCAAsC;EACrD,YAAY;;iBAGG,yCAAyC;EACxD,YAAY;EACZ,eAAe;;iBAGA;EACf,aAAa,cAAc;EAC3B;EACA;;UAGQ;;;;;;EAMR,QAAQ;;;;EAKR,cAAc;;;;;;EAOd;;;;EAKA;;;;EAKA;;iBAGe,yCAAyC;EACxD,QAAQ,YAAY;;;;;;EAOpB;EAEA,cAAc;;iBAGC,sCAAsC;EACrD,QAAQ,YAAY;;;;;;EAOpB,KAAK;;UAGG;;;;EAIR;;;;EAKA;;;;EAKA;;;;EAKA;;;;EAKA,iBAAiB,qBAAqB;;iBAGvB,wCAAwC;EACvD,cAAc;;iBAGC,2CAA2C;EAC1D,cAAc;EACd,UAAU;;YAGA;EACV,QAAQ"}
|
|
@@ -71,11 +71,15 @@ export declare class W3cV2CredentialService {
|
|
|
71
71
|
*/
|
|
72
72
|
verifyPresentation(agentContext: AgentContext, options: W3cV2VerifyPresentationOptions): Promise<W3cV2VerifyPresentationResult>;
|
|
73
73
|
private verifyPresentationEntry;
|
|
74
|
+
/**
|
|
75
|
+
* A credential bound to a key with `cnf` must be presented with that key.
|
|
76
|
+
*/
|
|
77
|
+
private verifyHolderBinding;
|
|
74
78
|
private extractCredentialEntriesFromPresentation;
|
|
75
79
|
private extractCredentialEntriesFromResolvedPresentation;
|
|
76
80
|
private createInvalidCredentialEntryResult;
|
|
77
81
|
private getClaimFormat;
|
|
78
|
-
private
|
|
82
|
+
private mergeHolderValidations;
|
|
79
83
|
/**
|
|
80
84
|
* Writes a credential to storage
|
|
81
85
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"W3cV2CredentialService.d.mts","names":[],"sources":["../../../src/modules/vc/W3cV2CredentialService.ts"],"mappings":";;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"W3cV2CredentialService.d.mts","names":[],"sources":["../../../src/modules/vc/W3cV2CredentialService.ts"],"mappings":";;;;;;;;;;;;;;;;;;qBA2Da;UACH;UACA;UACA;UACA;EAGN,YAAA,2BAA2B,2BAC3B,6BAA6B,6BAC7B,2BAA2B,2BAC3B,qCAAqC;;;;;;;EAc1B,eAAe,eAAe,YAAY,WAAW,YAAY,aAAa,YAAY,MACrG,cAAc,cACd,SAAS,2BAA2B,UACnC,QAAQ,0BAA0B;;;;EAsBxB,iBACX,cAAc,cACd,SAAS,+BACR,QAAQ;;;;;;;EAoCE,iBAAiB,eAAe,YAAY,WAAW,YAAY,aAAa,YAAY,MACvG,cAAc,cACd,SAAS,6BAA6B,UACrC,QAAQ,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgD1B,mBACX,cAAc,cACd,SAAS,iCACR,QAAQ;UAkHG;;;;UA4FA;UA0BN;UASA;UAMA;UAQA;UAOA;;;;;;;EAuCK,gBACX,cAAc,cACd,SAAS,8BACR,QAAQ;EAOE,uBAAuB,cAAc,cAAc,aAAU;EAI7D,wBAAwB,cAAc,eAAe,QAAQ;EAI7D,wBAAwB,cAAc,cAAc,aAAa,QAAQ;EAIzE,uBACX,cAAc,cACd,OAAO,MAAM,wBACb,eAAe,eACd,QAAQ;EAKE,4BACX,cAAc,cACd,OAAO,MAAM,yBACZ,QAAQ"}
|
|
@@ -4,7 +4,11 @@ import { asArray } from "../../utils/array.mjs";
|
|
|
4
4
|
import { injectable } from "../../plugins/index.mjs";
|
|
5
5
|
import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.mjs";
|
|
6
6
|
import __decorate from "../../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.mjs";
|
|
7
|
+
import { getPublicJwkFromVerificationMethod } from "../dids/domain/key-type/keyDidMapping.mjs";
|
|
8
|
+
import "../dids/index.mjs";
|
|
7
9
|
import "./models/ClaimFormat.mjs";
|
|
10
|
+
import "./resolveSigner.mjs";
|
|
11
|
+
import { extractKeyFromHolderBinding, parseHolderBindingFromCredential } from "../sd-jwt-vc/utils.mjs";
|
|
8
12
|
import { W3cV2JwtVerifiableCredential } from "./jwt-vc/W3cV2JwtVerifiableCredential.mjs";
|
|
9
13
|
import { W3cV2DataIntegrityVerifiableCredential } from "./data-integrity/W3cV2DataIntegrityVerifiableCredential.mjs";
|
|
10
14
|
import { W3cV2DataIntegrityVerifiablePresentation } from "./data-integrity/W3cV2DataIntegrityVerifiablePresentation.mjs";
|
|
@@ -13,10 +17,10 @@ import { W3cV2EnvelopedVerifiableCredential } from "./models/credential/W3cV2Env
|
|
|
13
17
|
import { W3cV2EnvelopedVerifiablePresentation } from "./models/presentation/W3cV2EnvelopedVerifiablePresentation.mjs";
|
|
14
18
|
import { W3cV2JwtVerifiablePresentation } from "./jwt-vc/W3cV2JwtVerifiablePresentation.mjs";
|
|
15
19
|
import { W3cV2SdJwtVerifiablePresentation } from "./sd-jwt-vc/W3cV2SdJwtVerifiablePresentation.mjs";
|
|
16
|
-
import {
|
|
20
|
+
import { getSignerForJwt } from "./v2-jwt-utils.mjs";
|
|
17
21
|
import { W3cV2JwtCredentialService } from "./jwt-vc/W3cV2JwtCredentialService.mjs";
|
|
18
22
|
import "./jwt-vc/index.mjs";
|
|
19
|
-
import {
|
|
23
|
+
import { resolveDataIntegritySigner } from "./data-integrity/v2-di-utils.mjs";
|
|
20
24
|
import { W3cV2DataIntegrityCredentialService } from "./data-integrity/W3cV2DataIntegrityCredentialService.mjs";
|
|
21
25
|
import "./data-integrity/index.mjs";
|
|
22
26
|
import { W3cV2SdJwtCredentialService } from "./sd-jwt-vc/W3cV2SdJwtCredentialService.mjs";
|
|
@@ -117,7 +121,7 @@ let W3cV2CredentialService = class W3cV2CredentialService {
|
|
|
117
121
|
credentialEntries: []
|
|
118
122
|
};
|
|
119
123
|
let entries = [];
|
|
120
|
-
let
|
|
124
|
+
let signer;
|
|
121
125
|
if (presentation instanceof W3cV2JwtVerifiablePresentation) {
|
|
122
126
|
const presentationResult = await this.w3cV2JwtCredentialService.verifyPresentation(agentContext, {
|
|
123
127
|
...options,
|
|
@@ -126,12 +130,11 @@ let W3cV2CredentialService = class W3cV2CredentialService {
|
|
|
126
130
|
validationResults.presentation = presentationResult.presentation;
|
|
127
131
|
if (!presentationResult.presentation.isValid) {
|
|
128
132
|
validationResults.isValid = false;
|
|
133
|
+
validationResults.error = presentationResult.error;
|
|
129
134
|
return validationResults;
|
|
130
135
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
else try {
|
|
134
|
-
signerId = (await getVerificationMethodForJwt(agentContext, presentation, ["authentication"])).controller;
|
|
136
|
+
try {
|
|
137
|
+
signer = await getSignerForJwt(agentContext, presentation, ["authentication"]);
|
|
135
138
|
} catch (error) {
|
|
136
139
|
validationResults.isValid = false;
|
|
137
140
|
validationResults.error = error;
|
|
@@ -146,12 +149,11 @@ let W3cV2CredentialService = class W3cV2CredentialService {
|
|
|
146
149
|
validationResults.presentation = presentationResult.presentation;
|
|
147
150
|
if (!presentationResult.presentation.isValid) {
|
|
148
151
|
validationResults.isValid = false;
|
|
152
|
+
validationResults.error = presentationResult.error;
|
|
149
153
|
return validationResults;
|
|
150
154
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
else try {
|
|
154
|
-
signerId = (await getVerificationMethodForJwt(agentContext, presentation, ["authentication"])).controller;
|
|
155
|
+
try {
|
|
156
|
+
signer = await getSignerForJwt(agentContext, presentation, ["authentication"]);
|
|
155
157
|
} catch (error) {
|
|
156
158
|
validationResults.isValid = false;
|
|
157
159
|
validationResults.error = error;
|
|
@@ -166,11 +168,11 @@ let W3cV2CredentialService = class W3cV2CredentialService {
|
|
|
166
168
|
validationResults.presentation = presentationResult.presentation;
|
|
167
169
|
if (!presentationResult.presentation.isValid) {
|
|
168
170
|
validationResults.isValid = false;
|
|
171
|
+
validationResults.error = presentationResult.error;
|
|
169
172
|
return validationResults;
|
|
170
173
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
signerId = await getSignerForDataIntegrityProof(agentContext, presentation.securedPresentation, "authentication");
|
|
174
|
+
try {
|
|
175
|
+
signer = await resolveDataIntegritySigner(agentContext, presentation.securedPresentation, "authentication", presentation.resolvedPresentation.holderId);
|
|
174
176
|
} catch (error) {
|
|
175
177
|
validationResults.isValid = false;
|
|
176
178
|
validationResults.error = error;
|
|
@@ -178,24 +180,67 @@ let W3cV2CredentialService = class W3cV2CredentialService {
|
|
|
178
180
|
}
|
|
179
181
|
entries = this.extractCredentialEntriesFromPresentation(presentation);
|
|
180
182
|
} else throw new CredoError("Unsupported credential type in options. Presentation must be either a W3cV2JwtVerifiablePresentation, a W3cV2SdJwtVerifiablePresentation, or a W3cV2DataIntegrityVerifiablePresentation");
|
|
181
|
-
validationResults.credentialEntries = (await Promise.all(entries.map((entry) => this.verifyPresentationEntry(agentContext, entry,
|
|
183
|
+
validationResults.credentialEntries = (await Promise.all(entries.map((entry) => this.verifyPresentationEntry(agentContext, entry, signer, options.trustedIssuers, {
|
|
184
|
+
nonce: options.challenge,
|
|
185
|
+
audience: options.domain
|
|
186
|
+
})))).flat();
|
|
182
187
|
validationResults.isValid = validationResults.presentation.isValid && validationResults.credentialEntries.every((entry) => entry.isValid);
|
|
183
188
|
return validationResults;
|
|
184
189
|
}
|
|
185
|
-
async verifyPresentationEntry(agentContext, entry,
|
|
190
|
+
async verifyPresentationEntry(agentContext, entry, signer, trustedIssuers, presentationBinding) {
|
|
186
191
|
if (entry instanceof W3cV2DataIntegrityVerifiablePresentation) return [this.createInvalidCredentialEntryResult(new CredoError("Nested verifiable presentation entries are not supported in VC 2.0 presentations."))];
|
|
187
192
|
if (entry instanceof W3cV2DataIntegrityVerifiableCredential) {
|
|
188
|
-
const credentialResult = await this.w3cV2DataIntegrityCredentialService.verifyCredential(agentContext, {
|
|
189
|
-
|
|
193
|
+
const credentialResult = await this.w3cV2DataIntegrityCredentialService.verifyCredential(agentContext, {
|
|
194
|
+
credential: entry,
|
|
195
|
+
trustedIssuers
|
|
196
|
+
});
|
|
197
|
+
return [this.mergeHolderValidations(credentialResult, signer, entry.resolvedCredential?.credentialSubjectIds ?? [], { isValid: true })];
|
|
190
198
|
}
|
|
191
199
|
if (entry instanceof W3cV2EnvelopedVerifiablePresentation) return [this.createInvalidCredentialEntryResult(new CredoError("Nested verifiable presentation entries are not supported in VC 2.0 presentations."))];
|
|
192
200
|
if (!(entry instanceof W3cV2EnvelopedVerifiableCredential)) return [this.createInvalidCredentialEntryResult(new CredoError("Unsupported credential entry type in presentation."))];
|
|
193
201
|
const enclosed = entry.envelopedCredential;
|
|
194
202
|
let credentialResult;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
203
|
+
let claims;
|
|
204
|
+
if (enclosed instanceof W3cV2JwtVerifiableCredential) {
|
|
205
|
+
credentialResult = await this.w3cV2JwtCredentialService.verifyCredential(agentContext, {
|
|
206
|
+
credential: enclosed,
|
|
207
|
+
trustedIssuers
|
|
208
|
+
});
|
|
209
|
+
claims = enclosed.jwt.payload.toJson();
|
|
210
|
+
} else if (enclosed instanceof W3cV2SdJwtVerifiableCredential) {
|
|
211
|
+
const { nonce, audience } = presentationBinding;
|
|
212
|
+
if (enclosed.sdJwt.kbJwt && !audience) return [this.createInvalidCredentialEntryResult(new CredoError("Credential has a KB-JWT, but no domain is provided to verify its audience"))];
|
|
213
|
+
credentialResult = await this.w3cV2SdJwtCredentialService.verifyCredential(agentContext, {
|
|
214
|
+
credential: enclosed,
|
|
215
|
+
trustedIssuers,
|
|
216
|
+
keyBinding: enclosed.sdJwt.kbJwt && audience ? {
|
|
217
|
+
nonce,
|
|
218
|
+
audience
|
|
219
|
+
} : void 0
|
|
220
|
+
});
|
|
221
|
+
claims = enclosed.sdJwt.prettyClaims;
|
|
222
|
+
} else return [this.createInvalidCredentialEntryResult(new CredoError(`Credential entry uses '${this.getClaimFormat(enclosed) ?? "an unsupported enclosed credential format"}'.`))];
|
|
223
|
+
return [this.mergeHolderValidations(credentialResult, signer, entry.resolvedCredential.credentialSubjectIds, await this.verifyHolderBinding(agentContext, claims, signer))];
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* A credential bound to a key with `cnf` must be presented with that key.
|
|
227
|
+
*/
|
|
228
|
+
async verifyHolderBinding(agentContext, claims, signer) {
|
|
229
|
+
try {
|
|
230
|
+
const holderBinding = parseHolderBindingFromCredential(claims);
|
|
231
|
+
if (!holderBinding) return { isValid: true };
|
|
232
|
+
const { publicJwk } = await extractKeyFromHolderBinding(agentContext, holderBinding, { didPurposes: ["authentication"] });
|
|
233
|
+
if (publicJwk.equals(getPublicJwkFromVerificationMethod(signer.verificationMethod))) return { isValid: true };
|
|
234
|
+
return {
|
|
235
|
+
isValid: false,
|
|
236
|
+
error: new CredoError(`Credential is bound to a different key than verification method ${signer.verificationMethod.id} that signed the presentation`)
|
|
237
|
+
};
|
|
238
|
+
} catch (error) {
|
|
239
|
+
return {
|
|
240
|
+
isValid: false,
|
|
241
|
+
error
|
|
242
|
+
};
|
|
243
|
+
}
|
|
199
244
|
}
|
|
200
245
|
extractCredentialEntriesFromPresentation(presentation) {
|
|
201
246
|
return this.extractCredentialEntriesFromResolvedPresentation(presentation.resolvedPresentation);
|
|
@@ -215,18 +260,19 @@ let W3cV2CredentialService = class W3cV2CredentialService {
|
|
|
215
260
|
const candidate = value;
|
|
216
261
|
return typeof candidate.claimFormat === "string" ? candidate.claimFormat : void 0;
|
|
217
262
|
}
|
|
218
|
-
|
|
219
|
-
const presentationAuthenticatesCredentialSubject = credentialSubjectIds.some((subjectId) =>
|
|
263
|
+
mergeHolderValidations(credentialResult, signer, credentialSubjectIds, holderBinding) {
|
|
264
|
+
const presentationAuthenticatesCredentialSubject = credentialSubjectIds.some((subjectId) => signer.signer === subjectId);
|
|
220
265
|
const credentialSubjectAuthentication = credentialSubjectIds.length > 0 && !presentationAuthenticatesCredentialSubject ? {
|
|
221
266
|
isValid: false,
|
|
222
267
|
error: new CredoError("Credential has one or more credentialSubject ids, but presentation does not authenticate credential subject")
|
|
223
268
|
} : { isValid: true };
|
|
224
269
|
return {
|
|
225
270
|
...credentialResult,
|
|
226
|
-
isValid: credentialResult.isValid && credentialSubjectAuthentication.isValid,
|
|
271
|
+
isValid: credentialResult.isValid && credentialSubjectAuthentication.isValid && holderBinding.isValid,
|
|
227
272
|
validations: {
|
|
228
273
|
...credentialResult.validations,
|
|
229
|
-
credentialSubjectAuthentication
|
|
274
|
+
credentialSubjectAuthentication,
|
|
275
|
+
holderBinding
|
|
230
276
|
}
|
|
231
277
|
};
|
|
232
278
|
}
|