o
    ˷e                      @   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   `/var/www/ideatree/venv/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_libEVP_CIPHER_fetch_ffiNULLopenssl_assertgcEVP_CIPHER_free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   EVP_CIPHER_CTX_newr   r!   EVP_CIPHER_CTX_freeEVP_CipherInit_exr   int_ENCRYPTr    EVP_CIPHER_CTX_set_key_lengthr   EVP_CIPHER_CTX_ctrlEVP_CTRL_AEAD_SET_IVLEN_DECRYPTEVP_CTRL_AEAD_SET_TAGr   from_buffer)r   r   r&   r'   r(   r)   r*   r$   ctxres	nonce_ptr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   r6   r;   intptrr7   r   r   r   _set_lengthz   
   rA   associated_datac                 C   s:   | j d}| j|| j j||t|}| |dk d S r<   )r   r>   r   r?   r   r   r    )r   r6   rC   outlenr7   r   r   r   _process_aad   rB   rE   datac                 C   sd   | j d}| j dt|}| j||||t|}|dkr%|   t| j ||d d d  S )Nr=   unsigned char[]r   )r   r>   r   r   r?   _consume_errorsr   buffer)r   r6   rF   rD   bufr7   r   r   r   _process_data   s   rK   
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   r=   rG      )r   r   r   r   r:   r   r/   r   rA   r   rE   rK   r   r>   r   EVP_CipherFinal_exr    rI   r1   EVP_CTRL_AEAD_GET_TAG)r   r   r'   rF   rC   rL   r   r   r   r6   adprocessed_datarD   rJ   r7   tag_bufr(   r   r   r   _encrypt   s2   

rT   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   rM   r=   rG   r
   rN   )r   r   r   r   r   r   r   r:   r   r3   rA   rE   r   r>   r   r?   rH   rI   rK   rO   )r   r   r'   rF   rC   rL   r   r   r(   r   r6   rQ   rD   rJ   r7   rR   r   r   r   _decrypt   sD   


rU   )typingcryptography.exceptionsr   TYPE_CHECKING,cryptography.hazmat.backends.openssl.backendr   r   r   r   r   r   r	   Unionr   r/   r3   bytesr   r%   Optionalr.   r:   rA   rE   rK   ListrT   rU   r   r   r   r   <module>   sx   
8
/