encryption/manager/
asymmetric.rs1manager_facade! {
11 SignatureManager, crate::contract::Signer, "signer",
13 sign with sign_with(message: &[u8], private_key_hex: &str)
15 -> crate::error::Result<String>,
16 verify with verify_with(message: &[u8], signature_hex: &str, public_key_hex: &str)
17 -> crate::error::Result<()>,
18}
19
20manager_facade! {
21 KeyAgreementManager, crate::contract::KeyAgreement, "key agreement",
23 agree with agree_with(private_key_hex: &str, peer_public_key_hex: &str)
25 -> crate::error::Result<String>,
26}
27
28#[cfg(test)]
29mod tests {
30 use super::*;
31 use crate::asymmetric::ed25519::Ed25519Signer;
32 use crate::asymmetric::x25519::X25519Agreement;
33 use crate::contract::{KeyAgreement, Signer};
34 use crate::error::Error;
35 use crate::registry::Registry;
36
37 #[test]
39 fn signature_manager_round_trips_and_rejects_tampering() {
40 let mut registry: Registry<Box<dyn Signer>> = Registry::new("signer");
41 registry.register(Box::new(Ed25519Signer::new()));
42 let mut manager = SignatureManager::new(registry, Ed25519Signer::IDENTIFIER).unwrap();
43
44 let pair = Ed25519Signer::generate_key_pair_hex().unwrap();
45 let signature = manager.sign(b"message", &pair.private_key_hex).unwrap();
46 manager
47 .verify(b"message", &signature, &pair.public_key_hex)
48 .unwrap();
49 assert!(
50 manager
51 .verify(b"tampered", &signature, &pair.public_key_hex)
52 .is_err()
53 );
54
55 assert_eq!(
58 manager.set_default_identifier("missing").unwrap_err(),
59 Error::UnknownIdentifier {
60 kind: "signer",
61 identifier: "missing".to_string(),
62 }
63 );
64
65 let text = format!("{manager:?}");
67 assert!(text.contains("Registry"), "{text}");
68 assert!(!text.contains(&pair.private_key_hex), "{text}");
69 }
70
71 #[test]
73 fn key_agreement_manager_agrees_on_the_same_secret() {
74 let mut registry: Registry<Box<dyn KeyAgreement>> = Registry::new("key agreement");
75 registry.register(Box::new(X25519Agreement::new()));
76 let manager = KeyAgreementManager::new(registry, X25519Agreement::IDENTIFIER).unwrap();
77
78 let alice = X25519Agreement::generate_key_pair_hex().unwrap();
79 let bob = X25519Agreement::generate_key_pair_hex().unwrap();
80
81 let from_alice = manager
82 .agree(&alice.private_key_hex, &bob.public_key_hex)
83 .unwrap();
84 let from_bob = manager
85 .agree(&bob.private_key_hex, &alice.public_key_hex)
86 .unwrap();
87 assert_eq!(from_alice, from_bob);
88 }
89}