1pub mod curve;
2mod ecdh;
3
4pub use ecdh::{Ecdh, EcdhError, EllipticCurve};
5
6pub trait KeyExchange {
7 type Error;
8
9 fn key_exchange<T: AsRef<[u8]>>(&self, public: T, hash: bool) -> Result<Vec<u8>, Self::Error>;
10}
11
12#[cfg(test)]
13mod tests {
14 use super::*;
15
16 #[test]
17 fn test_ecdh_k192() -> Result<(), EcdhError> {
18 let curve_k192 = curve::SECP192K1;
19 let alice = Ecdh::new(curve_k192.clone())?;
20 let alice_public_key = alice.pack_public(false);
21 let bob = Ecdh::new(curve_k192.clone())?;
22 let bob_public_key = bob.pack_public(false);
23 let shared_by_alice = alice.key_exchange(bob_public_key, false)?;
24 let shared_by_bob = bob.key_exchange(alice_public_key, false)?;
25 assert_eq!(shared_by_alice, shared_by_bob);
26 Ok(())
27 }
28
29 #[test]
30 fn test_ecdh_p256() -> Result<(), EcdhError> {
31 let curve_p256 = curve::PRIME256V1;
32 let alice = Ecdh::new(curve_p256.clone())?;
33 let alice_public_key = alice.pack_public(false);
34 let bob = Ecdh::new(curve_p256.clone())?;
35 let bob_public_key = bob.pack_public(false);
36 let shared_by_alice = alice.key_exchange(bob_public_key, false)?;
37 let shared_by_bob = bob.key_exchange(alice_public_key, false)?;
38 assert_eq!(shared_by_alice, shared_by_bob);
39 Ok(())
40 }
41}