U
    c6{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   úL/tmp/pip-unpacked-wheel-6eg_dtv9/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 )Ú_KBKDFDeriverr   r   Úintú
int | Noner   úbytes | None)
ÚprfÚmodeÚlengthÚrlenÚllenÚlocationÚbreak_locationÚlabelÚcontextÚfixedc                 C  s‚  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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 integerzllen must be non-zeroó    r$   r%   F)ÚcallableÚAssertionErrorÚ
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o4d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úutils.BufferÚ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 )	NrE   Tr'   r?   é   é   zThere are too many iterations.z"break_location offset > len(fixed))r8   r   r   Z_check_bytesliker1   rA   r2   ÚpowrB   r,   Ú_generate_fixed_inputr4   r   r   r   r*   r5   r   Úranger/   ÚupdateÚappendÚfinalizeÚjoin)r:   rE   rF   ÚroundsÚoutputZr_binr&   Zdata_before_ctrZdata_after_ctrÚiÚhÚcounterZ
input_datar   r   r   Úderivez   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 )NrH   r'   ó    )
r9   r*   rD   r   rA   r1   r3   rO   r6   r7   )r:   Zl_valr   r   r   rJ   ¬   s    z#_KBKDFDeriver._generate_fixed_inputN)r   r   r   r;   Ústaticmethodr-   rU   rJ   r   r   r   r   r   %   s
    L2r   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   ©r\   z5Algorithm supplied is not a supported hmac algorithm.)r*   r   ZHashAlgorithmr   r   ZUNSUPPORTED_HASHÚ,cryptography.hazmat.backends.openssl.backendr\   Zhmac_supportedÚ
_algorithmr   r/   Ú_deriver)r:   r[   r   r   r    r!   r"   r$   r%   r&   r\   r#   Úosslr   r   r   r;   ¶   s0    þ
þözKBKDFHMAC.__init__rD   z	hmac.HMAC©rE   r>   c                 C  s   t  || j¡S ©N)r   ÚHMACr_   ©r:   rE   r   r   r   r/   ä   s    zKBKDFHMAC._prfrC   c                 C  s   | j  || jj¡S rc   )r`   rU   r_   Údigest_sizere   r   r   r   rU   ç   s    zKBKDFHMAC.deriveÚNone©rE   Úexpected_keyr>   c                 C  s   t  |  |¡|¡st‚d S rc   ©r   Zbytes_eqrU   r   ©r:   rE   ri   r   r   r   Úverifyê   s    zKBKDFHMAC.verify)N©r   r   r   r;   r/   rU   rl   r   r   r   r   rX   µ   s    õó&.rX   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 )Ú	KBKDFCMACNrY   r   r   r   r   r   rZ   )
r   r   r    r!   r"   r$   r%   r&   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`   )r:   r[   r   r   r    r!   r"   r$   r%   r&   r\   r#   r   r   r   r;   ð   s0     ÿ
þþözKBKDFCMAC.__init__rD   z	cmac.CMAC)Ú_r>   c                 C  s   | j d k	st‚t | j ¡S rc   )rr   r)   r
   ZCMAC)r:   rs   r   r   r   r/     s    zKBKDFCMAC._prfrC   rb   c                 C  sT   |   |¡| _| jd k	st‚ddlm} | | j¡s>tdtjƒ‚| j	 
|| jjd ¡S )Nr   r]   ro   rH   )r_   rr   r)   r^   r\   Zcmac_algorithm_supportedr   r   rq   r`   rU   Ú
block_size)r:   rE   ra   r   r   r   rU     s    þzKBKDFCMAC.deriverg   rh   c                 C  s   t  |  |¡|¡st‚d S rc   rj   rk   r   r   r   rl   -  s    zKBKDFCMAC.verify)Nrm   r   r   r   r   rn   ï   s    õó$'rn   )Ú
__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   rX   rn   r   r   r   r   Ú<module>   s    :