vcl_protocol/
handshake.rs1use x25519_dalek::{EphemeralSecret, PublicKey, SharedSecret};
2use rand::rngs::OsRng;
3use serde::{Serialize, Deserialize};
4
5#[derive(Serialize, Deserialize, Clone, Debug)]
6pub enum HandshakeMessage {
7 ClientHello { public_key: [u8; 32] },
8 ServerHello { public_key: [u8; 32] },
9 Ack,
10}
11
12#[allow(dead_code)]
13pub struct HandshakeState {
14 shared_secret: Option<[u8; 32]>,
15}
16
17#[allow(dead_code)]
18impl HandshakeState {
19 pub fn new() -> Self {
20 HandshakeState { shared_secret: None }
21 }
22
23 pub fn get_shared_secret(&self) -> Option<[u8; 32]> {
24 self.shared_secret
25 }
26
27 pub fn set_shared_secret(&mut self, secret: [u8; 32]) {
28 self.shared_secret = Some(secret);
29 }
30
31 pub fn is_complete(&self) -> bool {
32 self.shared_secret.is_some()
33 }
34}
35
36pub fn create_client_hello() -> (HandshakeMessage, EphemeralSecret) {
37 let ephemeral = EphemeralSecret::random_from_rng(OsRng);
38 let public = PublicKey::from(&ephemeral);
39 let msg = HandshakeMessage::ClientHello {
40 public_key: public.to_bytes(),
41 };
42 (msg, ephemeral)
43}
44
45pub fn process_client_hello(
46 ephemeral: EphemeralSecret,
47 client_public: [u8; 32],
48) -> (HandshakeMessage, Option<[u8; 32]>) {
49 let server_public = PublicKey::from(&ephemeral);
50 let client_pk = PublicKey::from(client_public);
51 let shared: SharedSecret = ephemeral.diffie_hellman(&client_pk);
52 let msg = HandshakeMessage::ServerHello {
53 public_key: server_public.to_bytes(),
54 };
55 (msg, Some(shared.to_bytes()))
56}
57
58pub fn process_server_hello(ephemeral: EphemeralSecret, server_public: [u8; 32]) -> Option<[u8; 32]> {
59 let server_pk = PublicKey::from(server_public);
60 let shared: SharedSecret = ephemeral.diffie_hellman(&server_pk);
61 Some(shared.to_bytes())
62}