diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 4e1a5fc4..d8cfb12a 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -980,9 +980,12 @@ namespace transport // if it's long enough we add padding and MAC to it // create padding block auto paddingLen = CreatePaddingBlock (totalLen, buf + len, it->maxLen - it->len - 16); - encryptBufs.push_back (std::make_pair (buf + len, paddingLen)); - len += paddingLen; - totalLen += paddingLen; + if (paddingLen) + { + encryptBufs.push_back (std::make_pair (buf + len, paddingLen)); + len += paddingLen; + totalLen += paddingLen; + } macBuf = buf + len; // allocate 16 bytes for MAC len += 16; @@ -998,7 +1001,8 @@ namespace transport // crate padding block auto paddingLen = CreatePaddingBlock (totalLen, m_NextSendBuffer, 287 - 16); // and padding block to encrypt and send - encryptBufs.push_back (std::make_pair (m_NextSendBuffer, paddingLen)); + if (paddingLen) + encryptBufs.push_back (std::make_pair (m_NextSendBuffer, paddingLen)); bufs.push_back (boost::asio::buffer (m_NextSendBuffer, paddingLen + 16)); macBuf = m_NextSendBuffer + paddingLen; totalLen += paddingLen; @@ -1067,17 +1071,25 @@ namespace transport if (!IsEstablished ()) return; auto riLen = i2p::context.GetRouterInfo ().GetBufferLen (); int paddingSize = (riLen*NTCP2_MAX_PADDING_RATIO)/100; - size_t payloadLen = riLen + paddingSize + 7; // 7 = 2*3 bytes header + 1 byte RI flag - uint8_t * payload = new uint8_t[payloadLen]; + size_t payloadLen = riLen + paddingSize + 7; // 7 = 2*3 bytes header + 1 byte RI flag + m_NextSendBuffer = new uint8_t[payloadLen + 16 + 2]; + uint8_t * payload = m_NextSendBuffer + 2; payload[0] = eNTCP2BlkRouterInfo; htobe16buf (payload + 1, riLen + 1); // size payload[3] = 0; // flag memcpy (payload + 4, i2p::context.GetRouterInfo ().GetBuffer (), riLen); payload[riLen + 4] = eNTCP2BlkPadding; htobe16buf (payload + riLen + 5, paddingSize); - RAND_bytes (payload + riLen + 7, paddingSize); - SendNextFrame (payload, payloadLen); - delete[] payload; + memset (payload + riLen + 7, 0, paddingSize); + // encrypt + uint8_t nonce[12]; + CreateNonce (m_SendSequenceNumber, nonce); m_SendSequenceNumber++; + i2p::crypto::AEADChaCha20Poly1305Encrypt ({std::make_pair (payload, payloadLen)}, m_SendKey, nonce, payload + payloadLen); + SetNextSentFrameLength (payloadLen + 16, m_NextSendBuffer); + // send + m_IsSending = true; + boost::asio::async_write (m_Socket, boost::asio::buffer (m_NextSendBuffer, payloadLen + 16 + 2), boost::asio::transfer_all (), + std::bind(&NTCP2Session::HandleNextFrameSent, shared_from_this (), std::placeholders::_1, std::placeholders::_2)); } void NTCP2Session::SendTermination (NTCP2TerminationReason reason)