diff options
Diffstat (limited to 'src/server/shared')
| -rw-r--r-- | src/server/shared/Cryptography/Authentication/PacketCrypt.cpp | 39 | ||||
| -rw-r--r-- | src/server/shared/Cryptography/Authentication/PacketCrypt.h (renamed from src/server/shared/Cryptography/Authentication/AuthCrypt.h) | 21 | ||||
| -rw-r--r-- | src/server/shared/Cryptography/Authentication/WorldPacketCrypt.cpp (renamed from src/server/shared/Cryptography/Authentication/AuthCrypt.cpp) | 38 | ||||
| -rw-r--r-- | src/server/shared/Cryptography/Authentication/WorldPacketCrypt.h | 34 | ||||
| -rw-r--r-- | src/server/shared/Cryptography/HmacHash.cpp (renamed from src/server/shared/Cryptography/HMACSHA1.cpp) | 28 | ||||
| -rw-r--r-- | src/server/shared/Cryptography/HmacHash.h (renamed from src/server/shared/Cryptography/HMACSHA1.h) | 13 | 
6 files changed, 114 insertions, 59 deletions
diff --git a/src/server/shared/Cryptography/Authentication/PacketCrypt.cpp b/src/server/shared/Cryptography/Authentication/PacketCrypt.cpp new file mode 100644 index 00000000000..7fac311b8a2 --- /dev/null +++ b/src/server/shared/Cryptography/Authentication/PacketCrypt.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "PacketCrypt.h" + +PacketCrypt::PacketCrypt(uint32 rc4InitSize) +    : _clientDecrypt(rc4InitSize), _serverEncrypt(rc4InitSize), _initialized(false) +{ +} + +void PacketCrypt::DecryptRecv(uint8* data, size_t len) +{ +    if (!_initialized) +        return; + +    _clientDecrypt.UpdateData(len, data); +} + +void PacketCrypt::EncryptSend(uint8* data, size_t len) +{ +    if (!_initialized) +        return; + +    _serverEncrypt.UpdateData(len, data); +} diff --git a/src/server/shared/Cryptography/Authentication/AuthCrypt.h b/src/server/shared/Cryptography/Authentication/PacketCrypt.h index 8fa150068a2..36f3b81fb53 100644 --- a/src/server/shared/Cryptography/Authentication/AuthCrypt.h +++ b/src/server/shared/Cryptography/Authentication/PacketCrypt.h @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,27 +15,29 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#ifndef _AUTHCRYPT_H -#define _AUTHCRYPT_H +#ifndef _PACKETCRYPT_H +#define _PACKETCRYPT_H  #include "Cryptography/ARC4.h"  class BigNumber; -class AuthCrypt +class PacketCrypt  {      public: -        AuthCrypt(); +        PacketCrypt(uint32 rc4InitSize); +        virtual ~PacketCrypt() { } -        void Init(BigNumber* K); -        void DecryptRecv(uint8 *, size_t); -        void EncryptSend(uint8 *, size_t); +        virtual void Init(BigNumber* K) = 0; +        void DecryptRecv(uint8* data, size_t length); +        void EncryptSend(uint8* data, size_t length);          bool IsInitialized() const { return _initialized; } -    private: +    protected:          ARC4 _clientDecrypt;          ARC4 _serverEncrypt;          bool _initialized;  }; -#endif + +#endif // _PACKETCRYPT_H diff --git a/src/server/shared/Cryptography/Authentication/AuthCrypt.cpp b/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.cpp index ff94f307254..c6b283d9961 100644 --- a/src/server/shared/Cryptography/Authentication/AuthCrypt.cpp +++ b/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.cpp @@ -16,58 +16,36 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#include "AuthCrypt.h" -#include "Cryptography/HMACSHA1.h" +#include "WorldPacketCrypt.h" +#include "Cryptography/HmacHash.h"  #include "Cryptography/BigNumber.h" -AuthCrypt::AuthCrypt() : -    _clientDecrypt(SHA_DIGEST_LENGTH), _serverEncrypt(SHA_DIGEST_LENGTH), -    _initialized(false) -{ } +WorldPacketCrypt::WorldPacketCrypt() : PacketCrypt(SHA_DIGEST_LENGTH) +{ +} -void AuthCrypt::Init(BigNumber* K) +void WorldPacketCrypt::Init(BigNumber* K)  {      uint8 ServerEncryptionKey[SEED_KEY_SIZE] = { 0xCC, 0x98, 0xAE, 0x04, 0xE8, 0x97, 0xEA, 0xCA, 0x12, 0xDD, 0xC0, 0x93, 0x42, 0x91, 0x53, 0x57 }; -    HmacHash serverEncryptHmac(SEED_KEY_SIZE, (uint8*)ServerEncryptionKey); +    HmacHash serverEncryptHmac(SEED_KEY_SIZE, (uint8*)ServerEncryptionKey, EVP_sha1(), SHA_DIGEST_LENGTH);      uint8 *encryptHash = serverEncryptHmac.ComputeHash(K);      uint8 ServerDecryptionKey[SEED_KEY_SIZE] = { 0xC2, 0xB3, 0x72, 0x3C, 0xC6, 0xAE, 0xD9, 0xB5, 0x34, 0x3C, 0x53, 0xEE, 0x2F, 0x43, 0x67, 0xCE }; -    HmacHash clientDecryptHmac(SEED_KEY_SIZE, (uint8*)ServerDecryptionKey); +    HmacHash clientDecryptHmac(SEED_KEY_SIZE, (uint8*)ServerDecryptionKey, EVP_sha1(), SHA_DIGEST_LENGTH);      uint8 *decryptHash = clientDecryptHmac.ComputeHash(K); -    //ARC4 _serverDecrypt(encryptHash);      _clientDecrypt.Init(decryptHash);      _serverEncrypt.Init(encryptHash); -    //ARC4 _clientEncrypt(decryptHash);      // Drop first 1024 bytes, as WoW uses ARC4-drop1024.      uint8 syncBuf[1024];      memset(syncBuf, 0, 1024);      _serverEncrypt.UpdateData(1024, syncBuf); -    //_clientEncrypt.UpdateData(1024, syncBuf);      memset(syncBuf, 0, 1024); -    //_serverDecrypt.UpdateData(1024, syncBuf);      _clientDecrypt.UpdateData(1024, syncBuf);      _initialized = true;  } - -void AuthCrypt::DecryptRecv(uint8 *data, size_t len) -{ -    if (!_initialized) -        return; - -    _clientDecrypt.UpdateData(len, data); -} - -void AuthCrypt::EncryptSend(uint8 *data, size_t len) -{ -    if (!_initialized) -        return; - -    _serverEncrypt.UpdateData(len, data); -} - diff --git a/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.h b/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.h new file mode 100644 index 00000000000..7ccca11f09d --- /dev/null +++ b/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _WORLDPACKETCRYPT_H +#define _WORLDPACKETCRYPT_H + +#include "PacketCrypt.h" + +class BigNumber; + +class WorldPacketCrypt : public PacketCrypt +{ +    public: +        WorldPacketCrypt(); + +        void Init(BigNumber* K) override; +}; + +#endif // _WORLDPACKETCRYPT_H diff --git a/src/server/shared/Cryptography/HMACSHA1.cpp b/src/server/shared/Cryptography/HmacHash.cpp index 2148a3b8a7b..7a365ade457 100644 --- a/src/server/shared/Cryptography/HMACSHA1.cpp +++ b/src/server/shared/Cryptography/HmacHash.cpp @@ -16,42 +16,44 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#include "HMACSHA1.h" +#include "HmacHash.h"  #include "BigNumber.h"  #include "Common.h" -HmacHash::HmacHash(uint32 len, uint8 *seed) +HmacHash::HmacHash(uint32 len, uint8 *seed, EVP_MD const* hasher, uint32 digestLength)  { -    HMAC_CTX_init(&m_ctx); -    HMAC_Init_ex(&m_ctx, seed, len, EVP_sha1(), NULL); -    memset(m_digest, 0, sizeof(m_digest)); +    HMAC_CTX_init(&_ctx); +    HMAC_Init_ex(&_ctx, seed, len, hasher, NULL); +    _digest = new uint8[digestLength]; +    memset(_digest, 0, digestLength);  }  HmacHash::~HmacHash()  { -    HMAC_CTX_cleanup(&m_ctx); +    HMAC_CTX_cleanup(&_ctx); +    delete[] _digest;  }  void HmacHash::UpdateData(const std::string &str)  { -    HMAC_Update(&m_ctx, (uint8 const*)str.c_str(), str.length()); +    HMAC_Update(&_ctx, (uint8 const*)str.c_str(), str.length());  }  void HmacHash::UpdateData(const uint8* data, size_t len)  { -    HMAC_Update(&m_ctx, data, len); +    HMAC_Update(&_ctx, data, len);  }  void HmacHash::Finalize()  {      uint32 length = 0; -    HMAC_Final(&m_ctx, (uint8*)m_digest, &length); -    ASSERT(length == SHA_DIGEST_LENGTH); +    HMAC_Final(&_ctx, _digest, &length); +    ASSERT(length == _digestLength);  } -uint8 *HmacHash::ComputeHash(BigNumber* bn) +uint8* HmacHash::ComputeHash(BigNumber* bn)  { -    HMAC_Update(&m_ctx, bn->AsByteArray().get(), bn->GetNumBytes()); +    HMAC_Update(&_ctx, bn->AsByteArray().get(), bn->GetNumBytes());      Finalize(); -    return (uint8*)m_digest; +    return _digest;  } diff --git a/src/server/shared/Cryptography/HMACSHA1.h b/src/server/shared/Cryptography/HmacHash.h index de1556d3c98..cf59e16f08e 100644 --- a/src/server/shared/Cryptography/HMACSHA1.h +++ b/src/server/shared/Cryptography/HmacHash.h @@ -31,17 +31,18 @@ class BigNumber;  class HmacHash  {      public: -        HmacHash(uint32 len, uint8 *seed); +        HmacHash(uint32 len, uint8 *seed, EVP_MD const* hasher, uint32 digestLength);          ~HmacHash();          void UpdateData(const std::string &str);          void UpdateData(const uint8* data, size_t len);          void Finalize(); -        uint8 *ComputeHash(BigNumber* bn); -        uint8 *GetDigest() { return (uint8*)m_digest; } +        uint8* ComputeHash(BigNumber* bn); +        uint8* GetDigest() { return _digest; }          int GetLength() const { return SHA_DIGEST_LENGTH; }      private: -        HMAC_CTX m_ctx; -        uint8 m_digest[SHA_DIGEST_LENGTH]; +        HMAC_CTX _ctx; +        uint8* _digest; +        uint32 _digestLength;  }; -#endif +#endif  | 
