o
    ZzjšX  ã                   @   s¦  d dl Z d dlmZ d dlmZ d dl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mZ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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.ƒZ0dS )'é    N)Ú	b64decode)ÚSequence)ÚTYPE_CHECKINGÚno_type_check)Údefault_backend)ÚMGF1ÚOAEP)ÚCipher)ÚAES)ÚCBC)ÚSHA1ÚSHA256ÚSHA512ÚHashT)NNNNN)NNNNF)ÚTelegramObject)Úde_json_optionalÚde_list_optionalÚ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*   úY/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telegram/_passport/credentials.pyÚdecrypt3   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_jsond   s   r1   c                
       s`   e Zd ZdZdZddœdededededB 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   r9   ÚpropertyÚbytesrG   rJ   Ú__classcell__r*   r*   r=   r+   r2   j   s"    úþýüúr2   c                       s\   e Zd ZdZdZddœdddededB f‡ fd	d
„Zeddeddd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#   Úbotú
Bot | Noner?   c                    s0   |   |¡}t| d¡t|ƒ|d< tƒ j||d�S )ú,See :meth:`telegram.TelegramObject.de_json`.rU   ©r#   rW   )Ú_parse_datar   ÚgetrV   r8   rI   ©Úclsr#   rW   r=   r*   r+   rI   ì   s   
zCredentials.de_json©N)rK   rL   rM   rN   rO   rP   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dddddd	dd
ddddddddddddddedB f‡ fdd„Zeddeddd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   zSecureValue | Nonerf   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   6  s   zSecureData.__init__r#   rW   rX   r?   c                    s  |   |¡}t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d	¡t|ƒ|d	< t| d
¡t|ƒ|d
< t| d¡t|ƒ|d< tƒ j||d�S )rY   rj   rg   ri   rb   rk   ra   rd   rc   re   rf   rh   rZ   )r[   r   r\   ÚSecureValuer8   rI   r]   r=   r*   r+   rI   W  s&   
ÿÿÿzSecureData.de_json)NNNNNNNNNNNr_   )
rK   rL   rM   rN   rO   r   r9   r`   rI   rS   r*   r*   r=   r+   rV   ö   sV    1ôòþýüûúùø	÷
öõôò!&rV   c                       sŠ   e Zd ZdZdZ						dddœddddd	dd
dded dB ded dB dedB f‡ fdd„Zeddeddd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#   zDataCredentials | Nonern   zFileCredentials | Nonero   rp   rm   ÚFileCredentialsrq   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   rX   r?   c                    sž   |   |¡}t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< t| d¡t|ƒ|d< tƒ j||d�S )rY   r#   rn   ro   rp   rm   rq   rZ   )r[   r   r\   ÚDataCredentialsrr   r   r8   rI   r]   r=   r*   r+   rI   À  s   
zSecureValue.de_json)NNNNNNr_   )rK   rL   rM   rN   rO   r   r   r9   r`   rI   rS   r*   r*   r=   r+   rl   q  s8    7ù	÷þýüû
ú
ù	÷&rl   c                       ó<   e Zd ZdZdZddœdedededB 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!   rv   r)   )r<   r"   r!   r6   r=   r*   r+   r9   Ô  s   

"úz_CredentialsBase.__init__©	rK   rL   rM   rN   rO   rP   r   r9   rS   r*   r*   r=   r+   ru   Ï  s    ûþýûru   c                       rt   )
rs   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__rx   r*   r*   r=   r+   rs   å  ó    ,rs   c                       rt   )
rr   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   rv   r!   r6   c                   ry   rz   r{   )r<   rv   r!   r6   r=   r*   r+   r9   
  r|   zFileCredentials.__init__rx   r*   r*   r=   r+   rr   ú  r}   rr   )1r-   Úbase64r   Úcollections.abcr   Útypingr   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   r   r   Útelegram._utils.stringsr   Útelegram._utils.typesr   Útelegram.errorr   Útelegramr   r,   r1   r2   rH   rV   rl   ru   rs   rr   r*   r*   r*   r+   Ú<module>   sH   û
0
k!{^