buildPresentation function
Builds a presentation for credentials
.
If not only the ownership of the dids in the credentials should be proofed a List of additionalDids
could be given and a proof section for each did is added.
Implementation
Future<String> buildPresentation(
List<dynamic> credentials, WalletStore wallet, String challenge,
{List<String>? additionalDids,
List<dynamic>? disclosedCredentials,
Function(Uri url, LoadDocumentOptions? options) loadDocumentFunction =
loadDocumentStrict}) async {
List<Map<String, dynamic>?> credMapList = [];
List<String?> holderDids = [];
PresentationSubmission? submission;
for (var element in credentials) {
if (element is FilterResult) {
List<InputDescriptorMappingObject> mapping = [];
if (submission != null) {
mapping = submission.descriptorMap;
}
for (var cred in element.credentials) {
var credEntry = cred.toJson();
credMapList.add(credEntry);
holderDids.add(getHolderDidFromCredential(credEntry));
for (var descriptor in element.matchingDescriptorIds) {
var map = InputDescriptorMappingObject(
id: descriptor,
format: 'ldp_vc',
path: JsonPath(
'\$.verifiableCredential[${credMapList.length - 1}]'));
mapping.add(map);
}
}
submission = PresentationSubmission(
presentationDefinitionId: element.presentationDefinitionId,
descriptorMap: mapping);
} else {
Map<String, dynamic> credMap;
if (element is VerifiableCredential) {
credMap = element.toJson();
} else {
credMap = credentialToMap(element);
}
credMapList.add(credMap);
holderDids.add(getHolderDidFromCredential(credMap));
}
}
List<String> context = ['https://www.w3.org/2018/credentials/v1'];
List<String> type = ['VerifiablePresentation'];
if (submission != null) {
context.add(
'https://identity.foundation/presentation-exchange/submission/v1/');
type.add('PresentationSubmission');
}
Map<String, dynamic> presentation = {
'@context': context,
'type': type,
'verifiableCredential': credMapList
};
if (submission != null) {
presentation['presentation_submission'] = submission.toJson();
}
if (disclosedCredentials != null) {
List<Map<String, dynamic>?> disclosedCreds = [];
for (var element in disclosedCredentials) {
var credMap = credentialToMap(element);
disclosedCreds.add(credMap);
}
presentation['disclosedCredentials'] = disclosedCreds;
var type = presentation['type'] as List<String?>;
type.add('DisclosedCredentialPresentation');
presentation['type'] = type;
}
List<Map<String, dynamic>> proofList = [];
for (var element in holderDids) {
var signer = _determineSignerForDid(element!, loadDocumentFunction);
proofList.add(await signer.buildProof(presentation, wallet, element,
challenge: challenge));
}
if (additionalDids != null) {
for (var element in additionalDids) {
var signer = _determineSignerForDid(element, loadDocumentFunction);
proofList.add(await signer.buildProof(presentation, wallet, element,
challenge: challenge));
}
}
presentation['proof'] = proofList;
return jsonEncode(presentation);
}