From ce4b8a4d958e038f7d3b07d44d37bdf423da1e46 Mon Sep 17 00:00:00 2001 From: arnaucube Date: Wed, 2 Oct 2024 23:59:30 +0200 Subject: [PATCH] make structs&methods public for external usage --- src/lib.rs | 6 +- src/schnorr_prover.rs | 142 +++++++++++++++++------------------------- 2 files changed, 59 insertions(+), 89 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e3bd7f9..1c6f49a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,3 @@ -mod mod65537; -mod schnorr; -mod schnorr_prover; \ No newline at end of file +pub mod mod65537; +pub mod schnorr; +pub mod schnorr_prover; diff --git a/src/schnorr_prover.rs b/src/schnorr_prover.rs index 47742ba..b42e982 100644 --- a/src/schnorr_prover.rs +++ b/src/schnorr_prover.rs @@ -1,18 +1,12 @@ use anyhow::Result; +use plonky2::field::{goldilocks_field::GoldilocksField, types::Field}; +use plonky2::hash::poseidon::PoseidonHash; use plonky2::iop::{ target::{BoolTarget, Target}, witness::{PartialWitness, WitnessWrite}, }; -use plonky2::field::{ - goldilocks_field::GoldilocksField, - types::Field, -}; -use plonky2::hash::poseidon::PoseidonHash; -use plonky2::plonk::{ - circuit_builder::CircuitBuilder, - config::GenericConfig, -}; +use plonky2::plonk::{circuit_builder::CircuitBuilder, config::GenericConfig}; use crate::{ mod65537::Mod65537Builder, @@ -28,17 +22,17 @@ type GoldF = GoldilocksField; // This is intended solely as a proof of concept. pub struct MessageTarget { - msg: Vec, + pub msg: Vec, } impl MessageTarget { - fn new_with_size(builder: &mut CircuitBuilder, n: usize) -> Self { + pub fn new_with_size(builder: &mut CircuitBuilder, n: usize) -> Self { Self { msg: builder.add_virtual_targets(n), } } - fn set_witness(&self, pw: &mut PartialWitness, msg: &Vec) -> Result<()> { + pub fn set_witness(&self, pw: &mut PartialWitness, msg: &Vec) -> Result<()> { assert!(msg.len() == self.msg.len()); for (&t, &x) in self.msg.iter().zip(msg.iter()) { pw.set_target(t, x)?; @@ -54,13 +48,17 @@ pub struct SchnorrSignatureTarget { } impl SchnorrSignatureTarget { - fn new_virtual(builder: &mut CircuitBuilder) -> Self { + pub fn new_virtual(builder: &mut CircuitBuilder) -> Self { let s = builder.add_virtual_target(); let e = builder.add_virtual_target(); - Self{ s, e } + Self { s, e } } - fn set_witness(&self, pw: &mut PartialWitness, sig: &SchnorrSignature) -> Result<()> { + pub fn set_witness( + &self, + pw: &mut PartialWitness, + sig: &SchnorrSignature, + ) -> Result<()> { pw.set_target(self.s, GoldilocksField::from_canonical_u64(sig.s))?; pw.set_target(self.e, GoldilocksField::from_canonical_u64(sig.e))?; Ok(()) @@ -72,11 +70,13 @@ pub struct SchnorrPublicKeyTarget { } impl SchnorrPublicKeyTarget { - fn new_virtual(builder: &mut CircuitBuilder) -> Self { - Self{ pk: builder.add_virtual_target() } + pub fn new_virtual(builder: &mut CircuitBuilder) -> Self { + Self { + pk: builder.add_virtual_target(), + } } - fn set_witness(&self, pw: &mut PartialWitness, pk: &SchnorrPublicKey) -> Result<()> { + pub fn set_witness(&self, pw: &mut PartialWitness, pk: &SchnorrPublicKey) -> Result<()> { pw.set_target(self.pk, pk.pk)?; Ok(()) } @@ -85,21 +85,17 @@ impl SchnorrPublicKeyTarget { pub struct SchnorrBuilder {} pub trait SignatureVerifierBuilder { - fn constrain_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn constrain_sig>( &self, - builder: &mut CircuitBuilder::, + builder: &mut CircuitBuilder, sig: &SchnorrSignatureTarget, msg: &MessageTarget, pk: &SchnorrPublicKeyTarget, ); - fn verify_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn verify_sig>( &self, - builder: &mut CircuitBuilder::, + builder: &mut CircuitBuilder, sig: &SchnorrSignatureTarget, msg: &MessageTarget, pk: &SchnorrPublicKeyTarget, @@ -107,11 +103,9 @@ pub trait SignatureVerifierBuilder { } impl SignatureVerifierBuilder for SchnorrBuilder { - fn constrain_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn constrain_sig>( &self, - builder: &mut CircuitBuilder::, + builder: &mut CircuitBuilder, sig: &SchnorrSignatureTarget, msg: &MessageTarget, pk: &SchnorrPublicKeyTarget, @@ -121,16 +115,15 @@ impl SignatureVerifierBuilder for SchnorrBuilder { builder.connect(verification_output.target, true_target.target); } - fn verify_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn verify_sig>( &self, - builder: &mut CircuitBuilder::, + builder: &mut CircuitBuilder, sig: &SchnorrSignatureTarget, msg: &MessageTarget, pk: &SchnorrPublicKeyTarget, ) -> BoolTarget { - let PRIME_GROUP_GEN: Target = builder.constant(GoldF::from_canonical_u64(6612579038192137166)); + let PRIME_GROUP_GEN: Target = + builder.constant(GoldF::from_canonical_u64(6612579038192137166)); let PRIME_GROUP_ORDER: Target = builder.constant(GoldF::from_canonical_u64(65537)); const num_bits_exp: usize = 32; @@ -147,12 +140,10 @@ impl SignatureVerifierBuilder for SchnorrBuilder { // compute hash // note that it's safe to clone Targets since they just contain indices - let hash_input: Vec = std::iter::once(r) - .chain(msg.msg.iter().cloned()) - .collect(); - let hash_output: Target = builder.hash_n_to_hash_no_pad::( - hash_input, - ).elements[0]; // whoops have to take mod group order; + let hash_input: Vec = std::iter::once(r).chain(msg.msg.iter().cloned()).collect(); + let hash_output: Target = builder + .hash_n_to_hash_no_pad::(hash_input) + .elements[0]; // whoops have to take mod group order; let e: Target = Mod65537Builder::mod_65537(builder, hash_output); @@ -162,16 +153,19 @@ impl SignatureVerifierBuilder for SchnorrBuilder { } #[cfg(test)] -mod tests{ - use crate::schnorr::{SchnorrPublicKey, SchnorrSecretKey, SchnorrSigner, SchnorrSignature}; - use crate::schnorr_prover::{MessageTarget, SchnorrBuilder, SchnorrPublicKeyTarget, SchnorrSignatureTarget, SignatureVerifierBuilder}; +mod tests { + use crate::schnorr::{SchnorrPublicKey, SchnorrSecretKey, SchnorrSignature, SchnorrSigner}; + use crate::schnorr_prover::{ + MessageTarget, SchnorrBuilder, SchnorrPublicKeyTarget, SchnorrSignatureTarget, + SignatureVerifierBuilder, + }; + use plonky2::field::goldilocks_field::GoldilocksField; use plonky2::iop::witness::PartialWitness; use plonky2::plonk::{ circuit_builder::CircuitBuilder, circuit_data::CircuitConfig, config::{GenericConfig, PoseidonGoldilocksConfig}, }; - use plonky2::field::goldilocks_field::GoldilocksField; use rand; #[test] @@ -185,15 +179,13 @@ mod tests{ let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::::new(config); - let sb: SchnorrBuilder = SchnorrBuilder{}; + let sb: SchnorrBuilder = SchnorrBuilder {}; // create keypair, message, signature - let sk: SchnorrSecretKey = SchnorrSecretKey{ sk: 133 }; + let sk: SchnorrSecretKey = SchnorrSecretKey { sk: 133 }; let ss = SchnorrSigner::new(); let pk: SchnorrPublicKey = ss.keygen(&sk); - let msg: Vec = ss.u64_into_goldilocks_vec( - vec![1500, 1600, 0, 0, 0] - ); + let msg: Vec = ss.u64_into_goldilocks_vec(vec![1500, 1600, 0, 0, 0]); let msg_size: usize = msg.len(); let sig: SchnorrSignature = ss.sign(&msg, &sk, &mut rng); @@ -201,12 +193,7 @@ mod tests{ let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder); let msg_targ = MessageTarget::new_with_size(&mut builder, msg_size); - sb.constrain_sig:: ( - &mut builder, - &sig_targ, - &msg_targ, - &pk_targ - ); + sb.constrain_sig::(&mut builder, &sig_targ, &msg_targ, &pk_targ); // assign witnesses for verification let mut pw: PartialWitness = PartialWitness::new(); @@ -214,7 +201,6 @@ mod tests{ sig_targ.set_witness(&mut pw, &sig).unwrap(); msg_targ.set_witness(&mut pw, &msg).unwrap(); - let data = builder.build::(); let proof = data.prove(pw).unwrap(); } @@ -230,32 +216,24 @@ mod tests{ let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::::new(config); - let sb: SchnorrBuilder = SchnorrBuilder{}; + let sb: SchnorrBuilder = SchnorrBuilder {}; // create keypair, message, signature - let sk: SchnorrSecretKey = SchnorrSecretKey{ sk: 133 }; + let sk: SchnorrSecretKey = SchnorrSecretKey { sk: 133 }; let ss = SchnorrSigner::new(); let pk: SchnorrPublicKey = ss.keygen(&sk); - let msg0: Vec = ss.u64_into_goldilocks_vec( - vec![1500, 1600, 0, 0, 0] - ); + let msg0: Vec = ss.u64_into_goldilocks_vec(vec![1500, 1600, 0, 0, 0]); let msg_size: usize = msg0.len(); let sig: SchnorrSignature = ss.sign(&msg0, &sk, &mut rng); - let msg1: Vec = ss.u64_into_goldilocks_vec( - vec![1510, 1600, 0, 0, 0] - ); + let msg1: Vec = ss.u64_into_goldilocks_vec(vec![1510, 1600, 0, 0, 0]); let pk_targ = SchnorrPublicKeyTarget::new_virtual(&mut builder); let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder); let msg_targ = MessageTarget::new_with_size(&mut builder, msg_size); - let verification_result = sb.verify_sig:: ( - &mut builder, - &sig_targ, - &msg_targ, - &pk_targ - ); + let verification_result = + sb.verify_sig::(&mut builder, &sig_targ, &msg_targ, &pk_targ); // assign witnesses for verification let mut pw: PartialWitness = PartialWitness::new(); @@ -283,32 +261,24 @@ mod tests{ let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::::new(config); - let sb: SchnorrBuilder = SchnorrBuilder{}; + let sb: SchnorrBuilder = SchnorrBuilder {}; // create keypair, message, signature - let sk: SchnorrSecretKey = SchnorrSecretKey{ sk: 133 }; + let sk: SchnorrSecretKey = SchnorrSecretKey { sk: 133 }; let ss = SchnorrSigner::new(); let pk: SchnorrPublicKey = ss.keygen(&sk); - let msg0: Vec = ss.u64_into_goldilocks_vec( - vec![1500, 1600, 0, 0, 0] - ); + let msg0: Vec = ss.u64_into_goldilocks_vec(vec![1500, 1600, 0, 0, 0]); let msg_size: usize = msg0.len(); let sig: SchnorrSignature = ss.sign(&msg0, &sk, &mut rng); - let msg1: Vec = ss.u64_into_goldilocks_vec( - vec![1510, 1600, 0, 0, 0] - ); + let msg1: Vec = ss.u64_into_goldilocks_vec(vec![1510, 1600, 0, 0, 0]); let pk_targ = SchnorrPublicKeyTarget::new_virtual(&mut builder); let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder); let msg_targ = MessageTarget::new_with_size(&mut builder, msg_size); - let verification_result = sb.verify_sig:: ( - &mut builder, - &sig_targ, - &msg_targ, - &pk_targ - ); + let verification_result = + sb.verify_sig::(&mut builder, &sig_targ, &msg_targ, &pk_targ); // assign witnesses for verification let mut pw: PartialWitness = PartialWitness::new(); @@ -323,4 +293,4 @@ mod tests{ let data = builder.build::(); let proof = data.prove(pw).unwrap(); } -} \ No newline at end of file +}