From 8f083ff91e218c8b6ecacc36342e38e5ae601b9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 20 May 2024 12:18:28 +0200 Subject: [PATCH] Add signatures to dynamic connect and disconect, and remove from response --- common/ip-packet-requests/src/v7/request.rs | 132 +++++++++++++------ common/ip-packet-requests/src/v7/response.rs | 13 -- 2 files changed, 90 insertions(+), 55 deletions(-) diff --git a/common/ip-packet-requests/src/v7/request.rs b/common/ip-packet-requests/src/v7/request.rs index b7cddc9215..c6730f391e 100644 --- a/common/ip-packet-requests/src/v7/request.rs +++ b/common/ip-packet-requests/src/v7/request.rs @@ -25,20 +25,19 @@ impl IpPacketRequest { buffer_timeout: Option, ) -> (Self, u64) { let request_id = generate_random(); - let request = StaticConnectRequest { - request_id, - ips, - reply_to, - reply_to_hops, - reply_to_avg_mix_delays, - buffer_timeout, - timestamp: OffsetDateTime::now_utc(), - }; ( Self { version: CURRENT_VERSION, data: IpPacketRequestData::StaticConnect(SignedStaticConnectRequest { - request, + request: StaticConnectRequest { + request_id, + ips, + reply_to, + reply_to_hops, + reply_to_avg_mix_delays, + buffer_timeout, + timestamp: OffsetDateTime::now_utc(), + }, signature: None, }), }, @@ -56,13 +55,16 @@ impl IpPacketRequest { ( Self { version: CURRENT_VERSION, - data: IpPacketRequestData::DynamicConnect(DynamicConnectRequest { - request_id, - reply_to, - reply_to_hops, - reply_to_avg_mix_delays, - buffer_timeout, - timestamp: OffsetDateTime::now_utc(), + data: IpPacketRequestData::DynamicConnect(SignedDynamicConnectRequest { + request: DynamicConnectRequest { + request_id, + reply_to, + reply_to_hops, + reply_to_avg_mix_delays, + buffer_timeout, + timestamp: OffsetDateTime::now_utc(), + }, + signature: None, }), }, request_id, @@ -74,10 +76,13 @@ impl IpPacketRequest { ( Self { version: CURRENT_VERSION, - data: IpPacketRequestData::Disconnect(DisconnectRequest { - request_id, - reply_to, - timestamp: OffsetDateTime::now_utc(), + data: IpPacketRequestData::Disconnect(SignedDisconnectRequest { + request: DisconnectRequest { + request_id, + reply_to, + timestamp: OffsetDateTime::now_utc(), + }, + signature: None, }), }, request_id, @@ -124,8 +129,8 @@ impl IpPacketRequest { pub fn id(&self) -> Option { match &self.data { IpPacketRequestData::StaticConnect(request) => Some(request.request.request_id), - IpPacketRequestData::DynamicConnect(request) => Some(request.request_id), - IpPacketRequestData::Disconnect(request) => Some(request.request_id), + IpPacketRequestData::DynamicConnect(request) => Some(request.request.request_id), + IpPacketRequestData::Disconnect(request) => Some(request.request.request_id), IpPacketRequestData::Data(_) => None, IpPacketRequestData::Ping(request) => Some(request.request_id), IpPacketRequestData::Health(request) => Some(request.request_id), @@ -135,8 +140,8 @@ impl IpPacketRequest { pub fn recipient(&self) -> Option<&Recipient> { match &self.data { IpPacketRequestData::StaticConnect(request) => Some(&request.request.reply_to), - IpPacketRequestData::DynamicConnect(request) => Some(&request.reply_to), - IpPacketRequestData::Disconnect(request) => Some(&request.reply_to), + IpPacketRequestData::DynamicConnect(request) => Some(&request.request.reply_to), + IpPacketRequestData::Disconnect(request) => Some(&request.request.reply_to), IpPacketRequestData::Data(_) => None, IpPacketRequestData::Ping(request) => Some(&request.reply_to), IpPacketRequestData::Health(request) => Some(&request.reply_to), @@ -160,25 +165,31 @@ impl IpPacketRequest { #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub enum IpPacketRequestData { StaticConnect(SignedStaticConnectRequest), - DynamicConnect(DynamicConnectRequest), - Disconnect(DisconnectRequest), + DynamicConnect(SignedDynamicConnectRequest), + Disconnect(SignedDisconnectRequest), Data(DataRequest), Ping(PingRequest), Health(HealthRequest), } impl IpPacketRequestData { - pub fn to_bytes(&self) -> Result, bincode::Error> { - use bincode::Options; - make_bincode_serializer().serialize(self) - } - - pub fn add_signature(&mut self, signature: Vec) { + pub fn add_signature(&mut self, signature: Vec) -> Option> { match self { IpPacketRequestData::StaticConnect(request) => { request.signature = Some(signature); + request.signature.clone() } - _ => panic!("Attempted to sign a non-signable request"), + IpPacketRequestData::DynamicConnect(request) => { + request.signature = Some(signature); + request.signature.clone() + } + IpPacketRequestData::Disconnect(request) => { + request.signature = Some(signature); + request.signature.clone() + } + IpPacketRequestData::Data(_) + | IpPacketRequestData::Ping(_) + | IpPacketRequestData::Health(_) => None, } } } @@ -210,6 +221,13 @@ pub struct StaticConnectRequest { pub timestamp: OffsetDateTime, } +impl StaticConnectRequest { + pub fn to_bytes(&self) -> Result, bincode::Error> { + use bincode::Options; + make_bincode_serializer().serialize(self) + } +} + #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct SignedStaticConnectRequest { pub request: StaticConnectRequest, @@ -241,6 +259,19 @@ pub struct DynamicConnectRequest { pub timestamp: OffsetDateTime, } +impl DynamicConnectRequest { + pub fn to_bytes(&self) -> Result, bincode::Error> { + use bincode::Options; + make_bincode_serializer().serialize(self) + } +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct SignedDynamicConnectRequest { + pub request: DynamicConnectRequest, + pub signature: Option>, +} + // A disconnect request is when the client wants to disconnect from the ip packet router and free // up the allocated IP address. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] @@ -254,6 +285,19 @@ pub struct DisconnectRequest { pub timestamp: OffsetDateTime, } +impl DisconnectRequest { + pub fn to_bytes(&self) -> Result, bincode::Error> { + use bincode::Options; + make_bincode_serializer().serialize(self) + } +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct SignedDisconnectRequest { + pub request: DisconnectRequest, + pub signature: Option>, +} + // A data request is when the client wants to send an IP packet to a destination. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct DataRequest { @@ -294,14 +338,18 @@ mod tests { let connect = IpPacketRequest { version: 4, data: IpPacketRequestData::StaticConnect( - StaticConnectRequest { - request_id: 123, - ips: IpPair::new(Ipv4Addr::from_str("10.0.0.1").unwrap(), Ipv6Addr::from_str("2001:db8:a160::1").unwrap()), - reply_to: Recipient::try_from_base58_string("D1rrpsysCGCYXy9saP8y3kmNpGtJZUXN9SvFoUcqAsM9.9Ssso1ea5NfkbMASdiseDSjTN1fSWda5SgEVjdSN4CvV@GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN").unwrap(), - reply_to_hops: None, - reply_to_avg_mix_delays: None, - buffer_timeout: None, - }, + SignedStaticConnectRequest { + request: StaticConnectRequest { + request_id: 123, + ips: IpPair::new(Ipv4Addr::from_str("10.0.0.1").unwrap(), Ipv6Addr::from_str("2001:db8:a160::1").unwrap()), + reply_to: Recipient::try_from_base58_string("D1rrpsysCGCYXy9saP8y3kmNpGtJZUXN9SvFoUcqAsM9.9Ssso1ea5NfkbMASdiseDSjTN1fSWda5SgEVjdSN4CvV@GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN").unwrap(), + reply_to_hops: None, + reply_to_avg_mix_delays: None, + buffer_timeout: None, + timestamp: OffsetDateTime::now_utc(), + }, + signature: None, + } ), }; assert_eq!(connect.to_bytes().unwrap().len(), 123); diff --git a/common/ip-packet-requests/src/v7/response.rs b/common/ip-packet-requests/src/v7/response.rs index d3e6a01cef..13312dc5cd 100644 --- a/common/ip-packet-requests/src/v7/response.rs +++ b/common/ip-packet-requests/src/v7/response.rs @@ -7,7 +7,6 @@ use crate::{make_bincode_serializer, IpPair, CURRENT_VERSION}; pub struct IpPacketResponse { pub version: u8, pub data: IpPacketResponseData, - pub signature: Option>, } impl IpPacketResponse { @@ -19,7 +18,6 @@ impl IpPacketResponse { reply_to, reply: StaticConnectResponseReply::Success, }), - signature: None, } } @@ -35,7 +33,6 @@ impl IpPacketResponse { reply_to, reply: StaticConnectResponseReply::Failure(reason), }), - signature: None, } } @@ -47,7 +44,6 @@ impl IpPacketResponse { reply_to, reply: DynamicConnectResponseReply::Success(DynamicConnectSuccess { ips }), }), - signature: None, } } @@ -63,7 +59,6 @@ impl IpPacketResponse { reply_to, reply: DynamicConnectResponseReply::Failure(reason), }), - signature: None, } } @@ -75,7 +70,6 @@ impl IpPacketResponse { reply_to, reply: DisconnectResponseReply::Success, }), - signature: None, } } @@ -91,7 +85,6 @@ impl IpPacketResponse { reply_to, reply: DisconnectResponseReply::Failure(reason), }), - signature: None, } } @@ -105,7 +98,6 @@ impl IpPacketResponse { reply_to, reason, }), - signature: None, } } @@ -113,7 +105,6 @@ impl IpPacketResponse { Self { version: CURRENT_VERSION, data: IpPacketResponseData::Data(DataResponse { ip_packet }), - signature: None, } } @@ -134,7 +125,6 @@ impl IpPacketResponse { }, level: InfoLevel::Error, }), - signature: None, } } @@ -151,7 +141,6 @@ impl IpPacketResponse { reply, level, }), - signature: None, } } @@ -162,7 +151,6 @@ impl IpPacketResponse { request_id, reply_to, }), - signature: None, } } @@ -182,7 +170,6 @@ impl IpPacketResponse { routable, }, }), - signature: None, } }