o
    5ÎhÛM  ã                   @   sØ   d dl Z d dl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mZ d dlmZmZmZ dZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZ G dd„ de!ƒZ"G dd„ de#ƒZ$G dd„ de#ƒZ%dS )é    N)ÚHash)ÚRandom)ÚDerSequenceÚDerOctetStringÚDerObjectIdÚ
DerInteger)ÚAES)ÚpadÚunpad)ÚPBKDF1ÚPBKDF2Úscryptz1.2.840.113549.1.5.3z1.2.840.113549.1.5.6z1.2.840.113549.1.5.10z1.2.840.113549.1.5.11z1.2.840.113549.1.5.13z1.2.840.113549.1.5.12z1.3.6.1.4.1.11591.4.11z1.2.840.113549.2.7z1.2.840.113549.3.7z2.16.840.1.101.3.4.1.2z2.16.840.1.101.3.4.1.22z2.16.840.1.101.3.4.1.42z2.16.840.1.101.3.4.1.6z2.16.840.1.101.3.4.1.26z2.16.840.1.101.3.4.1.46c                   @   s   e Zd ZdS )Ú	PbesErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úc/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/Crypto/IO/_PBES.pyr   C   s    r   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚPBES1z¼Deprecated encryption scheme with password-based key derivation
    (originally defined in PKCS#5 v1.5, but still present in `v2.0`__).

    .. __: http://www.ietf.org/rfc/rfc2898.txt
    c                 C   sŠ  t ƒ  | ¡}t ƒ  |d ¡}tƒ  |d ¡j}tƒ  |d ¡j}i }|tkr7ddlm} ddl	m
} |}	|}
nK|tkrPddlm} ddl	m} |}	|}
d|d< n2|tkreddlm} ddl	m
} |}	|}
n|tkr~ddlm} ddl	m} |}	|}
d|d< ntd	ƒ‚t ƒ j|d d
d}tƒ  |d ¡j}|d }t||d||	ƒ}|dd… |dd… }}|
j||
j|fi |¤Ž}| |¡}t||jƒS )ax  Decrypt a piece of data using a passphrase and *PBES1*.

        The algorithm to use is automatically detected.

        :Parameters:
          data : byte string
            The piece of data to decrypt.
          passphrase : byte string
            The passphrase to use for decrypting the data.
        :Returns:
          The decrypted data, as a binary string.
        r   é   )ÚMD5)ÚDES)ÚARC2é@   Úeffective_keylen)ÚSHA1zUnknown OID for PBES1é   ©Únr_elementsé   Né   )r   Údecoder   Úpayloadr   ÚvalueÚ_OID_PBE_WITH_MD5_AND_DES_CBCÚCrypto.Hashr   ÚCrypto.Cipherr   Ú_OID_PBE_WITH_MD5_AND_RC2_CBCr   Ú_OID_PBE_WITH_SHA1_AND_DES_CBCr   Ú_OID_PBE_WITH_SHA1_AND_RC2_CBCr   r   ÚnewÚMODE_CBCÚdecryptr
   Ú
block_size)ÚdataÚ
passphraseÚenc_private_key_infoÚencrypted_algorithmÚencrypted_dataÚpbe_oidÚcipher_paramsr   r   ÚhashmodÚmoduler   r   Ú
pbe_paramsÚsaltÚ
iterationsÚkey_ivÚkeyÚivÚcipherÚptr   r   r   r,   „   sH   


zPBES1.decryptN)r   r   r   Ú__doc__Ústaticmethodr,   r   r   r   r   r   }   s    r   c                   @   s*   e Zd ZdZeddd„ƒZedd„ ƒZdS )ÚPBES2z‡Encryption scheme with password-based key derivation
    (defined in `PKCS#5 v2.0`__).

    .. __: http://www.ietf.org/rfc/rfc2898.txt.Nc           !      C   s‚  |du ri }|du rt  ¡ j}t d¡}| |¡}|du r#td| ƒ‚| d¡r5d}| d¡}| d¡}	nd}| d¡}	d	}
|	d
krXddl	m
} d}|}|j}t}d|dƒi}n„|	dkrld}t}tj}t}d|dƒi}np|	dkr€d}t}tj}t}d|dƒi}n\|	dkr”d}t}tj}t}d|dƒi}nH|	dkrªd}t}tj}t}d|dƒi}d}
n2|	dkrÀd}t}tj}t}d|dƒi}d}
n|	dkrÖd}t}tj}t}d|dƒi}d}
ntd|	 ƒ‚t| ¡ ƒd }|| dd¡ƒ}|dkr?| dd¡}t |¡}t|||||d}tt|ƒt|ƒgƒ}|d kr6ztjjd!|d"j}W n ty+   td#ƒ‚w |  tt!|ƒgƒ¡ tt!t"ƒ|gƒ}n@|dkrv| dd$¡}| d%d¡}| d&d'¡}t#||||||ƒ}tt!t$ƒtt|ƒt|ƒt|ƒt|ƒgƒgƒ}n	td(| d'¡ ƒ‚|j||fi |¤Ž}|
r˜| %| ¡\}}|| }n	| &t'| |j(ƒ¡}tt!|ƒt|ƒgƒ}ttt!t)ƒt||gƒgƒt|ƒgƒ} |  *¡ S ))a¦	  Encrypt a piece of data using a passphrase and *PBES2*.

        :Parameters:
          data : byte string
            The piece of data to encrypt.
          passphrase : byte string
            The passphrase to use for encrypting the data.
          protection : string
            The identifier of the encryption algorithm to use.
            The default value is '``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``'.
          prot_params : dictionary
            Parameters of the protection algorithm.

            +------------------+-----------------------------------------------+
            | Key              | Description                                   |
            +==================+===============================================+
            | iteration_count  | The KDF algorithm is repeated several times to|
            |                  | slow down brute force attacks on passwords    |
            |                  | (called *N* or CPU/memory cost in scrypt).    |
            |                  |                                               |
            |                  | The default value for PBKDF2 is 1 000.        |
            |                  | The default value for scrypt is 16 384.       |
            +------------------+-----------------------------------------------+
            | salt_size        | Salt is used to thwart dictionary and rainbow |
            |                  | attacks on passwords. The default value is 8  |
            |                  | bytes.                                        |
            +------------------+-----------------------------------------------+
            | block_size       | *(scrypt only)* Memory-cost (r). The default  |
            |                  | value is 8.                                   |
            +------------------+-----------------------------------------------+
            | parallelization  | *(scrypt only)* CPU-cost (p). The default     |
            |                  | value is 1.                                   |
            +------------------+-----------------------------------------------+


          randfunc : callable
            Random number generation function; it should accept
            a single integer N and return a string of random data,
            N bytes long. If not specified, a new RNG will be
            instantiated from ``Crypto.Random``.

        :Returns:
          The encrypted data, as a binary string.
        Nz5^(PBKDF2WithHMAC-([0-9A-Z-]+)|scrypt)And([0-9A-Z-]+)$zUnknown protection %sÚPBKDFÚpbkdf2r   é   r   FzDES-EDE3-CBCr   ©ÚDES3é   r<   r    z
AES128-CBCr   z
AES192-CBCz
AES256-CBCé    z
AES128-GCMÚnonceé   Tz
AES192-GCMz
AES256-GCMzUnknown encryption mode '%s'Ú	salt_sizeÚiteration_countiè  ©Úhmac_hash_moduler   ó    )Ú	digestmodzNo OID for HMAC hash algorithmi @  r-   Úparallelizationr   zUnknown KDF )+r   r*   ÚreadÚreÚcompileÚmatchÚ
ValueErrorÚ
startswithÚgroupr&   rF   r+   Ú_OID_DES_EDE3_CBCr   Ú_OID_AES128_CBCÚ_OID_AES192_CBCÚ_OID_AES256_CBCÚMODE_GCMÚ_OID_AES128_GCMÚ_OID_AES192_GCMÚ_OID_AES256_GCMÚlistÚvaluesÚgetr   r   r   r   r   ÚHMACÚoidÚKeyErrorÚappendr   Ú_OID_PBKDF2r   Ú_OID_SCRYPTÚencrypt_and_digestÚencryptr	   r-   Ú
_OID_PBES2Úencode)!r.   r/   Ú
protectionÚprot_paramsÚrandfuncÚpatternÚresÚpbkdfÚpbkdf2_hmac_algoÚenc_algoÚaeadrF   Úkey_sizer6   Úcipher_modeÚenc_oidÚ	enc_paramÚiv_noncer8   ÚcountrP   r;   Úpbkdf2_paramsÚhmac_oidÚkdf_infoÚscrypt_rÚscrypt_pr=   ÚctÚtagr2   Úenc_infor0   r   r   r   rk   È   sú   /







üþ
ÿþ
ÿüþ
þþþ÷zPBES2.encryptc           #         sÔ  t ƒ j| dd}t ƒ  |d ¡}tƒ  |d ¡j}tƒ  |d ¡j}|tkr*tdƒ‚t ƒ j|d dd}t ƒ j|d dd}tƒ  |d ¡j}d}	|tkr¢t ƒ j|d dd}
tƒ  |
d ¡j}|
d }t	|
ƒd }d}|dkrŠz|
| d }	|d8 }|d7 }W n	 t
y‰   Y nw t}|dkr¡t ƒ  |
| ¡}tƒ  |d ¡j}n5|tkrÓt ƒ j|d dd‰ tƒ  ˆ d ¡j}‡ fd	d
„dD ƒ\}}}t	ˆ ƒdkrÐˆ d }	nd}	ntdƒ‚t ƒ  |d ¡}tƒ  |d ¡j}d}|tkrþddlm} |}|j}d}d}nf|tkrt}tj}d}d}nW|tkrt}tj}d}d}nH|tkr+t}tj}d}d}n9|tkr<t}tj}d}d}d}n(|tkrMt}tj}d}d}d}n|tkr^t}tj}d}d}d}ntd| ƒ‚|	rp|	|krptdƒ‚tƒ  |d ¡j}|tkr¤ztjj| }W n ty”   td| ƒ‚w t |¡}t|||||d}n	t||||||ƒ}|j||fi ||i¤Ž}t	|ƒ|j k rÅt!dƒ‚|rÝ|j } | "|d|  … ||  d… ¡}!|!S | #|¡}"t$|"|j ƒ}!|!S )ax  Decrypt a piece of data using a passphrase and *PBES2*.

        The algorithm to use is automatically detected.

        :Parameters:
          data : byte string
            The piece of data to decrypt.
          passphrase : byte string
            The passphrase to use for decrypting the data.
        :Returns:
          The decrypted data, as a binary string.
        r   r   r   r   zNot a PBES2 objectN)r   rD   é   )r…   é   c                    s   g | ]}ˆ | ‘qS r   r   )Ú.0Úx©Úscrypt_paramsr   r   Ú
<listcomp>Ç  s    ÿz!PBES2.decrypt.<locals>.<listcomp>)r   r   rD   r…   zUnsupported PBES2 KDFFrE   rG   r<   r   rH   rI   TzUnsupported PBES2 cipher z9Mismatch between PBES2 KDF parameters and selected cipherzUnsupported HMAC %srM   zToo little data to decrypt)%r   r!   r   r"   r   r#   rl   r   rh   ÚlenÚ	TypeErrorÚ_OID_HMAC_SHA1ri   rY   r&   rF   r+   rZ   r   r[   r\   r^   r]   r_   r`   r   rd   Ú_hmac2hash_oidrf   r*   r   r   r-   rV   Údecrypt_and_verifyr,   r
   )#r.   r/   r0   ru   r2   r3   Úpbes2_paramsr   Úkdf_oidÚkdf_key_lengthr}   r8   rL   ÚleftÚidxÚpbkdf2_prf_oidÚpbkdf2_prf_algo_idr€   r   r„   ry   rv   rF   r6   rx   rw   Úcipher_paramr{   Úhmac_hash_module_oidrN   r;   r=   Útag_lenr>   Ú	pt_paddedr   r‰   r   r,   Š  sÜ   þ€
ÿ







ÿ

ÿ
ÿÿ
ýzPBES2.decrypt)NN)r   r   r   r?   r@   rk   r,   r   r   r   r   rA   Â   s     BrA   )&rS   ÚCryptor   r   ÚCrypto.Util.asn1r   r   r   r   r&   r   ÚCrypto.Util.Paddingr	   r
   ÚCrypto.Protocol.KDFr   r   r   r$   r'   r(   r)   rl   rh   ri   rŽ   rY   rZ   r[   r\   r^   r_   r`   rV   r   Úobjectr   rA   r   r   r   r   Ú<module>   s2   !:E