From d696535da5b3fc6a5657e855fc7ffa008abfdc95 Mon Sep 17 00:00:00 2001 From: aniampio Date: Thu, 14 Jul 2022 23:33:15 +0100 Subject: [PATCH] Add duplicate payinfo check for identify --- .../src/scheme/identify.rs | 18 +++++++++++---- .../src/scheme/keygen.rs | 12 +++++----- .../src/scheme/mod.rs | 2 +- .../src/tests/e2e.rs | 23 ------------------- 4 files changed, 21 insertions(+), 34 deletions(-) diff --git a/common/nym_offline_compact_ecash/src/scheme/identify.rs b/common/nym_offline_compact_ecash/src/scheme/identify.rs index 74a9f8d105..629612ae55 100644 --- a/common/nym_offline_compact_ecash/src/scheme/identify.rs +++ b/common/nym_offline_compact_ecash/src/scheme/identify.rs @@ -3,11 +3,11 @@ use crate::PayInfo; use crate::scheme::keygen::PublicKeyUser; use crate::scheme::Payment; +#[derive(Debug, Eq, PartialEq)] pub enum IdentifyResult { NotADuplicatePayment, DuplicatePayInfo(PayInfo), DoubleSpendingPublicKeys(PublicKeyUser), - } pub fn identify(pay1: Payment, pay2: Payment, pay_info1: PayInfo, pay_info2: PayInfo) -> Result { @@ -43,6 +43,7 @@ mod tests { use itertools::izip; use crate::{aggregate_verification_keys, aggregate_wallets, generate_keypair_user, issue_verify, issue_wallet, PartialWallet, PayInfo, ttp_keygen, VerificationKeyAuth, withdrawal_request}; + use crate::scheme::identify::{identify, IdentifyResult}; use crate::scheme::setup::setup; #[test] @@ -90,20 +91,29 @@ mod tests { ).unwrap(); // Let's try to spend some coins - let pay_info = PayInfo { info: [6u8; 32] }; + let pay_info1 = PayInfo { info: [6u8; 32] }; let spend_vv = 1; let (payment1, upd_wallet) = aggr_wallet.spend( ¶ms, &verification_key, &user_keypair.secret_key(), - &pay_info, + &pay_info1, false, spend_vv, ).unwrap(); assert!(payment1 - .spend_verify(¶ms, &verification_key, &pay_info, spend_vv) + .spend_verify(¶ms, &verification_key, &pay_info1, spend_vv) .unwrap()); + + let payment2 = payment1.clone(); + assert!(payment2 + .spend_verify(¶ms, &verification_key, &pay_info1, spend_vv) + .unwrap()); + + let pay_info2 = pay_info1.clone(); + let identify_result = identify(payment1, payment2, pay_info1.clone(), pay_info2.clone()).unwrap(); + assert_eq!(identify_result, IdentifyResult::DuplicatePayInfo(pay_info1.clone())); } } \ No newline at end of file diff --git a/common/nym_offline_compact_ecash/src/scheme/keygen.rs b/common/nym_offline_compact_ecash/src/scheme/keygen.rs index d0c62db429..3f57599d24 100644 --- a/common/nym_offline_compact_ecash/src/scheme/keygen.rs +++ b/common/nym_offline_compact_ecash/src/scheme/keygen.rs @@ -11,11 +11,11 @@ use crate::error::{CompactEcashError, Result}; use crate::scheme::aggregation::aggregate_verification_keys; use crate::scheme::setup::GroupParameters; use crate::scheme::SignerIndex; -use crate::utils::Polynomial; use crate::utils::{ try_deserialize_g1_projective, try_deserialize_g2_projective, try_deserialize_scalar, try_deserialize_scalar_vec, }; +use crate::utils::Polynomial; #[derive(Debug, PartialEq, Clone)] pub struct SecretKeyAuth { @@ -242,13 +242,13 @@ impl<'a> Mul for &'a VerificationKeyAuth { } impl Sum for VerificationKeyAuth -where - T: Borrow, + where + T: Borrow, { #[inline] fn sum(iter: I) -> Self - where - I: Iterator, + where + I: Iterator, { let mut peekable = iter.peekable(); let head_attributes = match peekable.peek() { @@ -332,7 +332,7 @@ impl SecretKeyUser { } } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, Eq, PartialEq, Clone)] pub struct PublicKeyUser { pub(crate) pk: G1Projective, } diff --git a/common/nym_offline_compact_ecash/src/scheme/mod.rs b/common/nym_offline_compact_ecash/src/scheme/mod.rs index 35d6e09013..31e8188d49 100644 --- a/common/nym_offline_compact_ecash/src/scheme/mod.rs +++ b/common/nym_offline_compact_ecash/src/scheme/mod.rs @@ -253,7 +253,7 @@ pub fn compute_kappa( .sum::() } -#[derive(PartialEq)] +#[derive(PartialEq, Eq, Debug, Clone)] pub struct PayInfo { pub info: [u8; 32], } diff --git a/common/nym_offline_compact_ecash/src/tests/e2e.rs b/common/nym_offline_compact_ecash/src/tests/e2e.rs index ad4fa99705..528faa9974 100644 --- a/common/nym_offline_compact_ecash/src/tests/e2e.rs +++ b/common/nym_offline_compact_ecash/src/tests/e2e.rs @@ -75,29 +75,6 @@ fn main() -> Result<(), CompactEcashError> { .spend_verify(¶ms, &verification_key, &pay_info, spend_vv) .unwrap()); - // try to spend twice the same payment with different payInfo - let payment1 = payment.clone(); - let pay_info2 = PayInfo { info: [9u8; 32] }; - let rr2 = hash_to_scalar(pay_info2.info); - let l2 = aggr_wallet.l() - 1; - let payment2 = Payment { - kappa: payment1.kappa.clone(), - sig: payment1.sig.clone(), - ss: payment1.ss.clone(), - tt: vec![grparams.gen1() * user_keypair.secret_key().sk - + pseudorandom_fgt(&grparams, aggr_wallet.t(), l2) * rr2], - aa: payment1.aa.clone(), - cc: payment1.cc.clone(), - dd: payment1.dd.clone(), - rr: vec![rr2], - kappa_k: payment1.kappa_k.clone(), - sig_lk: payment1.sig_lk.clone(), - zk_proof: payment1.zk_proof.clone(), - vv: spend_vv, - }; - - let identified_user = identify(payment1, payment2, pay_info, pay_info2).unwrap(); - // assert_eq!(user_keypair.public_key().pk, identified_user.pk); Ok(()) }