U
    h                     @   s   d dl Z d dlZddlmZ ddlmZ eedddZeedd	d
Z	eee
dddZdZeedddZeedddZeedddZe
dddZeeedddZeeeddd Zejed!d"d#Zejed!d$d%Zejjed&d'd(ZdS ))    N   )factorization)types)primegc                 C   sd  d}| dk s|   |kr,td|   |tj| d dkrHtd|dkrr| d dkrptd	|| d n|d
kr| d
 dkrtd|| d
 n|dkrn|dkr| d dkrtd|| d nf|dkr| d dkrtd|| d n<|dkr(| d dkr6td|| d ntd|| d d }tj|d dkr`tdd S )Ni   r   zbad prime count {}, expected {}r   zgiven "prime" is not prime         zbad g {}, mod8 {}   zbad g {}, mod3 {}      )r   r   zbad g {}, mod5 {}      )      zbad g {}, mod24 {})r
   r   r   zbad g {}, mod7 {}zbad g {}z(prime - 1) // 2 is not prime)
bit_length
ValueErrorformatr   ZFactorizationZ	factorize)r   r   Zgood_prime_bits_countZprime_sub1_div2 r   5/tmp/pip-unpacked-wheel-c81u5j2r/telethon/password.pycheck_prime_and_good_check   s:     
r   )prime_bytesr   c                 C   s2   t d}|| kr|dkrd S tt| d| d S )N(                        r      l   R   /   p      ?   s         @   #   r   >   !      I   4      7   V   =         H         
      r-   r)   X   "      r4      %   0            3   o   n   r9   r   r?   r      C   r      L      |   r1          Q      r=   r;   r#   Z   r      rI      k   rT   r            F   rO   )   i   2      T   r$         rR   Y   _   d   $   w   rS         *   r=      [      rh   J         r.      r	   r   rC      r1   r   <   O   :      `         rL         rx      rG         rO   rs   ~      '   S      rT   r5   rT   A   r(      t         K   rg         r   N      r$   (   G   r]   rN   r      rG   r(   r`   e      r      rX   r;   -   r   r      r}      rT      r            r         r^      ri         r   r            r+   ru               r   ^   r   r#   r   r(   r   r   r.   rA   {   rw   r`      r2            rY   r      r(   rz   r   rP   5   r   r      .   r   r   r0   r   rc   r]      rE   rq         r/   r   r   r
      r   r      r   r"   rm   ri   )r
   r   r   r	   big)bytesr   int
from_bytes)r   r   Z
good_primer   r   r   check_prime_and_good-   s
    r   )numberpreturnc                 C   s   | dko||  dkS )Nr   r   )r   r   r   r   r   is_good_largeG   s    r      )r   r   c                 C   s   t tt|  |  S N)r   SIZE_FOR_HASHlen)r   r   r   r   num_bytes_for_hashN   s    r   )r   r   c                 C   s   |  tdS )Nr   )to_bytesr   )r   r   r   r   big_num_for_hashR   s    r   )r   r   c                  G   s$   t  }| D ]}|| q| S r   )hashlibsha256updatedigest)r   hashqr   r   r   r   V   s    r   )r   c                 C   sL   ||  }d}d}|dk sD|  |k sD|   |k sD|   d d |krHdS dS )Ni  r   r   r	   r   FT)r   )Zmodexpr   ZdiffZmin_diff_bits_countZmax_mod_exp_sizer   r   r   is_good_mod_exp_first]   s    

r   )abr   c                 C   s   t dd t| |D S )Nc                 s   s   | ]\}}||A V  qd S r   r   ).0xyr   r   r   	<genexpr>j   s     zxor.<locals>.<genexpr>)r   zip)r   r   r   r   r   xori   s    r   passwordZsaltZ
iterationsc                 C   s   t d| ||S )Nsha512)r   pbkdf2_hmacr   r   r   r   pbkdf2sha512m   s    r   )algor   c                 C   sD   t | j|d| j}t | j|| j}t|| jd}t | j|| jS )Nzutf-8i )r   salt1encodesalt2r   )r   r   Zhash1Zhash2Zhash3r   r   r   compute_hashq   s    r   c                 C   s^   zt | j| j W n tk
r.   tdY nX t| jtt| |dt| jd}t|S )Nbad p/g in passwordr   )	r   r   r   r   powr   r   r   r   )r   r   valuer   r   r   compute_digesty   s    r   )requestr   c                    s  | j }t|tjs$td|jjt||}t	
|jd|jt	
| jd}zt|j W n tk
r|   tdY nX t|stdt	
|d}t|j}t}t| j t|}t	
t||d}	|	|  }
 fdd}| \}}}||
  }t|std|| }|| }t||}tt|}ttt|t|t|jt|j| |}t| jt|t|S )Nz!unsupported password algorithm {}r   r   zbad b in checkc                     sb   d} t | }t|d}t|}t|rt|}tt| d}|dkr|||fS qd S )Nr   r   r   )osurandomr   r   r   r   r   r   )Zrandom_sizerandomr   A
a_for_hashuZ
b_for_hashr   r   r   r   generate_and_check_random   s    

z0compute_check.<locals>.generate_and_check_randomzbad g_b)Zcurrent_algo
isinstancer   APasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowr   r   	__class____name__r   r   r   r   r   Zsrp_Br   r   r   r   r   r   r   r   r   r   ZInputCheckPasswordSRPZsrp_idr   )r   r   r   Zpw_hashBr   Z
p_for_hashZ
g_for_hashZg_xkZkg_xr   r   r   r   Zg_bZuxZa_uxSKZM1r   r   r   compute_check   sX    



	  r   )r   r   Zcryptor   tlr   r   r   r   r   boolr   r   r   r   r   r   r   r   r   strr   r   accountZPasswordr   r   r   r   r   <module>   s(   %