diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-03-02 01:06:28 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-03-02 01:06:28 +0100 |
commit | 55eef73c482bcc9040a3d097d4a9291fee3fdd67 (patch) | |
tree | b8d83d2f74c530f509d013661265b68a1472be19 /src/common | |
parent | e38174566419be017995f60301ae2840500502ea (diff) |
Core/PacketIO: Increase max allowed incoming packet size for CMSG_HOTFIX_REQUEST
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/Cryptography/AES.cpp | 22 | ||||
-rw-r--r-- | src/common/Cryptography/AES.h | 1 | ||||
-rw-r--r-- | src/common/Cryptography/Authentication/WorldPacketCrypt.cpp | 12 | ||||
-rw-r--r-- | src/common/Cryptography/Authentication/WorldPacketCrypt.h | 1 |
4 files changed, 36 insertions, 0 deletions
diff --git a/src/common/Cryptography/AES.cpp b/src/common/Cryptography/AES.cpp index 7d4ccc7c46f..1b011da7c9b 100644 --- a/src/common/Cryptography/AES.cpp +++ b/src/common/Cryptography/AES.cpp @@ -63,3 +63,25 @@ bool Trinity::Crypto::AES::Process(IV const& iv, uint8* data, size_t length, Tag return true; } + +bool Trinity::Crypto::AES::ProcessNoIntegrityCheck(IV const& iv, uint8* data, size_t partialLength) +{ + ASSERT(!_encrypting, "Partial encryption is not allowed"); + ASSERT(partialLength <= std::numeric_limits<int>::max()); + int len = static_cast<int>(partialLength); + if (!EVP_CipherInit_ex(_ctx, nullptr, nullptr, nullptr, iv.data(), -1)) + return false; + + int outLen; + if (!EVP_CipherUpdate(_ctx, data, &outLen, data, len)) + return false; + + len -= outLen; + + if (!EVP_CipherFinal_ex(_ctx, data + outLen, &outLen)) + return false; + + ASSERT(len == outLen); + + return true; +} diff --git a/src/common/Cryptography/AES.h b/src/common/Cryptography/AES.h index d3b9f48c552..e559be75a16 100644 --- a/src/common/Cryptography/AES.h +++ b/src/common/Cryptography/AES.h @@ -43,6 +43,7 @@ namespace Crypto void Init(Key const& key); bool Process(IV const& iv, uint8* data, size_t length, Tag& tag); + bool ProcessNoIntegrityCheck(IV const& iv, uint8* data, size_t partialLength); private: EVP_CIPHER_CTX* _ctx; diff --git a/src/common/Cryptography/Authentication/WorldPacketCrypt.cpp b/src/common/Cryptography/Authentication/WorldPacketCrypt.cpp index 723657048d5..926f77d757d 100644 --- a/src/common/Cryptography/Authentication/WorldPacketCrypt.cpp +++ b/src/common/Cryptography/Authentication/WorldPacketCrypt.cpp @@ -41,6 +41,18 @@ struct WorldPacketCryptIV std::array<uint8, 12> Value; }; +bool WorldPacketCrypt::PeekDecryptRecv(uint8* data, size_t length) +{ + if (_initialized) + { + WorldPacketCryptIV iv{ _clientCounter, 0x544E4C43 }; + if (!_clientDecrypt.ProcessNoIntegrityCheck(iv.Value, data, length)) + return false; + } + + return true; +} + bool WorldPacketCrypt::DecryptRecv(uint8* data, size_t length, Trinity::Crypto::AES::Tag& tag) { if (_initialized) diff --git a/src/common/Cryptography/Authentication/WorldPacketCrypt.h b/src/common/Cryptography/Authentication/WorldPacketCrypt.h index 5cd6e1282b8..600d0d1715e 100644 --- a/src/common/Cryptography/Authentication/WorldPacketCrypt.h +++ b/src/common/Cryptography/Authentication/WorldPacketCrypt.h @@ -27,6 +27,7 @@ public: WorldPacketCrypt(); void Init(Trinity::Crypto::AES::Key const& key); + bool PeekDecryptRecv(uint8* data, size_t length); bool DecryptRecv(uint8* data, size_t length, Trinity::Crypto::AES::Tag& tag); bool EncryptSend(uint8* data, size_t length, Trinity::Crypto::AES::Tag& tag); |