Skip to content

Commit 0271d28

Browse files
committed
feat(common): add support for aggregate signature type in multi signer aggregation
1 parent 6bfd043 commit 0271d28

File tree

3 files changed

+50
-11
lines changed

3 files changed

+50
-11
lines changed

mithril-common/src/certificate_chain/certificate_verifier.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,8 @@ mod tests {
422422
use async_trait::async_trait;
423423
use tokio::sync::Mutex;
424424

425+
use mithril_stm::AggregateSignatureType;
426+
425427
use crate::test::{
426428
TestLogger,
427429
builder::{CertificateChainBuilder, CertificateChainBuilderContext, MithrilFixtureBuilder},
@@ -487,7 +489,11 @@ mod tests {
487489
let clerk = ProtocolClerk::new_clerk_from_signer(first_signer);
488490
let aggregate_verification_key = clerk.compute_aggregate_verification_key().into();
489491
let multi_signature = clerk
490-
.aggregate_signatures(&single_signatures, &message_hash)
492+
.aggregate_signatures_with_type(
493+
&single_signatures,
494+
&message_hash,
495+
AggregateSignatureType::default(),
496+
)
491497
.unwrap()
492498
.into();
493499

@@ -780,7 +786,11 @@ mod tests {
780786
let clerk =
781787
ProtocolClerk::new_clerk_from_signer(&fixture.signers_fixture()[0].protocol_signer);
782788
let modified_multi_signature = clerk
783-
.aggregate_signatures(&single_signatures, signed_message.as_bytes())
789+
.aggregate_signatures_with_type(
790+
&single_signatures,
791+
signed_message.as_bytes(),
792+
AggregateSignatureType::default(),
793+
)
784794
.unwrap();
785795
modified_certificate.signature = CertificateSignature::MultiSignature(
786796
modified_certificate.signed_entity_type(),
@@ -1080,7 +1090,11 @@ mod tests {
10801090
&fixture.signers_fixture()[0].protocol_closed_key_registration,
10811091
);
10821092
let forged_multi_signature = forged_clerk
1083-
.aggregate_signatures(&forged_single_signatures, signed_message.as_bytes())
1093+
.aggregate_signatures_with_type(
1094+
&forged_single_signatures,
1095+
signed_message.as_bytes(),
1096+
AggregateSignatureType::default(),
1097+
)
10841098
.unwrap();
10851099
forged_certificate.signature = CertificateSignature::MultiSignature(
10861100
forged_certificate.signed_entity_type(),

mithril-common/src/protocol/multi_signer.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use anyhow::{Context, anyhow};
2-
use mithril_stm::Parameters;
2+
use mithril_stm::{AggregateSignatureType, Parameters};
33

44
use crate::{
55
StdResult,
@@ -30,14 +30,19 @@ impl MultiSigner {
3030
&self,
3131
single_signatures: &[SingleSignature],
3232
message: &T,
33+
aggregate_signature_type: AggregateSignatureType,
3334
) -> Result<ProtocolMultiSignature, ProtocolAggregationError> {
3435
let protocol_signatures: Vec<_> = single_signatures
3536
.iter()
3637
.map(|single_signature| single_signature.to_protocol_signature())
3738
.collect();
3839

3940
self.protocol_clerk
40-
.aggregate_signatures(&protocol_signatures, message.to_message().as_bytes())
41+
.aggregate_signatures_with_type(
42+
&protocol_signatures,
43+
message.to_message().as_bytes(),
44+
aggregate_signature_type,
45+
)
4146
.map(|multi_sig| multi_sig.into())
4247
}
4348

@@ -117,9 +122,11 @@ mod test {
117122
let multi_signer = build_multi_signer(&fixture);
118123
let message = ProtocolMessage::default();
119124

120-
let error = multi_signer.aggregate_single_signatures(&[], &message).expect_err(
121-
"Multi-signature should not be created with an empty single signatures list",
122-
);
125+
let error = multi_signer
126+
.aggregate_single_signatures(&[], &message, AggregateSignatureType::default())
127+
.expect_err(
128+
"Multi-signature should not be created with an empty single signatures list",
129+
);
123130

124131
assert!(
125132
matches!(error, ProtocolAggregationError::NotEnoughSignatures(_, _)),
@@ -139,7 +146,7 @@ mod test {
139146
.collect();
140147

141148
multi_signer
142-
.aggregate_single_signatures(&signatures, &message)
149+
.aggregate_single_signatures(&signatures, &message, AggregateSignatureType::default())
143150
.expect("Multi-signature should be created");
144151
}
145152

@@ -160,7 +167,7 @@ mod test {
160167
signatures[4].signature = fake_keys::single_signature()[3].try_into().unwrap();
161168

162169
multi_signer
163-
.aggregate_single_signatures(&signatures, &message)
170+
.aggregate_single_signatures(&signatures, &message, AggregateSignatureType::default())
164171
.expect("Multi-signature should be created even with one invalid signature");
165172
}
166173

mithril-common/src/test/builder/certificate_chain_builder.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use std::iter::repeat_n;
44
use std::ops::{Deref, DerefMut};
55
use std::sync::Arc;
66

7+
use mithril_stm::AggregateSignatureType;
8+
79
use crate::{
810
certificate_chain::CertificateGenesisProducer,
911
crypto_helper::{
@@ -236,6 +238,7 @@ pub struct CertificateChainBuilder<'a> {
236238
genesis_certificate_processor: &'a GenesisCertificateProcessorFunc,
237239
standard_certificate_processor: &'a StandardCertificateProcessorFunc,
238240
certificate_chaining_method: CertificateChainingMethod,
241+
aggregate_signature_type: AggregateSignatureType,
239242
}
240243

241244
impl<'a> CertificateChainBuilder<'a> {
@@ -254,6 +257,7 @@ impl<'a> CertificateChainBuilder<'a> {
254257
genesis_certificate_processor: &|certificate, _, _| certificate,
255258
standard_certificate_processor: &|certificate, _| certificate,
256259
certificate_chaining_method: Default::default(),
260+
aggregate_signature_type: Default::default(),
257261
}
258262
}
259263

@@ -318,6 +322,16 @@ impl<'a> CertificateChainBuilder<'a> {
318322
self
319323
}
320324

325+
/// Set the aggregate signature type to use when building the certificate chain.
326+
pub fn with_aggregate_signature_type(
327+
mut self,
328+
aggregate_signature_type: AggregateSignatureType,
329+
) -> Self {
330+
self.aggregate_signature_type = aggregate_signature_type;
331+
332+
self
333+
}
334+
321335
/// Build the certificate chain.
322336
pub fn build(self) -> CertificateChainFixture {
323337
let (genesis_signer, genesis_verifier) = CertificateChainBuilder::setup_genesis();
@@ -509,7 +523,11 @@ impl<'a> CertificateChainBuilder<'a> {
509523
.collect::<Vec<_>>();
510524
let clerk = CertificateChainBuilder::compute_clerk_for_signers(&fixture.signers_fixture());
511525
let multi_signature = clerk
512-
.aggregate_signatures(&single_signatures, certificate.signed_message.as_bytes())
526+
.aggregate_signatures_with_type(
527+
&single_signatures,
528+
certificate.signed_message.as_bytes(),
529+
self.aggregate_signature_type,
530+
)
513531
.unwrap();
514532
certificate.signature = CertificateSignature::MultiSignature(
515533
SignedEntityType::CardanoDatabase(CardanoDbBeacon::new(

0 commit comments

Comments
 (0)