@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.
Files changed (92) hide show
  1. package/build/agent/TrustedIssuerContext.d.mts +11 -1
  2. package/build/agent/TrustedIssuerContext.d.mts.map +1 -1
  3. package/build/agent/TrustedIssuerContext.mjs +7 -0
  4. package/build/agent/TrustedIssuerContext.mjs.map +1 -1
  5. package/build/agent/TrustedIssuersForVerification.d.mts +11 -1
  6. package/build/agent/TrustedIssuersForVerification.d.mts.map +1 -1
  7. package/build/index.d.mts +3 -3
  8. package/build/index.mjs +2 -2
  9. package/build/modules/dcql/DcqlService.d.mts.map +1 -1
  10. package/build/modules/dcql/DcqlService.mjs +24 -12
  11. package/build/modules/dcql/DcqlService.mjs.map +1 -1
  12. package/build/modules/dids/domain/verificationMethod/JsonWebKey2020.d.mts +24 -24
  13. package/build/modules/dids/methods/jwk/DidJwk.d.mts +24 -24
  14. package/build/modules/dids/services/DidResolverService.d.mts +4 -0
  15. package/build/modules/dids/services/DidResolverService.d.mts.map +1 -1
  16. package/build/modules/dids/services/DidResolverService.mjs +21 -5
  17. package/build/modules/dids/services/DidResolverService.mjs.map +1 -1
  18. package/build/modules/kms/KeyManagementApi.d.mts +14 -14
  19. package/build/modules/kms/jwk/jwa.d.mts +1 -1
  20. package/build/modules/kms/jwk/knownJwk.d.mts +4 -4
  21. package/build/modules/kms/jwk/kty/ec/P256PublicJwk.d.mts +1 -1
  22. package/build/modules/kms/jwk/kty/ec/P384PublicJwk.d.mts +1 -1
  23. package/build/modules/kms/jwk/kty/ec/P521PublicJwk.d.mts +1 -1
  24. package/build/modules/kms/jwk/kty/ec/Secp256k1PublicJwk.d.mts +1 -1
  25. package/build/modules/kms/jwk/kty/okp/Ed25519PublicJwk.d.mts +2 -2
  26. package/build/modules/kms/jwk/kty/okp/X25519PublicJwk.d.mts +1 -1
  27. package/build/modules/kms/jwk/kty/okp/okpJwk.d.mts +2 -2
  28. package/build/modules/kms/options/KmsCreateKeyOptions.d.mts +3 -3
  29. package/build/modules/kms/options/KmsSignOptions.d.mts +1 -1
  30. package/build/modules/kms/options/KmsVerifyOptions.d.mts +2 -2
  31. package/build/modules/mdoc/repository/MdocRecord.d.mts +1 -1
  32. package/build/modules/sd-jwt-vc/repository/SdJwtVcRecord.d.mts +1 -1
  33. package/build/modules/sd-jwt-vc/utils.mjs +4 -4
  34. package/build/modules/sd-jwt-vc/utils.mjs.map +1 -1
  35. package/build/modules/vc/W3cCredentialServiceOptions.d.mts +5 -5
  36. package/build/modules/vc/W3cCredentialServiceOptions.d.mts.map +1 -1
  37. package/build/modules/vc/W3cV2CredentialService.d.mts +5 -1
  38. package/build/modules/vc/W3cV2CredentialService.d.mts.map +1 -1
  39. package/build/modules/vc/W3cV2CredentialService.mjs +72 -26
  40. package/build/modules/vc/W3cV2CredentialService.mjs.map +1 -1
  41. package/build/modules/vc/W3cV2CredentialServiceOptions.d.mts +14 -6
  42. package/build/modules/vc/W3cV2CredentialServiceOptions.d.mts.map +1 -1
  43. package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.d.mts +0 -18
  44. package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.d.mts.map +1 -1
  45. package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.mjs +38 -36
  46. package/build/modules/vc/data-integrity/W3cV2DataIntegrityCredentialService.mjs.map +1 -1
  47. package/build/modules/vc/data-integrity/v2-di-utils.mjs +17 -35
  48. package/build/modules/vc/data-integrity/v2-di-utils.mjs.map +1 -1
  49. package/build/modules/vc/jwt-vc/W3cJwtCredentialService.d.mts +0 -23
  50. package/build/modules/vc/jwt-vc/W3cJwtCredentialService.d.mts.map +1 -1
  51. package/build/modules/vc/jwt-vc/W3cJwtCredentialService.mjs +17 -68
  52. package/build/modules/vc/jwt-vc/W3cJwtCredentialService.mjs.map +1 -1
  53. package/build/modules/vc/jwt-vc/W3cV2JwtCredentialService.d.mts.map +1 -1
  54. package/build/modules/vc/jwt-vc/W3cV2JwtCredentialService.mjs +11 -17
  55. package/build/modules/vc/jwt-vc/W3cV2JwtCredentialService.mjs.map +1 -1
  56. package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.d.mts +5 -0
  57. package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.d.mts.map +1 -1
  58. package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.mjs +18 -4
  59. package/build/modules/vc/linked-data-proofs/W3cJsonLdCredentialService.mjs.map +1 -1
  60. package/build/modules/vc/models/W3cV2VerifyResult.d.mts +6 -0
  61. package/build/modules/vc/models/W3cV2VerifyResult.d.mts.map +1 -1
  62. package/build/modules/vc/resolveSigner.mjs +74 -0
  63. package/build/modules/vc/resolveSigner.mjs.map +1 -0
  64. package/build/modules/vc/sd-jwt-vc/W3cV2SdJwtCredentialService.d.mts.map +1 -1
  65. package/build/modules/vc/sd-jwt-vc/W3cV2SdJwtCredentialService.mjs +16 -18
  66. package/build/modules/vc/sd-jwt-vc/W3cV2SdJwtCredentialService.mjs.map +1 -1
  67. package/build/modules/vc/sd-jwt-vc/disclosureFrame.d.mts +1 -1
  68. package/build/modules/vc/sd-jwt-vc/disclosureFrame.d.mts.map +1 -1
  69. package/build/modules/vc/sd-jwt-vc/disclosureFrame.mjs +2 -1
  70. package/build/modules/vc/sd-jwt-vc/disclosureFrame.mjs.map +1 -1
  71. package/build/modules/vc/v2-jwt-utils.mjs +54 -55
  72. package/build/modules/vc/v2-jwt-utils.mjs.map +1 -1
  73. package/build/modules/x509/X509ModuleConfig.d.mts +5 -13
  74. package/build/modules/x509/X509ModuleConfig.d.mts.map +1 -1
  75. package/build/modules/x509/X509ModuleConfig.mjs +2 -1
  76. package/build/modules/x509/X509ModuleConfig.mjs.map +1 -1
  77. package/build/modules/x509/X509RevocationService.d.mts.map +1 -1
  78. package/build/modules/x509/X509RevocationService.mjs +17 -20
  79. package/build/modules/x509/X509RevocationService.mjs.map +1 -1
  80. package/build/modules/x509/X509Service.mjs +1 -1
  81. package/build/modules/x509/X509Service.mjs.map +1 -1
  82. package/build/modules/x509/X509ServiceOptions.d.mts +4 -6
  83. package/build/modules/x509/X509ServiceOptions.d.mts.map +1 -1
  84. package/build/modules/x509/X509ValidationOptions.d.mts +19 -2
  85. package/build/modules/x509/X509ValidationOptions.d.mts.map +1 -1
  86. package/build/modules/x509/X509ValidationOptions.mjs +21 -1
  87. package/build/modules/x509/X509ValidationOptions.mjs.map +1 -1
  88. package/build/modules/x509/index.d.mts +2 -2
  89. package/build/modules/x509/index.mjs +2 -2
  90. package/build/modules/x509/utils/crlFetcher.mjs +1 -11
  91. package/build/modules/x509/utils/crlFetcher.mjs.map +1 -1
  92. 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" | "Ed25519" | "ES256K")[];
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" | "Ed25519" | "ES256K")[];
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" | "Ed25519" | "ES256K")[];
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" | "Ed25519" | "ES256K")[];
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" | "Ed25519" | "ES256K")[];
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: "Ed25519" | "X25519";
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" | "Ed25519" | "ES256K")[];
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" | "Ed25519" | "ES256K";
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" | "Ed25519" | "ES256K";
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, ["assertionMethod"]),
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;;iBAGF,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;;iBAGF,wCAAwC;EACvD,cAAc;;iBAGC,2CAA2C;EAC1D,cAAc;EACd,UAAU;;YAGA;EACV,QAAQ"}
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 mergeCredentialSubjectAuthenticationValidation;
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":";;;;;;;;;;;;;;;;;;qBAsDa;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;UAwHG;UAuEN;UASA;UAMA;UAQA;UAOA;;;;;;;EAmCK,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"}
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 { getVerificationMethodForJwt } from "./v2-jwt-utils.mjs";
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 { getSignerForDataIntegrityProof } from "./data-integrity/v2-di-utils.mjs";
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 signerId;
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
- const holderId = presentation.resolvedPresentation.holderId;
132
- if (holderId) signerId = holderId;
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
- const holderId = presentation.resolvedPresentation.holderId;
152
- if (holderId) signerId = holderId;
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
- signerId = presentation.resolvedPresentation.holderId;
172
- if (!signerId) try {
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, signerId)))).flat();
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, signerId) {
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, { credential: entry });
189
- return [this.mergeCredentialSubjectAuthenticationValidation(credentialResult, signerId, entry.resolvedCredential?.credentialSubjectIds ?? [])];
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
- if (enclosed instanceof W3cV2JwtVerifiableCredential) credentialResult = await this.w3cV2JwtCredentialService.verifyCredential(agentContext, { credential: enclosed });
196
- else if (enclosed instanceof W3cV2SdJwtVerifiableCredential) credentialResult = await this.w3cV2SdJwtCredentialService.verifyCredential(agentContext, { credential: enclosed });
197
- else return [this.createInvalidCredentialEntryResult(new CredoError(`Credential entry uses '${this.getClaimFormat(enclosed) ?? "an unsupported enclosed credential format"}'.`))];
198
- return [this.mergeCredentialSubjectAuthenticationValidation(credentialResult, signerId, entry.resolvedCredential.credentialSubjectIds)];
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
- mergeCredentialSubjectAuthenticationValidation(credentialResult, signerId, credentialSubjectIds) {
219
- const presentationAuthenticatesCredentialSubject = credentialSubjectIds.some((subjectId) => signerId === 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
  }