aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-07-26 01:53:34 +0200
committerGitHub <noreply@github.com>2020-07-26 01:53:34 +0200
commit210176fd915cf4ba16f428d3c1a249a71f4aa7a7 (patch)
tree6998a19da1330be8679fe3e760f858915494400b /src/server/game
parentcdaf890af4b5bb7ce256752b49bba2c0f3ed9264 (diff)
Core/Authserver: Authserver cleanup (PR#25093)
- Fix a handful of 1/256 bugs with most significant byte zero in BigNumber - Get rid of (most of) the C-style arrays in authserver - CryptoRandom as a unified source for cryptographic randomness - Bring our other crypto APIs into 2020 - BigNumber usability improvements - Authserver is now actually readable as a result of all of the above
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp11
-rw-r--r--src/server/game/Scripting/ScriptReloadMgr.cpp5
-rw-r--r--src/server/game/Server/WorldSession.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h3
-rw-r--r--src/server/game/Server/WorldSocket.cpp49
-rw-r--r--src/server/game/Server/WorldSocket.h2
-rw-r--r--src/server/game/Warden/Warden.cpp6
-rw-r--r--src/server/game/Warden/Warden.h11
-rw-r--r--src/server/game/Warden/WardenCheckMgr.cpp22
-rw-r--r--src/server/game/Warden/WardenMac.cpp28
-rw-r--r--src/server/game/Warden/WardenMac.h6
-rw-r--r--src/server/game/Warden/WardenWin.cpp45
-rw-r--r--src/server/game/Warden/WardenWin.h4
13 files changed, 80 insertions, 114 deletions
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index cc620e241f4..4b370181dee 100644
--- a/src/server/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
@@ -18,12 +18,12 @@
#include "AccountMgr.h"
#include "Config.h"
#include "DatabaseEnv.h"
+#include "CryptoHash.h"
#include "Log.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "Realm.h"
#include "ScriptMgr.h"
-#include "SHA1.h"
#include "Util.h"
#include "World.h"
#include "WorldSession.h"
@@ -379,14 +379,7 @@ uint32 AccountMgr::GetCharactersCount(uint32 accountId)
std::string AccountMgr::CalculateShaPassHash(std::string const& name, std::string const& password)
{
- SHA1Hash sha;
- sha.Initialize();
- sha.UpdateData(name);
- sha.UpdateData(":");
- sha.UpdateData(password);
- sha.Finalize();
-
- return ByteArrayToHexStr(sha.GetDigest(), sha.GetLength());
+ return ByteArrayToHexStr(Trinity::Crypto::SHA1::GetDigestOf(name, ":", password));
}
bool AccountMgr::IsBannedAccount(std::string const& name)
diff --git a/src/server/game/Scripting/ScriptReloadMgr.cpp b/src/server/game/Scripting/ScriptReloadMgr.cpp
index f6619fa7ea9..580642dde66 100644
--- a/src/server/game/Scripting/ScriptReloadMgr.cpp
+++ b/src/server/game/Scripting/ScriptReloadMgr.cpp
@@ -40,13 +40,14 @@ ScriptReloadMgr* ScriptReloadMgr::instance()
#include "BuiltInConfig.h"
#include "Config.h"
#include "GitRevision.h"
+#include "CryptoHash.h"
#include "Log.h"
#include "MPSCQueue.h"
#include "Regex.h"
#include "ScriptMgr.h"
-#include "SHA1.h"
#include "StartProcess.h"
#include "Timer.h"
+#include "Util.h"
#include "World.h"
#include <boost/algorithm/string/replace.hpp>
#include <boost/filesystem.hpp>
@@ -756,7 +757,7 @@ private:
auto path = fs::temp_directory_path();
path /= Trinity::StringFormat("tc_script_cache_%s_%s",
GitRevision::GetBranch(),
- CalculateSHA1Hash(sConfigMgr->GetFilename()).c_str());
+ ByteArrayToHexStr(Trinity::Crypto::SHA1::GetDigestOf(sConfigMgr->GetFilename())).c_str());
return path;
}
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 6c3cf1b43ff..abbf28c8bae 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -1209,7 +1209,7 @@ TransactionCallback& WorldSession::AddTransactionCallback(TransactionCallback&&
return _transactionCallbacks.AddCallback(std::move(callback));
}
-void WorldSession::InitWarden(BigNumber* k, std::string const& os)
+void WorldSession::InitWarden(std::array<uint8, 40> const& k, std::string const& os)
{
if (os == "Win")
{
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index e72ade20183..9d7cbc2cde7 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -34,7 +34,6 @@
#include <unordered_map>
#include <boost/circular_buffer.hpp>
-class BigNumber;
class Creature;
class GameObject;
class InstanceSave;
@@ -423,7 +422,7 @@ class TC_GAME_API WorldSession
void SetPlayer(Player* player);
uint8 Expansion() const { return m_expansion; }
- void InitWarden(BigNumber* k, std::string const& os);
+ void InitWarden(std::array<uint8, 40> const& k, std::string const& os);
/// Session in auth.queue currently
void SetInQueue(bool state) { m_inQueue = state; }
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 05b5c8bb9b0..6dac06165c8 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -19,6 +19,8 @@
#include "BigNumber.h"
#include "DatabaseEnv.h"
#include "GameTime.h"
+#include "CryptoHash.h"
+#include "CryptoRandom.h"
#include "IPLocation.h"
#include "Opcodes.h"
#include "PacketLog.h"
@@ -26,7 +28,6 @@
#include "RBAC.h"
#include "Realm.h"
#include "ScriptMgr.h"
-#include "SHA1.h"
#include "World.h"
#include "WorldSession.h"
#include <memory>
@@ -34,8 +35,9 @@
using boost::asio::ip::tcp;
WorldSocket::WorldSocket(tcp::socket&& socket)
- : Socket(std::move(socket)), _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _sendBufferSize(4096)
+ : Socket(std::move(socket)), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _sendBufferSize(4096)
{
+ Trinity::Crypto::GetRandomBytes(_authSeed);
_headerBuffer.Resize(sizeof(ClientPktHeader));
}
@@ -126,15 +128,9 @@ void WorldSocket::HandleSendAuthSession()
{
WorldPacket packet(SMSG_AUTH_CHALLENGE, 37);
packet << uint32(1); // 1...31
- packet << uint32(_authSeed);
+ packet.append(_authSeed);
- BigNumber seed1;
- seed1.SetRand(16 * 8);
- packet.append(seed1.AsByteArray(16).get(), 16); // new encryption seeds
-
- BigNumber seed2;
- seed2.SetRand(16 * 8);
- packet.append(seed2.AsByteArray(16).get(), 16); // new encryption seeds
+ packet.append(Trinity::Crypto::GetRandomBytes<32>()); // new encryption seeds
SendPacketAndLogOpcode(packet);
}
@@ -212,7 +208,8 @@ bool WorldSocket::ReadHeaderHandler()
{
ASSERT(_headerBuffer.GetActiveSize() == sizeof(ClientPktHeader));
- _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), sizeof(ClientPktHeader));
+ if (_authCrypt.IsInitialized())
+ _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), sizeof(ClientPktHeader));
ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer());
EndianConvertReverse(header->size);
@@ -236,11 +233,11 @@ struct AuthSession
uint32 LoginServerType = 0;
uint32 RealmID = 0;
uint32 Build = 0;
- uint32 LocalChallenge = 0;
+ std::array<uint8, 4> LocalChallenge;
uint32 LoginServerID = 0;
uint32 RegionID = 0;
uint64 DosResponse = 0;
- uint8 Digest[SHA_DIGEST_LENGTH] = {};
+ Trinity::Crypto::SHA1::Digest Digest;
std::string Account;
ByteBuffer AddonInfo;
};
@@ -248,7 +245,7 @@ struct AuthSession
struct AccountInfo
{
uint32 Id;
- BigNumber SessionKey;
+ std::array<uint8, 40> SessionKey;
std::string LastIP;
bool IsLockedToIP;
std::string LockCountry;
@@ -273,7 +270,7 @@ struct AccountInfo
// LEFT JOIN account r ON a.id = r.recruiter
// WHERE a.username = ? ORDER BY aa.RealmID DESC LIMIT 1
Id = fields[0].GetUInt32();
- SessionKey.SetHexStr(fields[1].GetCString());
+ HexStrToByteArray(fields[1].GetCString(), SessionKey.data());
LastIP = fields[2].GetString();
IsLockedToIP = fields[3].GetBool();
LockCountry = fields[4].GetString();
@@ -428,12 +425,12 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
recvPacket >> authSession->LoginServerID;
recvPacket >> authSession->Account;
recvPacket >> authSession->LoginServerType;
- recvPacket >> authSession->LocalChallenge;
+ recvPacket.read(authSession->LocalChallenge);
recvPacket >> authSession->RegionID;
recvPacket >> authSession->BattlegroupID;
recvPacket >> authSession->RealmID; // realmId from auth_database.realmlist table
recvPacket >> authSession->DosResponse;
- recvPacket.read(authSession->Digest, 20);
+ recvPacket.read(authSession->Digest);
authSession->AddonInfo.resize(recvPacket.size() - recvPacket.rpos());
recvPacket.read(authSession->AddonInfo.contents(), authSession->AddonInfo.size()); // .contents will throw if empty, thats what we want
@@ -470,7 +467,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
// This also allows to check for possible "hack" attempts on account
// even if auth credentials are bad, try using the session key we have - client cannot read auth response error without it
- _authCrypt.Init(&account.SessionKey);
+ _authCrypt.Init(account.SessionKey);
// First reject the connection if packet contains invalid data or realm state doesn't allow logging in
if (sWorld->IsClosed())
@@ -501,17 +498,17 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
}
// Check that Key and account name are the same on client and server
- uint32 t = 0;
+ uint8 t[4] = { 0x00,0x00,0x00,0x00 };
- SHA1Hash sha;
+ Trinity::Crypto::SHA1 sha;
sha.UpdateData(authSession->Account);
- sha.UpdateData((uint8*)&t, 4);
- sha.UpdateData((uint8*)&authSession->LocalChallenge, 4);
- sha.UpdateData((uint8*)&_authSeed, 4);
- sha.UpdateBigNumbers(&account.SessionKey, nullptr);
+ sha.UpdateData(t);
+ sha.UpdateData(authSession->LocalChallenge);
+ sha.UpdateData(_authSeed);
+ sha.UpdateData(account.SessionKey);
sha.Finalize();
- if (memcmp(sha.GetDigest(), authSession->Digest, SHA_DIGEST_LENGTH) != 0)
+ if (sha.GetDigest() != authSession->Digest)
{
SendAuthResponseError(AUTH_FAILED);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", account.Id, authSession->Account.c_str(), address.c_str());
@@ -601,7 +598,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
// Initialize Warden system only if it is enabled by config
if (wardenActive)
- _worldSession->InitWarden(&account.SessionKey, account.OS);
+ _worldSession->InitWarden(account.SessionKey, account.OS);
_queryProcessor.AddCallback(_worldSession->LoadPermissionsAsync().WithPreparedCallback(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)));
AsyncRead();
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index 4920280acb6..77511f774e3 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -112,7 +112,7 @@ private:
bool HandlePing(WorldPacket& recvPacket);
- uint32 _authSeed;
+ std::array<uint8, 4> _authSeed;
AuthCrypt _authCrypt;
TimePoint _LastPingTime;
diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp
index 9f887cfedae..7fc532fd961 100644
--- a/src/server/game/Warden/Warden.cpp
+++ b/src/server/game/Warden/Warden.cpp
@@ -29,7 +29,7 @@
#include <openssl/sha.h>
-Warden::Warden() : _session(nullptr), _inputCrypto(16), _outputCrypto(16), _checkTimer(10000/*10 sec*/), _clientResponseTimer(0),
+Warden::Warden() : _session(nullptr), _checkTimer(10000/*10 sec*/), _clientResponseTimer(0),
_dataSent(false), _previousTimestamp(0), _module(nullptr), _initialized(false)
{
memset(_inputKey, 0, sizeof(_inputKey));
@@ -130,12 +130,12 @@ void Warden::Update()
void Warden::DecryptData(uint8* buffer, uint32 length)
{
- _inputCrypto.UpdateData(length, buffer);
+ _inputCrypto.UpdateData(buffer, length);
}
void Warden::EncryptData(uint8* buffer, uint32 length)
{
- _outputCrypto.UpdateData(length, buffer);
+ _outputCrypto.UpdateData(buffer, length);
}
bool Warden::IsValidCheckSum(uint32 checksum, uint8 const* data, const uint16 length)
diff --git a/src/server/game/Warden/Warden.h b/src/server/game/Warden/Warden.h
index 24d6cf9bc34..3d9543a7412 100644
--- a/src/server/game/Warden/Warden.h
+++ b/src/server/game/Warden/Warden.h
@@ -18,11 +18,10 @@
#ifndef _WARDEN_BASE_H
#define _WARDEN_BASE_H
-#include <map>
-#include "Cryptography/ARC4.h"
-#include "Cryptography/BigNumber.h"
+#include "ARC4.h"
#include "ByteBuffer.h"
#include "WardenCheckMgr.h"
+#include <array>
enum WardenOpcodes
{
@@ -100,7 +99,7 @@ class TC_GAME_API Warden
Warden();
virtual ~Warden();
- virtual void Init(WorldSession* session, BigNumber* k) = 0;
+ virtual void Init(WorldSession* session, std::array<uint8, 40> const& K) = 0;
virtual ClientWardenModule* GetModuleForClient() = 0;
virtual void InitializeModule() = 0;
virtual void RequestHash() = 0;
@@ -125,8 +124,8 @@ class TC_GAME_API Warden
uint8 _inputKey[16];
uint8 _outputKey[16];
uint8 _seed[16];
- ARC4 _inputCrypto;
- ARC4 _outputCrypto;
+ Trinity::Crypto::ARC4 _inputCrypto;
+ Trinity::Crypto::ARC4 _outputCrypto;
uint32 _checkTimer; // Timer for sending check requests
uint32 _clientResponseTimer; // Timer for client response delay
bool _dataSent;
diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp
index aa8ca22f079..49ed703d1ca 100644
--- a/src/server/game/Warden/WardenCheckMgr.cpp
+++ b/src/server/game/Warden/WardenCheckMgr.cpp
@@ -85,19 +85,7 @@ void WardenCheckMgr::LoadWardenChecks()
wardenCheck->Action = WardenActions(sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION));
if (checkType == PAGE_CHECK_A || checkType == PAGE_CHECK_B || checkType == DRIVER_CHECK)
- {
wardenCheck->Data.SetHexStr(data.c_str());
- int len = data.size() / 2;
-
- if (wardenCheck->Data.GetNumBytes() < len)
- {
- uint8 temp[24];
- memset(temp, 0, len);
- memcpy(temp, wardenCheck->Data.AsByteArray().get(), wardenCheck->Data.GetNumBytes());
- std::reverse(temp, temp + len);
- wardenCheck->Data.SetBinary((uint8*)temp, len);
- }
- }
if (checkType == MEM_CHECK || checkType == MODULE_CHECK)
MemChecksIdPool.push_back(id);
@@ -120,16 +108,6 @@ void WardenCheckMgr::LoadWardenChecks()
{
WardenCheckResult* wr = new WardenCheckResult();
wr->Result.SetHexStr(checkResult.c_str());
- int len = checkResult.size() / 2;
- if (wr->Result.GetNumBytes() < len)
- {
- uint8 *temp = new uint8[len];
- memset(temp, 0, len);
- memcpy(temp, wr->Result.AsByteArray().get(), wr->Result.GetNumBytes());
- std::reverse(temp, temp + len);
- wr->Result.SetBinary((uint8*)temp, len);
- delete [] temp;
- }
CheckResultStore[id] = wr;
}
diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp
index 847a3cf69a0..e8a5b45cd76 100644
--- a/src/server/game/Warden/WardenMac.cpp
+++ b/src/server/game/Warden/WardenMac.cpp
@@ -15,18 +15,18 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "Cryptography/WardenKeyGeneration.h"
+#include "WardenMac.h"
+#include "ByteBuffer.h"
#include "Common.h"
-#include "WorldPacket.h"
-#include "WorldSession.h"
+#include "GameTime.h"
#include "Log.h"
#include "Opcodes.h"
-#include "ByteBuffer.h"
-#include "GameTime.h"
#include "Player.h"
+#include "SessionKeyGenerator.h"
#include "Util.h"
-#include "WardenMac.h"
#include "WardenModuleMac.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
#include <openssl/md5.h>
@@ -34,11 +34,11 @@ WardenMac::WardenMac() : Warden() { }
WardenMac::~WardenMac() { }
-void WardenMac::Init(WorldSession* pClient, BigNumber* K)
+void WardenMac::Init(WorldSession* pClient, std::array<uint8, 40> const& K)
{
_session = pClient;
// Generate Warden Key
- SHA1Randx WK(K->AsByteArray().get(), K->GetNumBytes());
+ SessionKeyGenerator<Trinity::Crypto::SHA1> WK(K);
WK.Generate(_inputKey, 16);
WK.Generate(_outputKey, 16);
/*
@@ -154,14 +154,14 @@ void WardenMac::HandleHashResult(ByteBuffer &buff)
buff.rpos(buff.wpos());
- SHA1Hash sha1;
+ Trinity::Crypto::SHA1 sha1;
sha1.UpdateData((uint8*)keyIn, 16);
sha1.Finalize();
//const uint8 validHash[20] = { 0x56, 0x8C, 0x05, 0x4C, 0x78, 0x1A, 0x97, 0x2A, 0x60, 0x37, 0xA2, 0x29, 0x0C, 0x22, 0xB5, 0x25, 0x71, 0xA0, 0x6F, 0x4E };
// Verify key
- if (memcmp(buff.contents() + 1, sha1.GetDigest(), 20) != 0)
+ if (memcmp(buff.contents() + 1, sha1.GetDigest().data(), 20) != 0)
{
TC_LOG_WARN("warden", "%s failed hash reply. Action: %s", _session->GetPlayerInfo().c_str(), Penalty().c_str());
return;
@@ -235,16 +235,16 @@ void WardenMac::HandleData(ByteBuffer &buff)
std::string str = "Test string!";
- SHA1Hash sha1;
+ Trinity::Crypto::SHA1 sha1;
sha1.UpdateData(str);
uint32 magic = 0xFEEDFACE; // unsure
sha1.UpdateData((uint8*)&magic, 4);
sha1.Finalize();
- uint8 sha1Hash[20];
- buff.read(sha1Hash, 20);
+ std::array<uint8, Trinity::Crypto::SHA1::DIGEST_LENGTH> sha1Hash;
+ buff.read(sha1Hash.data(), sha1Hash.size());
- if (memcmp(sha1Hash, sha1.GetDigest(), 20) != 0)
+ if (sha1Hash != sha1.GetDigest())
{
TC_LOG_DEBUG("warden", "Handle data failed: SHA1 hash is wrong!");
//found = true;
diff --git a/src/server/game/Warden/WardenMac.h b/src/server/game/Warden/WardenMac.h
index 81ab864cf02..c186e546f9e 100644
--- a/src/server/game/Warden/WardenMac.h
+++ b/src/server/game/Warden/WardenMac.h
@@ -18,9 +18,7 @@
#ifndef _WARDEN_MAC_H
#define _WARDEN_MAC_H
-#include "Cryptography/ARC4.h"
-#include <map>
-#include "Cryptography/BigNumber.h"
+#include "ARC4.h"
#include "ByteBuffer.h"
#include "Warden.h"
@@ -33,7 +31,7 @@ class TC_GAME_API WardenMac : public Warden
WardenMac();
~WardenMac();
- void Init(WorldSession* session, BigNumber* k) override;
+ void Init(WorldSession* session, std::array<uint8, 40> const& k) override;
ClientWardenModule* GetModuleForClient() override;
void InitializeModule() override;
void RequestHash() override;
diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp
index f973bfad79c..f423ab2486e 100644
--- a/src/server/game/Warden/WardenWin.cpp
+++ b/src/server/game/Warden/WardenWin.cpp
@@ -15,34 +15,35 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "Cryptography/HMACSHA1.h"
-#include "Cryptography/WardenKeyGeneration.h"
+#include "WardenWin.h"
#include "Common.h"
-#include "WorldPacket.h"
-#include "WorldSession.h"
-#include "Log.h"
-#include "Opcodes.h"
#include "ByteBuffer.h"
-#include "Database/DatabaseEnv.h"
+#include "CryptoRandom.h"
+#include "DatabaseEnv.h"
#include "GameTime.h"
-#include "World.h"
+#include "HMAC.h"
+#include "Log.h"
+#include "Opcodes.h"
#include "Player.h"
+#include "Random.h"
+#include "SessionKeyGenerator.h"
#include "Util.h"
-#include "WardenWin.h"
#include "WardenModuleWin.h"
#include "WardenCheckMgr.h"
-#include "Random.h"
+#include "World.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
#include <openssl/md5.h>
WardenWin::WardenWin() : Warden(), _serverTicks(0) {}
WardenWin::~WardenWin() { }
-void WardenWin::Init(WorldSession* session, BigNumber* k)
+void WardenWin::Init(WorldSession* session, std::array<uint8, 40> const& K)
{
_session = session;
// Generate Warden Key
- SHA1Randx WK(k->AsByteArray().get(), k->GetNumBytes());
+ SessionKeyGenerator<Trinity::Crypto::SHA1> WK(K);
WK.Generate(_inputKey, 16);
WK.Generate(_outputKey, 16);
@@ -262,7 +263,8 @@ void WardenWin::RequestData()
case PAGE_CHECK_A:
case PAGE_CHECK_B:
{
- buff.append(wd->Data.AsByteArray(0, false).get(), wd->Data.GetNumBytes());
+ std::vector<uint8> data = wd->Data.ToByteVector(0, false);
+ buff.append(data.data(), data.size());
buff << uint32(wd->Address);
buff << uint8(wd->Length);
break;
@@ -275,18 +277,16 @@ void WardenWin::RequestData()
}
case DRIVER_CHECK:
{
- buff.append(wd->Data.AsByteArray(0, false).get(), wd->Data.GetNumBytes());
+ std::vector<uint8> data = wd->Data.ToByteVector(0, false);
+ buff.append(data.data(), data.size());
buff << uint8(index++);
break;
}
case MODULE_CHECK:
{
- uint32 seed = rand32();
- buff << uint32(seed);
- HmacHash hmac(4, (uint8*)&seed);
- hmac.UpdateData(wd->Str);
- hmac.Finalize();
- buff.append(hmac.GetDigest(), hmac.GetLength());
+ std::array<uint8, 4> seed = Trinity::Crypto::GetRandomBytes<4>();
+ buff.append(seed);
+ buff.append(Trinity::Crypto::HMAC_SHA1::GetDigestOf(seed, wd->Str));
break;
}
/*case PROC_CHECK:
@@ -391,7 +391,8 @@ void WardenWin::HandleData(ByteBuffer &buff)
continue;
}
- if (memcmp(buff.contents() + buff.rpos(), rs->Result.AsByteArray(0, false).get(), rd->Length) != 0)
+ std::vector<uint8> result = rs->Result.ToByteVector();
+ if (memcmp(buff.contents() + buff.rpos(), result.data(), rd->Length) != 0)
{
TC_LOG_DEBUG("warden", "RESULT MEM_CHECK fail CheckId %u account Id %u", *itr, _session->GetAccountId());
checkFailed = *itr;
@@ -470,7 +471,7 @@ void WardenWin::HandleData(ByteBuffer &buff)
continue;
}
- if (memcmp(buff.contents() + buff.rpos(), rs->Result.AsByteArray(0, false).get(), 20) != 0) // SHA1
+ if (memcmp(buff.contents() + buff.rpos(), rs->Result.ToByteArray<20>(false).data(), 20) != 0) // SHA1
{
TC_LOG_DEBUG("warden", "RESULT MPQ_CHECK fail, CheckId %u account Id %u", *itr, _session->GetAccountId());
checkFailed = *itr;
diff --git a/src/server/game/Warden/WardenWin.h b/src/server/game/Warden/WardenWin.h
index c45d73572be..77f66f621a3 100644
--- a/src/server/game/Warden/WardenWin.h
+++ b/src/server/game/Warden/WardenWin.h
@@ -18,11 +18,11 @@
#ifndef _WARDEN_WIN_H
#define _WARDEN_WIN_H
-#include <map>
#include "Cryptography/ARC4.h"
#include "Cryptography/BigNumber.h"
#include "ByteBuffer.h"
#include "Warden.h"
+#include <list>
#pragma pack(push, 1)
@@ -67,7 +67,7 @@ class TC_GAME_API WardenWin : public Warden
WardenWin();
~WardenWin();
- void Init(WorldSession* session, BigNumber* K) override;
+ void Init(WorldSession* session, std::array<uint8, 40> const& K) override;
ClientWardenModule* GetModuleForClient() override;
void InitializeModule() override;
void RequestHash() override;