ba514d2e9aa77cc95d22cc5e8b22a884e65f45d8
Client Source Repository
This repository contains the source code necessary to compile the game client executable.
How to build
cmake -S . -B build
cmake --build build
📋 Changelog
Encryption & Security Overhaul
The entire legacy encryption system has been replaced with libsodium.
Removed Legacy Crypto
- Crypto++ (cryptopp) vendor library — Completely removed from the project
- Panama cipher (
CFilterEncoder,CFilterDecoder) — Removed fromNetStream - TEA encryption (
tea.h,tea.cpp) — Removed from both client and server - DH2 key exchange (
cipher.h,cipher.cpp) — Removed fromEterBase - Camellia cipher — Removed all references
_IMPROVED_PACKET_ENCRYPTION_— Entire system removed (XTEA key scheduling, sequence encryption, key agreement)adwClientKey[4]— Removed from all packet structs (TPacketCGLogin2,TPacketCGLogin3,TPacketGDAuthLogin,TPacketGDLoginByKey,TPacketLoginOnSetup) and all associated code on both client and serverLSS_SECURITY_KEY— Dead code removed ("testtesttesttest"hardcoded key,GetSecurityKey()function)
New Encryption System (libsodium)
- X25519 key exchange —
SecureCipherclass handles keypair generation and session key derivation viacrypto_kx_client_session_keys/crypto_kx_server_session_keys - XChaCha20-Poly1305 AEAD — Used for authenticated encryption of handshake tokens (key exchange, session tokens)
- XChaCha20 stream cipher — Used for in-place network buffer encryption via
EncryptInPlace()/DecryptInPlace()(zero overhead, nonce-counter based replay prevention) - Challenge-response authentication — HMAC-based (
crypto_auth) verification during key exchange to prove shared secret derivation - New handshake protocol —
HEADER_GC_KEY_CHALLENGE/HEADER_CG_KEY_RESPONSE/HEADER_GC_KEY_COMPLETEpacket flow for secure session establishment
Network Encryption Pipeline
- Client send path — Data is encrypted at queue time in
CNetworkStream::Send()(prevents double-encryption on partial TCP sends) - Client receive path — Data is decrypted immediately after
recv()in__RecvInternalBuffer(), before being committed to the buffer - Server send path — Data is encrypted in
DESC::Packet()viaEncryptInPlace()after encoding to the output buffer - Server receive path — Newly received bytes are decrypted in
DESC::ProcessInput()viaDecryptInPlace()before buffer commit
Login Security Hardening
- Removed plaintext login path —
HEADER_CG_LOGIN(direct password to game server) has been removed. All game server logins now require a login key obtained through the auth server (HEADER_CG_LOGIN2/LoginByKey) - CSPRNG login keys —
CreateLoginKey()now usesrandombytes_uniform()(libsodium) instead of the non-cryptographic Xoshiro128PlusPlus PRNG - Single-use login keys — Keys are consumed (removed from the map) immediately after successful authentication
- Shorter key expiry — Expired login keys are cleaned up after 15 seconds (down from 60 seconds). Orphaned keys (descriptor gone, never expired) are also cleaned up
- Login rate limiting — Per-IP tracking of failed login attempts. After 5 failures within 60 seconds, the IP is blocked with a
BLOCKstatus and disconnected. Counter resets after cooldown or successful login - Removed Brazil password bypass — The
LC_IsBrazil()block that unconditionally disabled password verification has been removed
Pack File Encryption
- libsodium-based pack encryption —
PackLibnow uses XChaCha20-Poly1305 for pack file encryption, replacing the legacy Camellia/XTEA system - Secure key derivation — Pack encryption keys are derived using
crypto_pwhash(Argon2id)
Description
Languages
C
87.5%
C++
12.4%
Python
0.1%