Skip to content

Commit 2d6e9eb

Browse files
committed
Make aggregator register_signatures route check signature authenticity
1 parent f51ac9a commit 2d6e9eb

File tree

3 files changed

+116
-2
lines changed

3 files changed

+116
-2
lines changed

mithril-aggregator/src/http_server/routes/middlewares.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::event_store::{EventMessage, TransmitterService};
1212
use crate::services::{CertifierService, MessageService, ProverService, SignedEntityService};
1313
use crate::{
1414
CertificatePendingStore, Configuration, DependencyContainer, SignerRegisterer,
15-
VerificationKeyStorer,
15+
SingleSignatureAuthenticator, VerificationKeyStorer,
1616
};
1717

1818
/// With certificate pending store
@@ -113,6 +113,13 @@ pub fn with_prover_service(
113113
warp::any().map(move || dependency_manager.prover_service.clone())
114114
}
115115

116+
/// With Single Signature Authenticator
117+
pub fn with_single_signature_authenticator(
118+
dependency_manager: Arc<DependencyContainer>,
119+
) -> impl Filter<Extract = (Arc<SingleSignatureAuthenticator>,), Error = Infallible> + Clone {
120+
warp::any().map(move || dependency_manager.single_signer_authenticator.clone())
121+
}
122+
116123
pub mod validators {
117124
use crate::http_server::validators::ProverTransactionsHashValidator;
118125

mithril-aggregator/src/http_server/routes/signatures_routes.rs

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ fn register_signatures(
1919
.and(middlewares::with_certifier_service(
2020
dependency_manager.clone(),
2121
))
22+
.and(middlewares::with_single_signature_authenticator(
23+
dependency_manager,
24+
))
2225
.and_then(handlers::register_signatures)
2326
}
2427

@@ -34,19 +37,22 @@ mod handlers {
3437
http_server::routes::reply,
3538
message_adapters::FromRegisterSingleSignatureAdapter,
3639
services::{CertifierService, CertifierServiceError, RegistrationStatus},
40+
unwrap_to_internal_server_error, SingleSignatureAuthenticator,
3741
};
3842

3943
/// Register Signatures
4044
pub async fn register_signatures(
4145
message: RegisterSignatureMessage,
4246
certifier_service: Arc<dyn CertifierService>,
47+
single_signer_authenticator: Arc<SingleSignatureAuthenticator>,
4348
) -> Result<impl warp::Reply, Infallible> {
4449
debug!("⇄ HTTP SERVER: register_signatures/{:?}", message);
4550
trace!("⇄ HTTP SERVER: register_signatures"; "complete_message" => #?message );
4651

4752
let signed_entity_type = message.signed_entity_type.clone();
53+
let signed_message = message.signed_message.clone();
4854

49-
let signatures = match FromRegisterSingleSignatureAdapter::try_adapt(message) {
55+
let mut signatures = match FromRegisterSingleSignatureAdapter::try_adapt(message) {
5056
Ok(signature) => signature,
5157
Err(err) => {
5258
warn!("register_signatures::payload decoding error"; "error" => ?err);
@@ -58,6 +64,15 @@ mod handlers {
5864
}
5965
};
6066

67+
if let Some(signed_message) = signed_message {
68+
unwrap_to_internal_server_error!(
69+
single_signer_authenticator
70+
.authenticate(&mut signatures, &signed_message)
71+
.await,
72+
"single_signer_authenticator::error"
73+
);
74+
}
75+
6176
match certifier_service
6277
.register_single_signature(&signed_entity_type, &signatures)
6378
.await
@@ -97,6 +112,7 @@ mod tests {
97112
http_server::SERVER_BASE_PATH,
98113
initialize_dependencies,
99114
services::{CertifierServiceError, MockCertifierService, RegistrationStatus},
115+
SingleSignatureAuthenticator,
100116
};
101117

102118
use super::*;
@@ -114,6 +130,64 @@ mod tests {
114130
.and(routes(dependency_manager).with(cors))
115131
}
116132

133+
#[tokio::test]
134+
async fn test_register_signatures_try_to_authenticate_signature_with_signed_message() {
135+
let mut mock_certifier_service = MockCertifierService::new();
136+
mock_certifier_service
137+
.expect_register_single_signature()
138+
.withf(|_, signature| signature.is_authenticated())
139+
.once()
140+
.return_once(move |_, _| Ok(RegistrationStatus::Registered));
141+
let mut dependency_manager = initialize_dependencies().await;
142+
dependency_manager.certifier_service = Arc::new(mock_certifier_service);
143+
dependency_manager.single_signer_authenticator =
144+
Arc::new(SingleSignatureAuthenticator::new_that_authenticate_everything());
145+
146+
let message = RegisterSignatureMessage {
147+
signed_message: Some("message".to_string()),
148+
..RegisterSignatureMessage::dummy()
149+
};
150+
151+
let method = Method::POST.as_str();
152+
let path = "/register-signatures";
153+
154+
request()
155+
.method(method)
156+
.path(&format!("/{SERVER_BASE_PATH}{path}"))
157+
.json(&message)
158+
.reply(&setup_router(Arc::new(dependency_manager)))
159+
.await;
160+
}
161+
162+
#[tokio::test]
163+
async fn test_register_signatures_send_unauthenticated_signature_if_authentication_fail() {
164+
let mut mock_certifier_service = MockCertifierService::new();
165+
mock_certifier_service
166+
.expect_register_single_signature()
167+
.withf(|_, signature| !signature.is_authenticated())
168+
.once()
169+
.return_once(move |_, _| Ok(RegistrationStatus::Registered));
170+
let mut dependency_manager = initialize_dependencies().await;
171+
dependency_manager.certifier_service = Arc::new(mock_certifier_service);
172+
dependency_manager.single_signer_authenticator =
173+
Arc::new(SingleSignatureAuthenticator::new_that_reject_everything());
174+
175+
let message = RegisterSignatureMessage {
176+
signed_message: Some("message".to_string()),
177+
..RegisterSignatureMessage::dummy()
178+
};
179+
180+
let method = Method::POST.as_str();
181+
let path = "/register-signatures";
182+
183+
request()
184+
.method(method)
185+
.path(&format!("/{SERVER_BASE_PATH}{path}"))
186+
.json(&message)
187+
.reply(&setup_router(Arc::new(dependency_manager)))
188+
.await;
189+
}
190+
117191
#[tokio::test]
118192
async fn test_register_signatures_post_ok_201() {
119193
let mut mock_certifier_service = MockCertifierService::new();

mithril-aggregator/src/tools/single_signature_authenticator.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,39 @@ impl SingleSignatureAuthenticator {
7676
}
7777
}
7878

79+
#[cfg(test)]
80+
impl SingleSignatureAuthenticator {
81+
pub(crate) fn new_that_authenticate_everything() -> Self {
82+
let mut multi_signer = crate::multi_signer::MockMultiSigner::new();
83+
multi_signer
84+
.expect_verify_single_signature()
85+
.returning(|_, _| Ok(()));
86+
multi_signer
87+
.expect_verify_single_signature_for_next_epoch()
88+
.returning(|_, _| Ok(()));
89+
90+
Self {
91+
multi_signer: Arc::new(multi_signer),
92+
logger: crate::test_tools::TestLogger::stdout(),
93+
}
94+
}
95+
96+
pub(crate) fn new_that_reject_everything() -> Self {
97+
let mut multi_signer = crate::multi_signer::MockMultiSigner::new();
98+
multi_signer
99+
.expect_verify_single_signature()
100+
.returning(|_, _| Err(anyhow::anyhow!("error")));
101+
multi_signer
102+
.expect_verify_single_signature_for_next_epoch()
103+
.returning(|_, _| Err(anyhow::anyhow!("error")));
104+
105+
Self {
106+
multi_signer: Arc::new(multi_signer),
107+
logger: crate::test_tools::TestLogger::stdout(),
108+
}
109+
}
110+
}
111+
79112
#[cfg(test)]
80113
mod tests {
81114
use anyhow::anyhow;

0 commit comments

Comments
 (0)