Skip to content

Commit 7e2d358

Browse files
authored
Merge pull request #783 from input-output-hk/update_kes
Update KES dependency to version 0.2.0. This forces the lib user to allocate its own buffer. We need to create a wrapper structure to allow writing to disk (currently used in Mithril).
2 parents b864146 + 528fcd7 commit 7e2d358

File tree

14 files changed

+83
-29
lines changed

14 files changed

+83
-29
lines changed

Cargo.lock

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.2.30"
3+
version = "0.2.31"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-client/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-client"
3-
version = "0.2.10"
3+
version = "0.2.11"
44
description = "A Mithril Client"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-common/CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Changelog
2+
All notable changes to this project will be documented in this file.
3+
4+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6+
7+
## 0.2.20 (15-03-2023)
8+
Initial CHANGELOG registry.
9+
### Added
10+
- New version of KES signature, which requires buffer allocation prior to key generation.
11+
- Added wrapper struct to KES signature to allow copying the data. The new version of KES does not allow it anymore.

mithril-common/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-common"
3-
version = "0.2.25"
3+
version = "0.2.26"
44
authors = { workspace = true }
55
edition = { workspace = true }
66
documentation = { workspace = true }
@@ -27,7 +27,7 @@ glob = "0.3"
2727
hex = "0.4.3"
2828
http = "0.2.6"
2929
jsonschema = "0.16.0"
30-
kes-summed-ed25519 = { version = "0.1.1", features = ["serde_enabled"] }
30+
kes-summed-ed25519 = { version = "0.2.0", features = ["serde_enabled", "sk_clone_enabled"] }
3131
lazy_static = "1.4.0"
3232
mockall = "0.11.0"
3333
nom = "7.1"
@@ -39,6 +39,7 @@ serde = { version = "1.0", features = ["derive"] }
3939
serde_bytes = "0.11.7"
4040
serde_cbor = "0.11.2"
4141
serde_json = "1.0"
42+
serde_with = "2.2.0"
4243
serde_yaml = "0.9.10"
4344
sha2 = "0.10.2"
4445
slog = { version = "2.7.0", features = ["max_level_trace", "release_max_level_debug"] }

mithril-common/src/chain_observer/cli_observer.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,9 @@ pool1qz2vzszautc2c8mljnqre2857dpmheq7kgt6vav0s38tvvhxm6w 1.051e-6
635635
#[tokio::test]
636636
async fn test_get_current_kes_period() {
637637
let keypair = ColdKeyGenerator::create_deterministic_keypair([0u8; 32]);
638-
let (_, kes_verification_key) = Sum6Kes::keygen(&mut [0u8; 32]);
638+
let mut dummy_key_buffer = [0u8; Sum6Kes::SIZE + 4];
639+
let mut dummy_seed = [0u8; 32];
640+
let (_, kes_verification_key) = Sum6Kes::keygen(&mut dummy_key_buffer, &mut dummy_seed);
639641
let operational_certificate = OpCert::new(kes_verification_key, 0, 0, keypair);
640642
let observer = CardanoCliChainObserver::new(Box::new(TestCliRunner {}));
641643
let kes_period = observer

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

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,24 @@
1313
1414
use hex::FromHex;
1515
use kes_summed_ed25519::kes::Sum6Kes;
16+
use kes_summed_ed25519::traits::KesSk;
1617
use serde::de::DeserializeOwned;
1718
use serde::{Deserialize, Serialize};
19+
use serde_with::{As, Bytes};
1820
use std::fs;
1921
use std::io::Write;
2022
use std::path::Path;
2123
use thiserror::Error;
2224

25+
/// We need to create this struct because the design of Sum6Kes takes
26+
/// a reference to a mutable pointer. It is therefore not possible to
27+
/// implement Ser/Deser using serde.
28+
// We need this helper structure, because we are currently getting the key
29+
// from a file, instead of directly consuming a buffer.
30+
// todo: create the KES key directly from a buffer instead of deserialising from disk
31+
#[derive(Clone, Serialize, Deserialize)]
32+
pub struct Sum6KesBytes(#[serde(with = "As::<Bytes>")] pub [u8; 612]);
33+
2334
/// Parse error
2435
#[derive(Error, Debug)]
2536
pub enum ParseError {
@@ -34,6 +45,9 @@ pub enum ParseError {
3445

3546
#[error("CBOR parse error: `{0}`")]
3647
CborFormat(#[from] serde_cbor::Error),
48+
49+
#[error("Invalid KES format")]
50+
KesFormat,
3751
}
3852

3953
/// Fields for a shelley formatted file (holds for vkeys, skeys or certs)
@@ -85,7 +99,7 @@ pub trait SerDeShelleyFileFormat: Serialize + DeserializeOwned {
8599
}
86100
}
87101

88-
impl SerDeShelleyFileFormat for Sum6Kes {
102+
impl SerDeShelleyFileFormat for Sum6KesBytes {
89103
const TYPE: &'static str = "KesSigningKey_ed25519_kes_2^6";
90104
const DESCRIPTION: &'static str = "KES Signing Key";
91105

@@ -110,6 +124,14 @@ impl SerDeShelleyFileFormat for Sum6Kes {
110124
}
111125
}
112126

127+
impl<'a> TryFrom<&'a mut Sum6KesBytes> for Sum6Kes<'a> {
128+
type Error = ParseError;
129+
130+
fn try_from(value: &'a mut Sum6KesBytes) -> Result<Self, Self::Error> {
131+
Self::from_bytes(&mut value.0).map_err(|_| ParseError::KesFormat)
132+
}
133+
}
134+
113135
#[cfg(all(test))]
114136
mod test {
115137
use super::*;
@@ -122,8 +144,8 @@ mod test {
122144
let cbor_string = "590260fe77acdfa56281e4b05198f5136018057a65f425411f0990cac4aca0f2917aa00a3d51e191f6f425d870aca3c6a2a41833621f5729d7bc0e3dfc3ae77d057e5e1253b71def7a54157b9f98973ca3c49edd9f311e5f4b23ac268b56a6ac040c14c6d2217925492e42f00dc89a2a01ff363571df0ca0db5ba37001cee56790cc01cd69c6aa760fca55a65a110305ea3c11da0a27be345a589329a584ebfc499c43c55e8c6db5d9c0b014692533ee78abd7ac1e79f7ec9335c7551d31668369b4d5111db78072f010043e35e5ca7f11acc3c05b26b9c7fe56f02aa41544f00cb7685e87f34c73b617260ade3c7b8d8c4df46693694998f85ad80d2cbab0b575b6ccd65d90574e84368169578bff57f751bc94f7eec5c0d7055ec88891a69545eedbfbd3c5f1b1c1fe09c14099f6b052aa215efdc5cb6cdc84aa810db41dbe8cb7d28f7c4beb75cc53915d3ac75fc9d0bf1c734a46e401e15150c147d013a938b7e07cc4f25a582b914e94783d15896530409b8acbe31ef471de8a1988ac78dfb7510729eff008084885f07df870b65e4f382ca15908e1dcda77384b5c724350de90cec22b1dcbb1cdaed88da08bb4772a82266ec154f5887f89860d0920dba705c45957ef6d93e42f6c9509c966277d368dd0eefa67c8147aa15d40a222f7953a4f34616500b310d00aa1b5b73eb237dc4f76c0c16813d321b2fc5ac97039be25b22509d1201d61f4ccc11cd4ff40fffe39f0e937b4722074d8e073a775d7283b715d46f79ce128e3f1362f35615fa72364d20b6db841193d96e58d9d8e86b516bbd1f05e45b39823a93f6e9f29d9e01acf2c12c072d1c64e0afbbabf6903ef542e".to_string();
123145

124146
let file_format = ShelleyFileFormat {
125-
file_type: Sum6Kes::TYPE.to_string(),
126-
description: Sum6Kes::DESCRIPTION.to_string(),
147+
file_type: Sum6KesBytes::TYPE.to_string(),
148+
description: Sum6KesBytes::DESCRIPTION.to_string(),
127149
cbor_hex: cbor_string,
128150
};
129151

@@ -134,8 +156,9 @@ mod test {
134156

135157
write!(file, "{json_str}").expect("Unexpected error writing to file.");
136158

137-
let kes_sk = Sum6Kes::from_file(&sk_dir);
159+
let mut kes_sk_bytes =
160+
Sum6KesBytes::from_file(&sk_dir).expect("Failure parsing Shelley file format.");
138161

139-
assert!(kes_sk.is_ok(), "Failure parsing Shelley file format.");
162+
assert!(Sum6Kes::try_from(&mut kes_sk_bytes).is_ok());
140163
}
141164
}

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use mithril_stm::key_reg::{ClosedKeyReg, KeyReg};
1515
use mithril_stm::stm::{Stake, StmInitializer, StmParameters, StmSigner, StmVerificationKeyPoP};
1616
use mithril_stm::RegisterError;
1717

18+
use crate::crypto_helper::cardano::Sum6KesBytes;
1819
use blake2::{
1920
digest::{consts::U32, FixedOutput},
2021
Blake2b, Digest,
@@ -123,8 +124,9 @@ impl StmInitializerWrapper {
123124
) -> Result<Self, ProtocolInitializerErrorWrapper> {
124125
let stm_initializer = StmInitializer::setup(params, stake, rng);
125126
let kes_signature = if let Some(kes_sk_path) = kes_sk_path {
126-
let mut kes_sk: Sum6Kes = Sum6Kes::from_file(kes_sk_path)?;
127-
127+
let mut kes_sk_bytes = Sum6KesBytes::from_file(kes_sk_path)?;
128+
let mut kes_sk = Sum6Kes::try_from(&mut kes_sk_bytes)
129+
.map_err(ProtocolInitializerErrorWrapper::Codec)?;
128130
let kes_sk_period = kes_sk.get_period();
129131
let provided_period = kes_period.unwrap_or_default();
130132
if kes_sk_period > provided_period {
@@ -308,10 +310,15 @@ mod test {
308310
fn create_cryptographic_material(party_idx: u64) -> (ProtocolPartyId, PathBuf, PathBuf) {
309311
let temp_dir = setup_temp_directory();
310312
let keypair = ColdKeyGenerator::create_deterministic_keypair([party_idx as u8; 32]);
311-
let (kes_secret_key, kes_verification_key) = Sum6Kes::keygen(&mut [party_idx as u8; 32]);
313+
let mut dummy_buffer = [0u8; Sum6Kes::SIZE + 4];
314+
let mut dummy_seed = [party_idx as u8; 32];
315+
let (kes_secret_key, kes_verification_key) =
316+
Sum6Kes::keygen(&mut dummy_buffer, &mut dummy_seed);
317+
let mut kes_bytes = Sum6KesBytes([0u8; Sum6Kes::SIZE + 4]);
318+
kes_bytes.0.copy_from_slice(&kes_secret_key.clone_sk());
312319
let operational_certificate = OpCert::new(kes_verification_key, 0, 0, keypair);
313320
let kes_secret_key_file = temp_dir.join(format!("kes{party_idx}.skey"));
314-
kes_secret_key
321+
kes_bytes
315322
.to_file(&kes_secret_key_file)
316323
.expect("KES secret key file export should not fail");
317324
let operational_certificate_file = temp_dir.join(format!("pool{party_idx}.cert"));

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,9 @@ mod tests {
187187
fn test_vector_opcert() {
188188
let temp_dir = setup_temp_directory();
189189
let keypair = ColdKeyGenerator::create_deterministic_keypair([0u8; 32]);
190-
let (_, kes_verification_key) = Sum6Kes::keygen(&mut [0u8; 32]);
190+
let mut dummy_key_buffer = [0u8; Sum6Kes::SIZE + 4];
191+
let mut dummy_seed = [0u8; 32];
192+
let (_, kes_verification_key) = Sum6Kes::keygen(&mut dummy_key_buffer, &mut dummy_seed);
191193
let operational_certificate = OpCert::new(kes_verification_key, 0, 0, keypair);
192194
assert!(operational_certificate.validate().is_ok());
193195

mithril-common/src/crypto_helper/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ mod types;
1111

1212
#[cfg(any(test, feature = "test_only"))]
1313
pub use cardano::ColdKeyGenerator;
14-
pub use cardano::{KESPeriod, OpCert, SerDeShelleyFileFormat};
14+
pub use cardano::{KESPeriod, OpCert, SerDeShelleyFileFormat, Sum6KesBytes};
1515
pub use codec::*;
1616
pub use era::{
1717
EraMarkersSigner, EraMarkersVerifier, EraMarkersVerifierError, EraMarkersVerifierSecretKey,

0 commit comments

Comments
 (0)