mithril_common/test/crypto_helper/cardano/kes/
signer_fake.rs

1use 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
16/// Fake KES Signer implementation.
17pub struct KesSignerFake {
18    results: Mutex<VecDeque<KesSignatureResult>>,
19}
20
21impl KesSignerFake {
22    /// Creates a new `KesSignerFake` instance.
23    pub fn new(results: Vec<KesSignatureResult>) -> Self {
24        Self {
25            results: Mutex::new(results.into()),
26        }
27    }
28
29    /// Returns a dummy signature result that is always successful.
30    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    /// Returns a dummy signature result that always fails.
52    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}