Add minimum participant constraints (#453)

* Add validation for missing identifier in signing package (#442)

* Add error handling for identifier having an invalid commitment (#442)

* Fixed comment (#442)

* Add validation for participant numbers (#443)

Add to split() and generate_secret_polynomial()

* Add participant validation for dkg and repairable (#443)
This commit is contained in:
natalie 2023-08-16 19:38:29 +01:00 committed by GitHub
parent ad07c9e4d4
commit bb94a34362
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 798 additions and 14 deletions

View File

@ -466,6 +466,8 @@ pub fn split<C: Ciphersuite, R: RngCore + CryptoRng>(
identifiers: IdentifierList<C>,
rng: &mut R,
) -> Result<(HashMap<Identifier<C>, SecretShare<C>>, PublicKeyPackage<C>), Error<C>> {
validate_num_of_signers(min_signers, max_signers)?;
let group_public = VerifyingKey::from(key);
let coefficients = generate_coefficients::<C, R>(min_signers as usize - 1, rng);
@ -665,6 +667,25 @@ where
}
}
fn validate_num_of_signers<C: Ciphersuite>(
min_signers: u16,
max_signers: u16,
) -> Result<(), Error<C>> {
if min_signers < 2 {
return Err(Error::InvalidMinSigners);
}
if max_signers < 2 {
return Err(Error::InvalidMaxSigners);
}
if min_signers > max_signers {
return Err(Error::InvalidMinSigners);
}
Ok(())
}
/// Generate a secret polynomial to use in secret sharing, for the given
/// secret value. Also validates the given parameters.
///
@ -679,17 +700,7 @@ pub(crate) fn generate_secret_polynomial<C: Ciphersuite>(
min_signers: u16,
mut coefficients: Vec<Scalar<C>>,
) -> Result<(Vec<Scalar<C>>, VerifiableSecretSharingCommitment<C>), Error<C>> {
if min_signers < 2 {
return Err(Error::InvalidMinSigners);
}
if max_signers < 2 {
return Err(Error::InvalidMaxSigners);
}
if min_signers > max_signers {
return Err(Error::InvalidMinSigners);
}
validate_num_of_signers(min_signers, max_signers)?;
if coefficients.len() != min_signers as usize - 1 {
return Err(Error::InvalidCoefficients);

View File

@ -41,8 +41,8 @@ use crate::{
use super::{
evaluate_polynomial, evaluate_vss, generate_coefficients, generate_secret_polynomial,
KeyPackage, PublicKeyPackage, SecretShare, SigningShare, VerifiableSecretSharingCommitment,
VerifyingShare,
validate_num_of_signers, KeyPackage, PublicKeyPackage, SecretShare, SigningShare,
VerifiableSecretSharingCommitment, VerifyingShare,
};
/// DKG Round 1 structures.
@ -237,6 +237,8 @@ pub fn part1<C: Ciphersuite, R: RngCore + CryptoRng>(
min_signers: u16,
mut rng: R,
) -> Result<(round1::SecretPackage<C>, round1::Package<C>), Error<C>> {
validate_num_of_signers::<C>(min_signers, max_signers)?;
let secret: SigningKey<C> = SigningKey::new(&mut rng);
// Round 1, Step 1

View File

@ -26,6 +26,10 @@ pub fn repair_share_step_1<C: Ciphersuite, R: RngCore + CryptoRng>(
rng: &mut R,
participant: Identifier<C>,
) -> Result<HashMap<Identifier<C>, Scalar<C>>, Error<C>> {
if helpers.len() < 2 {
return Err(Error::InvalidMinSigners);
}
if helpers.is_empty() {
return Err(Error::IncorrectNumberOfIdentifiers);
}

View File

@ -59,6 +59,30 @@ pub fn check_share_generation<C: Ciphersuite, R: RngCore + CryptoRng>(mut rng: R
);
}
/// Test share generation with a Ciphersuite
pub fn check_share_generation_fails_with_invalid_signers<C: Ciphersuite, R: RngCore + CryptoRng>(
min_signers: u16,
max_signers: u16,
error: Error<C>,
mut rng: R,
) {
let secret = crate::SigningKey::<C>::new(&mut rng);
// Use arbitrary number of coefficients so tests don't fail for overflow reasons
let coefficients = frost::keys::generate_coefficients::<C, _>(3, &mut rng);
let secret_shares = frost::keys::generate_secret_shares(
&secret,
max_signers,
min_signers,
coefficients,
&frost::keys::default_identifiers(max_signers),
);
assert!(secret_shares.is_err());
assert!(secret_shares == Err(error))
}
/// Test FROST signing with trusted dealer with a Ciphersuite.
pub fn check_sign_with_dealer<C: Ciphersuite, R: RngCore + CryptoRng>(
mut rng: R,
@ -89,6 +113,42 @@ pub fn check_sign_with_dealer<C: Ciphersuite, R: RngCore + CryptoRng>(
check_sign(min_signers, key_packages, rng, pubkeys)
}
/// Test FROST signing with trusted dealer fails with invalid numbers of signers.
pub fn check_sign_with_dealer_fails_with_invalid_signers<C: Ciphersuite, R: RngCore + CryptoRng>(
min_signers: u16,
max_signers: u16,
error: Error<C>,
mut rng: R,
) {
let out = frost::keys::generate_with_dealer(
max_signers,
min_signers,
frost::keys::IdentifierList::Default::<C>,
&mut rng,
);
assert!(out.is_err());
assert!(out == Err(error))
}
/// Test DKG part1 fails with invalid numbers of signers.
pub fn check_dkg_part1_fails_with_invalid_signers<C: Ciphersuite, R: RngCore + CryptoRng>(
min_signers: u16,
max_signers: u16,
error: Error<C>,
mut rng: R,
) {
let out = frost::keys::dkg::part1(
Identifier::try_from(1).unwrap(),
max_signers,
min_signers,
&mut rng,
);
assert!(out.is_err());
assert!(out == Err(error))
}
/// Test FROST signing with the given shares.
pub fn check_sign<C: Ciphersuite + PartialEq, R: RngCore + CryptoRng>(
min_signers: u16,

View File

@ -15,7 +15,7 @@ use crate::{
},
Identifier,
},
Ciphersuite, Field, Group, Scalar,
Ciphersuite, Error, Field, Group, Scalar,
};
/// We want to test that recover share matches the original share
@ -210,3 +210,35 @@ pub fn check_repair_share_step_3<C: Ciphersuite, R: RngCore + CryptoRng>(
assert!(actual.value == expected.value);
}
/// Test repair share step 1 fails with invalid numbers of signers.
pub fn check_repair_share_step_1_fails_with_invalid_min_signers<
C: Ciphersuite,
R: RngCore + CryptoRng,
>(
mut rng: R,
) {
// Generate shares
let max_signers = 3;
let min_signers = 2; // This is to make sure this test fails at the right point
let (shares, _pubkeys): (HashMap<Identifier<C>, SecretShare<C>>, PublicKeyPackage<C>) =
frost::keys::generate_with_dealer(
max_signers,
min_signers,
frost::keys::IdentifierList::Default,
&mut rng,
)
.unwrap();
let helper = Identifier::try_from(3).unwrap();
let out = repair_share_step_1(
&[helper],
&shares[&helper],
&mut rng,
Identifier::try_from(2).unwrap(),
);
assert!(out.is_err());
assert!(out == Err(Error::InvalidMinSigners))
}

View File

@ -89,4 +89,13 @@ mod tests {
&REPAIR_SHARE,
);
}
#[test]
fn check_repair_share_step_1_fails_with_invalid_min_signers() {
let rng = thread_rng();
frost_core::tests::repairable::check_repair_share_step_1_fails_with_invalid_min_signers::<
Ed25519Sha512,
_,
>(rng);
}
}

View File

@ -10,6 +10,48 @@ fn check_sign_with_dkg() {
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ed25519Sha512, _>(rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ed25519Sha512> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_rts() {
let rng = thread_rng();
@ -24,6 +66,48 @@ fn check_sign_with_dealer() {
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ed25519Sha512, _>(rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ed25519Sha512> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
/// This is testing that Shamir's secret sharing to compute and arbitrary
/// value is working.
#[test]
@ -32,6 +116,48 @@ fn check_share_generation_ed25519_sha512() {
frost_core::tests::ciphersuite_generic::check_share_generation::<Ed25519Sha512, _>(rng);
}
#[test]
fn check_share_generation_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 0;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ed25519Sha512> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 0;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ed25519Sha512,
_,
>(min_signers, max_signers, error, rng);
}
lazy_static! {
pub static ref VECTORS: Value =
serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim())

View File

@ -89,4 +89,13 @@ mod tests {
&REPAIR_SHARE,
);
}
#[test]
fn check_repair_share_step_1_fails_with_invalid_min_signers() {
let rng = thread_rng();
frost_core::tests::repairable::check_repair_share_step_1_fails_with_invalid_min_signers::<
Ed448Shake256,
_,
>(rng);
}
}

View File

@ -10,6 +10,48 @@ fn check_sign_with_dkg() {
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ed448Shake256, _>(rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ed448Shake256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_rts() {
let rng = thread_rng();
@ -24,6 +66,48 @@ fn check_sign_with_dealer() {
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ed448Shake256, _>(rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ed448Shake256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
/// This is testing that Shamir's secret sharing to compute and arbitrary
/// value is working.
#[test]
@ -32,6 +116,48 @@ fn check_share_generation_ed448_shake256() {
frost_core::tests::ciphersuite_generic::check_share_generation::<Ed448Shake256, _>(rng);
}
#[test]
fn check_share_generation_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 0;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ed448Shake256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 0;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ed448Shake256,
_,
>(min_signers, max_signers, error, rng);
}
lazy_static! {
pub static ref VECTORS: Value =
serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim())

View File

@ -89,4 +89,13 @@ mod tests {
&REPAIR_SHARE,
);
}
#[test]
fn check_repair_share_step_1_fails_with_invalid_min_signers() {
let rng = thread_rng();
frost_core::tests::repairable::check_repair_share_step_1_fails_with_invalid_min_signers::<
P256Sha256,
_,
>(rng);
}
}

View File

@ -10,6 +10,48 @@ fn check_sign_with_dkg() {
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<P256Sha256, _>(rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<P256Sha256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_rts() {
let rng = thread_rng();
@ -24,6 +66,48 @@ fn check_sign_with_dealer() {
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<P256Sha256, _>(rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<P256Sha256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
/// This is testing that Shamir's secret sharing to compute and arbitrary
/// value is working.
#[test]
@ -32,6 +116,48 @@ fn check_share_generation_p256_sha256() {
frost_core::tests::ciphersuite_generic::check_share_generation::<P256Sha256, _>(rng);
}
#[test]
fn check_share_generation_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 0;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<P256Sha256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 0;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
P256Sha256,
_,
>(min_signers, max_signers, error, rng);
}
lazy_static! {
pub static ref VECTORS: Value =
serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim())

View File

@ -91,4 +91,13 @@ mod tests {
&REPAIR_SHARE,
);
}
#[test]
fn check_repair_share_step_1_fails_with_invalid_min_signers() {
let rng = thread_rng();
frost_core::tests::repairable::check_repair_share_step_1_fails_with_invalid_min_signers::<
Ristretto255Sha512,
_,
>(rng);
}
}

View File

@ -10,6 +10,48 @@ fn check_sign_with_dkg() {
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ristretto255Sha512, _>(rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ristretto255Sha512> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_rts() {
let rng = thread_rng();
@ -24,6 +66,48 @@ fn check_sign_with_dealer() {
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ristretto255Sha512, _>(rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ristretto255Sha512> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
/// This is testing that Shamir's secret sharing to compute and arbitrary
/// value is working.
#[test]
@ -32,6 +116,48 @@ fn check_share_generation_ristretto255_sha512() {
frost_core::tests::ciphersuite_generic::check_share_generation::<Ristretto255Sha512, _>(rng);
}
#[test]
fn check_share_generation_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 0;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Ristretto255Sha512> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 0;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Ristretto255Sha512,
_,
>(min_signers, max_signers, error, rng);
}
lazy_static! {
pub static ref VECTORS: Value =
serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim())

View File

@ -89,4 +89,13 @@ mod tests {
&REPAIR_SHARE,
);
}
#[test]
fn check_repair_share_step_1_fails_with_invalid_min_signers() {
let rng = thread_rng();
frost_core::tests::repairable::check_repair_share_step_1_fails_with_invalid_min_signers::<
Secp256K1Sha256,
_,
>(rng);
}
}

View File

@ -10,6 +10,48 @@ fn check_sign_with_dkg() {
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Secp256K1Sha256, _>(rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Secp256K1Sha256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_dkg_part1_fails_with_invalid_signers_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_rts() {
let rng = thread_rng();
@ -24,6 +66,48 @@ fn check_sign_with_dealer() {
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Secp256K1Sha256, _>(rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 1;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Secp256K1Sha256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_sign_with_dealer_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 1;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
/// This is testing that Shamir's secret sharing to compute and arbitrary
/// value is working.
#[test]
@ -32,6 +116,48 @@ fn check_share_generation_secp256k1_sha256() {
frost_core::tests::ciphersuite_generic::check_share_generation::<Secp256K1Sha256, _>(rng);
}
#[test]
fn check_share_generation_fails_with_invalid_min_signers() {
let rng = thread_rng();
let min_signers = 0;
let max_signers = 3;
let error = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_min_signers_greater_than_max() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 2;
let error: frost_core::Error<Secp256K1Sha256> = Error::InvalidMinSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
#[test]
fn check_share_generation_fails_with_invalid_max_signers() {
let rng = thread_rng();
let min_signers = 3;
let max_signers = 0;
let error = Error::InvalidMaxSigners;
frost_core::tests::ciphersuite_generic::check_share_generation_fails_with_invalid_signers::<
Secp256K1Sha256,
_,
>(min_signers, max_signers, error, rng);
}
lazy_static! {
pub static ref VECTORS: Value =
serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim())