U
    *”}fg	  ã                   @   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mZ d dlmZ d	d
„ Ze e¡G dd„ deƒƒZdS )é    )Úabsolute_importÚdivisionÚprint_functionN)Úutils)ÚAlreadyFinalizedÚ
InvalidKeyÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚHashBackend)Úconstant_timeÚhashes)ÚKeyDerivationFunctionc                 C   s   t  d| ¡S )Nz>I)ÚstructÚpack)Ún© r   úN/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/primitives/kdf/x963kdf.pyÚ_int_to_u32be   s    r   c                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚX963KDFNc                 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.Ú
sharedinfoz.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)ÚselfÚ	algorithmÚlengthr   ÚbackendÚmax_lenr   r   r   Ú__init__   s$    
ÿ
þzX963KDF.__init__c                 C   s®   | j r
t‚d| _ t d|¡ dg}d}d}| j|kršt | j| j¡}| 	|¡ | 	t
|ƒ¡ | jd k	rr| 	| j¡ | | ¡ ¡ |t|d ƒ7 }|d7 }q*d |¡d | j… S )NTÚkey_materialó    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   Úderive3   s"    



zX963KDF.derivec                 C   s   t  |  |¡|¡st‚d S )N)r   Zbytes_eqr3   r   )r!   r'   Zexpected_keyr   r   r   ÚverifyH   s    zX963KDF.verify)N)Ú__name__Ú
__module__Ú__qualname__r&   r3   r4   r   r   r   r   r      s   
r   )Ú
__future__r   r   r   r   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   Zregister_interfaceÚobjectr   r   r   r   r   Ú<module>   s   