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 d dlmZmZmZ d dlmZ d	ed
efdd„Zdejdedeje fdd„Zdededejg ejf ded
ef
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   úN/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/concatkdf.pyÚ_int_to_u32be   s   r   Ú	algorithmÚlengthÚ	otherinfoc                 C   s<   | j d }||krtd |¡ƒ‚|d urt d|¡ d S 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_materialÚauxfnc                 C   sŠ   t  d| ¡ dg}d}d}||kr<|ƒ }| t|ƒ¡ | | ¡ | |¡ | | ¡ ¡ |t|d ƒ7 }|d7 }||ksd |¡d |… S )Nr   ó    r   é   éÿÿÿÿ)r   Ú_check_byteslikeÚupdater   ÚappendÚfinalizeÚlenÚjoin)r   r   r   r   ÚoutputÚoutlenÚcounterÚhr   r   r   Ú_concatkdf_derive)   s   

ù	r-   c                   @   sf   e Zd Z	ddejdedeje fdd„Z	dej
fdd	„Zd
edefdd„Zd
ededdfdd„ZdS )ÚConcatKDFHashNr   r   r   c                 C   sX   t |ƒ}t|||ƒ || _|| _|d ur|nd| _t|tƒs$t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/   r4   ©r6   r   r   r   Ú_hashW   s   zConcatKDFHash._hashr   c                 C   ó$   | j rt‚d| _ t|| j| j| jƒS ©NT)r5   r   r-   r0   r<   r1   ©r6   r   r   r   r   ÚderiveZ   ó   ÿzConcatKDFHash.deriveÚexpected_keyc                 C   ó   t  |  |¡|¡st‚d S r9   ©r
   Úbytes_eqr@   r   ©r6   r   rB   r   r   r   Úverifyb   ó   ÿzConcatKDFHash.verifyr9   )Ú__name__Ú
__module__Ú__qualname__r   ÚHashAlgorithmÚintÚtypingÚOptionalÚbytesr8   r:   r<   r@   rG   r   r   r   r   r.   @   s    ûþý
ür.   c                
   @   sp   e Zd Z	ddejdedeje deje fdd„Z	de
jfd	d
„Zdedefdd„Zdededdfdd„ZdS )ÚConcatKDFHMACNr   r   Úsaltr   c                 C   s˜   t |ƒ}t|||ƒ || _|| _|d ur|nd| _|jd u r&td |j¡ƒ‚|d u r0d|j }nt	 
d|¡ || _t|tƒsDtdtjƒ‚|| _d| _d S )Nr    z{} is unsupported for ConcatKDFó    rR   z.Backend object does not implement HMACBackend.F)r   r   r/   r0   r1   Ú
block_sizeÚ	TypeErrorr   Únamer   r   Ú_saltr2   r   r   r   r3   r4   r5   )r6   r   r   rR   r   r7   r   r   r   r8   h   s(   

ÿ
þ
zConcatKDFHMAC.__init__r   c                 C   s   t  | j| j| j¡S r9   )r   ÚHMACrW   r/   r4   r;   r   r   r   Ú_hmac‹   s   zConcatKDFHMAC._hmacr   c                 C   r=   r>   )r5   r   r-   r0   rY   r1   r?   r   r   r   r@   Ž   rA   zConcatKDFHMAC.deriverB   c                 C   rC   r9   rD   rF   r   r   r   rG   –   rH   zConcatKDFHMAC.verifyr9   )rI   rJ   rK   r   rL   rM   rN   rO   rP   r8   r   rX   rY   r@   rG   r   r   r   r   rQ   g   s    úþýü
û#rQ   )r   rN   Úcryptographyr   Úcryptography.exceptionsr   r   r   r   Úcryptography.hazmat.backendsr   Ú'cryptography.hazmat.backends.interfacesr   r	   Úcryptography.hazmat.primitivesr
   r   r   Ú"cryptography.hazmat.primitives.kdfr   rM   rP   r   rL   rO   r   ÚCallableÚHashContextr-   r.   rQ   r   r   r   r   Ú<module>   s<   ÿþ
ýÿþýü
û'