B
    f’»d¶,  ã               @   s¸   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	Z	d dl	m
Z
 d dlmZ d dlmZmZmZ d dlmZ d d	lmZmZmZ d
dlmZ e e¡ZG dd„ dƒZdS )é    N)Úsha1)ÚBytesIO)Úurandom)Úraw)Ú
Connection)ÚaesÚrsaÚprime)ÚSecurityCheckMismatch)ÚTLObjectÚLongÚInté   )ÚMsgIdc               @   s^   e Zd ZdZdeedœdd„Zeee	dœdd„ƒZ
eed	œd
d„ƒZedœdd„Zdd„ ZdS )ÚAuthé   zpyrogram.Client)ÚclientÚdc_idÚ	test_modec             C   s&   || _ || _|j| _|j| _d | _d S )N)r   r   Úipv6ÚproxyÚ
connection)Úselfr   r   r   © r   ú9/tmp/pip-unpacked-wheel-rcokkf2l/pyrogram/session/auth.pyÚ__init__(   s
    zAuth.__init__)ÚdataÚreturnc             C   s*   t dƒttƒ ƒ tt|  ¡ ƒƒ |  ¡  S )Né   )Úbytesr   r   r   ÚlenÚwrite)r   r   r   r   Úpack0   s    z	Auth.pack)Úbc             C   s   |   d¡ t | ¡S )Né   )Úseekr   Úread)r#   r   r   r   Úunpack9   s    
zAuth.unpack)r   c             Ã   s:   |   |¡}| j |¡I d H  t| j ¡ I d H ƒ}|  |¡S )N)r"   r   Úsendr   Úrecvr'   )r   r   Úresponser   r   r   Úinvoke>   s    
zAuth.invokec       #   
   Ã   sX  | j }xJt| j| j| j| jƒ| _zy®t d| j¡ | j 	¡ I dH  t
jtdƒddd}t d|¡ |  tjj|d¡I dH }t d	|j¡ t d
|j¡ x@|jD ].}|tjkrÈt d|¡ |}P q¦t d|¡ q¦W tdƒ‚t
 |jd¡}t d|¡ t ¡ }t |¡}t||| fƒ\}	}
t dtt ¡ | dƒ|	|
¡ |j}t
jtdƒddd}tjj|j|	 dd¡|
 dd¡|||d  ¡ }t!|ƒ "¡ }tt#|ƒt#|ƒ  d ƒ}|| | }t $||¡}t d¡ t d¡ |  tjj%|||	 dd¡|
 dd¡||d¡I dH }|j&}|jdddd}|jdddd}t!|| ƒ "¡ t!|| ƒ "¡ dd…  }t!|| ƒ "¡ dd… t!|| ƒ "¡  |dd…  }t
j|ddd}t' (|||¡}|dd… }t) *t+|ƒ¡}t d¡ t
 |j,d¡}|j-t ¡  }t dt|dƒ¡ |j.}t
 tdƒd¡}t/|||ƒ dd¡}d}tjj0||||d  ¡ }t!|ƒ "¡ }tt#|ƒt#|ƒ  d ƒ}|| | }t' 1|||¡}t d ¡ |  tjj2|||d!¡I dH }t
 |j3d¡}t/|||ƒ dd¡} |jdddd}t4 5|tj6kd"¡ t d#¡ t
 |d¡}t4 5d$|  k o"|d$ k n  d%¡ t4 5d$|  k oH|d$ k n  d&¡ t4 5d$|  k on|d$ k n  d'¡ t4 5d(d) |  k oœ|d(d)  k n  d*¡ t4 5d(d) |  k oÊ|d(d)  k n  d+¡ t d,¡ |  ¡ }t4 5|dd… t!|ƒ "¡ kd-¡ t d.¡ t4 5||j7kd/¡ t
j|ddd}t4 5||j7kd0¡ t4 5||jkd1¡ t4 5||j7kd2¡ t4 5||jkd3¡ |jdddd}t d4¡ t' 8|dd5… |dd5… ¡}!t d6t
 |!d¡¡ t d7|j9j:¡ W n^ tk
r4 }" z>t d8t;|"ƒj:|"¡ |r|d$8 }n|"‚t< =d$¡I dH  w
W dd}"~"X Y nX | S W d| j >¡ I dH  X q
W dS )9zw
        https://core.telegram.org/mtproto/auth_key
        https://core.telegram.org/mtproto/samples-auth_key
        z%Start creating a new auth key on DC%sNé   ÚlittleT)ÚsignedzSend req_pq: %s)ÚnoncezGot ResPq: %sz"Server public key fingerprints: %szUsing fingerprint: %szFingerprint unknown: %szPublic key not foundÚbigzStart PQ factorization: %sz"Done PQ factorization (%ss): %s %sé   é    é   )ÚpqÚpÚqr/   Úserver_nonceÚ	new_nonceéÿ   zDone encrypt data with RSAzSend req_DH_params)r/   r7   r5   r6   Úpublic_key_fingerprintÚencrypted_dataé   r$   zDone decrypting answerzDelta time: %sé   r   )r/   r7   Úretry_idÚg_bzSend set_client_DH_params)r/   r7   r;   z"dh_prime == prime.CURRENT_DH_PRIMEzDH parameters check: OKr   z1 < g < dh_prime - 1z1 < g_a < dh_prime - 1z1 < g_b < dh_prime - 1é   iÀ  z42 ** (2048 - 64) < g_a < dh_prime - 2 ** (2048 - 64)z42 ** (2048 - 64) < g_b < dh_prime - 2 ** (2048 - 64)zg_a and g_b validation: OKz.answer_with_hash[:20] == sha1(answer).digest()zSHA1 hash values check: OKznonce == res_pq.nonceznonce == server_dh_params.noncez-server_nonce == server_dh_params.server_noncez*nonce == set_client_dh_params_answer.noncez8server_nonce == set_client_dh_params_answer.server_noncezNonce fields check: OKr   zServer salt: %szDone auth key exchange: %szRetrying due to %s: %s)?ÚMAX_RETRIESr   r   r   r   r   r   ÚlogÚinfoÚconnectÚintÚ
from_bytesr   Údebugr+   r   Z	functionsZ
ReqPqMultir7   Zserver_public_key_fingerprintsr   Zserver_public_keysÚ	Exceptionr4   Útimer	   Z	decomposeÚsortedÚroundÚtypesZPQInnerDataÚto_bytesr!   r   Údigestr    ZencryptZReqDHParamsÚencrypted_answerr   Zige256_decryptr   r&   r   Údh_primeZserver_timeÚgÚpowZClientDHInnerDataZige256_encryptZSetClientDHParamsÚg_ar
   ÚcheckZCURRENT_DH_PRIMEr/   ÚxorÚ	__class__Ú__name__ÚtypeÚasyncioÚsleepÚclose)#r   Zretries_leftr/   Zres_pqÚir:   r4   ÚstartrQ   r5   r6   r7   r8   r   ÚshaÚpaddingZdata_with_hashr;   Zserver_dh_paramsrO   Ztmp_aes_keyZ
tmp_aes_ivZanswer_with_hashZanswerZserver_dh_inner_datarP   Z
delta_timer#   r?   r>   Zset_client_dh_params_answerrS   Zauth_keyZserver_saltÚer   r   r   ÚcreateE   sþ    







4


&&&$$



zAuth.createN)rW   Ú
__module__Ú__qualname__rA   rE   Úboolr   Ústaticmethodr   r   r"   r   r'   r+   ra   r   r   r   r   r   %   s   r   )rY   ÚloggingrI   Úhashlibr   Úior   Úosr   Zpyrogramr   Zpyrogram.connectionr   Zpyrogram.cryptor   r   r	   Zpyrogram.errorsr
   Zpyrogram.raw.corer   r   r   Z	internalsr   Ú	getLoggerrW   rB   r   r   r   r   r   Ú<module>   s   
