U
    
;g                     @  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|j dtjd| _|| _|| _	t
d| || _|| _d S )Nr   )r   z is not supported for PBKDF2.Fr   )Z,cryptography.hazmat.backends.openssl.backendr   Zpbkdf2_hmac_supportedr   namer   ZUNSUPPORTED_HASH_used
_algorithm_lengthr   _check_bytes_salt_iterations)selfr   r   r   r   r   Zossl r   M/tmp/pip-unpacked-wheel-yjz0rwd7/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   derive.   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   