a
    còfº#  ã                   @  s¶   d dl mZ 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 )é    )ÚannotationsN)Ú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   úe/home/httpd/docs/test/DocsMgr/lib/python3.9/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ddddddddddœ
dd	„Zedd
dœdd„ƒZddddœdd„Zddœdd„ZdS )Ú_KBKDFDeriverztyping.Callabler   Úintú
int | Noner   úbytes | None)
ÚprfÚmodeÚlengthÚrlenÚllenÚlocationÚbreak_locationÚlabelÚcontextÚfixedc                 C  s‚  t |ƒsJ ‚t|tƒstdƒ‚t|tƒs0tdƒ‚|d u rJ|tju rJtdƒ‚|d urd|tjkrdtdƒ‚|d ur~t|tƒs~tdƒ‚|d ur–|dk r–tdƒ‚|sž|	rª|
rªtdƒ‚|d u s¼|  |¡sÄtd	ƒ‚|d u rÜ|
d u rÜt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   Ú_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__Úbool)Ú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)r;   Z	value_binr   r   r   r+   q   s    
z _KBKDFDeriver._valid_byte_lengthÚbytes)Úkey_materialÚprf_output_sizer<   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 )	NrB   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   rB   rC   ÚroundsÚoutputZr_binr%   Zdata_before_ctrZdata_after_ctrÚiÚhÚcounterZ
input_datar   r   r   Úderive{   s>    ÿþ

z_KBKDFDeriver.derive)r<   c                 C  sB   | j rt| j tƒr| j S t | jd | j¡}d | jd| j	|g¡S )NrE   r&   ó    )
r7   r(   rA   r   r?   r/   r1   rL   r4   r5   )r8   Zl_valr   r   r   rG   «   s    z#_KBKDFDeriver._generate_fixed_inputN)r   r   r   r9   Ústaticmethodr+   rR   rG   r   r   r   r   r   $   s
    L	0r   c                   @  sh   e Zd Zdddœdddddddddd	dd
œdd„Zdddœdd„Zdddœdd„Zddddœdd„ZdS )Ú	KBKDFHMACN©r"   zhashes.HashAlgorithmr   r   r   r   r   ú
typing.Any)Ú	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   ZHashAlgorithmr   r   ZUNSUPPORTED_HASHÚ,cryptography.hazmat.backends.openssl.backendrY   Zhmac_supportedÚ
_algorithmr   r-   Ú_deriver)r8   rX   r   r   r   r    r!   r#   r$   r%   rY   r"   Úosslr   r   r   r9   µ   s0    þ
þözKBKDFHMAC.__init__rA   z	hmac.HMAC©rB   r<   c                 C  s   t  || j¡S ©N)r   ÚHMACr\   ©r8   rB   r   r   r   r-   ã   s    zKBKDFHMAC._prfc                 C  s   | j  || jj¡S r`   )r]   rR   r\   Údigest_sizerb   r   r   r   rR   æ   s    zKBKDFHMAC.deriveÚNone©rB   Úexpected_keyr<   c                 C  s   t  |  |¡|¡st‚d S r`   ©r
   Zbytes_eqrR   r   ©r8   rB   rf   r   r   r   Úverifyé   s    zKBKDFHMAC.verify)N©r   r   r   r9   r-   rR   ri   r   r   r   r   rU   ´   s    õó&.rU   c                   @  sf   e Zd Zdddœddddddddddd	œ
d
d„Zdddœdd„Zdddœdd„Zddddœdd„ZdS )Ú	KBKDFCMACNrV   r   r   r   r   r   rW   )
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]   )r8   rX   r   r   r   r    r!   r#   r$   r%   rY   r"   r   r   r   r9   ï   s.    ÿ
þþözKBKDFCMAC.__init__rA   z	cmac.CMAC)Ú_r<   c                 C  s   | j d usJ ‚t | j ¡S r`   )ro   r	   ZCMAC)r8   rp   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   rZ   rl   rE   )r\   ro   r[   rY   Zcmac_algorithm_supportedr   r   rn   r]   rR   Ú
block_size)r8   rB   r^   r   r   r   rR     s    þzKBKDFCMAC.deriverd   re   c                 C  s   t  |  |¡|¡st‚d S r`   rg   rh   r   r   r   ri   ,  s    zKBKDFCMAC.verify)Nrj   r   r   r   r   rk   î   s    õó$'rk   )Ú
__future__r   ÚtypingZcryptographyr   Zcryptography.exceptionsr   r   r   r   Zcryptography.hazmat.primitivesr   r	   r
   r   r   Z"cryptography.hazmat.primitives.kdfr   ÚEnumr   r   r   rU   rk   r   r   r   r   Ú<module>   s    :