Generate keypair from shared secrets.

This commit is contained in:
Sean Bowe 2016-08-16 11:20:42 -06:00
parent fa278a429d
commit b6c4ed06f7
No known key found for this signature in database
GPG Key ID: 95684257D8F8B031
3 changed files with 94 additions and 1 deletions

View File

@ -20,6 +20,7 @@ extern "C" {
fn libsnarkwrap_pairing(p: *const G1, q: *const G2) -> Gt; 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_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_dropcs(cs: *mut libc::c_void);
fn libsnarkwrap_dropkeypair(kp: *mut libc::c_void);
fn libsnarkwrap_eval( fn libsnarkwrap_eval(
cs: *const libc::c_void, cs: *const libc::c_void,
lc1: *const G1, lc1: *const G1,
@ -30,6 +31,17 @@ extern "C" {
bt1: *mut G1, bt1: *mut G1,
bt2: *mut G2, bt2: *mut G2,
ct: *mut G1); 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( fn libsnarkwrap_test_eval(
cs: *const libc::c_void, cs: *const libc::c_void,
tau: *const Fr, tau: *const Fr,
@ -73,6 +85,32 @@ pub struct CS {
pub omega: Fr 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 { impl CS {
pub fn dummy() -> Self { pub fn dummy() -> Self {
let mut d = 0; 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<Other: Group> { pub trait Pairing<Other: Group> {
fn g1<'a>(&'a self, other: &'a Other) -> &'a G1; fn g1<'a>(&'a self, other: &'a Other) -> &'a G1;
fn g2<'a>(&'a self, other: &'a Other) -> &'a G2; fn g2<'a>(&'a self, other: &'a Other) -> &'a G2;

View File

@ -7,6 +7,7 @@
#include "relations/arithmetic_programs/qap/qap.hpp" #include "relations/arithmetic_programs/qap/qap.hpp"
#include "reductions/r1cs_to_qap/r1cs_to_qap.hpp" #include "reductions/r1cs_to_qap/r1cs_to_qap.hpp"
#include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.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 std;
using namespace libsnark; using namespace libsnark;
@ -205,6 +206,11 @@ extern "C" void libsnarkwrap_dropcs(r1cs_constraint_system<curve_Fr> *cs)
delete cs; delete cs;
} }
extern "C" void libsnarkwrap_dropkeypair(r1cs_ppzksnark_keypair<curve_pp> *kp)
{
delete kp;
}
extern "C" void libsnarkwrap_eval( extern "C" void libsnarkwrap_eval(
const r1cs_constraint_system<curve_Fr> *cs, const r1cs_constraint_system<curve_Fr> *cs,
const curve_G1 *lc1, const curve_G1 *lc1,
@ -244,6 +250,33 @@ extern "C" void libsnarkwrap_eval(
// Comparison tests // Comparison tests
extern "C" void* libsnarkwrap_test_keygen(
const r1cs_constraint_system<curve_Fr> *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<curve_pp>(
r1cs_ppzksnark_generator<curve_pp>(
*cs,
*tau,
*alpha_A,
*alpha_B,
*alpha_C,
*rho_A,
*rho_B,
*beta,
*gamma
)
);
}
extern "C" bool libsnarkwrap_test_compare_tau( extern "C" bool libsnarkwrap_test_compare_tau(
const curve_G1 *inputs1, const curve_G1 *inputs1,
const curve_G2 *inputs2, const curve_G2 *inputs2,

View File

@ -158,6 +158,20 @@ impl Secrets {
tmp 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 { struct Player {
@ -556,6 +570,8 @@ fn implthing() {
vk_beta_gamma_two = new_vk_beta_gamma_two; vk_beta_gamma_two = new_vk_beta_gamma_two;
pk_K = new_pk_K; pk_K = new_pk_K;
} }
// Compare against libsnark:
let mut shared_secrets = Secrets::new_blank(); let mut shared_secrets = Secrets::new_blank();
@ -563,5 +579,5 @@ fn implthing() {
player.test_multiply_secrets(&mut shared_secrets); player.test_multiply_secrets(&mut shared_secrets);
} }
let target_kp = shared_secrets.keypair(&cs);
} }