From 82327a42ee843723597ee4da222ebb65d7b96020 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 22 Nov 2022 21:40:57 +0100 Subject: [PATCH] Fix KES period verification Restrict KES period range verification to '[max(0,kes_period-1), min(64,kes_period+1)]'. --- .../cardano/key_certification.rs | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/mithril-common/src/crypto_helper/cardano/key_certification.rs b/mithril-common/src/crypto_helper/cardano/key_certification.rs index 4a2a3f73ac0..39011210df6 100644 --- a/mithril-common/src/crypto_helper/cardano/key_certification.rs +++ b/mithril-common/src/crypto_helper/cardano/key_certification.rs @@ -48,8 +48,8 @@ pub enum ProtocolRegistrationErrorWrapper { OpCertInvalid, /// Error raised when a KES Signature verification fails - #[error("KES signature verification error")] - KesSignatureInvalid, + #[error("KES signature verification error: CurrentKesPeriod={0}, StartKesPeriod={1}")] + KesSignatureInvalid(usize, u64), /// Error raised when a KES Signature is needed but not provided #[error("missing KES signature")] @@ -221,18 +221,17 @@ impl KeyRegWrapper { opcert .validate() .map_err(|_| ProtocolRegistrationErrorWrapper::OpCertInvalid)?; - // TODO: List of eligible indices to be defined by CurrentKesPeriod and StartKesPeriod let mut pool_id = None; let sig = kes_sig.ok_or(ProtocolRegistrationErrorWrapper::KesSignatureMissing)?; - for kes_period_try in 0..64 { + let kes_period = + kes_period.ok_or(ProtocolRegistrationErrorWrapper::KesPeriodMissing)?; + let kes_period_try_min = std::cmp::max(0, kes_period - 1) as usize; + let kes_period_try_max = std::cmp::min(64, kes_period + 1) as usize; + for kes_period_try in kes_period_try_min..kes_period_try_max { if sig .verify(kes_period_try, &opcert.kes_vk, &pk.to_bytes()) .is_ok() { - println!( - "WARNING: KES Signature verified for TryKesPeriod={}, CurrentKesPeriod={:?}, and StartKesPeriod={}", - kes_period_try, kes_period, &opcert.start_kes_period - ); pool_id = Some( opcert .compute_protocol_party_id() @@ -241,7 +240,10 @@ impl KeyRegWrapper { break; } } - pool_id.ok_or(ProtocolRegistrationErrorWrapper::KesSignatureInvalid)? + pool_id.ok_or(ProtocolRegistrationErrorWrapper::KesSignatureInvalid( + kes_period, + opcert.start_kes_period, + ))? } else { println!("WARNING: Signer certification is skipped! {:?}", party_id); party_id.ok_or(ProtocolRegistrationErrorWrapper::PartyIdMissing)?