U
    ñN…fÜ  ã                   @  st   d dl mZ d dl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 G dd	„ d	eƒZdS )
é    )ÚannotationsN)Úutils)ÚAlreadyFinalizedÚ
InvalidKeyÚUnsupportedAlgorithmÚ_Reasons)Úopenssl)Úconstant_timeÚhashes)ÚKeyDerivationFunctionc                   @  sF   e Zd Zdddddddœdd„Zddd	œd
d„Zddddœdd„ZdS )Ú
PBKDF2HMACNzhashes.HashAlgorithmÚintÚbytesz
typing.Any)Ú	algorithmÚlengthÚsaltÚ
iterationsÚbackendc                 C  sX   ddl m} | |¡s*td |j¡tjƒ‚d| _|| _	|| _
t d|¡ || _|| _d S )Nr   )r   z/{} is not supported for PBKDF2 by this backend.Fr   )Z,cryptography.hazmat.backends.openssl.backendr   Zpbkdf2_hmac_supportedr   ÚformatÚnamer   ZUNSUPPORTED_HASHÚ_usedÚ
_algorithmÚ_lengthr   Ú_check_bytesÚ_saltÚ_iterations)Úselfr   r   r   r   r   Zossl© r   úM/tmp/pip-unpacked-wheel-bjwtc2fy/cryptography/hazmat/primitives/kdf/pbkdf2.pyÚ__init__   s    
ÿüzPBKDF2HMAC.__init__)Úkey_materialÚreturnc                 C  s0   | j rtdƒ‚d| _ tj || j| j| j| j¡S )Nz'PBKDF2 instances can only be used once.T)	r   r   Úrust_opensslZkdfZderive_pbkdf2_hmacr   r   r   r   )r   r    r   r   r   Úderive0   s    ûzPBKDF2HMAC.deriveÚNone)r    Úexpected_keyr!   c                 C  s"   |   |¡}t ||¡stdƒ‚d S )NzKeys do not match.)r#   r	   Zbytes_eqr   )r   r    r%   Zderived_keyr   r   r   Úverify=   s    
zPBKDF2HMAC.verify)N)Ú__name__Ú
__module__Ú__qualname__r   r#   r&   r   r   r   r   r      s    úr   )Ú
__future__r   ÚtypingZcryptographyr   Zcryptography.exceptionsr   r   r   r   Z"cryptography.hazmat.bindings._rustr   r"   Zcryptography.hazmat.primitivesr	   r
   Z"cryptography.hazmat.primitives.kdfr   r   r   r   r   r   Ú<module>   s   