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 signed_messages: Mutex<VecDeque<Vec<u8>>>,
20}
21
22impl KesSignerFake {
23 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 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 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 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}