o
    ˷e                     @   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	m
Z
mZmZmZ d dlmZ G dd dejZG dd	 d	ejZG d
d dZG dd deZG dd deZdS )    N)utils)AlreadyFinalized
InvalidKeyUnsupportedAlgorithm_Reasons)cipherscmacconstant_timehasheshmac)KeyDerivationFunctionc                   @   s   e Zd ZdZdS )ModectrN)__name__
__module____qualname__CounterMode r   r   _/var/www/ideatree/venv/lib/python3.10/site-packages/cryptography/hazmat/primitives/kdf/kbkdf.pyr      s    r   c                   @   s   e Zd ZdZdZdS )CounterLocationbefore_fixedafter_fixedN)r   r   r   BeforeFixed
AfterFixedr   r   r   r   r      s    r   c                   @   s   e Zd Zdejdedededeje dedeje	 deje	 d	eje	 fd
dZ
ededefddZde	dede	fddZde	fddZdS )_KBKDFDeriverprfmodelengthrlenllenlocationlabelcontextfixedc
           
      C   s   t |sJ t|tstdt|tstd|s|r"|	r"td|d u s+| |s/td|d u r;|	d u r;td|d urHt|tsHtd|d u rNd}|d u rTd}t	d| t	d	| || _
|| _|| _|| _|| _|| _|| _|| _d
| _|	| _d S )Nzmode must be of type Modez(location must be of type CounterLocationz9When supplying fixed data, label and context are ignored.zrlen must be between 1 and 4zPlease specify an llenzllen must be an integer    r!   r"   F)callable
isinstancer   	TypeErrorr   
ValueError_valid_byte_lengthintr   _check_bytes_prf_mode_length_rlen_llen	_location_label_context_used_fixed_data)
selfr   r   r   r   r   r    r!   r"   r#   r   r   r   __init__"   s>   


z_KBKDFDeriver.__init__valuereturnc                 C   sB   t | ts	tdtd| }dt|  krdksdS  dS dS )Nzvalue must be of type int      FT)r&   r*   r'   r   int_to_byteslen)r8   	value_binr   r   r   r)   W   s   
z _KBKDFDeriver._valid_byte_lengthkey_materialprf_output_sizec           	      C   s   | j rttd| d| _ | j |  }dg}td| j}|tdt|d d kr0t	dt
d|d D ]2}| |}t|| j}| jtjkrP|| ||   | jtjkrb|| ||  q7d|d | j S )Nr?   Tr$   r:         zThere are too many iterations.)r4   r   r   _check_bytesliker.   r<   r/   powr=   r(   ranger,   r1   r   r   update_generate_fixed_inputr   appendfinalizejoin)	r6   r?   r@   roundsoutputr_binihcounterr   r   r   derivea   s&   


z_KBKDFDeriver.derivec                 C   sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )NrB   r$       )
r5   r&   bytesr   r<   r.   r0   rJ   r2   r3   )r6   l_valr   r   r   rG      s   z#_KBKDFDeriver._generate_fixed_inputN)r   r   r   typingCallabler   r*   Optionalr   rS   r7   staticmethodboolr)   rQ   rG   r   r   r   r   r   !   s0    	

5	$r   c                   @   s   e Zd Z	ddejdedededeje de	deje
 d	eje
 d
eje
 dejfddZde
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 )	KBKDFHMACN	algorithmr   r   r   r   r    r!   r"   r#   backendc              
   C   s`   t |tjstdtjddlm} ||stdtj|| _	t
| j||||||||		| _d S )Nz5Algorithm supplied is not a supported hash algorithm.r   r\   z5Algorithm supplied is not a supported hmac algorithm.)r&   r
   HashAlgorithmr   r   UNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendr\   hmac_supported
_algorithmr   r,   _deriver)r6   r[   r   r   r   r   r    r!   r"   r#   r\   osslr   r   r   r7      s.   

zKBKDFHMAC.__init__r?   r9   c                 C   s   t || jS N)r   HMACrb   r6   r?   r   r   r   r,      s   zKBKDFHMAC._prfc                 C   s   | j || jjS re   )rc   rQ   rb   digest_sizerg   r   r   r   rQ      s   zKBKDFHMAC.deriveexpected_keyc                 C      t | ||std S re   r	   bytes_eqrQ   r   r6   r?   ri   r   r   r   verify      zKBKDFHMAC.verifyre   )r   r   r   r
   r^   r   r*   rU   rW   r   rS   Anyr7   r   rf   r,   rQ   rn   r   r   r   r   rZ      s4    	

+rZ   c                   @   s   e Zd Z	ddedededeje dedeje deje d	eje d
ej	fddZ
de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 )	KBKDFCMACNr   r   r   r   r    r!   r"   r#   r\   c              
   C   sP   t |tjrt |tjstdtj|| _d | _t	| j
||||||||		| _d S )N7Algorithm supplied is not a supported cipher algorithm.)
issubclassr   BlockCipherAlgorithmCipherAlgorithmr   r   UNSUPPORTED_CIPHERrb   _cipherr   r,   rc   )r6   r[   r   r   r   r   r    r!   r"   r#   r\   r   r   r   r7      s,   

zKBKDFCMAC.__init___r9   c                 C   s   | j d usJ t| j S re   )rw   r   CMAC)r6   rx   r   r   r   r,      s   zKBKDFCMAC._prfr?   c                 C   sT   |  || _| jd usJ ddlm} || jstdtj| j	|| jj
d S )Nr   r]   rr   rB   )rb   rw   r`   r\   cmac_algorithm_supportedr   r   rv   rc   rQ   
block_size)r6   r?   rd   r   r   r   rQ      s   zKBKDFCMAC.deriveri   c                 C   rj   re   rk   rm   r   r   r   rn      ro   zKBKDFCMAC.verifyre   )r   r   r   r   r*   rU   rW   r   rS   rp   r7   r   ry   r,   rQ   rn   r   r   r   r   rq      s0    	

$rq   )rU   cryptographyr   cryptography.exceptionsr   r   r   r   cryptography.hazmat.primitivesr   r   r	   r
   r   "cryptography.hazmat.primitives.kdfr   Enumr   r   r   rZ   rq   r   r   r   r   <module>   s   m7