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 d dlmZmZmZ d d	lmZ d
d Zdd Zdd 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)HashBackend)constant_timehasheshmac)KeyDerivationFunctionc                 C   s   t d| S )Nz>I)structpack)n r   P/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/primitives/kdf/concatkdf.py_int_to_u32be   s    r   c                 C   s8   | j d }||kr td||d k	r4td| d S )Nl    z(Can not derive keys larger than {} bits.	otherinfo)digest_size
ValueErrorformatr   _check_bytes)	algorithmlengthr   
max_lengthr   r   r   _common_args_checks   s    
r   c                 C   s   t d|  dg}d}d}||krr| }|t| ||  || ||  |t|d 7 }|d7 }qd|d | S )Nkey_material    r      )r   Z_check_byteslikeupdater   appendfinalizelenjoin)r    r   Zauxfnr   outputZoutlencounterhr   r   r   _concatkdf_derive%   s    


r,   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )ConcatKDFHashNc                 C   s\   t |}t||| || _|| _|| _| jd kr6d| _t|tsLtdtj	|| _
d| _d S )Nr!   z.Backend object does not implement HashBackend.F)r
   r   
_algorithm_length
_otherinfo
isinstancer   r   r	   BACKEND_MISSING_INTERFACE_backend_used)selfr   r   r   backendr   r   r   __init__9   s    

zConcatKDFHash.__init__c                 C   s   t | j| jS N)r   ZHashr.   r3   r5   r   r   r   _hashK   s    zConcatKDFHash._hashc                 C   s$   | j r
td| _ t|| j| j| jS NT)r4   r   r,   r/   r:   r0   r5   r    r   r   r   deriveN   s       zConcatKDFHash.derivec                 C   s   t | ||std S r8   r   Zbytes_eqr=   r   r5   r    Zexpected_keyr   r   r   verifyV   s    zConcatKDFHash.verify)N)__name__
__module____qualname__r7   r:   r=   r@   r   r   r   r   r-   7   s   
r-   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )ConcatKDFHMACNc                 C   s   t |}t||| || _|| _|| _| jd kr6d| _|d krJd|j }ntd| || _t	|t
srtdtj|| _d| _d S )Nr!       saltz.Backend object does not implement HMACBackend.F)r
   r   r.   r/   r0   
block_sizer   r   _saltr1   r   r   r	   r2   r3   r4   )r5   r   r   rF   r   r6   r   r   r   r7   ]   s$    

zConcatKDFHMAC.__init__c                 C   s   t | j| j| jS r8   )r   HMACrH   r.   r3   r9   r   r   r   _hmacv   s    zConcatKDFHMAC._hmacc                 C   s$   | j r
td| _ t|| j| j| jS r;   )r4   r   r,   r/   rJ   r0   r<   r   r   r   r=   y   s       zConcatKDFHMAC.derivec                 C   s   t | ||std S r8   r>   r?   r   r   r   r@      s    zConcatKDFHMAC.verify)N)rA   rB   rC   r7   rJ   r=   r@   r   r   r   r   rD   [   s   
rD   )
__future__r   r   r   r   Zcryptographyr   Zcryptography.exceptionsr   r   r   r	   Zcryptography.hazmat.backendsr
   Z'cryptography.hazmat.backends.interfacesr   r   Zcryptography.hazmat.primitivesr   r   r   Z"cryptography.hazmat.primitives.kdfr   r   r   r,   Zregister_interfaceobjectr-   rD   r   r   r   r   <module>   s   
#