Browse Source

create DH keys for SSU session directly

pull/1564/head
orignal 4 years ago
parent
commit
acc5592f59
  1. 12
      libi2pd/SSUSession.cpp
  2. 1
      libi2pd/SSUSession.h
  3. 3
      libi2pd/TransportSession.h
  4. 14
      libi2pd/Transports.cpp
  5. 4
      libi2pd/Transports.h

12
libi2pd/SSUSession.cpp

@ -224,7 +224,11 @@ namespace transport @@ -224,7 +224,11 @@ namespace transport
return;
}
if (!m_DHKeysPair)
m_DHKeysPair = transports.GetNextDHKeysPair ();
{
auto pair = std::make_shared<i2p::crypto::DHKeys> ();
pair->GenerateKeys ();
m_DHKeysPair = pair;
}
CreateAESandMacKey (buf + headerSize);
SendSessionCreated (buf + headerSize, sendRelayTag);
}
@ -826,9 +830,9 @@ namespace transport @@ -826,9 +830,9 @@ namespace transport
{
if (m_State == eSessionStateUnknown)
{
// set connect timer
ScheduleConnectTimer ();
m_DHKeysPair = transports.GetNextDHKeysPair ();
ScheduleConnectTimer (); // set connect timer
m_DHKeysPair = std::make_shared<i2p::crypto::DHKeys> ();
m_DHKeysPair->GenerateKeys ();
SendSessionRequest ();
}
}

1
libi2pd/SSUSession.h

@ -166,6 +166,7 @@ namespace transport @@ -166,6 +166,7 @@ namespace transport
bool m_IsDataReceived;
std::unique_ptr<SignedData> m_SignedData; // we need it for SessionConfirmed only
std::map<uint32_t, std::shared_ptr<const i2p::data::RouterInfo> > m_RelayRequests; // nonce->Charlie
std::shared_ptr<i2p::crypto::DHKeys> m_DHKeysPair; // X - for client and Y - for server
};
}
}

3
libi2pd/TransportSession.h

@ -64,7 +64,7 @@ namespace transport @@ -64,7 +64,7 @@ namespace transport
public:
TransportSession (std::shared_ptr<const i2p::data::RouterInfo> router, int terminationTimeout):
m_DHKeysPair (nullptr), m_NumSentBytes (0), m_NumReceivedBytes (0), m_IsOutgoing (router), m_TerminationTimeout (terminationTimeout),
m_NumSentBytes (0), m_NumReceivedBytes (0), m_IsOutgoing (router), m_TerminationTimeout (terminationTimeout),
m_LastActivityTimestamp (i2p::util::GetSecondsSinceEpoch ())
{
if (router)
@ -103,7 +103,6 @@ namespace transport @@ -103,7 +103,6 @@ namespace transport
std::shared_ptr<const i2p::data::IdentityEx> m_RemoteIdentity;
mutable std::mutex m_RemoteIdentityMutex;
std::shared_ptr<i2p::crypto::DHKeys> m_DHKeysPair; // X - for client and Y - for server
size_t m_NumSentBytes, m_NumReceivedBytes;
bool m_IsOutgoing;
int m_TerminationTimeout;

14
libi2pd/Transports.cpp

@ -134,7 +134,7 @@ namespace transport @@ -134,7 +134,7 @@ namespace transport
m_IsOnline (true), m_IsRunning (false), m_IsNAT (true), m_CheckReserved(true), m_Thread (nullptr),
m_Service (nullptr), m_Work (nullptr), m_PeerCleanupTimer (nullptr), m_PeerTestTimer (nullptr),
m_SSUServer (nullptr), m_NTCP2Server (nullptr),
m_DHKeysPairSupplier (5), m_X25519KeysPairSupplier (5), // 5 pre-generated keys
m_X25519KeysPairSupplier (5), // 5 pre-generated keys
m_TotalSentBytes(0), m_TotalReceivedBytes(0), m_TotalTransitTransmittedBytes (0),
m_InBandwidth (0), m_OutBandwidth (0), m_TransitBandwidth(0),
m_LastInBandwidthUpdateBytes (0), m_LastOutBandwidthUpdateBytes (0),
@ -165,7 +165,6 @@ namespace transport @@ -165,7 +165,6 @@ namespace transport
}
i2p::config::GetOption("nat", m_IsNAT);
m_DHKeysPairSupplier.Start ();
m_X25519KeysPairSupplier.Start ();
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&Transports::Run, this));
@ -260,7 +259,6 @@ namespace transport @@ -260,7 +259,6 @@ namespace transport
m_NTCP2Server = nullptr;
}
m_DHKeysPairSupplier.Stop ();
m_X25519KeysPairSupplier.Stop ();
m_IsRunning = false;
if (m_Service) m_Service->stop ();
@ -540,16 +538,6 @@ namespace transport @@ -540,16 +538,6 @@ namespace transport
}
}
std::shared_ptr<i2p::crypto::DHKeys> Transports::GetNextDHKeysPair ()
{
return m_DHKeysPairSupplier.Acquire ();
}
void Transports::ReuseDHKeysPair (std::shared_ptr<i2p::crypto::DHKeys> pair)
{
m_DHKeysPairSupplier.Return (pair);
}
std::shared_ptr<i2p::crypto::X25519Keys> Transports::GetNextX25519KeysPair ()
{
return m_X25519KeysPairSupplier.Acquire ();

4
libi2pd/Transports.h

@ -59,7 +59,6 @@ namespace transport @@ -59,7 +59,6 @@ namespace transport
std::condition_variable m_Acquired;
std::mutex m_AcquiredMutex;
};
typedef EphemeralKeysSupplier<i2p::crypto::DHKeys> DHKeysPairSupplier;
typedef EphemeralKeysSupplier<i2p::crypto::X25519Keys> X25519KeysPairSupplier;
struct Peer
@ -97,8 +96,6 @@ namespace transport @@ -97,8 +96,6 @@ namespace transport
void SetOnline (bool online);
boost::asio::io_service& GetService () { return *m_Service; };
std::shared_ptr<i2p::crypto::DHKeys> GetNextDHKeysPair ();
void ReuseDHKeysPair (std::shared_ptr<i2p::crypto::DHKeys> pair);
std::shared_ptr<i2p::crypto::X25519Keys> GetNextX25519KeysPair ();
void ReuseX25519KeysPair (std::shared_ptr<i2p::crypto::X25519Keys> pair);
@ -166,7 +163,6 @@ namespace transport @@ -166,7 +163,6 @@ namespace transport
mutable std::mutex m_PeersMutex;
std::unordered_map<i2p::data::IdentHash, Peer> m_Peers;
DHKeysPairSupplier m_DHKeysPairSupplier;
X25519KeysPairSupplier m_X25519KeysPairSupplier;
std::atomic<uint64_t> m_TotalSentBytes, m_TotalReceivedBytes, m_TotalTransitTransmittedBytes;

Loading…
Cancel
Save