o
    Ïó·iÍ#  ã                   @  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   únC:\Users\psant\Downloads\PAF backend\school\venv\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                   @  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rƒtdƒ‚|d u r‰d}|	d u 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 integerzllen must be non-zeroó    r#   r%   F)ÚcallableÚ
isinstancer   Ú	TypeErrorr   r   Ú
ValueErrorr   Ú_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__&   s^   

ÿþÿÿ
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 )	NrA   Tr'   r=   é   é   zThere are too many iterations.z"break_location offset > len(fixed))r6   r   r   Z_check_bytesliker/   r?   r0   Úpowr@   r+   Ú_generate_fixed_inputr2   r   r   r   r)   r3   r   Úranger-   ÚupdateÚappendÚfinalizeÚjoin)r8   rA   rC   Ú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 )NrF   r'   ó    )
r7   r)   rD   r   r?   r/   r1   rM   r4   r5   )r8   Zl_valr   r   r   rH   ¬   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<   )rA   rB   rC   r   r;   rD   )r;   rD   )r   r   r   r9   Ústaticmethodr,   rS   rH   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   ©rZ   z5Algorithm supplied is not a supported hmac algorithm.)r)   r   ZHashAlgorithmr   r   ZUNSUPPORTED_HASHÚ,cryptography.hazmat.backends.openssl.backendrZ   Zhmac_supportedÚ
_algorithmr   r-   Ú_deriver)r8   rX   r   r   r   r   r!   r#   r%   r&   rZ   r"   Úosslr   r   r   r9   ¶   s0   þ
þ
özKBKDFHMAC.__init__rA   rD   r;   ú	hmac.HMACc                 C  s   t  || j¡S ©N)r   ÚHMACr^   ©r8   rA   r   r   r   r-   ä   s   zKBKDFHMAC._prfrB   c                 C  s   | j  || jj¡S rb   )r_   rS   r^   Údigest_sizerd   r   r   r   rS   ç   s   zKBKDFHMAC.deriveÚexpected_keyÚNonec                 C  ó   t  |  |¡|¡st‚d S rb   ©r   Zbytes_eqrS   r   ©r8   rA   rf   r   r   r   Úverifyê   ó   ÿzKBKDFHMAC.verifyrb   )rX   rY   r   r   r   r   r   r   r   r    r!   r   r#   r$   r%   r$   r&   r$   rZ   r[   r"   r    )rA   rD   r;   ra   ©rA   rB   r;   rD   ©rA   rD   rf   rD   r;   rg   ©r   r   r   r9   r-   rS   rk   r   r   r   r   rV   µ   s    õó
.
rV   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 )(Ú	KBKDFCMACNrW   r   r   r   r   r   r   r    r!   r   r#   r$   r%   r&   rZ   r[   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_   )r8   rX   r   r   r   r   r!   r#   r%   r&   rZ   r"   r   r   r   r9   ð   s.   ÿ
þþ
özKBKDFCMAC.__init__Ú_rD   r;   ú	cmac.CMACc                 C  s   | j d usJ ‚t | j ¡S rb   )rt   r
   ZCMAC)r8   ru   r   r   r   r-     s   zKBKDFCMAC._prfrA   rB   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\   rq   rF   )r^   rt   r]   rZ   Zcmac_algorithm_supportedr   r   rs   r_   rS   Ú
block_size)r8   rA   r`   r   r   r   rS     s   þzKBKDFCMAC.deriverf   rg   c                 C  rh   rb   ri   rj   r   r   r   rk   -  rl   zKBKDFCMAC.verifyrb   )r   r   r   r   r   r   r   r    r!   r   r#   r$   r%   r$   r&   r$   rZ   r[   r"   r    )ru   rD   r;   rv   rm   rn   ro   r   r   r   r   rp   ï   s    õó
'
rp   )Ú
__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   rV   rp   r   r   r   r   Ú<module>   s    :