o
    geA                     @   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	 d dl
mZ d dlmZmZmZ d dlmZ G dd	 d	ejZG d
d dejZG dd deZdS )    N)utils)AlreadyFinalized
InvalidKeyUnsupportedAlgorithm_Reasons)_get_backend)HMACBackend)constant_timehasheshmac)KeyDerivationFunctionc                   @   s   e Zd ZdZdS )ModectrN)__name__
__module____qualname__CounterMode r   r   J/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/kbkdf.pyr      s    r   c                   @   s   e Zd ZdZdZdS )CounterLocationbefore_fixedafter_fixedN)r   r   r   BeforeFixed
AfterFixedr   r   r   r   r      s    r   c                   @   s   e Zd Z	ddejdedededeje de	deje
 d	eje
 d
eje
 fddZdedefddZde
de
fddZde
fddZde
de
ddfddZdS )	KBKDFHMACN	algorithmmodelengthrlenllenlocationlabelcontextfixedc                 C   sF  t |
}
t|
tstdtjt|tjstdtj|
	|s&tdtjt|t
s/tdt|ts8td|s<|rB|	rBtd|d u sK| |sOtd|d u r[|	d u r[td|d urht|tshtd	|d u rnd
}|d u rtd
}td| td| || _|| _|| _|| _|| _|| _|| _|| _|
| _d| _|	| _d S )Nz.Backend object does not implement HMACBackend.z5Algorithm supplied is not a supported hash algorithm.z5Algorithm supplied is not a supported hmac algorithm.zmode must be of type Modez(location must be of type CounterLocationz9When supplying fixed data, label and context are ignored.zrlen must be between 1 and 4zPlease specify an llenzllen must be an integer    r!   r"   F)r   
isinstancer   r   r   BACKEND_MISSING_INTERFACEr
   HashAlgorithmUNSUPPORTED_HASHhmac_supportedr   	TypeErrorr   
ValueError_valid_byte_lengthintr   _check_bytes
_algorithm_mode_length_rlen_llen	_location_label_context_backend_used_fixed_data)selfr   r   r   r   r   r    r!   r"   r#   backendr   r   r   __init__   s^   




zKBKDFHMAC.__init__valuereturnc                 C   sB   t |ts	tdtd|}dt|  krdksdS  dS dS )Nzvalue must be of type int      FT)r%   r-   r*   r   int_to_byteslen)r:   r=   	value_binr   r   r   r,   g   s   
zKBKDFHMAC._valid_byte_lengthkey_materialc                 C   s   | j rttd| d| _ | j | jj  }dg}td| j}|t	dt
|d d kr2tdtd|d D ]7}tj|| j| jd}t|| j}| jtjkrW|| ||   | jtjkri|| ||  q9d|d | j S )	NrD   Tr$   r?         zThere are too many iterations.)r;   )r8   r   r   _check_bytesliker1   r/   digest_sizerA   r2   powrB   r+   ranger   HMACr7   r4   r   r   update_generate_fixed_inputr   appendfinalizejoin)r:   rD   roundsoutputr_binihcounterr   r   r   derivep   s&   

zKBKDFHMAC.derivec                 C   sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )NrF   r$       )
r9   r%   bytesr   rA   r1   r3   rP   r5   r6   )r:   l_valr   r   r   rM      s   zKBKDFHMAC._generate_fixed_inputexpected_keyc                 C   s   t | ||std S N)r	   bytes_eqrW   r   )r:   rD   r[   r   r   r   verify   s   zKBKDFHMAC.verifyr\   )r   r   r   r
   r'   r   r-   typingOptionalr   rY   r<   boolr,   rW   rM   r^   r   r   r   r   r      s2    	

H	$r   )r_   cryptographyr   cryptography.exceptionsr   r   r   r   cryptography.hazmat.backendsr   'cryptography.hazmat.backends.interfacesr   cryptography.hazmat.primitivesr	   r
   r   "cryptography.hazmat.primitives.kdfr   Enumr   r   r   r   r   r   r   <module>   s   