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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   úL/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/x963kdf.pyÚ_int_to_u32be   s   r   c                   @   sV   e Zd Z	ddejdedeje fdd„Z	dedefd	d
„Z
dededdfdd„ZdS )ÚX963KDFNÚ	algorithmÚlengthÚ
sharedinfoc                 C   st   t |ƒ}|jd }||krtd |¡ƒ‚|d urt d|¡ || _|| _|| _t	|t
ƒs2t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   Ú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}| j|krQt | j| j¡}| 	|¡ | 	t
|ƒ¡ | jd ur9| 	| j¡ | | ¡ ¡ |t|d ƒ7 }|d7 }| j|ksd |¡d | j… S )NTr%   ó    r   é   éÿÿÿÿ)r    r   r   Ú_check_bytesliker   r
   ÚHashr   r   Úupdater   r   ÚappendÚfinalizeÚlenÚjoin)r!   r%   ÚoutputÚoutlenÚcounterÚhr   r   r   Úderive8   s$   



ø
zX963KDF.deriveÚexpected_keyc                 C   s   t  |  |¡|¡st‚d S ©N)r	   Úbytes_eqr5   r   )r!   r%   r6   r   r   r   ÚverifyM   s   ÿzX963KDF.verifyr7   )Ú__name__Ú
__module__Ú__qualname__r
   ÚHashAlgorithmÚintÚtypingÚOptionalÚbytesr$   r5   r9   r   r   r   r   r      s    ûþý
ür   )r   r?   Úcryptographyr   Úcryptography.exceptionsr   r   r   r   Úcryptography.hazmat.backendsr   Ú'cryptography.hazmat.backends.interfacesr   Úcryptography.hazmat.primitivesr	   r
   Ú"cryptography.hazmat.primitives.kdfr   r   r   r   r   r   r   Ú<module>   s   