3
uQh                 @   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   sh  d}| dk s| j  |kr,tdj| j  |tjj| d dkrHtd|dkrr| d dkrptd	j|| d n|d
kr| d
 dkrtdj|| d
 n|dkrn|dkr| d dkrtdj|| d nj|dk r| d dkr:tdj|| d n<|dkr,| d dkr:tdj|| d ntdj|| d d }tjj|d dkrdt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 {}      zbad g {}, mod5 {}            zbad g {}, mod24 {}zbad g {}, mod7 {}zbad g {}z(prime - 1) // 2 is not prime)r   r   )r   r   )r
   r   r   )
bit_length
ValueErrorformatr   ZFactorizationZ	factorize)r   r   Zgood_prime_bits_countZprime_sub1_div2 r   5/tmp/pip-build-2nz6shyl/telethon/telethon/password.pycheck_prime_and_good_check   s6    

r   )prime_bytesr   c            C   s6   t d}|| k r |dk r d S ttj| d| d S )N                     r      l   R   /   p      ?   s         @   #   >   !      I   4      7   V   =         H         
      X   "         %   0            3   o   n   r      C      L      |          Q      Z         k            F   )   i   2      T         Y   _   d   $   w         *      [      J            r	   r      <   O   :      `                        ~      '   S      A      t         K         N      (   G   r      e         -                                    r                        ^   r   {                  5      .            r
         big(   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r-   r)   r;   r<   r=   r4   r>   r?   r@   rA   rB   rC   rD   rE   rF   r9   r   r?   r   rG   rH   r   rI   rJ   rK   rL   r1   rM   rN   rO   rP   r=   r;   r#   rQ   r   rR   rI   rS   rT   rT   r   rU   rV   rW   rX   rO   rY   rZ   r[   r\   r]   r$   r^   r_   rR   r`   ra   rb   rc   rd   rS   re   rf   rg   r=   rh   ri   rj   rh   rk   rl   rm   r.   rn   r	   r   rC   ro   r1   r   rp   rq   rr   rs   rt   ru   rv   rL   rw   rx   rx   ry   rG   rz   r{   rO   rs   r|   r}   r~   r   r   rT   r5   rT   r   r(   r   r   r   r   r   rg   r   r   r   r   r   r$   r   r   r]   rN   r   r   rG   r(   r`   r   r   r   r   rX   r;   r   r   r   r   r}   r   rT   r   r   r   r   r   r   r   r   r^   r   ri   r   r   r   r   r   r   r   r+   ru   r   r   r   r   r   r   r   r#   r   r(   r   r   r.   rA   r   rw   r`   r   r2   r   r   r   rY   r   r   r(   rz   r   rP   r   r   r   r   r   r   r   r0   r   rc   r]   r   rE   rq   r   r   r/   r   r   r
   r   r   r   r   r   r"   rm   ri   )r
   r   r   r	   )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   | j tdS )Nr   )to_bytesr   )r   r   r   r   big_num_for_hashR   s    r   )r   r   c              G   s(   t j }x| D ]}|j| qW |j S )N)hashlibsha256updatedigest)r   hashqr   r   r   r   V   s    
r   )r   c             C   sL   ||  }d	}d}|dk sD|j  |k sD| j  |k sD| j  d d |krHdS dS )
Ni   r)   r   r   r	   r   FTi  )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 )Nr   ).0xyr   r   r   	<genexpr>j   s    zxor.<locals>.<genexpr>)r   zip)r   r   r   r   r   xori   s    r   )passwordsalt
iterationsc             C   s   t jd| ||S )Nsha512)r   pbkdf2_hmac)r   r   r   r   r   r   pbkdf2sha512m   s    r   )algor   c             C   sD   t | j|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^   yt | j| j W n tk
r.   tdY nX t| jtjt| |dtj| jd}t|S )Nz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jt||}t	j
|jd|jt	j
| jd}yt|j W n tk
r|   tdY nX t|stdt	j
|d}t|j}t}t| j t|}t	j
t||d}	|	|  }
 fdd}| \}}}||
  }t|std|| }|| }t||}tt|}ttt|t|t|jt|j| |}tj| jt|t|S )Nz!unsupported password algorithm {}r   zbad p/g in passwordzbad b in checkc                 sf   d} x\t j| }tj|d}t|}t|rt|}tjt| d}|dkr|||fS qW d S )Nr   r   r   )osurandomr   r   r   r   r   r   )Zrandom_sizerandomr   A
a_for_hashu)
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   r   r   compute_check   sN    



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$   %