diff --git a/Cargo.lock b/Cargo.lock index 77ff426a489..cc7c1657327 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4432,6 +4432,7 @@ dependencies = [ "rayon", "rug", "serde", + "serde_json", "thiserror 2.0.12", ] diff --git a/mithril-stm/Cargo.toml b/mithril-stm/Cargo.toml index 8d2d2cdee4c..a3e66e72d45 100644 --- a/mithril-stm/Cargo.toml +++ b/mithril-stm/Cargo.toml @@ -50,6 +50,7 @@ num-rational = "0.4.2" proptest = "1.6.0" rand = "0.9.1" rand_chacha = { workspace = true } +serde_json = { workspace = true } [[bench]] name = "multi_sig" diff --git a/mithril-stm/src/bls_multi_signature/proof_of_possession.rs b/mithril-stm/src/bls_multi_signature/proof_of_possession.rs index 9794c21d4d8..86f60c7e329 100644 --- a/mithril-stm/src/bls_multi_signature/proof_of_possession.rs +++ b/mithril-stm/src/bls_multi_signature/proof_of_possession.rs @@ -68,3 +68,35 @@ impl From<&BlsSigningKey> for BlsProofOfPossession { Self { k1, k2 } } } + +#[cfg(test)] +mod tests { + mod golden { + + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + use crate::bls_multi_signature::{BlsProofOfPossession, BlsSigningKey}; + + 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]"#; + + fn golden_value() -> BlsProofOfPossession { + let mut rng = ChaCha20Rng::from_seed([0u8; 32]); + let sk = BlsSigningKey::generate(&mut rng); + BlsProofOfPossession::from(&sk) + } + + #[test] + fn golden_conversions() { + let value = serde_json::from_str(GOLDEN_JSON) + .expect("This JSON deserialization should not fail"); + assert_eq!(golden_value(), value); + + let serialized = + serde_json::to_string(&value).expect("This JSON serialization should not fail"); + let golden_serialized = serde_json::to_string(&golden_value()) + .expect("This JSON serialization should not fail"); + assert_eq!(golden_serialized, serialized); + } + } +} diff --git a/mithril-stm/src/bls_multi_signature/signature.rs b/mithril-stm/src/bls_multi_signature/signature.rs index 86f08a834c7..66245c5ab3f 100644 --- a/mithril-stm/src/bls_multi_signature/signature.rs +++ b/mithril-stm/src/bls_multi_signature/signature.rs @@ -208,3 +208,36 @@ impl Ord for BlsSignature { self.compare_signatures(other) } } + +#[cfg(test)] +mod tests { + mod golden { + + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + use crate::bls_multi_signature::{BlsSignature, BlsSigningKey}; + + 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]"#; + + fn golden_value() -> BlsSignature { + let mut rng = ChaCha20Rng::from_seed([0u8; 32]); + let sk = BlsSigningKey::generate(&mut rng); + let msg = [0u8; 32]; + sk.sign(&msg) + } + + #[test] + fn golden_conversions() { + let value = serde_json::from_str(GOLDEN_JSON) + .expect("This JSON deserialization should not fail"); + assert_eq!(golden_value(), value); + + let serialized = + serde_json::to_string(&value).expect("This JSON serialization should not fail"); + let golden_serialized = serde_json::to_string(&golden_value()) + .expect("This JSON serialization should not fail"); + assert_eq!(golden_serialized, serialized); + } + } +} diff --git a/mithril-stm/src/bls_multi_signature/signing_key.rs b/mithril-stm/src/bls_multi_signature/signing_key.rs index 486dd9ba165..11985c08c7e 100644 --- a/mithril-stm/src/bls_multi_signature/signing_key.rs +++ b/mithril-stm/src/bls_multi_signature/signing_key.rs @@ -47,3 +47,36 @@ impl BlsSigningKey { self.0.clone() } } + +#[cfg(test)] +mod tests { + use super::*; + + mod golden { + + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + use super::*; + + 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]"#; + + fn golden_value() -> BlsSigningKey { + let mut rng = ChaCha20Rng::from_seed([0u8; 32]); + BlsSigningKey::generate(&mut rng) + } + + #[test] + fn golden_conversions() { + let value = serde_json::from_str(GOLDEN_JSON) + .expect("This JSON deserialization should not fail"); + assert_eq!(golden_value(), value); + + let serialized = + serde_json::to_string(&value).expect("This JSON serialization should not fail"); + let golden_serialized = serde_json::to_string(&golden_value()) + .expect("This JSON serialization should not fail"); + assert_eq!(golden_serialized, serialized); + } + } +} diff --git a/mithril-stm/src/bls_multi_signature/verification_key.rs b/mithril-stm/src/bls_multi_signature/verification_key.rs index a4b7389ab23..c56ca1e1514 100644 --- a/mithril-stm/src/bls_multi_signature/verification_key.rs +++ b/mithril-stm/src/bls_multi_signature/verification_key.rs @@ -206,3 +206,45 @@ impl From<&BlsSigningKey> for BlsVerificationKeyProofOfPossession { } } } + +#[cfg(test)] +mod tests { + use super::*; + + mod golden { + + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + use super::*; + + const GOLDEN_JSON: &str = r#" + { + "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], + "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] + } + "#; + + fn golden_value() -> BlsVerificationKeyProofOfPossession { + let mut rng = ChaCha20Rng::from_seed([0u8; 32]); + let sk = BlsSigningKey::generate(&mut rng); + BlsVerificationKeyProofOfPossession { + vk: BlsVerificationKey::from(&sk), + pop: BlsProofOfPossession::from(&sk), + } + } + + #[test] + fn golden_conversions() { + let value = serde_json::from_str(GOLDEN_JSON) + .expect("This JSON deserialization should not fail"); + assert_eq!(golden_value(), value); + + let serialized = + serde_json::to_string(&value).expect("This JSON serialization should not fail"); + let golden_serialized = serde_json::to_string(&golden_value()) + .expect("This JSON serialization should not fail"); + assert_eq!(golden_serialized, serialized); + } + } +} diff --git a/mithril-stm/src/parameters.rs b/mithril-stm/src/parameters.rs index 701a05276d5..dff838d8f6c 100644 --- a/mithril-stm/src/parameters.rs +++ b/mithril-stm/src/parameters.rs @@ -48,3 +48,41 @@ impl Parameters { Ok(Self { m, k, phi_f }) } } + +#[cfg(test)] +mod tests { + use super::*; + + mod golden { + use super::*; + + const GOLDEN_JSON: &str = r#" + { + "m": 20973, + "k": 2422, + "phi_f": 0.2 + } + "#; + + fn golden_value() -> Parameters { + Parameters { + m: 20973, + k: 2422, + phi_f: 0.2, + } + } + + #[test] + fn golden_conversions() { + let value = serde_json::from_str(GOLDEN_JSON) + .expect("This JSON deserialization should not fail"); + assert_eq!(golden_value(), value); + + let serialized = + serde_json::to_string(&value).expect("This JSON serialization should not fail"); + let golden_serialized = serde_json::to_string(&golden_value()) + .expect("This JSON serialization should not fail"); + assert_eq!(golden_serialized, serialized); + } + } +} diff --git a/mithril-stm/src/participant/initializer.rs b/mithril-stm/src/participant/initializer.rs index 1292226bf5e..82a71a12429 100644 --- a/mithril-stm/src/participant/initializer.rs +++ b/mithril-stm/src/participant/initializer.rs @@ -197,3 +197,72 @@ impl Initializer { }) } } + +impl PartialEq for Initializer { + fn eq(&self, other: &Self) -> bool { + self.stake == other.stake + && self.params == other.params + && self.sk.to_bytes() == other.sk.to_bytes() + && self.get_verification_key_proof_of_possession() + == other.get_verification_key_proof_of_possession() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + mod golden { + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + use super::*; + + const GOLDEN_JSON: &str = r#" + { + "stake":1, + "params": + { + "m":20973, + "k":2422, + "phi_f":0.2 + }, + "sk":[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], + "pk": + { + "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], + "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] + } + } + "#; + + fn golden_value() -> Initializer { + let mut rng = ChaCha20Rng::from_seed([0u8; 32]); + let sk = BlsSigningKey::generate(&mut rng); + let pk = BlsVerificationKeyProofOfPossession::from(&sk); + Initializer { + stake: 1, + params: Parameters { + m: 20973, + k: 2422, + phi_f: 0.2, + }, + sk, + pk, + } + } + + #[test] + fn golden_conversions() { + let value = serde_json::from_str(GOLDEN_JSON) + .expect("This JSON deserialization should not fail"); + assert_eq!(golden_value(), value); + + let serialized = + serde_json::to_string(&value).expect("This JSON serialization should not fail"); + let golden_serialized = serde_json::to_string(&golden_value()) + .expect("This JSON serialization should not fail"); + assert_eq!(golden_serialized, serialized); + } + } +} diff --git a/mithril-stm/src/single_signature/signature.rs b/mithril-stm/src/single_signature/signature.rs index 1fcf0d3a46b..3d2927bd3f2 100644 --- a/mithril-stm/src/single_signature/signature.rs +++ b/mithril-stm/src/single_signature/signature.rs @@ -191,3 +191,57 @@ impl Ord for SingleSignature { self.signer_index.cmp(&other.signer_index) } } + +#[cfg(test)] +mod tests { + mod golden { + use blake2::{Blake2b, digest::consts::U32}; + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + use crate::bls_multi_signature::{BlsSigningKey, BlsVerificationKeyProofOfPossession}; + use crate::{ClosedKeyRegistration, KeyRegistration, Parameters, Signer, SingleSignature}; + + type D = Blake2b; + + const GOLDEN_JSON: &str = r#" + { + "sigma":[149,157,201,187,140,54,0,128,209,88,16,203,61,78,77,98,161,133,58,152,29,74,217,113,64,100,10,161,186,167,133,114,211,153,218,56,223,84,105,242,41,54,224,170,208,185,126,83], + "indexes":[14,30,38,39,67,95,101,103,104,122,127,128,138,142,159,161,177,178,220,224,231,237,253,258,260,264,285,288,304,307,317,324,334,337,346,348,362,365,369,386,389,422,433,447,448,449,472,480,483,488,489,493,495,501,506,510,511,526,527,536,549,551,553,554,555,556,570,575,593,596,600,604,613,629,630,635,639,654,655,660,688,700,734,745,746,750,789,809,831,836,863,882,894,915,917,924,926,930,948,953,976,984,991,1009,1013,1022,1056,1058,1092,1117,1125,1130,1132,1138,1153,1162,1169,1172,1190,1193,1202,1204,1207,1211,1214,1215,1232,1236,1247,1258,1259,1278,1281,1284,1298,1304,1309,1327,1328,1331,1336,1343,1361,1362,1364,1365,1372,1388,1420,1425,1426,1430,1432,1441,1445,1453,1463,1467,1470,1487,1490,1491,1492,1515,1522,1552,1555,1587,1607,1614,1625,1661,1689,1694,1702,1715,1745,1752,1757,1771,1776,1784,1794,1803,1823,1830,1843,1863,1865,1866,1869,1870,1886,1908,1921,1935,1939,1945,1970,2006,2020,2027,2029,2036,2057,2061,2065,2073,2075,2103,2111,2120,2123,2136,2142,2147,2155,2170,2172,2194,2207,2208,2228,2235,2240,2241,2251,2252,2257,2266,2270,2271,2282,2321,2324,2331,2336,2339,2345,2353,2355,2383,2409,2442,2451,2452,2460,2469,2477,2495,2505,2512,2518,2530,2534,2550,2554,2555,2576,2592,2596,2601,2622,2635,2637,2640,2648,2677,2684,2688,2689,2698,2710,2711,2716,2718,2721,2727,2729,2731,2735,2737,2756,2768,2776,2779,2785,2786,2789,2791,2795,2796,2800,2801,2821,2844,2847,2853,2855,2869,2883,2886,2910,2915,2916,2928,2936,2943,2945,2950,2953,2962,2969,2986,2996,2997,3017,3027,3044,3046,3049,3051,3101,3112,3125,3174,3179,3193,3206,3224,3249,3260,3280,3288,3289,3294,3323,3330,3354,3357,3369,3372,3376,3381,3412,3422,3429,3436,3440,3456,3458,3462,3466,3479,3489,3490,3498,3500,3506,3523,3529,3530,3534,3535,3539,3560,3572,3574,3578,3581,3584,3586,3597,3600,3612,3618,3620,3649,3669,3684,3692,3693,3717,3728,3736,3737,3762,3786,3787,3790,3792,3793,3800,3823,3829,3831,3878,3896,3915,3917,3919,3930,3948,3950,3954,3965,3976,3984,3990,3993,3999,4003,4019,4020,4023,4039,4049,4060,4068,4069,4075,4083,4094,4107,4114,4125,4138,4150,4171,4178,4184,4191,4202,4211,4218,4221,4234,4236,4245,4268,4297,4302,4308,4314,4317,4319,4336,4339,4342,4346,4348,4356,4367,4374,4396,4414,4440,4470,4477,4480,4519,4534,4561,4571,4573,4612,4626,4652,4659,4671,4675,4695,4704,4746,4752,4753,4756,4770,4781,4801,4809,4825,4833,4840,4873,4898,4901,4903,4904,4912,4914,4935,4952,4980,4997,5022,5024,5025,5033,5106,5123,5141,5158,5184,5188,5206,5238,5258,5259,5271,5276,5303,5308,5316,5330,5337,5341,5343,5360,5370,5374,5378,5381,5383,5385,5386,5391,5393,5402,5416,5418,5423,5424,5431,5432,5434,5435,5456,5462,5463,5478,5483,5485,5501,5508,5510,5515,5519,5528,5531,5533,5554,5559,5586,5589,5601,5602,5610,5611,5619,5623,5628,5638,5652,5660,5661,5679,5684,5686,5706,5712,5715,5718,5721,5740,5749,5750,5774,5776,5778,5788,5794,5797,5813,5827,5847,5856,5870,5873,5880,5911,5913,5915,5917,5925,5928,5932,5963,5982,5983,5986,5994,5999,6002,6009,6011,6013,6028,6032,6053,6082,6085,6090,6095,6099,6116,6129,6146,6150,6153,6155,6168,6175,6180,6188,6210,6220,6234,6244,6252,6261,6266,6276,6307,6320,6324,6335,6346,6357,6368,6372,6382,6390,6393,6395,6406,6413,6415,6416,6418,6438,6461,6490,6500,6501,6505,6521,6524,6538,6542,6561,6575,6577,6578,6603,6610,6628,6641,6664,6668,6671,6673,6675,6680,6693,6711,6713,6716,6725,6738,6740,6742,6747,6748,6769,6771,6777,6789,6813,6819,6820,6822,6823,6827,6834,6835,6883,6889,6891,6892,6897,6902,6911,6929,6937,6941,6946,6948,6949,6966,6982,7001,7004,7010,7014,7016,7034,7058,7069,7071,7079,7094,7099,7119,7145,7147,7151,7160,7162,7172,7192,7206,7223,7224,7225,7238,7254,7264,7268,7269,7287,7295,7308,7322,7324,7358,7360,7365,7369,7384,7391,7394,7404,7407,7408,7413,7442,7454,7456,7464,7466,7474,7476,7483,7484,7486,7488,7495,7499,7505,7507,7511,7517,7518,7519,7541,7542,7553,7560,7566,7567,7576,7586,7596,7611,7614,7637,7643,7665,7666,7700,7705,7730,7736,7778,7790,7800,7802,7816,7820,7824,7826,7841,7865,7867,7889,7935,7938,7943,7946,7948,7956,7959,7974,7992,8001,8013,8025,8033,8036,8040,8045,8047,8053,8054,8063,8067,8073,8074,8079,8088,8100,8111,8124,8125,8128,8143,8153,8161,8169,8173,8181,8185,8190,8193,8198,8214,8252,8257,8267,8276,8278,8301,8310,8319,8339,8343,8351,8355,8402,8412,8418,8425,8437,8442,8450,8451,8457,8460,8465,8471,8511,8516,8522,8526,8540,8543,8547,8564,8569,8570,8571,8574,8575,8580,8592,8608,8610,8611,8623,8624,8636,8640,8675,8682,8711,8717,8727,8745,8746,8747,8757,8769,8777,8778,8782,8797,8800,8806,8816,8818,8823,8832,8863,8868,8882,8886,8887,8925,8929,8940,8953,8957,8969,8988,9014,9019,9044,9054,9078,9088,9099,9117,9128,9133,9174,9179,9188,9192,9197,9202,9205,9223,9229,9240,9242,9261,9263,9268,9272,9276,9281,9285,9286,9305,9316,9327,9338,9347,9348,9350,9377,9382,9409,9420,9429,9438,9442,9443,9446,9453,9455,9458,9460,9466,9480,9510,9520,9529,9539,9540,9556,9567,9575,9590,9594,9597,9608,9616,9627,9634,9638,9653,9660,9662,9668,9673,9702,9708,9712,9718,9740,9746,9757,9759,9760,9767,9807,9809,9810,9815,9820,9837,9842,9852,9860,9863,9877,9887,9912,9915,9916,9954,9970,9996,9999,10013,10016,10034,10047,10052,10066,10068,10079,10080,10089,10107,10118,10120,10126,10129,10138,10178,10187,10196,10217,10224,10242,10253,10272,10282,10304,10339,10343,10352,10373,10377,10396,10406,10413,10433,10439,10440,10451,10462,10469,10491,10502,10506,10510,10512,10516,10526,10528,10540,10545,10558,10569,10580,10587,10590,10608,10611,10619,10623,10627,10629,10650,10657,10663,10664,10676,10681,10699,10708,10740,10741,10751,10753,10765,10789,10808,10812,10820,10836,10840,10845,10855,10859,10861,10869,10870,10874,10876,10893,10898,10899,10901,10903,10913,10926,10942,10952,10954,10964,10974,10983,10989,10994,11014,11026,11029,11044,11045,11050,11053,11055,11056,11072,11091,11092,11093,11094,11112,11114,11116,11118,11120,11123,11126,11127,11138,11139,11151,11182,11194,11230,11232,11235,11240,11278,11284,11288,11298,11301,11330,11340,11349,11353,11370,11381,11408,11412,11417,11437,11450,11470,11475,11487,11492,11515,11524,11525,11526,11533,11541,11544,11557,11578,11598,11602,11616,11633,11651,11655,11662,11664,11689,11702,11707,11709,11723,11731,11749,11752,11756,11758,11770,11772,11773,11774,11809,11811,11815,11832,11843,11854,11877,11903,11911,11919,11921,11952,11955,11971,11978,11990,11997,12006,12008,12020,12032,12035,12039,12059,12077,12096,12097,12098,12116,12139,12165,12170,12176,12199,12203,12210,12218,12222,12240,12253,12263,12267,12268,12276,12299,12300,12317,12321,12324,12326,12330,12334,12339,12343,12352,12380,12386,12392,12404,12407,12425,12431,12458,12471,12480,12482,12494,12520,12546,12562,12572,12573,12577,12580,12585,12611,12633,12637,12640,12651,12653,12665,12668,12669,12673,12674,12676,12682,12709,12720,12724,12734,12735,12749,12754,12769,12772,12778,12785,12797,12803,12820,12826,12831,12836,12848,12850,12854,12868,12870,12871,12878,12911,12936,12939,12952,12969,12971,13009,13021,13057,13059,13063,13070,13073,13080,13094,13100,13123,13126,13127,13132,13138,13163,13171,13185,13189,13205,13209,13223,13228,13229,13236,13252,13259,13277,13290,13300,13318,13328,13333,13352,13353,13365,13375,13382,13383,13409,13413,13420,13421,13434,13446,13456,13458,13460,13473,13476,13491,13492,13496,13506,13514,13525,13550,13564,13572,13580,13585,13589,13592,13594,13601,13605,13620,13625,13629,13630,13634,13635,13648,13658,13659,13661,13663,13664,13675,13691,13701,13705,13714,13715,13725,13739,13749,13771,13785,13792,13794,13810,13814,13818,13820,13827,13872,13895,13898,13915,13946,13971,13980,13991,13997,14000,14005,14020,14022,14026,14030,14038,14046,14066,14068,14073,14089,14095,14099,14102,14103,14110,14117,14124,14128,14140,14150,14151,14167,14189,14199,14205,14217,14229,14238,14251,14267,14275,14316,14319,14323,14324,14328,14331,14363,14367,14371,14377,14385,14398,14404,14410,14434,14440,14453,14469,14485,14492,14499,14500,14504,14509,14516,14517,14523,14543,14549,14558,14559,14605,14618,14635,14638,14647,14658,14666,14673,14682,14698,14704,14705,14719,14741,14778,14797,14799,14811,14841,14845,14850,14876,14902,14904,14940,14942,14960,14964,14967,14986,14995,15004,15006,15019,15024,15032,15034,15046,15052,15055,15062,15067,15081,15092,15096,15105,15114,15120,15123,15129,15142,15153,15155,15162,15164,15170,15180,15206,15214,15215,15221,15230,15231,15252,15259,15297,15334,15335,15338,15343,15344,15350,15358,15361,15390,15391,15437,15444,15445,15446,15448,15456,15458,15483,15487,15494,15521,15522,15525,15540,15547,15549,15551,15555,15557,15558,15559,15583,15599,15613,15615,15626,15633,15643,15645,15655,15659,15664,15672,15685,15687,15698,15713,15720,15724,15741,15742,15753,15759,15767,15769,15781,15785,15788,15804,15815,15819,15836,15848,15862,15863,15873,15880,15888,15891,15928,15931,15942,15946,15952,15964,15976,15978,15988,16011,16021,16033,16039,16054,16055,16071,16080,16081,16088,16101,16103,16111,16126,16144,16151,16165,16186,16188,16190,16206,16209,16211,16218,16220,16224,16233,16240,16252,16297,16300,16307,16313,16314,16327,16334,16358,16373,16385,16413,16416,16420,16438,16444,16462,16497,16499,16515,16526,16533,16537,16546,16548,16550,16561,16564,16576,16578,16579,16581,16589,16590,16594,16596,16603,16610,16647,16648,16649,16659,16663,16667,16668,16671,16676,16677,16679,16697,16727,16730,16735,16740,16754,16773,16798,16813,16824,16838,16840,16846,16876,16878,16882,16893,16901,16907,16920,16923,16924,16935,16942,16946,16957,16965,16966,16967,16971,16980,16990,16996,17000,17021,17025,17029,17034,17040,17042,17053,17055,17070,17072,17084,17086,17095,17110,17123,17145,17170,17191,17199,17200,17212,17215,17234,17262,17269,17282,17284,17291,17299,17326,17347,17353,17356,17361,17376,17377,17382,17385,17389,17402,17422,17428,17447,17451,17461,17466,17481,17486,17491,17495,17496,17507,17523,17536,17544,17549,17552,17557,17578,17583,17586,17588,17590,17595,17599,17607,17611,17618,17644,17645,17650,17659,17665,17671,17672,17676,17677,17685,17690,17692,17693,17694,17713,17715,17736,17740,17755,17771,17772,17777,17808,17849,17868,17871,17873,17876,17884,17890,17913,17927,17934,17935,17936,17940,17951,17968,17969,17971,17989,17995,18012,18035,18053,18063,18067,18076,18090,18096,18099,18114,18123,18127,18128,18130,18172,18187,18188,18192,18196,18212,18223,18225,18227,18242,18248,18256,18270,18273,18302,18309,18321,18360,18367,18379,18396,18402,18436,18451,18468,18484,18540,18546,18548,18549,18575,18576,18601,18613,18627,18630,18691,18715,18721,18724,18744,18745,18760,18774,18782,18788,18795,18810,18838,18852,18860,18865,18896,18900,18913,18917,18923,18931,18932,18935,18937,18940,18950,18977,18982,19012,19019,19031,19044,19045,19049,19050,19053,19065,19082,19108,19112,19118,19123,19126,19134,19145,19154,19169,19171,19189,19215,19220,19231,19233,19239,19240,19248,19274,19277,19291,19319,19334,19339,19343,19345,19355,19356,19369,19374,19385,19392,19393,19414,19422,19424,19456,19473,19478,19497,19503,19513,19534,19536,19545,19557,19566,19576,19578,19586,19589,19590,19604,19605,19608,19622,19629,19643,19656,19688,19695,19697,19700,19715,19719,19727,19744,19747,19750,19751,19758,19759,19778,19800,19806,19824,19841,19852,19862,19866,19868,19873,19885,19896,19904,19906,19921,19934,19937,19945,19947,19954,19959,19979,20000,20003,20005,20038,20043,20047,20066,20080,20083,20089,20090,20097,20113,20124,20142,20160,20162,20167,20190,20199,20209,20221,20232,20241,20254,20262,20266,20267,20286,20293,20298,20309,20315,20374,20376,20378,20380,20386,20396,20399,20416,20442,20443,20454,20478,20479,20502,20518,20540,20546,20547,20551,20579,20583,20601,20602,20606,20612,20630,20640,20641,20642,20647,20651,20654,20686,20687,20697,20702,20705,20711,20716,20726,20738,20741,20743,20750,20792,20797,20799,20801,20811,20821,20840,20842,20852,20856,20863,20872,20914,20922,20924,20941,20942,20945,20952,20957,20960,20968], + "signer_index":1 + }"#; + + fn golden_value() -> SingleSignature { + let mut rng = ChaCha20Rng::from_seed([0u8; 32]); + let msg = [0u8; 16]; + let params = Parameters { + m: 20973, + k: 2422, + phi_f: 0.2, + }; + let sk_1 = BlsSigningKey::generate(&mut rng); + let sk_2 = BlsSigningKey::generate(&mut rng); + let pk_1 = BlsVerificationKeyProofOfPossession::from(&sk_1); + let pk_2 = BlsVerificationKeyProofOfPossession::from(&sk_2); + let mut key_reg = KeyRegistration::init(); + key_reg.register(1, pk_1).unwrap(); + key_reg.register(1, pk_2).unwrap(); + let closed_key_reg: ClosedKeyRegistration = key_reg.close(); + let signer = Signer::set_signer(1, 1, params, sk_1, pk_1.vk, closed_key_reg); + signer.sign(&msg).unwrap() + } + + #[test] + fn golden_conversions() { + let value = serde_json::from_str(GOLDEN_JSON) + .expect("This JSON deserialization should not fail"); + assert_eq!(golden_value(), value); + + let serialized = + serde_json::to_string(&value).expect("This JSON serialization should not fail"); + let golden_serialized = serde_json::to_string(&golden_value()) + .expect("This JSON serialization should not fail"); + assert_eq!(golden_serialized, serialized); + } + } +}