AuthKey and AuthKeyManager

AuthKey

After creating authorization key we will get big auth_key number. For more details please check definition here <https://core.telegram.org/mtproto/description#authorization-key-auth-key> that will be used for encrypting/decrypting messages between client and server. In mtpylon special class used to simplify work with auth_key number AuthClass

AuthKey stores key number in value attribute and has got several properties:

  • hash - sha1 hash of auth key as integer

  • id - auth key id as 64 lower bits of auth key hash. please check definition here<https://core.telegram.org/mtproto/description#key-identifier-auth-key-id>

  • aux_hash - aux hash as 64 higher bits of auth key hash please check definition here<https://core.telegram.org/mtproto/auth_key#dh-key-exchange-complete>

AuthKeyManager

AuthKeyManager is a manager that stores authorization keys. By default auth keys stores in memory but to manager them you’ll use coroutines. Methods to work with auth key manager:

  • set_key(self, value: Union[AuthKey, int]) - coroutine to set authorization key accepts auth_key as instance of AuthKey class or as 2048-bit interger

  • has_key(self, value: Union[AuthKey, int]) - coroutine to check does manager know about auth_key by auth_key_id or not. Accepts instance of AuthKey class or integer value as auth_key_id

  • get_key(self, value: int) - coroutine to get instance of AuthKey by auth_key_id. Accepts only integer value. Raises AuthKeyDoesNotExist exception if auth_key_id not found in manager

  • del_key(self, value: Union[AuthKey, int]) - coroutine to delete information about authorization key. Accepts instance of AuthKey or integer as auth_key_id. Raises AuthKeyDoesNotExist exception if auth_key_id not found in manager

Example of usage:

from mtpylon.crypto import AuthKey, AuthKeyManager

auth_key = 0x32234234 # 2048-bit integer value
auth_hash = 0x189e4dd9d40b7e7b5c160c4b0313e843b05b5983 # sha1 of auth_key
auth_key_id = 0x0313e843b05b5983  # 64 lower bits of auth_hash
auth_aux_hash = 0x189e4dd9d40b7e7b  # 64 higher bits of auth_hash

manager = AuthKeyManager()
manager.set_key(auth_key)

auth_key_data = await manager.get_key(auth_key_id)

assert auth_key_data.id == auth_key_id
assert auth_key_data.value == auth_key
assert auth_key_data.hash == auth_hash
assert auth_key_data.aux_hash == auth_aux_hash

AuthKeyManagerProtocol

Probably you want to store auth_key not in memory but in redis store or other key value store. To create you own auth manager you should just implements their protocol:

class AuthKeyManagerProtocol(Protocol):

    async def set_key(self, value: Union[AuthKey, int]):  # pragma: nocover
        """
        Sets new available authentication key. This method
        takes instance of AuthKey class or auth_key as integer
        It'll be async function coz we could use separated service to store
        authorization keys
        """
        ...

    async def has_key(
            self,
            value: Union[AuthKey, int]
    ) -> bool:  # pragma: nocover
        """
        Checks is this AuthKey store in manager or not. This method
        takes intance of AuthKey class or integer as auth_key_id.
        It'll be async function coz we could use separated service to store
        authorization keys
        """
        ...

    async def get_key(self, value: int) -> AuthKey:  # pragma: nocover
        """
        Gets auth key data by its id.
        It'll be async function coz we could separated service to store
        authorization keys

        Raises: AuthKeyDoesNotExist if key doesn't store in manager
        """
        ...

    async def del_key(self, value: Union[AuthKey, int]):
        """
        Delete auth key from manager by it's id, value or AuthKey instance
        It'll be async function coz we could use separated service to store
        authorization keys

        Raises:  AuthKeyDoesNotExist if key doesn't store in manager
        """