o
    
c#                     @   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   U/opt/certbot/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                   @   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	 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break_locationlabelcontextfixedc                 C   sl  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 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 integer    r$   r%   F)callable
isinstancer   	TypeErrorr   r   
ValueErrorint_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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)r<   	value_binr   r   r   r-   l   s   
z _KBKDFDeriver._valid_byte_lengthkey_material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 )	NrC   Tr'   r>         zThere are too many iterations.z"break_location offset > len(fixed))r8   r   r   _check_bytesliker1   r@   r2   powrA   r+   _generate_fixed_inputr4   r   r   r   r)   r5   r,   ranger/   updateappendfinalizejoin)r:   rC   rD   roundsoutputr_binr&   data_before_ctrdata_after_ctrihcounter
input_datar   r   r   derivev   s>   

z_KBKDFDeriver.derivec                 C   sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )NrF   r'       )
r9   r)   bytesr   r@   r1   r3   rN   r6   r7   )r:   l_valr   r   r   rI      s   z#_KBKDFDeriver._generate_fixed_inputN)r   r   r   typingCallabler   r,   Optionalr   rZ   r;   staticmethodboolr-   rX   rI   r   r   r   r   r   "   s4    	

I	0r   c                   @   s   e Zd Z	dd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deje 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r#   	algorithmr   r   r    r!   r"   r$   r%   r&   backendr#   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   rd   z5Algorithm supplied is not a supported hmac algorithm.)r)   r
   HashAlgorithmr   r   UNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendrd   hmac_supported
_algorithmr   r/   _deriver)r:   rc   r   r   r    r!   r"   r$   r%   r&   rd   r#   osslr   r   r   r;      s0   

zKBKDFHMAC.__init__rC   r=   c                 C   s   t || jS N)r   HMACrj   r:   rC   r   r   r   r/      s   zKBKDFHMAC._prfc                 C   s   | j || jjS rm   )rk   rX   rj   digest_sizero   r   r   r   rX      s   zKBKDFHMAC.deriveexpected_keyc                 C      t | ||std S rm   r	   bytes_eqrX   r   r:   rC   rq   r   r   r   verify      zKBKDFHMAC.verifyrm   )r   r   r   r
   rf   r   r,   r\   r^   r   rZ   Anyr;   r   rn   r/   rX   rv   r   r   r   r   ra      s<    	

.ra   c                   @   s   e Zd Z	dd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	deje 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 )	KBKDFCMACNrb   r   r   r    r!   r"   r$   r%   r&   rd   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_CIPHERrj   _cipherr   r/   rk   )r:   rc   r   r   r    r!   r"   r$   r%   r&   rd   r#   r   r   r   r;      s.   

zKBKDFCMAC.__init___r=   c                 C   s   | j d usJ t| j S rm   )r   r   CMAC)r:   r   r   r   r   r/     s   zKBKDFCMAC._prfrC   c                 C   sT   |  || _| jd usJ ddlm} || jstdtj| j	|| jj
d S )Nr   re   rz   rF   )rj   r   rh   rd   cmac_algorithm_supportedr   r   r~   rk   rX   
block_size)r:   rC   rl   r   r   r   rX     s   zKBKDFCMAC.deriverq   c                 C   rr   rm   rs   ru   r   r   r   rv   '  rw   zKBKDFCMAC.verifyrm   )r   r   r   r   r,   r\   r^   r   rZ   rx   r;   r   r   r/   rX   rv   r   r   r   r   ry      s8    	

'ry   )r\   cryptographyr   cryptography.exceptionsr   r   r   r   cryptography.hazmat.primitivesr   r   r	   r
   r   "cryptography.hazmat.primitives.kdfr   Enumr   r   r   ra   ry   r   r   r   r   <module>   s    :