o
    îRµiA  ã                   @   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   