#pragma once #include #include #include namespace wowee { namespace game { /** * Warden anti-cheat crypto handler. * Derives RC4 keys from the 40-byte SRP session key using SHA1Randx, * then encrypts/decrypts Warden packet payloads. */ class WardenCrypto { public: WardenCrypto(); ~WardenCrypto(); /** * Initialize Warden crypto from the 40-byte SRP session key. * Derives encrypt (client->server) and decrypt (server->client) RC4 keys * using the SHA1Randx / WardenKeyGenerator algorithm. */ bool initFromSessionKey(const std::vector& sessionKey); /** * Replace RC4 keys (called after module hash challenge succeeds). * @param newEncryptKey 16-byte key for encrypting outgoing packets * @param newDecryptKey 16-byte key for decrypting incoming packets */ void replaceKeys(const std::vector& newEncryptKey, const std::vector& newDecryptKey); /** Decrypt an incoming SMSG_WARDEN_DATA payload. */ std::vector decrypt(const std::vector& data); /** Encrypt an outgoing CMSG_WARDEN_DATA payload. */ std::vector encrypt(const std::vector& data); bool isInitialized() const { return initialized_; } private: bool initialized_; // RC4 state for decrypting incoming packets (server->client) std::vector decryptRC4State_; uint8_t decryptRC4_i_; uint8_t decryptRC4_j_; // RC4 state for encrypting outgoing packets (client->server) std::vector encryptRC4State_; uint8_t encryptRC4_i_; uint8_t encryptRC4_j_; void initRC4(const std::vector& key, std::vector& state, uint8_t& i, uint8_t& j); void processRC4(const uint8_t* input, uint8_t* output, size_t length, std::vector& state, uint8_t& i, uint8_t& j); public: /** * SHA1Randx / WardenKeyGenerator: generates pseudo-random bytes from a seed. * Used to derive the 16-byte encrypt and decrypt keys from a seed. * Public so GameHandler can use it for module hash key derivation. */ static void sha1RandxGenerate(const std::vector& seed, uint8_t* outputEncryptKey, uint8_t* outputDecryptKey); }; } // namespace game } // namespace wowee