Skip to content

Commit 7b39690

Browse files
authored
Merge pull request #1909 from input-output-hk/djo/1899/optional_signed_message_in_register_signature
Optional signed message in registered signatures
2 parents cbd65d0 + 064aa0a commit 7b39690

File tree

13 files changed

+140
-26
lines changed

13 files changed

+140
-26
lines changed

Cargo.lock

Lines changed: 4 additions & 4 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.5.57"
3+
version = "0.5.58"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/database/record/single_signature.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ impl TryFrom<SingleSignatureRecord> for SingleSignatures {
5454
party_id: value.signer_id,
5555
won_indexes: value.lottery_indexes,
5656
signature: value.signature.try_into()?,
57+
signed_message: None,
5758
};
5859

5960
Ok(signatures)

mithril-aggregator/src/message_adapters/from_register_signature.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ impl TryFromMessageAdapter<RegisterSignatureMessage, SingleSignatures>
2222
"'FromRegisterSingleSignatureAdapter' can not convert the single signature"
2323
})?,
2424
won_indexes: register_single_signature_message.won_indexes,
25+
signed_message: register_single_signature_message.signed_message,
2526
};
2627

2728
Ok(signatures)
@@ -34,9 +35,16 @@ mod tests {
3435

3536
#[test]
3637
fn test_simple_message() {
37-
let message = RegisterSignatureMessage::dummy();
38-
let signatures = FromRegisterSingleSignatureAdapter::try_adapt(message).unwrap();
38+
let signatures = FromRegisterSingleSignatureAdapter::try_adapt(RegisterSignatureMessage {
39+
signed_message: Some("signed_message".to_string()),
40+
..RegisterSignatureMessage::dummy()
41+
})
42+
.unwrap();
3943

4044
assert_eq!("party_id".to_string(), signatures.party_id);
45+
assert_eq!(
46+
Some("signed_message".to_string()),
47+
signatures.signed_message
48+
);
4149
}
4250
}

mithril-common/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-common"
3-
version = "0.4.47"
3+
version = "0.4.48"
44
description = "Common types, interfaces, and utilities for Mithril nodes."
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-common/src/entities/single_signatures.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,17 @@ pub struct SingleSignatures {
2020
/// The indexes of the won lotteries that lead to the single signatures
2121
#[serde(rename = "indexes")]
2222
pub won_indexes: Vec<LotteryIndex>,
23+
24+
/// Message that is signed by the signer
25+
///
26+
/// Used to buffer the signature for later if the aggregator has yet to create an open message
27+
/// for the signed entity type.
28+
#[serde(skip_serializing_if = "Option::is_none")]
29+
pub signed_message: Option<String>,
2330
}
2431

2532
impl SingleSignatures {
26-
/// SingleSignature factory
33+
/// `SingleSignatures` factory
2734
pub fn new(
2835
party_id: PartyId,
2936
signature: ProtocolSingleSignature,
@@ -33,6 +40,22 @@ impl SingleSignatures {
3340
party_id,
3441
signature,
3542
won_indexes,
43+
signed_message: None,
44+
}
45+
}
46+
47+
/// `SingleSignatures` factory including the signed message
48+
pub fn new_with_signed_message(
49+
party_id: PartyId,
50+
signature: ProtocolSingleSignature,
51+
won_indexes: Vec<LotteryIndex>,
52+
signed_message: String,
53+
) -> SingleSignatures {
54+
SingleSignatures {
55+
party_id,
56+
signature,
57+
won_indexes,
58+
signed_message: Some(signed_message),
3659
}
3760
}
3861

mithril-common/src/messages/register_signature.rs

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ pub struct RegisterSignatureMessage {
2121
/// The indexes of the won lotteries that lead to the single signatures
2222
#[serde(rename = "indexes")]
2323
pub won_indexes: Vec<LotteryIndex>,
24+
25+
/// Message that is signed by the signer
26+
///
27+
/// Used to buffer the signature for later if the aggregator has yet to create an open message
28+
/// for the signed entity type.
29+
#[serde(skip_serializing_if = "Option::is_none")]
30+
pub signed_message: Option<String>,
2431
}
2532

2633
impl RegisterSignatureMessage {
@@ -32,6 +39,7 @@ impl RegisterSignatureMessage {
3239
party_id: "party_id".to_string(),
3340
signature: fake_keys::single_signature()[0].to_string(),
3441
won_indexes: vec![1, 3],
42+
signed_message: None,
3543
}
3644
}
3745
}
@@ -62,28 +70,58 @@ mod tests {
6270

6371
use super::*;
6472

65-
fn golden_message() -> RegisterSignatureMessage {
73+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
74+
pub struct RegisterSignatureMessagePrevious {
75+
#[serde(rename = "entity_type")]
76+
pub signed_entity_type: SignedEntityType,
77+
pub party_id: PartyId,
78+
pub signature: HexEncodedSingleSignature,
79+
#[serde(rename = "indexes")]
80+
pub won_indexes: Vec<LotteryIndex>,
81+
}
82+
83+
fn golden_message_previous() -> RegisterSignatureMessagePrevious {
84+
RegisterSignatureMessagePrevious {
85+
signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(246)),
86+
party_id: "party_id".to_string(),
87+
signature: "7b227369676d61223a5b3133302c3137372c31352c3232392c32342c3235312c3234372c3137312c3139362c3231302c3134332c3131332c38362c3138392c39322c35362c3131322c33332c3139332c3231322c35342c3231342c32382c3231362c3232372c3137332c3130302c3132372c3137382c34302c39382c38372c32392c3138312c3235352c3131312c3135372c3232342c3233352c34362c3130302c3136392c3233322c3138392c3235322c38322c3133392c33365d2c22696e6465786573223a5b302c312c332c342c362c382c392c31302c31312c31322c31342c31382c32312c32322c32332c32352c32362c32372c33302c33332c33342c33382c34312c34332c35302c35382c35392c36302c36312c36322c36372c36392c37312c37332c37352c37362c37372c38312c38322c38332c38342c39302c39312c39322c39332c39372c39385d2c227369676e65725f696e646578223a327d".to_string(),
88+
won_indexes: vec![1, 3],
89+
}
90+
}
91+
92+
fn golden_message_actual() -> RegisterSignatureMessage {
6693
RegisterSignatureMessage {
6794
signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(246)),
6895
party_id: "party_id".to_string(),
6996
signature: "7b227369676d61223a5b3133302c3137372c31352c3232392c32342c3235312c3234372c3137312c3139362c3231302c3134332c3131332c38362c3138392c39322c35362c3131322c33332c3139332c3231322c35342c3231342c32382c3231362c3232372c3137332c3130302c3132372c3137382c34302c39382c38372c32392c3138312c3235352c3131312c3135372c3232342c3233352c34362c3130302c3136392c3233322c3138392c3235322c38322c3133392c33365d2c22696e6465786573223a5b302c312c332c342c362c382c392c31302c31312c31322c31342c31382c32312c32322c32332c32352c32362c32372c33302c33332c33342c33382c34312c34332c35302c35382c35392c36302c36312c36322c36372c36392c37312c37332c37352c37362c37372c38312c38322c38332c38342c39302c39312c39322c39332c39372c39385d2c227369676e65725f696e646578223a327d".to_string(),
7097
won_indexes: vec![1, 3],
98+
signed_message: Some("6a7e737c312972d2346b65ac3075696e04286d046dddaf8004121e3d5e27cc0d".to_string()),
7199
}
72100
}
73101

74-
// Test the retro compatibility with possible future upgrades.
102+
const ACTUAL_JSON: &str = r#"{
103+
"entity_type": { "MithrilStakeDistribution": 246 },
104+
"party_id": "party_id",
105+
"signature": "7b227369676d61223a5b3133302c3137372c31352c3232392c32342c3235312c3234372c3137312c3139362c3231302c3134332c3131332c38362c3138392c39322c35362c3131322c33332c3139332c3231322c35342c3231342c32382c3231362c3232372c3137332c3130302c3132372c3137382c34302c39382c38372c32392c3138312c3235352c3131312c3135372c3232342c3233352c34362c3130302c3136392c3233322c3138392c3235322c38322c3133392c33365d2c22696e6465786573223a5b302c312c332c342c362c382c392c31302c31312c31322c31342c31382c32312c32322c32332c32352c32362c32372c33302c33332c33342c33382c34312c34332c35302c35382c35392c36302c36312c36322c36372c36392c37312c37332c37352c37362c37372c38312c38322c38332c38342c39302c39312c39322c39332c39372c39385d2c227369676e65725f696e646578223a327d",
106+
"indexes": [1, 3],
107+
"signed_message": "6a7e737c312972d2346b65ac3075696e04286d046dddaf8004121e3d5e27cc0d"
108+
}"#;
109+
110+
#[test]
111+
fn test_actual_json_deserialized_into_previous_message() {
112+
let json = ACTUAL_JSON;
113+
let message: RegisterSignatureMessagePrevious = serde_json::from_str(json).unwrap();
114+
115+
assert_eq!(golden_message_previous(), message);
116+
}
117+
75118
#[test]
76-
fn test_v1() {
77-
let json = r#"{
78-
"entity_type": { "MithrilStakeDistribution": 246 },
79-
"party_id": "party_id",
80-
"signature": "7b227369676d61223a5b3133302c3137372c31352c3232392c32342c3235312c3234372c3137312c3139362c3231302c3134332c3131332c38362c3138392c39322c35362c3131322c33332c3139332c3231322c35342c3231342c32382c3231362c3232372c3137332c3130302c3132372c3137382c34302c39382c38372c32392c3138312c3235352c3131312c3135372c3232342c3233352c34362c3130302c3136392c3233322c3138392c3235322c38322c3133392c33365d2c22696e6465786573223a5b302c312c332c342c362c382c392c31302c31312c31322c31342c31382c32312c32322c32332c32352c32362c32372c33302c33332c33342c33382c34312c34332c35302c35382c35392c36302c36312c36322c36372c36392c37312c37332c37352c37362c37372c38312c38322c38332c38342c39302c39312c39322c39332c39372c39385d2c227369676e65725f696e646578223a327d",
81-
"indexes": [1, 3]
82-
}"#;
119+
fn test_actual_json_deserialized_into_actual_message() {
120+
let json = ACTUAL_JSON;
83121
let message: RegisterSignatureMessage = serde_json::from_str(json).expect(
84122
"This JSON is expected to be successfully parsed into a RegisterSignatureMessage instance.",
85123
);
86124

87-
assert_eq!(golden_message(), message);
125+
assert_eq!(golden_message_actual(), message);
88126
}
89127
}

mithril-common/src/protocol/single_signer.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,16 @@ impl SingleSigner {
2323
///
2424
/// If no lottery are won None will be returned.
2525
pub fn sign(&self, message: &ProtocolMessage) -> StdResult<Option<SingleSignatures>> {
26-
match self.protocol_signer.sign(message.compute_hash().as_bytes()) {
26+
let signed_message = message.compute_hash();
27+
match self.protocol_signer.sign(signed_message.as_bytes()) {
2728
Some(signature) => {
2829
let won_indexes = signature.indexes.clone();
2930

30-
Ok(Some(SingleSignatures::new(
31+
Ok(Some(SingleSignatures::new_with_signed_message(
3132
self.party_id.to_owned(),
3233
signature.into(),
3334
won_indexes,
35+
signed_message,
3436
)))
3537
}
3638
None => Ok(None),
@@ -72,4 +74,32 @@ mod test {
7274

7375
assert!(signature.is_some());
7476
}
77+
78+
#[test]
79+
fn embed_signed_message_in_issued_signature() {
80+
let fixture = MithrilFixtureBuilder::default().with_signers(3).build();
81+
let signers = fixture.signers_fixture();
82+
let signer = signers.first().unwrap();
83+
84+
let (single_signer, _) = SignerBuilder::new(
85+
&fixture.signers_with_stake(),
86+
&fixture.protocol_parameters(),
87+
)
88+
.unwrap()
89+
.build_test_single_signer(
90+
signer.signer_with_stake.clone(),
91+
signer.kes_secret_key_path(),
92+
)
93+
.unwrap();
94+
95+
let message = ProtocolMessage::default();
96+
let signature = single_signer
97+
.sign(&message)
98+
.expect("Single signer should be able to issue single signature");
99+
100+
assert_eq!(
101+
Some(message.compute_hash()),
102+
signature.and_then(|s| s.signed_message)
103+
);
104+
}
75105
}

mithril-signer/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-signer"
3-
version = "0.2.175"
3+
version = "0.2.176"
44
description = "A Mithril Signer"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-signer/src/message_adapters/to_register_signature_message.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ impl TryToMessageAdapter<(SignedEntityType, SingleSignatures), RegisterSignature
1818
"'ToRegisterSignatureMessageAdapter' can not convert the single signature"
1919
})?,
2020
won_indexes: single_signature.won_indexes,
21+
signed_message: single_signature.signed_message,
2122
};
2223

2324
Ok(message)
@@ -32,13 +33,16 @@ mod tests {
3233

3334
#[test]
3435
fn adapt_ok() {
35-
let single_signature = fake_data::single_signatures([1, 3].to_vec());
3636
let message: RegisterSignatureMessage = ToRegisterSignatureMessageAdapter::try_adapt((
3737
SignedEntityType::dummy(),
38-
single_signature,
38+
SingleSignatures {
39+
signed_message: Some("signed_message".to_string()),
40+
..fake_data::single_signatures([1, 3].to_vec())
41+
},
3942
))
4043
.unwrap();
4144

4245
assert_eq!("party_id".to_string(), message.party_id);
46+
assert_eq!(Some("signed_message".to_string()), message.signed_message);
4347
}
4448
}

0 commit comments

Comments
 (0)