a
    ϏPfp#                     @  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   i/var/www/html/python-backend/venv/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  sp  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 rtd|s|	r|
rtd|d u s| |std	|d u r|
d u rtd
|d urt|tst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 integer    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__%   sZ    



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+   n   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rt	d|d | j }|| jd  }td|d D ]@}	| |}
t|	| j}|| | }|
| ||
  qd|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   derivex   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
    I	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 )N7Algorithm 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    :