o
    c                      @   sL  d dl Z d dlmZ e jr+d 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ddefd	d
ZdeddfddZdddededede je dedefddZdddeddfddZdddeddfddZdddedefddZdddddedede je d edefd!d"Zdddddedede je d edefd#d$ZdS )%    N)
InvalidTag)BackendAESCCMAESGCMAESOCB3AESSIVChaCha20Poly1305   cipher_AEAD_TYPESreturnc                 C   s   ddl m}m}m}m}m} t| |rdS t| |r(dt| jd  d	dS t| |r;dt| jd  d	dS t| |rPdt| jd d	  d
	dS t| |sWJ dt| jd  d	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)r   r   r   r   r   r	    r   Musr/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/aead.py_aead_cipher_name   s   



 r   cipher_namebackendr   c                 C   sl   |  dr%|j|jj| |jj}|||jjk |j||jj}|S |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"   keynoncetagtag_len	operationc              
   C   sj  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rt|d us_J | j|| jjt||}	| 
|	dk n|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_DECRYPTZEVP_CTRL_AEAD_SET_TAGr   from_buffer)r   r   r#   r$   r%   r&   r'   r!   ctxresZ	nonce_ptrZkey_ptrr   r   r   _aead_setupB   sX   
	



r/   data_lenc                 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   
   r5   associated_datac                 C   s:   | j d}| j|| j j||t|}| |dk d S r1   )r   r3   r   r4   r   r   r   )r   r-   r7   outlenr.   r   r   r   _process_aad   r6   r9   datac                 C   sd   | j d}| j dt|}| j||||t|}|dkr%|   t| j ||d d d  S )Nr2   unsigned char[]r   )r   r3   r   r   r4   _consume_errorsr   buffer)r   r-   r:   r8   bufr.   r   r   r   _process_data   s   r?   
tag_lengthc                 C   s2  ddl m}m} t|}t| ||j|d |t}	t||r$t| |	t	| |D ]}
t
| |	|
 q&t| |	|}| 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 )Nr   r   r   r2   r;      )r   r   r   r   r/   r   r)   r   r5   r   r9   r?   r   r3   r   EVP_CipherFinal_exr   r=   r*   ZEVP_CTRL_AEAD_GET_TAG)r   r   r$   r:   r7   r@   r   r   r   r-   adprocessed_datar8   r>   r.   Ztag_bufr%   r   r   r   _encrypt   s2   

rF   c                 C   s  ddl m}m} t||k rtt||r"|d | }||d  }n|| d  }|d |  }t|}	t| |	|j|||t	}
t||rLt
| |
t| |D ]}t| |
| qNt||r| jd}| jdt|}| j|
|||t|}|dkr|   t| j||d d d  }|S t| |
|}| jd}| jdd}| j|
||}|| j||d d d  7 }|dkr|   t|S )Nr   rA   r2   r;   r
   rB   )r   r   r   r   r   r   r   r/   r   r+   r5   r9   r   r3   r   r4   r<   r=   r?   rC   )r   r   r$   r:   r7   r@   r   r   r%   r   r-   rD   r8   r>   r.   rE   r   r   r   _decrypt   sD   


rG   )typingZcryptography.exceptionsr   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r   r   r   r   r   r	   Unionr   r)   r+   bytesr   r"   Optionalr(   r/   r5   r9   r?   ListrF   rG   r   r   r   r   <module>   sx   
8
/