B
    `                 @   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ZG d
d deZdS )    N)utils)AlreadyFinalized
InvalidKeyUnsupportedAlgorithm_Reasons)_get_backend)HMACBackend)constant_timehasheshmac)KeyDerivationFunctionc               @   sb   e Zd Zd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edd
ddZdS )HKDFN)	algorithmlengthsaltinfoc             C   sh   t |}t|tstdtj|| _|d kr:d| jj }nt	d| || _
|| _t| j|||| _d S )Nz.Backend object does not implement HMACBackend.    r   )r   
isinstancer   r   r   BACKEND_MISSING_INTERFACE
_algorithmdigest_sizer   _check_bytes_salt_backend
HKDFExpand_hkdf_expand)selfr   r   r   r   backend r   V/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py__init__   s    
zHKDF.__init__)key_materialreturnc             C   s(   t j| j| j| jd}|| | S )N)r   )r   HMACr   r   r   updatefinalize)r   r!   hr   r   r   _extract2   s    
zHKDF._extractc             C   s   t d| | j| |S )Nr!   )r   _check_bytesliker   deriver'   )r   r!   r   r   r   r)   7   s    zHKDF.derive)r!   expected_keyr"   c             C   s   t | ||std S )N)r	   bytes_eqr)   r   )r   r!   r*   r   r   r   verify;   s    zHKDF.verify)N)__name__
__module____qualname__r
   HashAlgorithminttypingOptionalbytesr    r'   r)   r,   r   r   r   r   r      s   $r   c               @   sZ   e Zd Zdejeeje dddZ	eedddZ
eeddd	Zeedd
ddZdS )r   N)r   r   r   c             C   sz   t |}t|tstdtj|| _|| _d|j }||krJt	d
||| _|d kr^d}ntd| || _d| _d S )Nz.Backend object does not implement HMACBackend.   z*Can not derive keys larger than {} octets.    r   F)r   r   r   r   r   r   r   r   r   
ValueErrorformat_lengthr   r   _info_used)r   r   r   r   r   
max_lengthr   r   r   r    A   s"    

zHKDFExpand.__init__)r!   r"   c             C   s   dg}d}xr| j jt|d  | jk r|tj|| j | jd}||d  || j |t	|g |
|  |d7 }qW d|d | j S )Nr6      )r   )r   r   lenr9   r   r#   r   r$   r:   r4   appendr%   join)r   r!   outputcounterr&   r   r   r   _expande   s    zHKDFExpand._expandc             C   s&   t d| | jrtd| _| |S )Nr!   T)r   r(   r;   r   rD   )r   r!   r   r   r   r)   s   s
    zHKDFExpand.derive)r!   r*   r"   c             C   s   t | ||std S )N)r	   r+   r)   r   )r   r!   r*   r   r   r   r,   {   s    zHKDFExpand.verify)N)r-   r.   r/   r
   r0   r1   r2   r3   r4   r    rD   r)   r,   r   r   r   r   r   @   s   r   )r2   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   <module>   s   +