mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2024-11-17 21:26:04 +00:00
save relay tag
This commit is contained in:
parent
76cb75f7c0
commit
8de75a2a90
30
SSU.cpp
30
SSU.cpp
@ -18,7 +18,8 @@ namespace ssu
|
|||||||
SSUSession::SSUSession (SSUServer& server, boost::asio::ip::udp::endpoint& remoteEndpoint,
|
SSUSession::SSUSession (SSUServer& server, boost::asio::ip::udp::endpoint& remoteEndpoint,
|
||||||
const i2p::data::RouterInfo * router, bool peerTest ):
|
const i2p::data::RouterInfo * router, bool peerTest ):
|
||||||
m_Server (server), m_RemoteEndpoint (remoteEndpoint), m_RemoteRouter (router),
|
m_Server (server), m_RemoteEndpoint (remoteEndpoint), m_RemoteRouter (router),
|
||||||
m_Timer (m_Server.GetService ()), m_PeerTest (peerTest), m_State (eSessionStateUnknown)
|
m_Timer (m_Server.GetService ()), m_PeerTest (peerTest), m_State (eSessionStateUnknown),
|
||||||
|
m_RelayTag (0)
|
||||||
{
|
{
|
||||||
m_DHKeysPair = i2p::transports.GetNextDHKeysPair ();
|
m_DHKeysPair = i2p::transports.GetNextDHKeysPair ();
|
||||||
}
|
}
|
||||||
@ -210,7 +211,7 @@ namespace ssu
|
|||||||
*(uint32_t *)(signedData + 518) = htobe32 (m_RemoteEndpoint.address ().to_v4 ().to_ulong ()); // remote IP
|
*(uint32_t *)(signedData + 518) = htobe32 (m_RemoteEndpoint.address ().to_v4 ().to_ulong ()); // remote IP
|
||||||
*(uint16_t *)(signedData + 522) = htobe16 (m_RemoteEndpoint.port ()); // remote port
|
*(uint16_t *)(signedData + 522) = htobe16 (m_RemoteEndpoint.port ()); // remote port
|
||||||
memcpy (signedData + 524, payload, 8); // relayTag and signed on time
|
memcpy (signedData + 524, payload, 8); // relayTag and signed on time
|
||||||
uint32_t relayTag = be32toh (*(uint32_t *)payload);
|
m_RelayTag = be32toh (*(uint32_t *)payload);
|
||||||
payload += 4; // relayTag
|
payload += 4; // relayTag
|
||||||
payload += 4; // signed on time
|
payload += 4; // signed on time
|
||||||
// decrypt DSA signature
|
// decrypt DSA signature
|
||||||
@ -223,7 +224,7 @@ namespace ssu
|
|||||||
if (!verifier.VerifyMessage (signedData, 532, payload, 40))
|
if (!verifier.VerifyMessage (signedData, 532, payload, 40))
|
||||||
LogPrint ("SSU signature verification failed");
|
LogPrint ("SSU signature verification failed");
|
||||||
|
|
||||||
SendSessionConfirmed (y, ourAddress, relayTag);
|
SendSessionConfirmed (y, ourAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSUSession::ProcessSessionConfirmed (uint8_t * buf, size_t len)
|
void SSUSession::ProcessSessionConfirmed (uint8_t * buf, size_t len)
|
||||||
@ -350,7 +351,7 @@ namespace ssu
|
|||||||
m_Server.Send (buf, 368, m_RemoteEndpoint);
|
m_Server.Send (buf, 368, m_RemoteEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSUSession::SendSessionConfirmed (const uint8_t * y, const uint8_t * ourAddress, uint32_t relayTag)
|
void SSUSession::SendSessionConfirmed (const uint8_t * y, const uint8_t * ourAddress)
|
||||||
{
|
{
|
||||||
uint8_t buf[480 + 18];
|
uint8_t buf[480 + 18];
|
||||||
uint8_t * payload = buf + sizeof (SSUHeader);
|
uint8_t * payload = buf + sizeof (SSUHeader);
|
||||||
@ -376,7 +377,7 @@ namespace ssu
|
|||||||
memcpy (signedData + 512, ourAddress, 6); // our address/port as seem by party
|
memcpy (signedData + 512, ourAddress, 6); // our address/port as seem by party
|
||||||
*(uint32_t *)(signedData + 518) = htobe32 (m_RemoteEndpoint.address ().to_v4 ().to_ulong ()); // remote IP
|
*(uint32_t *)(signedData + 518) = htobe32 (m_RemoteEndpoint.address ().to_v4 ().to_ulong ()); // remote IP
|
||||||
*(uint16_t *)(signedData + 522) = htobe16 (m_RemoteEndpoint.port ()); // remote port
|
*(uint16_t *)(signedData + 522) = htobe16 (m_RemoteEndpoint.port ()); // remote port
|
||||||
*(uint32_t *)(signedData + 524) = htobe32 (relayTag); // relay tag
|
*(uint32_t *)(signedData + 524) = htobe32 (m_RelayTag); // relay tag
|
||||||
*(uint32_t *)(signedData + 528) = htobe32 (signedOnTime); // signed on time
|
*(uint32_t *)(signedData + 528) = htobe32 (signedOnTime); // signed on time
|
||||||
i2p::context.Sign (signedData, 532, payload); // DSA signature
|
i2p::context.Sign (signedData, 532, payload); // DSA signature
|
||||||
|
|
||||||
@ -992,11 +993,20 @@ namespace ssu
|
|||||||
{
|
{
|
||||||
auto& introducer = address->introducers[0]; // TODO:
|
auto& introducer = address->introducers[0]; // TODO:
|
||||||
boost::asio::ip::udp::endpoint introducerEndpoint (introducer.iHost, introducer.iPort);
|
boost::asio::ip::udp::endpoint introducerEndpoint (introducer.iHost, introducer.iPort);
|
||||||
session = new SSUSession (*this, introducerEndpoint, router);
|
it = m_Sessions.find (introducerEndpoint);
|
||||||
m_Sessions[introducerEndpoint] = session;
|
if (it == m_Sessions.end ())
|
||||||
LogPrint ("Creating new SSU session to [", router->GetIdentHashAbbreviation (),
|
{
|
||||||
"] through introducer ", introducerEndpoint.address ().to_string (), ":", introducerEndpoint.port ());
|
session = new SSUSession (*this, introducerEndpoint, router);
|
||||||
session->ConnectThroughIntroducer (introducer);
|
m_Sessions[introducerEndpoint] = session;
|
||||||
|
LogPrint ("Creating new SSU session to [", router->GetIdentHashAbbreviation (),
|
||||||
|
"] through introducer ", introducerEndpoint.address ().to_string (), ":", introducerEndpoint.port ());
|
||||||
|
session->ConnectThroughIntroducer (introducer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrint ("Session to introducer already exists");
|
||||||
|
// TODO:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint ("Router is unreachable, but not introducers presentd. Ignored");
|
LogPrint ("Router is unreachable, but not introducers presentd. Ignored");
|
||||||
|
5
SSU.h
5
SSU.h
@ -98,7 +98,7 @@ namespace ssu
|
|||||||
void ProcessSessionCreated (uint8_t * buf, size_t len);
|
void ProcessSessionCreated (uint8_t * buf, size_t len);
|
||||||
void SendSessionCreated (const uint8_t * x);
|
void SendSessionCreated (const uint8_t * x);
|
||||||
void ProcessSessionConfirmed (uint8_t * buf, size_t len);
|
void ProcessSessionConfirmed (uint8_t * buf, size_t len);
|
||||||
void SendSessionConfirmed (const uint8_t * y, const uint8_t * ourAddress, uint32_t relayTag);
|
void SendSessionConfirmed (const uint8_t * y, const uint8_t * ourAddress);
|
||||||
void ProcessRelayResponse (uint8_t * buf, size_t len);
|
void ProcessRelayResponse (uint8_t * buf, size_t len);
|
||||||
void ProcessRelayIntro (uint8_t * buf, size_t len);
|
void ProcessRelayIntro (uint8_t * buf, size_t len);
|
||||||
void Established ();
|
void Established ();
|
||||||
@ -128,7 +128,8 @@ namespace ssu
|
|||||||
boost::asio::deadline_timer m_Timer;
|
boost::asio::deadline_timer m_Timer;
|
||||||
i2p::data::DHKeysPair * m_DHKeysPair; // X - for client and Y - for server
|
i2p::data::DHKeysPair * m_DHKeysPair; // X - for client and Y - for server
|
||||||
bool m_PeerTest;
|
bool m_PeerTest;
|
||||||
SessionState m_State;
|
SessionState m_State;
|
||||||
|
uint32_t m_RelayTag;
|
||||||
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption m_Encryption;
|
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption m_Encryption;
|
||||||
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption m_Decryption;
|
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption m_Decryption;
|
||||||
uint8_t m_SessionKey[32], m_MacKey[32];
|
uint8_t m_SessionKey[32], m_MacKey[32];
|
||||||
|
Loading…
Reference in New Issue
Block a user