U
    /2i                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZmZ d dlmZ dd	d
ddZdddddddZdddd	d	dddZG dd deZG dd deZdS )    )annotationsN)Callable)utils)AlreadyFinalized
InvalidKey)constant_timehasheshmac)KeyDerivationFunctionintbytes)nreturnc                 C  s   | j dddS )N   big)length	byteorder)to_bytes)r    r   P/tmp/pip-unpacked-wheel-d9r6v89i/cryptography/hazmat/primitives/kdf/concatkdf.py_int_to_u32be   s    r   hashes.HashAlgorithmbytes | NoneNone)	algorithmr   	otherinfor   c                 C  s:   | j d }||kr"td| d|d k	r6td| d S )Nl    zCannot derive keys larger than z bits.r   )digest_size
ValueErrorr   _check_bytes)r   r   r   
max_lengthr   r   r   _common_args_checks   s
    
r    utils.Bufferz Callable[[], hashes.HashContext])key_materialr   auxfnr   r   c                 C  s   t d|  dg}d}d}||krr| }|t| ||  || ||  |t|d 7 }|d7 }qd|d | S )Nr"       r      )r   Z_check_byteslikeupdater   appendfinalizelenjoin)r"   r   r#   r   outputZoutlencounterhr   r   r   _concatkdf_derive    s    


r/   c                   @  sR   e Zd ZddddddddZd	d
ddZdddddZddddddZdS )ConcatKDFHashNr   r   r   
typing.Any)r   r   r   backendc                 C  s4   t ||| || _|| _|d k	r$|nd| _d| _d S )Nr$   F)r    
_algorithm_length
_otherinfo_used)selfr   r   r   r2   r   r   r   __init__8   s
    zConcatKDFHash.__init__zhashes.Hashr   c                 C  s   t | jS N)r   ZHashr3   r7   r   r   r   _hashF   s    zConcatKDFHash._hashr!   r   r"   r   c                 C  s$   | j r
td| _ t|| j| j| jS NT)r6   r   r/   r4   r<   r5   r7   r"   r   r   r   deriveI   s       zConcatKDFHash.deriver   r"   expected_keyr   c                 C  s   t | ||std S r:   r   Zbytes_eqr@   r   r7   r"   rB   r   r   r   verifyQ   s    zConcatKDFHash.verify)N)__name__
__module____qualname__r8   r<   r@   rE   r   r   r   r   r0   7   s
    r0   c                   @  sT   e Zd ZdddddddddZd	d
ddZdddddZddddddZdS )ConcatKDFHMACNr   r   r   r1   )r   r   saltr   r2   c                 C  st   t ||| || _|| _|d k	r$|nd| _|jd krDt|j d|d krXd|j }ntd| || _	d| _
d S )Nr$   z is unsupported for ConcatKDF    rJ   F)r    r3   r4   r5   
block_size	TypeErrornamer   r   _saltr6   )r7   r   r   rJ   r   r2   r   r   r   r8   W   s    
zConcatKDFHMAC.__init__z	hmac.HMACr9   c                 C  s   t | j| jS r:   )r	   HMACrO   r3   r;   r   r   r   _hmacp   s    zConcatKDFHMAC._hmacr!   r   r=   c                 C  s$   | j r
td| _ t|| j| j| jS r>   )r6   r   r/   r4   rQ   r5   r?   r   r   r   r@   s   s       zConcatKDFHMAC.deriver   rA   c                 C  s   t | ||std S r:   rC   rD   r   r   r   rE   {   s    zConcatKDFHMAC.verify)N)rF   rG   rH   r8   rQ   r@   rE   r   r   r   r   rI   V   s
    rI   )
__future__r   typingcollections.abcr   Zcryptographyr   Zcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   r   r	   Z"cryptography.hazmat.primitives.kdfr
   r   r    r/   r0   rI   r   r   r   r   <module>   s   