shuttle_core/crypto/
ecdh.rs

1//! Elliptic-curve Diffie–Hellman
2use sodiumoxide::crypto::scalarmult::curve25519;
3use crypto;
4
5/// EC secret key.
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct Curve25519Secret(pub [u8; 32]);
8
9impl Curve25519Secret {
10    /// Create a random secret key.
11    pub fn random() -> Curve25519Secret {
12        let seed = crypto::random_bytes(32);
13        let mut data = [0; 32];
14        data.copy_from_slice(&seed[..32]);
15        Curve25519Secret(data)
16    }
17}
18
19/// EC public key.
20#[derive(Debug, Clone, PartialEq, Eq)]
21pub struct Curve25519Public(pub [u8; 32]);
22
23impl Curve25519Public {
24    /// Create a public key, derived from the secret key.
25    pub fn derive_from_secret(secret: &Curve25519Secret) -> Curve25519Public {
26        let scalar = curve25519::Scalar(secret.0);
27        let group_element = curve25519::scalarmult_base(&scalar);
28        Curve25519Public(group_element.0)
29    }
30}