Add duplicate payinfo check for identify
This commit is contained in:
@@ -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(
|
||||
¶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()));
|
||||
}
|
||||
}
|
||||
@@ -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(¶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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user