GameHandshakeResponse (0xA301)
This packet is sent in response to a GameHandshakeRequest, and is responsible for informing the client of the encryption mode to be used.
Payload
Data type | Name | Description |
---|---|---|
u8 | status | The status of the handshake. A value of 0 indicates a success. |
u8 | encryptionMode | More research needed - the Ep4 PDB always specifies a value of 2. |
u8[16] | expandedKeySeed | The seed to use for the XOR encryption used later in the game. |
XOR Encryption
Upon handshaking with the client, the game server provdes an expandedKeySeed
. This isn’t used straight away, but is instead used upon receiving the XorEncryptionSignal packet. The key is then used like so:
digest = SHA256(initial_aes_key)
expandedKey = expandedKeySeed.append(digest)
for (i = 1; i < 128; i++)
// create a hash of the last 16 bytes of the expanded key
len = expandedKey.length
hash = SHA256(expandedKey[len - 16..len])
expandedKey.append(hash)
for (i = 0; i < packet.length; i++)
packet[i] ^= expandedKey[i]