ped92: add methods to CSParams
This commit is contained in:
parent
1f2e56bef2
commit
1195f0fdc2
112
src/ped92.rs
112
src/ped92.rs
|
@ -1,19 +1,7 @@
|
||||||
// commit_schemes.rs
|
// ped92.rs
|
||||||
extern crate serde;
|
|
||||||
|
|
||||||
use serialization_wrappers;
|
|
||||||
use std::fmt;
|
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
use bn::{Group, Fr, G1, G2};
|
|
||||||
use pairing::{Engine, CurveProjective, CurveAffine};
|
use pairing::{Engine, CurveProjective, CurveAffine};
|
||||||
use ff::Rand;
|
use ff::Rand;
|
||||||
use clsigs;
|
|
||||||
use debug_elem_in_hex;
|
|
||||||
use bincode::SizeLimit::Infinite;
|
|
||||||
use bincode::rustc_serialize::encode;
|
|
||||||
use sodiumoxide::crypto::hash::sha512;
|
|
||||||
|
|
||||||
use serde::{Serialize, Deserialize};
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct PublicKey<E: Engine> {
|
pub struct PublicKey<E: Engine> {
|
||||||
|
@ -125,69 +113,47 @@ pub fn ped92_decommit<E: Engine>(pk: &PublicKey<E>, cm: &Commitment<E>, m: E::Fr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Implements the setup algorithm for the Pedersen92 commitment scheme over
|
|
||||||
a vector of messages.
|
|
||||||
*/
|
|
||||||
|
|
||||||
pub fn setup<E: Engine>(len: usize, pub_bases: Vec<E::G2>, h: E::G2) -> CSParams<E> {
|
impl<E: Engine> CSParams<E> {
|
||||||
let rng = &mut thread_rng();
|
/*
|
||||||
//let base_h = h.unwrap_or(G2::random(rng));
|
Implements the setup algorithm for the Pedersen92 commitment scheme over
|
||||||
let mut p: Vec<E::G2> = Vec::new();
|
a vector of messages.
|
||||||
p.push(h);
|
*/
|
||||||
|
pub fn setup_gen_params<R: Rng>(rng: &mut R, len: usize) -> Self {
|
||||||
let _p = pub_bases;
|
let mut p: Vec<E::G2> = Vec::new();
|
||||||
for i in 0.._p.len() {
|
for i in 0..len {
|
||||||
p.push(_p[i]);
|
p.push(E::G2::rand(rng));
|
||||||
|
}
|
||||||
|
return CSParams { pub_bases: p };
|
||||||
}
|
}
|
||||||
return CSParams { pub_bases: p };
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn setup_gen_params<E: Engine>(len: usize) -> CSParams<E> {
|
pub fn commit<R: Rng>(&self, rng: &mut R, x: &Vec<E::Fr>, r: E::Fr) -> Commitment<E> {
|
||||||
let rng = &mut thread_rng();
|
//let r = R.unwrap_or(Fr::random(rng));
|
||||||
|
// c = g1^m1 * ... * gn^mn * h^r
|
||||||
let mut p: Vec<E::G2> = Vec::new();
|
let mut c = self.pub_bases[0].clone();
|
||||||
for i in 0..len {
|
c.mul_assign(r);
|
||||||
p.push(E::G2::rand(rng));
|
for i in 1..x.len() {
|
||||||
|
let mut basis = self.pub_bases[i];
|
||||||
|
basis.mul_assign(x[i]);
|
||||||
|
c.add_assign(&basis);
|
||||||
|
}
|
||||||
|
// return (c, r) <- r
|
||||||
|
Commitment { c, r }
|
||||||
}
|
}
|
||||||
return CSParams { pub_bases: p };
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn commit<E: Engine>(csp: &CSParams<E>, x: &Vec<E::Fr>, r: E::Fr) -> Commitment<E> {
|
pub fn decommit(&self, cm: &Commitment<E>, x: &Vec<E::Fr>) -> bool {
|
||||||
let rng = &mut thread_rng();
|
let l = x.len();
|
||||||
|
// pub_base[0] => h, x[0] => r
|
||||||
//let r = R.unwrap_or(Fr::random(rng));
|
// check that cm.r == x[0]
|
||||||
// c = g1^m1 * ... * gn^mn * h^r
|
let mut dc = self.pub_bases[0].clone();
|
||||||
//println!("(commit) index: 0");
|
dc.mul_assign(cm.r.clone());
|
||||||
let mut c = csp.pub_bases[0].clone();
|
for i in 1..l {
|
||||||
c.mul_assign(r);
|
let mut basis = self.pub_bases[i];
|
||||||
for i in 1..x.len() {
|
basis.mul_assign(x[i]);
|
||||||
//println!("(commit) index: {}", i);
|
dc.add_assign(&basis);
|
||||||
let mut basis = csp.pub_bases[i];
|
}
|
||||||
basis.mul_assign(x[i]);
|
return dc == cm.c && cm.r == x[0];
|
||||||
c.add_assign(&basis);
|
|
||||||
}
|
}
|
||||||
// return (c, r) <- r
|
|
||||||
let commitment = Commitment { c, r };
|
|
||||||
|
|
||||||
// debugging
|
|
||||||
//println!("{}", commitment);
|
|
||||||
return commitment;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn decommit<E: Engine>(csp: &CSParams<E>, cm: &Commitment<E>, x: &Vec<E::Fr>) -> bool {
|
|
||||||
let l = x.len();
|
|
||||||
// pub_base[0] => h, x[0] => r
|
|
||||||
// check that cm.r == x[0]
|
|
||||||
// assert!(cm.r == x[0]);
|
|
||||||
let mut dc = csp.pub_bases[0].clone();
|
|
||||||
dc.mul_assign(cm.r.clone());
|
|
||||||
for i in 1..l {
|
|
||||||
let mut basis = csp.pub_bases[i];
|
|
||||||
basis.mul_assign(x[i]);
|
|
||||||
dc.add_assign(&basis);
|
|
||||||
}
|
|
||||||
return dc == cm.c && cm.r == x[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -215,15 +181,15 @@ mod tests {
|
||||||
fn commit_n_message_works() {
|
fn commit_n_message_works() {
|
||||||
let rng = &mut thread_rng();
|
let rng = &mut thread_rng();
|
||||||
let len = 3;
|
let len = 3;
|
||||||
let csp = setup_gen_params::<Bls12>(len);
|
let csp = CSParams::<Bls12>::setup_gen_params(rng, len);
|
||||||
|
|
||||||
let mut m: Vec<Fr> = Vec::new();
|
let mut m: Vec<Fr> = Vec::new();
|
||||||
for i in 0..len {
|
for i in 0..len {
|
||||||
m.push(Fr::rand(rng));
|
m.push(Fr::rand(rng));
|
||||||
}
|
}
|
||||||
let r = m[0].clone();
|
let r = m[0].clone();
|
||||||
let c = commit(&csp, &m, r);
|
let c = csp.commit(rng, &m, r);
|
||||||
|
|
||||||
assert_eq!(true, decommit(&csp, &c, &m));
|
assert_eq!(true, csp.decommit( &c, &m));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue