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    signed_messages: Mutex<VecDeque<Vec<u8>>>,
20}
21
22impl KesSignerFake {
23    /// Creates a new `KesSignerFake` instance.
24    pub fn new(results: Vec<KesSignatureResult>) -> Self {
25        Self {
26            results: Mutex::new(results.into()),
27            signed_messages: Mutex::new(VecDeque::new()),
28        }
29    }
30
31    /// Returns the messages that were requested to be signed
32    pub fn get_signed_messages(&self) -> Vec<Vec<u8>> {
33        let messages = self.signed_messages.lock().unwrap();
34        messages.iter().cloned().collect()
35    }
36
37    /// Returns a dummy signature result that is always successful.
38    pub fn dummy_signature(test_directory: &str) -> (Sum6KesSig, OpCert) {
39        let KesCryptographicMaterialForTest {
40            party_id: _,
41            operational_certificate_file,
42            kes_secret_key_file,
43        } = create_kes_cryptographic_material(
44            1 as KesPartyIndexForTest,
45            0 as KesPeriod,
46            &format!("{}-kes", test_directory),
47        );
48        let message = b"Test message for KES signing";
49        let kes_signer =
50            KesSignerStandard::new(kes_secret_key_file.clone(), operational_certificate_file);
51        let kes_signing_period = 1;
52        let (kes_signature, op_cert) = kes_signer
53            .sign(message, kes_signing_period)
54            .expect("Signing should not fail");
55
56        (kes_signature, op_cert)
57    }
58
59    /// Returns a dummy signature result that always fails.
60    pub fn dummy_signature_result_err() -> KesSignatureResult {
61        Err(anyhow::anyhow!("Dummy error"))
62    }
63}
64
65impl KesSigner for KesSignerFake {
66    fn sign(&self, message: &[u8], _kes_period: KesPeriod) -> KesSignatureResult {
67        let mut messages = self.signed_messages.lock().unwrap();
68        messages.push_back(message.to_vec());
69
70        let mut results = self.results.lock().unwrap();
71
72        results.pop_front().unwrap()
73    }
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    fn fake_kes_signer_returns_signature_batches_in_expected_order() {
82        let KesCryptographicMaterialForTest {
83            party_id: _,
84            operational_certificate_file,
85            kes_secret_key_file,
86        } = create_kes_cryptographic_material(
87            1 as KesPartyIndexForTest,
88            0 as KesPeriod,
89            "fake_kes_signer_returns_signature_batches_in_expected_order",
90        );
91        let message1 = b"Test message 1 for KES signing";
92        let kes_signer = KesSignerStandard::new(kes_secret_key_file, operational_certificate_file);
93        let kes_signing_period = 1;
94        let (kes_signature, op_cert) = kes_signer
95            .sign(message1, kes_signing_period)
96            .expect("Signing should not fail");
97        let fake_kes_signer = KesSignerFake::new(vec![
98            Ok((kes_signature, op_cert.clone())),
99            Err(anyhow::anyhow!("Fake error")),
100        ]);
101
102        let (kes_signature_1, op_cert_1) = fake_kes_signer
103            .sign(message1, kes_signing_period)
104            .expect("Signing should not fail");
105        assert_eq!(kes_signature, kes_signature_1);
106        assert_eq!(op_cert, op_cert_1);
107
108        let message2 = b"Test message 2 for KES signing";
109        fake_kes_signer
110            .sign(message2, kes_signing_period)
111            .expect_err("Signing should fail");
112
113        let signed_messages = fake_kes_signer.get_signed_messages();
114        assert_eq!(vec![message1.to_vec(), message2.to_vec()], signed_messages);
115    }
116}