From e69b33420130d6cff7461da923f69f9c02973949 Mon Sep 17 00:00:00 2001 From: Bibash Shrestha Date: Tue, 9 Apr 2024 18:31:25 +0545 Subject: [PATCH] Handle direct_post.jwt #2576 --- lib/scan/cubit/scan_cubit.dart | 81 +++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 15 deletions(-) diff --git a/lib/scan/cubit/scan_cubit.dart b/lib/scan/cubit/scan_cubit.dart index c675e076b..cacd7c70a 100644 --- a/lib/scan/cubit/scan_cubit.dart +++ b/lib/scan/cubit/scan_cubit.dart @@ -523,30 +523,83 @@ class ScanCubit extends Cubit { profileSetting: qrCodeScanCubit.profileCubit.state.model.profileSetting, ); - final presentationSubmissionString = await getPresentationSubmission( + final presentationSubmission = await getPresentationSubmission( credentialsToBePresented: credentialsToBePresented, presentationDefinition: presentationDefinition, clientMetaData: clientMetaData, profileSetting: qrCodeScanCubit.profileCubit.state.model.profileSetting, ); - final responseData = { - 'vp_token': vpToken, - 'presentation_submission': presentationSubmissionString, - }; + Map body; - if (idTokenNeeded && idToken != null) { - responseData['id_token'] = idToken; - } + final String? responseMode = uri.queryParameters['response_mode']; + + if (responseMode == 'direct_post.jwt') { + final iat = (DateTime.now().millisecondsSinceEpoch / 1000).round(); + + final clientId = uri.queryParameters['client_id'] ?? ''; + + final customOidc4vcProfile = profileCubit.state.model.profileSetting + .selfSovereignIdentityOptions.customOidc4vcProfile; + + final didKeyType = customOidc4vcProfile.defaultDid; + + final (did, _) = await getDidAndKid( + didKeyType: didKeyType, + privateKey: privateKey, + profileCubit: profileCubit, + ); + + final responseData = { + 'iss': did, + 'aud': clientId, + 'exp': iat + 1000, + 'vp_token': vpToken, + 'presentation_submission': presentationSubmission, + }; - if (stateValue != null) { - responseData['state'] = stateValue; + if (idTokenNeeded && idToken != null) { + responseData['id_token'] = idToken; + } + + final tokenParameters = TokenParameters( + privateKey: jsonDecode(privateKey) as Map, + did: '', // just added as it is required field + mediaType: MediaType.basic, // just added as it is required field + clientType: + ClientType.jwkThumbprint, // just added as it is required field + proofHeaderType: customOidc4vcProfile.proofHeader, + clientId: '', // just added as it is required field + ); + + final jwtProofOfPossession = profileCubit.oidc4vc.generateToken( + payload: responseData, + tokenParameters: tokenParameters, + ); + + body = {'response': jwtProofOfPossession}; + } else { + final presentationSubmissionString = jsonEncode(presentationSubmission); + final responseData = { + 'vp_token': vpToken, + 'presentation_submission': presentationSubmissionString, + }; + + if (idTokenNeeded && idToken != null) { + responseData['id_token'] = idToken; + } + + if (stateValue != null) { + responseData['state'] = stateValue; + } + + body = responseData; } await Future.delayed(const Duration(seconds: 2)); final response = await client.dio.post( responseOrRedirectUri, - data: responseData, + data: body, options: Options( headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -629,7 +682,7 @@ class ScanCubit extends Cubit { } } - Future getPresentationSubmission({ + Future> getPresentationSubmission({ required List credentialsToBePresented, required PresentationDefinition presentationDefinition, required Map? clientMetaData, @@ -781,9 +834,7 @@ class ScanCubit extends Cubit { presentationSubmission['descriptor_map'] = inputDescriptors; - final presentationSubmissionString = jsonEncode(presentationSubmission); - - return presentationSubmissionString; + return presentationSubmission; } Future askPermissionDIDAuthCHAPI({