From a1460b0a2861d5bb34ba25d409b234468f269e4e Mon Sep 17 00:00:00 2001 From: tv Date: Sat, 24 Oct 2026 03:19:28 +0200 Subject: use nonce in handshake To prevent stale hello replies to cause joins and thus stale sessions, each run gets a random ID, which used as nonce in the handshake. --- src/transport/mycelium.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/transport/mycelium.rs') diff --git a/src/transport/mycelium.rs b/src/transport/mycelium.rs index 4c03839..51bbfab 100644 --- a/src/transport/mycelium.rs +++ b/src/transport/mycelium.rs @@ -877,6 +877,7 @@ pub struct HelloRequestShadow { epoch: EpochShadow, auth: ByteBuf, ready: bool, + run_id: ByteBuf, } #[derive(Serialize, Deserialize)] @@ -890,6 +891,7 @@ pub struct HelloReplyShadow<'a> { #[serde(default)] auth: ByteBuf, ready: bool, + run_id: ByteBuf, } #[derive(Serialize, Deserialize)] @@ -940,6 +942,7 @@ pub fn hello_request_to_bytes(msg: &HelloRequest) -> Result, rmp_serde:: epoch: epoch_to_shadow(&msg.epoch), auth: ByteBuf::from(msg.auth.clone()), ready: msg.ready, + run_id: ByteBuf::from(msg.run_id.to_vec()), }) } pub fn bytes_to_hello_request(bytes: &[u8]) -> Result { @@ -949,9 +952,17 @@ pub fn bytes_to_hello_request(bytes: &[u8]) -> Result Result { + bytes + .as_slice() + .try_into() + .map_err(|_| TransportError::InvalidPayload("run id must be 16 bytes".into())) +} + // --- HelloReply --- pub fn hello_reply_to_bytes(msg: &HelloReply) -> Result, rmp_serde::encode::Error> { let shadow = HelloReplyShadow { @@ -960,6 +971,7 @@ pub fn hello_reply_to_bytes(msg: &HelloReply) -> Result, rmp_serde::enco epoch: epoch_to_shadow(&msg.epoch), auth: ByteBuf::from(msg.auth.clone()), ready: msg.ready, + run_id: ByteBuf::from(msg.run_id.to_vec()), }; rmp_serde::to_vec(&shadow) } @@ -971,6 +983,7 @@ pub fn bytes_to_hello_reply(bytes: &[u8]) -> Result epoch: epoch_from_shadow(shadow.epoch)?, auth: shadow.auth.into_vec(), ready: shadow.ready, + run_id: run_id_from_shadow(&shadow.run_id)?, }) } -- cgit v1.3.1