diff --git a/packages/anoncreds/src/protocols/proofs/v1/V1ProofProtocol.ts b/packages/anoncreds/src/protocols/proofs/v1/V1ProofProtocol.ts index 4a8df7c6e0..4d88d476bc 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/V1ProofProtocol.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/V1ProofProtocol.ts @@ -777,26 +777,53 @@ export class V1ProofProtocol extends BaseProofProtocol implements ProofProtocol< const presentationAttachment = presentationMessage.getPresentationAttachmentById(INDY_PROOF_ATTACHMENT_ID) if (!presentationAttachment) { - throw new AriesFrameworkError('Missing indy proof attachment in processPresentation') + proofRecord.errorMessage = 'Missing indy proof attachment' + await this.updateState(agentContext, proofRecord, ProofState.Abandoned) + throw new V1PresentationProblemReportError(proofRecord.errorMessage, { + problemCode: PresentationProblemReportReason.Abandoned, + }) } const requestAttachment = requestMessage.getRequestAttachmentById(INDY_PROOF_REQUEST_ATTACHMENT_ID) if (!requestAttachment) { - throw new AriesFrameworkError('Missing indy proof request attachment in processPresentation') + proofRecord.errorMessage = 'Missing indy proof request attachment' + await this.updateState(agentContext, proofRecord, ProofState.Abandoned) + throw new V1PresentationProblemReportError(proofRecord.errorMessage, { + problemCode: PresentationProblemReportReason.Abandoned, + }) } - const isValid = await this.indyProofFormat.processPresentation(agentContext, { - proofRecord, - attachment: presentationAttachment, - requestAttachment, - }) - await didCommMessageRepository.saveAgentMessage(agentContext, { agentMessage: presentationMessage, associatedRecordId: proofRecord.id, role: DidCommMessageRole.Receiver, }) + let isValid: boolean + try { + isValid = await this.indyProofFormat.processPresentation(agentContext, { + proofRecord, + attachment: presentationAttachment, + requestAttachment, + }) + } catch (error) { + proofRecord.errorMessage = error.message ?? 'Error verifying proof on presentation' + proofRecord.isVerified = false + await this.updateState(agentContext, proofRecord, ProofState.Abandoned) + throw new V1PresentationProblemReportError('Error verifying proof on presentation', { + problemCode: PresentationProblemReportReason.Abandoned, + }) + } + + if (!isValid) { + proofRecord.errorMessage = 'Invalid proof' + proofRecord.isVerified = false + await this.updateState(agentContext, proofRecord, ProofState.Abandoned) + throw new V1PresentationProblemReportError('Invalid proof', { + problemCode: PresentationProblemReportReason.Abandoned, + }) + } + // Update record proofRecord.isVerified = isValid await this.updateState(agentContext, proofRecord, ProofState.PresentationReceived) diff --git a/packages/core/src/modules/proofs/protocol/v2/ProofFormatCoordinator.ts b/packages/core/src/modules/proofs/protocol/v2/ProofFormatCoordinator.ts index 29186ec16f..d83b621e02 100644 --- a/packages/core/src/modules/proofs/protocol/v2/ProofFormatCoordinator.ts +++ b/packages/core/src/modules/proofs/protocol/v2/ProofFormatCoordinator.ts @@ -463,7 +463,7 @@ export class ProofFormatCoordinator { requestMessage: V2RequestPresentationMessage formatServices: ProofFormatService[] } - ) { + ): Promise<{ isValid: true; message: undefined } | { isValid: false; message: string }> { const didCommMessageRepository = agentContext.dependencyManager.resolve(DidCommMessageRepository) const formatVerificationResults: boolean[] = [] @@ -476,13 +476,21 @@ export class ProofFormatCoordinator { requestMessage.requestAttachments ) - const isValid = await formatService.processPresentation(agentContext, { - attachment, - requestAttachment, - proofRecord, - }) - - formatVerificationResults.push(isValid) + try { + // TODO: this should return a more complex object explaining why it is invalid + const isValid = await formatService.processPresentation(agentContext, { + attachment, + requestAttachment, + proofRecord, + }) + + formatVerificationResults.push(isValid) + } catch (error) { + return { + message: error.message, + isValid: false, + } + } } await didCommMessageRepository.saveOrUpdateAgentMessage(agentContext, { @@ -491,7 +499,19 @@ export class ProofFormatCoordinator { associatedRecordId: proofRecord.id, }) - return formatVerificationResults.every((isValid) => isValid === true) + const isValid = formatVerificationResults.every((isValid) => isValid === true) + + if (isValid) { + return { + isValid, + message: undefined, + } + } else { + return { + isValid, + message: 'Not all presentations are valid', + } + } } public getAttachmentForService( diff --git a/packages/core/src/modules/proofs/protocol/v2/V2ProofProtocol.ts b/packages/core/src/modules/proofs/protocol/v2/V2ProofProtocol.ts index 7a9292e0e8..ffec69b8a3 100644 --- a/packages/core/src/modules/proofs/protocol/v2/V2ProofProtocol.ts +++ b/packages/core/src/modules/proofs/protocol/v2/V2ProofProtocol.ts @@ -46,6 +46,7 @@ import { composeAutoAccept } from '../../utils/composeAutoAccept' import { BaseProofProtocol } from '../BaseProofProtocol' import { ProofFormatCoordinator } from './ProofFormatCoordinator' +import { V2PresentationProblemReportError } from './errors' import { V2PresentationAckHandler } from './handlers/V2PresentationAckHandler' import { V2PresentationHandler } from './handlers/V2PresentationHandler' import { V2PresentationProblemReportHandler } from './handlers/V2PresentationProblemReportHandler' @@ -672,19 +673,33 @@ export class V2ProofProtocol