Skip to content

Commit d671644

Browse files
authored
Merge pull request #2642 from input-output-hk/curiecrypt/golden-tests
Enhance STM library readability - Golden tests
2 parents 9f90c66 + 5dddb47 commit d671644

File tree

12 files changed

+508
-3
lines changed

12 files changed

+508
-3
lines changed

Cargo.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-stm/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## 0.5.4 (10-07-2025)
9+
10+
### Added
11+
12+
- Added golden tests for JSON (de)serialization.
13+
814
## 0.5.3 (10-07-2025)
915

1016
### Added

mithril-stm/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-stm"
3-
version = "0.5.3"
3+
version = "0.5.4"
44
edition = { workspace = true }
55
authors = { workspace = true }
66
homepage = { workspace = true }
@@ -50,6 +50,7 @@ num-rational = "0.4.2"
5050
proptest = "1.7.0"
5151
rand = "0.9.2"
5252
rand_chacha = { workspace = true }
53+
serde_json = { workspace = true }
5354

5455
[[bench]]
5556
name = "multi_sig"

mithril-stm/src/aggregate_signature/signature.rs

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ impl<D: Clone + Digest + FixedOutput + Send + Sync> AggregateSignature<D> {
200200
mod tests {
201201
use super::*;
202202

203-
mod aggregate_signature_type {
203+
mod aggregate_signature_type_golden {
204204
use super::*;
205205

206206
#[test]
@@ -215,4 +215,117 @@ mod tests {
215215
);
216216
}
217217
}
218+
219+
mod aggregate_signature_golden_concatenation {
220+
use blake2::{Blake2b, digest::consts::U32};
221+
use rand_chacha::ChaCha20Rng;
222+
use rand_core::SeedableRng;
223+
224+
use crate::bls_multi_signature::{BlsSigningKey, BlsVerificationKeyProofOfPossession};
225+
use crate::{
226+
AggregateSignature, AggregateSignatureType, Clerk, ClosedKeyRegistration,
227+
KeyRegistration, Parameters, Signer,
228+
};
229+
230+
type D = Blake2b<U32>;
231+
232+
const GOLDEN_JSON: &str = r#"
233+
{
234+
"signatures": [
235+
[
236+
{
237+
"sigma": [
238+
149, 157, 201, 187, 140, 54, 0, 128, 209, 88, 16, 203, 61, 78, 77, 98,
239+
161, 133, 58, 152, 29, 74, 217, 113, 64, 100, 10, 161, 186, 167, 133,
240+
114, 211, 153, 218, 56, 223, 84, 105, 242, 41, 54, 224, 170, 208, 185,
241+
126, 83
242+
],
243+
"indexes": [1, 4, 5, 8],
244+
"signer_index": 0
245+
},
246+
[
247+
[
248+
143, 161, 255, 48, 78, 57, 204, 220, 25, 221, 164, 252, 248, 14, 56,
249+
126, 186, 135, 228, 188, 145, 181, 52, 200, 97, 99, 213, 46, 0, 199,
250+
193, 89, 187, 88, 29, 135, 173, 244, 86, 36, 83, 54, 67, 164, 6, 137,
251+
94, 72, 6, 105, 128, 128, 93, 48, 176, 11, 4, 246, 138, 48, 180, 133,
252+
90, 142, 192, 24, 193, 111, 142, 31, 76, 111, 110, 234, 153, 90, 208,
253+
192, 31, 124, 95, 102, 49, 158, 99, 52, 220, 165, 94, 251, 68, 69,
254+
121, 16, 224, 194
255+
],
256+
1
257+
]
258+
],
259+
[
260+
{
261+
"sigma": [
262+
149, 169, 22, 201, 216, 97, 163, 188, 115, 210, 217, 236, 233, 161,
263+
201, 13, 42, 132, 12, 63, 5, 31, 120, 22, 78, 177, 125, 134, 208, 205,
264+
73, 58, 247, 141, 59, 62, 187, 81, 213, 30, 153, 218, 41, 42, 110,
265+
156, 161, 205
266+
],
267+
"indexes": [0, 3, 6],
268+
"signer_index": 1
269+
},
270+
[
271+
[
272+
145, 56, 175, 32, 122, 187, 214, 226, 251, 148, 88, 9, 1, 103, 159,
273+
146, 80, 166, 107, 243, 251, 236, 41, 28, 111, 128, 207, 164, 132,
274+
147, 228, 83, 246, 228, 170, 68, 89, 78, 60, 28, 123, 130, 88, 234,
275+
38, 97, 42, 65, 1, 100, 53, 18, 78, 131, 8, 61, 122, 131, 238, 84,
276+
233, 223, 154, 118, 118, 73, 28, 27, 101, 78, 80, 233, 123, 206, 220,
277+
174, 134, 205, 71, 110, 112, 180, 97, 98, 0, 113, 69, 145, 231, 168,
278+
43, 173, 172, 56, 104, 208
279+
],
280+
1
281+
]
282+
]
283+
],
284+
"batch_proof": { "values": [], "indices": [0, 1], "hasher": null }
285+
}
286+
"#;
287+
288+
fn golden_value() -> AggregateSignature<D> {
289+
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
290+
let msg = [0u8; 16];
291+
let params = Parameters {
292+
m: 10,
293+
k: 5,
294+
phi_f: 0.8,
295+
};
296+
let sk_1 = BlsSigningKey::generate(&mut rng);
297+
let sk_2 = BlsSigningKey::generate(&mut rng);
298+
let pk_1 = BlsVerificationKeyProofOfPossession::from(&sk_1);
299+
let pk_2 = BlsVerificationKeyProofOfPossession::from(&sk_2);
300+
let mut key_reg = KeyRegistration::init();
301+
key_reg.register(1, pk_1).unwrap();
302+
key_reg.register(1, pk_2).unwrap();
303+
let closed_key_reg: ClosedKeyRegistration<D> = key_reg.close();
304+
let clerk = Clerk::new_clerk_from_closed_key_registration(&params, &closed_key_reg);
305+
let signer_1 = Signer::set_signer(0, 1, params, sk_1, pk_1.vk, closed_key_reg.clone());
306+
let signer_2 = Signer::set_signer(1, 1, params, sk_2, pk_2.vk, closed_key_reg);
307+
let signature_1 = signer_1.sign(&msg).unwrap();
308+
let signature_2 = signer_2.sign(&msg).unwrap();
309+
310+
clerk
311+
.aggregate_signatures_with_type(
312+
&[signature_1, signature_2],
313+
&msg,
314+
AggregateSignatureType::Concatenation,
315+
)
316+
.unwrap()
317+
}
318+
319+
#[test]
320+
fn golden_conversions() {
321+
let value: AggregateSignature<D> = serde_json::from_str(GOLDEN_JSON)
322+
.expect("This JSON deserialization should not fail");
323+
324+
let serialized =
325+
serde_json::to_string(&value).expect("This JSON serialization should not fail");
326+
let golden_serialized = serde_json::to_string(&golden_value())
327+
.expect("This JSON serialization should not fail");
328+
assert_eq!(golden_serialized, serialized);
329+
}
330+
}
218331
}

mithril-stm/src/bls_multi_signature/proof_of_possession.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,35 @@ impl From<&BlsSigningKey> for BlsProofOfPossession {
6868
Self { k1, k2 }
6969
}
7070
}
71+
72+
#[cfg(test)]
73+
mod tests {
74+
mod golden {
75+
76+
use rand_chacha::ChaCha20Rng;
77+
use rand_core::SeedableRng;
78+
79+
use crate::bls_multi_signature::{BlsProofOfPossession, BlsSigningKey};
80+
81+
const GOLDEN_JSON: &str = r#"[168,50,233,193,15,136,65,72,123,148,129,176,38,198,209,47,28,204,176,144,57,251,42,28,66,76,89,97,158,63,54,198,194,176,135,221,14,185,197,225,202,98,243,74,233,225,143,151,147,177,170,117,66,165,66,62,33,216,232,75,68,114,195,22,100,65,44,198,4,166,102,233,253,240,59,175,60,117,142,114,140,122,17,87,110,187,1,17,10,195,154,13,249,86,54,226]"#;
82+
83+
fn golden_value() -> BlsProofOfPossession {
84+
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
85+
let sk = BlsSigningKey::generate(&mut rng);
86+
BlsProofOfPossession::from(&sk)
87+
}
88+
89+
#[test]
90+
fn golden_conversions() {
91+
let value = serde_json::from_str(GOLDEN_JSON)
92+
.expect("This JSON deserialization should not fail");
93+
assert_eq!(golden_value(), value);
94+
95+
let serialized =
96+
serde_json::to_string(&value).expect("This JSON serialization should not fail");
97+
let golden_serialized = serde_json::to_string(&golden_value())
98+
.expect("This JSON serialization should not fail");
99+
assert_eq!(golden_serialized, serialized);
100+
}
101+
}
102+
}

mithril-stm/src/bls_multi_signature/signature.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,3 +208,36 @@ impl Ord for BlsSignature {
208208
self.compare_signatures(other)
209209
}
210210
}
211+
212+
#[cfg(test)]
213+
mod tests {
214+
mod golden {
215+
216+
use rand_chacha::ChaCha20Rng;
217+
use rand_core::SeedableRng;
218+
219+
use crate::bls_multi_signature::{BlsSignature, BlsSigningKey};
220+
221+
const GOLDEN_JSON: &str = r#"[132,95,124,197,185,105,193,171,114,182,52,171,205,119,202,188,2,213,61,125,219,242,10,131,53,219,53,197,157,42,152,194,234,161,244,204,2,134,47,179,176,49,200,232,120,241,180,246]"#;
222+
223+
fn golden_value() -> BlsSignature {
224+
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
225+
let sk = BlsSigningKey::generate(&mut rng);
226+
let msg = [0u8; 32];
227+
sk.sign(&msg)
228+
}
229+
230+
#[test]
231+
fn golden_conversions() {
232+
let value = serde_json::from_str(GOLDEN_JSON)
233+
.expect("This JSON deserialization should not fail");
234+
assert_eq!(golden_value(), value);
235+
236+
let serialized =
237+
serde_json::to_string(&value).expect("This JSON serialization should not fail");
238+
let golden_serialized = serde_json::to_string(&golden_value())
239+
.expect("This JSON serialization should not fail");
240+
assert_eq!(golden_serialized, serialized);
241+
}
242+
}
243+
}

mithril-stm/src/bls_multi_signature/signing_key.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,36 @@ impl BlsSigningKey {
4747
self.0.clone()
4848
}
4949
}
50+
51+
#[cfg(test)]
52+
mod tests {
53+
use super::*;
54+
55+
mod golden {
56+
57+
use rand_chacha::ChaCha20Rng;
58+
use rand_core::SeedableRng;
59+
60+
use super::*;
61+
62+
const GOLDEN_JSON: &str = r#"[64, 129, 87, 121, 27, 239, 221, 215, 2, 103, 45, 207, 207, 201, 157, 163, 81, 47, 156, 14, 168, 24, 137, 15, 203, 106, 183, 73, 88, 14, 242, 207]"#;
63+
64+
fn golden_value() -> BlsSigningKey {
65+
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
66+
BlsSigningKey::generate(&mut rng)
67+
}
68+
69+
#[test]
70+
fn golden_conversions() {
71+
let value = serde_json::from_str(GOLDEN_JSON)
72+
.expect("This JSON deserialization should not fail");
73+
assert_eq!(golden_value(), value);
74+
75+
let serialized =
76+
serde_json::to_string(&value).expect("This JSON serialization should not fail");
77+
let golden_serialized = serde_json::to_string(&golden_value())
78+
.expect("This JSON serialization should not fail");
79+
assert_eq!(golden_serialized, serialized);
80+
}
81+
}
82+
}

mithril-stm/src/bls_multi_signature/verification_key.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,3 +209,45 @@ impl From<&BlsSigningKey> for BlsVerificationKeyProofOfPossession {
209209
}
210210
}
211211
}
212+
213+
#[cfg(test)]
214+
mod tests {
215+
use super::*;
216+
217+
mod golden {
218+
219+
use rand_chacha::ChaCha20Rng;
220+
use rand_core::SeedableRng;
221+
222+
use super::*;
223+
224+
const GOLDEN_JSON: &str = r#"
225+
{
226+
"vk": [143, 161, 255, 48, 78, 57, 204, 220, 25, 221, 164, 252, 248, 14, 56, 126, 186, 135, 228, 188, 145, 181, 52, 200, 97, 99, 213, 46, 0, 199, 193, 89, 187, 88, 29, 135, 173, 244, 86, 36, 83, 54, 67, 164, 6, 137, 94, 72, 6, 105, 128, 128, 93, 48, 176, 11, 4, 246, 138, 48, 180, 133, 90, 142, 192, 24, 193, 111, 142, 31, 76, 111, 110, 234, 153, 90, 208, 192, 31, 124, 95, 102, 49, 158, 99, 52, 220, 165, 94, 251, 68, 69, 121, 16, 224, 194],
227+
"pop": [168, 50, 233, 193, 15, 136, 65, 72, 123, 148, 129, 176, 38, 198, 209, 47, 28, 204, 176, 144, 57, 251, 42, 28, 66, 76, 89, 97, 158, 63, 54, 198, 194, 176, 135, 221, 14, 185, 197, 225, 202, 98, 243, 74, 233, 225, 143, 151, 147, 177, 170, 117, 66, 165, 66, 62, 33, 216, 232, 75, 68, 114, 195, 22, 100, 65, 44, 198, 4, 166, 102, 233, 253, 240, 59, 175, 60, 117, 142, 114, 140, 122, 17, 87, 110, 187, 1, 17, 10, 195, 154, 13, 249, 86, 54, 226]
228+
}
229+
"#;
230+
231+
fn golden_value() -> BlsVerificationKeyProofOfPossession {
232+
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
233+
let sk = BlsSigningKey::generate(&mut rng);
234+
BlsVerificationKeyProofOfPossession {
235+
vk: BlsVerificationKey::from(&sk),
236+
pop: BlsProofOfPossession::from(&sk),
237+
}
238+
}
239+
240+
#[test]
241+
fn golden_conversions() {
242+
let value = serde_json::from_str(GOLDEN_JSON)
243+
.expect("This JSON deserialization should not fail");
244+
assert_eq!(golden_value(), value);
245+
246+
let serialized =
247+
serde_json::to_string(&value).expect("This JSON serialization should not fail");
248+
let golden_serialized = serde_json::to_string(&golden_value())
249+
.expect("This JSON serialization should not fail");
250+
assert_eq!(golden_serialized, serialized);
251+
}
252+
}
253+
}

mithril-stm/src/parameters.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,41 @@ impl Parameters {
4848
Ok(Self { m, k, phi_f })
4949
}
5050
}
51+
52+
#[cfg(test)]
53+
mod tests {
54+
use super::*;
55+
56+
mod golden {
57+
use super::*;
58+
59+
const GOLDEN_JSON: &str = r#"
60+
{
61+
"m": 20973,
62+
"k": 2422,
63+
"phi_f": 0.2
64+
}
65+
"#;
66+
67+
fn golden_value() -> Parameters {
68+
Parameters {
69+
m: 20973,
70+
k: 2422,
71+
phi_f: 0.2,
72+
}
73+
}
74+
75+
#[test]
76+
fn golden_conversions() {
77+
let value = serde_json::from_str(GOLDEN_JSON)
78+
.expect("This JSON deserialization should not fail");
79+
assert_eq!(golden_value(), value);
80+
81+
let serialized =
82+
serde_json::to_string(&value).expect("This JSON serialization should not fail");
83+
let golden_serialized = serde_json::to_string(&golden_value())
84+
.expect("This JSON serialization should not fail");
85+
assert_eq!(golden_serialized, serialized);
86+
}
87+
}
88+
}

0 commit comments

Comments
 (0)