Add duplicate payinfo check for identify

This commit is contained in:
aniampio
2022-07-14 23:33:15 +01:00
parent 7e444b7c42
commit d696535da5
4 changed files with 21 additions and 34 deletions
@@ -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<IdentifyResult> {
@@ -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(
&params,
&verification_key,
&user_keypair.secret_key(),
&pay_info,
&pay_info1,
false,
spend_vv,
).unwrap();
assert!(payment1
.spend_verify(&params, &verification_key, &pay_info, spend_vv)
.spend_verify(&params, &verification_key, &pay_info1, spend_vv)
.unwrap());
let payment2 = payment1.clone();
assert!(payment2
.spend_verify(&params, &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()));
}
}
@@ -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<Scalar> for &'a VerificationKeyAuth {
}
impl<T> Sum<T> for VerificationKeyAuth
where
T: Borrow<VerificationKeyAuth>,
where
T: Borrow<VerificationKeyAuth>,
{
#[inline]
fn sum<I>(iter: I) -> Self
where
I: Iterator<Item = T>,
where
I: Iterator<Item=T>,
{
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,
}
@@ -253,7 +253,7 @@ pub fn compute_kappa(
.sum::<G2Projective>()
}
#[derive(PartialEq)]
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct PayInfo {
pub info: [u8; 32],
}
@@ -75,29 +75,6 @@ fn main() -> Result<(), CompactEcashError> {
.spend_verify(&params, &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(())
}