#include "stdafx.h"
#include "LoginPacket.h"
CLoginPacket::CLoginPacket(CQQUser *pQQUser) :
CBasicOutPacket(QQ.QQ_CMD_LOGIN, true, pQQUser)
{
}
CLoginPacket::~CLoginPacket()
{
}
size_t CLoginPacket::PutBody(BYTE *pbBuf, size_t iBufLen) const
{
size_t iBodyLen = 0;
PUT_BYTES(pbBuf, iBodyLen, m_pQQUser->GetInitKey(), QQ.QQ_LENGTH_KEY);
BYTE pbCryptedBody[MAX_SEND_PACKET_SIZE];
size_t iCryptedBodyLen;
CCrypter Crypter;
BYTE pbOriginalBody[MAX_SEND_PACKET_SIZE];
size_t iOriginalBodyLen = _PutBody(Crypter, pbOriginalBody, sizeof(pbOriginalBody));
iCryptedBodyLen = Crypter.Encrypt(pbOriginalBody, 0, iOriginalBodyLen, m_pQQUser->GetInitKey(),
pbCryptedBody, sizeof(pbCryptedBody));
PUT_BYTES(pbBuf, iBodyLen, pbCryptedBody, iCryptedBodyLen);
return iBodyLen;
}
size_t CLoginPacket::_PutBody(const CCrypter &Crypter, BYTE *pbBuf, size_t iBufLen) const
{
size_t iBodyLen = 0;
BYTE pbCryptedBuf[MAX_SEND_PACKET_SIZE];
size_t iCryptedBufLen;
iCryptedBufLen = Crypter.Encrypt((BYTE*)"", 0, 0, m_pQQUser->GetPasswordKey(),
pbCryptedBuf, sizeof(pbCryptedBuf));
PUT_BYTES(pbBuf, iBodyLen, pbCryptedBuf, iCryptedBufLen);
PUT_BYTES(pbBuf, iBodyLen, QQ.QQ_LOGIN_16_51, QQ.QQ_LOGIN_16_51_LENGTH);
PUT_BYTE(pbBuf, iBodyLen, m_pQQUser->GetLoginMode());
PUT_BYTES(pbBuf, iBodyLen, QQ.QQ_LOGIN_53_68, QQ.QQ_LOGIN_53_68_LENGTH);
PUT_BYTE(pbBuf, iBodyLen, (BYTE)m_pQQUser->GetLoginTokenLen());
PUT_BYTES(pbBuf, iBodyLen, m_pQQUser->GetLoginToken(), m_pQQUser->GetLoginTokenLen());
PUT_BYTE(pbBuf, iBodyLen, 0x40);
PUT_BYTES(pbBuf, iBodyLen, QQ.QQ_LOGIN_SEGMENTS, QQ.QQ_LOGIN_SEGMENTS_LENGTH);
FILL_BYTES(pbBuf, iBodyLen, QQ.QQ_LENGTH_LOGIN_DATA);
return QQ.QQ_LENGTH_LOGIN_DATA;
}
size_t CLoginPacket::EncryptBody(BYTE *pbBody, size_t iBodyLen, BYTE *pbBuf, size_t iBufLen) const
{
if( iBufLen < iBodyLen )
return -1;
memcpy(pbBuf, pbBody, iBodyLen);
return iBodyLen;
}