forked from metin-server/m2dev-client-src
fix cipher desync issue
update the handshake phase to call the new method after activating the cipher, ensuring buffered data (likely from a second login attempt, GC_PHASE) is properly decrypted, and fix a logging format issue.
This commit is contained in:
@@ -780,7 +780,7 @@ bool CNetworkStream::Send(int size, const char * pSrcBuf)
|
|||||||
if (*pSrcBuf != 0)
|
if (*pSrcBuf != 0)
|
||||||
{
|
{
|
||||||
const auto kHeader = *pSrcBuf;
|
const auto kHeader = *pSrcBuf;
|
||||||
TraceError("SEND> %s %u(0x%X) (%d)", GetRecvHeaderName(kHeader), kHeader, kHeader, size);
|
TraceError("SEND> %s %u(0x%X) (%d)", GetSendHeaderName(kHeader), kHeader, kHeader, size);
|
||||||
|
|
||||||
const auto contents = dump_hex(reinterpret_cast<const uint8_t*>(pSrcBuf), size);
|
const auto contents = dump_hex(reinterpret_cast<const uint8_t*>(pSrcBuf), size);
|
||||||
TraceError("%s", contents.c_str());
|
TraceError("%s", contents.c_str());
|
||||||
@@ -956,4 +956,17 @@ void CNetworkStream::ActivateCipher()
|
|||||||
{
|
{
|
||||||
return m_cipher.set_activated(true);
|
return m_cipher.set_activated(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If cipher is active and there's unread data in buffer, decrypt it in-place
|
||||||
|
void CNetworkStream::DecryptAlreadyReceivedData()
|
||||||
|
{
|
||||||
|
if (!IsSecurityMode())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const int unreadSize = m_recvBufInputPos - m_recvBufOutputPos;
|
||||||
|
if (unreadSize <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_cipher.Decrypt(m_recvBuf + m_recvBufOutputPos, unreadSize);
|
||||||
|
}
|
||||||
#endif // _IMPROVED_PACKET_ENCRYPTION_
|
#endif // _IMPROVED_PACKET_ENCRYPTION_
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ class CNetworkStream
|
|||||||
size_t Prepare(void* buffer, size_t* length);
|
size_t Prepare(void* buffer, size_t* length);
|
||||||
bool Activate(size_t agreed_length, const void* buffer, size_t length);
|
bool Activate(size_t agreed_length, const void* buffer, size_t length);
|
||||||
void ActivateCipher();
|
void ActivateCipher();
|
||||||
|
void DecryptAlreadyReceivedData();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -587,7 +587,7 @@ bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader)
|
|||||||
|
|
||||||
bool CPythonNetworkStream::RecvErrorPacket(int header)
|
bool CPythonNetworkStream::RecvErrorPacket(int header)
|
||||||
{
|
{
|
||||||
TraceError("Phase %s does not handle this header (header: %u(0x%X)) Last packets: ", m_strPhase.c_str(), header);
|
TraceError("Phase %s does not handle this header (header: %u(0x%X)) Last packets: ", m_strPhase.c_str(), header, header);
|
||||||
for (const auto& it : gs_vecLastHeaders)
|
for (const auto& it : gs_vecLastHeaders)
|
||||||
TraceError("%u(0x%X)", it, it);
|
TraceError("%u(0x%X)", it, it);
|
||||||
|
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ bool CPythonNetworkStream::RecvKeyAgreementCompletedPacket()
|
|||||||
Tracenf("KEY_AGREEMENT_COMPLETED RECV");
|
Tracenf("KEY_AGREEMENT_COMPLETED RECV");
|
||||||
|
|
||||||
ActivateCipher();
|
ActivateCipher();
|
||||||
|
DecryptAlreadyReceivedData();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user