mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 19:37:03 +00:00
Updated to 9658 client build, SMSG_ADDON_INFO temporary disabled
This commit is contained in:
parent
6aadc16d7d
commit
8f9849969b
19 changed files with 110 additions and 70 deletions
|
|
@ -269,13 +269,16 @@ void WorldSession::HandleBattleGroundPVPlogdataOpcode( WorldPacket & /*recv_data
|
||||||
|
|
||||||
void WorldSession::HandleBattleGroundListOpcode( WorldPacket &recv_data )
|
void WorldSession::HandleBattleGroundListOpcode( WorldPacket &recv_data )
|
||||||
{
|
{
|
||||||
CHECK_PACKET_SIZE(recv_data, 4);
|
CHECK_PACKET_SIZE(recv_data, 4 + 1);
|
||||||
|
|
||||||
sLog.outDebug( "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message");
|
sLog.outDebug( "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message");
|
||||||
|
|
||||||
uint32 bgTypeId;
|
uint32 bgTypeId;
|
||||||
recv_data >> bgTypeId; // id from DBC
|
recv_data >> bgTypeId; // id from DBC
|
||||||
|
|
||||||
|
//uint8 unk;
|
||||||
|
//recv_data >> unk; // that byte is constant 0 in 3.1
|
||||||
|
|
||||||
BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
|
BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
|
||||||
if(!bl)
|
if(!bl)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1788,6 +1788,7 @@ void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint6
|
||||||
|
|
||||||
data->Initialize(SMSG_BATTLEFIELD_LIST);
|
data->Initialize(SMSG_BATTLEFIELD_LIST);
|
||||||
*data << uint64(guid); // battlemaster guid
|
*data << uint64(guid); // battlemaster guid
|
||||||
|
*data << uint8(0); // unknown 3.1
|
||||||
*data << uint32(bgTypeId); // battleground id
|
*data << uint32(bgTypeId); // battleground id
|
||||||
if(bgTypeId == BATTLEGROUND_AA) // arena
|
if(bgTypeId == BATTLEGROUND_AA) // arena
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ GameObject::GameObject() : WorldObject()
|
||||||
m_objectType |= TYPEMASK_GAMEOBJECT;
|
m_objectType |= TYPEMASK_GAMEOBJECT;
|
||||||
m_objectTypeId = TYPEID_GAMEOBJECT;
|
m_objectTypeId = TYPEID_GAMEOBJECT;
|
||||||
// 3.1.0 - 0x348
|
// 3.1.0 - 0x348
|
||||||
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK1 | UPDATEFLAG_UNK2);
|
m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK1 | UPDATEFLAG_UNK2);
|
||||||
|
|
||||||
m_valuesCount = GAMEOBJECT_END;
|
m_valuesCount = GAMEOBJECT_END;
|
||||||
m_respawnTime = 0;
|
m_respawnTime = 0;
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@ Item::Item( )
|
||||||
m_objectType |= TYPEMASK_ITEM;
|
m_objectType |= TYPEMASK_ITEM;
|
||||||
m_objectTypeId = TYPEID_ITEM;
|
m_objectTypeId = TYPEID_ITEM;
|
||||||
// 3.1.0 - 0x08
|
// 3.1.0 - 0x08
|
||||||
m_updateFlag = UPDATEFLAG_LOWGUID;
|
m_updateFlag = UPDATEFLAG_HIGHGUID;
|
||||||
|
|
||||||
m_valuesCount = ITEM_END;
|
m_valuesCount = ITEM_END;
|
||||||
m_slot = 0;
|
m_slot = 0;
|
||||||
|
|
|
||||||
|
|
@ -1249,4 +1249,6 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||||
/*0x4C4*/ { "UMSG_UNKNOWN_1220", STATUS_NEVER, &WorldSession::Handle_NULL },
|
/*0x4C4*/ { "UMSG_UNKNOWN_1220", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||||
/*0x4C5*/ { "UMSG_UNKNOWN_1221", STATUS_NEVER, &WorldSession::Handle_NULL },
|
/*0x4C5*/ { "UMSG_UNKNOWN_1221", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||||
/*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL },
|
/*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||||
|
/*0x4C7*/ { "SMSG_UNKNOWN_1223", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||||
|
/*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1258,7 +1258,8 @@ enum Opcodes
|
||||||
UMSG_UNKNOWN_1221 = 0x4C5, // not found
|
UMSG_UNKNOWN_1221 = 0x4C5, // not found
|
||||||
UMSG_UNKNOWN_1222 = 0x4C6, // not found
|
UMSG_UNKNOWN_1222 = 0x4C6, // not found
|
||||||
SMSG_UNKNOWN_1223 = 0x4C7, // arena pet?
|
SMSG_UNKNOWN_1223 = 0x4C7, // arena pet?
|
||||||
NUM_MSG_TYPES = 0x4C8
|
SMSG_UNKNOWN_1224 = 0x4C8, // uint32
|
||||||
|
NUM_MSG_TYPES = 0x4C9
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Player state
|
/// Player state
|
||||||
|
|
|
||||||
|
|
@ -19962,33 +19962,44 @@ void Player::SendTalentsInfoData(bool pet)
|
||||||
void Player::BuildEnchantmentsInfoData(WorldPacket *data)
|
void Player::BuildEnchantmentsInfoData(WorldPacket *data)
|
||||||
{
|
{
|
||||||
uint32 slotUsedMask = 0;
|
uint32 slotUsedMask = 0;
|
||||||
*data << uint32(slotUsedMask); // > 0x80000
|
size_t slotUsedMaskPos = data->wpos();
|
||||||
|
*data << uint32(slotUsedMask); // slotUsedMask < 0x80000
|
||||||
|
|
||||||
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||||
{
|
{
|
||||||
if(slotUsedMask & 1)
|
Item *item = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
|
||||||
|
|
||||||
|
if(!item)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
slotUsedMask |= (1 << i);
|
||||||
|
|
||||||
|
*data << uint32(item->GetEntry()); // item entry
|
||||||
|
|
||||||
|
uint16 enchantmentMask = 0;
|
||||||
|
size_t enchantmentMaskPos = data->wpos();
|
||||||
|
*data << uint16(enchantmentMask); // enchantmentMask < 0x1000
|
||||||
|
|
||||||
|
for(uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
|
||||||
{
|
{
|
||||||
*data << uint32(0); // item entry
|
uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
|
||||||
uint16 enchantmentMask = 0;
|
|
||||||
*data << uint16(enchantmentMask); // > 0x1000
|
|
||||||
|
|
||||||
for(uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
|
if(!enchId)
|
||||||
{
|
continue;
|
||||||
if(enchantmentMask & 1)
|
|
||||||
{
|
|
||||||
*data << uint16(0); // enchantmentId?
|
|
||||||
}
|
|
||||||
|
|
||||||
enchantmentMask >>= 1;
|
enchantmentMask |= (1 << j);
|
||||||
}
|
|
||||||
|
|
||||||
*data << uint16(0);
|
*data << uint16(enchId); // enchantmentId?
|
||||||
*data << uint8(0); // PGUID!
|
|
||||||
*data << uint32(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slotUsedMask >>= 1;
|
data->put<uint16>(enchantmentMaskPos, enchantmentMask);
|
||||||
|
|
||||||
|
*data << uint16(0); // ?
|
||||||
|
*data << uint8(0); // PGUID!
|
||||||
|
*data << uint32(0); // seed?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data->put<uint32>(slotUsedMaskPos, slotUsedMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::LearnTalent(uint32 talentId, uint32 talentRank)
|
void Player::LearnTalent(uint32 talentId, uint32 talentRank)
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ void MapManager::LoadTransports()
|
||||||
Transport::Transport() : GameObject()
|
Transport::Transport() : GameObject()
|
||||||
{
|
{
|
||||||
// 3.1.0 - 0x34A
|
// 3.1.0 - 0x34A
|
||||||
m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK1 | UPDATEFLAG_UNK2);
|
m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK2);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags)
|
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags)
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ Unit::Unit()
|
||||||
m_objectType |= TYPEMASK_UNIT;
|
m_objectType |= TYPEMASK_UNIT;
|
||||||
m_objectTypeId = TYPEID_UNIT;
|
m_objectTypeId = TYPEID_UNIT;
|
||||||
// 3.1.0 - 0x60
|
// 3.1.0 - 0x60
|
||||||
m_updateFlag = (UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
|
m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
|
||||||
|
|
||||||
m_attackTimer[BASE_ATTACK] = 0;
|
m_attackTimer[BASE_ATTACK] = 0;
|
||||||
m_attackTimer[OFF_ATTACK] = 0;
|
m_attackTimer[OFF_ATTACK] = 0;
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
#ifndef _UPDATEFIELDS_AUTO_H
|
#ifndef _UPDATEFIELDS_AUTO_H
|
||||||
#define _UPDATEFIELDS_AUTO_H
|
#define _UPDATEFIELDS_AUTO_H
|
||||||
|
|
||||||
// Auto generated for version 0, 1, 0, 9626
|
// Auto generated for version 0, 1, 0, 9658
|
||||||
|
|
||||||
enum EObjectFields
|
enum EObjectFields
|
||||||
{
|
{
|
||||||
|
|
@ -394,9 +394,9 @@ enum EGameObjectFields
|
||||||
{
|
{
|
||||||
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
|
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
|
||||||
GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
|
GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
|
||||||
GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
|
GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC
|
||||||
GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC
|
GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC
|
||||||
GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
|
GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: BYTES, Flags: DYNAMIC
|
||||||
GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC
|
GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC
|
||||||
GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC
|
GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC
|
||||||
GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC
|
GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC
|
||||||
|
|
|
||||||
|
|
@ -252,6 +252,12 @@ World::AddSession_ (WorldSession* s)
|
||||||
packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account
|
packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account
|
||||||
s->SendPacket (&packet);
|
s->SendPacket (&packet);
|
||||||
|
|
||||||
|
// Create and send the Addon packet
|
||||||
|
//if (sAddOnHandler.BuildAddonPacket (&recvPacket, &SendAddonPacked))
|
||||||
|
// SendPacket (SendAddonPacked);
|
||||||
|
|
||||||
|
s->SendTutorialsData();
|
||||||
|
|
||||||
UpdateMaxSessionCounters ();
|
UpdateMaxSessionCounters ();
|
||||||
|
|
||||||
// Updates the population
|
// Updates the population
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,7 @@ int WorldSocket::SendPacket (const WorldPacket& pct)
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerPktHeader header(pct.size()+2, pct.GetOpcode());
|
ServerPktHeader header(pct.size()+2, pct.GetOpcode());
|
||||||
//m_Crypt.EncryptSend ( header.header, header.getHeaderLength());
|
m_Crypt.EncryptSend ( header.header, header.getHeaderLength());
|
||||||
|
|
||||||
if (m_OutBuffer->space () >= pct.size () + header.getHeaderLength() && msg_queue()->is_empty())
|
if (m_OutBuffer->space () >= pct.size () + header.getHeaderLength() && msg_queue()->is_empty())
|
||||||
{
|
{
|
||||||
|
|
@ -480,7 +480,7 @@ int WorldSocket::handle_input_header (void)
|
||||||
|
|
||||||
ACE_ASSERT (m_Header.length () == sizeof (ClientPktHeader));
|
ACE_ASSERT (m_Header.length () == sizeof (ClientPktHeader));
|
||||||
|
|
||||||
//m_Crypt.DecryptRecv ((ACE_UINT8*) m_Header.rd_ptr (), sizeof (ClientPktHeader));
|
m_Crypt.DecryptRecv ((ACE_UINT8*) m_Header.rd_ptr (), sizeof (ClientPktHeader));
|
||||||
|
|
||||||
ClientPktHeader& header = *((ClientPktHeader*) m_Header.rd_ptr ());
|
ClientPktHeader& header = *((ClientPktHeader*) m_Header.rd_ptr ());
|
||||||
|
|
||||||
|
|
@ -992,12 +992,6 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
|
||||||
|
|
||||||
sWorld.AddSession (m_Session);
|
sWorld.AddSession (m_Session);
|
||||||
|
|
||||||
// Create and send the Addon packet
|
|
||||||
if (sAddOnHandler.BuildAddonPacket (&recvPacket, &SendAddonPacked))
|
|
||||||
SendPacket (SendAddonPacked);
|
|
||||||
|
|
||||||
m_Session->SendTutorialsData();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,8 @@ enum LoginResult
|
||||||
|
|
||||||
// we need to stick to 1 version or half of the stuff will work for someone
|
// we need to stick to 1 version or half of the stuff will work for someone
|
||||||
// others will not and opposite
|
// others will not and opposite
|
||||||
// will only support WoW, WoW:TBC and WoW:WotLK 3.1.0 client build 9637...
|
// will only support WoW, WoW:TBC and WoW:WotLK 3.1.0 client build 9658...
|
||||||
|
|
||||||
#define EXPECTED_MANGOS_CLIENT_BUILD {9637, 0}
|
#define EXPECTED_MANGOS_CLIENT_BUILD {9658, 0}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -35,19 +35,26 @@ void AuthCrypt::Init(BigNumber *K)
|
||||||
HmacHash recvHash(SEED_KEY_SIZE, (uint8*)recvSeed);
|
HmacHash recvHash(SEED_KEY_SIZE, (uint8*)recvSeed);
|
||||||
recvHash.UpdateBigNumber(K);
|
recvHash.UpdateBigNumber(K);
|
||||||
recvHash.Finalize();
|
recvHash.Finalize();
|
||||||
_recvCrypt.Init(SHA_DIGEST_LENGTH, recvHash.GetDigest());
|
|
||||||
|
|
||||||
uint8 sendSeed[SEED_KEY_SIZE] = { 0xF4, 0x66, 0x31, 0x59, 0xFC, 0x83, 0x6E, 0x31, 0x31, 0x02, 0x51, 0xD5, 0x44, 0x31, 0x67, 0x98 };
|
uint8 sendSeed[SEED_KEY_SIZE] = { 0xF4, 0x66, 0x31, 0x59, 0xFC, 0x83, 0x6E, 0x31, 0x31, 0x02, 0x51, 0xD5, 0x44, 0x31, 0x67, 0x98 };
|
||||||
HmacHash sendHash(SEED_KEY_SIZE, (uint8*)sendSeed);
|
HmacHash sendHash(SEED_KEY_SIZE, (uint8*)sendSeed);
|
||||||
sendHash.UpdateBigNumber(K);
|
sendHash.UpdateBigNumber(K);
|
||||||
sendHash.Finalize();
|
sendHash.Finalize();
|
||||||
_sendCrypt.Init(SHA_DIGEST_LENGTH, sendHash.GetDigest());
|
|
||||||
|
|
||||||
uint8 emptyBuf[1000];
|
_recvCrypt.Init(recvHash.GetDigest(), sendHash.GetDigest());
|
||||||
memset(emptyBuf, 0, 1000);
|
_sendCrypt.Init(recvHash.GetDigest(), sendHash.GetDigest());
|
||||||
|
|
||||||
_sendCrypt.Process(1000, (uint8*)emptyBuf, (uint8*)emptyBuf);
|
uint8 emptyBuf1[1024];
|
||||||
_recvCrypt.Process(1000, (uint8*)emptyBuf, (uint8*)emptyBuf);
|
memset(emptyBuf1, 0, 1024);
|
||||||
|
|
||||||
|
_sendCrypt.Encrypt(1024, (uint8*)emptyBuf1);
|
||||||
|
_sendCrypt.Decrypt(1024, (uint8*)emptyBuf1);
|
||||||
|
|
||||||
|
uint8 emptyBuf2[1024];
|
||||||
|
memset(emptyBuf2, 0, 1024);
|
||||||
|
|
||||||
|
_recvCrypt.Encrypt(1024, (uint8*)emptyBuf2);
|
||||||
|
_recvCrypt.Decrypt(1024, (uint8*)emptyBuf2);
|
||||||
|
|
||||||
_initialized = true;
|
_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
@ -57,7 +64,7 @@ void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
|
||||||
if (!_initialized)
|
if (!_initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_recvCrypt.Process(len, data, data);
|
_recvCrypt.Decrypt(len, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuthCrypt::EncryptSend(uint8 *data, size_t len)
|
void AuthCrypt::EncryptSend(uint8 *data, size_t len)
|
||||||
|
|
@ -65,5 +72,5 @@ void AuthCrypt::EncryptSend(uint8 *data, size_t len)
|
||||||
if (!_initialized)
|
if (!_initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_sendCrypt.Process(len, data, data);
|
_sendCrypt.Encrypt(len, data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@
|
||||||
#define _AUTHCRYPT_H
|
#define _AUTHCRYPT_H
|
||||||
|
|
||||||
#include <Common.h>
|
#include <Common.h>
|
||||||
#include <vector>
|
|
||||||
#include "SARC4.h"
|
#include "SARC4.h"
|
||||||
|
|
||||||
class BigNumber;
|
class BigNumber;
|
||||||
|
|
@ -38,8 +37,8 @@ class AuthCrypt
|
||||||
bool IsInitialized() { return _initialized; }
|
bool IsInitialized() { return _initialized; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SARC4 _sendCrypt;
|
|
||||||
SARC4 _recvCrypt;
|
SARC4 _recvCrypt;
|
||||||
|
SARC4 _sendCrypt;
|
||||||
bool _initialized;
|
bool _initialized;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,12 @@ HmacHash::HmacHash(uint32 len, uint8 *seed)
|
||||||
{
|
{
|
||||||
ASSERT(len == SEED_KEY_SIZE);
|
ASSERT(len == SEED_KEY_SIZE);
|
||||||
|
|
||||||
memcpy(&m_key, seed, len);
|
|
||||||
HMAC_CTX_init(&m_ctx);
|
HMAC_CTX_init(&m_ctx);
|
||||||
HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL);
|
HMAC_Init_ex(&m_ctx, seed, SEED_KEY_SIZE, EVP_sha1(), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
HmacHash::~HmacHash()
|
HmacHash::~HmacHash()
|
||||||
{
|
{
|
||||||
memset(&m_key, 0x00, SEED_KEY_SIZE);
|
|
||||||
HMAC_CTX_cleanup(&m_ctx);
|
HMAC_CTX_cleanup(&m_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -44,11 +42,6 @@ void HmacHash::UpdateData(const uint8 *data, int length)
|
||||||
HMAC_Update(&m_ctx, data, length);
|
HMAC_Update(&m_ctx, data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HmacHash::Initialize()
|
|
||||||
{
|
|
||||||
HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HmacHash::Finalize()
|
void HmacHash::Finalize()
|
||||||
{
|
{
|
||||||
uint32 length = 0;
|
uint32 length = 0;
|
||||||
|
|
|
||||||
|
|
@ -34,13 +34,11 @@ class HmacHash
|
||||||
~HmacHash();
|
~HmacHash();
|
||||||
void UpdateBigNumber(BigNumber *bn);
|
void UpdateBigNumber(BigNumber *bn);
|
||||||
void UpdateData(const uint8 *data, int length);
|
void UpdateData(const uint8 *data, int length);
|
||||||
void Initialize();
|
|
||||||
void Finalize();
|
void Finalize();
|
||||||
uint8 *GetDigest() { return m_digest; };
|
uint8 *GetDigest() { return m_digest; };
|
||||||
int GetLength() { return SHA_DIGEST_LENGTH; };
|
int GetLength() { return SHA_DIGEST_LENGTH; };
|
||||||
private:
|
private:
|
||||||
HMAC_CTX m_ctx;
|
HMAC_CTX m_ctx;
|
||||||
uint8 m_key[SEED_KEY_SIZE];
|
|
||||||
uint8 m_digest[SHA_DIGEST_LENGTH];
|
uint8 m_digest[SHA_DIGEST_LENGTH];
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -17,14 +17,40 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Auth/SARC4.h"
|
#include "Auth/SARC4.h"
|
||||||
#include "BigNumber.h"
|
#include <openssl/sha.h>
|
||||||
|
|
||||||
void SARC4::Init(uint32 len, uint8 *seed)
|
SARC4::SARC4()
|
||||||
{
|
{
|
||||||
RC4_set_key(&m_rc4_key, len, seed);
|
EVP_CIPHER_CTX_init(&m_encryptctx);
|
||||||
|
EVP_EncryptInit_ex(&m_encryptctx, EVP_rc4(), NULL, NULL, NULL);
|
||||||
|
EVP_CIPHER_CTX_set_key_length(&m_encryptctx, SHA_DIGEST_LENGTH);
|
||||||
|
EVP_CIPHER_CTX_init(&m_decryptctx);
|
||||||
|
EVP_DecryptInit_ex(&m_decryptctx, EVP_rc4(), NULL, NULL, NULL);
|
||||||
|
EVP_CIPHER_CTX_set_key_length(&m_decryptctx, SHA_DIGEST_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SARC4::Process(uint32 len, uint8 *indata, uint8 *outdata)
|
SARC4::~SARC4()
|
||||||
{
|
{
|
||||||
RC4(&m_rc4_key, len, indata, outdata);
|
EVP_CIPHER_CTX_cleanup(&m_encryptctx);
|
||||||
|
EVP_CIPHER_CTX_cleanup(&m_decryptctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SARC4::Init(uint8 *seed1, uint8 *seed2)
|
||||||
|
{
|
||||||
|
EVP_EncryptInit_ex(&m_encryptctx, NULL, NULL, seed1, NULL);
|
||||||
|
EVP_DecryptInit_ex(&m_decryptctx, NULL, NULL, seed2, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SARC4::Encrypt(uint32 len, uint8 *data)
|
||||||
|
{
|
||||||
|
int outlen = 0;
|
||||||
|
EVP_EncryptUpdate(&m_encryptctx, data, &outlen, data, len);
|
||||||
|
EVP_EncryptFinal_ex(&m_encryptctx, data, &outlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SARC4::Decrypt(uint32 len, uint8 *data)
|
||||||
|
{
|
||||||
|
int outlen = 0;
|
||||||
|
EVP_DecryptUpdate(&m_decryptctx, data, &outlen, data, len);
|
||||||
|
EVP_DecryptFinal_ex(&m_decryptctx, data, &outlen);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,19 +20,18 @@
|
||||||
#define _AUTH_SARC4_H
|
#define _AUTH_SARC4_H
|
||||||
|
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include <openssl/rc4.h>
|
#include <openssl/evp.h>
|
||||||
#include <openssl/sha.h>
|
|
||||||
|
|
||||||
class BigNumber;
|
|
||||||
|
|
||||||
#define SEED_KEY_SIZE 16
|
|
||||||
|
|
||||||
class SARC4
|
class SARC4
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Init(uint32 len, uint8 *seed);
|
SARC4();
|
||||||
void Process(uint32 len, uint8 *indata, uint8 *outdata);
|
~SARC4();
|
||||||
|
void Init(uint8 *seed1, uint8 *seed2);
|
||||||
|
void Encrypt(uint32 len, uint8 *data);
|
||||||
|
void Decrypt(uint32 len, uint8 *data);
|
||||||
private:
|
private:
|
||||||
RC4_KEY m_rc4_key;
|
EVP_CIPHER_CTX m_encryptctx;
|
||||||
|
EVP_CIPHER_CTX m_decryptctx;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue