#include "stdafx.h"
#include "LoginReplyPacket.h"
#include "Crypter.h"
CLoginReplyPacket::CLoginReplyPacket(CQQUser *pQQUser) :
CBasicInPacket(QQ.QQ_CMD_LOGIN, pQQUser)
{
}
CLoginReplyPacket::~CLoginReplyPacket()
{
}
bool CLoginReplyPacket::ParseBody(BYTE *pbBuf, size_t iBufLen)
{
GET_BYTE(pbBuf, iBufLen, m_bReplyCode);
if( m_bReplyCode == QQ.QQ_REPLY_OK )
{
SAFE_FREE(m_pQQUser->m_pbSessionKey);
m_pQQUser->m_pbSessionKey = (BYTE*)malloc(QQ.QQ_LENGTH_KEY);
GET_BYTES(pbBuf, iBufLen, m_pQQUser->m_pbSessionKey, QQ.QQ_LENGTH_KEY);
int iQQNum;
GET_DWORD(pbBuf, iBufLen, iQQNum);
if( iQQNum != m_pQQUser->m_iQQNum )
return false;
GET_IP(pbBuf, iBufLen, m_pQQUser->m_dwClientIP);
GET_PORT(pbBuf, iBufLen, m_pQQUser->m_iClientPort);
DWORD dwServerIP;
GET_IP(pbBuf, iBufLen, dwServerIP);
int iServerPort;
GET_PORT(pbBuf, iBufLen, iServerPort);
GET_DWORD(pbBuf, iBufLen, m_pQQUser->m_lLoginTime);
m_pQQUser->m_lLoginTime *= 1000;
WORD wUnknown;
GET_WORD(pbBuf, iBufLen, wUnknown);
SAFE_FREE(m_pQQUser->m_pbAuthToken);
m_pQQUser->m_pbAuthToken = (BYTE*)malloc(24);
GET_BYTES(pbBuf, iBufLen, m_pQQUser->m_pbAuthToken, 24);
OFFSET_BYTES(pbBuf, iBufLen, 16);
SAFE_FREE(m_pQQUser->m_pbClientKey);
m_pQQUser->m_pbClientKey = (BYTE*)malloc(32);
GET_BYTES(pbBuf, iBufLen, m_pQQUser->m_pbClientKey, 32);
OFFSET_BYTES(pbBuf, iBufLen, 12);
GET_IP(pbBuf, iBufLen, m_pQQUser->m_dwLastLoginIP);
GET_DWORD(pbBuf, iBufLen, m_pQQUser->m_lLastLoginTime);
m_pQQUser->m_lLastLoginTime *= 1000;
OFFSET_BYTES(pbBuf, iBufLen, 39);
}
else if( m_bReplyCode == QQ.QQ_REPLY_LOGIN_FAIL )
{
}
else if( m_bReplyCode == QQ.QQ_REPLY_LOGIN_REDIRECT )
{
int iQQNum;
GET_DWORD(pbBuf, iBufLen, iQQNum);
if( iQQNum != m_pQQUser->m_iQQNum )
return false;
GET_IP(pbBuf, iBufLen, m_pQQUser->m_dwServerIP);
GET_PORT(pbBuf, iBufLen, m_pQQUser->m_iServerPort);
}
return true;
}
size_t CLoginReplyPacket::DecryptBody(BYTE *pbBuf, size_t iBufLen, BYTE *pbBody, size_t iBodyLen) const
{
CCrypter Crypter;
size_t iRetVal;
iRetVal = Crypter.Decrypt(pbBuf, 0, iBufLen, m_pQQUser->GetPasswordKey(),
pbBody, iBodyLen);
if( iRetVal == -1 )
{
iRetVal = Crypter.Decrypt(pbBuf, 0, iBufLen, m_pQQUser->GetInitKey(),
pbBody, iBodyLen);
}
return iRetVal;
}