diff --git a/src/protocol/initialize.rs b/src/protocol/initialize.rs index 2bea02a..97bfd4d 100644 --- a/src/protocol/initialize.rs +++ b/src/protocol/initialize.rs @@ -1,4 +1,7 @@ -use std::sync::Arc; +use std::{ + sync::Arc, + time::{SystemTime, UNIX_EPOCH}, +}; use axum::extract::ws::WebSocket; use ed25519_dalek::Signer; @@ -11,8 +14,10 @@ impl super::Client { pub async fn initialize(server: &Arc, mut socket: WebSocket) -> anyhow::Result { let Some(ServerMethod::Initialize { public_key: public_key_string, - timestamp, signature, + + timestamp, + hostname, }) = Client::read_socket(&mut socket).await? else { Client::send_socket( @@ -32,7 +37,7 @@ impl super::Client { if public_key .verify_strict( - format!("{public_key_string}@{timestamp}@").as_bytes(), + format!("{timestamp}@{hostname}").as_bytes(), &crate::signature::from_string_sig(&signature)?, ) .is_ok() @@ -40,17 +45,24 @@ impl super::Client { return Err(anyhow::anyhow!("Invalid signature")); } - Client::send_socket( - &mut socket, - ClientMethod::Initialized { - public_key: crate::signature::to_string(&server.key.verifying_key()), - signature: server - .key - .sign(format!("{public_key_string}@{timestamp}").as_bytes()) - .to_string(), - }, - ) - .await?; + { + let timestamp = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); + + Client::send_socket( + &mut socket, + ClientMethod::Initialized { + public_key: crate::signature::to_string(&server.key.verifying_key()), + signature: server + .key + .sign(format!("{timestamp}@{hostname}@{public_key_string}").as_bytes()) + .to_string(), + + timestamp, + hostname, + }, + ) + .await?; + } Ok(Self { socket, diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 4c517c9..efbb987 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -27,6 +27,9 @@ pub enum ClientMethod { Initialized { public_key: String, signature: String, + + timestamp: u64, + hostname: String, }, Error { @@ -39,8 +42,10 @@ pub enum ClientMethod { pub enum ServerMethod { Initialize { public_key: String, - timestamp: u64, signature: String, + + timestamp: u64, + hostname: String, }, Error {