
    ;Si                         d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZmZ d ZddZy)z
This module contains several functions that authenticate the client machine
with Telegram's servers, effectively creating an authorization key.
    N)sha1   )	ResPQPQInnerDataServerDHParamsFailServerDHParamsOkServerDHInnerDataClientDHInnerDataDhGenOk
DhGenRetry	DhGenFail)helpers)AESAuthKeyFactorizationrsa)SecurityError)BinaryReader)ReqPqMultiRequestReqDHParamsRequestSetClientDHParamsRequestc                 
  K   t         j                  t        j                  d      dd      }| j	                  t        |             d{   }t        |t              s
J d|z         |j                  |k7  rt        d      t        |j                        }t        j                  |      \  }}t        j                  |      t        j                  |      }}t         j                  t        j                  d      d	d      }t!        t#        t        j                  |      |||j                  |j$                  |
            }d\  }}	|j&                  D ]  }
t        j(                  |
|      }||
}	 n |/|j&                  D ]   }
t        j(                  |
|d      }||
}	 n |Jt        dj+                  dj-                  |j&                  D cg c]  }t/        |       c}                  | j	                  t1        |j                  |j$                  |||	|             d{   }t        |t2        t4        f      s
J d|z         |j                  |j                  k7  rt        d      |j$                  |j$                  k7  rt        d      t        |t4              r^t         j                  t7        |j9                  dd	d            j;                         dd d	d      }|j<                  |k7  rt        d      t        |t2              s
J d|z         t?        j@                  |j$                  |      \  }}tC        |jD                        dz  dk7  rt        d      tG        jH                  |jD                  ||      }tK        |      5 }|jM                  d       |jO                         }t        |tP              s
J d|z         	 ddd       j                  |j                  k7  rt        d      |j$                  |j$                  k7  rt        d      t        |jR                  d      }|jT                  }t        |jV                  d      }|jX                  t        t[        jZ                               z
  }t        t        j                  d      d      }t]        |||      }t]        |||      }d|cxk  r|dz
  k  st        d       t        d      d|cxk  r|dz
  k  st        d       t        d      d|cxk  r|dz
  k  st        d        t        d       d!d"z  }||cxk  r||z
  k  st        d#       t        d#      ||cxk  r||z
  k  st        d$       t        d$      t!        t_        |j                  |j$                  dt        j                  |      %            }t7        |      j;                         |z   }tG        j`                  |||      }| j	                  tc        |j                  |j$                  |&             d{   }td        tf        th        f}t        ||      s
J d'|z         |jj                  jl                  } |j                  |j                  k7  rt        d(j+                  |             |j$                  |j$                  k7  rt        d)j+                  |             to        t        j                  |            }!d|jq                  ts        |            z   }"|!ju                  ||"      }#tw        |d*j+                  |"            }$|$|#k7  rt        d+      t        |td              sty        d,|z        |!|fS 7 c c}w 7 C# 1 sw Y   xY w7 Zw)-z
    Executes the authentication process with the Telegram servers.

    :param sender: a connected `MTProtoPlainSender`.
    :return: returns a (authorization key, time offset) tuple.
       bigT)signedNzStep 1 answer was %sz Step 1 invalid nonce from server    little)pqpqnonceserver_nonce	new_nonce)NN)use_oldz6Step 2 could not find a valid key for fingerprints: {}z, )r!   r"   r   r    public_key_fingerprintencrypted_datazStep 2.1 answer was %sz Step 2 invalid nonce from serverz'Step 2 invalid server nonce from server      z(Step 2 invalid DH fail nonce from serverzStep 2.2 answer was %sr   zStep 3 AES block size mismatchzStep 3 answer was %sz(Step 3 Invalid nonce in encrypted answerz/Step 3 Invalid server nonce in encrypted answerF      z#g_a is not within (1, dh_prime - 1)z#g_b is not within (1, dh_prime - 1)r   i  z7g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})z7g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64}))r!   r"   retry_idg_b)r!   r"   r&   zStep 3.1 answer was %sz#Step 3 invalid {} nonce from serverz*Step 3 invalid {} server nonce from serverznew_nonce_hash{}zStep 3 invalid new nonce hashzStep 3.2 answer was %s)=int
from_bytesosurandomsendr   
isinstancer   r!   r   get_intr   r   	factorizer   get_byte_arraybytesr   r"   server_public_key_fingerprintsencryptformatjoinstrr   r   r   r   to_bytesdigestnew_nonce_hashr   generate_key_data_from_noncelenencrypted_answerr   decrypt_iger   readtgread_objectr	   dh_primegg_aserver_timetimepowr
   encrypt_iger   r   r   r   	__class____name__r   indextypecalc_new_nonce_hashgetattrAssertionError)%senderr!   res_pqr   r   r    r#   pq_inner_datacipher_texttarget_fingerprintfingerprintfserver_dh_paramsnnhkeyivplain_text_answerreaderserver_dh_innerrE   rF   rG   time_offsetbr,   gabsafety_rangeclient_dh_innerclient_dh_inner_hashedclient_dh_encrypteddh_gennonce_typesnameauth_keynonce_numberr>   dh_hashs%                                        c/var/www/OnlineNewsSite/project/venv/lib/python3.12/site-packages/telethon/network/authenticator.pydo_authenticationro      s@     NN2::b>5N>E;;0788Ffe$E&<v&EE$||u>??		B ""2&DAqa #"4"4Q"7qArzz"~xEI+b!Q!ll((	 M '1#K#<< kk+}="!,	 !@@ 	K++k=$OK&%0"		 DVDII!'!F!FGAQGI 
 	
 $[[);ll((
q1"*   +-?@B 4 #334 B ->??$$(;(;;EFF"$67nn##B#>?FFH2NT  
 **c1 JKK&(89 4 #3349 22YGC ,,-2a7<==))3 
'	( 5FB ..0/+<= 	5"_4	5=5 ,FGG##v':'::MNN//>HA
/%%e
4C!--DIIK0@@K

3.A
aH
C
c1h
C "X\"ABB #ABB$x!|$ABB %ABB$x!|$ABB %ABB#LC<H|$;<UVV =UVVC<H|$;<UVV =UVV -ll((s#	 O "/299;oM //*@#rJ ;;7ll((*   F J	2Kfk*M,Dv,MM*$$D||v||#AHHNOOf1118??EG 	G s))#./H{((f66L11)\JNf077EFG. ;<<fg&5>??[  S 9P HR5 5rse   A	^](D'^40^%0^]+'A^-]0.E)^<]3I^&^ 'E^+^3]=8	^c                 2    t         j                  | d|      S )a8  
    Gets the specified integer from its byte array.
    This should be used by this module alone, as it works with big endian.

    :param byte_array: the byte array representing th integer.
    :param signed: whether the number is signed or not.
    :return: the integer representing the given byte array.
    r   )	byteorderr   )r-   r.   )
byte_arrayr   s     rn   r3   r3      s     >>*f>EE    )T) __doc__r/   rI   hashlibr   tl.typesr   r   r   r   r	   r
   r   r   r    r   cryptor   r   r   r   errorsr   
extensionsr   tl.functionsr   r   r   ro   r3    rs   rn   <module>r}      sL    
      5 5 " % 
r!j	Frs   