From 0117a87d8fd753b60d55570c6587a81d5cfd6051 Mon Sep 17 00:00:00 2001 From: Piotr Roslaniec Date: Mon, 12 Feb 2024 15:17:32 +0100 Subject: [PATCH 1/2] feature: introduce refreshing api in ferveo --- ferveo/src/api.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/ferveo/src/api.rs b/ferveo/src/api.rs index dd8e40bd..c00acbc1 100644 --- a/ferveo/src/api.rs +++ b/ferveo/src/api.rs @@ -640,6 +640,7 @@ impl PrivateKeyShare { mod test_ferveo_api { use std::collections::HashMap; + use ark_std::iterable::Iterable; use ferveo_tdec::SecretBox; use itertools::{izip, Itertools}; use rand::{ From 9aca6aeeef0f88b5d9968829944caf6aec068398 Mon Sep 17 00:00:00 2001 From: Piotr Roslaniec Date: Wed, 14 Feb 2024 13:52:07 +0100 Subject: [PATCH 2/2] test: document domain point determinism --- ferveo/src/dkg.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/ferveo/src/dkg.rs b/ferveo/src/dkg.rs index 1ee6ec6e..d6d02014 100644 --- a/ferveo/src/dkg.rs +++ b/ferveo/src/dkg.rs @@ -752,6 +752,75 @@ mod test_aggregation { let sender = dkg.me.clone(); assert!(dkg.verify_message(&sender, &aggregate).is_err()); } + + /// Size of the domain should be equal a power of 2 + #[test] + fn test_domain_points_size_is_power_of_2() { + // Using a validators number which is not a power of 2 + let validators_num = 6; + let (dkg, _) = setup_dealt_dkg_with_n_validators( + validators_num, + validators_num, + validators_num, + ); + // This should cause the domain to be of size that is a power of 2 + assert_eq!(dkg.domain.elements().count(), 8); + } + + /// For the same number of validators, we should get the same domain points + /// in two different DKG instances + #[test] + fn test_domain_point_determinism_for_share_number() { + let validators_num = 6; + let (dkg1, _) = setup_dealt_dkg_with_n_validators( + validators_num, + validators_num, + validators_num, + ); + let (dkg2, _) = setup_dealt_dkg_with_n_validators( + validators_num, + validators_num, + validators_num, + ); + assert_eq!(dkg1.domain_points(), dkg2.domain_points()); + } + + /// For a different number of validators, two DKG instances should have different domain points + /// This is because the number of share determines the generator of the domain + #[test] + fn test_domain_points_different_for_different_domain_size() { + // In the first case, both DKG should have the same domain points despite different + // number of validators. This is because the domain size is the nearest power of 2 + // and both 6 and 7 are rounded to 8 + let validators_num = 6; + let (dkg1, _) = setup_dealt_dkg_with_n_validators( + validators_num, + validators_num, + validators_num, + ); + let (dkg2, _) = setup_dealt_dkg_with_n_validators( + validators_num + 1, + validators_num + 1, + validators_num + 1, + ); + assert_eq!(dkg1.domain.elements().count(), 8); + assert_eq!(dkg2.domain.elements().count(), 8); + assert_eq!( + dkg1.domain_points()[..validators_num as usize], + dkg2.domain_points()[..validators_num as usize] + ); + + // In the second case, the domain size is different and so the domain points + // should be different + let validators_num_different = 15; + let (dkg3, _) = setup_dealt_dkg_with_n_validators( + validators_num_different, + validators_num_different, + validators_num_different, + ); + assert_eq!(dkg3.domain.elements().count(), 16); + assert_ne!(dkg1.domain_points(), dkg3.domain_points()); + } } /// Test DKG parameters