credx/verifier/
membership.rs1use crate::error::Error;
2use crate::knox::accumulator::vb20::{Element, ProofParams};
3use crate::presentation::MembershipProof;
4use crate::statement::MembershipStatement;
5use crate::verifier::ProofVerifier;
6use crate::CredxResult;
7use blsful::inner_types::Scalar;
8use merlin::Transcript;
9
10pub struct MembershipVerifier<'a, 'b> {
11    statement: &'a MembershipStatement,
12    accumulator_proof: &'b MembershipProof,
13    params: ProofParams,
14    message_proof: Scalar,
15}
16
17impl<'a, 'b> MembershipVerifier<'a, 'b> {
18    pub fn new(
19        statement: &'a MembershipStatement,
20        accumulator_proof: &'b MembershipProof,
21        nonce: &[u8],
22        message_proof: Scalar,
23    ) -> Self {
24        let params = ProofParams::new(statement.verification_key, Some(nonce));
25        Self {
26            statement,
27            accumulator_proof,
28            params,
29            message_proof,
30        }
31    }
32}
33
34impl ProofVerifier for MembershipVerifier<'_, '_> {
35    fn add_challenge_contribution(
36        &self,
37        challenge: Scalar,
38        transcript: &mut Transcript,
39    ) -> CredxResult<()> {
40        self.params.add_to_transcript(transcript);
41        let finalized = self.accumulator_proof.proof.finalize(
42            self.statement.accumulator,
43            self.params,
44            self.statement.verification_key,
45            Element(challenge),
46        );
47        finalized.get_bytes_for_challenge(transcript);
48        Ok(())
49    }
50
51    fn verify(&self, _challenge: Scalar) -> CredxResult<()> {
52        if self.accumulator_proof.proof.s_y != self.message_proof {
53            return Err(Error::InvalidPresentationData(format!(
54                "membership claim proof '{}' does not match the signature's same claim proof '{}'",
55                hex::encode(self.accumulator_proof.proof.s_y.to_be_bytes()),
56                hex::encode(self.message_proof.to_be_bytes())
57            )));
58        }
59        Ok(())
60    }
61}