o
    bi#                     @  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 )ModeZctrN)__name__
__module____qualname__ZCounterMode r   r   b/home/kim/smarthome/.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 )CounterLocationZbefore_fixedZafter_fixedZ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  s:   t | ts	tdtd| }dt|  kodkS   S )Nzvalue must be of type int      )r)   r   r*   r   int_to_byteslen)r;   Z	value_binr   r   r   r,   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 )	NrB   Tr'   r>         zThere are too many iterations.z"break_location offset > len(fixed))r7   r   r   Z_check_bytesliker0   r@   r1   powrA   r+   _generate_fixed_inputr3   r   r   r   r)   r4   r   ranger.   updateappendfinalizejoin)r9   rB   rD   roundsoutputZr_binr&   Zdata_before_ctrZdata_after_ctrihcounterZ
input_datar   r   r   derivez   s<   

z_KBKDFDeriver.derivec                 C  sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )NrG   r'       )
r8   r)   rE   r   r@   r0   r2   rN   r5   r6   )r9   Zl_valr   r   r   rI      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   r<   r=   )rB   rC   rD   r   r<   rE   )r<   rE   )r   r   r   r:   staticmethodr,   rT   rI   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   r[   z5Algorithm supplied is not a supported hmac algorithm.)r)   r   ZHashAlgorithmr   r   ZUNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendr[   Zhmac_supported
_algorithmr   r.   _deriver)r9   rY   r   r   r   r   r!   r#   r%   r&   r[   r"   osslr   r   r   r:      s0   

zKBKDFHMAC.__init__rB   rE   r<   	hmac.HMACc                 C  s   t || jS N)r   HMACr_   r9   rB   r   r   r   r.      s   zKBKDFHMAC._prfrC   c                 C  s   | j || jjS rc   )r`   rT   r_   digest_sizere   r   r   r   rT      s   zKBKDFHMAC.deriveexpected_keyNonec                 C     t | ||std S rc   r   Zbytes_eqrT   r   r9   rB   rg   r   r   r   verify      zKBKDFHMAC.verifyrc   )rY   rZ   r   r   r   r   r   r   r   r    r!   r   r#   r$   r%   r$   r&   r$   r[   r\   r"   r    )rB   rE   r<   rb   rB   rC   r<   rE   rB   rE   rg   rE   r<   rh   r   r   r   r:   r.   rT   rl   r   r   r   r   rW      s    
.
rW   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 )(	KBKDFCMACNrX   r   r   r   r   r   r   r    r!   r   r#   r$   r%   r&   r[   r\   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	   ZBlockCipherAlgorithmZCipherAlgorithmr   r   UNSUPPORTED_CIPHERr_   _cipherr   r.   r`   )r9   rY   r   r   r   r   r!   r#   r%   r&   r[   r"   r   r   r   r:      s.   

zKBKDFCMAC.__init___rE   r<   	cmac.CMACc                 C  s   | j d usJ t| j S rc   )ru   r
   ZCMAC)r9   rv   r   r   r   r.     s   zKBKDFCMAC._prfrB   rC   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   rG   )r_   ru   r^   r[   Zcmac_algorithm_supportedr   r   rt   r`   rT   
block_size)r9   rB   ra   r   r   r   rT     s   zKBKDFCMAC.deriverg   rh   c                 C  ri   rc   rj   rk   r   r   r   rl   -  rm   zKBKDFCMAC.verifyrc   )r   r   r   r   r   r   r   r    r!   r   r#   r$   r%   r$   r&   r$   r[   r\   r"   r    )rv   rE   r<   rw   rn   ro   rp   r   r   r   r   rq      s    
'
rq   )
__future__r   typingcollections.abcr   Zcryptographyr   Zcryptography.exceptionsr   r   r   r   Zcryptography.hazmat.primitivesr	   r
   r   r   r   Z"cryptography.hazmat.primitives.kdfr   Enumr   r   r   rW   rq   r   r   r   r   <module>   s    :