diff --git a/snark/src/lib.rs b/snark/src/lib.rs index 3938b2e..c4a82f9 100644 --- a/snark/src/lib.rs +++ b/snark/src/lib.rs @@ -20,6 +20,7 @@ extern "C" { fn libsnarkwrap_pairing(p: *const G1, q: *const G2) -> Gt; fn libsnarkwrap_getcs(d: *mut libc::uint64_t, vars: *mut libc::uint64_t, omega: *mut Fr) -> *mut libc::c_void; fn libsnarkwrap_dropcs(cs: *mut libc::c_void); + fn libsnarkwrap_dropkeypair(kp: *mut libc::c_void); fn libsnarkwrap_eval( cs: *const libc::c_void, lc1: *const G1, @@ -30,6 +31,17 @@ extern "C" { bt1: *mut G1, bt2: *mut G2, ct: *mut G1); + fn libsnarkwrap_test_keygen( + cs: *const libc::c_void, + tau: *const Fr, + alpha_a: *const Fr, + alpha_b: *const Fr, + alpha_c: *const Fr, + rho_a: *const Fr, + rho_b: *const Fr, + beta: *const Fr, + gamma: *const Fr + ) -> *mut libc::c_void; fn libsnarkwrap_test_eval( cs: *const libc::c_void, tau: *const Fr, @@ -73,6 +85,32 @@ pub struct CS { pub omega: Fr } +pub struct Keypair { + ptr: *mut libc::c_void +} + +impl Keypair { + pub fn generate( + cs: &CS, + tau: &Fr, + alpha_a: &Fr, + alpha_b: &Fr, + alpha_c: &Fr, + rho_a: &Fr, + rho_b: &Fr, + beta: &Fr, + gamma: &Fr + ) -> Keypair { + unsafe { + Keypair { + ptr: libsnarkwrap_test_keygen( + cs.ptr, tau, alpha_a, alpha_b, alpha_c, rho_a, rho_b, beta, gamma + ) + } + } + } +} + impl CS { pub fn dummy() -> Self { let mut d = 0; @@ -142,6 +180,12 @@ impl Drop for CS { } } +impl Drop for Keypair { + fn drop(&mut self) { + unsafe { libsnarkwrap_dropkeypair(self.ptr) } + } +} + pub trait Pairing { fn g1<'a>(&'a self, other: &'a Other) -> &'a G1; fn g2<'a>(&'a self, other: &'a Other) -> &'a G2; diff --git a/snark/src/libsnarkwrap.cpp b/snark/src/libsnarkwrap.cpp index 35e48c0..2fc23a5 100644 --- a/snark/src/libsnarkwrap.cpp +++ b/snark/src/libsnarkwrap.cpp @@ -7,6 +7,7 @@ #include "relations/arithmetic_programs/qap/qap.hpp" #include "reductions/r1cs_to_qap/r1cs_to_qap.hpp" #include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" +#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" using namespace std; using namespace libsnark; @@ -205,6 +206,11 @@ extern "C" void libsnarkwrap_dropcs(r1cs_constraint_system *cs) delete cs; } +extern "C" void libsnarkwrap_dropkeypair(r1cs_ppzksnark_keypair *kp) +{ + delete kp; +} + extern "C" void libsnarkwrap_eval( const r1cs_constraint_system *cs, const curve_G1 *lc1, @@ -244,6 +250,33 @@ extern "C" void libsnarkwrap_eval( // Comparison tests +extern "C" void* libsnarkwrap_test_keygen( + const r1cs_constraint_system *cs, + const curve_Fr *tau, + const curve_Fr *alpha_A, + const curve_Fr *alpha_B, + const curve_Fr *alpha_C, + const curve_Fr *rho_A, + const curve_Fr *rho_B, + const curve_Fr *beta, + const curve_Fr *gamma +) +{ + return new r1cs_ppzksnark_keypair( + r1cs_ppzksnark_generator( + *cs, + *tau, + *alpha_A, + *alpha_B, + *alpha_C, + *rho_A, + *rho_B, + *beta, + *gamma + ) + ); +} + extern "C" bool libsnarkwrap_test_compare_tau( const curve_G1 *inputs1, const curve_G2 *inputs2, diff --git a/src/protocol.rs b/src/protocol.rs index 7080dd5..42c202a 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -158,6 +158,20 @@ impl Secrets { tmp } + + fn keypair(&self, cs: &CS) -> Keypair { + Keypair::generate( + cs, + &self.tau, + &self.alpha_a, + &self.alpha_b, + &self.alpha_c, + &self.rho_a, + &self.rho_b, + &self.beta, + &self.gamma + ) + } } struct Player { @@ -556,6 +570,8 @@ fn implthing() { vk_beta_gamma_two = new_vk_beta_gamma_two; pk_K = new_pk_K; } + + // Compare against libsnark: let mut shared_secrets = Secrets::new_blank(); @@ -563,5 +579,5 @@ fn implthing() { player.test_multiply_secrets(&mut shared_secrets); } - + let target_kp = shared_secrets.keypair(&cs); }