Skip to content

Commit 1521218

Browse files
committed
refactor(common): enhance implementation of 'KesSignerStandard'
Removed the use of 'kes_sk.get_period()' which is not needed as the KES secret key is loaded from file upon signature and thus has not been evolved yet. This means that 'kes_sk.get_period()' is always 0.
1 parent a899bcb commit 1521218

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ pub enum KesVerifyError {
1515
}
1616

1717
/// KES signature error
18-
#[derive(Error, Debug)]
18+
#[derive(Error, Debug, PartialEq, Eq)]
1919
pub enum KesSignError {
2020
/// Error raised when a KES update error occurs
2121
#[error("KES key cannot be updated for evolution {0}")]
2222
UpdateKey(KesPeriod),
2323

2424
/// Period of key file does not match with period provided by user
25-
#[error("Period of key file, {0}, does not match with period provided by user, {1}")]
25+
#[error("Period of key file {0} does not match with period provided by user {1}")]
2626
PeriodMismatch(KesPeriod, KesPeriod),
2727
}

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

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,16 @@ impl KesSigner for KesSignerStandard {
4343
let operational_certificate = OpCert::from_file(&self.operational_certificate_path)
4444
.with_context(|| "StandardKesSigner can not read operational certificate from file")?;
4545
let kes_period_start = operational_certificate.get_start_kes_period() as u32;
46-
let kes_sk_period = kes_sk.get_period();
47-
let kes_evolutions = current_kes_period.saturating_sub(kes_period_start);
48-
if kes_sk_period > kes_evolutions {
46+
if kes_period_start > current_kes_period {
4947
return Err(anyhow!(KesSignError::PeriodMismatch(
50-
kes_sk_period,
51-
kes_evolutions
48+
kes_period_start,
49+
current_kes_period
5250
)));
5351
}
52+
let kes_evolutions = current_kes_period.saturating_sub(kes_period_start);
5453

5554
// We need to perform the evolutions
56-
for evolution in kes_sk_period..kes_evolutions {
55+
for evolution in 0..kes_evolutions {
5756
kes_sk.update().map_err(|_| KesSignError::UpdateKey(evolution))?;
5857
}
5958

@@ -74,7 +73,7 @@ mod tests {
7473
#[test]
7574
fn create_valid_signature_for_message() {
7675
let start_kes_period = 10 as KesPeriod;
77-
let kes_evolutions = 1;
76+
let kes_evolutions = 32;
7877
let signing_kes_period = start_kes_period + kes_evolutions;
7978
let KesCryptographicMaterialForTest {
8079
party_id: _,
@@ -100,7 +99,7 @@ mod tests {
10099
#[test]
101100
fn create_invalid_signature_for_different_message() {
102101
let start_kes_period = 10 as KesPeriod;
103-
let kes_evolutions = 1;
102+
let kes_evolutions = 32;
104103
let signing_kes_period = start_kes_period + kes_evolutions;
105104
let KesCryptographicMaterialForTest {
106105
party_id: _,
@@ -124,7 +123,35 @@ mod tests {
124123
}
125124

126125
#[test]
127-
fn create_invalid_signature_for_invalid_kes_evolution() {
126+
fn create_invalid_signature_for_invalid_current_kes_period() {
127+
let start_kes_period = 10 as KesPeriod;
128+
let signing_kes_period = 5;
129+
let KesCryptographicMaterialForTest {
130+
party_id: _,
131+
operational_certificate_file,
132+
kes_secret_key_file,
133+
} = create_kes_cryptographic_material(
134+
1 as KesPartyIndexForTest,
135+
start_kes_period,
136+
current_function!(),
137+
);
138+
let message = b"Test message for KES signing";
139+
let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
140+
141+
let res = kes_signer
142+
.sign(message, signing_kes_period)
143+
.expect_err("Signing should fail");
144+
assert_eq!(
145+
res.downcast_ref::<KesSignError>(),
146+
Some(&KesSignError::PeriodMismatch(
147+
start_kes_period,
148+
signing_kes_period
149+
))
150+
);
151+
}
152+
153+
#[test]
154+
fn create_invalid_signature_for_invalid_kes_evolutions() {
128155
const MAX_KES_EVOLUTIONS: KesPeriod = 63;
129156
let start_kes_period = 10 as KesPeriod;
130157
let signing_kes_period = start_kes_period + MAX_KES_EVOLUTIONS + 1;
@@ -140,8 +167,12 @@ mod tests {
140167
let message = b"Test message for KES signing";
141168
let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
142169

143-
kes_signer
170+
let res = kes_signer
144171
.sign(message, signing_kes_period)
145172
.expect_err("Signing should fail");
173+
assert_eq!(
174+
res.downcast_ref::<KesSignError>(),
175+
Some(&KesSignError::UpdateKey(MAX_KES_EVOLUTIONS))
176+
);
146177
}
147178
}

0 commit comments

Comments
 (0)