MCPcopy Create free account
hub / github.com/PurpleI2P/i2pd / SendPeerTest

Method SendPeerTest

libi2pd/SSU2OutOfSession.cpp:158–195  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

156 }
157
158 void SSU2PeerTestSession::SendPeerTest (uint8_t msg)
159 {
160 auto addr = GetAddress ();
161 if (!addr) return;
162 Header header;
163 uint8_t h[32], payload[SSU2_MAX_PACKET_SIZE];
164 // fill packet
165 header.h.connID = GetDestConnID (); // dest id
166 RAND_bytes (header.buf + 8, 4); // random packet num
167 header.h.type = eSSU2PeerTest;
168 header.h.flags[0] = 2; // ver, always 2 even for post-quantum
169 header.h.flags[1] = (uint8_t)i2p::context.GetNetID (); // netID
170 header.h.flags[2] = 0; // flag
171 memcpy (h, header.buf, 16);
172 htobuf64 (h + 16, GetSourceConnID ()); // source id
173 // payload
174 payload[0] = eSSU2BlkDateTime;
175 htobe16buf (payload + 1, 4);
176 htobe32buf (payload + 3, (i2p::util::GetMillisecondsSinceEpoch () + 500)/1000);
177 size_t payloadSize = 7;
178 if (msg == 6 || msg == 7)
179 payloadSize += CreateAddressBlock (payload + payloadSize, GetMaxPayloadSize () - payloadSize, GetRemoteEndpoint ());
180 payloadSize += CreatePeerTestBlock (payload + payloadSize, GetMaxPayloadSize () - payloadSize,
181 msg, eSSU2PeerTestCodeAccept, nullptr, m_SignedData.data (), m_SignedData.size ());
182 payloadSize += CreatePaddingBlock (payload + payloadSize, GetMaxPayloadSize () - payloadSize);
183 // encrypt
184 uint8_t n[12];
185 CreateNonce (be32toh (header.h.packetNum), n);
186 i2p::crypto::AEADChaCha20Poly1305 (payload, payloadSize, h, 32, addr->i, n, payload, payloadSize + 16, true);
187 payloadSize += 16;
188 header.ll[0] ^= CreateHeaderMask (addr->i, payload + (payloadSize - 24));
189 header.ll[1] ^= CreateHeaderMask (addr->i, payload + (payloadSize - 12));
190 memset (n, 0, 12);
191 GetServer ().ChaCha20 (h + 16, 16, addr->i, n, h + 16);
192 // send
193 GetServer ().Send (header.buf, 16, h + 16, 16, payload, payloadSize, GetRemoteEndpoint ());
194 UpdateNumSentBytes (payloadSize + 32);
195 }
196
197 void SSU2PeerTestSession::SendPeerTest (uint8_t msg, const uint8_t * signedData, size_t signedDataLen, bool delayed)
198 {

Callers 1

ScheduleResendMethod · 0.45

Calls 11

htobuf64Function · 0.85
htobe16bufFunction · 0.85
htobe32bufFunction · 0.85
CreateNonceFunction · 0.85
be32tohFunction · 0.85
AEADChaCha20Poly1305Function · 0.85
CreateHeaderMaskFunction · 0.85
GetNetIDMethod · 0.80
ChaCha20Method · 0.80
SendMethod · 0.45

Tested by

no test coverage detected