a
     `                     @   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)structZpack)n r   N/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/concatkdf.py_int_to_u32be   s    r   c                 C   s8   | j d }||kr td||d ur4td| d S )Nl    z(Can not derive keys larger than {} bits.	otherinfo)Zdigest_size
ValueErrorformatr   _check_bytes)	algorithmlengthr   Z
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outlenZ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 u 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*   r/   r1   r   r   r   _hashK   s    zConcatKDFHash._hashc                 C   s$   | j r
td| _ t|| j| j| jS NT)r0   r   r(   r+   r6   r,   r1   r   r   r   r   deriveN   s    zConcatKDFHash.derivec                 C   s   t | ||std S r4   r   Zbytes_eqr9   r   r1   r   Zexpected_keyr   r   r   verifyV   s    zConcatKDFHash.verify)N)__name__
__module____qualname__r3   r6   r9   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 u r6d| _|d u 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+   r,   Z
block_sizer   r   _saltr-   r   r   r	   r.   r/   r0   )r1   r   r   rB   r   r2   r   r   r   r3   ]   s$    

zConcatKDFHMAC.__init__c                 C   s   t | j| j| jS r4   )r   ZHMACrC   r*   r/   r5   r   r   r   _hmacv   s    zConcatKDFHMAC._hmacc                 C   s$   | j r
td| _ t|| j| j| jS r7   )r0   r   r(   r+   rD   r,   r8   r   r   r   r9   y   s    zConcatKDFHMAC.derivec                 C   s   t | ||std S r4   r:   r;   r   r   r   r<      s    zConcatKDFHMAC.verify)N)r=   r>   r?   r3   rD   r9   r<   r   r   r   r   r@   [   s   
r@   )Z
__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)   r@   r   r   r   r   <module>   s   
#