o
    Vh#                     @  s   d dl m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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 )    )annotationsN)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/html/construction_image-detection-poc/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ZdS )CounterLocationbefore_fixedafter_fixedmiddle_fixedN)r   r   r   BeforeFixed
AfterFixedMiddleFixedr   r   r   r   r      s    r   c                   @  s8   e Zd Zd ddZed!ddZd"ddZd#ddZdS )$_KBKDFDeriverprftyping.Callablemoder   lengthintrlenllen
int | Nonelocationr   break_locationlabelbytes | Nonecontextfixedc                 C  s|  t |sJ t|tstdt|tstd|d u r%|tju r%td|d ur2|tjkr2td|d ur?t|ts?td|d urK|dk rKtd|sO|	rU|
rUtd|d u s^| |sbtd	|d u rn|
d u rntd
|d ur{t|ts{td|dkrtd|d u rd}|	d u rd}	t	
d| t	
d|	 || _|| _|| _|| _|| _|| _|| _|| _|	| _d| _|
| _d S )Nzmode must be of type Modez(location must be of type CounterLocationzPlease specify a break_locationzJbreak_location is ignored when location is not CounterLocation.MiddleFixedz!break_location must be an integerr   z)break_location must be a positive integerz9When supplying fixed data, label and context are ignored.zrlen must be between 1 and 4zPlease specify an llenzllen must be an integerzllen must be non-zero    r(   r*   F)callable
isinstancer   	TypeErrorr   r   
ValueErrorr"   _valid_byte_lengthr   _check_bytes_prf_mode_length_rlen_llen	_location_break_location_label_context_used_fixed_data)selfr   r    r!   r#   r$   r&   r'   r(   r*   r+   r   r   r   __init__%   sZ   



z_KBKDFDeriver.__init__valuereturnboolc                 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)r@   	value_binr   r   r   r1   q   s   
z _KBKDFDeriver._valid_byte_lengthkey_materialbytesprf_output_sizec                 C  s6  | j rttd| d| _ | j |  }dg}td| j}|tdt|d d kr0t	d| 
 }| jtjkr?d}|}n*| jtjkrJ|}d}nt| jtr[| jt|kr[t	d|d | j }|| jd  }td|d D ] }	| |}
t|	| j}|| | }|
| ||
  qpd|d | j S )	NrH   Tr,   rC         zThere are too many iterations.z"break_location offset > len(fixed))r<   r   r   _check_bytesliker5   rE   r6   powrF   r0   _generate_fixed_inputr8   r   r   r   r.   r9   r"   ranger3   updateappendfinalizejoin)r>   rH   rJ   roundsoutputr_binr+   data_before_ctrdata_after_ctrihcounter
input_datar   r   r   derive{   s<   

z_KBKDFDeriver.derivec                 C  sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )NrL   r,       )
r=   r.   rI   r   rE   r5   r7   rT   r:   r;   )r>   l_valr   r   r   rO      s   z#_KBKDFDeriver._generate_fixed_inputN)r   r   r    r   r!   r"   r#   r"   r$   r%   r&   r   r'   r%   r(   r)   r*   r)   r+   r)   )r@   r"   rA   rB   )rH   rI   rJ   r"   rA   rI   )rA   rI   )r   r   r   r?   staticmethodr1   r^   rO   r   r   r   r   r   $   s    
L
	0r   c                   @  s>   e Zd Z	d#ddd$ddZd%ddZd&ddZd'd!d"ZdS )(	KBKDFHMACNr'   	algorithmhashes.HashAlgorithmr    r   r!   r"   r#   r$   r%   r&   r   r(   r)   r*   r+   backend
typing.Anyr'   c                C  sb   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   rf   z5Algorithm supplied is not a supported hmac algorithm.)r.   r   HashAlgorithmr   r   UNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendrf   hmac_supported
_algorithmr   r3   _deriver)r>   rd   r    r!   r#   r$   r&   r(   r*   r+   rf   r'   osslr   r   r   r?      s0   

zKBKDFHMAC.__init__rH   rI   rA   	hmac.HMACc                 C  s   t || jS N)r   HMACrm   r>   rH   r   r   r   r3      s   zKBKDFHMAC._prfc                 C  s   | j || jjS rq   )rn   r^   rm   digest_sizers   r   r   r   r^      s   zKBKDFHMAC.deriveexpected_keyNonec                 C     t | ||std S rq   r
   bytes_eqr^   r   r>   rH   ru   r   r   r   verify      zKBKDFHMAC.verifyrq   )rd   re   r    r   r!   r"   r#   r"   r$   r%   r&   r   r(   r)   r*   r)   r+   r)   rf   rg   r'   r%   )rH   rI   rA   rp   rH   rI   rA   rI   rH   rI   ru   rI   rA   rv   r   r   r   r?   r3   r^   r{   r   r   r   r   rb      s    
.
rb   c                   @  s>   e Zd Z	d"ddd#ddZd$ddZd%ddZd&d d!ZdS )'	KBKDFCMACNrc   r    r   r!   r"   r#   r$   r%   r&   r   r(   r)   r*   r+   rf   rg   r'   c                C  sR   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_CIPHERrm   _cipherr   r3   rn   )r>   rd   r    r!   r#   r$   r&   r(   r*   r+   rf   r'   r   r   r   r?      s.   

zKBKDFCMAC.__init___rI   rA   	cmac.CMACc                 C  s   | j d usJ t| j S rq   )r   r	   CMAC)r>   r   r   r   r   r3     s   zKBKDFCMAC._prfrH   c                 C  sT   |  || _| jd usJ ddlm} || jstdtj| j	|| jj
d S )Nr   rh   r   rL   )rm   r   rk   rf   cmac_algorithm_supportedr   r   r   rn   r^   
block_size)r>   rH   ro   r   r   r   r^     s   zKBKDFCMAC.deriveru   rv   c                 C  rw   rq   rx   rz   r   r   r   r{   ,  r|   zKBKDFCMAC.verifyrq   )r    r   r!   r"   r#   r"   r$   r%   r&   r   r(   r)   r*   r)   r+   r)   rf   rg   r'   r%   )r   rI   rA   r   r}   r~   r   r   r   r   r   r      s    
'
r   )
__future__r   typingcryptographyr   cryptography.exceptionsr   r   r   r   cryptography.hazmat.primitivesr   r	   r
   r   r   "cryptography.hazmat.primitives.kdfr   Enumr   r   r   rb   r   r   r   r   r   <module>   s    :