From fcc940a4d668bfa8e3c3fe2a01798bbada4235fc Mon Sep 17 00:00:00 2001 From: aniampio Date: Thu, 24 Mar 2022 20:14:10 +0000 Subject: [PATCH] Add new aggregation function and struct for the aggregated wallet --- .../src/scheme/aggregation.rs | 27 +++++++++++++++++-- common/nym-compact-ecash/src/scheme/mod.rs | 25 +++++++++++++---- common/nym-compact-ecash/src/scheme/spend.rs | 9 +++++++ .../src/scheme/withdrawal.rs | 6 ++--- common/nym-compact-ecash/src/tests/e2e.rs | 16 +++-------- 5 files changed, 61 insertions(+), 22 deletions(-) diff --git a/common/nym-compact-ecash/src/scheme/aggregation.rs b/common/nym-compact-ecash/src/scheme/aggregation.rs index 6d529f9868..e8be02d918 100644 --- a/common/nym-compact-ecash/src/scheme/aggregation.rs +++ b/common/nym-compact-ecash/src/scheme/aggregation.rs @@ -1,5 +1,6 @@ use core::iter::Sum; use core::ops::Mul; +use std::cell::Cell; use bls12_381::{G2Prepared, G2Projective, Scalar}; use group::Curve; @@ -7,9 +8,10 @@ use itertools::Itertools; use crate::Attribute; use crate::error::{CompactEcashError, Result}; -use crate::scheme::{PartialSignature, Signature, SignatureShare, SignerIndex}; -use crate::scheme::keygen::VerificationKeyAuth; +use crate::scheme::{PartialSignature, PartialWallet, Signature, SignatureShare, SignerIndex, Wallet}; +use crate::scheme::keygen::{SecretKeyUser, VerificationKeyAuth}; use crate::scheme::setup::Parameters; +use crate::scheme::withdrawal::RequestInfo; use crate::utils::{check_bilinear_pairing, perform_lagrangian_interpolation_at_origin}; pub(crate) trait Aggregatable: Sized { @@ -131,4 +133,25 @@ pub fn aggregate_signatures( )); } Ok(signature) +} + +pub fn aggregate_wallets(params: &Parameters, verification_key: &VerificationKeyAuth, skUser: &SecretKeyUser, wallets: &[PartialWallet], reqInfo: &RequestInfo) -> Result { + + // Aggregate partial wallets + let signature_shares: Vec = wallets + .iter() + .enumerate() + .map(|(idx, wallet)| SignatureShare::new(*wallet.signature(), (idx + 1) as u64)) + .collect(); + + let attributes = vec![skUser.sk, reqInfo.get_v(), reqInfo.get_t()]; + let aggregated_signature = + aggregate_signature_shares(¶ms, &verification_key, &attributes, &signature_shares)?; + + Ok(Wallet { + sig: aggregated_signature, + v: reqInfo.get_v(), + t: reqInfo.get_t(), + l: Cell::new(0), + }) } \ No newline at end of file diff --git a/common/nym-compact-ecash/src/scheme/mod.rs b/common/nym-compact-ecash/src/scheme/mod.rs index 3601d968be..0c5f6bed92 100644 --- a/common/nym-compact-ecash/src/scheme/mod.rs +++ b/common/nym-compact-ecash/src/scheme/mod.rs @@ -1,3 +1,4 @@ +use std::cell::Cell; use std::convert::TryFrom; use std::convert::TryInto; @@ -118,18 +119,32 @@ impl SignatureShare { // } } -pub struct Wallet { +pub struct PartialWallet { sig: Signature, v: Scalar, idx: Option, } -impl Wallet { +impl PartialWallet { pub fn signature(&self) -> &Signature { &self.sig } - pub fn v(&self) -> Scalar { - self.v - } + pub fn v(&self) -> Scalar { self.v } pub fn index(&self) -> Option { self.idx } } + +pub struct Wallet { + sig: Signature, + v: Scalar, + t: Scalar, + l: Cell, +} + +impl Wallet { + pub fn signature(&self) -> &Signature { &self.sig } + pub fn v(&self) -> Scalar { self.v } + pub fn t(&self) -> Scalar { self.t } + fn up(&self) { + self.l.set(self.l.get() + 1); + } +} \ No newline at end of file diff --git a/common/nym-compact-ecash/src/scheme/spend.rs b/common/nym-compact-ecash/src/scheme/spend.rs index 8b13789179..ed6da623be 100644 --- a/common/nym-compact-ecash/src/scheme/spend.rs +++ b/common/nym-compact-ecash/src/scheme/spend.rs @@ -1 +1,10 @@ +use crate::scheme::keygen::{SecretKeyUser, VerificationKeyAuth}; +use crate::scheme::Wallet; +pub struct PayInfo {} + +pub fn spend(wallet: &Wallet, verification_key: &VerificationKeyAuth, skUser: &SecretKeyUser, payInfo: &PayInfo) { + // +} + +pub fn spend_verify() {} diff --git a/common/nym-compact-ecash/src/scheme/withdrawal.rs b/common/nym-compact-ecash/src/scheme/withdrawal.rs index 50ee42c601..4dcc8f56b0 100644 --- a/common/nym-compact-ecash/src/scheme/withdrawal.rs +++ b/common/nym-compact-ecash/src/scheme/withdrawal.rs @@ -3,7 +3,7 @@ use group::{Curve, GroupEncoding}; use crate::error::{CompactEcashError, Result}; use crate::proofs::{WithdrawalReqInstance, WithdrawalReqProof, WithdrawalReqWitness}; -use crate::scheme::{BlindedSignature, Signature, Wallet}; +use crate::scheme::{BlindedSignature, PartialWallet, Signature}; use crate::scheme::keygen::{PublicKeyUser, SecretKeyAuth, SecretKeyUser, VerificationKeyAuth}; use crate::scheme::keygen::ttp_keygen; use crate::scheme::setup::Parameters; @@ -140,7 +140,7 @@ pub fn issue_verify( sk_user: &SecretKeyUser, blind_signature: &BlindedSignature, req_info: &RequestInfo, -) -> Result { +) -> Result { // Parse the blinded signature let h = blind_signature.0; let c = blind_signature.1; @@ -182,7 +182,7 @@ pub fn issue_verify( )); } - Ok(Wallet { + Ok(PartialWallet { sig: Signature(h, unblinded_c), v: req_info.v, idx: None, diff --git a/common/nym-compact-ecash/src/tests/e2e.rs b/common/nym-compact-ecash/src/tests/e2e.rs index 6bf17c1b21..bdd43680d2 100644 --- a/common/nym-compact-ecash/src/tests/e2e.rs +++ b/common/nym-compact-ecash/src/tests/e2e.rs @@ -1,8 +1,8 @@ use itertools::izip; use crate::error::CompactEcashError; -use crate::scheme::{SignatureShare, Wallet}; -use crate::scheme::aggregation::{aggregate_signature_shares, aggregate_verification_keys}; +use crate::scheme::{PartialWallet, SignatureShare}; +use crate::scheme::aggregation::{aggregate_signature_shares, aggregate_verification_keys, aggregate_wallets}; use crate::scheme::keygen::{ generate_keypair_user, PublicKeyUser, SecretKeyUser, ttp_keygen, VerificationKeyAuth, }; @@ -35,7 +35,7 @@ fn main() -> Result<(), CompactEcashError> { wallet_blinded_signatures.push(blind_signature.unwrap()); } - let unblinded_wallet_shares: Vec = izip!( + let unblinded_wallet_shares: Vec = izip!( wallet_blinded_signatures.iter(), verification_keys_auth.iter() ) @@ -43,15 +43,7 @@ fn main() -> Result<(), CompactEcashError> { .collect(); // Aggregate partial wallets - let signature_shares: Vec = unblinded_wallet_shares - .iter() - .enumerate() - .map(|(idx, wallet)| SignatureShare::new(*wallet.signature(), (idx + 1) as u64)) - .collect(); - - let attributes = vec![user_keypair.secret_key().sk, req_info.get_v(), req_info.get_t()]; - let aggregated_signature = - aggregate_signature_shares(¶ms, &verification_key, &attributes, &signature_shares)?; + let aggr_wallet = aggregate_wallets(¶ms, &verification_key, &user_keypair.secret_key(), &unblinded_wallet_shares, &req_info); Ok(()) }