U
    EZh#                     @   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   o/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/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ejeeeeje eeje eje	 eje	 eje	 d
ddZ
eeedddZe	ee	ddd	Ze	d
ddZdS )_KBKDFDeriver)
prfmodelengthrlenllenlocationbreak_locationlabelcontextfixedc                 C   sp  t |stt|tstdt|ts0td|d krJ|tjkrJtd|d k	rd|tjkrdtd|d k	r~t|ts~td|d k	r|dk rtd|s|	r|
rtd|d ks| 	|std	|d kr|
d krtd
|d k	rt|tstd|d krd}|	d krd}	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AssertionError
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   s@   t | tstdtd| }dt|  kr6dks<n dS dS )Nzvalue must be of type int      FT)r%   r(   r&   r   int_to_byteslen)r8   Z	value_binr   r   r   r)   l   s    
z _KBKDFDeriver._valid_byte_length)key_materialprf_output_sizer9   c                 C   s6  | j r
ttd| d| _ | j |  }dg}td| j}|tdt|d d kr`t	d| 
 }| jtjkr~d}|}nT| jtjkr|}d}n>t| jtr| jt|krt	d|d | j }|| jd  }td|d D ]@}	| |}
t|	| j}|| | }|
| ||
  qd|d | j S )	Nr>   Tr"   r:         zThere are too many iterations.z"break_location offset > len(fixed))r4   r   r   Z_check_bytesliker-   r<   r.   powr=   r'   _generate_fixed_inputr0   r   r   r   r%   r1   r(   ranger+   updateappendfinalizejoin)r6   r>   r?   roundsoutputZr_binr!   Zdata_before_ctrZdata_after_ctrihcounterZ
input_datar   r   r   derivev   s@     

z_KBKDFDeriver.derive)r9   c                 C   sB   | j rt| j tr| j S t| jd | j}d| jd| j	|gS )NrA   r"       )
r5   r%   bytesr   r<   r-   r/   rH   r2   r3   )r6   Zl_valr   r   r   rC      s    z#_KBKDFDeriver._generate_fixed_inputN)r   r   r   typingCallabler   r(   Optionalr   rP   r7   staticmethodboolr)   rN   rC   r   r   r   r   r   "   s   I	0r   c                   @   s   e Zd Zdddejeeeeje e	eje
 eje
 eje
 ejeje dddZe
ejdddZe
e
dd	d
Ze
e
dd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   rY   z5Algorithm supplied is not a supported hmac algorithm.)r%   r
   HashAlgorithmr   r   ZUNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendrY   Zhmac_supported
_algorithmr   r+   _deriver)r6   rX   r   r   r   r   r   r   r    r!   rY   r   osslr   r   r   r7      s0    
zKBKDFHMAC.__init__r>   r9   c                 C   s   t || jS N)r   HMACr]   r6   r>   r   r   r   r+      s    zKBKDFHMAC._prfc                 C   s   | j || jjS ra   )r^   rN   r]   digest_sizerc   r   r   r   rN      s    zKBKDFHMAC.deriver>   expected_keyr9   c                 C   s   t | ||std S ra   r	   Zbytes_eqrN   r   r6   r>   rf   r   r   r   verify   s    zKBKDFHMAC.verify)N)r   r   r   r
   r[   r   r(   rQ   rS   r   rP   Anyr7   r   rb   r+   rN   ri   r   r   r   r   rV      s&    .rV   c                   @   s   e Zd Zdddeeeeje eeje eje eje ej	eje d
ddZ
eejdddZeed	d
dZeeddddZdS )	KBKDFCMACNrW   )
r   r   r   r   r   r   r    r!   rY   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^   )r6   rX   r   r   r   r   r   r   r    r!   rY   r   r   r   r   r7      s0     
zKBKDFCMAC.__init__)_r9   c                 C   s   | j d k	stt| j S ra   )ro   r$   r   CMAC)r6   rp   r   r   r   r+     s    zKBKDFCMAC._prfr`   c                 C   sT   |  || _| jd k	stddlm} || js>tdtj| j	
|| jjd S )Nr   rZ   rl   rA   )r]   ro   r$   r\   rY   Zcmac_algorithm_supportedr   r   rn   r^   rN   
block_size)r6   r>   r_   r   r   r   rN     s    zKBKDFCMAC.derivere   c                 C   s   t | ||std S ra   rg   rh   r   r   r   ri   '  s    zKBKDFCMAC.verify)N)r   r   r   r   r(   rQ   rS   r   rP   rj   r7   r   rq   r+   rN   ri   r   r   r   r   rk      s$    'rk   )rQ   Zcryptographyr   Zcryptography.exceptionsr   r   r   r   Zcryptography.hazmat.primitivesr   r   r	   r
   r   Z"cryptography.hazmat.primitives.kdfr   Enumr   r   r   rV   rk   r   r   r   r   <module>   s    :