U
    ÒZjì#  ã                   @   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   úk/var/www/html/TRUCKING_PROJECT/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 r–tdƒ‚|sž|	rª|
rªtdƒ‚|d ks¼|  	|¡sÄtd	ƒ‚|d krÜ|
d krÜtd
ƒ‚|d k	röt|tƒsöt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r¶t	dƒ‚|d | j… }|| jd … }td|d ƒD ]@}	|  |¡}
t |	| j¡}|| | }|
 |¡ | |
 ¡ ¡ qàd |¡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 )Nú7Algorithm 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    :