o
    )%a                  
   @   s   d dl 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	ed
efddZdejdedeje fddZdededejg ejf ded
ef
ddZG dd deZG dd deZdS )    N)utils)AlreadyFinalized
InvalidKeyUnsupportedAlgorithm_Reasons)_get_backend)HMACBackend)HashBackend)constant_timehasheshmac)KeyDerivationFunctionnreturnc                 C   s   t d| S )Nz>I)structpack)r    r   N/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/concatkdf.py_int_to_u32be   s   r   	algorithmlength	otherinfoc                 C   s<   | j d }||krtd||d urtd| d S d S )Nl    z(Can not derive keys larger than {} bits.r   )digest_size
ValueErrorformatr   _check_bytes)r   r   r   
max_lengthr   r   r   _common_args_checks   s   
r   key_materialauxfnc                 C   s   t d|  dg}d}d}||kr<| }|t| ||  || ||  |t|d 7 }|d7 }||ksd|d | S )Nr       r      )r   _check_byteslikeupdater   appendfinalizelenjoin)r   r   r   r   outputoutlencounterhr   r   r   _concatkdf_derive)   s   

	r-   c                   @   sf   e Zd Z	ddejdedeje fddZ	dej
fdd	Zd
edefddZd
ededdfddZdS )ConcatKDFHashNr   r   r   c                 C   sX   t |}t||| || _|| _|d ur|nd| _t|ts$t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__A   s   

zConcatKDFHash.__init__r   c                 C   s   t | j| jS N)r   Hashr/   r4   r6   r   r   r   _hashW   s   zConcatKDFHash._hashr   c                 C   $   | j rtd| _ t|| j| j| jS NT)r5   r   r-   r0   r<   r1   r6   r   r   r   r   deriveZ      zConcatKDFHash.deriveexpected_keyc                 C      t | ||std S r9   r
   bytes_eqr@   r   r6   r   rB   r   r   r   verifyb      zConcatKDFHash.verifyr9   )__name__
__module____qualname__r   HashAlgorithminttypingOptionalbytesr8   r:   r<   r@   rG   r   r   r   r   r.   @   s    
r.   c                
   @   sp   e Zd Z	ddejdedeje deje fddZ	de
jfd	d
ZdedefddZdededdfddZdS )ConcatKDFHMACNr   r   saltr   c                 C   s   t |}t||| || _|| _|d ur|nd| _|jd u r&td|j|d u r0d|j }nt	
d| || _t|tsDtdtj|| _d| _d S )Nr    z{} is unsupported for ConcatKDF    rR   z.Backend object does not implement HMACBackend.F)r   r   r/   r0   r1   
block_size	TypeErrorr   namer   r   _saltr2   r   r   r   r3   r4   r5   )r6   r   r   rR   r   r7   r   r   r   r8   h   s(   



zConcatKDFHMAC.__init__r   c                 C   s   t | j| j| jS r9   )r   HMACrW   r/   r4   r;   r   r   r   _hmac   s   zConcatKDFHMAC._hmacr   c                 C   r=   r>   )r5   r   r-   r0   rY   r1   r?   r   r   r   r@      rA   zConcatKDFHMAC.deriverB   c                 C   rC   r9   rD   rF   r   r   r   rG      rH   zConcatKDFHMAC.verifyr9   )rI   rJ   rK   r   rL   rM   rN   rO   rP   r8   r   rX   rY   r@   rG   r   r   r   r   rQ   g   s    
#rQ   )r   rN   cryptographyr   cryptography.exceptionsr   r   r   r   cryptography.hazmat.backendsr   'cryptography.hazmat.backends.interfacesr   r	   cryptography.hazmat.primitivesr
   r   r   "cryptography.hazmat.primitives.kdfr   rM   rP   r   rL   rO   r   CallableHashContextr-   r.   rQ   r   r   r   r   <module>   s<   

'