- summary: The server's challenge in the proof-of-identity handshake. The one message in that chain whose contents you must read.
- area: Game.Client.Verification
- confidence: 0.92
The server's challenge in the proof-of-identity handshake. The one message in that chain whose contents you must read.
- Kind event
- Area Game.Client.Verification
- Named by beta, gamemapping
Arrives because you sent ClientChallengeInitRequest, and must be answered with
ClientChallengeProofRequest. THE HANDSHAKE DOES NOT COMPLETE UNTIL YOU DO.
WHEN IT ARRIVES
Shortly after your init request, and only then - the server does not send it on its own schedule. But it is delivered as an ordinary event: the client matches it BY TYPE, not by the envelope id it allocated for the init. There is only ever one of these exchanges in flight, so nothing needs correlating, and you should not sit waiting for a uid to come back.
It is the third of four steps. ClientIdRequest and ClientChallengeInitRequest
publish the two values this challenge is checked against; if you have not sent both,
there is nothing here you can usefully answer.
READ THE PAYLOAD - THIS IS THE ONE STEP WHERE IT MATTERS
PARSE IT AS AN ARBITRARY-PRECISION INTEGER. The value is a decimal string and the real client parses it as a big integer, multiplies it by its private exponent and reduces the result. It is not bounded by anything you can hold in 64 bits, and truncating or overflowing it produces a proof that is silently wrong rather than an error you can see.
ABSENT IS NOT EMPTY, AND ABSENT DOES NOT MEAN SKIP IT. The field has explicit presence
and the client tests for it. When the value is missing the client does NOT stay silent
and does not fail - it computes a challenge of its own by hashing its handshake values
together with a device fingerprint, and answers with that. Treating a missing value as
"nothing to do here" leaves the handshake open, which is exactly the state the exchange
exists to detect. ClientChallengeProofRequest gives the full recipe for both
branches.
WHERE THE ANSWER GOES
ON THE MAIN GAME CONNECTION, even when a second one is open. While a fight-server
transfer is active the client holds two sockets (see IdentificationRequest) and
routes outbound traffic between them by message type. All three verification requests
are on the short list pinned to the FIRST connection - ordinary gameplay traffic is what
goes to the fight server. Answering on the wrong socket is a mistake the real client
cannot make.
THE COMPLETE ALGORITHM IS ON ONE PAGE. Constants, both exponents, both branches,
what the server checks and the ways an implementation goes wrong are written out
in full under ClientChallengeProofRequest. Read that before implementing any
part of this exchange.
When you may send it
- Requires
authenticatedobserved
Related messages
- You must then send
ClientChallengeProofRequestproven — the client's handler combines this value with its state and returns the proof - Arrives after
ClientChallengeInitRequest
Fields
| # | Field | Type | Meaning | You set it |
|---|---|---|---|---|
| 1 | value | string | The server's challenge, as a decimal string, combined with your handshake state to derive the proof. Explicit presence: absent is not the same as zero. Parse it as an arbitrary-precision integer. It is not bounded to 64 bits, and a truncated value yields a wrong proof rather than a visible error. Absent means "no challenge given" - and that is an instruction, not a rest: the client derives its own challenge and answers anyway. See ClientChallengeProofRequest. | never; inbound only |
Recovered with score 144, confidence 0.92, margin 144 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 1.
Aucun avis à afficher.