o
    e?                     @   s   d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
mZmZmZmZmZmZ d dlmZmZ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(dZ)G dd de*Z+G dd de,Z-G dd de,Z.dS )    )Random)DerSequenceDerOctetStringDerObjectId
DerInteger)padunpad)MD5SHA1SHA224SHA256SHA384SHA512)DESARC2DES3AES)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.111.2.840.113549.2.7z1.2.840.113549.2.8z1.2.840.113549.2.9z1.2.840.113549.2.10z1.2.840.113549.2.11z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.42c                   @   s   e Zd ZdS )	PbesErrorN)__name__
__module____qualname__ r   r   5/usr/lib/python3/dist-packages/Cryptodome/IO/_PBES.pyr   C   s    r   c                   @   s   e Zd ZdZedd ZdS )PBES1zDeprecated 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r+t}t}n'|t	kr8t}t
}d|d< n|tkrAt}t}n|tkrNt}t
}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      @   effective_keylenzUnknown OID for PBES1   nr_elements   N   )r   decoder   payloadr   value_OID_PBE_WITH_MD5_AND_DES_CBCr	   r   _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_paramshashmod	ciphermod
pbe_paramssalt
iterationskey_ivkeyivcipherptr   r   r   r/   y   s8   


zPBES1.decryptN)r   r   r   __doc__staticmethodr/   r   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 )PBES2zEncryption 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}|dkrd}t}tj}t}n.|dv r+d}t}tj}t}n |dv r9d}t}tj}t}n|dv rGd}t}tj}t	}nt
d	||j}	||d
d}
|dr{|dd}t||
||}ttttt|
t|gg}n1|dd}|dd}|dd}t||
||||}ttttt|
t|t|t|gg}||||	}|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 ``Cryptodome.Random``.

        :Returns:
          The encrypted data, as a binary string.
        Nz"PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC   )z PBKDF2WithHMAC-SHA1AndAES128-CBCzscryptAndAES128-CBCr$   )z PBKDF2WithHMAC-SHA1AndAES192-CBCzscryptAndAES192-CBC)z PBKDF2WithHMAC-SHA1AndAES256-CBCzscryptAndAES256-CBC    zUnknown PBES2 mode	salt_sizer%   r   iteration_counti  i @  r0   parallelizationr   )r   r-   readr   r.   _OID_DES_EDE3_CBCr   _OID_AES128_CBC_OID_AES192_CBC_OID_AES256_CBC
ValueErrorr0   get
startswithr   r   r   _OID_PBKDF2r   r   r   _OID_SCRYPTencryptr   
_OID_PBES2encode)r1   r2   
protectionprot_paramsrandfunckey_sizemodulecipher_modeenc_oidr?   r;   countr>   kdf_infoscrypt_rscrypt_pr@   r5   enc_infor3   r   r   r   rT      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rt  j|d dd}
t |
d j}|
d }t	|
d }d}|dkrz|
| d }	|d8 }|d7 }W n	 t
y   Y nw d}|dkrt  |
| }t |d j}n5|tkrt  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}|tkrt}d}n!|tkrt}d}n|tkrt}d}n|tkrt}d}ntd|	r|	|krtdt |d j}|tkrd|tkr4t}n&|tkr<t}n|tkrDt}n|tkrLt}n|tkrTt}ntd| t|||||d}n	t||||||}|||j|}| |}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!         r   )rd      c                    s   g | ]} | qS r   r   ).0xscrypt_paramsr   r   
<listcomp>u  s    z!PBES2.decrypt.<locals>.<listcomp>)r   r!   rc   rd   zUnsupported PBES2 KDFrE   r$   rF   zUnsupported PBES2 cipherz9Mismatch between PBES2 KDF parameters and selected cipherzUnsupported HMAC %s)hmac_hash_module)#r   r&   r   r'   r   r(   rU   r   rR   len	TypeErrorrS   rK   r   rL   r   rM   rN   _OID_HMAC_SHA1r
   _OID_HMAC_SHA224r   _OID_HMAC_SHA256r   _OID_HMAC_SHA384r   _OID_HMAC_SHA512r   r   r   r-   r.   r/   r   r0   )r1   r2   r3   enc_algor5   r6   pbes2_paramsr_   kdf_oidkdf_key_lengthpbkdf2_paramsr;   rH   leftidxpbkdf2_prf_oidpbkdf2_prf_algo_idr`   ra   rb   r]   r9   rZ   IVrk   r>   r@   rA   r   rh   r   r/   :  s   












zPBES2.decrypt)NN)r   r   r   rB   rC   rT   r/   r   r   r   r   rD      s     rD   N)/
Cryptodomer   Cryptodome.Util.asn1r   r   r   r   Cryptodome.Util.Paddingr   r   Cryptodome.Hashr	   r
   r   r   r   r   Cryptodome.Cipherr   r   r   r   Cryptodome.Protocol.KDFr   r   r   r)   r*   r+   r,   rU   rR   rS   rn   ro   rp   rq   rr   rK   rL   rM   rN   rO   r   objectr   rD   r   r   r   r   <module>   s2   ! /=