diff --git a/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart b/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart index 1434a43a1..41a599b4a 100644 --- a/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart +++ b/lib/dashboard/qr_code/qr_code_scan/cubit/qr_code_scan_cubit.dart @@ -608,7 +608,9 @@ class QRCodeScanCubit extends Cubit { } Future launchOIDC4VPWithRequestUriAsValueFlow() async { - if (isUriAsValueValid && keys.contains('presentation_definition')) { + if (isUriAsValueValid && + keys.contains('presentation_definition') && + keys.contains('aud')) { final String presentationDefinitionValue = state.uri?.queryParameters['presentation_definition'] ?? ''; @@ -858,7 +860,7 @@ class QRCodeScanCubit extends Cubit { for (int i = 0; i < credentials.length; i++) { emit(state.loading()); - final credentialTypeOrId = credentials[i]; + final credentialType = credentials[i]; await getAndAddCredential( scannedResponse: state.uri.toString(), credentialsCubit: credentialsCubit, @@ -866,7 +868,7 @@ class QRCodeScanCubit extends Cubit { oidc4vcType: currentOIIDC4VCType, didKitProvider: didKitProvider, secureStorageProvider: getSecureStorage, - credentialTypeOrId: credentialTypeOrId.toString(), + credentialType: credentialType.toString(), isLastCall: i + 1 == credentials.length, dioClient: DioClient('', Dio()), ); diff --git a/lib/oidc4vc/add_oidc4vc_credential.dart b/lib/oidc4vc/add_oidc4vc_credential.dart index 040c00a89..e87a4fb5c 100644 --- a/lib/oidc4vc/add_oidc4vc_credential.dart +++ b/lib/oidc4vc/add_oidc4vc_credential.dart @@ -14,7 +14,7 @@ Future addOIDC4VCCredential({ required CredentialsCubit credentialsCubit, required OIDC4VCType oidc4vcType, required String issuer, - required String credentialTypeOrId, + required String credentialType, required bool isLastCall, }) async { late Map credentialFromOIDC4VC; @@ -59,7 +59,7 @@ Future addOIDC4VCCredential({ final CredentialManifest? credentialManifest = await getCredentialManifest( Dio(), issuer, - credentialTypeOrId, + credentialType, oidc4vcType.schemaForType, ); diff --git a/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart b/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart index 4acbfba90..ad122d2ca 100644 --- a/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart +++ b/lib/oidc4vc/initiate_oidv4vc_credential_issuance.dart @@ -21,7 +21,7 @@ Future initiateOIDC4VCCredentialIssuance({ }) async { final Uri uriFromScannedResponse = Uri.parse(scannedResponse); - late dynamic credentialTypeOrId; + late dynamic credentialType; switch (oidc4vcType) { case OIDC4VCType.DEFAULT: @@ -32,11 +32,11 @@ Future initiateOIDC4VCCredentialIssuance({ ); if (credentialOfferJson == null) throw Exception(); - credentialTypeOrId = credentialOfferJson['credentials']; + credentialType = credentialOfferJson['credentials']; break; case OIDC4VCType.GAIAX: case OIDC4VCType.EBSIV2: - credentialTypeOrId = + credentialType = uriFromScannedResponse.queryParameters['credential_type']; break; @@ -45,8 +45,8 @@ Future initiateOIDC4VCCredentialIssuance({ break; } - if (credentialTypeOrId is List) { - qrCodeScanCubit.navigateToOidc4vcCredentialPickPage(credentialTypeOrId); + if (credentialType is List) { + qrCodeScanCubit.navigateToOidc4vcCredentialPickPage(credentialType); } else { final OIDC4VC oidc4vc = oidc4vcType.getOIDC4VC; await getAndAddCredential( @@ -55,7 +55,7 @@ Future initiateOIDC4VCCredentialIssuance({ oidc4vc: oidc4vc, didKitProvider: didKitProvider, credentialsCubit: credentialsCubit, - credentialTypeOrId: credentialTypeOrId.toString(), + credentialType: credentialType.toString(), secureStorageProvider: secureStorageProvider, isLastCall: true, dioClient: dioClient, @@ -71,7 +71,7 @@ Future getAndAddCredential({ required OIDC4VCType oidc4vcType, required DIDKitProvider didKitProvider, required CredentialsCubit credentialsCubit, - required String credentialTypeOrId, + required String credentialType, required SecureStorageProvider secureStorageProvider, required bool isLastCall, required DioClient dioClient, @@ -147,7 +147,7 @@ Future getAndAddCredential({ final dynamic encodedCredentialFromOIDC4VC = await oidc4vc.getCredential( preAuthorizedCode: preAuthorizedCode, issuer: issuer, - credentialTypeOrId: credentialTypeOrId, + credentialType: credentialType, did: did, kid: kid, credentialRequestUri: uriFromScannedResponse, @@ -161,7 +161,7 @@ Future getAndAddCredential({ credentialsCubit: credentialsCubit, oidc4vcType: oidc4vcType, issuer: issuer, - credentialTypeOrId: credentialTypeOrId, + credentialType: credentialType, isLastCall: isLastCall, ); } else { diff --git a/lib/scan/cubit/scan_cubit.dart b/lib/scan/cubit/scan_cubit.dart index ea2002fd3..4a8e36648 100644 --- a/lib/scan/cubit/scan_cubit.dart +++ b/lib/scan/cubit/scan_cubit.dart @@ -136,11 +136,13 @@ class ScanCubit extends Cubit { final redirectUri = uri.queryParameters['redirect_uri'] ?? ''; final nonce = uri.queryParameters['nonce'] ?? ''; + final aud = uri.queryParameters['aud'] ?? ''; await presentCredentialToOID4VPRequest( uri: uri, issuer: issuer, credentialsToBePresented: credentialsToBePresented, nonce: nonce, + domain: aud, presentationDefinition: credentialModel.credentialManifest!.presentationDefinition!, redirectUri: redirectUri, @@ -521,6 +523,7 @@ class ScanCubit extends Cubit { final vpToken = await createVpToken( credentialsToBePresented: [credential], challenge: sIOPV2Param.nonce!, + domain: '', ); final idToken = await createIdToken(nonce: sIOPV2Param.nonce!); // prepare the post request @@ -652,6 +655,7 @@ class ScanCubit extends Cubit { required List? credentialsToBePresented, required PresentationDefinition presentationDefinition, required String nonce, + required String domain, required String redirectUri, required Issuer issuer, required OIDC4VC oidc4vc, @@ -672,6 +676,7 @@ class ScanCubit extends Cubit { vpToken = await createVpToken( credentialsToBePresented: credentialsToBePresented!, challenge: nonce, + domain: domain, ); } else if (oidc4vcType.issuerVcType == 'jwt_vc') { final credentialList = credentialsToBePresented! @@ -795,6 +800,7 @@ class ScanCubit extends Cubit { Future createVpToken({ required String challenge, + required String domain, required List credentialsToBePresented, }) async { final ssiKey = await secureStorageProvider.get(SecureStorageKeys.ssiKey); @@ -803,7 +809,8 @@ class ScanCubit extends Cubit { 'verificationMethod': await secureStorageProvider.get(SecureStorageKeys.verificationMethod), 'proofPurpose': 'authentication', - 'challenge': challenge + 'challenge': challenge, + 'domain': domain, }); final presentationId = 'urn:uuid:${const Uuid().v4()}'; final vpToken = await didKitProvider.issuePresentation( diff --git a/packages/oidc4vc/lib/src/oidc4vc.dart b/packages/oidc4vc/lib/src/oidc4vc.dart index 96b240392..00ac676fb 100644 --- a/packages/oidc4vc/lib/src/oidc4vc.dart +++ b/packages/oidc4vc/lib/src/oidc4vc.dart @@ -188,7 +188,7 @@ class OIDC4VC { /// Retreive credential_type from url Future getCredential({ required String issuer, - required String credentialTypeOrId, + required String credentialType, required String did, required String kid, required Uri credentialRequestUri, @@ -234,7 +234,7 @@ class OIDC4VC { issuerTokenParameters: issuerTokenParameters, credentialRequestUri: credentialRequestUri, openidConfigurationResponse: openidConfigurationResponse, - credentialTypeOrId: credentialTypeOrId, + credentialType: credentialType, credentialSupportedTypes: credentialSupportedTypes, ); @@ -409,7 +409,7 @@ class OIDC4VC { required IssuerTokenParameters issuerTokenParameters, required Uri credentialRequestUri, required Response> openidConfigurationResponse, - required String credentialTypeOrId, + required String credentialType, required List credentialSupportedTypes, }) async { final vcJwt = await getIssuerJwt(issuerTokenParameters, nonce); @@ -427,7 +427,7 @@ class OIDC4VC { // } final credentialData = { - 'type': credentialTypeOrId, + 'type': credentialType, 'types': credentialSupportedTypes, 'format': oidc4vcModel.issuerVcType, 'proof': {