From 92c5d2b1e233c03614e27cd0474e556b5f25cf02 Mon Sep 17 00:00:00 2001 From: orignal Date: Sun, 15 Mar 2026 17:43:26 -0400 Subject: [PATCH] send and handle incorrect version reason for retry message --- libi2pd/SSU2Session.cpp | 18 +++++++++++++++--- libi2pd/SSU2Session.h | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 621b400c..d3bde822 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -831,7 +831,14 @@ namespace transport if (header.h.flags[0] >= 2 && header.h.flags[0] <= 4) // ver { if (m_Version > 2) - SetVersion (header.h.flags[0]); + { + if (!SetVersion (header.h.flags[0])) + { + m_TerminationReason = eSSU2TerminationReasonIncompatibleVersion; + SendRetry (); + return; + } + } } else #else @@ -1583,6 +1590,8 @@ namespace transport } if (!m_NoiseState) m_NoiseState.reset (new i2p::crypto::NoiseSymmetricState); + if (m_TerminationReason == eSSU2TerminationReasonIncompatibleVersion) + m_Version = 2; // fallback to non-PQ #if OPENSSL_PQ if (m_Version > 2) InitNoiseXKStateMLKEM1 (*m_NoiseState, (i2p::data::CryptoKeyType)(m_Version + 2), m_Address->s); @@ -1590,6 +1599,7 @@ namespace transport #endif InitNoiseXKState1 (*m_NoiseState, m_Address->s); // reset Noise TODO: check state + m_TerminationReason = eSSU2TerminationReasonNormalClose; return SendSessionRequest (token); } @@ -1772,6 +1782,8 @@ namespace transport m_State = eSSU2SessionStateClosingConfirmed; Done (); } + else + m_TerminationReason = (SSU2TerminationReason)rsn; } else LogPrint(eLogWarning, "SSU2: Unexpected termination block size ", size); @@ -3408,7 +3420,7 @@ namespace transport return m_RemoteEndpoint.address ().is_v4 () ? i2p::data::RouterInfo::eSSU2V4 : i2p::data::RouterInfo::eSSU2V6; } - void SSU2Session::SetVersion (uint8_t version) + bool SSU2Session::SetVersion (uint8_t version) { switch (version) { @@ -3421,7 +3433,7 @@ namespace transport default: m_Version = 2; } - m_Version = (version >= 2 && version <= 4) ? version : 2; + return m_Version == version; } } } diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index c7801549..70170e05 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -248,7 +248,7 @@ namespace transport std::shared_ptr addr = nullptr); virtual ~SSU2Session (); - void SetVersion (uint8_t version); + bool SetVersion (uint8_t version); void SetRemoteEndpoint (const boost::asio::ip::udp::endpoint& ep) { m_RemoteEndpoint = ep; }; const boost::asio::ip::udp::endpoint& GetRemoteEndpoint () const { return m_RemoteEndpoint; }; i2p::data::RouterInfo::CompatibleTransports GetRemoteTransports () const { return m_RemoteTransports; };