U
    ʹh#                     @  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   N./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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 rtd|s|	r|
rtd|d ks| 	|std	|d kr|
d krtd
|d k	rt|tst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rt	d|d | j }|| jd  }td|d D ]@}	| |}
t|	| j}|| | }|
| ||
  qd|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hZ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-   rT   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:   rZ   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   ZHMACr^   r:   rE   r   r   r   r/      s    zKBKDFHMAC._prfrC   c                 C  s   | j || jjS rb   )r_   rT   r^   Zdigest_sizerc   r   r   r   rT      s    zKBKDFHMAC.deriveNonerE   expected_keyr>   c                 C  s   t | ||std S rb   r   Zbytes_eqrT   r   r:   rE   rf   r   r   r   verify   s    zKBKDFHMAC.verify)Nr   r   r   r;   r/   rT   ri   r   r   r   r   rW      s    &.rW   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 )	KBKDFCMACNrX   r   r   r   r   r   rY   )
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 )N7Algorithm supplied is not a supported cipher algorithm.)
issubclassr	   ZBlockCipherAlgorithmZCipherAlgorithmr   r   UNSUPPORTED_CIPHERr^   _cipherr   r/   r_   )r:   rZ   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 rb   )ro   r)   r
   ZCMAC)r:   rp   r   r   r   r/     s    zKBKDFCMAC._prfrC   ra   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\   rl   rH   )r^   ro   r)   r]   r[   Zcmac_algorithm_supportedr   r   rn   r_   rT   Z
block_size)r:   rE   r`   r   r   r   rT     s    zKBKDFCMAC.deriverd   re   c                 C  s   t | ||std S rb   rg   rh   r   r   r   ri   -  s    zKBKDFCMAC.verify)Nrj   r   r   r   r   rk      s    $'rk   )Z
__future__r   typingZ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   rW   rk   r   r   r   r   <module>   s    :