manager_facade! {
SignatureManager, crate::contract::Signer, "signer",
sign with sign_with(message: &[u8], private_key_hex: &str)
-> crate::error::Result<String>,
verify with verify_with(message: &[u8], signature_hex: &str, public_key_hex: &str)
-> crate::error::Result<()>,
}
manager_facade! {
KeyAgreementManager, crate::contract::KeyAgreement, "key agreement",
agree with agree_with(private_key_hex: &str, peer_public_key_hex: &str)
-> crate::error::Result<String>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::asymmetric::ed25519::Ed25519Signer;
use crate::asymmetric::x25519::X25519Agreement;
use crate::contract::{KeyAgreement, Signer};
use crate::error::Error;
use crate::registry::Registry;
#[test]
fn signature_manager_round_trips_and_rejects_tampering() {
let mut registry: Registry<Box<dyn Signer>> = Registry::new("signer");
registry.register(Box::new(Ed25519Signer::new()));
let mut manager = SignatureManager::new(registry, Ed25519Signer::IDENTIFIER).unwrap();
let pair = Ed25519Signer::generate_key_pair_hex().unwrap();
let signature = manager.sign(b"message", &pair.private_key_hex).unwrap();
manager
.verify(b"message", &signature, &pair.public_key_hex)
.unwrap();
assert!(
manager
.verify(b"tampered", &signature, &pair.public_key_hex)
.is_err()
);
assert_eq!(
manager.set_default_identifier("missing").unwrap_err(),
Error::UnknownIdentifier {
kind: "signer",
identifier: "missing".to_string(),
}
);
let text = format!("{manager:?}");
assert!(text.contains("Registry"), "{text}");
assert!(!text.contains(&pair.private_key_hex), "{text}");
}
#[test]
fn key_agreement_manager_agrees_on_the_same_secret() {
let mut registry: Registry<Box<dyn KeyAgreement>> = Registry::new("key agreement");
registry.register(Box::new(X25519Agreement::new()));
let manager = KeyAgreementManager::new(registry, X25519Agreement::IDENTIFIER).unwrap();
let alice = X25519Agreement::generate_key_pair_hex().unwrap();
let bob = X25519Agreement::generate_key_pair_hex().unwrap();
let from_alice = manager
.agree(&alice.private_key_hex, &bob.public_key_hex)
.unwrap();
let from_bob = manager
.agree(&bob.private_key_hex, &alice.public_key_hex)
.unwrap();
assert_eq!(from_alice, from_bob);
}
}