U
    *}f                     @   s   d dl mZmZmZ 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 d dlmZ eeG d	d
 d
eZeeG dd deZdS )    )absolute_importdivisionprint_functionN)utils)AlreadyFinalized
InvalidKeyUnsupportedAlgorithm_Reasons)_get_backend)HMACBackend)constant_timehmac)KeyDerivationFunctionc                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )HKDFNc                 C   sh   t |}t|tstdtj|| _|d kr:d| jj }nt	d| || _
|| _t| j|||| _d S )N.Backend object does not implement HMACBackend.    salt)r
   
isinstancer   r   r	   BACKEND_MISSING_INTERFACE
_algorithmdigest_sizer   _check_bytes_salt_backend
HKDFExpand_hkdf_expand)self	algorithmlengthr   infobackend r!   K/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/primitives/kdf/hkdf.py__init__   s    
zHKDF.__init__c                 C   s(   t j| j| j| jd}|| | S )Nr    )r   HMACr   r   r   updatefinalize)r   key_materialhr!   r!   r"   _extract-   s    
zHKDF._extractc                 C   s   t d| | j| |S )Nr(   )r   _check_bytesliker   deriver*   r   r(   r!   r!   r"   r,   2   s    zHKDF.derivec                 C   s   t | ||std S Nr   Zbytes_eqr,   r   r   r(   Zexpected_keyr!   r!   r"   verify6   s    zHKDF.verify)N)__name__
__module____qualname__r#   r*   r,   r1   r!   r!   r!   r"   r      s   
r   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )r   Nc                 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 )Nr      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#   =   s&    

zHKDFExpand.__init__c                 C   s   dg}d}| j jt|d  | jk rztj|| j | jd}||d  || j |t	
| ||  |d7 }q
d|d | j S )Nr6      r$   )r   r   lenr9   r   r%   r   r&   r:   sixint2byteappendr'   join)r   r(   outputcounterr)   r!   r!   r"   _expand[   s    
zHKDFExpand._expandc                 C   s&   t d| | jrtd| _| |S )Nr(   T)r   r+   r;   r   rF   r-   r!   r!   r"   r,   i   s
    zHKDFExpand.derivec                 C   s   t | ||std S r.   r/   r0   r!   r!   r"   r1   q   s    zHKDFExpand.verify)N)r2   r3   r4   r#   rF   r,   r1   r!   r!   r!   r"   r   ;   s   
r   )
__future__r   r   r   r@   Zcryptographyr   Zcryptography.exceptionsr   r   r   r	   Zcryptography.hazmat.backendsr
   Z'cryptography.hazmat.backends.interfacesr   Zcryptography.hazmat.primitivesr   r   Z"cryptography.hazmat.primitives.kdfr   Zregister_interfaceobjectr   r   r!   r!   r!   r"   <module>   s   $