diff --git a/src/ccs08.rs b/src/ccs08.rs index 0d5f3c9..f26608f 100644 --- a/src/ccs08.rs +++ b/src/ccs08.rs @@ -293,6 +293,33 @@ impl RPPublicParams { panic!("log(b) is zero"); } } + + /* + Prove method is responsible for generating the zero knowledge proof. + */ + pub fn prove(&self, rng: &mut R, x: i64) -> RangeProof { + let ul = self.p.u.pow(self.p.l as u32); + let r = E::Fr::rand(rng); + + // x - b + ul + let xb = x + self.b + ul; + let first = self.p.prove_ul(rng, xb, r); + + // x - a + let xa = x - self.a; + let second = self.p.prove_ul(rng, xa, r); + + return RangeProof { p1: first, p2: second }; + } + + /* + Verify is responsible for validating the proof. + */ + pub fn verify(&self, proof: RangeProof) -> bool { + let first = self.p.verify_ul(&proof.p1); + let second = self.p.verify_ul(&proof.p2); + return first && second; + } } @@ -352,6 +379,16 @@ mod tests { assert_eq!(params.verify_ul(&proof), true); } + #[test] + #[ignore] + fn prove_and_verify_works() { + let rng = &mut rand::thread_rng(); + let params = RPPublicParams::::setup(rng, 2, 25); + let fr = Fr::rand(rng); + let proof = params.prove(rng, 10); + assert_eq!(params.verify(proof), true); + } + #[test] fn decompose_works() { assert_eq!(decompose(25, 3, 3), vec! {1, 2, 2});