From 434196e4ce2f895b43ec9992d682a603aaa612a3 Mon Sep 17 00:00:00 2001 From: Niels Klomp Date: Thu, 30 May 2024 01:11:31 +0200 Subject: [PATCH] feat: allow default auth request options for VCI links/machines, like clientId and redirectUri --- packages/oid4vci-holder/package.json | 4 +- .../oid4vci-holder/src/agent/OID4VCIHolder.ts | 74 ++++++++++++------- .../src/agent/OID4VCIHolderService.ts | 64 ++++++++-------- .../oid4vci-holder/src/link-handler/index.ts | 16 +++- .../src/types/IOID4VCIHolder.ts | 15 +++- packages/oid4vci-issuer-rest-api/package.json | 6 +- .../oid4vci-issuer-rest-client/package.json | 2 +- packages/oid4vci-issuer-store/package.json | 2 +- packages/oid4vci-issuer/package.json | 4 +- pnpm-lock.yaml | 60 +++++++-------- 10 files changed, 145 insertions(+), 102 deletions(-) diff --git a/packages/oid4vci-holder/package.json b/packages/oid4vci-holder/package.json index f74a65ea5..0900597f8 100644 --- a/packages/oid4vci-holder/package.json +++ b/packages/oid4vci-holder/package.json @@ -14,8 +14,8 @@ "build:clean": "tsc --build --clean && tsc --build" }, "dependencies": { - "@sphereon/oid4vci-client": "0.10.4-unstable.63+1d87208", - "@sphereon/oid4vci-common": "0.10.4-unstable.63+1d87208", + "@sphereon/oid4vci-client": "0.10.4-unstable.70", + "@sphereon/oid4vci-common": "0.10.4-unstable.70", "@sphereon/ssi-sdk-ext.did-utils": "0.18.0", "@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.18.0", "@sphereon/ssi-sdk.contact-manager": "workspace:*", diff --git a/packages/oid4vci-holder/src/agent/OID4VCIHolder.ts b/packages/oid4vci-holder/src/agent/OID4VCIHolder.ts index b71cc7b35..c7f0522b8 100644 --- a/packages/oid4vci-holder/src/agent/OID4VCIHolder.ts +++ b/packages/oid4vci-holder/src/agent/OID4VCIHolder.ts @@ -1,5 +1,11 @@ import { OpenID4VCIClient } from '@sphereon/oid4vci-client' -import { CredentialConfigurationSupported, DefaultURISchemes, Jwt, ProofOfPossessionCallbacks } from '@sphereon/oid4vci-common' +import { + AuthorizationRequestOpts, + CredentialConfigurationSupported, + DefaultURISchemes, + Jwt, + ProofOfPossessionCallbacks, +} from '@sphereon/oid4vci-common' import { CorrelationIdentifierType, IBasicCredentialLocaleBranding, @@ -109,6 +115,8 @@ export class OID4VCIHolder implements IAgentPlugin { SignatureAlgorithmEnum.ES256K, SignatureAlgorithmEnum.EdDSA, ] + private static readonly DEFAULT_MOBILE_REDIRECT_URI = `${DefaultURISchemes.CREDENTIAL_OFFER}://` + private readonly defaultAuthorizationRequestOpts: AuthorizationRequestOpts = { redirectUri: OID4VCIHolder.DEFAULT_MOBILE_REDIRECT_URI } private readonly onContactIdentityCreated?: (args: OnContactIdentityCreatedArgs) => Promise private readonly onCredentialStored?: (args: OnCredentialStoredArgs) => Promise private readonly onIdentifierCreated?: (args: OnIdentifierCreatedArgs) => Promise @@ -122,6 +130,7 @@ export class OID4VCIHolder implements IAgentPlugin { jsonldCryptographicSuitePreferences, didMethodPreferences, jwtCryptographicSuitePreferences, + defaultAuthRequestOptions, } = options ?? {} if (vcFormatPreferences !== undefined && vcFormatPreferences.length > 0) { @@ -136,6 +145,9 @@ export class OID4VCIHolder implements IAgentPlugin { if (jwtCryptographicSuitePreferences !== undefined && jwtCryptographicSuitePreferences.length > 0) { this.jwtCryptographicSuitePreferences = jwtCryptographicSuitePreferences } + if (defaultAuthRequestOptions) { + this.defaultAuthorizationRequestOpts = defaultAuthRequestOptions + } this.onContactIdentityCreated = onContactIdentityCreated this.onCredentialStored = onCredentialStored this.onIdentifierCreated = onIdentifierCreated @@ -174,6 +186,7 @@ export class OID4VCIHolder implements IAgentPlugin { const oid4vciMachineInstanceArgs: OID4VCIMachineInstanceOpts = { ...args, + authorizationRequestOpts: { ...this.defaultAuthorizationRequestOpts, ...args.authorizationRequestOpts }, services: { ...services, ...args.services, @@ -205,11 +218,20 @@ export class OID4VCIHolder implements IAgentPlugin { ) { return Promise.reject(Error(`Invalid OID4VCI credential offer URI: ${requestData?.uri}`)) } + const authorizationRequest = { ...this.defaultAuthorizationRequestOpts, ...args.authorizationRequestOpts } satisfies AuthorizationRequestOpts + + if (!authorizationRequest.redirectUri) { + authorizationRequest.redirectUri = OID4VCIHolder.DEFAULT_MOBILE_REDIRECT_URI + } + if (authorizationRequest.redirectUri.startsWith('http') && !authorizationRequest.clientId) { + // At least set a default for a web based wallet. + // TODO: We really need (dynamic) client registration support + authorizationRequest.clientId = authorizationRequest.redirectUri + } const openID4VCIClient = await OpenID4VCIClient.fromURI({ uri: requestData?.uri, - // TODO: It would be nice to be able to configure the plugin with a custom redirect URI, mainly for mobile - authorizationRequest: { redirectUri: `${DefaultURISchemes.CREDENTIAL_OFFER}://` }, + authorizationRequest, }) const serverMetadata = await openID4VCIClient.retrieveServerMetadata() @@ -251,7 +273,7 @@ export class OID4VCIHolder implements IAgentPlugin { const defaultCredentialType = 'VerifiableCredential' const credentialType = - credentialConfigSupported.credential_definition.type.find((type: string): boolean => type !== defaultCredentialType) ?? + credentialConfigSupported.credential_definition?.type?.find((type: string): boolean => type !== defaultCredentialType) ?? defaultCredentialType const localeBranding = credentialBranding?.[credentialType] const credentialAlias = ( @@ -385,29 +407,31 @@ export class OID4VCIHolder implements IAgentPlugin { pin, authorizationResponse: JSON.parse(await client.exportState()).authorizationCodeResponse, }) - if ('credential_definition' in issuanceOpt) { - const credentialType = issuanceOpt.credential_definition.type.length === 1? issuanceOpt.credential_definition.type[0]: issuanceOpt.credential_definition.type.filter(type=>type!='VerifiableCredential')[0] - const credentialResponse = await client.acquireCredentials({ - //fixme: this isn't the correct way to handle this. the type is wrong. we're not correctly handling moving from Record - credentialType: issuanceOpt.id ?? credentialType, - proofCallbacks: callbacks, - format: issuanceOpt.format, - // TODO: We need to update the machine and add notifications support for actual deferred credentials instead of just waiting/retrying - deferredCredentialAwait: true, - kid, - alg, - jti: uuidv4(), - }) + // @ts-ignore + const definition = issuanceOpt.credential_definition + const idFromType = + definition?.type?.length === 1 ? definition?.type[0] : definition?.type?.filter((type: string) => type !== 'VerifiableCredential')[0] + const credentialType = issuanceOpt.credentialConfigurationId ?? issuanceOpt.id ?? idFromType + if (!credentialType) { + throw Error('cannot determine credential id to request') + } + const credentialResponse = await client.acquireCredentials({ + credentialType, + proofCallbacks: callbacks, + format: issuanceOpt.format, + // TODO: We need to update the machine and add notifications support for actual deferred credentials instead of just waiting/retrying + deferredCredentialAwait: true, + kid, + alg, + jti: uuidv4(), + }) - const credential = { - id: issuanceOpt.id, - issuanceOpt, - credentialResponse, - } - return mapCredentialToAccept({ credential }) - } else { - throw new Error('IssuanceOpt is not of version 1.13 or above') // FIXME + const credential = { + id: issuanceOpt.id, + issuanceOpt, + credentialResponse, } + return mapCredentialToAccept({ credential }) } catch (error) { return Promise.reject(error) } diff --git a/packages/oid4vci-holder/src/agent/OID4VCIHolderService.ts b/packages/oid4vci-holder/src/agent/OID4VCIHolderService.ts index 6b6e212a9..ce400bf73 100644 --- a/packages/oid4vci-holder/src/agent/OID4VCIHolderService.ts +++ b/packages/oid4vci-holder/src/agent/OID4VCIHolderService.ts @@ -60,25 +60,27 @@ export const getCredentialBranding = async (args: GetCredentialBrandingArgs): Pr const { credentialsSupported, context } = args const credentialBranding: Record> = {} await Promise.all( - Object.values(credentialsSupported).map(async (credentialsConfigSupported: CredentialConfigurationSupported): Promise => { - const localeBranding: Array = await Promise.all( - (credentialsConfigSupported.display ?? []).map( - async (display: CredentialsSupportedDisplay): Promise => - await context.agent.ibCredentialLocaleBrandingFrom({ localeBranding: await credentialLocaleBrandingFrom(display) }), - ), - ) - - const defaultCredentialType = 'VerifiableCredential' - const credentialTypes: Array = - 'types' in credentialsConfigSupported // TODO credentialsConfigSupported.types is deprecated - ? (credentialsConfigSupported.types as string[]) - : 'credential_definition' in credentialsConfigSupported - ? credentialsConfigSupported.credential_definition.type - : [defaultCredentialType] - - const filteredCredentialTypes = credentialTypes.filter((type: string): boolean => type !== defaultCredentialType) - credentialBranding[filteredCredentialTypes[0]] = localeBranding // TODO for now taking the first type - }), + Object.entries(credentialsSupported).map( + ([configId, _credentialsSupported]) => + async (credentialsConfigSupported: CredentialConfigurationSupported): Promise => { + const localeBranding: Array = await Promise.all( + (credentialsConfigSupported.display ?? []).map( + async (display: CredentialsSupportedDisplay): Promise => + await context.agent.ibCredentialLocaleBrandingFrom({ localeBranding: await credentialLocaleBrandingFrom(display) }), + ), + ) + + const defaultCredentialType = 'VerifiableCredential' + const credentialTypes: Array = ('types' in credentialsConfigSupported // TODO credentialsConfigSupported.types is deprecated + ? (credentialsConfigSupported.types as string[]) + : 'credential_definition' in credentialsConfigSupported + ? credentialsConfigSupported.credential_definition.type + : [defaultCredentialType]) ?? [configId] + + const filteredCredentialTypes = credentialTypes.filter((type: string): boolean => type !== defaultCredentialType) + credentialBranding[filteredCredentialTypes[0]] = localeBranding // TODO for now taking the first type + }, + ), ) return credentialBranding @@ -217,13 +219,11 @@ export const mapCredentialToAccept = async (args: MapCredentialToAcceptArgs): Pr } export const getDefaultIssuanceOpts = async (args: GetDefaultIssuanceOptsArgs): Promise => { - //const { credentialSupported, opts, context } = args - const { credentialSupported, context } = args + const { credentialSupported, opts, context } = args const issuanceOpt = { ...credentialSupported, - didMethod: SupportedDidMethodEnum.DID_JWK, - //didMethod: opts.client.isEBSI() ? SupportedDidMethodEnum.DID_KEY : SupportedDidMethodEnum.DID_JWK, FIXME + didMethod: opts.client.isEBSI() ? SupportedDidMethodEnum.DID_KEY : SupportedDidMethodEnum.DID_JWK, keyType: 'Secp256r1', } as IssuanceOpts const identifierOpts = await getIdentifier({ issuanceOpt, context }) @@ -365,9 +365,8 @@ export const getIssuanceOpts = async (args: GetIssuanceOptsArgs): Promise => { - const { credentialSupported, didMethodPreferences } = opts + const { client, credentialSupported, didMethodPreferences } = opts const { format, cryptographic_binding_methods_supported } = credentialSupported if (cryptographic_binding_methods_supported && Array.isArray(cryptographic_binding_methods_supported)) { const method: SupportedDidMethodEnum | undefined = didMethodPreferences.find((method: SupportedDidMethodEnum) => @@ -396,11 +395,10 @@ export const getIssuanceDidMethod = async (opts: GetIssuanceDidMethodArgs): Prom } } - /* - if (client.isEBSI()) { FIXME + if (client.isEBSI()) { return SupportedDidMethodEnum.DID_KEY } -*/ + if (!format || (format.includes('jwt') && !format?.includes('jwt_vc_json_ld'))) { return format ? didMethodPreferences[1] : didMethodPreferences[0] } else { @@ -410,7 +408,7 @@ export const getIssuanceDidMethod = async (opts: GetIssuanceDidMethodArgs): Prom } export const getIssuanceCryptoSuite = async (opts: GetIssuanceCryptoSuiteArgs): Promise => { - const { credentialSupported, jwtCryptographicSuitePreferences, jsonldCryptographicSuitePreferences } = opts + const { client, credentialSupported, jwtCryptographicSuitePreferences, jsonldCryptographicSuitePreferences } = opts const signing_algs_supported: Array = credentialSupported.credential_signing_alg_values_supported ?? [] // TODO: Return array, so the wallet/user could choose @@ -425,9 +423,9 @@ export const getIssuanceCryptoSuite = async (opts: GetIssuanceCryptoSuiteArgs): if (supportedPreferences.length > 0) { return supportedPreferences[0] - } /*else if (client.isEBSI()) { FIXME + } else if (client.isEBSI()) { return SignatureAlgorithmEnum.ES256 - }*/ + } // if we cannot find supported cryptographic suites, we just try with the first preference const fallback = jwtCryptographicSuitePreferences[0] diff --git a/packages/oid4vci-holder/src/link-handler/index.ts b/packages/oid4vci-holder/src/link-handler/index.ts index 61d92f0c2..4f3050696 100644 --- a/packages/oid4vci-holder/src/link-handler/index.ts +++ b/packages/oid4vci-holder/src/link-handler/index.ts @@ -3,17 +3,25 @@ import { convertURIToJsonObject } from '@sphereon/oid4vci-common' import { DefaultLinkPriorities, LinkHandlerAdapter } from '@sphereon/ssi-sdk.core' import { IMachineStatePersistence, interpreterStartOrResume } from '@sphereon/ssi-sdk.xstate-machine-persistence' import { IAgentContext } from '@veramo/core' -import { GetMachineArgs, IOID4VCIHolder, OID4VCIMachineEvents, OID4VCIMachineInterpreter, OID4VCIMachineState } from '../types/IOID4VCIHolder' +import { + GetMachineArgs, + IOID4VCIHolder, + OID4VCIHolderOptions, + OID4VCIMachineEvents, + OID4VCIMachineInterpreter, + OID4VCIMachineState, +} from '../types/IOID4VCIHolder' export class OID4VCIHolderLinkHandler extends LinkHandlerAdapter { private readonly context: IAgentContext private readonly stateNavigationListener: | ((oid4vciMachine: OID4VCIMachineInterpreter, state: OID4VCIMachineState, navigation?: any) => Promise) | undefined - private noStateMachinePersistence: boolean + private readonly noStateMachinePersistence: boolean + private readonly options?: OID4VCIHolderOptions constructor( - args: Pick & { + args: Pick & { priority?: number | DefaultLinkPriorities protocols?: Array noStateMachinePersistence?: boolean @@ -21,6 +29,7 @@ export class OID4VCIHolderLinkHandler extends LinkHandlerAdapter { }, ) { super({ ...args, id: 'OID4VCIHolder' }) + this.options = args.options this.context = args.context this.noStateMachinePersistence = args.noStateMachinePersistence === true this.stateNavigationListener = args.stateNavigationListener @@ -39,6 +48,7 @@ export class OID4VCIHolderLinkHandler extends LinkHandlerAdapter { ...(hasCode && { code: code }), uri, }, + options: this.options, stateNavigationListener: this.stateNavigationListener, }) diff --git a/packages/oid4vci-holder/src/types/IOID4VCIHolder.ts b/packages/oid4vci-holder/src/types/IOID4VCIHolder.ts index fcc6309fb..3379aff2a 100644 --- a/packages/oid4vci-holder/src/types/IOID4VCIHolder.ts +++ b/packages/oid4vci-holder/src/types/IOID4VCIHolder.ts @@ -1,5 +1,11 @@ import { OpenID4VCIClient, OpenID4VCIClientState } from '@sphereon/oid4vci-client' -import { AuthorizationResponse, CredentialConfigurationSupported, CredentialResponse, EndpointMetadataResult } from '@sphereon/oid4vci-common' +import { + AuthorizationRequestOpts, + AuthorizationResponse, + CredentialConfigurationSupported, + CredentialResponse, + EndpointMetadataResult, +} from '@sphereon/oid4vci-common' import { IContactManager } from '@sphereon/ssi-sdk.contact-manager' import { IBasicCredentialLocaleBranding, IBasicIssuerLocaleBranding, Identity, Party } from '@sphereon/ssi-sdk.data-store' import { IIssuanceBranding } from '@sphereon/ssi-sdk.issuance-branding' @@ -40,6 +46,7 @@ export type OID4VCIHolderOptions = { onIdentifierCreated?: (args: OnIdentifierCreatedArgs) => Promise vcFormatPreferences?: Array jsonldCryptographicSuitePreferences?: Array + defaultAuthRequestOptions?: AuthorizationRequestOpts didMethodPreferences?: Array jwtCryptographicSuitePreferences?: Array } @@ -60,10 +67,11 @@ export type OnIdentifierCreatedArgs = { export type GetMachineArgs = { requestData: RequestData + options?: OID4VCIHolderOptions stateNavigationListener?: (oid4vciMachine: OID4VCIMachineInterpreter, state: OID4VCIMachineState, navigation?: any) => Promise } -export type InitiateOID4VCIArgs = Pick +export type InitiateOID4VCIArgs = Pick export type CreateCredentialSelectionArgs = Pick< OID4VCIMachineContext, 'credentialsSupported' | 'credentialBranding' | 'selectedCredentials' | 'locale' | 'openID4VCIClientState' @@ -109,6 +117,7 @@ export type MappedCredentialToAccept = { } export type OID4VCIMachineContext = { + authorizationRequestOpts?: AuthorizationRequestOpts requestData?: RequestData // TODO WAL-673 fix type as this is not always a qr code (deeplink) locale?: string authorizationCodeURL?: string @@ -194,6 +203,7 @@ export type OID4VCIMachineInstanceOpts = { guards?: any subscription?: () => void requireCustomNavigationHook?: boolean + authorizationRequestOpts?: AuthorizationRequestOpts stateNavigationListener: (oid4vciMachine: OID4VCIMachineInterpreter, state: OID4VCIMachineState, navigation?: any) => Promise } & CreateOID4VCIMachineOpts @@ -317,6 +327,7 @@ export type SelectAppLocaleBrandingArgs = { } export type IssuanceOpts = CredentialConfigurationSupported & { + credentialConfigurationId?: string // Explicit ID for a credential didMethod: SupportedDidMethodEnum keyType: TKeyType codecName?: string diff --git a/packages/oid4vci-issuer-rest-api/package.json b/packages/oid4vci-issuer-rest-api/package.json index a5f879c5f..8209942db 100644 --- a/packages/oid4vci-issuer-rest-api/package.json +++ b/packages/oid4vci-issuer-rest-api/package.json @@ -11,9 +11,9 @@ "start:dev": "ts-node __tests__/RestAPI.ts" }, "dependencies": { - "@sphereon/oid4vci-common": "0.10.4-unstable.63+1d87208", - "@sphereon/oid4vci-issuer": "0.10.4-unstable.63+1d87208", - "@sphereon/oid4vci-issuer-server": "0.10.4-unstable.63+1d87208", + "@sphereon/oid4vci-common": "0.10.4-unstable.70", + "@sphereon/oid4vci-issuer": "0.10.4-unstable.70", + "@sphereon/oid4vci-issuer-server": "0.10.4-unstable.70", "@sphereon/ssi-express-support": "workspace:*", "@sphereon/ssi-sdk.kv-store-temp": "workspace:*", "@sphereon/ssi-sdk.oid4vci-issuer": "workspace:*", diff --git a/packages/oid4vci-issuer-rest-client/package.json b/packages/oid4vci-issuer-rest-client/package.json index f1b6d2936..9f33e77b3 100644 --- a/packages/oid4vci-issuer-rest-client/package.json +++ b/packages/oid4vci-issuer-rest-client/package.json @@ -16,7 +16,7 @@ "generate-plugin-schema": "ts-node ../../packages/dev/bin/sphereon.js dev generate-plugin-schema" }, "dependencies": { - "@sphereon/oid4vci-common": "0.10.4-unstable.63+1d87208", + "@sphereon/oid4vci-common": "0.10.4-unstable.70", "@sphereon/ssi-types": "workspace:*", "@veramo/core": "4.2.0", "cross-fetch": "^3.1.8" diff --git a/packages/oid4vci-issuer-store/package.json b/packages/oid4vci-issuer-store/package.json index d7037af1a..c4145849a 100644 --- a/packages/oid4vci-issuer-store/package.json +++ b/packages/oid4vci-issuer-store/package.json @@ -14,7 +14,7 @@ "build:clean": "tsc --build --clean && tsc --build" }, "dependencies": { - "@sphereon/oid4vci-common": "0.10.4-unstable.63+1d87208", + "@sphereon/oid4vci-common": "0.10.4-unstable.70", "@sphereon/ssi-sdk-ext.did-utils": "0.19.0", "@sphereon/ssi-sdk.kv-store-temp": "workspace:*", "@veramo/core": "4.2.0", diff --git a/packages/oid4vci-issuer/package.json b/packages/oid4vci-issuer/package.json index b2d0c5e97..0d69dc9fc 100644 --- a/packages/oid4vci-issuer/package.json +++ b/packages/oid4vci-issuer/package.json @@ -14,8 +14,8 @@ "build:clean": "tsc --build --clean && tsc --build" }, "dependencies": { - "@sphereon/oid4vci-common": "0.10.4-unstable.63+1d87208", - "@sphereon/oid4vci-issuer": "0.10.4-unstable.63+1d87208", + "@sphereon/oid4vci-common": "0.10.4-unstable.70", + "@sphereon/oid4vci-issuer": "0.10.4-unstable.70", "@sphereon/ssi-sdk-ext.did-utils": "0.19.0", "@sphereon/ssi-sdk.core": "workspace:*", "@sphereon/ssi-sdk.kv-store-temp": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 244db26ba..c260f57b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -671,11 +671,11 @@ importers: packages/oid4vci-holder: dependencies: '@sphereon/oid4vci-client': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/oid4vci-common': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-sdk-ext.did-resolver-jwk': specifier: 0.18.0 version: 0.18.0 @@ -747,11 +747,11 @@ importers: packages/oid4vci-issuer: dependencies: '@sphereon/oid4vci-common': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/oid4vci-issuer': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-sdk-ext.did-utils': specifier: 0.19.0 version: 0.19.0(msrcrypto@1.5.8)(react-native-securerandom@1.0.1) @@ -805,14 +805,14 @@ importers: packages/oid4vci-issuer-rest-api: dependencies: '@sphereon/oid4vci-common': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/oid4vci-issuer': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/oid4vci-issuer-server': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-express-support': specifier: workspace:* version: link:../ssi-express-support @@ -965,8 +965,8 @@ importers: packages/oid4vci-issuer-rest-client: dependencies: '@sphereon/oid4vci-common': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-types': specifier: workspace:* version: link:../ssi-types @@ -1002,8 +1002,8 @@ importers: packages/oid4vci-issuer-store: dependencies: '@sphereon/oid4vci-common': - specifier: 0.10.4-unstable.63+1d87208 - version: 0.10.4-unstable.63(msrcrypto@1.5.8) + specifier: 0.10.4-unstable.70 + version: 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-sdk-ext.did-utils': specifier: 0.19.0 version: 0.19.0(msrcrypto@1.5.8)(react-native-securerandom@1.0.1) @@ -7069,11 +7069,11 @@ packages: - typescript dev: true - /@sphereon/oid4vci-client@0.10.4-unstable.63(msrcrypto@1.5.8): - resolution: {integrity: sha512-zPY+B+N8V1HI+eTEt8MHXlY3jag2t6M/+7/E2iTORpLpoWbxcP3t1viLb2bfqe9E1nRhLCWRQSF7nKb3hy/juA==} + /@sphereon/oid4vci-client@0.10.4-unstable.70(msrcrypto@1.5.8): + resolution: {integrity: sha512-HDtbI9SNqzxT4yFDTOUWYrdqeIvv24M1yNmW42CmMJ02MUfto5z61Oewc9JZJ6Tmcx4asKBBICW25NLDs6scfA==} engines: {node: '>=18'} dependencies: - '@sphereon/oid4vci-common': 0.10.4-unstable.63(msrcrypto@1.5.8) + '@sphereon/oid4vci-common': 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-types': link:packages/ssi-types cross-fetch: 3.1.8 debug: 4.3.4 @@ -7083,8 +7083,8 @@ packages: - supports-color dev: false - /@sphereon/oid4vci-common@0.10.4-unstable.63(msrcrypto@1.5.8): - resolution: {integrity: sha512-lcdDCdhgrk60KkBCSmBDSDbQn0/Ugej6aErmoBjCPGfkSn8ZpEjbV/CZ6eLt7bpMRUSP0Rg8qjmrKw+scoi+Sw==} + /@sphereon/oid4vci-common@0.10.4-unstable.70(msrcrypto@1.5.8): + resolution: {integrity: sha512-QDuCcWmzUUH4418Q2aFq6UfKVUbTg0l66nob05UgdgFTwQKBN2b+5RiAq9CH16WRgIdjsJFy0y1lbsfj9PMXCw==} engines: {node: '>=18'} peerDependencies: msrcrypto: ^1.5.8 @@ -7102,12 +7102,12 @@ packages: - encoding dev: false - /@sphereon/oid4vci-issuer-server@0.10.4-unstable.63(msrcrypto@1.5.8): - resolution: {integrity: sha512-Tm5DPott5bYyg1EyVl7FOVxzeNQthxSXqz89dT0m7sSZCQmSFpdsrksUM4b+d5r20qGPK17a6B3tEwq3kvtf/g==} + /@sphereon/oid4vci-issuer-server@0.10.4-unstable.70(msrcrypto@1.5.8): + resolution: {integrity: sha512-JSS2wkPmGh3t/3sf9qYYNfQdN7rQEgfO4MtjZiTP1ym+WwMPfaG3O9be97fl3aZsbgTtz0KeAvGmpv0vq9Ff3g==} engines: {node: '>=18'} dependencies: - '@sphereon/oid4vci-common': 0.10.4-unstable.63(msrcrypto@1.5.8) - '@sphereon/oid4vci-issuer': 0.10.4-unstable.63(msrcrypto@1.5.8) + '@sphereon/oid4vci-common': 0.10.4-unstable.70(msrcrypto@1.5.8) + '@sphereon/oid4vci-issuer': 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-express-support': 0.23.4 '@sphereon/ssi-types': link:packages/ssi-types body-parser: 1.20.2 @@ -7128,8 +7128,8 @@ packages: - supports-color dev: false - /@sphereon/oid4vci-issuer@0.10.4-unstable.63(msrcrypto@1.5.8): - resolution: {integrity: sha512-UAKCCbp7RSmsFlqtFJcYaK18usEvkETBtaDllcqCkeIglRsfMJPWaffOEgjAJUnZa2mohBL3pgsIJB8Vm4S9BQ==} + /@sphereon/oid4vci-issuer@0.10.4-unstable.70(msrcrypto@1.5.8): + resolution: {integrity: sha512-pvarmp095/MGn0s55ByL8uEv9WNgSkL0Dn9rTQyolc/HLinNPHuuDwPNcmPC3mQQUUbm7CMjIIgMJXm/oGILQQ==} engines: {node: '>=18'} peerDependencies: awesome-qr: ^2.1.5-rc.0 @@ -7137,7 +7137,7 @@ packages: awesome-qr: optional: true dependencies: - '@sphereon/oid4vci-common': 0.10.4-unstable.63(msrcrypto@1.5.8) + '@sphereon/oid4vci-common': 0.10.4-unstable.70(msrcrypto@1.5.8) '@sphereon/ssi-types': link:packages/ssi-types uuid: 9.0.1 transitivePeerDependencies: