mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
create and send RelayRequest
This commit is contained in:
parent
2e691b6655
commit
9db7ec6bb0
@ -63,6 +63,50 @@ namespace transport
|
|||||||
SendTokenRequest ();
|
SendTokenRequest ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SSU2Session::Introduce (std::shared_ptr<SSU2Session> session, uint32_t relayTag)
|
||||||
|
{
|
||||||
|
// we are Alice
|
||||||
|
if (!session || !relayTag) return false;
|
||||||
|
// find local adddress to introduce
|
||||||
|
std::shared_ptr<const i2p::data::RouterInfo::Address> localAddress;
|
||||||
|
if (session->m_Address->IsV4 ())
|
||||||
|
localAddress = i2p::context.GetRouterInfo ().GetSSU2V4Address ();
|
||||||
|
else if (session->m_Address->IsV6 ())
|
||||||
|
localAddress = i2p::context.GetRouterInfo ().GetSSU2V6Address ();
|
||||||
|
if (localAddress) return false;
|
||||||
|
// create nonce
|
||||||
|
uint32_t nonce;
|
||||||
|
RAND_bytes ((uint8_t *)&nonce, 4);
|
||||||
|
auto ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
|
// payload
|
||||||
|
uint8_t payload[SSU2_MAX_PAYLOAD_SIZE];
|
||||||
|
size_t payloadSize = 0;
|
||||||
|
payload[0] = eSSU2BlkRelayRequest;
|
||||||
|
payload[3] = 0; // flag
|
||||||
|
htobe32buf (payload + 4, nonce);
|
||||||
|
htobe32buf (payload + 8, relayTag);
|
||||||
|
htobe32buf (payload + 12, ts);
|
||||||
|
payload[16] = 2; // ver
|
||||||
|
size_t asz = CreateEndpoint (payload + 18, SSU2_MAX_PAYLOAD_SIZE - 18, boost::asio::ip::udp::endpoint (localAddress->host, localAddress->port));
|
||||||
|
if (!asz) return false;
|
||||||
|
payload[17] = asz;
|
||||||
|
payloadSize += asz + 17;
|
||||||
|
SignedData s;
|
||||||
|
s.Insert ((const uint8_t *)"RelayRequestData", 16); // prologue
|
||||||
|
s.Insert (GetRemoteIdentity ()->GetIdentHash (), 32); // bhash
|
||||||
|
s.Insert (session->GetRemoteIdentity ()->GetIdentHash (), 32); // chash
|
||||||
|
s.Insert (payload + 4, 14 + asz); // nonce, relay tag, timestamp, ver, asz and Alice's endpoint
|
||||||
|
s.Sign (i2p::context.GetPrivateKeys (), payload + 17 + asz);
|
||||||
|
payloadSize += i2p::context.GetIdentity ()->GetSignatureLen ();
|
||||||
|
htobe16buf (payload + 1, payloadSize - 3); // size
|
||||||
|
payloadSize += CreatePaddingBlock (payload + payloadSize, SSU2_MAX_PAYLOAD_SIZE - payloadSize);
|
||||||
|
// send
|
||||||
|
m_RelaySessions.emplace (nonce, std::make_pair (session, ts));
|
||||||
|
SendData (payload, payloadSize);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void SSU2Session::Terminate ()
|
void SSU2Session::Terminate ()
|
||||||
{
|
{
|
||||||
if (m_State != eSSU2SessionStateTerminated)
|
if (m_State != eSSU2SessionStateTerminated)
|
||||||
@ -1080,6 +1124,19 @@ namespace transport
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// we are Alice, message from Bob
|
// we are Alice, message from Bob
|
||||||
|
boost::asio::ip::udp::endpoint ep;
|
||||||
|
if (ExtractEndpoint (buf + 12, buf[11], ep))
|
||||||
|
{
|
||||||
|
// update Charlie's address and connect
|
||||||
|
auto addr = std::make_shared<i2p::data::RouterInfo::Address> ();
|
||||||
|
auto addr1 = it->second.first->m_Address;
|
||||||
|
addr->transportStyle = i2p::data::RouterInfo::eTransportSSU2;
|
||||||
|
addr->host = ep.address (); addr->port = ep.port ();
|
||||||
|
addr->s = addr1->s; addr->i = addr1->i; addr->caps = addr1->caps;
|
||||||
|
it->second.first->m_Address = addr;
|
||||||
|
it->second.first->m_State = eSSU2SessionStateUnknown;
|
||||||
|
it->second.first->Connect ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_RelaySessions.erase (it);
|
m_RelaySessions.erase (it);
|
||||||
}
|
}
|
||||||
|
@ -141,6 +141,7 @@ namespace transport
|
|||||||
const boost::asio::ip::udp::endpoint& GetRemoteEndpoint () const { return m_RemoteEndpoint; };
|
const boost::asio::ip::udp::endpoint& GetRemoteEndpoint () const { return m_RemoteEndpoint; };
|
||||||
|
|
||||||
void Connect ();
|
void Connect ();
|
||||||
|
bool Introduce (std::shared_ptr<SSU2Session> session, uint32_t relayTag);
|
||||||
void Terminate ();
|
void Terminate ();
|
||||||
void TerminateByTimeout ();
|
void TerminateByTimeout ();
|
||||||
void CleanUp (uint64_t ts);
|
void CleanUp (uint64_t ts);
|
||||||
@ -200,7 +201,7 @@ namespace transport
|
|||||||
size_t CreateFollowOnFragmentBlock (uint8_t * buf, size_t len, std::shared_ptr<I2NPMessage> msg, uint8_t& fragmentNum, uint32_t msgID);
|
size_t CreateFollowOnFragmentBlock (uint8_t * buf, size_t len, std::shared_ptr<I2NPMessage> msg, uint8_t& fragmentNum, uint32_t msgID);
|
||||||
size_t CreateRelayIntroBlock (uint8_t * buf, size_t len, const uint8_t * introData, size_t introDataLen);
|
size_t CreateRelayIntroBlock (uint8_t * buf, size_t len, const uint8_t * introData, size_t introDataLen);
|
||||||
size_t CreateRelayResponseBlock (uint8_t * buf, size_t len, uint32_t nonce); // Charlie
|
size_t CreateRelayResponseBlock (uint8_t * buf, size_t len, uint32_t nonce); // Charlie
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
SSU2Server& m_Server;
|
SSU2Server& m_Server;
|
||||||
|
Loading…
Reference in New Issue
Block a user