Add new aggregation function and struct for the aggregated wallet

This commit is contained in:
aniampio
2022-03-24 20:14:10 +00:00
parent 036092bb9c
commit fcc940a4d6
5 changed files with 61 additions and 22 deletions
@@ -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(&params, &verification_key, &attributes, &signature_shares)?;
Ok(Wallet {
sig: aggregated_signature,
v: reqInfo.get_v(),
t: reqInfo.get_t(),
l: Cell::new(0),
})
}
+20 -5
View File
@@ -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,
+4 -12
View File
@@ -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(&params, &verification_key, &attributes, &signature_shares)?;
let aggr_wallet = aggregate_wallets(&params, &verification_key, &user_keypair.secret_key(), &unblinded_wallet_shares, &req_info);
Ok(())
}