Skip to content

Commit a899bcb

Browse files
committed
refactor(common): use number of KES evolutions to KES verify
1 parent 211e788 commit a899bcb

File tree

5 files changed

+56
-51
lines changed

5 files changed

+56
-51
lines changed

mithril-common/src/crypto_helper/cardano/kes/interface.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ pub trait KesSigner: Send + Sync {
2424
#[cfg_attr(test, mockall::automock)]
2525
pub trait KesVerifier: Send + Sync + Debug {
2626
/// Verify the signed message and return the original message.
27+
///
28+
/// kes_evolutions: The KES evolutions used to verify the signature (computed from the current KES period at the time of signing minus the start KES period in the operational certificate)
2729
fn verify(
2830
&self,
2931
message: &[u8],
3032
signature: &Sum6KesSig,
3133
operational_certificate: &OpCert,
32-
kes_period: KesPeriod,
34+
kes_evolutions: KesPeriod,
3335
) -> StdResult<()>;
3436
}

mithril-common/src/crypto_helper/cardano/kes/signer_with_key.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -66,82 +66,82 @@ mod tests {
6666
use super::*;
6767

6868
use crate::crypto_helper::cardano::kes::{KesVerifier, KesVerifierStandard};
69+
use crate::current_function;
6970
use crate::test::crypto_helper::{
7071
KesCryptographicMaterialForTest, KesPartyIndexForTest, create_kes_cryptographic_material,
7172
};
7273

7374
#[test]
7475
fn create_valid_signature_for_message() {
76+
let start_kes_period = 10 as KesPeriod;
77+
let kes_evolutions = 1;
78+
let signing_kes_period = start_kes_period + kes_evolutions;
7579
let KesCryptographicMaterialForTest {
7680
party_id: _,
7781
operational_certificate_file,
7882
kes_secret_key_file,
7983
} = create_kes_cryptographic_material(
8084
1 as KesPartyIndexForTest,
81-
0 as KesPeriod,
82-
"create_valid_signature_for_message",
85+
start_kes_period,
86+
current_function!(),
8387
);
8488
let message = b"Test message for KES signing";
8589
let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
86-
let kes_signing_period = 1;
8790

8891
let (signature, op_cert) = kes_signer
89-
.sign(message, kes_signing_period)
92+
.sign(message, signing_kes_period)
9093
.expect("Signing should not fail");
9194

9295
KesVerifierStandard
93-
.verify(message, &signature, &op_cert, kes_signing_period)
96+
.verify(message, &signature, &op_cert, kes_evolutions)
9497
.expect("Signature verification should not fail");
9598
}
9699

97100
#[test]
98101
fn create_invalid_signature_for_different_message() {
102+
let start_kes_period = 10 as KesPeriod;
103+
let kes_evolutions = 1;
104+
let signing_kes_period = start_kes_period + kes_evolutions;
99105
let KesCryptographicMaterialForTest {
100106
party_id: _,
101107
operational_certificate_file,
102108
kes_secret_key_file,
103109
} = create_kes_cryptographic_material(
104110
1 as KesPartyIndexForTest,
105-
0 as KesPeriod,
106-
"create_invalid_signature_for_different_message",
111+
start_kes_period,
112+
current_function!(),
107113
);
108114
let message = b"Test message for KES signing";
109115
let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
110-
let kes_signing_period = 1;
111116

112117
let (signature, op_cert) = kes_signer
113-
.sign(message, kes_signing_period)
118+
.sign(message, signing_kes_period)
114119
.expect("Signing should not fail");
115120

116121
KesVerifierStandard
117-
.verify(
118-
b"Different message",
119-
&signature,
120-
&op_cert,
121-
kes_signing_period,
122-
)
122+
.verify(b"Different message", &signature, &op_cert, kes_evolutions)
123123
.expect_err("Signature verification should fail");
124124
}
125125

126126
#[test]
127127
fn create_invalid_signature_for_invalid_kes_evolution() {
128128
const MAX_KES_EVOLUTIONS: KesPeriod = 63;
129-
let kes_period_start = 5 as KesPeriod;
129+
let start_kes_period = 10 as KesPeriod;
130+
let signing_kes_period = start_kes_period + MAX_KES_EVOLUTIONS + 1;
130131
let KesCryptographicMaterialForTest {
131132
party_id: _,
132133
operational_certificate_file,
133134
kes_secret_key_file,
134135
} = create_kes_cryptographic_material(
135136
1 as KesPartyIndexForTest,
136-
kes_period_start,
137-
"create_invalid_signature_for_invalid_kes_period",
137+
start_kes_period,
138+
current_function!(),
138139
);
139140
let message = b"Test message for KES signing";
140141
let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
141-
let kes_signing_period = kes_period_start + MAX_KES_EVOLUTIONS + 1;
142142

143143
kes_signer
144-
.sign(message, kes_signing_period)
144+
.sign(message, signing_kes_period)
145145
.expect_err("Signing should fail");
146146
}
147147
}

mithril-common/src/crypto_helper/cardano/kes/verifier_standard.rs

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ impl KesVerifier for KesVerifierStandard {
1919
message: &[u8],
2020
signature: &Sum6KesSig,
2121
operational_certificate: &OpCert,
22-
kes_period: KesPeriod,
22+
kes_evolutions: KesPeriod,
2323
) -> StdResult<()> {
2424
operational_certificate
2525
.validate()
2626
.map_err(|_| KesVerifyError::OpCertInvalid)?;
2727

28-
// Check if the KES period in the operational certificate matches the provided KES period +/- 1
29-
let kes_period_try_min = std::cmp::max(0, kes_period.saturating_sub(1));
30-
let kes_period_try_max = std::cmp::min(64, kes_period.saturating_add(1));
31-
for kes_period_try in kes_period_try_min..kes_period_try_max {
28+
// Check if the signature verifies for the provided KES evolutions value +/- 1
29+
let kes_evolutions_try_min = std::cmp::max(0, kes_evolutions.saturating_sub(1));
30+
let kes_evolutions_try_max = std::cmp::min(64, kes_evolutions.saturating_add(1));
31+
for kes_evolutions_try in kes_evolutions_try_min..kes_evolutions_try_max {
3232
if signature
3333
.verify(
34-
kes_period_try,
34+
kes_evolutions_try,
3535
&operational_certificate.get_kes_verification_key(),
3636
message,
3737
)
@@ -42,7 +42,7 @@ impl KesVerifier for KesVerifierStandard {
4242
}
4343

4444
Err(KesVerifyError::SignatureInvalid(
45-
kes_period,
45+
kes_evolutions,
4646
operational_certificate.get_start_kes_period() as u32,
4747
)
4848
.into())
@@ -52,6 +52,7 @@ impl KesVerifier for KesVerifierStandard {
5252
#[cfg(test)]
5353
mod tests {
5454
use crate::crypto_helper::cardano::kes::{KesSigner, KesSignerStandard};
55+
use crate::current_function;
5556
use crate::test::crypto_helper::{
5657
KesCryptographicMaterialForTest, KesPartyIndexForTest, create_kes_cryptographic_material,
5758
};
@@ -60,52 +61,52 @@ mod tests {
6061

6162
#[test]
6263
fn verify_valid_signature_succeeds() {
64+
let start_kes_period = 10 as KesPeriod;
65+
let kes_evolutions = 1;
66+
let signing_kes_period = start_kes_period + kes_evolutions;
6367
let KesCryptographicMaterialForTest {
6468
party_id: _,
6569
operational_certificate_file,
6670
kes_secret_key_file,
6771
} = create_kes_cryptographic_material(
6872
1 as KesPartyIndexForTest,
69-
0 as KesPeriod,
70-
"verify_valid_signature_succeeds",
73+
start_kes_period,
74+
current_function!(),
7175
);
7276
let message = b"Test message for KES signing";
7377
let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
74-
let kes_signing_period = 1;
78+
7579
let (signature, op_cert) = kes_signer
76-
.sign(message, kes_signing_period)
80+
.sign(message, signing_kes_period)
7781
.expect("Signing should not fail");
7882

7983
KesVerifierStandard
80-
.verify(message, &signature, &op_cert, kes_signing_period)
84+
.verify(message, &signature, &op_cert, kes_evolutions)
8185
.expect("Signature verification should not fail");
8286
}
8387

8488
#[test]
8589
fn verify_invalid_signature_fails() {
90+
let start_kes_period = 10 as KesPeriod;
91+
let kes_evolutions = 1;
92+
let signing_kes_period = start_kes_period + kes_evolutions;
8693
let KesCryptographicMaterialForTest {
8794
party_id: _,
8895
operational_certificate_file,
8996
kes_secret_key_file,
9097
} = create_kes_cryptographic_material(
9198
1 as KesPartyIndexForTest,
92-
0 as KesPeriod,
93-
"verify_invalid_signature_fails",
99+
start_kes_period,
100+
current_function!(),
94101
);
95102
let message = b"Test message for KES signing";
96103
let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
97-
let kes_signing_period = 1;
98104
let (signature, op_cert) = kes_signer
99-
.sign(message, kes_signing_period)
105+
.sign(message, signing_kes_period)
100106
.expect("Signing should not fail");
101107

102108
KesVerifierStandard
103-
.verify(
104-
b"Different message",
105-
&signature,
106-
&op_cert,
107-
kes_signing_period,
108-
)
109+
.verify(b"Different message", &signature, &op_cert, kes_evolutions)
109110
.expect_err("Signature verification should fail");
110111
}
111112
}

mithril-common/src/crypto_helper/cardano/key_certification.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,21 +239,23 @@ impl KeyRegWrapper {
239239
/// Register a new party. For a successful registration, the registrar needs to
240240
/// provide the OpCert (in cbor form), the cold VK, a KES signature, and a
241241
/// Mithril key (with its corresponding Proof of Possession).
242+
///
243+
/// kes_evolutions: The number of evolutions since the start KES period of the operational certificate.
242244
pub fn register(
243245
&mut self,
244246
party_id: Option<ProtocolPartyId>, // Used for only for testing when SPO pool id is not certified
245247
opcert: Option<ProtocolOpCert>, // Used for only for testing when SPO pool id is not certified
246248
kes_sig: Option<ProtocolSignerVerificationKeySignature>, // Used for only for testing when SPO pool id is not certified
247-
kes_period: Option<KesPeriod>,
249+
kes_evolutions: Option<KesPeriod>,
248250
pk: ProtocolSignerVerificationKey,
249251
) -> StdResult<ProtocolPartyId> {
250252
let pool_id_bech32: ProtocolPartyId = if let Some(opcert) = opcert {
251253
let signature = kes_sig.ok_or(ProtocolRegistrationErrorWrapper::KesSignatureMissing)?;
252-
let kes_period =
253-
kes_period.ok_or(ProtocolRegistrationErrorWrapper::KesPeriodMissing)?;
254+
let kes_evolutions =
255+
kes_evolutions.ok_or(ProtocolRegistrationErrorWrapper::KesPeriodMissing)?;
254256
if self
255257
.kes_verifier
256-
.verify(&pk.to_bytes(), &signature, &opcert, kes_period)
258+
.verify(&pk.to_bytes(), &signature, &opcert, kes_evolutions)
257259
.is_ok()
258260
{
259261
opcert
@@ -262,7 +264,7 @@ impl KeyRegWrapper {
262264
} else {
263265
return Err(anyhow!(
264266
ProtocolRegistrationErrorWrapper::KesSignatureInvalid(
265-
kes_period,
267+
kes_evolutions,
266268
opcert.get_start_kes_period(),
267269
)
268270
));

mithril-common/src/test/crypto_helper/setup.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ pub fn setup_signers_from_stake_distribution(
127127
)> = vec![];
128128

129129
for (party_id, stake) in stake_distribution {
130-
let kes_period = 0;
130+
let kes_evolutions = 0;
131131
let temp_dir = setup_temp_directory_for_signer(party_id, false);
132132
let kes_secret_key_path: Option<PathBuf> = temp_dir.as_ref().map(|dir| dir.join("kes.sk"));
133133
let operational_certificate_path = temp_dir.as_ref().map(|dir| dir.join("opcert.cert"));
@@ -144,15 +144,15 @@ pub fn setup_signers_from_stake_distribution(
144144
*stake,
145145
&protocol_initializer,
146146
operational_certificate.clone(),
147-
kes_period,
147+
kes_evolutions,
148148
);
149149

150150
key_registration
151151
.register(
152152
Some(signer_with_stake.party_id.to_owned()),
153153
operational_certificate,
154154
protocol_initializer.verification_key_signature(),
155-
Some(kes_period),
155+
Some(kes_evolutions),
156156
protocol_initializer.verification_key().into(),
157157
)
158158
.expect("key registration should have succeeded");

0 commit comments

Comments
 (0)