docs(netcode): findings test live — client ferme après EncryptionAck (attend voie serveur chiffrée) + crash ConditionalCleanUp
Build Game Server / build (push) Successful in 15s
Build Game Server / build (push) Successful in 15s
This commit is contained in:
@@ -107,3 +107,33 @@ anti-triche — est un chantier crypto + RE dynamique d'un autre ordre de grande
|
|||||||
3. bascule handshake→données applicatives.
|
3. bascule handshake→données applicatives.
|
||||||
Méthode : lancer `Prospect.Server.Game` avec la PSK, diriger le client dessus, itérer
|
Méthode : lancer `Prospect.Server.Game` avec la PSK, diriger le client dessus, itérer
|
||||||
sur les logs serveur.
|
sur les logs serveur.
|
||||||
|
|
||||||
|
## MAJ (2026-07-16, soir) — test LIVE contre le vrai client (preprod multi)
|
||||||
|
|
||||||
|
Setup : preprod multi (`the-cycle-api-rd2`, `GAMESERVER_ADDRESS=192.168.1.136:7777`) →
|
||||||
|
le client voyage vers `the-cycle-game` (branche game-server, PSK via `PROSPECT_DTLS_PSKS`).
|
||||||
|
user_id preprod = prod = `92EBCFE8C3EAF3AC` (même DB ? non, `ProspectDb_rd`, mais même Id).
|
||||||
|
|
||||||
|
**Observé (séquence réelle) :**
|
||||||
|
1. Handshake stateless : ✅ complet (challenge/cookie/ack, connexion acceptée).
|
||||||
|
2. `NMT_Hello` reçu **EN CLAIR** avec EncryptionToken=`92EBCFE8C3EAF3AC` → PSK reconnue.
|
||||||
|
3. On envoie `NMT_EncryptionAck` + `NMT_Challenge`. Le client **NE ferme plus tout de suite**
|
||||||
|
(progrès vs l'état documenté « ferme après challenge sans ack »).
|
||||||
|
4. **Le client n'envoie JAMAIS de ClientHello DTLS** (`16 fe fd`). Aucun record DTLS.
|
||||||
|
5. Le paquet suivant du client (~18 o, ex. `80E82AC4…5F00000C`) parse **en clair** comme un
|
||||||
|
**bunch `bClose=true` sur le canal de contrôle (ChIndex 0)** → **le client FERME**.
|
||||||
|
|
||||||
|
**Interprétation :** après `NMT_EncryptionAck`, le client attend que les paquets **serveur**
|
||||||
|
suivants soient **chiffrés** ; on lui renvoie le `Challenge` en clair → il abandonne. Donc
|
||||||
|
l'`EncryptionAck` seul ne suffit pas : il faut réellement **chiffrer la voie serveur** après
|
||||||
|
l'ack (le mur crypto de fond, inchangé). Activer notre composant DTLS ne sert à rien tant que
|
||||||
|
le client ne fait pas de handshake DTLS de son côté — piste à creuser : est-ce de l'**AES-GCM
|
||||||
|
keyé par la PSK** (SetEncryptionData/EnableEncryption d'UE) plutôt que du DTLS-handshake ?
|
||||||
|
|
||||||
|
**Bug serveur concret trouvé :** `UChannel.ConditionalCleanUp` (Prospect.Unreal, ~l.822) =
|
||||||
|
`throw new NotImplementedException()` → **crash du tick** dès qu'un canal se ferme (bClose).
|
||||||
|
À implémenter (indépendant du crypto).
|
||||||
|
|
||||||
|
**Acquis réutilisables :** on passe le handshake + le Hello + l'EncryptionAck est accepté ;
|
||||||
|
la PSK par user_id est branchée bout-en-bout (Vault → env → serveur). Le blocage net =
|
||||||
|
chiffrement de la voie serveur post-ack.
|
||||||
|
|||||||
Reference in New Issue
Block a user