| 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 | { |
no test coverage detected