3
ãdeì#  ã               @   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   ú_/var/www/agendate/envp3/lib/python3.6/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   sx  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ƒ r€tdƒ‚|d k	r˜|dk r˜tdƒ‚|s |	r¬|
r¬tdƒ‚|d ksÀ| j	|ƒ rÈtd	ƒ‚|d krà|
d kràtd
ƒ‚|d k	oòt|tƒ � rþtdƒ‚|d k�rd}|	d k�rd}	t
jd|ƒ t
j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__#   sR    




z_KBKDFDeriver.__init__)ÚvalueÚreturnc             C   sB   t | tƒstdƒ‚tjd| ƒ}dt|ƒ  ko4dkn  s>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   s:  | j r
t‚tjd|ƒ d| _ | j |  }dg}tjd| jƒ}|tdt|ƒd ƒd kr`t	dƒ‚| j
ƒ }| 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 … }xRtd|d ƒD ]@}	| j|ƒ}
tj|	| jƒ}|| | }|
j|ƒ |j|
jƒ ƒ qâW dj|ƒ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| jd | jƒ}dj| 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   >	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} |j|ƒs:tdtjƒ‚|| _	t
| j|||||||||	ƒ
| _d S )Nz5Algorithm supplied is not a supported hash algorithm.r   )rX   z5Algorithm supplied is not a supported hmac algorithm.)r%   r
   ÚHashAlgorithmr   r   ZUNSUPPORTED_HASHÚ,cryptography.hazmat.backends.openssl.backendrX   Zhmac_supportedÚ
_algorithmr   r+   Ú_deriver)r6   rW   r   r   r   r   r   r   r    r!   rX   r   Úosslr   r   r   r7   °   s*    
zKBKDFHMAC.__init__)r>   r9   c             C   s   t j|| jƒS )N)r   ÚHMACr[   )r6   r>   r   r   r   r+   Þ   s    zKBKDFHMAC._prfc             C   s   | j j|| jjƒS )N)r\   rN   r[   Údigest_size)r6   r>   r   r   r   rN   á   s    zKBKDFHMAC.derive)r>   Úexpected_keyr9   c             C   s   t j| j|ƒ|ƒst‚d S )N)r	   Úbytes_eqrN   r   )r6   r>   r`   r   r   r   Úverifyä   s    zKBKDFHMAC.verify)N)r   r   r   r
   rY   r   r(   rQ   rS   r   rP   ÚAnyr7   r   r^   r+   rN   rb   r   r   r   r   rV   ¯   s
   J!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 )Ú	KBKDFCMACN)r   )
r   r   r   r   r   r   r    r!   rX   r   c            C   sV   t |tjƒ st |tjƒ r(tdtjƒ‚|| _d | _t	| j
|||||||||	ƒ
| _d S )Nz7Algorithm supplied is not a supported cipher algorithm.)Ú
issubclassr   ZBlockCipherAlgorithmZCipherAlgorithmr   r   ÚUNSUPPORTED_CIPHERr[   Ú_cipherr   r+   r\   )r6   rW   r   r   r   r   r   r   r    r!   rX   r   r   r   r   r7   ê   s&    zKBKDFCMAC.__init__)Ú_r9   c             C   s   | j d k	st‚tj| j ƒS )N)rg   r$   r   ÚCMAC)r6   rh   r   r   r   r+     s    zKBKDFCMAC._prf)r>   r9   c             C   sT   | j |ƒ| _| jd k	st‚ddlm} |j| jƒs>tdtjƒ‚| j	j
|| jjd ƒS )Nr   )rX   z7Algorithm supplied is not a supported cipher algorithm.rA   )r[   rg   r$   rZ   rX   Zcmac_algorithm_supportedr   r   rf   r\   rN   Ú
block_size)r6   r>   r]   r   r   r   rN     s    zKBKDFCMAC.derive)r>   r`   r9   c             C   s   t j| j|ƒ|ƒst‚d S )N)r	   ra   rN   r   )r6   r>   r`   r   r   r   rb   '  s    zKBKDFCMAC.verify)N)r   r   r   r   r(   rQ   rS   r   rP   rc   r7   r   ri   r+   rN   rb   r   r   r   r   rd   é   s
   Frd   )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   rd   r   r   r   r   Ú<module>   s    :