コード例 #1
0
ProtocolLogin::ProtocolLogin()
{
    enableChecksum();
}
コード例 #2
0
void ProtocolGame::sendLoginPacket(uint challengeTimestamp, uint8 challengeRandom)
{
    OutputMessagePtr msg(new OutputMessage);

    msg->addU8(Proto::ClientPendingGame);
    msg->addU16(g_game.getOs());
    msg->addU16(g_game.getProtocolVersion());

    if(g_game.getProtocolVersion() >= 971) {
        msg->addU32(g_game.getClientVersion());
        msg->addU8(0); // clientType
    }

    int offset = msg->getMessageSize();

    msg->addU8(0); // first RSA byte must be 0

    if(g_game.getProtocolVersion() >= 770)
    {
        // xtea key
        generateXteaKey();
        msg->addU32(m_xteaKey[0]);
        msg->addU32(m_xteaKey[1]);
        msg->addU32(m_xteaKey[2]);
        msg->addU32(m_xteaKey[3]);
        msg->addU8(0); // is gm set?
    }

    if(g_game.getFeature(Otc::GameAccountNames))
        msg->addString(m_accountName);
    else
        msg->addU32(stdext::from_string<uint32>(m_accountName));

    msg->addString(m_characterName);
    msg->addString(m_accountPassword);

    if(g_game.getFeature(Otc::GameChallengeOnLogin)) {
        msg->addU32(challengeTimestamp);
        msg->addU8(challengeRandom);
    }

    std::string extended = callLuaField<std::string>("getLoginExtendedData");
    if(!extended.empty())
        msg->addString(extended);

    // complete the bytes for rsa encryption with zeros
    int paddingBytes = g_crypt.rsaGetSize() - (msg->getMessageSize() - offset);
    assert(paddingBytes >= 0);
    msg->addPaddingBytes(paddingBytes);

    // encrypt with RSA
    if(g_game.getProtocolVersion() >= 770)
        msg->encryptRsa();

    if(g_game.getFeature(Otc::GameProtocolChecksum))
        enableChecksum();

    send(msg);

    if(g_game.getProtocolVersion() >= 770)
        enableXteaEncryption();
}