mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2024-11-10 01:10:32 +00:00
use std::mt19937 instead rand(). termination timeout variance
This commit is contained in:
parent
a69eade1f4
commit
66223792f3
@ -108,10 +108,10 @@ namespace transport
|
|||||||
m_EphemeralKeys = i2p::transport::transports.GetNextX25519KeysPair ();
|
m_EphemeralKeys = i2p::transport::transports.GetNextX25519KeysPair ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NTCP2Establisher::CreateSessionRequestMessage ()
|
void NTCP2Establisher::CreateSessionRequestMessage (std::mt19937& rng)
|
||||||
{
|
{
|
||||||
// create buffer and fill padding
|
// create buffer and fill padding
|
||||||
auto paddingLength = rand () % (NTCP2_SESSION_REQUEST_MAX_SIZE - 64); // message length doesn't exceed 287 bytes
|
auto paddingLength = rng () % (NTCP2_SESSION_REQUEST_MAX_SIZE - 64); // message length doesn't exceed 287 bytes
|
||||||
m_SessionRequestBufferLen = paddingLength + 64;
|
m_SessionRequestBufferLen = paddingLength + 64;
|
||||||
RAND_bytes (m_SessionRequestBuffer + 64, paddingLength);
|
RAND_bytes (m_SessionRequestBuffer + 64, paddingLength);
|
||||||
// encrypt X
|
// encrypt X
|
||||||
@ -149,9 +149,9 @@ namespace transport
|
|||||||
i2p::crypto::AEADChaCha20Poly1305 (options, 16, GetH (), 32, GetK (), nonce, m_SessionRequestBuffer + 32, 32, true); // encrypt
|
i2p::crypto::AEADChaCha20Poly1305 (options, 16, GetH (), 32, GetK (), nonce, m_SessionRequestBuffer + 32, 32, true); // encrypt
|
||||||
}
|
}
|
||||||
|
|
||||||
void NTCP2Establisher::CreateSessionCreatedMessage ()
|
void NTCP2Establisher::CreateSessionCreatedMessage (std::mt19937& rng)
|
||||||
{
|
{
|
||||||
auto paddingLen = rand () % (NTCP2_SESSION_CREATED_MAX_SIZE - 64);
|
auto paddingLen = rng () % (NTCP2_SESSION_CREATED_MAX_SIZE - 64);
|
||||||
m_SessionCreatedBufferLen = paddingLen + 64;
|
m_SessionCreatedBufferLen = paddingLen + 64;
|
||||||
RAND_bytes (m_SessionCreatedBuffer + 64, paddingLen);
|
RAND_bytes (m_SessionCreatedBuffer + 64, paddingLen);
|
||||||
// encrypt Y
|
// encrypt Y
|
||||||
@ -349,7 +349,7 @@ namespace transport
|
|||||||
LogPrint (eLogWarning, "NTCP2: Missing NTCP2 address");
|
LogPrint (eLogWarning, "NTCP2: Missing NTCP2 address");
|
||||||
}
|
}
|
||||||
m_NextRouterInfoResendTime = i2p::util::GetSecondsSinceEpoch () + NTCP2_ROUTERINFO_RESEND_INTERVAL +
|
m_NextRouterInfoResendTime = i2p::util::GetSecondsSinceEpoch () + NTCP2_ROUTERINFO_RESEND_INTERVAL +
|
||||||
rand ()%NTCP2_ROUTERINFO_RESEND_INTERVAL_THRESHOLD;
|
m_Server.GetRng ()() % NTCP2_ROUTERINFO_RESEND_INTERVAL_THRESHOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTCP2Session::~NTCP2Session ()
|
NTCP2Session::~NTCP2Session ()
|
||||||
@ -411,7 +411,7 @@ namespace transport
|
|||||||
{
|
{
|
||||||
m_IsEstablished = true;
|
m_IsEstablished = true;
|
||||||
m_Establisher.reset (nullptr);
|
m_Establisher.reset (nullptr);
|
||||||
SetTerminationTimeout (NTCP2_TERMINATION_TIMEOUT);
|
SetTerminationTimeout (NTCP2_TERMINATION_TIMEOUT + m_Server.GetRng ()() % NTCP2_TERMINATION_TIMEOUT_VARIANCE);
|
||||||
SendQueue ();
|
SendQueue ();
|
||||||
transports.PeerConnected (shared_from_this ());
|
transports.PeerConnected (shared_from_this ());
|
||||||
}
|
}
|
||||||
@ -464,7 +464,7 @@ namespace transport
|
|||||||
|
|
||||||
void NTCP2Session::SendSessionRequest ()
|
void NTCP2Session::SendSessionRequest ()
|
||||||
{
|
{
|
||||||
m_Establisher->CreateSessionRequestMessage ();
|
m_Establisher->CreateSessionRequestMessage (m_Server.GetRng ());
|
||||||
// send message
|
// send message
|
||||||
m_HandshakeInterval = i2p::util::GetMillisecondsSinceEpoch ();
|
m_HandshakeInterval = i2p::util::GetMillisecondsSinceEpoch ();
|
||||||
boost::asio::async_write (m_Socket, boost::asio::buffer (m_Establisher->m_SessionRequestBuffer, m_Establisher->m_SessionRequestBufferLen), boost::asio::transfer_all (),
|
boost::asio::async_write (m_Socket, boost::asio::buffer (m_Establisher->m_SessionRequestBuffer, m_Establisher->m_SessionRequestBufferLen), boost::asio::transfer_all (),
|
||||||
@ -542,7 +542,7 @@ namespace transport
|
|||||||
|
|
||||||
void NTCP2Session::SendSessionCreated ()
|
void NTCP2Session::SendSessionCreated ()
|
||||||
{
|
{
|
||||||
m_Establisher->CreateSessionCreatedMessage ();
|
m_Establisher->CreateSessionCreatedMessage (m_Server.GetRng ());
|
||||||
// send message
|
// send message
|
||||||
m_HandshakeInterval = i2p::util::GetMillisecondsSinceEpoch ();
|
m_HandshakeInterval = i2p::util::GetMillisecondsSinceEpoch ();
|
||||||
boost::asio::async_write (m_Socket, boost::asio::buffer (m_Establisher->m_SessionCreatedBuffer, m_Establisher->m_SessionCreatedBufferLen), boost::asio::transfer_all (),
|
boost::asio::async_write (m_Socket, boost::asio::buffer (m_Establisher->m_SessionCreatedBuffer, m_Establisher->m_SessionCreatedBufferLen), boost::asio::transfer_all (),
|
||||||
@ -1121,7 +1121,7 @@ namespace transport
|
|||||||
if (GetLastActivityTimestamp () > m_NextRouterInfoResendTime)
|
if (GetLastActivityTimestamp () > m_NextRouterInfoResendTime)
|
||||||
{
|
{
|
||||||
m_NextRouterInfoResendTime += NTCP2_ROUTERINFO_RESEND_INTERVAL +
|
m_NextRouterInfoResendTime += NTCP2_ROUTERINFO_RESEND_INTERVAL +
|
||||||
rand ()%NTCP2_ROUTERINFO_RESEND_INTERVAL_THRESHOLD;
|
m_Server.GetRng ()() % NTCP2_ROUTERINFO_RESEND_INTERVAL_THRESHOLD;
|
||||||
SendRouterInfo ();
|
SendRouterInfo ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1298,7 +1298,8 @@ namespace transport
|
|||||||
|
|
||||||
NTCP2Server::NTCP2Server ():
|
NTCP2Server::NTCP2Server ():
|
||||||
RunnableServiceWithWork ("NTCP2"), m_TerminationTimer (GetService ()),
|
RunnableServiceWithWork ("NTCP2"), m_TerminationTimer (GetService ()),
|
||||||
m_ProxyType(eNoProxy), m_Resolver(GetService ())
|
m_ProxyType(eNoProxy), m_Resolver(GetService ()),
|
||||||
|
m_Rng(i2p::util::GetMonotonicMicroseconds ()%1000000LL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <random>
|
||||||
#include <openssl/bn.h>
|
#include <openssl/bn.h>
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
@ -35,7 +36,8 @@ namespace transport
|
|||||||
|
|
||||||
const int NTCP2_CONNECT_TIMEOUT = 5; // 5 seconds
|
const int NTCP2_CONNECT_TIMEOUT = 5; // 5 seconds
|
||||||
const int NTCP2_ESTABLISH_TIMEOUT = 10; // 10 seconds
|
const int NTCP2_ESTABLISH_TIMEOUT = 10; // 10 seconds
|
||||||
const int NTCP2_TERMINATION_TIMEOUT = 120; // 2 minutes
|
const int NTCP2_TERMINATION_TIMEOUT = 115; // 2 minutes - 5 seconds
|
||||||
|
const int NTCP2_TERMINATION_TIMEOUT_VARIANCE = 10; // 10 seconds
|
||||||
const int NTCP2_TERMINATION_CHECK_TIMEOUT = 30; // 30 seconds
|
const int NTCP2_TERMINATION_CHECK_TIMEOUT = 30; // 30 seconds
|
||||||
const int NTCP2_RECEIVE_BUFFER_DELETION_TIMEOUT = 3; // 3 seconds
|
const int NTCP2_RECEIVE_BUFFER_DELETION_TIMEOUT = 3; // 3 seconds
|
||||||
const int NTCP2_ROUTERINFO_RESEND_INTERVAL = 25*60; // 25 minuntes in seconds
|
const int NTCP2_ROUTERINFO_RESEND_INTERVAL = 25*60; // 25 minuntes in seconds
|
||||||
@ -103,8 +105,8 @@ namespace transport
|
|||||||
void KeyDerivationFunction2 (const uint8_t * sessionRequest, size_t sessionRequestLen, const uint8_t * epub); // for SessionCreate
|
void KeyDerivationFunction2 (const uint8_t * sessionRequest, size_t sessionRequestLen, const uint8_t * epub); // for SessionCreate
|
||||||
void CreateEphemeralKey ();
|
void CreateEphemeralKey ();
|
||||||
|
|
||||||
void CreateSessionRequestMessage ();
|
void CreateSessionRequestMessage (std::mt19937& rng);
|
||||||
void CreateSessionCreatedMessage ();
|
void CreateSessionCreatedMessage (std::mt19937& rng);
|
||||||
void CreateSessionConfirmedMessagePart1 (const uint8_t * nonce);
|
void CreateSessionConfirmedMessagePart1 (const uint8_t * nonce);
|
||||||
void CreateSessionConfirmedMessagePart2 (const uint8_t * nonce);
|
void CreateSessionConfirmedMessagePart2 (const uint8_t * nonce);
|
||||||
|
|
||||||
@ -248,6 +250,7 @@ namespace transport
|
|||||||
void Start ();
|
void Start ();
|
||||||
void Stop ();
|
void Stop ();
|
||||||
boost::asio::io_service& GetService () { return GetIOService (); };
|
boost::asio::io_service& GetService () { return GetIOService (); };
|
||||||
|
std::mt19937& GetRng () { return m_Rng; };
|
||||||
|
|
||||||
bool AddNTCP2Session (std::shared_ptr<NTCP2Session> session, bool incoming = false);
|
bool AddNTCP2Session (std::shared_ptr<NTCP2Session> session, bool incoming = false);
|
||||||
void RemoveNTCP2Session (std::shared_ptr<NTCP2Session> session);
|
void RemoveNTCP2Session (std::shared_ptr<NTCP2Session> session);
|
||||||
@ -286,6 +289,7 @@ namespace transport
|
|||||||
boost::asio::ip::tcp::resolver m_Resolver;
|
boost::asio::ip::tcp::resolver m_Resolver;
|
||||||
std::unique_ptr<boost::asio::ip::tcp::endpoint> m_ProxyEndpoint;
|
std::unique_ptr<boost::asio::ip::tcp::endpoint> m_ProxyEndpoint;
|
||||||
std::shared_ptr<boost::asio::ip::tcp::endpoint> m_Address4, m_Address6, m_YggdrasilAddress;
|
std::shared_ptr<boost::asio::ip::tcp::endpoint> m_Address4, m_Address6, m_YggdrasilAddress;
|
||||||
|
std::mt19937 m_Rng;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user