o
    
cf&                     @   s  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dde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eddfddZdededd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ded#ed e je d&ed'e jdefd(d)Z	d,ddddded#ed e je d&ed'e j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   V/opt/certbot/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_cipher1   s   
r%   keyc                 C   s|   | j  }| || jjk | j|| j j}t|}t|| }| j	|}| j 
||| jj|| jjd}| |dk |S Nr   )r   EVP_CIPHER_CTX_newr    r   r   r!   EVP_CIPHER_CTX_freer   r%   from_bufferEVP_CipherInit_ex)r   r   r&   ctxr   r$   key_ptrresr   r   r   _aead_create_ctxA   s    

r/   noncetagtag_len	operationc              
   C   s.  t || }| j }| j|| jj}| j||| jj| jj| jjt|t	k}	| 
|	dk | j|| jjt|| jj}	| 
|	dk |tkrV|d usOJ t| || n|dro| 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   r(   r   r!   r)   r+   r   int_ENCRYPTr    EVP_CIPHER_CTX_ctrlEVP_CTRL_AEAD_SET_IVLENr   _DECRYPT_set_tagr   EVP_CTRL_AEAD_SET_TAGr*   )r   r   r&   r0   r1   r2   r3   r$   r,   r.   	nonce_ptrr-   r   r   r   _aead_setupX   sN   
	



r<   c                 C   s,   | j || j jt||}| |dk d S r'   )r   r6   r:   r   r    )r   r,   r1   r.   r   r   r   r9      s   r9   c              
   C   sH   | j |}| j|| j j| j j| j j|t|tk}| |dk d S r'   )r   r*   r   r+   r   r4   r5   r    )r   r,   r0   r3   r;   r.   r   r   r   _set_nonce_operation   s   
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,   r>   intptrr.   r   r   r   _set_length   
   rD   associated_datac                 C   s:   | j d}| j|| j j||t|}| |dk d S r?   )r   rA   r   rB   r   r   r    )r   r,   rF   outlenr.   r   r   r   _process_aad   rE   rH   datac                 C   sd   | j d}| j dt|}| j||||t|}|dkr%|   t| j ||d d d  S )Nr@   unsigned char[]r   )r   rA   r   r   rB   _consume_errorsr   buffer)r   r,   rI   rG   bufr.   r   r   r   _process_data   s   rN   
tag_lengthr,   c                 C   sJ  ddl m}m} |d u rt|}	t| |	|j|d |t}nt| ||t t||r0t	| |t
| |D ]}
t| ||
 q2t| ||}| 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@   rJ      )r   r   r   r   r<   r   r5   r=   r   rD   r   rH   rN   r   rA   r   EVP_CipherFinal_exr    rL   r6   EVP_CTRL_AEAD_GET_TAG)r   r   r0   rI   rF   rO   r,   r   r   r   adprocessed_datarG   rM   r.   tag_bufr1   r   r   r   _encrypt   sB   	


rW   c                 C   s  ddl m}m} t||k rtt||r"|d | }	||d  }n|| d  }	|d |  }|d u rDt|}
t| |
|j||	|t	}nt
| ||t	 t| ||	 t||r^t| |t| |D ]}t| || q`t||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   rP   r@   rJ   r
   rQ   )r   r   r   r   r   r   r   r<   r   r8   r=   r9   rD   rH   r   rA   r   rB   rK   rL   rN   rR   )r   r   r0   rI   rF   rO   r,   r   r   r1   r   rT   rG   rM   r.   rU   r   r   r   _decrypt   sJ   	


rX   )N) typingcryptography.exceptionsr   TYPE_CHECKING,cryptography.hazmat.backends.openssl.backendr   r   r   r   r   r   r	   Unionr   r5   r8   bytesr   r%   r/   Optionalr4   r<   r9   r=   rD   rH   rN   ListAnyrW   rX   r   r   r   r   <module>   s   

4
A