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() -> (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            "fake_kes_signer_returns_signature_batches_in_expected_order",
39        );
40        let message = b"Test message for KES signing";
41        let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
42        let kes_signing_period = 1;
43        let (kes_signature, op_cert) = kes_signer
44            .sign(message, kes_signing_period)
45            .expect("Signing should not fail");
46
47        (kes_signature, op_cert)
48    }
49
50    /// Returns a dummy signature result that always fails.
51    pub fn dummy_signature_result_err() -> KesSignatureResult {
52        Err(anyhow::anyhow!("Dummy error"))
53    }
54}
55
56impl KesSigner for KesSignerFake {
57    fn sign(&self, _message: &[u8], _kes_period: KesPeriod) -> KesSignatureResult {
58        let mut results = self.results.lock().unwrap();
59
60        results.pop_front().unwrap()
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn fake_kes_signer_returns_signature_batches_in_expected_order() {
70        let KesCryptographicMaterialForTest {
71            party_id: _,
72            operational_certificate_file,
73            kes_secret_key_file,
74        } = create_kes_cryptographic_material(
75            1 as KesPartyIndexForTest,
76            0 as KesPeriod,
77            "fake_kes_signer_returns_signature_batches_in_expected_order",
78        );
79        let message = b"Test message for KES signing";
80        let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
81        let kes_signing_period = 1;
82        let (kes_signature, op_cert) = kes_signer
83            .sign(message, kes_signing_period)
84            .expect("Signing should not fail");
85        let fake_kes_signer = KesSignerFake::new(vec![
86            Ok((kes_signature, op_cert.clone())),
87            Err(anyhow::anyhow!("Fake error")),
88        ]);
89
90        let (kes_signature_1, op_cert_1) = fake_kes_signer
91            .sign(message, kes_signing_period)
92            .expect("Signing should not fail");
93        assert_eq!(kes_signature, kes_signature_1);
94        assert_eq!(op_cert, op_cert_1);
95
96        fake_kes_signer
97            .sign(message, kes_signing_period)
98            .expect_err("Signing should fail");
99    }
100}