make structs&methods public for external usage
arnaucube git@arnaucube.com
Wed, 02 Oct 2024 23:59:30 +0200
2 files changed,
59 insertions(+),
89 deletions(-)
M
src/lib.rs
→
src/lib.rs
@@ -1,3 +1,3 @@
-mod mod65537; -mod schnorr; -mod schnorr_prover;+pub mod mod65537; +pub mod schnorr; +pub mod schnorr_prover;
M
src/schnorr_prover.rs
→
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 @@ // because it uses the multiplicative group of the Goldilocks field
// This is intended solely as a proof of concept. pub struct MessageTarget { - msg: Vec<Target>, + pub msg: Vec<Target>, } impl MessageTarget { - fn new_with_size(builder: &mut CircuitBuilder<GoldF, 2>, n: usize) -> Self { + pub fn new_with_size(builder: &mut CircuitBuilder<GoldF, 2>, n: usize) -> Self { Self { msg: builder.add_virtual_targets(n), } } - fn set_witness(&self, pw: &mut PartialWitness<GoldF>, msg: &Vec<GoldF>) -> Result<()> { + pub fn set_witness(&self, pw: &mut PartialWitness<GoldF>, msg: &Vec<GoldF>) -> 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 @@ e: Target,
} impl SchnorrSignatureTarget { - fn new_virtual(builder: &mut CircuitBuilder<GoldF, 2>) -> Self { + pub fn new_virtual(builder: &mut CircuitBuilder<GoldF, 2>) -> 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<GoldF>, sig: &SchnorrSignature) -> Result<()> { + pub fn set_witness( + &self, + pw: &mut PartialWitness<GoldF>, + 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 @@ pk: Target,
} impl SchnorrPublicKeyTarget { - fn new_virtual(builder: &mut CircuitBuilder<GoldF, 2>) -> Self { - Self{ pk: builder.add_virtual_target() } + pub fn new_virtual(builder: &mut CircuitBuilder<GoldF, 2>) -> Self { + Self { + pk: builder.add_virtual_target(), + } } - fn set_witness(&self, pw: &mut PartialWitness<GoldF>, pk: &SchnorrPublicKey) -> Result<()> { + pub fn set_witness(&self, pw: &mut PartialWitness<GoldF>, pk: &SchnorrPublicKey) -> Result<()> { pw.set_target(self.pk, pk.pk)?; Ok(()) }@@ -85,21 +85,17 @@
pub struct SchnorrBuilder {} pub trait SignatureVerifierBuilder { - fn constrain_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn constrain_sig<C: GenericConfig<2, F = GoldF>>( &self, - builder: &mut CircuitBuilder::<GoldF, 2>, + builder: &mut CircuitBuilder<GoldF, 2>, sig: &SchnorrSignatureTarget, msg: &MessageTarget, pk: &SchnorrPublicKeyTarget, ); - fn verify_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn verify_sig<C: GenericConfig<2, F = GoldF>>( &self, - builder: &mut CircuitBuilder::<GoldF, 2>, + builder: &mut CircuitBuilder<GoldF, 2>, sig: &SchnorrSignatureTarget, msg: &MessageTarget, pk: &SchnorrPublicKeyTarget,@@ -107,11 +103,9 @@ ) -> BoolTarget;
} impl SignatureVerifierBuilder for SchnorrBuilder { - fn constrain_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn constrain_sig<C: GenericConfig<2, F = GoldF>>( &self, - builder: &mut CircuitBuilder::<GoldF, 2>, + builder: &mut CircuitBuilder<GoldF, 2>, sig: &SchnorrSignatureTarget, msg: &MessageTarget, pk: &SchnorrPublicKeyTarget,@@ -121,16 +115,15 @@ let true_target = builder._true();
builder.connect(verification_output.target, true_target.target); } - fn verify_sig < - C: GenericConfig<2, F = GoldF>, - > ( + fn verify_sig<C: GenericConfig<2, F = GoldF>>( &self, - builder: &mut CircuitBuilder::<GoldF, 2>, + builder: &mut CircuitBuilder<GoldF, 2>, 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 @@ let r: Target = builder.mul(gs, pe);
// compute hash // note that it's safe to clone Targets since they just contain indices - let hash_input: Vec<Target> = std::iter::once(r) - .chain(msg.msg.iter().cloned()) - .collect(); - let hash_output: Target = builder.hash_n_to_hash_no_pad::<PoseidonHash>( - hash_input, - ).elements[0]; // whoops have to take mod group order; + let hash_input: Vec<Target> = std::iter::once(r).chain(msg.msg.iter().cloned()).collect(); + let hash_output: Target = builder + .hash_n_to_hash_no_pad::<PoseidonHash>(hash_input) + .elements[0]; // whoops have to take mod group order; let e: Target = Mod65537Builder::mod_65537(builder, hash_output);@@ -162,16 +153,19 @@ }
} #[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 @@
let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::<F, D>::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<GoldilocksField> = ss.u64_into_goldilocks_vec( - vec![1500, 1600, 0, 0, 0] - ); + let msg: Vec<GoldilocksField> = 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,19 +193,13 @@ 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); - sb.constrain_sig::<PoseidonGoldilocksConfig> ( - &mut builder, - &sig_targ, - &msg_targ, - &pk_targ - ); + sb.constrain_sig::<PoseidonGoldilocksConfig>(&mut builder, &sig_targ, &msg_targ, &pk_targ); // assign witnesses for verification let mut pw: PartialWitness<F> = PartialWitness::new(); pk_targ.set_witness(&mut pw, &pk).unwrap(); sig_targ.set_witness(&mut pw, &sig).unwrap(); msg_targ.set_witness(&mut pw, &msg).unwrap(); - let data = builder.build::<C>(); let proof = data.prove(pw).unwrap();@@ -230,32 +216,24 @@
let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::<F, D>::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<GoldilocksField> = ss.u64_into_goldilocks_vec( - vec![1500, 1600, 0, 0, 0] - ); + let msg0: Vec<GoldilocksField> = 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<GoldilocksField> = ss.u64_into_goldilocks_vec( - vec![1510, 1600, 0, 0, 0] - ); + let msg1: Vec<GoldilocksField> = 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::<PoseidonGoldilocksConfig> ( - &mut builder, - &sig_targ, - &msg_targ, - &pk_targ - ); + let verification_result = + sb.verify_sig::<PoseidonGoldilocksConfig>(&mut builder, &sig_targ, &msg_targ, &pk_targ); // assign witnesses for verification let mut pw: PartialWitness<F> = PartialWitness::new();@@ -283,32 +261,24 @@
let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::<F, D>::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<GoldilocksField> = ss.u64_into_goldilocks_vec( - vec![1500, 1600, 0, 0, 0] - ); + let msg0: Vec<GoldilocksField> = 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<GoldilocksField> = ss.u64_into_goldilocks_vec( - vec![1510, 1600, 0, 0, 0] - ); + let msg1: Vec<GoldilocksField> = 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::<PoseidonGoldilocksConfig> ( - &mut builder, - &sig_targ, - &msg_targ, - &pk_targ - ); + let verification_result = + sb.verify_sig::<PoseidonGoldilocksConfig>(&mut builder, &sig_targ, &msg_targ, &pk_targ); // assign witnesses for verification let mut pw: PartialWitness<F> = PartialWitness::new();@@ -323,4 +293,4 @@
let data = builder.build::<C>(); let proof = data.prove(pw).unwrap(); } -}+}