U
    cc                      @   s  d dl Z d dlmZ e jrVd dlmZ d dlmZmZm	Z	m
Z
mZ e jeee	e
ef ZdZd Zdeddd	Zed
dddZd
eeee je eedddZd
eddddZd
eddddZd
eedddZd
deee je eedddZd
deee je eedddZdS )    N)
InvalidTag)BackendAESCCMAESGCMAESOCB3AESSIVChaCha20Poly1305   _AEAD_TYPES)cipherreturnc                 C   s   ddl m}m}m}m}m} t| |r*dS t| |rPdt| jd  d	dS t| |rvdt| jd  d	dS t| |rdt| jd d	  d
	dS t| |st
dt| jd  d	dS d S )Nr   r   s   chacha20-poly1305zaes-   z-ccmasciiz-ocb   z-sivz-gcm)+cryptography.hazmat.primitives.ciphers.aeadr   r   r   r   r	   
isinstancelen_keyencodeAssertionError)r   r   r   r   r   r	    r   c/var/www/html/project/venv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/aead.py_aead_cipher_name   s    



 r   r   )cipher_namebackendc                 C   sj   |  drH|j|jj| |jj}|||jjk |j||jj}n|j| }|||jjk |S )Ns   -siv)	endswith_libZEVP_CIPHER_fetch_ffiNULLopenssl_assertgcZEVP_CIPHER_freeZEVP_get_cipherbyname)r   r   
evp_cipherr   r   r   _evp_cipher2   s    
r#   )r   r   keynoncetagtag_len	operationc              
   C   sl  t || }| j }| j|| jj}| j||| jj| jj| jjt|t	k}	| 
|	dk | j|t|}	| 
|	dk | j|| jjt|| jj}	| 
|	dk |tkr|d k	st| j|| jjt||}	| 
|	dk n4|dr| j|| jj|| jj}	| 
|	dk | j|}
| j|}| j|| jj| jj||
t|t	k}	| 
|	dk |S )Nr   s   -ccm)r#   r   ZEVP_CIPHER_CTX_newr   r!   ZEVP_CIPHER_CTX_freeZEVP_CipherInit_exr   int_ENCRYPTr    ZEVP_CIPHER_CTX_set_key_lengthr   EVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLEN_DECRYPTr   ZEVP_CTRL_AEAD_SET_TAGr   Zfrom_buffer)r   r   r$   r%   r&   r'   r(   r"   ctxresZ	nonce_ptrZkey_ptrr   r   r   _aead_setupB   sd    	


      
r/   )r   data_lenr   c                 C   s:   | j d}| j|| j j|| j j|}| |dk d S Nint *r   )r   newr   EVP_CipherUpdater   r    )r   r-   r0   Zintptrr.   r   r   r   _set_lengthz   s        r5   )r   associated_datar   c                 C   s:   | j d}| j|| j j||t|}| |dk d S r1   )r   r3   r   r4   r   r   r    )r   r-   r6   outlenr.   r   r   r   _process_aad   s        r8   )r   datar   c                 C   sd   | j d}| j dt|}| j||||t|}|dkrJ|   t| j ||d d d  S )Nr2   unsigned char[]r   )r   r3   r   r   r4   _consume_errorsr   buffer)r   r-   r9   r7   bufr.   r   r   r   _process_data   s    r>   )r   r   r%   r9   r6   
tag_lengthr   c                 C   s8  ddl m}m} t|}t| ||j|d |t}	t||rHt| |	t	| |D ]}
t
| |	|
 qLt| |	|}| jd}| jdd}| j|	||}| |dk || j||d d d  7 }| jd|}| j|	| jj||}| |dk | j|d d  }t||r,| t	|dk || S || S d S )Nr   r   r   r2   r:      )r   r   r   r   r/   r   r*   r   r5   r   r8   r>   r   r3   r   EVP_CipherFinal_exr    r<   r+   ZEVP_CTRL_AEAD_GET_TAG)r   r   r%   r9   r6   r?   r   r   r   r-   adprocessed_datar7   r=   r.   Ztag_bufr&   r   r   r   _encrypt   sD          
   rE   c                 C   s  ddl m}m} t||k r tt||rD|d | }||d  }n|| d  }|d |  }t|}	t| |	|j|||t	}
t||rt
| |
t| |D ]}t| |
| qt||r"| jd}| jdt|}| j|
|||t|}|dkr|   t| j||d d d  }njt| |
|}| jd}| jdd}| j|
||}|| j||d d d  7 }|dkr|   t|S )Nr   r@   r2   r:   r
   rA   )r   r   r   r   r   r   r   r/   r   r,   r5   r8   r   r3   r   r4   r;   r<   r>   rB   )r   r   r%   r9   r6   r?   r   r   r&   r   r-   rC   r7   r=   r.   rD   r   r   r   _decrypt   sN    
      


rF   )typingZcryptography.exceptionsr   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r   r   r   r   r   r	   Unionr   r*   r,   bytesr   r#   Optionalr)   r/   r5   r8   r>   ListrE   rF   r   r   r   r   <module>   sL   80