@openid4vc/openid4vci 0.3.0-alpha-20251112081659 → 0.3.0-alpha-20251113095648

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/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ContentType, URL, URLSearchParams, ValidationError, arrayEqualsIgnoreOrder, createZodFetcher, dateToSeconds, encodeToBase64Url, formatZodError, getGlobalConfig, getQueryParams, isResponseContentType, joinUriParts, objectToQueryParams, parseWithErrorHandling, setGlobalConfig, zHttpsUrl, zInteger, zIs } from "@openid4vc/utils";
2
- import { InvalidFetchResponseError, Oauth2AuthorizationServer, Oauth2Client, Oauth2ClientAuthorizationChallengeError, Oauth2Error, Oauth2ErrorCodes, Oauth2JwtVerificationError, Oauth2ServerErrorResponseError, authorizationCodeGrantIdentifier, createClientAttestationJwt, decodeJwt, fetchAuthorizationServerMetadata, fetchWellKnownMetadata, getAuthorizationServerMetadataFromList, isJwkInSet, jwtHeaderFromJwtSigner, jwtSignerFromJwt, preAuthorizedCodeGrantIdentifier, resourceRequest, verifyJwt, zAuthorizationServerMetadata, zCompactJwt, zJwk, zJwtHeader, zJwtPayload } from "@openid4vc/oauth2";
2
+ import { InvalidFetchResponseError, Oauth2AuthorizationServer, Oauth2Client, Oauth2ClientAuthorizationChallengeError, Oauth2Error, Oauth2ErrorCodes, Oauth2JwtVerificationError, Oauth2ServerErrorResponseError, authorizationCodeGrantIdentifier, createClientAttestationJwt, decodeJwt, fetchAuthorizationServerMetadata, fetchWellKnownMetadata, fullySpecifiedCoseAlgorithmArrayToJwaSignatureAlgorithmArray, getAuthorizationServerMetadataFromList, isJwkInSet, jwaSignatureAlgorithmArrayToFullySpecifiedCoseAlgorithmArray, jwtHeaderFromJwtSigner, jwtSignerFromJwt, preAuthorizedCodeGrantIdentifier, resourceRequest, verifyJwt, zAuthorizationServerMetadata, zCompactJwt, zJwk, zJwtHeader, zJwtPayload } from "@openid4vc/oauth2";
3
3
  import z from "zod";
4
4
 
5
5
  //#region src/version.ts
@@ -235,7 +235,7 @@ const zCredentialConfigurationSupportedCommonDraft15 = z.object({
235
235
  format: z.string(),
236
236
  scope: z.string().optional(),
237
237
  cryptographic_binding_methods_supported: z.array(z.string()).optional(),
238
- credential_signing_alg_values_supported: z.array(z.string()).or(z.array(z.number())).optional(),
238
+ credential_signing_alg_values_supported: z.array(z.string()).optional(),
239
239
  proof_types_supported: z.record(z.union([
240
240
  z.literal("jwt"),
241
241
  z.literal("attestation"),
@@ -257,6 +257,7 @@ const zMsoMdocFormatIdentifier = z.literal("mso_mdoc");
257
257
  const zMsoMdocCredentialIssuerMetadata = zCredentialConfigurationSupportedCommon.extend({
258
258
  format: zMsoMdocFormatIdentifier,
259
259
  doctype: z.string(),
260
+ credential_signing_alg_values_supported: z.array(z.number()).optional(),
260
261
  credential_metadata: zCredentialConfigurationSupportedCommonCredentialMetadata.extend({ claims: z.array(zMsoMdocIssuerMetadataClaimsDescription).optional() }).optional()
261
262
  });
262
263
  const zMsoMdocCredentialIssuerMetadataDraft15 = zCredentialConfigurationSupportedCommonDraft15.extend({
@@ -282,6 +283,7 @@ const zSdJwtDcFormatIdentifier = z.literal("dc+sd-jwt");
282
283
  const zSdJwtDcCredentialIssuerMetadata = zCredentialConfigurationSupportedCommon.extend({
283
284
  vct: z.string(),
284
285
  format: zSdJwtDcFormatIdentifier,
286
+ credential_signing_alg_values_supported: z.array(z.string()).optional(),
285
287
  credential_metadata: zCredentialConfigurationSupportedCommonCredentialMetadata.extend({ claims: z.array(zIssuerMetadataClaimsDescription).optional() }).optional()
286
288
  });
287
289
  const zSdJwtDcCredentialIssuerMetadataDraft15 = zCredentialConfigurationSupportedCommonDraft15.extend({
@@ -307,6 +309,7 @@ const zLegacySdJwtVcCredentialIssuerMetadataV1 = zCredentialConfigurationSupport
307
309
  vct: z.string(),
308
310
  format: zLegacySdJwtVcFormatIdentifier,
309
311
  order: z.optional(z.array(z.string())),
312
+ credential_signing_alg_values_supported: z.array(z.string()).optional(),
310
313
  credential_metadata: zCredentialConfigurationSupportedCommonCredentialMetadata.extend({ claims: z.array(zIssuerMetadataClaimsDescription).optional() }).optional(),
311
314
  credential_definition: z.optional(z.never())
312
315
  });
@@ -364,6 +367,7 @@ const zJwtVcJsonCredentialDefinitionDraft14 = zJwtVcJsonCredentialDefinition.ext
364
367
  const zJwtVcJsonCredentialIssuerMetadata = zCredentialConfigurationSupportedCommon.extend({
365
368
  format: zJwtVcJsonFormatIdentifier,
366
369
  credential_definition: zJwtVcJsonCredentialDefinition,
370
+ credential_signing_alg_values_supported: z.array(z.string()).optional(),
367
371
  credential_metadata: zCredentialConfigurationSupportedCommonCredentialMetadata.extend({ claims: z.array(zIssuerMetadataClaimsDescription).optional() }).optional()
368
372
  });
369
373
  const zJwtVcJsonCredentialIssuerMetadataDraft15 = zCredentialConfigurationSupportedCommonDraft15.extend({
@@ -424,6 +428,7 @@ const zJwtVcJsonLdFormatIdentifier = z.literal("jwt_vc_json-ld");
424
428
  const zJwtVcJsonLdCredentialIssuerMetadata = zCredentialConfigurationSupportedCommon.extend({
425
429
  format: zJwtVcJsonLdFormatIdentifier,
426
430
  credential_definition: zW3cVcJsonLdCredentialDefinition,
431
+ credential_signing_alg_values_supported: z.array(z.string()).optional(),
427
432
  credential_metadata: zCredentialConfigurationSupportedCommonCredentialMetadata.extend({ claims: z.array(zIssuerMetadataClaimsDescription).optional() }).optional()
428
433
  });
429
434
  const zJwtVcJsonLdCredentialIssuerMetadataDraft15 = zCredentialConfigurationSupportedCommonDraft15.extend({
@@ -489,6 +494,7 @@ const zLdpVcFormatIdentifier = z.literal("ldp_vc");
489
494
  const zLdpVcCredentialIssuerMetadata = zCredentialConfigurationSupportedCommon.extend({
490
495
  format: zLdpVcFormatIdentifier,
491
496
  credential_definition: zW3cVcJsonLdCredentialDefinition,
497
+ credential_signing_alg_values_supported: z.array(z.string()).optional(),
492
498
  credential_metadata: zCredentialConfigurationSupportedCommonCredentialMetadata.extend({ claims: z.array(zIssuerMetadataClaimsDescription).optional() }).optional()
493
499
  });
494
500
  const zLdpVcCredentialIssuerMetadataDraft15 = zCredentialConfigurationSupportedCommonDraft15.extend({
@@ -555,6 +561,7 @@ const zSdJwtW3VcCredentialDefinition = z.object({ type: z.tuple([z.string()], z.
555
561
  const zSdJwtW3VcCredentialIssuerMetadata = zCredentialConfigurationSupportedCommon.extend({
556
562
  format: zSdJwtW3VcFormatIdentifier,
557
563
  credential_definition: zSdJwtW3VcCredentialDefinition,
564
+ credential_signing_alg_values_supported: z.array(z.string()).optional(),
558
565
  credential_metadata: zCredentialConfigurationSupportedCommonCredentialMetadata.extend({ claims: z.array(zIssuerMetadataClaimsDescription).optional() }).optional(),
559
566
  vct: z.optional(z.never())
560
567
  });
@@ -628,7 +635,7 @@ const zCredentialIssuerMetadataDraft14Draft15V1 = z.object({
628
635
  display: z.array(zCredentialIssuerMetadataDisplayEntry).optional(),
629
636
  credential_configurations_supported: z.record(z.string(), zCredentialConfigurationSupportedWithFormats)
630
637
  }).loose();
631
- const zCredentialConfigurationSupportedDraft11To16 = z.object({
638
+ const zCredentialConfigurationSupportedDraft11ToV1 = z.object({
632
639
  id: z.string().optional(),
633
640
  format: z.string(),
634
641
  cryptographic_suites_supported: z.array(z.string()).optional(),
@@ -637,9 +644,10 @@ const zCredentialConfigurationSupportedDraft11To16 = z.object({
637
644
  background_image: z.object({ url: z.url().optional() }).loose().optional()
638
645
  }).loose()).optional(),
639
646
  claims: z.any().optional()
640
- }).loose().transform(({ cryptographic_suites_supported, display, claims, id,...rest }) => ({
647
+ }).loose().transform(({ cryptographic_suites_supported, display, claims, id, format,...rest }) => ({
641
648
  ...rest,
642
- ...cryptographic_suites_supported ? { credential_signing_alg_values_supported: cryptographic_suites_supported } : {},
649
+ format,
650
+ ...cryptographic_suites_supported ? { credential_signing_alg_values_supported: format === zMsoMdocFormatIdentifier.value ? jwaSignatureAlgorithmArrayToFullySpecifiedCoseAlgorithmArray(cryptographic_suites_supported) : cryptographic_suites_supported } : {},
643
651
  ...claims || display ? { credential_metadata: {
644
652
  ...claims ? { claims } : {},
645
653
  ...display ? { display: display.map(({ logo, background_image,...displayRest }) => ({
@@ -666,9 +674,10 @@ const zCredentialConfigurationSupportedDraft11To16 = z.object({
666
674
  const zCredentialConfigurationSupportedV1ToDraft11 = zCredentialConfigurationSupportedWithFormats.transform(({ credential_metadata,...rest }) => ({
667
675
  ...credential_metadata,
668
676
  ...rest
669
- })).and(z.object({ id: z.string() }).loose()).transform(({ id, credential_signing_alg_values_supported, display, proof_types_supported, scope,...rest }) => ({
677
+ })).and(z.object({ id: z.string() }).loose()).transform(({ id, credential_signing_alg_values_supported, display, proof_types_supported, scope, format,...rest }) => ({
670
678
  ...rest,
671
- ...credential_signing_alg_values_supported ? { cryptographic_suites_supported: credential_signing_alg_values_supported } : {},
679
+ format,
680
+ ...credential_signing_alg_values_supported ? { cryptographic_suites_supported: format === zMsoMdocFormatIdentifier.value && typeof credential_signing_alg_values_supported[0] === "number" ? fullySpecifiedCoseAlgorithmArrayToJwaSignatureAlgorithmArray(credential_signing_alg_values_supported) : credential_signing_alg_values_supported } : {},
672
681
  ...display ? { display: display.map(({ logo, background_image,...displayRest }) => {
673
682
  const { uri: logoUri,...logoRest } = logo ?? {};
674
683
  const { uri: backgroundImageUri,...backgroundImageRest } = background_image ?? {};
@@ -695,7 +704,7 @@ const zCredentialConfigurationSupportedV1ToDraft11 = zCredentialConfigurationSup
695
704
  zJwtVcJsonLdFormatIdentifier.value
696
705
  ].includes(input)) }).loose()
697
706
  ]));
698
- const zCredentialIssuerMetadataDraft11To16 = z.object({
707
+ const zCredentialIssuerMetadataDraft11ToV1 = z.object({
699
708
  authorization_server: z.string().optional(),
700
709
  credentials_supported: z.array(z.object({ id: z.string().optional() }).loose())
701
710
  }).loose().transform(({ authorization_server, credentials_supported,...rest }) => {
@@ -704,7 +713,7 @@ const zCredentialIssuerMetadataDraft11To16 = z.object({
704
713
  ...authorization_server ? { authorization_servers: [authorization_server] } : {},
705
714
  credential_configurations_supported: Object.fromEntries(credentials_supported.map((supported) => supported.id ? [supported.id, supported] : void 0).filter((i) => i !== void 0))
706
715
  };
707
- }).pipe(z.object({ credential_configurations_supported: z.record(z.string(), zCredentialConfigurationSupportedDraft11To16) }).loose()).pipe(zCredentialIssuerMetadataDraft14Draft15V1);
716
+ }).pipe(z.object({ credential_configurations_supported: z.record(z.string(), zCredentialConfigurationSupportedDraft11ToV1) }).loose()).pipe(zCredentialIssuerMetadataDraft14Draft15V1);
708
717
  const zCredentialIssuerMetadataWithDraft11 = zCredentialIssuerMetadataDraft14Draft15V1.transform((issuerMetadata) => ({
709
718
  ...issuerMetadata,
710
719
  ...issuerMetadata.authorization_servers ? { authorization_server: issuerMetadata.authorization_servers[0] } : {},
@@ -713,7 +722,7 @@ const zCredentialIssuerMetadataWithDraft11 = zCredentialIssuerMetadataDraft14Dra
713
722
  id
714
723
  }))
715
724
  })).pipe(zCredentialIssuerMetadataDraft14Draft15V1.extend({ credentials_supported: z.array(zCredentialConfigurationSupportedV1ToDraft11) }));
716
- const zCredentialIssuerMetadata = z.union([zCredentialIssuerMetadataDraft14Draft15V1, zCredentialIssuerMetadataDraft11To16]);
725
+ const zCredentialIssuerMetadata = z.union([zCredentialIssuerMetadataDraft14Draft15V1, zCredentialIssuerMetadataDraft11ToV1]);
717
726
  const zCredentialIssuerMetadataWithDraftVersion = z.union([zCredentialIssuerMetadataDraft14Draft15V1.transform((credentialIssuerMetadata) => {
718
727
  const credentialConfigurations = Object.values(credentialIssuerMetadata.credential_configurations_supported);
719
728
  const isDraft15 = credentialConfigurations.some((configuration) => {
@@ -725,9 +734,9 @@ const zCredentialIssuerMetadataWithDraftVersion = z.union([zCredentialIssuerMeta
725
734
  });
726
735
  return {
727
736
  credentialIssuerMetadata,
728
- originalDraftVersion: credentialConfigurations.some((configuration) => configuration.credential_metadata) ? Openid4vciDraftVersion.V1 : isDraft15 ? Openid4vciDraftVersion.Draft15 : Openid4vciDraftVersion.Draft14
737
+ originalDraftVersion: credentialConfigurations.some((configuration) => configuration.credential_metadata || configuration.format === "mso_mdoc" && configuration.credential_signing_alg_values_supported?.some((supported) => typeof supported === "number")) ? Openid4vciDraftVersion.V1 : isDraft15 ? Openid4vciDraftVersion.Draft15 : Openid4vciDraftVersion.Draft14
729
738
  };
730
- }), zCredentialIssuerMetadataDraft11To16.transform((credentialIssuerMetadata) => ({
739
+ }), zCredentialIssuerMetadataDraft11ToV1.transform((credentialIssuerMetadata) => ({
731
740
  credentialIssuerMetadata,
732
741
  originalDraftVersion: Openid4vciDraftVersion.Draft11
733
742
  }))]);
@@ -949,7 +958,7 @@ function credentialsSupportedToCredentialConfigurationsSupported(credentialsSupp
949
958
  for (let index = 0; index < credentialsSupported.length; index++) {
950
959
  const credentialSupported = credentialsSupported[index];
951
960
  if (!credentialSupported.id) throw new Openid4vciError(`Credential supported at index '${index}' does not have an 'id' property. Credential configuration requires the 'id' property as key`);
952
- const parseResult = zCredentialConfigurationSupportedDraft11To16.safeParse(credentialSupported);
961
+ const parseResult = zCredentialConfigurationSupportedDraft11ToV1.safeParse(credentialSupported);
953
962
  if (!parseResult.success) throw new ValidationError(`Error transforming credential supported with id '${credentialSupported.id}' to credential configuration supported format`, parseResult.error);
954
963
  credentialConfigurationsSupported[credentialSupported.id] = parseResult.data;
955
964
  }