3 l�_��@s�ddlmZmZmZddlmZddlmZddlm Z ddl m Z m Z m Z mZddlmZddlmZddlmZmZmZdd lmZGd d �d e�ZGd d �d e�Ze je�Gdd�de��ZdS)�)�absolute_import�division�print_function)�Enum)�range)�utils)�AlreadyFinalized� InvalidKey�UnsupportedAlgorithm�_Reasons)� _get_backend)� HMACBackend)� constant_time�hashes�hmac)�KeyDerivationFunctionc@seZdZdZdS)�ModeZctrN)�__name__� __module__� __qualname__Z CounterMode�rr�/usr/lib64/python3.6/kbkdf.pyrsrc@seZdZdZdZdS)�CounterLocationZ before_fixedZ after_fixedN)rrr� BeforeFixed� AfterFixedrrrrrsrc@s6eZdZd dd�Zdd�Zdd�Zdd �Zd d �ZdS) � KBKDFHMACNc CsJt| �} t| t�stdtj��t|tj�s6tdtj��| j |�sLtdtj��t|t �s^t d��t|t �spt d��|sx|r�| r�t d��|dks�|j|� r�t d��|dkr�| dkr�t d��|dk r�t|t� r�t d ��|dkr�d }|dkr�d }tjd |�tjd |�||_||_||_||_||_||_||_||_| |_d |_| |_dS)Nz.Backend object does not implement HMACBackend.z5Algorithm supplied is not a supported hash algorithm.z5Algorithm supplied is not a supported hmac algorithm.zmode must be of type Modez(location must be of type CounterLocationz9When supplying fixed data, label and context are ignored.zrlen must be between 1 and 4zPlease specify an llenzllen must be an integer��label�contextF)r � isinstancer r r ZBACKEND_MISSING_INTERFACErZ HashAlgorithmZUNSUPPORTED_HASHZhmac_supportedr� TypeErrorr� ValueError�_valid_byte_length�intr� _check_bytes� _algorithm�_mode�_length�_rlen�_llen� _location�_label�_context�_backend�_used� _fixed_data) �self� algorithm�modeZlengthZrlenZllen�locationrrZfixed�backendrrr�__init__#sV         zKBKDFHMAC.__init__cCsBt|t�std��tjd|�}dt|�ko4dkns>dSdS)Nzvalue must be of type int��FT)rr#r r� int_to_bytes�len)r0�valueZ value_binrrrr"ks   zKBKDFHMAC._valid_byte_lengthcCs�|jr t�tjd|�d|_|j |jj }dg}tjd|j�}|t dt |�d�dkrdt d��x�t d|d�D]n}t j||j|jd�}tj||j�}|jtjkr�|j|�|j|j��|jtjkr�|j|�|j|j��qtWdj|�d|j�S) N� key_materialTrr6��zThere are too many iterations.)r4)r.rrZ_check_bytesliker'r%Z digest_sizer8r(�powr9r!rrZHMACr-r*rr�update�_generate_fixed_inputr�append�finalize�join)r0r;�rounds�outputZr_bin�i�hZcounterrrr�derivets&     zKBKDFHMAC.derivecCsB|jrt|jt�r|jStj|jd|j�}dj|jd|j |g�S)Nr=r�) r/r�bytesrr8r'r)rCr+r,)r0Zl_valrrrr@�szKBKDFHMAC._generate_fixed_inputcCstj|j|�|�st�dS)N)rZbytes_eqrHr )r0r;Z expected_keyrrr�verify�szKBKDFHMAC.verify)N)rrrr5r"rHr@rKrrrrr!s  = $rN)Z __future__rrr�enumrZ six.movesrZ cryptographyrZcryptography.exceptionsrr r r Zcryptography.hazmat.backendsr Z'cryptography.hazmat.backends.interfacesr Zcryptography.hazmat.primitivesrrrZ"cryptography.hazmat.primitives.kdfrrrZregister_interface�objectrrrrr�s