simple_ecdh/
lib.rs

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}