o
    �)%aß  ã                   @   sˆ   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mZ d dlmZ G dd	„ d	eƒZG d
d„ deƒZdS )é    N)Úutils)ÚAlreadyFinalizedÚ
InvalidKeyÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚHMACBackend)Úconstant_timeÚhashesÚhmac)ÚKeyDerivationFunctionc                
   @   sr   e Zd Z	ddejdedeje deje fdd„Z	ded	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 )ÚHKDFNÚ	algorithmÚlengthÚsaltÚinfoc                 C   sh   t |ƒ}t|tƒstdtjƒ‚|| _|d u rd| jj }nt 	d|¡ || _
|| _t| j|||ƒ| _d S )Nú.Backend object does not implement HMACBackend.ó    r   )r   Ú
isinstancer   r   r   ÚBACKEND_MISSING_INTERFACEÚ
_algorithmÚdigest_sizer   Ú_check_bytesÚ_saltÚ_backendÚ
HKDFExpandÚ_hkdf_expand)Úselfr   r   r   r   Úbackend© r   úI/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/hkdf.pyÚ__init__   s   
þzHKDF.__init__Úkey_materialÚreturnc                 C   s(   t j| j| j| jd�}| |¡ | ¡ S )N©r   )r   ÚHMACr   r   r   ÚupdateÚfinalize)r   r"   Úhr   r   r    Ú_extract2   s   
zHKDF._extractc                 C   s   t  d|¡ | j |  |¡¡S )Nr"   )r   Ú_check_bytesliker   Úderiver)   ©r   r"   r   r   r    r+   7   s   zHKDF.deriveÚexpected_keyc                 C   ó   t  |  |¡|¡st‚d S ©N©r	   Úbytes_eqr+   r   ©r   r"   r-   r   r   r    Úverify;   ó   ÿzHKDF.verifyr/   )Ú__name__Ú
__module__Ú__qualname__r
   ÚHashAlgorithmÚintÚtypingÚOptionalÚbytesr!   r)   r+   r3   r   r   r   r    r      s    úþýü
ûr   c                   @   sh   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fdd„Zdededdfdd„ZdS )r   Nr   r   r   c                 C   sz   t |ƒ}t|tƒstdtjƒ‚|| _|| _d|j }||kr%t	d 
|¡ƒ‚|| _|d u r/d}nt d|¡ || _d| _d S )Nr   éÿ   z*Can not derive keys larger than {} octets.ó    r   F)r   r   r   r   r   r   r   r   r   Ú
ValueErrorÚformatÚ_lengthr   r   Ú_infoÚ_used)r   r   r   r   r   Ú
max_lengthr   r   r    r!   A   s&   
þ
ÿ
zHKDFExpand.__init__r"   r#   c                 C   s¦   dg}d}| j jt|ƒd  | jk rItj|| j | jd�}| |d ¡ | | j¡ | t	|gƒ¡ | 
| ¡ ¡ |d7 }| j jt|ƒd  | jk sd |¡d | j… S )Nr>   é   r$   éÿÿÿÿ)r   r   ÚlenrA   r   r%   r   r&   rB   r<   Úappendr'   Újoin)r   r"   ÚoutputÚcounterr(   r   r   r    Ú_expande   s   úzHKDFExpand._expandc                 C   s&   t  d|¡ | jrt‚d| _|  |¡S )Nr"   T)r   r*   rC   r   rL   r,   r   r   r    r+   s   s
   
zHKDFExpand.deriver-   c                 C   r.   r/   r0   r2   r   r   r    r3   {   r4   zHKDFExpand.verifyr/   )r5   r6   r7   r
   r8   r9   r:   r;   r<   r!   rL   r+   r3   r   r   r   r    r   @   s    ûþý
ü$r   )r:   Úcryptographyr   Úcryptography.exceptionsr   r   r   r   Úcryptography.hazmat.backendsr   Ú'cryptography.hazmat.backends.interfacesr   Úcryptography.hazmat.primitivesr	   r
   r   Ú"cryptography.hazmat.primitives.kdfr   r   r   r   r   r   r    Ú<module>   s   +