B
    fd                 @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 ddlmZ eeeedd	d
Ze	eeeeedddZeeeee	dddZdS )    )sha256)BytesIO)urandom)SecurityCheckMismatch)MessageLong   )aes)auth_keymsg_keyoutgoingreturnc             C   s   |rdnd}t || ||d    }t | |d |d  |  }|d d |dd  |dd  }|d d |dd  |dd  }||fS )Nr      $   (   L          )r   digest)r
   r   r   xZsha256_aZsha256_baes_keyaes_iv r   ;/tmp/pip-unpacked-wheel-rcokkf2l/pyrogram/crypto/mtproto.pykdf   s     $$r   )messagesalt
session_idr
   auth_key_idr   c             C   s   t || |   }tt|d  d d }t|dd | |  }|dd }t||d\}	}
|| t|| |	|
 S )N      X   x   r   r   T)	r   writer   lenr   r   r   r	   Zige256_encrypt)r   r   r   r
   r   datapaddingZmsg_key_larger   r   r   r   r   r   pack)   s    r'   )br   r
   r   r   c          
      s  t | d|kd | d}t||d\}}tt|  ||}|d t |d|kd yt|}W n tk
r }	 z|	j	d dkrt
d|    fdd	tdt d
D  dd	  D  ddd  D  tdt|	j	d  d  W d d }	~	X Y nX t |t|dd |   dd kd |d | }
|
|jd  }t dt|  kodkn  d t t|
d dkd t |jd dkd |S )Nr   zb.read(8) == auth_key_idr    Fzdata.read(8) == session_idr   z4Received empty data. Check your internet connection.c                s   g | ]} ||d   qS )@   r   ).0i)leftr   r   
<listcomp>M   s    zunpack.<locals>.<listcomp>r)   c                s*   g | ]"  fd dt dt dD qS )c                s   g | ]} ||d   qS )r   r   )r*   r+   )r,   r   r   r-   N   s    z%unpack.<locals>.<listcomp>.<listcomp>r   r   )ranger$   )r*   r   )r,   r   r-   N   s    
c             s   s"   | ]}d  dd |D V  qdS ) c             s   s   | ]
}|V  qd S )Nr   )r*   r   r   r   r   	<genexpr>O   s    z#unpack.<locals>.<genexpr>.<genexpr>N)join)r*   r,   r   r   r   r1   O   s    zunpack.<locals>.<genexpr>z(The server sent an unknown constructor: `      r   zHmsg_key == sha256(auth_key[96:96 + 32] + data.getvalue()).digest()[8:24]r   r   i   z12 <= len(padding) <= 1024   zlen(payload) % 4 == 0   zmessage.msg_id % 2 != 0)r   checkreadr   r   r	   Zige256_decryptr   KeyErrorargsConnectionErrorhexr.   r$   r2   
ValueErrorr   getvaluer   seeklengthZmsg_id)r(   r   r
   r   r   r   r   r%   r   epayloadr&   r   )r,   r   unpack5   s4    

0&
&rC   N)hashlibr   ior   osr   Zpyrogram.errorsr   Zpyrogram.raw.corer   r    r	   bytesbooltupler   intr'   rC   r   r   r   r   <module>   s   