diff --git a/common/nym_offline_divisible_ecash/src/proofs/proof_spend.rs b/common/nym_offline_divisible_ecash/src/proofs/proof_spend.rs index 0873353d84..7a5823f805 100644 --- a/common/nym_offline_divisible_ecash/src/proofs/proof_spend.rs +++ b/common/nym_offline_divisible_ecash/src/proofs/proof_spend.rs @@ -163,7 +163,7 @@ impl SpendProof { .chain(std::iter::once(zkcm_phi1.to_bytes().as_ref())) .chain(std::iter::once(zkcm_varphi0.to_bytes().as_ref())) .chain(std::iter::once(zkcm_varphi1.to_bytes().as_ref())) - // .chain(std::iter::once(zkcm_pg_eq1.to_compressed().as_ref())) + .chain(std::iter::once(zkcm_pg_eq1.to_compressed().as_ref())) // .chain(std::iter::once(zkcm_pg_eq2.to_compressed().as_ref())) // .chain(std::iter::once(zkcm_pg_eq3.to_compressed().as_ref())) .chain(std::iter::once(zkcm_pg_eq4.to_compressed().as_ref())) @@ -270,7 +270,7 @@ impl SpendProof { .chain(std::iter::once(zkcm_phi1.to_bytes().as_ref())) .chain(std::iter::once(zkcm_varphi0.to_bytes().as_ref())) .chain(std::iter::once(zkcm_varphi1.to_bytes().as_ref())) - // .chain(std::iter::once(zkcm_pg_eq1.to_compressed().as_ref())) + .chain(std::iter::once(zkcm_pg_eq1.to_compressed().as_ref())) // .chain(std::iter::once(zkcm_pg_eq2.to_compressed().as_ref())) // .chain(std::iter::once(zkcm_pg_eq3.to_compressed().as_ref())) .chain(std::iter::once(zkcm_pg_eq4.to_compressed().as_ref())) @@ -391,16 +391,17 @@ mod tests { let pg_eq3 = pg_rrprime_yy + pg_ssprime_gen2 + pg_varsigpr2_ww1 + pg_thetapr2_ww2 + pg_gen1_zz.neg(); let pg_eq4 = pg_rr_tt - pg_gen1_gen2; - // assert_eq!(pg_varsigpr1_delta + pg_psi0_delta * r_varsig1.neg(), pg_varsigpr2_gen2 + pg_psi0_gen2 * r_varsig2.neg()); - // println!("--------------Check1---------------"); + assert_eq!(pg_varsigpr1_delta + pg_psi0_delta * r_varsig1.neg(), pg_varsigpr2_gen2 + pg_psi0_gen2 * r_varsig2.neg()); + println!("--------------Check1---------------"); + + assert_eq!(pg_thetapr1_delta + pg_psi0_delta * r_theta1.neg(), pg_thetapr2_gen2 + pg_psi0_gen2 * r_theta2.neg()); + println!("--------------Check2---------------"); - // assert_eq!(pg_thetapr1_delta + pg_psi0_delta * r_theta1.neg(), pg_thetapr2_gen2 + pg_psi0_gen2 * r_theta2.neg()); - // println!("--------------Check2---------------"); - // // assert_eq!(pg_rrprime_yy + pg_psi0_yy * r_rr.neg() + pg_ssprime_gen2 + pg_psi0_gen2 * r_ss.neg() + pg_varsigpr2_ww1 + pg_psi0_ww1 * r_varsig2.neg() // + pg_thetapr2_ww2 + pg_psi0_ww2 * r_theta2 - pg_gen1_zz, Gt::identity()); // println!("--------------Check2---------------"); + let instance = SpendInstance { kappa, phi, diff --git a/common/nym_offline_divisible_ecash/src/proofs/proof_withdrawal.rs b/common/nym_offline_divisible_ecash/src/proofs/proof_withdrawal.rs index 0a9c2d4d95..d34236973b 100644 --- a/common/nym_offline_divisible_ecash/src/proofs/proof_withdrawal.rs +++ b/common/nym_offline_divisible_ecash/src/proofs/proof_withdrawal.rs @@ -203,7 +203,7 @@ impl WithdrawalReqProof { ) -> bool { let grp = params.get_grp(); let g1 = grp.gen1(); - let paramsU = params.get_params_u(); + let params_u = params.get_params_u(); // recompute zk commitments for each instance let zkcm_com = instance.com * self.challenge @@ -211,7 +211,7 @@ impl WithdrawalReqProof { + self .response_attributes .iter() - .zip(paramsU.get_gammas().iter()) + .zip(params_u.get_gammas().iter()) .map(|(m_i, gamma_i)| gamma_i * m_i) .sum::(); @@ -229,7 +229,7 @@ impl WithdrawalReqProof { instance.pk_user.pk * self.challenge + g1 * self.response_attributes[0]; // covert to bytes - let gammas_bytes = paramsU + let gammas_bytes = params_u .get_gammas() .iter() .map(|gamma| gamma.to_bytes()) diff --git a/common/nym_offline_divisible_ecash/src/scheme/setup.rs b/common/nym_offline_divisible_ecash/src/scheme/setup.rs index f32b77b808..8cf7dfd085 100644 --- a/common/nym_offline_divisible_ecash/src/scheme/setup.rs +++ b/common/nym_offline_divisible_ecash/src/scheme/setup.rs @@ -1,5 +1,9 @@ -use bls12_381::{G1Affine, G1Projective, G2Affine, G2Prepared, G2Projective, Scalar}; +use std::convert::TryFrom; +use std::net::ToSocketAddrs; + +use bls12_381::{G1Affine, G1Projective, G2Affine, G2Prepared, G2Projective, pairing, Scalar}; use ff::Field; +use group::Curve; use rand::thread_rng; use crate::constants::L; @@ -83,35 +87,44 @@ impl Parameters { let sigma = g1 * z; let theta = eta * z; - let sigmas_u: Vec = (0..=L - 1) - .map(|i| sigma * (y * Scalar::from(i + 1))) + let sigmas_u: Vec = (1..=L) + .map(|i| sigma * (y.pow(&[i as u64, 0, 0, 0]))) .collect(); - let thetas_u: Vec = (0..=L - 1) - .map(|i| theta * (y * Scalar::from(i + 1))) + let thetas_u: Vec = (1..=L) + .map(|i| theta * (y.pow(&[i as u64, 0, 0, 0]))) .collect(); let deltas_a: Vec = (0..=L - 1) - .map(|i| g2 * (y * Scalar::from(i))) + .map(|i| g2 * (y.pow(&[i as u64, 0, 0, 0]))) .collect(); + let etas_u: Vec = vec_a.iter().map(|x| g1 * x).collect(); let mut etas_a: Vec = Default::default(); for l in 1..=L { for k in 0..=l - 1 { - etas_a.push(g2 * (vec_a[l as usize - 1].neg() * (y * Scalar::from(k)))); + etas_a.push(g2 * (vec_a[l as usize - 1].neg() * (y.pow(&[k as u64, 0, 0, 0])))); } } let sps_keypair = SPSKeyPair::new(grp.clone(), 2, 0); - let messages_a = vec![sigma, theta]; let sps_signatures: Vec = sigmas_u .iter() .zip(thetas_u.iter()) - .map(|(sigma, theta)| sps_keypair.sps_sk.sign(grp.clone(), Some(&messages_a), None)) + .map(|(sigma, theta)| sps_keypair.sps_sk.sign(grp.clone(), Some(&vec![*sigma, *theta]), None)) .collect(); + let l = 10; + let vv = 20; + + let tl = thetas_u.get(l - 1).unwrap(); + let dv = deltas_a.get(vv - 1).unwrap(); + let tlv = thetas_u.get(l - 1 + vv - 1).unwrap(); + assert_eq!(pairing(&tl.to_affine(), &dv.to_affine()), pairing(&tlv.to_affine(), g2)); + println!("Hello world!!"); + // Compute signature for each pair sigma, theta let params_u = ParametersUser { gammas: vec![gamma1, gamma2], @@ -166,15 +179,15 @@ impl ParametersUser { pub(crate) fn get_etas(&self) -> &[G1Projective] { &self.etas } - pub(crate) fn get_ith_eta(&self, idx: usize) -> &G1Projective { self.etas.get(idx).unwrap() } + pub(crate) fn get_ith_eta(&self, idx: usize) -> &G1Projective { self.etas.get(idx - 1).unwrap() } pub(crate) fn get_sigmas(&self) -> &[G1Projective] { &self.sigmas } - pub(crate) fn get_ith_sigma(&self, idx: usize) -> &G1Projective { self.sigmas.get(idx).unwrap() } + pub(crate) fn get_ith_sigma(&self, idx: usize) -> &G1Projective { self.sigmas.get(idx - 1).unwrap() } pub(crate) fn get_thetas(&self) -> &[G1Projective] { &self.thetas } - pub(crate) fn get_ith_theta(&self, idx: usize) -> &G1Projective { self.thetas.get(idx).unwrap() } + pub(crate) fn get_ith_theta(&self, idx: usize) -> &G1Projective { self.thetas.get(idx - 1).unwrap() } pub(crate) fn get_sps_signs(&self) -> &[SPSSignature] { &self.sps_signatures } @@ -196,5 +209,5 @@ impl ParametersAuthority { pub(crate) fn get_etas(&self) -> &[G2Projective] { &self.etas } - pub(crate) fn get_ith_eta(&self, idx: usize) -> &G2Projective { self.etas.get(idx).unwrap() } + pub(crate) fn get_ith_eta(&self, idx: usize) -> &G2Projective { self.etas.get(idx - 1).unwrap() } } diff --git a/common/nym_offline_divisible_ecash/src/scheme/structure_preserving_signature.rs b/common/nym_offline_divisible_ecash/src/scheme/structure_preserving_signature.rs index fe323cbaba..24b76b1893 100644 --- a/common/nym_offline_divisible_ecash/src/scheme/structure_preserving_signature.rs +++ b/common/nym_offline_divisible_ecash/src/scheme/structure_preserving_signature.rs @@ -37,8 +37,8 @@ impl SPSSecretKey { let r = grp.random_scalar(); let rr = grp.gen1() * r; let ss: G1Projective = match messages_a { - Some(msgsA) => { - let prodS: Vec = msgsA + Some(msgs_a) => { + let prodS: Vec = msgs_a .iter() .zip(self.ws.iter()) .map(|(m_i, w_i)| m_i * w_i.neg()) @@ -48,8 +48,8 @@ impl SPSSecretKey { None => grp.gen1() * (self.z() - r * self.y()) }; let tt = match messages_b { - Some(msgsB) => { - let prodT: Vec = msgsB + Some(msgs_b) => { + let prodT: Vec = msgs_b .iter() .zip(self.us.iter()) .map(|(m_i, u_i)| m_i * u_i.neg())