B
    `K                 @   s   d dl Z d dlm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ZG dd deZG dd deZdS )    N)Enum)utils)AlreadyFinalized
InvalidKeyUnsupportedAlgorithm_Reasons)_get_backend)HMACBackend)constant_timehasheshmac)KeyDerivationFunctionc               @   s   e Zd ZdZdS )ModeZctrN)__name__
__module____qualname__ZCounterMode r   r   W/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/kbkdf.pyr      s   r   c               @   s   e Zd ZdZdZdS )CounterLocationZbefore_fixedZafter_fixedN)r   r   r   BeforeFixed
AfterFixedr   r   r   r   r      s   r   c               @   s   e Zd Zdejeeeeje e	eje
 eje
 eje
 d	ddZeedddZe
e
dd	d
Ze
dddZe
e
dd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s6tdtj|
	|sLtdtjt|t
s^tdt|tsptd|sx|r|	rtd|d ks| |std|d kr|	d krtd|d k	rt|tstd	|d krd
}|d krd
}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   ZBACKEND_MISSING_INTERFACEr   HashAlgorithmZUNSUPPORTED_HASHZ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__    sV    



zKBKDFHMAC.__init__)valuereturnc             C   s@   t |tstdtd|}dt|  kr6dks<n dS dS )Nzvalue must be of type int      FT)r"   r'   r$   r   int_to_byteslen)r4   r7   Z	value_binr   r   r   r&   h   s    
zKBKDFHMAC._valid_byte_length)key_materialr8   c             C   s   | j r
ttd| d| _ | j | jj  }dg}td| j}|t	dt
|d d krdtdxtd|d D ]n}tj|| j| jd}t|| j}| jtjkr|| ||   | jtjkr|| ||  qtW d|d | j S )	Nr=   Tr!   r9         zThere are too many iterations.)r5   )r2   r   r   Z_check_bytesliker+   r)   digest_sizer;   r,   powr<   r%   ranger   HMACr1   r.   r   r   update_generate_fixed_inputr   appendfinalizejoin)r4   r=   roundsoutputZr_binihcounterr   r   r   deriveq   s&    

zKBKDFHMAC.derive)r8   c             C   sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )Nr?   r!       )
r3   r"   bytesr   r;   r+   r-   rH   r/   r0   )r4   Zl_valr   r   r   rE      s    zKBKDFHMAC._generate_fixed_input)r=   expected_keyr8   c             C   s   t | ||std S )N)r
   Zbytes_eqrN   r   )r4   r=   rQ   r   r   r   verify   s    zKBKDFHMAC.verify)N)r   r   r   r   r#   r   r'   typingOptionalr   rP   r6   boolr&   rN   rE   rR   r   r   r   r   r      s
   :=	$r   )rS   enumr   Zcryptographyr   Zcryptography.exceptionsr   r   r   r   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr	   Zcryptography.hazmat.primitivesr
   r   r   Z"cryptography.hazmat.primitives.kdfr   r   r   r   r   r   r   r   <module>   s   