From 9eb5982ea36be9a87beb6c5d86ce29432e76ee47 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 25 Nov 2014 10:14:18 -0500 Subject: [PATCH] use generic receive buffer for phase 4 --- NTCPSession.cpp | 30 ++++++++++++------------------ NTCPSession.h | 5 ++--- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 19e3a124..c874187a 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -308,10 +308,10 @@ namespace transport { LogPrint ("Phase 3 sent: ", bytes_transferred); // wait for phase4 - m_Establisher->phase4Len = m_RemoteIdentity.GetSignatureLen (); - size_t paddingSize = m_Establisher->phase4Len & 0x0F; // %16 - if (paddingSize > 0) m_Establisher->phase4Len += (16 - paddingSize); - boost::asio::async_read (m_Socket, boost::asio::buffer(m_Establisher->phase4, m_Establisher->phase4Len), boost::asio::transfer_all (), + auto signatureLen = m_RemoteIdentity.GetSignatureLen (); + size_t paddingSize = signatureLen & 0x0F; // %16 + if (paddingSize > 0) signatureLen += (16 - paddingSize); + boost::asio::async_read (m_Socket, boost::asio::buffer(m_ReceiveBuffer, signatureLen), boost::asio::transfer_all (), boost::bind(&NTCPSession::HandlePhase4Received, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, tsA)); } @@ -357,19 +357,13 @@ namespace transport s.Insert (m_Establisher->phase3.timestamp); // tsA s.Insert (tsB); // tsB auto keys = i2p::context.GetPrivateKeys (); - m_Establisher->phase4Len = keys.GetPublic ().GetSignatureLen (); - if (m_Establisher->phase4Len > 64) - { - LogPrint (eLogError, "Signature length ", m_Establisher->phase4Len, " exceeds 64"); - Terminate (); - } - s.Sign (keys, m_Establisher->phase4); - size_t paddingSize = m_Establisher->phase4Len & 0x0F; // %16 - if (paddingSize > 0) m_Establisher->phase4Len += (16 - paddingSize); - - m_Encryption.Encrypt (m_Establisher->phase4, m_Establisher->phase4Len, m_Establisher->phase4); + auto signatureLen = keys.GetPublic ().GetSignatureLen (); + s.Sign (keys, m_ReceiveBuffer); + size_t paddingSize = signatureLen & 0x0F; // %16 + if (paddingSize > 0) signatureLen += (16 - paddingSize); + m_Encryption.Encrypt (m_ReceiveBuffer, signatureLen, m_ReceiveBuffer); - boost::asio::async_write (m_Socket, boost::asio::buffer (m_Establisher->phase4, m_Establisher->phase4Len), boost::asio::transfer_all (), + boost::asio::async_write (m_Socket, boost::asio::buffer (m_ReceiveBuffer, signatureLen), boost::asio::transfer_all (), boost::bind(&NTCPSession::HandlePhase4Sent, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } @@ -406,7 +400,7 @@ namespace transport else { LogPrint ("Phase 4 received: ", bytes_transferred); - m_Decryption.Decrypt(m_Establisher->phase4, m_Establisher->phase4Len, m_Establisher->phase4); + m_Decryption.Decrypt(m_ReceiveBuffer, bytes_transferred, m_ReceiveBuffer); // verify signature SignedData s; @@ -416,7 +410,7 @@ namespace transport s.Insert (tsA); // tsA s.Insert (m_Establisher->phase2.encrypted.timestamp); // tsB - if (!s.Verify (m_RemoteIdentity, m_Establisher->phase4)) + if (!s.Verify (m_RemoteIdentity, m_ReceiveBuffer)) { LogPrint ("signature verification failed"); Terminate (); diff --git a/NTCPSession.h b/NTCPSession.h index f585fed9..935a0ef5 100644 --- a/NTCPSession.h +++ b/NTCPSession.h @@ -122,11 +122,10 @@ namespace transport NTCPPhase1 phase1; NTCPPhase2 phase2; NTCPPhase3 phase3; - i2p::crypto::AESAlignedBuffer<64> phase4; // 64 bytes max signature len - size_t phase4Len; } * m_Establisher; - uint8_t m_ReceiveBuffer[NTCP_BUFFER_SIZE + 16], m_TimeSyncBuffer[16]; + i2p::crypto::AESAlignedBuffer m_ReceiveBuffer; + i2p::crypto::AESAlignedBuffer<16> m_TimeSyncBuffer; int m_ReceiveBufferOffset; i2p::I2NPMessage * m_NextMessage;