ccs08: test and fix hash
This commit is contained in:
parent
497adf2455
commit
65336bf8cc
93
src/ccs08.rs
93
src/ccs08.rs
|
@ -14,6 +14,7 @@ use pairing::{Engine, CurveProjective};
|
|||
use ff::PrimeField;
|
||||
use std::collections::HashMap;
|
||||
use std::fmt::Display;
|
||||
use std::mem::transmute;
|
||||
|
||||
/*
|
||||
paramsUL contains elements generated by the verifier, which are necessary for the prover.
|
||||
|
@ -139,7 +140,7 @@ fn prove_ul<E: Engine>(x: i64, r: E::Fr, p: ParamsUL<E>) -> ProofUL<E> {
|
|||
V.push(A);
|
||||
s.push(E::Fr::rand(rng));
|
||||
t.push(E::Fr::rand(rng));
|
||||
a.push(E::pairing( V[i], p.mpk.g2));
|
||||
a.push(E::pairing(V[i], p.mpk.g2));
|
||||
a[i].pow(s[i].into_repr());
|
||||
a[i] = a[i].inverse().unwrap();
|
||||
let mut E = E::pairing(p.mpk.g1, p.mpk.g2);
|
||||
|
@ -173,7 +174,7 @@ fn prove_ul<E: Engine>(x: i64, r: E::Fr, p: ParamsUL<E>) -> ProofUL<E> {
|
|||
ti.sub_assign(&vi);
|
||||
zv[i] = ti.clone();
|
||||
}
|
||||
return ProofUL {v: V, d: D, comm: C, a, s, t, zsig, zv, ch: c, m, zr};
|
||||
return ProofUL { v: V, d: D, comm: C, a, s, t, zsig, zv, ch: c, m, zr };
|
||||
}
|
||||
|
||||
fn Hash<E: Engine>(a: Vec<E::Fqk>, D: E::G2) -> E::Fr {
|
||||
|
@ -190,31 +191,45 @@ fn Hash<E: Engine>(a: Vec<E::Fqk>, D: E::G2) -> E::Fr {
|
|||
|
||||
let mut hash_buf: [u8; 64] = [0; 64];
|
||||
hash_buf.copy_from_slice(&sha2_digest[0..64]);
|
||||
return E::Fr::from_str(&str::from_utf8(&hash_buf).unwrap()).unwrap();
|
||||
let mut hexresult = fmt_bytes_to_int(hash_buf);
|
||||
let result = E::Fr::from_str(&hexresult);
|
||||
return result.unwrap();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Setup receives integers a and b, and configures the parameters for the rangeproof scheme.
|
||||
*/
|
||||
pub fn ccs08_setup<E: Engine>(a: i64, b: i64) -> RPPublicParams<E> {
|
||||
// Compute optimal values for u and l
|
||||
if a > b {
|
||||
panic!("a must be less than or equal to b");
|
||||
fn fmt_bytes_to_int(bytearray: [u8; 64]) -> String {
|
||||
let mut result: String = "".to_string();
|
||||
for byte in bytearray.iter() {
|
||||
// Decide if you want upper- or lowercase results,
|
||||
// padding the values to two characters, spaces
|
||||
// between bytes, etc.
|
||||
result = result + &format!("{}", *byte as u8);
|
||||
}
|
||||
let p: PublicParams<E>;
|
||||
let logb = (b as f64).log10();
|
||||
if logb != 0.0 {
|
||||
let u = b / logb as i64;
|
||||
if u != 0 {
|
||||
let l = (b as f64).log(u as f64).ceil() as i64;
|
||||
let params_out: ParamsUL<E> = setup_ul(u, l);
|
||||
return RPPublicParams { p: params_out, a, b };
|
||||
} else {
|
||||
panic!("u is zero");
|
||||
result.to_string()
|
||||
}
|
||||
|
||||
impl<E: Engine> RPPublicParams<E> {
|
||||
/*
|
||||
Setup receives integers a and b, and configures the parameters for the rangeproof scheme.
|
||||
*/
|
||||
pub fn setup(a: i64, b: i64) -> RPPublicParams<E> {
|
||||
// Compute optimal values for u and l
|
||||
if a > b {
|
||||
panic!("a must be less than or equal to b");
|
||||
}
|
||||
let p: PublicParams<E>;
|
||||
let logb = (b as f64).log10();
|
||||
if logb != 0.0 {
|
||||
let u = b / logb as i64;
|
||||
if u != 0 {
|
||||
let l = (b as f64).log(u as f64).ceil() as i64;
|
||||
let params_out: ParamsUL<E> = setup_ul(u, l);
|
||||
return RPPublicParams { p: params_out, a, b };
|
||||
} else {
|
||||
panic!("u is zero");
|
||||
}
|
||||
} else {
|
||||
panic!("log(b) is zero");
|
||||
}
|
||||
} else {
|
||||
panic!("log(b) is zero");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -222,11 +237,10 @@ pub fn ccs08_setup<E: Engine>(a: i64, b: i64) -> RPPublicParams<E> {
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use pairing::bls12_381::{Bls12, Fr};
|
||||
use pairing::bls12_381::{Bls12, G2, Fq12, Fr};
|
||||
|
||||
#[test]
|
||||
fn setup_ul_works() {
|
||||
let mut rng = &mut rand::thread_rng();
|
||||
let params_set = setup_ul::<Bls12>(2, 3);
|
||||
assert_eq!(2, params_set.signatures.len());
|
||||
for (m, s) in params_set.signatures {
|
||||
|
@ -245,8 +259,7 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn setup_works() {
|
||||
let mut rng = &mut rand::thread_rng();
|
||||
let public_params = ccs08_setup::<Bls12>(2, 10);
|
||||
let public_params = RPPublicParams::<Bls12>::setup(2, 10);
|
||||
assert_eq!(2, public_params.a);
|
||||
assert_eq!(10, public_params.b);
|
||||
assert_eq!(10, public_params.p.signatures.len());
|
||||
|
@ -260,21 +273,37 @@ mod tests {
|
|||
#[test]
|
||||
#[should_panic(expected = "a must be less than or equal to b")]
|
||||
fn setup_wrong_a_and_b() {
|
||||
let mut rng = &mut rand::thread_rng();
|
||||
let public_params = ccs08_setup::<Bls12>(10, 2);
|
||||
let public_params = RPPublicParams::<Bls12>::setup(10, 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic(expected = "u is zero")]
|
||||
fn setup_wrong_b() {
|
||||
let mut rng = &mut rand::thread_rng();
|
||||
let public_params = ccs08_setup::<Bls12>(-1, 0);
|
||||
let public_params = RPPublicParams::<Bls12>::setup(-1, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic(expected = "log(b) is zero")]
|
||||
fn setup_wrong_logb() {
|
||||
let public_params = RPPublicParams::<Bls12>::setup(-1, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn fmt_byte_to_int_works() {
|
||||
assert_eq!("122352312313431223523123134312235231231343122352312313431223523123134312235231231343122352312313431223523123134312235231231343122352312313431223523123",
|
||||
fmt_bytes_to_int([12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123,13,43,12,235,23,123]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hash_works() {
|
||||
let mut rng = &mut rand::thread_rng();
|
||||
let public_params = ccs08_setup::<Bls12>(-1, 1);
|
||||
let D = G2::rand(rng);
|
||||
let D2 = G2::rand(rng);
|
||||
let a = vec! {Fq12::rand(rng), Fq12::rand(rng), Fq12::rand(rng)};
|
||||
let a2 = vec! {Fq12::rand(rng), Fq12::rand(rng), Fq12::rand(rng)};
|
||||
assert_eq!(false, Hash::<Bls12>(a.clone(), D.clone()).is_zero());
|
||||
assert_ne!(Hash::<Bls12>(a2.clone(), D.clone()), Hash::<Bls12>(a.clone(), D.clone()));
|
||||
assert_ne!(Hash::<Bls12>(a.clone(), D2.clone()), Hash::<Bls12>(a.clone(), D.clone()));
|
||||
assert_ne!(Hash::<Bls12>(a2.clone(), D2.clone()), Hash::<Bls12>(a.clone(), D.clone()));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue