mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
split SSU to SSU and SSUSession
This commit is contained in:
parent
51c908ab55
commit
0cd04c23c5
124
SSU.h
124
SSU.h
@ -8,142 +8,20 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include "aes.h"
|
|
||||||
#include "I2PEndian.h"
|
#include "I2PEndian.h"
|
||||||
#include "Identity.h"
|
#include "Identity.h"
|
||||||
#include "RouterInfo.h"
|
#include "RouterInfo.h"
|
||||||
#include "I2NPProtocol.h"
|
#include "I2NPProtocol.h"
|
||||||
#include "TransportSession.h"
|
#include "SSUSession.h"
|
||||||
#include "SSUData.h"
|
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
{
|
{
|
||||||
namespace transport
|
namespace transport
|
||||||
{
|
{
|
||||||
#pragma pack(1)
|
|
||||||
struct SSUHeader
|
|
||||||
{
|
|
||||||
uint8_t mac[16];
|
|
||||||
uint8_t iv[16];
|
|
||||||
uint8_t flag;
|
|
||||||
uint32_t time;
|
|
||||||
|
|
||||||
uint8_t GetPayloadType () const { return flag >> 4; };
|
|
||||||
};
|
|
||||||
#pragma pack()
|
|
||||||
|
|
||||||
const int SSU_CONNECT_TIMEOUT = 5; // 5 seconds
|
|
||||||
const int SSU_TERMINATION_TIMEOUT = 330; // 5.5 minutes
|
|
||||||
const int SSU_KEEP_ALIVE_INTERVAL = 30; // 30 seconds
|
const int SSU_KEEP_ALIVE_INTERVAL = 30; // 30 seconds
|
||||||
const int SSU_TO_INTRODUCER_SESSION_DURATION = 3600; // 1 hour
|
const int SSU_TO_INTRODUCER_SESSION_DURATION = 3600; // 1 hour
|
||||||
const size_t SSU_MAX_NUM_INTRODUCERS = 3;
|
const size_t SSU_MAX_NUM_INTRODUCERS = 3;
|
||||||
|
|
||||||
// payload types (4 bits)
|
|
||||||
const uint8_t PAYLOAD_TYPE_SESSION_REQUEST = 0;
|
|
||||||
const uint8_t PAYLOAD_TYPE_SESSION_CREATED = 1;
|
|
||||||
const uint8_t PAYLOAD_TYPE_SESSION_CONFIRMED = 2;
|
|
||||||
const uint8_t PAYLOAD_TYPE_RELAY_REQUEST = 3;
|
|
||||||
const uint8_t PAYLOAD_TYPE_RELAY_RESPONSE = 4;
|
|
||||||
const uint8_t PAYLOAD_TYPE_RELAY_INTRO = 5;
|
|
||||||
const uint8_t PAYLOAD_TYPE_DATA = 6;
|
|
||||||
const uint8_t PAYLOAD_TYPE_PEER_TEST = 7;
|
|
||||||
const uint8_t PAYLOAD_TYPE_SESSION_DESTROYED = 8;
|
|
||||||
|
|
||||||
enum SessionState
|
|
||||||
{
|
|
||||||
eSessionStateUnknown,
|
|
||||||
eSessionStateIntroduced,
|
|
||||||
eSessionStateEstablished,
|
|
||||||
eSessionStateFailed
|
|
||||||
};
|
|
||||||
|
|
||||||
class SSUServer;
|
|
||||||
class SSUSession: public TransportSession
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
SSUSession (SSUServer& server, boost::asio::ip::udp::endpoint& remoteEndpoint,
|
|
||||||
const i2p::data::RouterInfo * router = nullptr, bool peerTest = false);
|
|
||||||
void ProcessNextMessage (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint);
|
|
||||||
~SSUSession ();
|
|
||||||
|
|
||||||
void Connect ();
|
|
||||||
void Introduce (uint32_t iTag, const uint8_t * iKey);
|
|
||||||
void WaitForIntroduction ();
|
|
||||||
void Close ();
|
|
||||||
boost::asio::ip::udp::endpoint& GetRemoteEndpoint () { return m_RemoteEndpoint; };
|
|
||||||
bool IsV6 () const { return m_RemoteEndpoint.address ().is_v6 (); };
|
|
||||||
void SendI2NPMessage (I2NPMessage * msg);
|
|
||||||
void SendPeerTest (); // Alice
|
|
||||||
|
|
||||||
SessionState GetState () const { return m_State; };
|
|
||||||
size_t GetNumSentBytes () const { return m_NumSentBytes; };
|
|
||||||
size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
|
|
||||||
|
|
||||||
void SendKeepAlive ();
|
|
||||||
uint32_t GetRelayTag () const { return m_RelayTag; };
|
|
||||||
uint32_t GetCreationTime () const { return m_CreationTime; };
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void CreateAESandMacKey (const uint8_t * pubKey);
|
|
||||||
|
|
||||||
void PostI2NPMessage (I2NPMessage * msg);
|
|
||||||
void ProcessMessage (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint); // call for established session
|
|
||||||
void ProcessSessionRequest (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint);
|
|
||||||
void SendSessionRequest ();
|
|
||||||
void SendRelayRequest (uint32_t iTag, const uint8_t * iKey);
|
|
||||||
void ProcessSessionCreated (uint8_t * buf, size_t len);
|
|
||||||
void SendSessionCreated (const uint8_t * x);
|
|
||||||
void ProcessSessionConfirmed (uint8_t * buf, size_t len);
|
|
||||||
void SendSessionConfirmed (const uint8_t * y, const uint8_t * ourAddress, size_t ourAddressLen);
|
|
||||||
void ProcessRelayRequest (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& from);
|
|
||||||
void SendRelayResponse (uint32_t nonce, const boost::asio::ip::udp::endpoint& from,
|
|
||||||
const uint8_t * introKey, const boost::asio::ip::udp::endpoint& to);
|
|
||||||
void SendRelayIntro (SSUSession * session, const boost::asio::ip::udp::endpoint& from);
|
|
||||||
void ProcessRelayResponse (uint8_t * buf, size_t len);
|
|
||||||
void ProcessRelayIntro (uint8_t * buf, size_t len);
|
|
||||||
void Established ();
|
|
||||||
void Failed ();
|
|
||||||
void ScheduleConnectTimer ();
|
|
||||||
void HandleConnectTimer (const boost::system::error_code& ecode);
|
|
||||||
void ProcessPeerTest (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint);
|
|
||||||
void SendPeerTest (uint32_t nonce, uint32_t address, uint16_t port, const uint8_t * introKey, bool toAddress = true);
|
|
||||||
void ProcessData (uint8_t * buf, size_t len);
|
|
||||||
void SendSesionDestroyed ();
|
|
||||||
void Send (uint8_t type, const uint8_t * payload, size_t len); // with session key
|
|
||||||
void Send (const uint8_t * buf, size_t size);
|
|
||||||
|
|
||||||
void FillHeaderAndEncrypt (uint8_t payloadType, uint8_t * buf, size_t len, const uint8_t * aesKey, const uint8_t * iv, const uint8_t * macKey);
|
|
||||||
void FillHeaderAndEncrypt (uint8_t payloadType, uint8_t * buf, size_t len); // with session key
|
|
||||||
void Decrypt (uint8_t * buf, size_t len, const uint8_t * aesKey);
|
|
||||||
void DecryptSessionKey (uint8_t * buf, size_t len);
|
|
||||||
bool Validate (uint8_t * buf, size_t len, const uint8_t * macKey);
|
|
||||||
const uint8_t * GetIntroKey () const;
|
|
||||||
|
|
||||||
void ScheduleTermination ();
|
|
||||||
void HandleTerminationTimer (const boost::system::error_code& ecode);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
friend class SSUData; // TODO: change in later
|
|
||||||
SSUServer& m_Server;
|
|
||||||
boost::asio::ip::udp::endpoint m_RemoteEndpoint;
|
|
||||||
boost::asio::deadline_timer m_Timer;
|
|
||||||
bool m_PeerTest;
|
|
||||||
SessionState m_State;
|
|
||||||
bool m_IsSessionKey;
|
|
||||||
uint32_t m_RelayTag;
|
|
||||||
std::set<uint32_t> m_PeerTestNonces;
|
|
||||||
i2p::crypto::CBCEncryption m_SessionKeyEncryption;
|
|
||||||
i2p::crypto::CBCDecryption m_SessionKeyDecryption;
|
|
||||||
uint8_t m_SessionKey[32], m_MacKey[32];
|
|
||||||
std::list<i2p::I2NPMessage *> m_DelayedMessages;
|
|
||||||
SSUData m_Data;
|
|
||||||
size_t m_NumSentBytes, m_NumReceivedBytes;
|
|
||||||
uint32_t m_CreationTime; // seconds since epoch
|
|
||||||
};
|
|
||||||
|
|
||||||
class SSUServer
|
class SSUServer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -34,7 +34,9 @@
|
|||||||
<ClCompile Include="..\SAM.cpp" />
|
<ClCompile Include="..\SAM.cpp" />
|
||||||
<ClCompile Include="..\SSU.cpp" />
|
<ClCompile Include="..\SSU.cpp" />
|
||||||
<ClCompile Include="..\SSUData.cpp" />
|
<ClCompile Include="..\SSUData.cpp" />
|
||||||
|
<ClCompile Include="..\SSUSession.cpp" />
|
||||||
<ClCompile Include="..\Streaming.cpp" />
|
<ClCompile Include="..\Streaming.cpp" />
|
||||||
|
<ClCompile Include="..\Datagram.cpp" />
|
||||||
<ClCompile Include="..\Destination.cpp" />
|
<ClCompile Include="..\Destination.cpp" />
|
||||||
<ClCompile Include="..\TransitTunnel.cpp" />
|
<ClCompile Include="..\TransitTunnel.cpp" />
|
||||||
<ClCompile Include="..\Transports.cpp" />
|
<ClCompile Include="..\Transports.cpp" />
|
||||||
@ -47,7 +49,6 @@
|
|||||||
<ClCompile Include="..\SOCKS.cpp" />
|
<ClCompile Include="..\SOCKS.cpp" />
|
||||||
<ClCompile Include="..\I2PTunnel.cpp" />
|
<ClCompile Include="..\I2PTunnel.cpp" />
|
||||||
<ClCompile Include="..\ClientContext.cpp" />
|
<ClCompile Include="..\ClientContext.cpp" />
|
||||||
<ClCompile Include="..\Datagram.cpp" />
|
|
||||||
<ClCompile Include="Win32Service.cpp" />
|
<ClCompile Include="Win32Service.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -74,7 +75,9 @@
|
|||||||
<ClInclude Include="..\SAM.h" />
|
<ClInclude Include="..\SAM.h" />
|
||||||
<ClInclude Include="..\SSU.h" />
|
<ClInclude Include="..\SSU.h" />
|
||||||
<ClInclude Include="..\SSUData.h" />
|
<ClInclude Include="..\SSUData.h" />
|
||||||
|
<ClInclude Include="..\SSUSession.h" />
|
||||||
<ClInclude Include="..\Streaming.h" />
|
<ClInclude Include="..\Streaming.h" />
|
||||||
|
<ClInclude Include="..\Datagram.h" />
|
||||||
<ClInclude Include="..\Destination.h" />
|
<ClInclude Include="..\Destination.h" />
|
||||||
<ClInclude Include="..\Timestamp.h" />
|
<ClInclude Include="..\Timestamp.h" />
|
||||||
<ClInclude Include="..\TransitTunnel.h" />
|
<ClInclude Include="..\TransitTunnel.h" />
|
||||||
@ -92,8 +95,7 @@
|
|||||||
<ClInclude Include="..\version.h" />
|
<ClInclude Include="..\version.h" />
|
||||||
<ClInclude Include="..\Signature.h" />
|
<ClInclude Include="..\Signature.h" />
|
||||||
<ClInclude Include="..\ClientContext.h" />
|
<ClInclude Include="..\ClientContext.h" />
|
||||||
<ClCompile Include="..\TransportSession.h" />
|
<ClInclude Include="..\TransportSession.h" />
|
||||||
<ClCompile Include="..\Datagram.h" />
|
|
||||||
<ClInclude Include="Win32Service.h" />
|
<ClInclude Include="Win32Service.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
|
@ -114,7 +114,8 @@ am_i2p_OBJECTS = AddressBook.$(OBJEXT) CryptoConst.$(OBJEXT) \
|
|||||||
Transports.$(OBJEXT) Tunnel.$(OBJEXT) TunnelEndpoint.$(OBJEXT) \
|
Transports.$(OBJEXT) Tunnel.$(OBJEXT) TunnelEndpoint.$(OBJEXT) \
|
||||||
TunnelGateway.$(OBJEXT) TunnelPool.$(OBJEXT) UPnP.$(OBJEXT) \
|
TunnelGateway.$(OBJEXT) TunnelPool.$(OBJEXT) UPnP.$(OBJEXT) \
|
||||||
aes.$(OBJEXT) base64.$(OBJEXT) i2p.$(OBJEXT) util.$(OBJEXT) \
|
aes.$(OBJEXT) base64.$(OBJEXT) i2p.$(OBJEXT) util.$(OBJEXT) \
|
||||||
SAM.$(OBJEXT) Destination.$(OBJEXT)
|
SAM.$(OBJEXT) Destination.$(OBJEXT) ClientContext.$(OBJEXT) \
|
||||||
|
Datagram.$(OBJEXT) SSUSession.$(OBJEXT)
|
||||||
i2p_OBJECTS = $(am_i2p_OBJECTS)
|
i2p_OBJECTS = $(am_i2p_OBJECTS)
|
||||||
i2p_LDADD = $(LDADD)
|
i2p_LDADD = $(LDADD)
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
@ -325,7 +326,7 @@ i2p_SOURCES = AddressBook.cpp CryptoConst.cpp Daemon.cpp \
|
|||||||
Transports.cpp Tunnel.cpp TunnelEndpoint.cpp \
|
Transports.cpp Tunnel.cpp TunnelEndpoint.cpp \
|
||||||
TunnelGateway.cpp TunnelPool.cpp UPnP.cpp aes.cpp \
|
TunnelGateway.cpp TunnelPool.cpp UPnP.cpp aes.cpp \
|
||||||
base64.cpp i2p.cpp util.cpp SAM.cpp Destination.cpp \
|
base64.cpp i2p.cpp util.cpp SAM.cpp Destination.cpp \
|
||||||
ClientContext.cpp DataFram.cpp \
|
ClientContext.cpp DataFram.cpp SSUSession.cpp \
|
||||||
\
|
\
|
||||||
AddressBook.h CryptoConst.h Daemon.h ElGamal.h \
|
AddressBook.h CryptoConst.h Daemon.h ElGamal.h \
|
||||||
Garlic.h HTTPProxy.h HTTPServer.h I2NPProtocol.h \
|
Garlic.h HTTPProxy.h HTTPServer.h I2NPProtocol.h \
|
||||||
@ -337,7 +338,7 @@ i2p_SOURCES = AddressBook.cpp CryptoConst.cpp Daemon.cpp \
|
|||||||
TunnelConfig.h TunnelEndpoint.h TunnelGateway.h \
|
TunnelConfig.h TunnelEndpoint.h TunnelGateway.h \
|
||||||
TunnelPool.h UPnP.h aes.h base64.h config.h hmac.h \
|
TunnelPool.h UPnP.h aes.h base64.h config.h hmac.h \
|
||||||
util.h version.h Destination.h ClientContext.h \
|
util.h version.h Destination.h ClientContext.h \
|
||||||
TransportSession.h Datagram.h
|
TransportSession.h Datagram.h SSUSession.h
|
||||||
|
|
||||||
AM_LDFLAGS = @BOOST_DATE_TIME_LIB@ @BOOST_FILESYSTEM_LIB@ \
|
AM_LDFLAGS = @BOOST_DATE_TIME_LIB@ @BOOST_FILESYSTEM_LIB@ \
|
||||||
@BOOST_PROGRAM_OPTIONS_LIB@ @BOOST_REGEX_LIB@ \
|
@BOOST_PROGRAM_OPTIONS_LIB@ @BOOST_REGEX_LIB@ \
|
||||||
@ -487,6 +488,7 @@ distclean-compile:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SAM.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SAM.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ClientContext.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ClientContext.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Datagram.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Datagram.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SSUSession.Po@am__quote@
|
||||||
|
|
||||||
.cpp.o:
|
.cpp.o:
|
||||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
12
filelist.mk
12
filelist.mk
@ -3,17 +3,17 @@
|
|||||||
CPP_FILES := CryptoConst.cpp base64.cpp NTCPSession.cpp RouterInfo.cpp Transports.cpp \
|
CPP_FILES := CryptoConst.cpp base64.cpp NTCPSession.cpp RouterInfo.cpp Transports.cpp \
|
||||||
RouterContext.cpp NetDb.cpp LeaseSet.cpp Tunnel.cpp TunnelEndpoint.cpp TunnelGateway.cpp \
|
RouterContext.cpp NetDb.cpp LeaseSet.cpp Tunnel.cpp TunnelEndpoint.cpp TunnelGateway.cpp \
|
||||||
TransitTunnel.cpp I2NPProtocol.cpp Log.cpp Garlic.cpp HTTPServer.cpp Streaming.cpp \
|
TransitTunnel.cpp I2NPProtocol.cpp Log.cpp Garlic.cpp HTTPServer.cpp Streaming.cpp \
|
||||||
Destination.cpp Identity.cpp SSU.cpp util.cpp Reseed.cpp DaemonLinux.cpp SSUData.cpp \
|
Destination.cpp Identity.cpp SSU.cpp SSUSession.cpp SSUData.cpp util.cpp Reseed.cpp \
|
||||||
aes.cpp SOCKS.cpp UPnP.cpp TunnelPool.cpp HTTPProxy.cpp AddressBook.cpp Daemon.cpp \
|
DaemonLinux.cpp SSUData.cpp aes.cpp SOCKS.cpp UPnP.cpp TunnelPool.cpp HTTPProxy.cpp \
|
||||||
I2PTunnel.cpp SAM.cpp ClientContext.cpp Datagram.cpp i2p.cpp
|
AddressBook.cpp Daemon.cpp I2PTunnel.cpp SAM.cpp ClientContext.cpp Datagram.cpp i2p.cpp
|
||||||
|
|
||||||
|
|
||||||
H_FILES := CryptoConst.h base64.h NTCPSession.h RouterInfo.h Transports.h \
|
H_FILES := CryptoConst.h base64.h NTCPSession.h RouterInfo.h Transports.h \
|
||||||
RouterContext.h NetDb.h LeaseSet.h Tunnel.h TunnelEndpoint.h TunnelGateway.h \
|
RouterContext.h NetDb.h LeaseSet.h Tunnel.h TunnelEndpoint.h TunnelGateway.h \
|
||||||
TransitTunnel.h I2NPProtocol.h Log.h Garlic.h HTTPServer.h Streaming.h Destination.h \
|
TransitTunnel.h I2NPProtocol.h Log.h Garlic.h HTTPServer.h Streaming.h Destination.h \
|
||||||
Identity.h SSU.h util.h Reseed.h DaemonLinux.h SSUData.h i2p.h aes.h SOCKS.h \
|
Identity.h SSU.h SSUSession.h SSUData.h util.h Reseed.h DaemonLinux.h SSUData.h \
|
||||||
UPnP.h TunnelPool.h HTTPProxy.h AddressBook.h Daemon.h I2PTunnel.h version.h \
|
aes.h SOCKS.h UPnP.h TunnelPool.h HTTPProxy.h AddressBook.h Daemon.h I2PTunnel.h \
|
||||||
Signature.h SAM.h ClientContext.h TransportSession.h Datagram.h
|
version.h Signature.h SAM.h ClientContext.h TransportSession.h Datagram.h
|
||||||
|
|
||||||
|
|
||||||
OBJECTS = $(addprefix obj/, $(notdir $(CPP_FILES:.cpp=.o)))
|
OBJECTS = $(addprefix obj/, $(notdir $(CPP_FILES:.cpp=.o)))
|
||||||
|
Loading…
Reference in New Issue
Block a user