o
    b[                      @   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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)_get_backend)BackendCMACBackendHMACBackend)cipherscmacconstant_timehasheshmac)KeyDerivationFunctionc                   @   s   e Zd ZdZdS )ModeZctrN)__name__
__module____qualname__ZCounterMode r   r   g/var/www/secure340b-portal/env/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 )CounterLocationZbefore_fixedZ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   Z	value_binr   r   r   r)   ]   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   Z_check_bytesliker.   r<   r/   powr=   r(   ranger,   r1   r   r   update_generate_fixed_inputr   appendfinalizejoin)	r6   r>   r?   roundsoutputZr_binihcounterr   r   r   deriveg   s&   


z_KBKDFDeriver.derivec                 C   sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )NrA   r$       )
r5   r&   bytesr   r<   r.   r0   rH   r2   r3   )r6   Zl_valr   r   r   rE      s   z#_KBKDFDeriver._generate_fixed_inputN)r   r   r   typingCallabler   r*   Optionalr   rP   r7   staticmethodboolr)   rN   rE   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e fddZde
fddZ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   sx   t |
}
t|
tstdtjt|tjstdtj|
	|s&tdtj|| _
|
| _t| j||||||||		| _d S )Nz.Backend object does not implement HMACBackend.z5Algorithm supplied is not a supported hash algorithm.z5Algorithm supplied is not a supported hmac algorithm.)r   r&   r
   r   r   BACKEND_MISSING_INTERFACEr   HashAlgorithmZUNSUPPORTED_HASHZhmac_supported
_algorithm_backendr   r,   _deriverr6   rW   r   r   r   r   r    r!   r"   r#   rX   r   r   r   r7      s:   


zKBKDFHMAC.__init__r>   c                 C   s   t j|| j| jdS N)rX   )r   HMACr[   r\   r6   r>   r   r   r   r,      s   zKBKDFHMAC._prfr9   c                 C   s   | j || jjS N)r]   rN   r[   digest_sizera   r   r   r   rN      s   zKBKDFHMAC.deriveexpected_keyc                 C      t | ||std S rb   r   Zbytes_eqrN   r   r6   r>   rd   r   r   r   verify      zKBKDFHMAC.verifyrb   )r   r   r   r   rZ   r   r*   rQ   rS   r   rP   r   r7   r,   rN   rh   r   r   r   r   rV      s4    	

/rV   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e	 fddZ
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 )	KBKDFCMACNr   r   r   r   r    r!   r"   r#   rX   c              
   C   st   t |
}
t|
tstdtjt|tjrt|tj	s!tdtj
|| _|
| _d | _t| j||||||||		| _d S )Nz.Backend object does not implement CMACBackend.7Algorithm supplied is not a supported cipher algorithm.)r   r&   r	   r   r   rY   
issubclassr   ZBlockCipherAlgorithmZCipherAlgorithmUNSUPPORTED_CIPHERr[   r\   _cipherr   r,   r]   r^   r   r   r   r7      s:   


zKBKDFCMAC.__init___c                 C   s    | j d usJ tj| j | jdS r_   )rn   r   ZCMACr\   )r6   ro   r   r   r   r,      s   zKBKDFCMAC._prfr>   r9   c                 C   sJ   |  || _| jd usJ | j| jstdtj| j|| jj	d S )Nrk   rA   )
r[   rn   r\   Zcmac_algorithm_supportedr   r   rm   r]   rN   
block_sizera   r   r   r   rN     s   zKBKDFCMAC.deriverd   c                 C   re   rb   rf   rg   r   r   r   rh     ri   zKBKDFCMAC.verifyrb   )r   r   r   r   r*   rQ   rS   r   rP   r   r7   r,   rN   rh   r   r   r   r   rj      s0    	

,rj   )rQ   Zcryptographyr   Zcryptography.exceptionsr   r   r   r   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr   r	   r
   Zcryptography.hazmat.primitivesr   r   r   r   r   Z"cryptography.hazmat.primitives.kdfr   Enumr   r   r   rV   rj   r   r   r   r   <module>   s   m;