U
    ;g                     @   s   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dlmZ ddlmZmZmZ d	d
dgZedk rddlmZ ndd	 Zde_dd
 ZdS )    )unicode_literalsdivisionabsolute_importprint_function   )pretty_message)buffer_from_bytesbytes_from_buffer   )	libcryptolibcrypto_version_infohandle_openssl_error)
rand_bytes)	type_namebyte_cls	int_typespbkdf2
pkcs12_kdfr   )r
   )r   c              
   C   s  t |tsttdt|t |ts8ttdt|t |tsTttdt||dk rdtdt |tsttdt||dk rtd| tdd	d
ddgkrttdt| t	j
t	jt	jt	jt	jd|   }t|}t	|t||t|||||}t| t|S )a  
        PBKDF2 from PKCS#5

        :param hash_algorithm:
            The string name of the hash algorithm to use: "sha1", "sha224", "sha256", "sha384", "sha512"

        :param password:
            A byte string of the password to use an input to the KDF

        :param salt:
            A cryptographic random byte string

        :param iterations:
            The numbers of iterations to use when deriving the key

        :param key_length:
            The length of the desired key in bytes

        :raises:
            ValueError - when any of the parameters contain an invalid value
            TypeError - when any of the parameters are of the wrong type

        :return:
            The derived key as a byte string
        zH
                password must be a byte string, not %s
                zD
                salt must be a byte string, not %s
                zG
                iterations must be an integer, not %s
                r
   z!iterations must be greater than 0zG
                key_length must be an integer, not %s
                z!key_length must be greater than 0sha1sha224sha256sha384sha512z
                hash_algorithm must be one of "sha1", "sha224", "sha256", "sha384",
                "sha512", not %s
                )r   r   r   r   r   )
isinstancer   	TypeErrorr   r   r   
ValueErrorsetreprr   EVP_sha1
EVP_sha224
EVP_sha256
EVP_sha384
EVP_sha512r   ZPKCS5_PBKDF2_HMAClenr   r	   )hash_algorithmpasswordsalt
iterations
key_lengthevp_mdoutput_bufferresult r,   :/tmp/pip-unpacked-wheel-x1gypflw/oscrypto/_openssl/util.pyr      sd    



	
Fc           
      C   sd  t |tsttdt|t |ts8ttdt|t |tsTttdt||dk rnttdt|t |tsttdt||dk rttdt|| tdd	d
dddgkrttdt| |tdddgkrttdt||	d
dd }tjtjtjtjtjtjd|   }t|}t|t||t||||||	}	t|	 t|S )a0  
    KDF from RFC7292 appendix B.2 - https://tools.ietf.org/html/rfc7292#page-19

    :param hash_algorithm:
        The string name of the hash algorithm to use: "md5", "sha1", "sha224", "sha256", "sha384", "sha512"

    :param password:
        A byte string of the password to use an input to the KDF

    :param salt:
        A cryptographic random byte string

    :param iterations:
        The numbers of iterations to use when deriving the key

    :param key_length:
        The length of the desired key in bytes

    :param id_:
        The ID of the usage - 1 for key, 2 for iv, 3 for mac

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type

    :return:
        The derived key as a byte string
    z@
            password must be a byte string, not %s
            z<
            salt must be a byte string, not %s
            z?
            iterations must be an integer, not %s
            r
   zC
            iterations must be greater than 0 - is %s
            z?
            key_length must be an integer, not %s
            zC
            key_length must be greater than 0 - is %s
            md5r   r   r   r   r   z
            hash_algorithm must be one of "md5", "sha1", "sha224", "sha256",
            "sha384", "sha512", not %s
            r      z<
            id_ must be one of 1, 2, 3, not %s
            zutf-8zutf-16bes     )r.   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   decodeencoder   ZEVP_md5r   r   r    r!   r"   r   ZPKCS12_key_gen_unir#   r   r	   )
r$   r%   r&   r'   r(   Zid_Zutf16_passwordZdigest_typer*   r+   r,   r,   r-   r   {   s    



	N)
__future__r   r   r   r   _errorsr   _ffir   r	   Z
_libcryptor   r   r   Z_randr   _typesr   r   r   __all__Z_pkcs5r   Zpure_pythonr   r,   r,   r,   r-   <module>   s   a