o
    5Wc%                     @   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 )ModeZctrN)__name__
__module____qualname__ZCounterMode r   r   JD:\Flask\env\Lib\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                   @   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   Z_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)r6   Z	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 )	Nr<   Tr"   r8         zThere are too many iterations.z"break_location offset > len(fixed))r2   r   r   Z_check_bytesliker+   r:   r,   powr;   r&   _generate_fixed_inputr.   r   r   r   r$   r/   r'   ranger)   updateappendfinalizejoin)r4   r<   r=   roundsoutputZr_binr!   Zdata_before_ctrZdata_after_ctrihcounterZ
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 )Nr?   r"       )
r3   r$   bytesr   r:   r+   r-   rF   r0   r1   )r4   Zl_valr   r   r   rA      s   z#_KBKDFDeriver._generate_fixed_inputN)r   r   r   typingCallabler   r'   Optionalr   rN   r5   staticmethodboolr(   rL   rA   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   rW   z5Algorithm supplied is not a supported hmac algorithm.)r$   r
   HashAlgorithmr   r   ZUNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendrW   Zhmac_supported
_algorithmr   r)   _deriver)r4   rV   r   r   r   r   r   r   r    r!   rW   r   osslr   r   r   r5      s0   

zKBKDFHMAC.__init__r<   r7   c                 C   s   t || jS N)r   HMACr[   r4   r<   r   r   r   r)      s   zKBKDFHMAC._prfc                 C   s   | j || jjS r^   )r\   rL   r[   digest_sizer`   r   r   r   rL      s   zKBKDFHMAC.deriveexpected_keyc                 C      t | ||std S r^   r	   Zbytes_eqrL   r   r4   r<   rb   r   r   r   verify      zKBKDFHMAC.verifyr^   )r   r   r   r
   rY   r   r'   rO   rQ   r   rN   Anyr5   r   r_   r)   rL   rf   r   r   r   r   rT      s<    	

.rT   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 )	KBKDFCMACNrU   r   r   r   r   r   r   r    r!   rW   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\   )r4   rV   r   r   r   r   r   r   r    r!   rW   r   r   r   r   r5      s.   

zKBKDFCMAC.__init___r7   c                 C   s   | j d usJ t| j S r^   )rm   r   CMAC)r4   rn   r   r   r   r)     s   zKBKDFCMAC._prfr<   c                 C   sT   |  || _| jd usJ ddlm} || jstdtj| j	|| jj
d S )Nr   rX   rj   r?   )r[   rm   rZ   rW   Zcmac_algorithm_supportedr   r   rl   r\   rL   
block_size)r4   r<   r]   r   r   r   rL     s   zKBKDFCMAC.deriverb   c                 C   rc   r^   rd   re   r   r   r   rf   '  rg   zKBKDFCMAC.verifyr^   )r   r   r   r   r'   rO   rQ   r   rN   rh   r5   r   ro   r)   rL   rf   r   r   r   r   ri      s8    	

'ri   )rO   Zcryptographyr   Zcryptography.exceptionsr   r   r   r   Zcryptography.hazmat.primitivesr   r   r	   r
   r   Z"cryptography.hazmat.primitives.kdfr   Enumr   r   r   rT   ri   r   r   r   r   <module>   s    :