o
    Xzj½  ã                   @   s²   d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZmZ dd„ Zddd„ZdS )z‘
This module contains several functions that authenticate the client machine
with Telegram's servers, effectively creating an authorization key.
é    N)Úsha1é   )	ÚResPQÚPQInnerDataÚServerDHParamsFailÚServerDHParamsOkÚServerDHInnerDataÚClientDHInnerDataÚDhGenOkÚ
DhGenRetryÚ	DhGenFail)Úhelpers)ÚAESÚAuthKeyÚFactorizationÚrsa)ÚSecurityError)ÚBinaryReader)ÚReqPqMultiRequestÚReqDHParamsRequestÚSetClientDHParamsRequestc           $   
   Ã   s6  �t jt d¡ddd�}|  t|ƒ¡I dH }t|tƒs!J d| ƒ‚|j|kr*t	dƒ‚t
|jƒ}t |¡\}}t |¡t |¡}}t jt d¡d	dd�}ttt |¡|||j|j|d
�ƒ}d\}}	|jD ]}
t |
|¡}|durt|
}	 nqd|du r�|jD ]}
tj|
|dd�}|durŽ|
}	 nq||du r£t	d d dd„ |jD ƒ¡¡ƒ‚|  t|j|j|||	|d�¡I dH }t|ttfƒsÂJ d| ƒ‚|j|jkrÌt	dƒ‚|j|jkrÖt	dƒ‚t|tƒrút jt|jdd	dd�ƒ ¡ dd… d	dd�}|j|krút	dƒ‚t|tƒ�sJ d| ƒ‚t |j|¡\}}t |j!ƒd dk�rt	dƒ‚t" #|j!||¡}t$|ƒ�}| %d¡ | &¡ }t|t'ƒ�s?J d| ƒ‚W d  ƒ n	1 �sJw   Y  |j|jk�rZt	dƒ‚|j|jk�ret	dƒ‚t
|j(dd�}|j)}t
|j*dd�}|j+t t, ,¡ ƒ }t
t d¡dd�}t-|||ƒ}t-|||ƒ}d |  k �r¥|d  k �sªt	d!ƒ‚ t	d!ƒ‚d |  k �r»|d  k �sÀt	d!ƒ‚ t	d!ƒ‚d |  k �rÑ|d  k �sÖt	d"ƒ‚ t	d"ƒ‚d#d$ }||  k�rë|| k�sðt	d%ƒ‚ t	d%ƒ‚||  k�r|| k�st	d&ƒ‚ t	d&ƒ‚tt.|j|jdt |¡d'�ƒ}t|ƒ ¡ | }t" /|||¡}|  t0|j|j|d(�¡I dH }t1t2t3f}t||ƒ�sDJ d)| ƒ‚|j4j5}|j|jk�rVt	d* |¡ƒ‚|j|jk�rdt	d+ |¡ƒ‚t6t |¡ƒ} d | 7t8|ƒ¡ }!|  9||!¡}"t:|d, |!¡ƒ}#|#|"k�r‹t	d-ƒ‚t|t1ƒ�s—t;d.| ƒ‚| |fS )/z½
    Executes the authentication process with the Telegram servers.

    :param sender: a connected `MTProtoPlainSender`.
    :return: returns a (authorization key, time offset) tuple.
    é   ÚbigT)ÚsignedNzStep 1 answer was %sz Step 1 invalid nonce from serveré    Úlittle)ÚpqÚpÚqÚnonceÚserver_nonceÚ	new_nonce)NN)Úuse_oldz6Step 2 could not find a valid key for fingerprints: {}z, c                 S   s   g | ]}t |ƒ‘qS © )Ústr)Ú.0Úfr#   r#   úY/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telethon/network/authenticator.pyÚ
<listcomp>G   s    z%do_authentication.<locals>.<listcomp>)r   r    r   r   Úpublic_key_fingerprintÚencrypted_datazStep 2.1 answer was %sz Step 2 invalid nonce from serverz'Step 2 invalid server nonce from serveré   é   z(Step 2 invalid DH fail nonce from serverzStep 2.2 answer was %sr   zStep 3 AES block size mismatchzStep 3 answer was %sz(Step 3 Invalid nonce in encrypted answerz/Step 3 Invalid server nonce in encrypted answerFé   é   z#g_a is not within (1, dh_prime - 1)z#g_b is not within (1, dh_prime - 1)r   iÀ  z7g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})z7g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64}))r   r    Úretry_idÚg_b)r   r    r*   zStep 3.1 answer was %sz#Step 3 invalid {} nonce from serverz*Step 3 invalid {} server nonce from serverznew_nonce_hash{}zStep 3 invalid new nonce hashzStep 3.2 answer was %s)<ÚintÚ
from_bytesÚosÚurandomÚsendr   Ú
isinstancer   r   r   Úget_intr   r   Ú	factorizer   Úget_byte_arrayÚbytesr   r    Úserver_public_key_fingerprintsÚencryptÚformatÚjoinr   r   r   r   Úto_bytesÚdigestÚnew_nonce_hashr   Úgenerate_key_data_from_nonceÚlenÚencrypted_answerr   Údecrypt_iger   ÚreadÚtgread_objectr   Údh_primeÚgÚg_aÚserver_timeÚtimeÚpowr	   Úencrypt_iger   r
   r   r   Ú	__class__Ú__name__r   ÚindexÚtypeÚcalc_new_nonce_hashÚgetattrÚAssertionError)$Úsenderr   Úres_pqr   r   r   r!   Úpq_inner_dataÚcipher_textÚtarget_fingerprintÚfingerprintÚserver_dh_paramsÚnnhÚkeyÚivÚplain_text_answerÚreaderÚserver_dh_innerrH   rI   rJ   Útime_offsetÚbr0   ÚgabÚsafety_rangeÚclient_dh_innerÚclient_dh_inner_hashedÚclient_dh_encryptedÚdh_genÚnonce_typesÚnameÚauth_keyÚnonce_numberrA   Údh_hashr#   r#   r'   Údo_authentication   s  €

ü
þ
þÿþûÿþ
þ
ÿÿÿ

ÿýÿÿÿÿÿüý
ÿ
rp   Tc                 C   s   t j| d|d�S )a8  
    Gets the specified integer from its byte array.
    This should be used by this module alone, as it works with big endian.

    :param byte_array: the byte array representing th integer.
    :param signed: whether the number is signed or not.
    :return: the integer representing the given byte array.
    r   )Ú	byteorderr   )r1   r2   )Ú
byte_arrayr   r#   r#   r'   r7   Ë   s   	r7   )T) Ú__doc__r3   rL   Úhashlibr   Útl.typesr   r   r   r   r   r	   r
   r   r   Ú r   Úcryptor   r   r   r   Úerrorsr   Ú
extensionsr   Útl.functionsr   r   r   rp   r7   r#   r#   r#   r'   Ú<module>   s    , 6