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mZ d dlmZ dd	„ ZG d
d„ deƒZdS )é    N)Úutils)ÚAlreadyFinalizedÚ
InvalidKeyÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚHashBackend)Úconstant_timeÚhashes)ÚKeyDerivationFunctionc             C   s   t  d| ¡S )Nz>I)ÚstructÚpack)Ún© r   úY/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.pyÚ_int_to_u32be   s    r   c               @   sJ   e Zd Zdejeeje dœdd„Z	eedœdd„Z
eeddœd	d
„ZdS )ÚX963KDFN)Ú	algorithmÚlengthÚ
sharedinfoc             C   st   t |ƒ}|jd }||kr(td |¡ƒ‚|d k	r<t d|¡ || _|| _|| _t	|t
ƒsdtdtjƒ‚|| _d| _d S )Nl   ÿÿ z(Can not derive keys larger than {} bits.r   z.Backend object does not implement HashBackend.F)r   Údigest_sizeÚ
ValueErrorÚformatr   Ú_check_bytesÚ
_algorithmÚ_lengthÚ_sharedinfoÚ
isinstancer   r   r   ZBACKEND_MISSING_INTERFACEÚ_backendÚ_used)Úselfr   r   r   ÚbackendÚmax_lenr   r   r   Ú__init__   s     

zX963KDF.__init__)Úkey_materialÚreturnc             C   s²   | j r
t‚d| _ t d|¡ dg}d}d}xr| j|krœt | j| j¡}| 	|¡ | 	t
|ƒ¡ | jd k	rt| 	| j¡ | | ¡ ¡ |t|d ƒ7 }|d7 }q,W d |¡d | j… S )NTr$   ó    r   é   éÿÿÿÿ)r   r   r   Z_check_bytesliker   r
   ZHashr   r   Úupdater   r   ÚappendÚfinalizeÚlenÚjoin)r    r$   ÚoutputZoutlenÚcounterÚhr   r   r   Úderive8   s"    

zX963KDF.derive)r$   Úexpected_keyr%   c             C   s   t  |  |¡|¡st‚d S )N)r	   Zbytes_eqr1   r   )r    r$   r2   r   r   r   ÚverifyM   s    zX963KDF.verify)N)Ú__name__Ú
__module__Ú__qualname__r
   ZHashAlgorithmÚintÚtypingÚOptionalÚbytesr#   r1   r3   r   r   r   r   r      s   r   )r   r8   Zcryptographyr   Zcryptography.exceptionsr   r   r   r   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr   Zcryptography.hazmat.primitivesr	   r
   Z"cryptography.hazmat.primitives.kdfr   r   r   r   r   r   r   Ú<module>   s   