Skip to content

Commit

Permalink
Handle direct_post.jwt #2576
Browse files Browse the repository at this point in the history
  • Loading branch information
bibash28 committed Apr 9, 2024
1 parent 5431768 commit e69b334
Showing 1 changed file with 66 additions and 15 deletions.
81 changes: 66 additions & 15 deletions lib/scan/cubit/scan_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -523,30 +523,83 @@ class ScanCubit extends Cubit<ScanState> {
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 = <String, dynamic>{
'vp_token': vpToken,
'presentation_submission': presentationSubmissionString,
};
Map<String, dynamic> 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<String, dynamic>,
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 = <String, dynamic>{
'vp_token': vpToken,
'presentation_submission': presentationSubmissionString,
};

if (idTokenNeeded && idToken != null) {
responseData['id_token'] = idToken;
}

if (stateValue != null) {
responseData['state'] = stateValue;
}

body = responseData;
}

await Future<void>.delayed(const Duration(seconds: 2));
final response = await client.dio.post<dynamic>(
responseOrRedirectUri,
data: responseData,
data: body,
options: Options(
headers: <String, dynamic>{
'Content-Type': 'application/x-www-form-urlencoded',
Expand Down Expand Up @@ -629,7 +682,7 @@ class ScanCubit extends Cubit<ScanState> {
}
}

Future<String> getPresentationSubmission({
Future<Map<String, dynamic>> getPresentationSubmission({
required List<CredentialModel> credentialsToBePresented,
required PresentationDefinition presentationDefinition,
required Map<String, dynamic>? clientMetaData,
Expand Down Expand Up @@ -781,9 +834,7 @@ class ScanCubit extends Cubit<ScanState> {

presentationSubmission['descriptor_map'] = inputDescriptors;

final presentationSubmissionString = jsonEncode(presentationSubmission);

return presentationSubmissionString;
return presentationSubmission;
}

Future<void> askPermissionDIDAuthCHAPI({
Expand Down

0 comments on commit e69b334

Please sign in to comment.