Skip to content

Commit 29367d1

Browse files
Alenarjpraynaudghubertpalo
committed
Use MithrilFixtureBuilder in common tests
+ Remove tests_setup::setup_signers, it has been now completly superseded by the MithrilFixtureBuilder. Co-authored-by: Jean-Philippe Raynaud <[email protected]> Co-authored-by: Grégoire HUBERT <[email protected]>
1 parent 59b2026 commit 29367d1

File tree

4 files changed

+84
-139
lines changed

4 files changed

+84
-139
lines changed

mithril-common/src/certificate_chain/certificate_verifier.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ mod tests {
288288

289289
use crate::crypto_helper::tests_setup::*;
290290
use crate::crypto_helper::{key_encode_hex, ProtocolClerk};
291+
use crate::test_utils::MithrilFixtureBuilder;
291292

292293
mock! {
293294
pub CertificateRetrieverImpl { }
@@ -305,43 +306,42 @@ mod tests {
305306
#[test]
306307
fn test_verify_multi_signature_ok() {
307308
let protocol_parameters = setup_protocol_parameters();
308-
let signers = setup_signers(5, &protocol_parameters);
309-
let message = setup_message();
310-
311-
let mut single_signatures = Vec::new();
312-
signers.iter().for_each(|(_, protocol_signer, _)| {
313-
if let Some(signature) = protocol_signer.sign(message.compute_hash().as_bytes()) {
314-
single_signatures.push(signature);
315-
}
316-
});
317-
318-
let first_signer = &signers.first().unwrap().1;
309+
let fixture = MithrilFixtureBuilder::default()
310+
.with_signers(5)
311+
.with_protocol_parameters(protocol_parameters.into())
312+
.build();
313+
let signers = fixture.signers_fixture();
314+
let message_hash = setup_message().compute_hash().as_bytes().to_vec();
315+
316+
let single_signatures = signers
317+
.iter()
318+
.filter_map(|s| s.protocol_signer.sign(&message_hash))
319+
.collect::<Vec<_>>();
320+
321+
let first_signer = &signers[0].protocol_signer;
319322
let clerk = ProtocolClerk::from_signer(first_signer);
320323
let aggregate_verification_key = clerk.compute_avk();
321-
let multi_signature = clerk
322-
.aggregate(&single_signatures, message.compute_hash().as_bytes())
323-
.unwrap();
324+
let multi_signature = clerk.aggregate(&single_signatures, &message_hash).unwrap();
324325

325326
let verifier = MithrilCertificateVerifier::new(slog_scope::logger());
326-
let protocol_parameters = protocol_parameters.into();
327-
let message_tampered = message.compute_hash().as_bytes()[1..].to_vec();
327+
let message_tampered = message_hash[1..].to_vec();
328328
assert!(
329329
verifier
330330
.verify_multi_signature(
331331
&message_tampered,
332332
&key_encode_hex(&multi_signature).unwrap(),
333333
&key_encode_hex(&aggregate_verification_key).unwrap(),
334-
&protocol_parameters,
334+
&fixture.protocol_parameters(),
335335
)
336336
.is_err(),
337337
"multi signature verification should have failed"
338338
);
339339
verifier
340340
.verify_multi_signature(
341-
message.compute_hash().as_bytes(),
341+
&message_hash,
342342
&key_encode_hex(&multi_signature).unwrap(),
343343
&key_encode_hex(&aggregate_verification_key).unwrap(),
344-
&protocol_parameters,
344+
&fixture.protocol_parameters(),
345345
)
346346
.expect("multi signature verification should have succeeded");
347347
}

mithril-common/src/crypto_helper/tests_setup.rs

Lines changed: 56 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
//! Test data builders for Mithril STM types, for testing purpose.
2-
use super::cardano::ColdKeyGenerator;
32
use super::{genesis::*, key_encode_hex, types::*, OpCert, SerDeShelleyFileFormat};
4-
use crate::certificate_chain::CertificateGenesisProducer;
53
use crate::{
4+
certificate_chain::CertificateGenesisProducer,
65
entities::{Certificate, Epoch, ProtocolMessage, ProtocolMessagePartKey, SignerWithStake},
76
fake_data,
7+
test_utils::{MithrilFixtureBuilder, SignerFixture},
88
};
99

10-
use kes_summed_ed25519::kes::Sum6Kes;
11-
use kes_summed_ed25519::traits::KesSk;
1210
use rand_chacha::ChaCha20Rng;
13-
use rand_core::{RngCore, SeedableRng};
11+
use rand_core::SeedableRng;
1412
use std::{cmp::min, fs, sync::Arc};
1513

1614
use std::{collections::HashMap, path::PathBuf};
@@ -52,60 +50,11 @@ pub fn setup_protocol_parameters() -> ProtocolParameters {
5250
}
5351
}
5452

55-
/// Instantiate a list of protocol signers, use this for tests only.
56-
pub fn setup_signers(
57-
total: u64,
58-
protocol_parameters: &ProtocolParameters,
59-
) -> Vec<(SignerWithStake, ProtocolSigner, ProtocolInitializer)> {
60-
let mut stake_rng = ChaCha20Rng::from_seed([0u8; 32]);
61-
let mut kes_keys_seed = [0u8; 32];
62-
63-
let stake_distribution = (0..total)
64-
.into_iter()
65-
.map(|party_idx| {
66-
let party_id = if party_idx % 2 == 0
67-
|| cfg!(not(feature = "allow_skip_signer_certification"))
68-
{
69-
// 50% of signers with key certification if allow unverified signer registration
70-
// Or 100% of signers otherwise
71-
let keypair = ColdKeyGenerator::create_deterministic_keypair([party_idx as u8; 32]);
72-
let (kes_secret_key, kes_verification_key) = Sum6Kes::keygen(&mut kes_keys_seed);
73-
let operational_certificate = OpCert::new(kes_verification_key, 0, 0, keypair);
74-
let party_id = operational_certificate
75-
.compute_protocol_party_id()
76-
.expect("compute protocol party id should not fail");
77-
let temp_dir = setup_temp_directory_for_signer(&party_id, true)
78-
.expect("setup temp directory should return a value");
79-
if !temp_dir.join("kes.sk").exists() {
80-
kes_secret_key
81-
.to_file(temp_dir.join("kes.sk"))
82-
.expect("KES secret key file export should not fail");
83-
}
84-
if !temp_dir.join("opcert.cert").exists() {
85-
operational_certificate
86-
.to_file(temp_dir.join("opcert.cert"))
87-
.expect("operational certificate file export should not fail");
88-
}
89-
party_id
90-
} else {
91-
// 50% of signers without key certification (legacy) if allow unverified signer registration
92-
// Or 0% of signers otherwise
93-
// TODO: Should be removed once the signer certification is fully deployed
94-
format!("{:<032}", party_idx)
95-
};
96-
97-
let stake = 1 + stake_rng.next_u64() % 999;
98-
(party_id, stake)
99-
})
100-
.collect::<Vec<_>>();
101-
setup_signers_from_stake_distribution(&stake_distribution, protocol_parameters)
102-
}
103-
10453
/// Instantiate a list of protocol signers based on the given [ProtocolStakeDistribution] and [ProtocolParameters], use this for tests only.
10554
pub fn setup_signers_from_stake_distribution(
10655
stake_distribution: &ProtocolStakeDistribution,
10756
protocol_parameters: &ProtocolParameters,
108-
) -> Vec<(SignerWithStake, ProtocolSigner, ProtocolInitializer)> {
57+
) -> Vec<SignerFixture> {
10958
let signers = stake_distribution
11059
.iter()
11160
.map(|(party_id, stake)| {
@@ -163,34 +112,37 @@ pub fn setup_signers_from_stake_distribution(
163112
.expect("operational certificate decoding should not fail")
164113
});
165114
let kes_period = 0;
166-
(
167-
SignerWithStake::new(
168-
party_id,
169-
key_encode_hex(protocol_initializer.verification_key())
170-
.expect("key_encode_hex of verification_key should not fail"),
171-
protocol_initializer
172-
.verification_key_signature()
173-
.as_ref()
174-
.map(|verification_key_signature| {
175-
key_encode_hex(verification_key_signature).expect(
176-
"key_encode_hex of verification_key_signature should not fail",
177-
)
178-
}),
179-
operational_certificate
180-
.as_ref()
181-
.map(|operational_certificate| {
182-
key_encode_hex(operational_certificate)
183-
.expect("key_encode_hex of operational_certificate should not fail")
184-
}),
185-
operational_certificate.as_ref().map(|_| kes_period),
186-
stake,
187-
),
115+
116+
let signer_with_stake = SignerWithStake::new(
117+
party_id,
118+
key_encode_hex(protocol_initializer.verification_key())
119+
.expect("key_encode_hex of verification_key should not fail"),
188120
protocol_initializer
189-
.clone()
190-
.new_signer(closed_key_registration.clone())
191-
.expect("creating a new protocol signer should not fail"),
121+
.verification_key_signature()
122+
.as_ref()
123+
.map(|verification_key_signature| {
124+
key_encode_hex(verification_key_signature)
125+
.expect("key_encode_hex of verification_key_signature should not fail")
126+
}),
127+
operational_certificate
128+
.as_ref()
129+
.map(|operational_certificate| {
130+
key_encode_hex(operational_certificate)
131+
.expect("key_encode_hex of operational_certificate should not fail")
132+
}),
133+
operational_certificate.as_ref().map(|_| kes_period),
134+
stake,
135+
);
136+
let protocol_signer = protocol_initializer
137+
.clone()
138+
.new_signer(closed_key_registration.clone())
139+
.expect("creating a new protocol signer should not fail");
140+
141+
SignerFixture {
142+
signer_with_stake,
143+
protocol_signer,
192144
protocol_initializer,
193-
)
145+
}
194146
})
195147
.collect::<_>()
196148
}
@@ -219,21 +171,24 @@ pub fn setup_certificate_chain(
219171
_ => Epoch(i / certificates_per_epoch + 1),
220172
})
221173
.collect::<Vec<_>>();
222-
let signers_by_epoch = epochs
174+
let fixture_per_epoch = epochs
223175
.clone()
224176
.into_iter()
225177
.map(|epoch| {
226178
(
227179
epoch,
228-
setup_signers(min(2 + epoch.0, 5), &protocol_parameters),
180+
MithrilFixtureBuilder::default()
181+
.with_protocol_parameters(protocol_parameters.into())
182+
.with_signers(min(2 + epoch.0 as usize, 5))
183+
.build(),
229184
)
230185
})
231186
.collect::<HashMap<_, _>>();
232-
let clerk_for_signers = |signers: &[(_, ProtocolSigner, _)]| -> ProtocolClerk {
233-
let first_signer = &signers.first().unwrap().1;
187+
let clerk_for_signers = |signers: &[SignerFixture]| -> ProtocolClerk {
188+
let first_signer = &signers[0].protocol_signer;
234189
ProtocolClerk::from_signer(first_signer)
235190
};
236-
let avk_for_signers = |signers: &[(_, ProtocolSigner, _)]| -> ProtocolAggregateVerificationKey {
191+
let avk_for_signers = |signers: &[SignerFixture]| -> ProtocolAggregateVerificationKey {
237192
let clerk = clerk_for_signers(signers);
238193
clerk.compute_avk()
239194
};
@@ -247,10 +202,10 @@ pub fn setup_certificate_chain(
247202
let immutable_file_number = i as u64 * 10;
248203
let digest = format!("digest{}", i);
249204
let certificate_hash = format!("certificate_hash-{}", i);
250-
let signers = signers_by_epoch.get(&epoch).unwrap();
251-
let next_signers = signers_by_epoch.get(&(epoch + 1)).unwrap();
252-
let avk = avk_for_signers(signers);
253-
let next_avk = avk_for_signers(next_signers);
205+
let fixture = fixture_per_epoch.get(&epoch).unwrap();
206+
let next_fixture = fixture_per_epoch.get(&(epoch + 1)).unwrap();
207+
let avk = avk_for_signers(&fixture.signers_fixture());
208+
let next_avk = avk_for_signers(&next_fixture.signers_fixture());
254209
let mut fake_certificate = fake_data::certificate(certificate_hash);
255210
fake_certificate.beacon.epoch = epoch;
256211
fake_certificate.beacon.immutable_file_number = immutable_file_number;
@@ -281,17 +236,17 @@ pub fn setup_certificate_chain(
281236
.unwrap()
282237
}
283238
_ => {
284-
fake_certificate.metadata.signers =
285-
signers.iter().map(|s| s.0.to_owned()).collect();
286-
let mut single_signatures = Vec::new();
287-
signers.iter().for_each(|(_, protocol_signer, _)| {
288-
if let Some(signature) =
289-
protocol_signer.sign(fake_certificate.signed_message.as_bytes())
290-
{
291-
single_signatures.push(signature);
292-
}
293-
});
294-
let clerk = clerk_for_signers(signers);
239+
fake_certificate.metadata.signers = fixture.signers_with_stake();
240+
241+
let single_signatures = fixture
242+
.signers_fixture()
243+
.iter()
244+
.filter_map(|s| {
245+
s.protocol_signer
246+
.sign(fake_certificate.signed_message.as_bytes())
247+
})
248+
.collect::<Vec<_>>();
249+
let clerk = clerk_for_signers(&fixture.signers_fixture());
295250
let multi_signature = clerk
296251
.aggregate(
297252
&single_signatures,

mithril-common/src/entities/single_signatures.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,23 @@ impl SingleSignatures {
4646
#[cfg(test)]
4747
mod tests {
4848
use super::*;
49-
use crate::crypto_helper::key_encode_hex;
50-
use crate::crypto_helper::tests_setup::{
51-
setup_message, setup_protocol_parameters, setup_signers,
49+
use crate::{
50+
crypto_helper::{key_encode_hex, tests_setup::setup_message},
51+
test_utils::MithrilFixtureBuilder,
5252
};
5353

5454
#[test]
5555
fn single_signatures_should_convert_to_protocol_signatures() {
5656
let message = setup_message();
57-
let signers = setup_signers(1, &setup_protocol_parameters());
58-
let (signer_with_stake, protocol_signer, _) = signers.first().unwrap();
59-
let protocol_sigs = protocol_signer
57+
let fixture = MithrilFixtureBuilder::default().with_signers(1).build();
58+
let signer = &fixture.signers_fixture()[0];
59+
let protocol_sigs = signer
60+
.protocol_signer
6061
.sign(message.compute_hash().as_bytes())
6162
.unwrap();
6263

6364
let signature = SingleSignatures::new(
64-
signer_with_stake.party_id.to_owned(),
65+
signer.signer_with_stake.party_id.to_owned(),
6566
key_encode_hex(&protocol_sigs).unwrap(),
6667
protocol_sigs.indexes.clone(),
6768
);

mithril-common/src/test_utils/fixture_builder.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ use crate::{
1212
test_utils::mithril_fixture::MithrilFixture,
1313
};
1414

15-
use super::mithril_fixture::SignerFixture;
16-
1715
/// A builder of mithril types.
1816
pub struct MithrilFixtureBuilder {
1917
protocol_parameters: ProtocolParameters,
@@ -81,16 +79,7 @@ impl MithrilFixtureBuilder {
8179
let signers = tests_setup::setup_signers_from_stake_distribution(
8280
&protocol_stake_distribution,
8381
&self.protocol_parameters.clone().into(),
84-
)
85-
.into_iter()
86-
.map(
87-
|(signer_with_stake, protocol_signer, protocol_initializer)| SignerFixture {
88-
signer_with_stake,
89-
protocol_signer,
90-
protocol_initializer,
91-
},
92-
)
93-
.collect();
82+
);
9483

9584
MithrilFixture::new(
9685
self.protocol_parameters,

0 commit comments

Comments
 (0)