U
    gN                     @   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   7/tmp/pip-unpacked-wheel-_q8s9isk/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rnddlm} ddl	m
} |}	|}
n|tkrddlm} ddl	m} |}	|}
d|d< nd|tkrddlm} ddl	m
} |}	|}
n:|tkrd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|}||}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@   Zeffective_keylen)SHA1zUnknown OID for PBES1   Znr_elements   N   )r   decoder   payloadr   value_OID_PBE_WITH_MD5_AND_DES_CBCZCryptodome.Hashr   Cryptodome.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_infoZencrypted_algorithmencrypted_datapbe_oidZcipher_paramsr   r   Zhashmodmoduler   r   Z
pbe_paramssaltZ
iterationsZ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 )PBES2zEncryption scheme with password-based key derivation
    (defined in `PKCS#5 v2.0`__).

    .. __: http://www.ietf.org/rfc/rfc2898.txt.Nc           !      C   s  |dkri }|dkrt  j}td}||}|dkrFtd| |drjd}|d}|d}	nd}|d}	d	}
|	d
krddl	m
} d}|}|j}t}d|di}n|	dkrd}t}tj}t}d|di}n|	dkrd}t}tj}t}d|di}n|	dkr.d}t}tj}t}d|di}n|	dkr\d}t}tj}t}d|di}d}
nh|	dkrd}t}tj}t}d|di}d}
n:|	dkrd}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r~ztjjd!|d"j}W n tk
rh   td#Y nX | tt!|g tt!t"|g}n|dkr|dd$}|d%d}|d&d'}t#||||||}tt!t$tt|t|t|t|gg}ntd(|d' |j||f|}|
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 ``Cryptodome.Random``.

        :Returns:
          The encrypted data, as a binary string.
        Nz5^(PBKDF2WithHMAC-([0-9A-Z-]+)|scrypt)And([0-9A-Z-]+)$zUnknown protection %sZPBKDFZpbkdf2r      r   FzDES-EDE3-CBCr   DES3   r3   r   z
AES128-CBCr   z
AES192-CBCz
AES256-CBC    z
AES128-GCMnonce   Tz
AES192-GCMz
AES256-GCMzUnknown encryption mode '%s'Z	salt_sizeiteration_counti  hmac_hash_moduler       )	digestmodzNo OID for HMAC hash algorithmi @  r*   Zparallelizationr   zUnknown KDF )+r   r'   readrecompilematch
ValueError
startswithgroupr#   r;   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_SCRYPTZencrypt_and_digestencryptr	   r*   
_OID_PBES2encode)!r+   r,   Z
protectionZprot_paramsZrandfuncpatternresZpbkdfZpbkdf2_hmac_algoenc_algoaeadr;   key_sizer0   cipher_modeenc_oidZ	enc_paramiv_noncer1   countrD   r2   pbkdf2_paramsZhmac_oidkdf_infoscrypt_rscrypt_pr4   cttagr.   enc_infor-   r   r   r   r]      s    /














  
zPBES2.encryptc           #         s  t  j| dd}t  |d }t |d j}t |d j}|tkrTtdt  j|d dd}t  j|d dd}t |d j}d}	|tkrNt  j|d dd}
t |
d j}|
d }t	|
d }d}|dkrz |
| d }	|d8 }|d7 }W n t
k
r   Y nX t}|dkrt  |
| }t |d j}nn|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}d}|tkrddlm} |}|j}d}d}n|tkr*t}tj}d}d}n|tkrHt}tj}d}d}n|tkrft}tj}d}d}nr|tkrt}tj}d}d}d}nP|tkrt}tj}d}d}d}n.|tkrt}tj}d}d}d}ntd| |	r|	|krtdt |d j}|tkr^ztjj| }W n" tk
r>   td| Y nX t|}t|||||d}nt||||||}|j||f||i}t	||j k rt!d|r|j } |"|d|   ||  d }!n|#|}"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   r9      )rp      c                    s   g | ]} | qS r   r   ).0xZscrypt_paramsr   r   
<listcomp>  s   z!PBES2.decrypt.<locals>.<listcomp>)r   r   r9   rp   zUnsupported PBES2 KDFFr:   r<   r3   r   r=   r>   TzUnsupported PBES2 cipher z9Mismatch between PBES2 KDF parameters and selected cipherzUnsupported HMAC %srA   zToo little data to decrypt)%r   r   r   r    r   r!   r^   r   r[   len	TypeError_OID_HMAC_SHA1r\   rL   r#   r;   r(   rM   r   rN   rO   rQ   rP   rR   rS   r   rW   Z_hmac2hash_oidrY   r'   r   r   r*   rI   Zdecrypt_and_verifyr)   r
   )#r+   r,   r-   rb   r.   r/   Zpbes2_paramsrj   Zkdf_oidZkdf_key_lengthri   r1   r@   leftidxZpbkdf2_prf_oidZpbkdf2_prf_algo_idrk   rl   ro   rf   rc   r;   r0   re   rd   Zcipher_paramrg   Zhmac_hash_module_oidrB   r2   r4   Ztag_lenr5   Z	pt_paddedr   rt   r   r)     s    
















 
zPBES2.decrypt)NN)r   r   r   r6   r7   r]   r)   r   r   r   r   r8      s    Br8   )&rF   Z
Cryptodomer   r   ZCryptodome.Util.asn1r   r   r   r   r#   r   ZCryptodome.Util.Paddingr	   r
   ZCryptodome.Protocol.KDFr   r   r   r"   r$   r%   r&   r^   r[   r\   rx   rL   rM   rN   rO   rQ   rR   rS   rI   r   objectr   r8   r   r   r   r   <module>"   s0   :E