Skip to content

Commit 11f43eb

Browse files
committed
test coverage for taproot crate
Co-authored by @zebra-lucky and @mimoo This work sponsored by dlcbtc.com and lightspark.com
1 parent f926438 commit 11f43eb

File tree

56 files changed

+2180
-95
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+2180
-95
lines changed

frost-core/src/tests/ciphersuite_generic.rs

+25-15
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ use crate as frost;
77
use crate::round2::SignatureShare;
88
use crate::{
99
keys::PublicKeyPackage, Error, Field, Group, Identifier, Signature, SigningKey, SigningPackage,
10-
VerifyingKey,
10+
SigningTarget, VerifyingKey,
1111
};
12-
use alloc::borrow::ToOwned;
1312
use alloc::vec::Vec;
1413
use rand_core::{CryptoRng, RngCore};
1514

@@ -103,7 +102,8 @@ pub fn check_share_generation_fails_with_invalid_signers<C: Ciphersuite, R: RngC
103102
/// Test FROST signing with trusted dealer with a Ciphersuite.
104103
pub fn check_sign_with_dealer<C: Ciphersuite, R: RngCore + CryptoRng>(
105104
mut rng: R,
106-
) -> (Vec<u8>, Signature<C>, VerifyingKey<C>) {
105+
signing_target: SigningTarget<C>,
106+
) -> (SigningTarget<C>, Signature<C>, VerifyingKey<C>) {
107107
////////////////////////////////////////////////////////////////////////////
108108
// Key generation
109109
////////////////////////////////////////////////////////////////////////////
@@ -147,10 +147,11 @@ pub fn check_sign_with_dealer<C: Ciphersuite, R: RngCore + CryptoRng>(
147147
.collect(),
148148
&mut rng,
149149
pubkeys.clone(),
150+
signing_target.clone(),
150151
);
151152
assert_eq!(r, Err(Error::InvalidSignature));
152153

153-
check_sign(min_signers, key_packages, rng, pubkeys).unwrap()
154+
check_sign(min_signers, key_packages, rng, pubkeys, signing_target).unwrap()
154155
}
155156

156157
/// Test FROST signing with trusted dealer fails with invalid numbers of signers.
@@ -195,7 +196,8 @@ pub fn check_sign<C: Ciphersuite + PartialEq, R: RngCore + CryptoRng>(
195196
key_packages: BTreeMap<frost::Identifier<C>, frost::keys::KeyPackage<C>>,
196197
mut rng: R,
197198
pubkey_package: PublicKeyPackage<C>,
198-
) -> Result<(Vec<u8>, Signature<C>, VerifyingKey<C>), Error<C>> {
199+
signing_target: SigningTarget<C>,
200+
) -> Result<(SigningTarget<C>, Signature<C>, VerifyingKey<C>), Error<C>> {
199201
let mut nonces_map: BTreeMap<frost::Identifier<C>, frost::round1::SigningNonces<C>> =
200202
BTreeMap::new();
201203
let mut commitments_map: BTreeMap<frost::Identifier<C>, frost::round1::SigningCommitments<C>> =
@@ -223,8 +225,7 @@ pub fn check_sign<C: Ciphersuite + PartialEq, R: RngCore + CryptoRng>(
223225
// - decide what message to sign
224226
// - take one (unused) commitment per signing participant
225227
let mut signature_shares = BTreeMap::new();
226-
let message = "message to sign".as_bytes();
227-
let signing_package = SigningPackage::new(commitments_map, message);
228+
let signing_package = frost::SigningPackage::new(commitments_map, signing_target.clone());
228229

229230
////////////////////////////////////////////////////////////////////////////
230231
// Round 2: each participant generates their signature share
@@ -266,11 +267,18 @@ pub fn check_sign<C: Ciphersuite + PartialEq, R: RngCore + CryptoRng>(
266267
// Aggregate (also verifies the signature shares)
267268
let group_signature = frost::aggregate(&signing_package, &signature_shares, &pubkey_package)?;
268269

270+
// Check that the effective verifying key can be verified against the raw message,
271+
// without exposing the SigningParameters.
272+
pubkey_package
273+
.verifying_key
274+
.effective_key(signing_target.sig_params())
275+
.verify(signing_target.message(), &group_signature)?;
276+
269277
// Check that the threshold signature can be verified by the group public
270278
// key (the verification key).
271279
pubkey_package
272280
.verifying_key
273-
.verify(message, &group_signature)?;
281+
.verify(signing_target.clone(), &group_signature)?;
274282

275283
// Check that the threshold signature can be verified by the group public
276284
// key (the verification key) from KeyPackage.verifying_key
@@ -279,11 +287,11 @@ pub fn check_sign<C: Ciphersuite + PartialEq, R: RngCore + CryptoRng>(
279287

280288
key_package
281289
.verifying_key
282-
.verify(message, &group_signature)?;
290+
.verify(signing_target.clone(), &group_signature)?;
283291
}
284292

285293
Ok((
286-
message.to_owned(),
294+
signing_target,
287295
group_signature,
288296
pubkey_package.verifying_key,
289297
))
@@ -303,7 +311,7 @@ fn check_sign_errors<C: Ciphersuite + PartialEq>(
303311
.find(|&&id| id != key_package.identifier)
304312
.unwrap();
305313
commitments.remove(&id);
306-
let signing_package = frost::SigningPackage::new(commitments, signing_package.message());
314+
let signing_package = frost::SigningPackage::new(commitments, signing_package.sig_target);
307315

308316
let r = frost::round2::sign(&signing_package, &signing_nonces, &key_package);
309317
assert_eq!(r, Err(Error::IncorrectNumberOfCommitments));
@@ -376,7 +384,8 @@ fn check_aggregate_invalid_share_identifier_for_verifying_shares<C: Ciphersuite
376384
/// Test FROST signing with DKG with a Ciphersuite.
377385
pub fn check_sign_with_dkg<C: Ciphersuite + PartialEq, R: RngCore + CryptoRng>(
378386
mut rng: R,
379-
) -> (Vec<u8>, Signature<C>, VerifyingKey<C>)
387+
signing_target: SigningTarget<C>,
388+
) -> (SigningTarget<C>, Signature<C>, VerifyingKey<C>)
380389
where
381390
C::Group: core::cmp::PartialEq,
382391
{
@@ -533,7 +542,7 @@ where
533542
let pubkeys = frost::keys::PublicKeyPackage::new(verifying_keys, verifying_key.unwrap());
534543

535544
// Proceed with the signing test.
536-
check_sign(min_signers, key_packages, rng, pubkeys).unwrap()
545+
check_sign(min_signers, key_packages, rng, pubkeys, signing_target).unwrap()
537546
}
538547

539548
/// Check that calling dkg::part3() with distinct sets of participants fail.
@@ -577,7 +586,8 @@ fn check_part3_different_participants<C: Ciphersuite>(
577586
/// Identifiers.
578587
pub fn check_sign_with_dealer_and_identifiers<C: Ciphersuite, R: RngCore + CryptoRng>(
579588
mut rng: R,
580-
) -> (Vec<u8>, Signature<C>, VerifyingKey<C>) {
589+
signing_target: SigningTarget<C>,
590+
) -> (SigningTarget<C>, Signature<C>, VerifyingKey<C>) {
581591
// Check error cases first
582592
// Check repeated identifiers
583593

@@ -643,7 +653,7 @@ pub fn check_sign_with_dealer_and_identifiers<C: Ciphersuite, R: RngCore + Crypt
643653
let key_package = frost::keys::KeyPackage::try_from(v).unwrap();
644654
key_packages.insert(k, key_package);
645655
}
646-
check_sign(min_signers, key_packages, rng, pubkeys).unwrap()
656+
check_sign(min_signers, key_packages, rng, pubkeys, signing_target).unwrap()
647657
}
648658

649659
fn check_part2_error<C: Ciphersuite>(

frost-core/src/tests/refresh.rs

+11-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::keys::refresh::{compute_refreshing_shares, refresh_share};
99
use crate::{self as frost};
1010
use crate::{
1111
keys::{KeyPackage, PublicKeyPackage, SecretShare},
12-
Ciphersuite, Error, Identifier,
12+
Ciphersuite, Error, Identifier, SigningTarget,
1313
};
1414

1515
use super::ciphersuite_generic::check_sign;
@@ -81,7 +81,16 @@ pub fn check_refresh_shares_with_dealer<C: Ciphersuite, R: RngCore + CryptoRng>(
8181
for (k, v) in new_shares {
8282
key_packages.insert(k, v.unwrap());
8383
}
84-
check_sign(MIN_SIGNERS, key_packages, rng, new_pub_key_package).unwrap();
84+
85+
let signing_target = SigningTarget::from_message(b"hello world");
86+
check_sign(
87+
MIN_SIGNERS,
88+
key_packages,
89+
rng,
90+
new_pub_key_package,
91+
signing_target,
92+
)
93+
.unwrap();
8594
}
8695

8796
/// We want to check that shares are refreshed with valid signers
+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"identifier": "2a00000000000000000000000000000000000000000000000000000000000000",
3+
"proof_of_knowledge": "5866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a",
34
"element1": "5866666666666666666666666666666666666666666666666666666666666666",
45
"element2": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022",
56
"scalar1": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a"
6-
}
7+
}

frost-ed25519/tests/helpers/samples.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,12 @@ pub fn public_key_package() -> PublicKeyPackage {
109109

110110
/// Generate a sample round1::Package.
111111
pub fn round1_package() -> round1::Package {
112-
let serialized_scalar = <<C as Ciphersuite>::Group as Group>::Field::serialize(&scalar1());
112+
let serialized_signature = Signature::new(element1(), scalar1()).serialize().unwrap();
113+
let signature = Signature::deserialize(&serialized_signature).unwrap();
114+
113115
let serialized_element = <C as Ciphersuite>::Group::serialize(&element1()).unwrap();
114-
let serialized_signature = serialized_element
115-
.as_ref()
116-
.iter()
117-
.chain(serialized_scalar.as_ref().iter())
118-
.cloned()
119-
.collect::<Vec<u8>>();
120116
let vss_commitment =
121117
VerifiableSecretSharingCommitment::deserialize(vec![serialized_element]).unwrap();
122-
let signature = Signature::deserialize(&serialized_signature).unwrap();
123118

124119
round1::Package::new(vss_commitment, signature)
125120
}

frost-ed25519/tests/integration_tests.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ fn check_zero_key_fails() {
1212
fn check_sign_with_dkg() {
1313
let rng = thread_rng();
1414

15-
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ed25519Sha512, _>(rng);
15+
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ed25519Sha512, _>(
16+
rng,
17+
b"message".into(),
18+
);
1619
}
1720

1821
#[test]
@@ -184,7 +187,10 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() {
184187
fn check_sign_with_dealer() {
185188
let rng = thread_rng();
186189

187-
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ed25519Sha512, _>(rng);
190+
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ed25519Sha512, _>(
191+
rng,
192+
b"message".into(),
193+
);
188194
}
189195

190196
#[test]
@@ -336,7 +342,7 @@ fn check_sign_with_dealer_and_identifiers() {
336342
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::<
337343
Ed25519Sha512,
338344
_,
339-
>(rng);
345+
>(rng, b"message".into());
340346
}
341347

342348
#[test]

frost-ed25519/tests/interoperability_tests.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ fn check_interoperability_in_sign_with_dkg() {
1212
// and the interoperability check. A smaller number of iterations is used
1313
// because DKG takes longer and otherwise the test would be too slow.
1414
for _ in 0..32 {
15-
let (msg, group_signature, group_pubkey) =
15+
let (target, group_signature, group_pubkey) =
1616
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ed25519Sha512, _>(
1717
rng.clone(),
18+
b"message".into(),
1819
);
1920

20-
helpers::verify_signature(&msg, group_signature, group_pubkey);
21+
helpers::verify_signature(target.message(), group_signature, group_pubkey);
2122
}
2223
}
2324

@@ -28,13 +29,14 @@ fn check_interoperability_in_sign_with_dealer() {
2829
// Test with multiple keys/signatures to better exercise the key generation
2930
// and the interoperability check.
3031
for _ in 0..256 {
31-
let (msg, group_signature, group_pubkey) =
32+
let (target, group_signature, group_pubkey) =
3233
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ed25519Sha512, _>(
3334
rng.clone(),
35+
b"message".into(),
3436
);
3537

3638
// Check that the threshold signature can be verified by the `ed25519_dalek` crate
3739
// public key (interoperability test)
38-
helpers::verify_signature(&msg, group_signature, group_pubkey);
40+
helpers::verify_signature(target.message(), group_signature, group_pubkey);
3941
}
4042
}

frost-ed25519/tests/recreation_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ fn check_signing_package_recreation() {
4141
let signing_package = samples::signing_package();
4242

4343
let commitments = signing_package.signing_commitments();
44-
let message = signing_package.message();
44+
let sig_target = signing_package.sig_target();
4545

46-
let new_signing_package = SigningPackage::new(commitments.clone(), message);
46+
let new_signing_package = SigningPackage::new(commitments.clone(), sig_target.clone());
4747
assert!(signing_package == new_signing_package);
4848
}
4949

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
3+
"proof_of_knowledge": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00",
34
"element1": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900",
45
"element2": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80",
56
"scalar1": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00"
6-
}
7+
}

frost-ed448/tests/helpers/samples.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,12 @@ pub fn public_key_package() -> PublicKeyPackage {
109109

110110
/// Generate a sample round1::Package.
111111
pub fn round1_package() -> round1::Package {
112-
let serialized_scalar = <<C as Ciphersuite>::Group as Group>::Field::serialize(&scalar1());
112+
let serialized_signature = Signature::new(element1(), scalar1()).serialize().unwrap();
113+
let signature = Signature::deserialize(&serialized_signature).unwrap();
114+
113115
let serialized_element = <C as Ciphersuite>::Group::serialize(&element1()).unwrap();
114-
let serialized_signature = serialized_element
115-
.as_ref()
116-
.iter()
117-
.chain(serialized_scalar.as_ref().iter())
118-
.cloned()
119-
.collect::<Vec<u8>>();
120116
let vss_commitment =
121117
VerifiableSecretSharingCommitment::deserialize(vec![serialized_element]).unwrap();
122-
let signature = Signature::deserialize(&serialized_signature).unwrap();
123118

124119
round1::Package::new(vss_commitment, signature)
125120
}

frost-ed448/tests/integration_tests.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ fn check_zero_key_fails() {
1212
fn check_sign_with_dkg() {
1313
let rng = thread_rng();
1414

15-
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ed448Shake256, _>(rng);
15+
frost_core::tests::ciphersuite_generic::check_sign_with_dkg::<Ed448Shake256, _>(
16+
rng,
17+
b"message".into(),
18+
);
1619
}
1720

1821
#[test]
@@ -184,7 +187,10 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() {
184187
fn check_sign_with_dealer() {
185188
let rng = thread_rng();
186189

187-
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ed448Shake256, _>(rng);
190+
frost_core::tests::ciphersuite_generic::check_sign_with_dealer::<Ed448Shake256, _>(
191+
rng,
192+
b"message".into(),
193+
);
188194
}
189195

190196
#[test]
@@ -336,7 +342,7 @@ fn check_sign_with_dealer_and_identifiers() {
336342
frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::<
337343
Ed448Shake256,
338344
_,
339-
>(rng);
345+
>(rng, b"message".into());
340346
}
341347

342348
#[test]

frost-ed448/tests/recreation_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ fn check_signing_package_recreation() {
4141
let signing_package = samples::signing_package();
4242

4343
let commitments = signing_package.signing_commitments();
44-
let message = signing_package.message();
44+
let sig_target = signing_package.sig_target();
4545

46-
let new_signing_package = SigningPackage::new(commitments.clone(), message);
46+
let new_signing_package = SigningPackage::new(commitments.clone(), sig_target.clone());
4747
assert!(signing_package == new_signing_package);
4848
}
4949

frost-p256/tests/helpers/samples.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"identifier": "000000000000000000000000000000000000000000000000000000000000002a",
3+
"proof_of_knowledge": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1",
34
"element1": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
45
"element2": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978",
56
"scalar1": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1"
6-
}
7+
}

frost-p256/tests/helpers/samples.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,12 @@ pub fn public_key_package() -> PublicKeyPackage {
109109

110110
/// Generate a sample round1::Package.
111111
pub fn round1_package() -> round1::Package {
112-
let serialized_scalar = <<C as Ciphersuite>::Group as Group>::Field::serialize(&scalar1());
112+
let serialized_signature = Signature::new(element1(), scalar1()).serialize().unwrap();
113+
let signature = Signature::deserialize(&serialized_signature).unwrap();
114+
113115
let serialized_element = <C as Ciphersuite>::Group::serialize(&element1()).unwrap();
114-
let serialized_signature = serialized_element
115-
.as_ref()
116-
.iter()
117-
.chain(serialized_scalar.as_ref().iter())
118-
.cloned()
119-
.collect::<Vec<u8>>();
120116
let vss_commitment =
121117
VerifiableSecretSharingCommitment::deserialize(vec![serialized_element]).unwrap();
122-
let signature = Signature::deserialize(&serialized_signature).unwrap();
123118

124119
round1::Package::new(vss_commitment, signature)
125120
}

0 commit comments

Comments
 (0)