
    ՟f|Y                        d dl Z d dlmZ d dlmZmZmZmZmZ 	 d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d
Z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$ erd dl%m&Z& ed        Z'ed        Z( G d de      Z) G d de      Z* G d de      Z+ G d de      Z, G d de      Z- G d  d!e-      Z. G d" d#e-      Z/y# e$ r dZ
d\  ZZZZZd\  ZZZZdZY w xY w)$    N)	b64decode)TYPE_CHECKINGOptionalSequenceTupleno_type_check)default_backend)MGF1OAEP)Cipher)AES)CBC)SHA1SHA256SHA512HashT)NNNNN)NNNNF)TelegramObject)parse_sequence_arg)TextEncoding)JSONDict)PassportDecryptionError)Botc                 &   t         st        d      t        t               t	                     }|j                  | |z          |j                         }|dd |dd }}t        t        |      t        |      t	                     }|j                         }|j                  |      |j                         z   }t        t               t	                     }|j                  |       |j                         }	|	|k7  rt        d|	 d|       ||d   d S )	a  
    Decrypt per telegram docs at https://core.telegram.org/passport.

    Args:
        secret (:obj:`str` or :obj:`bytes`): The encryption secret, either as bytes or as a
            base64 encoded string.
        hash (:obj:`str` or :obj:`bytes`): The hash, either as bytes or as a
            base64 encoded string.
        data (:obj:`str` or :obj:`bytes`): The data to decrypt, either as bytes or as a
            base64 encoded string.
        file (:obj:`bool`): Force data to be treated as raw data, instead of trying to
            b64decode it.

    Raises:
        :class:`PassportDecryptionError`: Given hash does not match hash of decrypted data.

    Returns:
        :obj:`bytes`: The decrypted data as bytes.

    cTo use Telegram Passports, PTB must be installed via `pip install "python-telegram-bot[passport]"`.)backendN    0   zHashes are not equal! z != r   )CRYPTO_INSTALLEDRuntimeErrorr   r   r	   updatefinalizer   r   r   	decryptorr   r   )
secrethashdatadigestsecret_hash_hashkeyinit_vectorcipherr"   	data_hashs
             Y/var/www/cvtools/html/venv/lib/python3.12/site-packages/telegram/_passport/credentials.pydecryptr-   2   s   , 0
 	

 &(O$56F
MM&4- (',.>rG.LCCHc+.8IJF  "ID!I$6$6$88D&(O$56F
MM$!ID%(>ykdV&TUUQ	?    c                 |    t        j                  t        | ||      j                  t        j
                              S )zPDecrypts data using secret and hash and then decodes utf-8 string and loads json)jsonloadsr-   decoder   UTF_8)r#   r$   r%   s      r,   decrypt_jsonr4   c   s-     ::gfdD1889K9KLMMr.   c            
       l     e Zd ZdZdZdddedededee   f fd	Ze	d
e
fd       Ze	dd       Z xZS )EncryptedCredentialsaD  Contains data required for decrypting and authenticating EncryptedPassportElement. See the
    Telegram Passport Documentation for a complete description of the data decryption and
    authentication processes.

    Objects of this class are comparable in terms of equality. Two objects of this class are
    considered equal, if their :attr:`data`, :attr:`hash` and :attr:`secret` are equal.

    Note:
        This object is decrypted only when originating from
        :attr:`telegram.PassportData.decrypted_credentials`.

    Args:
        data (:class:`telegram.Credentials` | :obj:`str`): Decrypted data with unique user's
            nonce, data hashes and secrets used for EncryptedPassportElement decryption and
            authentication or base64 encrypted data.
        hash (:obj:`str`): Base64-encoded data hash for data authentication.
        secret (:obj:`str`): Decrypted or encrypted secret used for decryption.

    Attributes:
        data (:class:`telegram.Credentials` | :obj:`str`): Decrypted data with unique user's
            nonce, data hashes and secrets used for EncryptedPassportElement decryption and
            authentication or base64 encrypted data.
        hash (:obj:`str`): Base64-encoded data hash for data authentication.
        secret (:obj:`str`): Decrypted or encrypted secret used for decryption.

    )_decrypted_data_decrypted_secretr%   r$   r#   N
api_kwargsr%   r$   r#   r:   c                    t         |   |       || _        || _        || _        | j                  | j                  | j                  f| _        d | _        d | _        | j                          y Nr9   )	super__init__r%   r$   r#   	_id_attrsr8   r7   _freeze)selfr%   r$   r#   r:   	__class__s        r,   r>   zEncryptedCredentials.__init__   s]     	J/		!))TYY<266:r.   returnc           	      x   | j                   t        st        d      	 | j                         j                  j                  t        | j                        t        t        t                     t               d            | _         | j                   S | j                   S # t        $ r}t        |      |d}~ww xY w)z
        :obj:`bytes`: Lazily decrypt and return secret.

        Raises:
            telegram.error.PassportDecryptionError: Decryption failed. Usually due to bad
                private/public key but can also suggest malformed/tampered data.
        Nr   )	algorithm)mgfrE   label)r8   r   r   get_botprivate_keyr-   r   r#   r   r
   r   
ValueErrorr   )rA   	exceptions     r,   decrypted_secretz%EncryptedCredentials.decrypted_secret   s     !!)#"8 H)-)C)C)K)Kdkk*TDF3tvTR*& %%%t%%%  H-i8iGHs   A(B 	B9(B44B9c           	          | j                   dt        j                  t        | j                  t        | j                        t        | j                              | j                               | _         | j                   S )a~  
        :class:`telegram.Credentials`: Lazily decrypt and return credentials data. This object
            also contains the user specified nonce as
            `decrypted_data.nonce`.

        Raises:
            telegram.error.PassportDecryptionError: Decryption failed. Usually due to bad
                private/public key but can also suggest malformed/tampered data.
        )	r7   Credentialsde_jsonr4   rL   r   r$   r%   rH   )rA   s    r,   decrypted_dataz#EncryptedCredentials.decrypted_data   sa     '#.#6#6T22Idii4H)TXT]T]J^_$D  ###r.   )rC   rN   )__name__
__module____qualname____doc__	__slots__strr   r   r>   propertybytesrL   rP   __classcell__rB   s   @r,   r6   r6   i   ss    6I *.  	 X&* &% & &< $ $r.   r6   c            	       x     e Zd ZdZdZdddddedee   f fd	Ze		 dd
ee   ded   ded    f fd       Z
 xZS )rN   z
    Attributes:
        secure_data (:class:`telegram.SecureData`): Credentials for encrypted data
        nonce (:obj:`str`): Bot-specified nonce
    )noncesecure_dataNr9   r]   
SecureDatar\   r:   c                b    t         |   |       || _        || _        | j	                          y r<   )r=   r>   r]   r\   r@   )rA   r]   r\   r:   rB   s       r,   r>   zCredentials.__init__   s-     	J/'2
r.   r%   botr   rC   c                     | j                  |      }|syt        j                  |j                  d      |      |d<   t        | 	  ||      S ),See :meth:`telegram.TelegramObject.de_json`.Nr]   r`   r%   r`   )_parse_datar^   rO   getr=   clsr%   r`   rB   s      r,   rO   zCredentials.de_json   sO    
 t$(00-1Hc0R]wDc22r.   N)rQ   rR   rS   rT   rU   rV   r   r   r>   classmethodrO   rY   rZ   s   @r,   rN   rN      sw     )I *.! 
 X& >B3H%3,4UO3	-	 3 3r.   rN   c                        e Zd ZdZdZ	 	 	 	 	 	 	 	 	 	 	 dddded   ded   ded   d	ed   d
ed   ded   ded   ded   ded   ded   ded   dee   f fdZe	 ddee   ded   ded    f fd       Z	 xZ
S )r^   a  
    This object represents the credentials that were used to decrypt the encrypted data.
    All fields are optional and depend on fields that were requested.

    Args:
        personal_details (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            personal details.
        passport (:class:`telegram.SecureValue`, optional): Credentials for encrypted passport.
        internal_passport (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            internal passport.
        driver_license (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            driver license.
        identity_card (:class:`telegram.SecureValue`, optional): Credentials for encrypted ID card
        address (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            residential address.
        utility_bill (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            utility bill.
        bank_statement (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            bank statement.
        rental_agreement (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            rental agreement.
        passport_registration (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            registration from internal passport.
        temporary_registration (:class:`telegram.SecureValue`, optional): Credentials for encrypted
            temporary registration.

    Attributes:
        personal_details (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            personal details.
        passport (:class:`telegram.SecureValue`): Optional. Credentials for encrypted passport.
        internal_passport (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            internal passport.
        driver_license (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            driver license.
        identity_card (:class:`telegram.SecureValue`): Optional. Credentials for encrypted ID card
        address (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            residential address.
        utility_bill (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            utility bill.
        bank_statement (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            bank statement.
        rental_agreement (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            rental agreement.
        passport_registration (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            registration from internal passport.
        temporary_registration (:class:`telegram.SecureValue`): Optional. Credentials for encrypted
            temporary registration.
    )addressbank_statementdriver_licenseidentity_cardinternal_passportpassportpassport_registrationpersonal_detailsrental_agreementtemporary_registrationutility_billNr9   rs   SecureValuerq   rp   rn   ro   rl   rv   rm   rt   rr   ru   r:   c                    t         |   |       || _        |
| _        |	| _        || _        || _        || _        || _        || _	        || _
        || _        || _        | j                          y r<   )r=   r>   ru   rr   rt   rm   rv   rl   ro   rn   rp   rq   rs   r@   )rA   rs   rq   rp   rn   ro   rl   rv   rm   rt   rr   ru   r:   rB   s                r,   r>   zSecureData.__init__:  sw      	J/ >T#<Q"7G5C3?.54A5C8I/77Gr.   r%   r`   r   rC   c                    | j                  |      }|syt        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d	      |      |d	<   t        j                  |j                  d
      |      |d
<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        | 	  ||      S )rb   Nru   rc   rr   rt   rm   rv   rl   ro   rn   rp   rq   rs   rd   )re   rw   rO   rf   r=   rg   s      r,   rO   zSecureData.de_json[  s   
 t$)4)<)<HH-.C *= *
%& )4(;(;HH,-3 )< )
$% $/#6#6txx@R7SY\#6#] !,!4!4TXX>N5OUX!4!Y*22488N3KQT2U^%--dhhy.As-KY + 3 3DHH_4MSV 3 W_!,!4!4TXX>N5OUX!4!Y$/$7$7AT8U[^$7$_ !&..txx
/C.MZ#.#6#6txx@R7SY\#6#] wDc22r.   )NNNNNNNNNNNri   )rQ   rR   rS   rT   rU   r   r   r>   rj   rO   rY   rZ   s   @r,   r^   r^      s2   /bI  59,0592615+/0426489=:> *."=1 =) $M2	
 !/  . -( }- !/ #=1  (6 !) 7 X&B >B3H%3,4UO3	,	3 3r.   r^   c                        e Zd ZdZdZ	 	 	 	 	 	 dddded   ded   d	ed   d
ed   deed      deed      dee   f fdZe		 ddee   ded   ded    f fd       Z
 xZS )rw   a?  
    This object represents the credentials that were used to decrypt the encrypted value.
    All fields are optional and depend on the type of field.

    Args:
        data (:class:`telegram.DataCredentials`, optional): Credentials for encrypted Telegram
            Passport data. Available for "personal_details", "passport", "driver_license",
            "identity_card", "identity_passport" and "address" types.
        front_side (:class:`telegram.FileCredentials`, optional): Credentials for encrypted
            document's front side. Available for "passport", "driver_license", "identity_card"
            and "internal_passport".
        reverse_side (:class:`telegram.FileCredentials`, optional): Credentials for encrypted
            document's reverse side. Available for "driver_license" and "identity_card".
        selfie (:class:`telegram.FileCredentials`, optional): Credentials for encrypted selfie
            of the user with a document. Can be available for "passport", "driver_license",
            "identity_card" and "internal_passport".
        translation (List[:class:`telegram.FileCredentials`], optional): Credentials for an
            encrypted translation of the document. Available for "passport", "driver_license",
            "identity_card", "internal_passport", "utility_bill", "bank_statement",
            "rental_agreement", "passport_registration" and "temporary_registration".
        files (List[:class:`telegram.FileCredentials`], optional): Credentials for encrypted
            files. Available for "utility_bill", "bank_statement", "rental_agreement",
            "passport_registration" and "temporary_registration" types.

    Attributes:
        data (:class:`telegram.DataCredentials`): Optional. Credentials for encrypted Telegram
            Passport data. Available for "personal_details", "passport", "driver_license",
            "identity_card", "identity_passport" and "address" types.
        front_side (:class:`telegram.FileCredentials`): Optional. Credentials for encrypted
            document's front side. Available for "passport", "driver_license", "identity_card"
            and "internal_passport".
        reverse_side (:class:`telegram.FileCredentials`): Optional. Credentials for encrypted
            document's reverse side. Available for "driver_license" and "identity_card".
        selfie (:class:`telegram.FileCredentials`): Optional. Credentials for encrypted selfie
            of the user with a document. Can be available for "passport", "driver_license",
            "identity_card" and "internal_passport".
        translation (Tuple[:class:`telegram.FileCredentials`]): Optional. Credentials for an
            encrypted translation of the document. Available for "passport", "driver_license",
            "identity_card", "internal_passport", "utility_bill", "bank_statement",
            "rental_agreement", "passport_registration" and "temporary_registration".

            .. versionchanged:: 20.0
                |tupleclassattrs|

        files (Tuple[:class:`telegram.FileCredentials`]): Optional. Credentials for encrypted
            files. Available for "utility_bill", "bank_statement", "rental_agreement",
            "passport_registration" and "temporary_registration" types.

            .. versionchanged:: 20.0

                * |tupleclassattrs|
                * |alwaystuple|

    )r%   files
front_sidereverse_sideselfietranslationNr9   r%   DataCredentialsr|   FileCredentialsr}   r~   r{   r   r:   c                    t         |   |       || _        || _        || _        || _        t        |      | _        t        |      | _        | j                          y r<   )
r=   r>   r%   r|   r}   r~   r   r{   r   r@   )	rA   r%   r|   r}   r~   r{   r   r:   rB   s	           r,   r>   zSecureValue.__init__  sT     	J//3	5?7C172DU2K
8J;8Wr.   r`   r   rC   c                 :   | j                  |      }|syt        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        j                  |j                  d      |      |d<   t        | 	  ||	      S )
rb   Nr%   rc   r|   r}   r~   r{   r   rd   )re   r   rO   rf   r   de_listr=   rg   s      r,   rO   zSecureValue.de_json  s    
 t$&..txx/?S.IV,44TXXl5KQT4U\.66txx7OUX6Y^(00(1C0MX'//0As/KW-55dhh}6MSV5W]wDc22r.   )NNNNNNri   )rQ   rR   rS   rT   rU   r   r   r   r>   rj   rO   rY   rZ   s   @r,   rw   rw   x  s    5n YI -12648.27;=A *.() ./ 01	
 *+ !234 h'89: X&* >B3H%3,4UO3	-	 3 3r.   rw   c                   @     e Zd ZdZdZdddededee   f fdZ xZ	S )	_CredentialsBasez3Base class for DataCredentials and FileCredentials.)r+   	file_hashr$   r#   Nr9   r$   r#   r:   c                    t         |   |       | j                         5  || _        || _        | j                  | _        | j                  | _        d d d        y # 1 sw Y   y xY wr<   )r=   r>   	_unfrozenr$   r#   r   r+   )rA   r$   r#   r:   rB   s       r,   r>   z_CredentialsBase.__init__  sZ     	J/^^ 	,!DI%DK #'))DN"&))DN	, 	, 	,s   1AA%
rQ   rR   rS   rT   rU   rV   r   r   r>   rY   rZ   s   @r,   r   r     s;    =<I *.,, ,
 X&, ,r.   r   c                   @     e Zd ZdZdZdddededee   f fdZ xZ	S )	r   al  
    These credentials can be used to decrypt encrypted data from the data field in
    EncryptedPassportData.

    Args:
        data_hash (:obj:`str`): Checksum of encrypted data
        secret (:obj:`str`): Secret of encrypted data

    Attributes:
        hash (:obj:`str`): Checksum of encrypted data
        secret (:obj:`str`): Secret of encrypted data
     Nr9   r+   r#   r:   c                J    t         |   |||       | j                          y N)r$   r#   r:   r=   r>   r@   )rA   r+   r#   r:   rB   s       r,   r>   zDataCredentials.__init__       i:Nr.   r   rZ   s   @r,   r   r     6     IX\ # s 8HCU  r.   r   c                   @     e Zd ZdZdZdddededee   f fdZ xZ	S )	r   a  
    These credentials can be used to decrypt encrypted files from the front_side,
    reverse_side, selfie and files fields in EncryptedPassportData.

    Args:
        file_hash (:obj:`str`): Checksum of encrypted file
        secret (:obj:`str`): Secret of encrypted file

    Attributes:
        hash (:obj:`str`): Checksum of encrypted file
        secret (:obj:`str`): Secret of encrypted file
    r   Nr9   r   r#   r:   c                J    t         |   |||       | j                          y r   r   )rA   r   r#   r:   rB   s       r,   r>   zFileCredentials.__init__  r   r.   r   rZ   s   @r,   r   r     r   r.   r   )0r0   base64r   typingr   r   r   r   r   cryptography.hazmat.backendsr	   1cryptography.hazmat.primitives.asymmetric.paddingr
   r   &cryptography.hazmat.primitives.ciphersr   1cryptography.hazmat.primitives.ciphers.algorithmsr   ,cryptography.hazmat.primitives.ciphers.modesr   %cryptography.hazmat.primitives.hashesr   r   r   r   r   ImportErrortelegram._telegramobjectr   telegram._utils.argumentparsingr   telegram._utils.stringsr   telegram._utils.typesr   telegram.errorr   telegramr   r-   r4   r6   rN   r^   rw   r   r   r   r   r.   r,   <module>r      s  (   J J<L=E@PP 4 > 0 * 2 - -` N N
h$> h$V#3. #3L{3 {3|`3. `3F,~ ,,& *& K  O#A D$S!9D&&$s   .C C'&C'