aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-03-02 01:06:28 +0100
committerShauren <shauren.trinity@gmail.com>2021-03-02 01:06:28 +0100
commit55eef73c482bcc9040a3d097d4a9291fee3fdd67 (patch)
treeb8d83d2f74c530f509d013661265b68a1472be19 /src/common
parente38174566419be017995f60301ae2840500502ea (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.cpp22
-rw-r--r--src/common/Cryptography/AES.h1
-rw-r--r--src/common/Cryptography/Authentication/WorldPacketCrypt.cpp12
-rw-r--r--src/common/Cryptography/Authentication/WorldPacketCrypt.h1
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);