public async Task <string> ProcessCredentialAsync(IAgentContext agentContext, CredentialIssueMessage credential, ConnectionRecord connection) { var credentialAttachment = credential.Credentials.FirstOrDefault(x => x.Id == "libindy-cred-0") ?? throw new ArgumentException("Credential attachment not found"); var credentialJson = credentialAttachment.Data.Base64.GetBytesFromBase64().GetUTF8String(); var credentialJobj = JObject.Parse(credentialJson); var definitionId = credentialJobj["cred_def_id"].ToObject <string>(); var revRegId = credentialJobj["rev_reg_id"]?.ToObject <string>(); var credentialRecord = await this.GetByThreadIdAsync(agentContext, credential.GetThreadId()); if (credentialRecord.State != CredentialState.Requested) { throw new AgentFrameworkException(ErrorCode.RecordInInvalidState, $"Credential state was invalid. Expected '{CredentialState.Requested}', found '{credentialRecord.State}'"); } var credentialDefinition = await LedgerService.LookupDefinitionAsync(await agentContext.Pool, definitionId); string revocationRegistryDefinitionJson = null; if (!string.IsNullOrEmpty(revRegId)) { // If credential supports revocation, lookup registry definition var revocationRegistry = await LedgerService.LookupRevocationRegistryDefinitionAsync(await agentContext.Pool, revRegId); revocationRegistryDefinitionJson = revocationRegistry.ObjectJson; } var credentialId = await AnonCreds.ProverStoreCredentialAsync( wallet : agentContext.Wallet, credId : null, credReqMetadataJson : credentialRecord.CredentialRequestMetadataJson, credJson : credentialJson, credDefJson : credentialDefinition.ObjectJson, revRegDefJson : revocationRegistryDefinitionJson); credentialRecord.CredentialId = credentialId; credentialRecord.CredentialAttributesValues = null; await credentialRecord.TriggerAsync(CredentialTrigger.Issue); await RecordService.UpdateAsync(agentContext.Wallet, credentialRecord); EventAggregator.Publish(new ServiceMessageProcessingEvent { RecordId = credentialRecord.Id, MessageType = credential.Type, ThreadId = credential.GetThreadId() }); return(credentialRecord.Id); }
public async Task <(CredentialRequestMessage, CredentialRecord)> CreateRequestAsync(IAgentContext agentContext, string credentialId) { var credential = await GetAsync(agentContext, credentialId); if (credential.State != CredentialState.Offered) { throw new AgentFrameworkException(ErrorCode.RecordInInvalidState, $"Credential state was invalid. Expected '{CredentialState.Offered}', found '{credential.State}'"); } var connection = await ConnectionService.GetAsync(agentContext, credential.ConnectionId); var definition = await LedgerService.LookupDefinitionAsync(await agentContext.Pool, credential.CredentialDefinitionId); var provisioning = await ProvisioningService.GetProvisioningAsync(agentContext.Wallet); var request = await AnonCreds.ProverCreateCredentialReqAsync(agentContext.Wallet, connection.MyDid, credential.OfferJson, definition.ObjectJson, provisioning.MasterSecretId); // Update local credential record with new info credential.CredentialRequestMetadataJson = request.CredentialRequestMetadataJson; await credential.TriggerAsync(CredentialTrigger.Request); await RecordService.UpdateAsync(agentContext.Wallet, credential); var threadId = credential.GetTag(TagConstants.LastThreadId); var response = new CredentialRequestMessage { Requests = new[] { new Attachment { Id = "libindy-cred-request-0", MimeType = CredentialMimeTypes.ApplicationJsonMimeType, Data = new AttachmentContent { Base64 = request.CredentialRequestJson.GetUTF8Bytes().ToBase64String() } } } }; response.ThreadFrom(threadId); return(response, credential); }