From b04d3ba3760eddc16ac8bd0dc38edc8f0a45c569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Fri, 25 Apr 2025 11:02:32 +0200 Subject: [PATCH] add reserved byte to reply surb serialisation (#5731) --- .../anonymous-replies/src/reply_surb.rs | 7 ------- .../anonymous-replies/src/requests/v2.rs | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/common/nymsphinx/anonymous-replies/src/reply_surb.rs b/common/nymsphinx/anonymous-replies/src/reply_surb.rs index a9e7dc76a1..821c0c022b 100644 --- a/common/nymsphinx/anonymous-replies/src/reply_surb.rs +++ b/common/nymsphinx/anonymous-replies/src/reply_surb.rs @@ -9,7 +9,6 @@ use nym_sphinx_addressing::nodes::{ }; use nym_sphinx_params::packet_sizes::PacketSize; use nym_sphinx_params::{PacketType, ReplySurbKeyDigestAlgorithm}; -use nym_sphinx_types::constants::PAYLOAD_KEY_SEED_SIZE; use nym_sphinx_types::{ NymPacket, SURBMaterial, SphinxError, HEADER_SIZE, NODE_ADDRESS_LENGTH, SURB, X25519_WITH_EXPLICIT_PAYLOAD_KEYS_VERSION, @@ -127,12 +126,6 @@ impl ReplySurb { }) } - /// Returns the expected number of bytes the [`ReplySURB`] will take after serialization using the new encoding format. - /// Useful for deserialization from a bytes stream. - pub fn v2_serialised_len(num_hops: u8) -> usize { - Self::BASE_OVERHEAD + num_hops as usize * PAYLOAD_KEY_SEED_SIZE - } - pub fn encryption_key(&self) -> &SurbEncryptionKey { &self.encryption_key } diff --git a/common/nymsphinx/anonymous-replies/src/requests/v2.rs b/common/nymsphinx/anonymous-replies/src/requests/v2.rs index 813fabc276..6d624455d9 100644 --- a/common/nymsphinx/anonymous-replies/src/requests/v2.rs +++ b/common/nymsphinx/anonymous-replies/src/requests/v2.rs @@ -32,24 +32,28 @@ fn v2_reply_surbs_serialised_len(surbs: &[ReplySurb]) -> usize { } } - // when serialising surbs are always prepended with u16-encoded count an u8-encoded number of hops - 3 + num_surbs * v2_reply_surb_serialised_len(num_hops) + // when serialising surbs are always prepended with: + // - u16-encoded count, + // - u8-encoded number of hops + // - u8 reserved value + 4 + num_surbs * v2_reply_surb_serialised_len(num_hops) } -// NUM_SURBS (u16) || HOPS (u8) || SURB_DATA +// NUM_SURBS (u16) || HOPS (u8) || RESERVED (u8) || SURB_DATA fn recover_reply_surbs_v2( bytes: &[u8], ) -> Result<(Vec, usize), InvalidReplyRequestError> { - if bytes.len() < 2 { + if bytes.len() < 4 { return Err(InvalidReplyRequestError::RequestTooShortToDeserialize); } // we're not attaching more than 65k surbs... let num_surbs = u16::from_be_bytes([bytes[0], bytes[1]]); let num_hops = bytes[2]; - let mut consumed = 3; + let _reserved = bytes[3]; + let mut consumed = 4; - let surb_size = ReplySurb::v2_serialised_len(num_hops); + let surb_size = v2_reply_surb_serialised_len(num_hops); if bytes[consumed..].len() < num_surbs as usize * surb_size { return Err(InvalidReplyRequestError::RequestTooShortToDeserialize); } @@ -69,11 +73,13 @@ fn recover_reply_surbs_v2( fn reply_surbs_bytes_v2(reply_surbs: &[ReplySurb]) -> impl Iterator + use<'_> { let num_surbs = reply_surbs.len() as u16; let num_hops = reply_surbs_hops(reply_surbs); + let reserved = 0; num_surbs .to_be_bytes() .into_iter() .chain(once(num_hops)) + .chain(once(reserved)) .chain(reply_surbs.iter().flat_map(|surb| surb.to_bytes())) }