Source code for eolib.encrypt.server_verification_utils
[docs]
def server_verification_hash(challenge: int) -> int:
"""
This hash function is used by the game client to verify communication with a genuine server
during connection initialization.
Args:
challenge (int): The challenge value sent by the client.
Should be no larger than 11,092,110.
Returns:
The hashed challenge value.
.. admonition:: Remarks
- The client sends an integer value to the server in the ``INIT_INIT`` client packet, where
it is referred to as the ``challenge``.
- The server hashes the value and sends the hash back in the ``INIT_INIT`` server packet.
- The client hashes the value and compares it to the hash sent by the server.
- If the hashes do not match, the client drops the connection.
.. warning::
Oversized challenges may result in negative hash values, which cannot be represented
properly in the EO protocol.
.. seealso::
- :attr:`eolib.protocol.net.client.InitInitClientPacket.challenge`
- :attr:`eolib.protocol.net.server.InitInitServerPacket.ReplyCodeDataOk.challenge_response`
"""
challenge += 1
return (
110905
+ (_mod(challenge, 9) + 1) * _mod(11092004 - challenge, ((challenge % 11) + 1) * 119) * 119
+ _mod(challenge, 2004)
)
def _mod(a, b):
result = a % b
if a < 0:
result -= b
return result