o
    
þðcð  ã                   @   s\   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	m
Z
 d dlmZ G dd„ deƒZdS )é    N)Úutils)ÚAlreadyFinalizedÚ
InvalidKeyÚUnsupportedAlgorithmÚ_Reasons)Úconstant_timeÚhashes)ÚKeyDerivationFunctionc                   @   sZ   e Zd Z	ddejdedededejf
dd„Z	d	ed
efdd„Z
d	eded
dfdd„ZdS )Ú
PBKDF2HMACNÚ	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   )Ú,cryptography.hazmat.backends.openssl.backendr   Úpbkdf2_hmac_supportedr   ÚformatÚnamer   ÚUNSUPPORTED_HASHÚ_usedÚ
_algorithmÚ_lengthr   Ú_check_bytesÚ_saltÚ_iterations)Úselfr   r   r   r   r   Úossl© r   úV/opt/certbot/lib/python3.10/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.pyÚ__init__   s   
ÿü
zPBKDF2HMAC.__init__Úkey_materialÚreturnc                 C   sF   | j rtdƒ‚d| _ t d|¡ ddlm} | | j| j| j	| j
|¡S )Nz'PBKDF2 instances can only be used once.Tr!   r   r   )r   r   r   Ú_check_bytesliker   r   Úderive_pbkdf2_hmacr   r   r   r   )r   r!   r   r   r   r   Úderive.   s   ûzPBKDF2HMAC.deriveÚexpected_keyc                 C   s"   |   |¡}t ||¡stdƒ‚d S )NzKeys do not match.)r%   r   Úbytes_eqr   )r   r!   r&   Úderived_keyr   r   r   Úverify>   s   
ÿzPBKDF2HMAC.verify)N)Ú__name__Ú
__module__Ú__qualname__r   ÚHashAlgorithmÚintÚbytesÚtypingÚAnyr    r%   r)   r   r   r   r   r
      s    úþýüû
úr
   )r0   Úcryptographyr   Úcryptography.exceptionsr   r   r   r   Úcryptography.hazmat.primitivesr   r   Ú"cryptography.hazmat.primitives.kdfr	   r
   r   r   r   r   Ú<module>   s   