o
    Z2h#                     @  s   d dl mZ d dlZd dlm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)Callable)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   y/home/skpark/git/infrasmart_work/infrasmart/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prfr   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   r   s   
z _KBKDFDeriver._valid_byte_lengthkey_materialutils.Bufferprf_output_sizebytesc                 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 )NrM   r,       )
r=   r.   rK   r   rE   r5   r7   rU   r:   r;   )r>   l_valr   r   r   rP      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   rK   )rA   rK   )r   r   r   r?   staticmethodr1   r_   rP   r   r   r   r   r   %   s    
L
	2r   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   rg   z5Algorithm supplied is not a supported hmac algorithm.)r.   r   HashAlgorithmr   r   UNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendrg   hmac_supported
_algorithmr   r3   _deriver)r>   re   r    r!   r#   r$   r&   r(   r*   r+   rg   r'   osslr   r   r   r?      s0   

zKBKDFHMAC.__init__rH   rK   rA   	hmac.HMACc                 C  s   t || jS N)r   HMACrn   r>   rH   r   r   r   r3      s   zKBKDFHMAC._prfrI   c                 C  s   | j || jjS rr   )ro   r_   rn   digest_sizert   r   r   r   r_      s   zKBKDFHMAC.deriveexpected_keyNonec                 C     t | ||std S rr   r   bytes_eqr_   r   r>   rH   rv   r   r   r   verify      zKBKDFHMAC.verifyrr   )re   rf   r    r   r!   r"   r#   r"   r$   r%   r&   r   r(   r)   r*   r)   r+   r)   rg   rh   r'   r%   )rH   rK   rA   rq   rH   rI   rA   rK   rH   rK   rv   rK   rA   rw   r   r   r   r?   r3   r_   r|   r   r   r   r   rc      s    
.
rc   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 )(	KBKDFCMACNrd   r    r   r!   r"   r#   r$   r%   r&   r   r(   r)   r*   r+   rg   rh   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_CIPHERrn   _cipherr   r3   ro   )r>   re   r    r!   r#   r$   r&   r(   r*   r+   rg   r'   r   r   r   r?      s.   

zKBKDFCMAC.__init___rK   rA   	cmac.CMACc                 C  s   | j d usJ t| j S rr   )r   r
   CMAC)r>   r   r   r   r   r3     s   zKBKDFCMAC._prfrH   rI   c                 C  sT   |  || _| jd usJ ddlm} || jstdtj| j	|| jj
d S )Nr   ri   r   rM   )rn   r   rl   rg   cmac_algorithm_supportedr   r   r   ro   r_   
block_size)r>   rH   rp   r   r   r   r_     s   zKBKDFCMAC.deriverv   rw   c                 C  rx   rr   ry   r{   r   r   r   r|   /  r}   zKBKDFCMAC.verifyrr   )r    r   r!   r"   r#   r"   r$   r%   r&   r   r(   r)   r*   r)   r+   r)   rg   rh   r'   r%   )r   rK   rA   r   r~   r   r   r   r   r   r   r      s    
'
r   )
__future__r   typingcollections.abcr   cryptographyr   cryptography.exceptionsr   r   r   r   cryptography.hazmat.primitivesr	   r
   r   r   r   "cryptography.hazmat.primitives.kdfr   Enumr   r   r   rc   r   r   r   r   r   <module>   s    :