o
    Xzj  ã                   @   s  d dl Z d dlZddlmZ ddlmZ dedefdd„Zd	edefd
d„Z	dedede
fdd„ZdZdedefdd„Zdedefdd„Zdedefdd„Zde
fdd„Zdededefdd„Zdeded efd!d"„Zd#ejdefd$d%„Zd#ejdefd&d'„Zd(ejjdefd)d*„ZdS )+é    Né   )Úfactorization)ÚtypesÚprimeÚgc                 C   s^  d}| dk s|   ¡ |krtd |   ¡ |¡ƒ‚tj | ¡d dkr$tdƒ‚|dkr9| d dkr8td	 || d ¡ƒ‚n`|d
krN| d
 dkrMtd || d
 ¡ƒ‚nK|dkrSnF|dkrh| d dvrgtd || d ¡ƒ‚n1|dkr}| d dvr|td || d ¡ƒ‚n|dkr’| d dvr‘t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   ÚFactorizationÚ	factorize)r   r   Úgood_prime_bits_countÚprime_sub1_div2© r   úL/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telethon/password.pyÚcheck_prime_and_good_check   sD   ÿÿÿÿÿÿÿr   Úprime_bytesc                 C   s2   t dƒ}|| kr|dv rd S tt | d¡|ƒ d S )N(   éÇ   é   é®   é¹   éÆ   é±   éÉ   r   éŽ   él   éR   é/   ép   éñ   é?   és   é˜   é   é@   é#   r#   é>   é!   éÁ   éI   é4   éÐ   é7   éV   é=   é“   é   éH   é   éŠ   é
   é§   r1   r-   éX   é"   é”   r8   éÒ   é%   é0   éô   éÛ   éú   é3   éo   én   r=   r"   rC   r   é•   éC   r   éÔ   éL   éÎ   é|   r5   é    éý   éQ   éö   rA   r?   r'   éZ   r    éŒ   rM   éþ   ék   rX   r   é«   éÜ   é—   éF   rS   é)   éi   é2   é„   éT   r(   é�   é¯   rV   éY   é_   éd   é$   éw   rW   é–   é»   é*   rA   é   é[   éÍ   rl   éJ   éÈ   éÌ   r2   éˆ   r	   r   rG   é›   r5   r#   é<   éO   é:   é�   é`   é¾   éæ   rP   éù   é¤   r|   é¦   rK   é�   é   rS   rw   é~   é   é'   éS   éµ   rX   r9   rX   éA   r,   éº   ét   éØ   é¨   éK   rk   é   é³   r‹   éN   é   r(   é(   éG   ra   rR   r   éí   rK   r,   rd   ée   é´   r   éÝ   r\   r?   é-   r!   r   é�   r�   éœ   rX   éÄ   r’   é°   éÖ   éÿ   r—   é£   é’   rb   éï   rm   éš   éä   r    r   éü   é   éè   r/   ry   é    éø   é   é©   r›   é^   r‘   r'   r   r,   r‘   r�   r2   rE   é{   r{   rd   éÙ   r6   é…   é   éé   r]   r«   é   r,   r~   r¢   rT   é5   r!   r   éî   é.   r�   r¢   r4   rŠ   rg   ra   é¿   rI   ru   é­   éð   r3   r!   r   r
   é   r—   rˆ   éã   r   r&   rq   rm   )r
   r   r   r	   Úbig)Úbytesr   ÚintÚ
from_bytes)r   r   Ú
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   ó   rÀ   é   c                 C   s   t tt| ƒ ƒ|  S ©N)r¸   ÚSIZE_FOR_HASHÚlen)r½   r   r   r   Únum_bytes_for_hashN   rÁ   rÆ   c                 C   s   |   td¡S )Nr·   )Úto_bytesrÄ   )r   r   r   r   Úbig_num_for_hashR   s   rÈ   c                  G   s$   t  ¡ }| D ]}| |¡ q| ¡ S rÃ   )ÚhashlibÚsha256ÚupdateÚdigest)r¾   ÚhashÚqr   r   r   rÊ   V   s   rÊ   c                 C   sL   ||  }d}d}|dk s"|  ¡ |k s"|   ¡ |k s"|   ¡ d d |kr$dS dS )NiÀ  rÂ   r   r	   r   FT)r   )Úmodexpr   ÚdiffÚmin_diff_bits_countÚmax_mod_exp_sizer   r   r   Úis_good_mod_exp_first]   s   rÓ   ÚaÚbc                 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Û   ÚpasswordÚsaltÚ
iterationsc                 C   s   t  d| ||¡S )NÚsha512)rÉ   Úpbkdf2_hmac)rÜ   rÝ   rÞ   r   r   r   Úpbkdf2sha512m   s   rá   Úalgoc                 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Ü   Úhash1Úhash2Úhash3r   r   r   Úcompute_hashq   s   ré   c                 C   sX   z	t | j| jƒ W n ty   tdƒ‚w 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í   Úrequestc                    s‚  | j }t|tjƒstd |jj¡ƒ‚t||ƒ}t	 
|jd¡‰|j‰t	 
| jd¡}zt|jˆƒ W n ty;   tdƒ‚w t|ˆƒsEt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                     s`   d} 	 t  | ¡}t |d¡}tˆ|ˆƒ}t|ˆƒr/t|ƒ}t t|ˆ ƒd¡}|dkr/|||fS q)NrÂ   Tr·   r   )ÚosÚurandomr¹   rº   rë   rÓ   rÈ   rÊ   )Ú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)Úcurrent_algoÚ
isinstancer   ÚAPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowr   r   Ú	__class__Ú__name__ré   r¹   rº   r¾   r   Úsrp_Br¼   rÀ   rÆ   rÈ   rë   rÊ   rÓ   rÛ   rã   rå   ÚInputCheckPasswordSRPÚsrp_idr¸   )rî   rÜ   râ   Úpw_hashÚBr×   Ú
p_for_hashÚ
g_for_hashÚg_xÚkÚkg_xrø   rÔ   rô   rõ   Úg_bÚuxÚa_uxÚSÚKÚM1r   rö   r   Úcompute_checkˆ   sV   
ÿ
ÿ



ú	ÿr  )rÉ   rï   Úcryptor   Útlr   r¹   r   r¸   r¼   ÚboolrÀ   rÄ   rÆ   rÈ   rÊ   rÓ   rÛ   rá   rû   Ústrré   rí   ÚaccountÚPasswordr  r   r   r   r   Ú<module>   s*    %
ÿ
ÿ