Add new aggregation function and struct for the aggregated wallet
This commit is contained in:
@@ -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<Wallet> {
|
||||
|
||||
// Aggregate partial wallets
|
||||
let signature_shares: Vec<SignatureShare> = 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),
|
||||
})
|
||||
}
|
||||
@@ -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<SignerIndex>,
|
||||
}
|
||||
|
||||
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<SignerIndex> {
|
||||
self.idx
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Wallet {
|
||||
sig: Signature,
|
||||
v: Scalar,
|
||||
t: Scalar,
|
||||
l: Cell<u64>,
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -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() {}
|
||||
|
||||
@@ -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<Wallet> {
|
||||
) -> Result<PartialWallet> {
|
||||
// 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,
|
||||
|
||||
@@ -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<Wallet> = izip!(
|
||||
let unblinded_wallet_shares: Vec<PartialWallet> = 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<SignatureShare> = 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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user