mithril_common/test/crypto_helper/cardano/kes/
signer_fake.rs1use std::collections::VecDeque;
2
3use kes_summed_ed25519::kes::Sum6KesSig;
4use std::sync::Mutex;
5
6use crate::{
7 StdResult,
8 crypto_helper::{KesPeriod, KesSigner, KesSignerStandard, OpCert},
9 test::crypto_helper::{
10 KesCryptographicMaterialForTest, KesPartyIndexForTest, create_kes_cryptographic_material,
11 },
12};
13
14type KesSignatureResult = StdResult<(Sum6KesSig, OpCert)>;
15
16pub struct KesSignerFake {
18 results: Mutex<VecDeque<KesSignatureResult>>,
19}
20
21impl KesSignerFake {
22 pub fn new(results: Vec<KesSignatureResult>) -> Self {
24 Self {
25 results: Mutex::new(results.into()),
26 }
27 }
28
29 pub fn dummy_signature(test_directory: &str) -> (Sum6KesSig, OpCert) {
31 let KesCryptographicMaterialForTest {
32 party_id: _,
33 operational_certificate_file,
34 kes_secret_key_file,
35 } = create_kes_cryptographic_material(
36 1 as KesPartyIndexForTest,
37 0 as KesPeriod,
38 &format!("{}-kes", test_directory),
39 );
40 let message = b"Test message for KES signing";
41 let kes_signer =
42 KesSignerStandard::new(kes_secret_key_file.clone(), operational_certificate_file);
43 let kes_signing_period = 1;
44 let (kes_signature, op_cert) = kes_signer
45 .sign(message, kes_signing_period)
46 .expect("Signing should not fail");
47
48 (kes_signature, op_cert)
49 }
50
51 pub fn dummy_signature_result_err() -> KesSignatureResult {
53 Err(anyhow::anyhow!("Dummy error"))
54 }
55}
56
57impl KesSigner for KesSignerFake {
58 fn sign(&self, _message: &[u8], _kes_period: KesPeriod) -> KesSignatureResult {
59 let mut results = self.results.lock().unwrap();
60
61 results.pop_front().unwrap()
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn fake_kes_signer_returns_signature_batches_in_expected_order() {
71 let KesCryptographicMaterialForTest {
72 party_id: _,
73 operational_certificate_file,
74 kes_secret_key_file,
75 } = create_kes_cryptographic_material(
76 1 as KesPartyIndexForTest,
77 0 as KesPeriod,
78 "fake_kes_signer_returns_signature_batches_in_expected_order",
79 );
80 let message = b"Test message for KES signing";
81 let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
82 let kes_signing_period = 1;
83 let (kes_signature, op_cert) = kes_signer
84 .sign(message, kes_signing_period)
85 .expect("Signing should not fail");
86 let fake_kes_signer = KesSignerFake::new(vec![
87 Ok((kes_signature, op_cert.clone())),
88 Err(anyhow::anyhow!("Fake error")),
89 ]);
90
91 let (kes_signature_1, op_cert_1) = fake_kes_signer
92 .sign(message, kes_signing_period)
93 .expect("Signing should not fail");
94 assert_eq!(kes_signature, kes_signature_1);
95 assert_eq!(op_cert, op_cert_1);
96
97 fake_kes_signer
98 .sign(message, kes_signing_period)
99 .expect_err("Signing should fail");
100 }
101}