From e1b511e78884255b7b64e816270f6fe44daa4fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Thu, 8 Dec 2022 14:06:24 +0200 Subject: [PATCH] Feature/verify bte proof (#1866) * Update lock file * Include bte public key verification --- Cargo.lock | 2 +- validator-api/src/coconut/dkg/complaints.rs | 1 + validator-api/src/coconut/dkg/dealing.rs | 48 +++++++++++++++++++++ validator-api/src/coconut/dkg/state.rs | 4 ++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index f00cc44be4..9d687961cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6537,7 +6537,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vesting-contract" -version = "1.1.0" +version = "1.1.2" dependencies = [ "contracts-common", "cosmwasm-std", diff --git a/validator-api/src/coconut/dkg/complaints.rs b/validator-api/src/coconut/dkg/complaints.rs index e62d9feac3..0001e4f76d 100644 --- a/validator-api/src/coconut/dkg/complaints.rs +++ b/validator-api/src/coconut/dkg/complaints.rs @@ -4,6 +4,7 @@ #[derive(Debug, Eq, PartialEq)] pub(crate) enum ComplaintReason { MalformedBTEPublicKey, + InvalidBTEPublicKey, MissingDealing, MalformedDealing, DealingVerificationError, diff --git a/validator-api/src/coconut/dkg/dealing.rs b/validator-api/src/coconut/dkg/dealing.rs index f3b1e97a42..b6ebed9853 100644 --- a/validator-api/src/coconut/dkg/dealing.rs +++ b/validator-api/src/coconut/dkg/dealing.rs @@ -54,6 +54,7 @@ pub(crate) async fn dealing_exchange( #[cfg(test)] pub(crate) mod tests { use super::*; + use crate::coconut::dkg::complaints::ComplaintReason; use crate::coconut::tests::DummyClient; use crate::coconut::KeyPair; use coconut_dkg_common::dealer::DealerDetails; @@ -148,4 +149,51 @@ pub(crate) mod tests { .clone(); assert_eq!(dealings, new_dealings); } + + #[tokio::test] + #[ignore] // expensive test + async fn invalid_bte_proof_dealing_posted() { + let self_index = 2; + let dealer_details_db = Arc::new(RwLock::new(HashMap::new())); + let dealings_db = Arc::new(RwLock::new(HashMap::new())); + let dkg_client = DkgClient::new( + DummyClient::new(AccountId::from_str(TEST_VALIDATORS_ADDRESS[0]).unwrap()) + .with_dealer_details(&dealer_details_db) + .with_dealings(&dealings_db), + ); + let params = setup(); + let mut state = State::new( + Url::parse("localhost:8000").unwrap(), + DkgKeyPair::new(¶ms, OsRng), + KeyPair::new(), + ); + state.set_node_index(Some(self_index)); + insert_dealers(¶ms, &dealer_details_db); + + dealer_details_db + .write() + .unwrap() + .entry(TEST_VALIDATORS_ADDRESS[1].to_string()) + .and_modify(|details| { + let mut bytes = bs58::decode(details.bte_public_key_with_proof.clone()) + .into_vec() + .unwrap(); + let last_byte = bytes.last_mut().unwrap(); + *last_byte += 1; + details.bte_public_key_with_proof = bs58::encode(&bytes).into_string(); + }); + + dealing_exchange(&dkg_client, &mut state, OsRng) + .await + .unwrap(); + assert_eq!( + *state + .all_dealers() + .get(&Addr::unchecked(TEST_VALIDATORS_ADDRESS[1])) + .unwrap() + .as_ref() + .unwrap_err(), + ComplaintReason::InvalidBTEPublicKey + ); + } } diff --git a/validator-api/src/coconut/dkg/state.rs b/validator-api/src/coconut/dkg/state.rs index b0b550304a..aebcdea495 100644 --- a/validator-api/src/coconut/dkg/state.rs +++ b/validator-api/src/coconut/dkg/state.rs @@ -30,6 +30,10 @@ impl TryFrom for DkgParticipant { .map_err(|_| ComplaintReason::MalformedBTEPublicKey)? .map_err(|_| ComplaintReason::MalformedBTEPublicKey)?; + if !bte_public_key_with_proof.verify() { + return Err(ComplaintReason::InvalidBTEPublicKey); + } + Ok(DkgParticipant { _address: dealer.address, bte_public_key_with_proof,