From 6a26e82b607455ef8ea4369cbfd93b4500c1df04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=BA=C3=B1ez?= Date: Thu, 14 Mar 2024 17:36:43 +0100 Subject: [PATCH] Some tests fixed: share updating should be done on top of blinded shares As suspected 2 commits ago --- ferveo-tdec/src/key_share.rs | 10 ++++++++++ ferveo-tdec/src/lib.rs | 10 ++++++---- ferveo/src/refresh.rs | 28 +++++++++++++++++++++++----- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/ferveo-tdec/src/key_share.rs b/ferveo-tdec/src/key_share.rs index 46536aa0..66431ca4 100644 --- a/ferveo-tdec/src/key_share.rs +++ b/ferveo-tdec/src/key_share.rs @@ -18,6 +18,8 @@ pub struct ShareCommitment( #[serde_as(as = "serialization::SerdeAs")] pub E::G1Affine, // A_{i, \omega_i} ); +// TODO: Improve by adding share commitment here +// TODO: Is this a test utility perhaps? #[derive(Debug, Copy, Clone)] pub struct BlindedKeyShare { pub validator_public_key: E::G2Affine, // [b] H @@ -52,6 +54,14 @@ impl BlindedKeyShare { // self.blinded_key_share = // self.blinded_key_share.mul(-*omega_inv).into_affine(); // } + pub fn unblind( + &self, + unblinding_factor: E::ScalarField, + ) -> PrivateKeyShare { + PrivateKeyShare::( + self.blinded_key_share.mul(unblinding_factor).into_affine(), + ) + } } #[serde_as] diff --git a/ferveo-tdec/src/lib.rs b/ferveo-tdec/src/lib.rs index 78a32d2b..8ba22849 100644 --- a/ferveo-tdec/src/lib.rs +++ b/ferveo-tdec/src/lib.rs @@ -242,13 +242,15 @@ pub mod test_common { .enumerate() { let private_key_share = PrivateKeyShare::(*private_share); - let b = E::ScalarField::one(); // FIXME: rand(rng); - let blinded_key_share: BlindedKeyShare = private_key_share.blind(b); + let blinding_factor = E::ScalarField::rand(rng); + let blinded_key_share: BlindedKeyShare = + private_key_share.blind(blinding_factor); + private_contexts.push(PrivateDecryptionContextSimple:: { index, setup_params: SetupParams { - b, - b_inv: b.inverse().unwrap(), + b: blinding_factor, + b_inv: blinding_factor.inverse().unwrap(), g, h_inv: E::G2Prepared::from(-h.into_group()), g_inv: E::G1Prepared::from(-g.into_group()), diff --git a/ferveo/src/refresh.rs b/ferveo/src/refresh.rs index d4b5aa93..6931ec58 100644 --- a/ferveo/src/refresh.rs +++ b/ferveo/src/refresh.rs @@ -46,7 +46,7 @@ impl PrivateKeyShare { &self, share_updates: &[ShareUpdate], ) -> UpdatedPrivateKeyShare { - // TODO: Validate commitments from share update + // TODO: Validate commitments from share update // FIXME: Don't forget!!!!! let updated_key_share = share_updates .iter() .fold(self.0 .0, |acc, delta| (acc + delta.update).into()); @@ -316,7 +316,8 @@ mod tests_refresh { use ark_bls12_381::Fr; use ark_std::{test_rng, UniformRand, Zero}; use ferveo_tdec::{ - test_common::setup_simple, PrivateDecryptionContextSimple, + test_common::setup_simple, BlindedKeyShare, + PrivateDecryptionContextSimple, }; use rand_core::RngCore; use test_case::{test_case, test_matrix}; @@ -601,9 +602,26 @@ mod tests_refresh { .collect(); // And creates a new, refreshed share - let updated_share = - PrivateKeyShare(p.private_key_share.clone()) - .create_updated_key_share(&updates_for_participant); + let blinded_key_share = + p.public_decryption_contexts[p.index].blinded_key_share; + + // TODO: Encapsulate this somewhere, originally from PrivateKeyShare.create_updated_key_share + // FIXME: Validate commitments from share update, don't forget!!!!! + let updated_blinded_key_share: BlindedKeyShare = + BlindedKeyShare { + validator_public_key: blinded_key_share + .validator_public_key, + blinded_key_share: updates_for_participant.iter().fold( + blinded_key_share.blinded_key_share, + |acc, delta| (acc + delta.update).into(), + ), + }; + + let unblinding_factor = p.setup_params.b_inv; + let updated_share = UpdatedPrivateKeyShare( + updated_blinded_key_share.unblind(unblinding_factor), + ); + (p.index as u32, updated_share) }) // We only need `threshold` refreshed shares to recover the original share