o
    /h|Y                     @   s  d dl Z d dlmZ d dlmZmZmZmZmZ z0d 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W n eyb   dZ
d\ZZZZZd\ZZZZdZY nw 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rd dl%m&Z& edd Z'edd Z(G dd deZ)G dd deZ*G dd deZ+G dd deZ,G d d! d!eZ-G d"d# d#e-Z.G d$d% d%e-Z/dS )&    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           
      C   s   t stdtt t d}|| |  | }|dd |dd }}tt|t	|t d}|
 }|||  }tt t d}|| | }	|	|k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_hash r*   W/var/www/html/govbot/env/lib/python3.10/site-packages/telegram/_passport/credentials.pydecrypt2   s"   
r,   c                 C   s   t t| ||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#   r*   r*   r+   decrypt_jsonc   s   r1   c                
       s`   e Zd ZdZdZdddedededee f fd	d
Ze	de
fddZe	dddZ  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!   r6   c                   sJ   t  j|d || _|| _|| _| j| j| jf| _d | _d | _|   d S Nr5   )	super__init__r#   r"   r!   	_id_attrsr4   r3   _freeze)selfr#   r"   r!   r6   	__class__r*   r+   r9      s   zEncryptedCredentials.__init__returnc              
   C   sv   | j du r8tstdz|  jt| jtt	t
 dt
 dd| _ W | j S  ty7 } zt||d}~ww | j S )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)mgfr@   label)r4   r   r   get_botprivate_keyr,   r   r!   r
   r	   r   
ValueErrorr   )r<   	exceptionr*   r*   r+   decrypted_secret   s    
	


z%EncryptedCredentials.decrypted_secretCredentialsc                 C   s8   | j du rtt| jt| jt| 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.
        N)	r3   rH   de_jsonr1   rG   r   r"   r#   rC   )r<   r*   r*   r+   decrypted_data   s   
z#EncryptedCredentials.decrypted_data)r?   rH   )__name__
__module____qualname____doc__	__slots__strr   r   r9   propertybytesrG   rJ   __classcell__r*   r*   r=   r+   r2   i   s"    r2   c                	       sj   e Zd ZdZdZdddddedee f fd	d
Ze		ddee ded ded  f fddZ
  ZS )rH   z
    Attributes:
        secure_data (:class:`telegram.SecureData`): Credentials for encrypted data
        nonce (:obj:`str`): Bot-specified nonce
    )noncesecure_dataNr5   rU   
SecureDatarT   r6   c                   s&   t  j|d || _|| _|   d S r7   )r8   r9   rU   rT   r;   )r<   rU   rT   r6   r=   r*   r+   r9      s   zCredentials.__init__r#   botr   r?   c                    s:   |  |}|s	dS tj|d|d|d< t j||dS ),See :meth:`telegram.TelegramObject.de_json`.NrU   rW   r#   rW   )_parse_datarV   rI   getr8   clsr#   rW   r=   r*   r+   rI      s
   
zCredentials.de_jsonN)rK   rL   rM   rN   rO   rP   r   r   r9   classmethodrI   rS   r*   r*   r=   r+   rH      s(    rH   c                       s   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dZe	ddee ded ded  f fddZ	  Z
S )rV   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_billNr5   rh   SecureValuerf   re   rc   rd   ra   rk   rb   ri   rg   rj   r6   c                   s\   t  j|d || _|
| _|	| _|| _|| _|| _|| _|| _	|| _
|| _|| _|   d S r7   )r8   r9   rj   rg   ri   rb   rk   ra   rd   rc   re   rf   rh   r;   )r<   rh   rf   re   rc   rd   ra   rk   rb   ri   rg   rj   r6   r=   r*   r+   r9   :  s   zSecureData.__init__r#   rW   r   r?   c                    s*  |  |}|s	dS tj|d|d|d< tj|d|d|d< tj|d|d|d< tj|d|d|d< tj|d|d|d< tj|d|d|d< tj|d	|d|d	< tj|d
|d|d
< tj|d|d|d< tj|d|d|d< tj|d|d|d< t j||dS )rX   Nrj   rY   rg   ri   rb   rk   ra   rd   rc   re   rf   rh   rZ   )r[   rl   rI   r\   r8   r]   r=   r*   r+   rI   [  s&   




zSecureData.de_json)NNNNNNNNNNNr_   )rK   rL   rM   rN   rO   r   r   r9   r`   rI   rS   r*   r*   r=   r+   rV      sd    1	
!rV   c                       s   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dZe		ddee ded ded  f fddZ
  ZS )rl   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translationNr5   r#   DataCredentialsrn   FileCredentialsro   rp   rm   rq   r6   c                   sF   t  j|d || _|| _|| _|| _t|| _t|| _| 	  d S r7   )
r8   r9   r#   rn   ro   rp   r   rm   rq   r;   )r<   r#   rn   ro   rp   rm   rq   r6   r=   r*   r+   r9     s   

zSecureValue.__init__rW   r   r?   c                    s   |  |}|s	dS tj|d|d|d< tj|d|d|d< tj|d|d|d< tj|d|d|d< tj|d|d|d< tj|d|d|d< t j||d	S )
rX   Nr#   rY   rn   ro   rp   rm   rq   rZ   )r[   rr   rI   r\   rs   de_listr8   r]   r=   r*   r+   rI     s   
zSecureValue.de_json)NNNNNNr_   )rK   rL   rM   rN   rO   r   r   r   r9   r`   rI   rS   r*   r*   r=   r+   rl   x  sF    7	

	rl   c                       <   e Zd ZdZdZdddededee f fdd	Z  Z	S )
_CredentialsBasez3Base class for DataCredentials and FileCredentials.)r)   	file_hashr"   r!   Nr5   r"   r!   r6   c                   sX   t  j|d |   || _|| _| j| _| j| _W d    d S 1 s%w   Y  d S r7   )r8   r9   	_unfrozenr"   r!   rw   r)   )r<   r"   r!   r6   r=   r*   r+   r9     s   

"z_CredentialsBase.__init__
rK   rL   rM   rN   rO   rP   r   r   r9   rS   r*   r*   r=   r+   rv     s    rv   c                       ru   )
rr   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
    r*   Nr5   r)   r!   r6   c                      t  j|||d |   d S N)r"   r!   r6   r8   r9   r;   )r<   r)   r!   r6   r=   r*   r+   r9        zDataCredentials.__init__ry   r*   r*   r=   r+   rr         ,rr   c                       ru   )
rs   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*   Nr5   rw   r!   r6   c                   rz   r{   r|   )r<   rw   r!   r6   r=   r*   r+   r9     r}   zFileCredentials.__init__ry   r*   r*   r=   r+   rs     r~   rs   )0r-   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,   r1   r2   rH   rV   rl   rv   rr   rs   r*   r*   r*   r+   <module>   sF   
0
k&~c