B
    ó±ô`à  ã               @   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 eed	œd
d„Zejeeje dœdd„Zeeejg ejf eedœ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   ú[/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/concatkdf.pyÚ_int_to_u32be   s    r   )Ú	algorithmÚlengthÚ	otherinfoc             C   s8   | j d }||kr td |¡ƒ‚|d k	r4t d|¡ 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_materialr   Úauxfnr   r   c             C   sˆ   t  d| ¡ dg}d}d}xZ||krt|ƒ }| t|ƒ¡ | | ¡ | |¡ | | ¡ ¡ |t|d ƒ7 }|d7 }qW 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               @   sZ   e Zd Zdejeeje dœdd„Z	ej
dœdd„Zeedœd	d
„Zeeddœdd„ZdS )ÚConcatKDFHashN)r   r   r   c             C   sX   t |ƒ}t|||ƒ || _|| _|d k	r,|nd| _t|tƒsHt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-   r2   )r4   r   r   r   Ú_hashW   s    zConcatKDFHash._hash)r   r   c             C   s$   | j r
t‚d| _ t|| j| j| jƒS )NT)r3   r   r+   r.   r8   r/   )r4   r   r   r   r   ÚderiveZ   s
    zConcatKDFHash.derive)r   Úexpected_keyr   c             C   s   t  |  |¡|¡st‚d S )N)r
   Úbytes_eqr9   r   )r4   r   r:   r   r   r   Úverifyb   s    zConcatKDFHash.verify)N)Ú__name__Ú
__module__Ú__qualname__r   ÚHashAlgorithmÚintÚtypingÚOptionalÚbytesr6   r7   r8   r9   r<   r   r   r   r   r,   @   s   r,   c               @   sb   e Zd Zdejeeje eje dœdd„Z	e
jdœdd„Zeedœd	d
„Zeeddœdd„ZdS )ÚConcatKDFHMACN)r   r   Úsaltr   c             C   s˜   t |ƒ}t|||ƒ || _|| _|d k	r,|nd| _|jd krLtd |j¡ƒ‚|d kr`d|j }nt	 
d|¡ || _t|tƒsˆtdtjƒ‚|| _d| _d S )Nr    z{} is unsupported for ConcatKDFó    rF   z.Backend object does not implement HMACBackend.F)r   r   r-   r.   r/   Ú
block_sizeÚ	TypeErrorr   Únamer   r   Ú_saltr0   r   r   r   r1   r2   r3   )r4   r   r   rF   r   r5   r   r   r   r6   h   s$    

zConcatKDFHMAC.__init__)r   c             C   s   t  | j| j| j¡S )N)r   ÚHMACrK   r-   r2   )r4   r   r   r   Ú_hmac‹   s    zConcatKDFHMAC._hmac)r   r   c             C   s$   | j r
t‚d| _ t|| j| j| jƒS )NT)r3   r   r+   r.   rM   r/   )r4   r   r   r   r   r9   Ž   s
    zConcatKDFHMAC.derive)r   r:   r   c             C   s   t  |  |¡|¡st‚d S )N)r
   r;   r9   r   )r4   r   r:   r   r   r   r<   –   s    zConcatKDFHMAC.verify)N)r=   r>   r?   r   r@   rA   rB   rC   rD   r6   r   rL   rM   r9   r<   r   r   r   r   rE   g   s   $rE   )r   rB   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   rA   rD   r   r@   rC   r   ÚCallableZHashContextr+   r,   rE   r   r   r   r   Ú<module>   s&   '