o
    e_>                     @  sJ  d dl mZ d dlZd dlmZ ejr1d 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dGddZdGddZdHddZ	dIdJddZ	dIdJddZ	dIdKd"d#ZdLd$d%ZdJd&d'ZdJd(d)Zd*Zd ZdMd+d,ZdNd.d/ZdHd0d1ZdOd5d6ZdPd8d9ZdQd:d;Z dRd=d>Z!dSd?d@Z"dTdAdBZ#	dIdJdCdDZ$	dIdJdEdFZ%dS )U    )annotationsN)
InvalidTag)BackendAESCCMAESGCMAESOCB3AESSIVChaCha20Poly1305backendr   cipher
_AEADTypesreturnboolc                 C  s   ddl m} | jjot||S )zz
    Checks whether the given cipher is supported through
    EVP_AEAD rather than the normal OpenSSL EVP_CIPHER API.
    r   r
   )+cryptography.hazmat.primitives.ciphers.aeadr
   _libCryptography_HAS_EVP_AEAD
isinstancer   r   r
    r   \/var/www/html/venv/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/aead.py_is_evp_aead_supported_cipher   s   
r   c                 C  sT   t | |rdS t|}| jr|| jvrdS |dr | jjdkS | j|| jj	kS )NTF   -siv   )
r   _evp_cipher_cipher_name_fips_enabled
_fips_aeadendswithr   #CRYPTOGRAPHY_OPENSSL_300_OR_GREATEREVP_get_cipherbyname_ffiNULL)r   r   cipher_namer   r   r   _aead_cipher_supported(   s   


r$   keybytesc                 C  s"   t | |rt| ||S t| ||S N)r   _evp_aead_create_ctx_evp_cipher_create_ctx)r   r   r%   r   r   r   _aead_create_ctx;   s   
r*   noncedataassociated_datatyping.List[bytes]
tag_lengthintctx
typing.Anyc                 C  2   t | |rt| ||||||S t| ||||||S r'   )r   _evp_aead_encrypt_evp_cipher_encryptr   r   r+   r,   r-   r/   r1   r   r   r   _encryptF      
	r7   c                 C  r3   r'   )r   _evp_aead_decrypt_evp_cipher_decryptr6   r   r   r   _decryptY   r8   r;   tag_lentyping.Optional[int]c                 C  st   t | |}|d usJ | j|}|d u r| jjn|}| j||t||}| || jjk | j	|| jj
}|S r'   )_evp_aead_get_cipherr!   from_bufferr   EVP_AEAD_DEFAULT_TAG_LENGTHCryptography_EVP_AEAD_CTX_newlenopenssl_assertr"   gcEVP_AEAD_CTX_free)r   r   r%   r<   aead_cipherkey_ptrr1   r   r   r   r(   l   s   
r(   c                 C  s$   ddl m} t||sJ | j S )Nr   r   )r   r
   r   r   EVP_aead_chacha20_poly1305r   r   r   r   r>      s   
r>   c                 C  s   |d usJ t | |}|d usJ | jd}t|| j| }	| jd|	}
| j|}| j|}d|}| j|}| j||
||	|t||t||t|
}| 	|dk | j
|
|d d d  }|S )Nsize_t *	uint8_t[]    r   r   )r>   r!   newrB   r   EVP_AEAD_max_overheadr?   joinEVP_AEAD_CTX_sealrC   buffer)r   r   r+   r,   r-   r/   r1   rF   out_lenmax_out_lenout_bufdata_ptr	nonce_ptraadaad_ptrresencrypted_datar   r   r   r4      s2   	

r4   c                 C  s   t ||k rt|d usJ | jd}t |}| jd|}	| j|}
| j|}d|}| j|}| j||	|||t ||
t ||t |
}|dkrU|   t| j	|	|d d d  }|S )NrI   rJ   rK   r   )
rB   r   r!   rL   r?   rN   r   EVP_AEAD_CTX_open_consume_errorsrP   )r   r   r+   r,   r-   r/   r1   rQ   rR   rS   rT   rU   rV   rW   rX   decrypted_datar   r   r   r9      s6   	
r9   r   c                 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)
r   r   r   r   r	   r
   r   rB   _keyencode)r   r   r   r   r	   r
   r   r   r   r      s   



 r   r#   c                 C  sl   |  dr%|j|jj| |jj}|||jjk |j||jj}|S |j| }|||jjk |S )Nr   )	r   r   EVP_CIPHER_fetchr!   r"   rC   rD   EVP_CIPHER_freer    )r#   r   
evp_cipherr   r   r   _evp_cipher   s   
re   c                 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_newrC   r!   r"   rD   EVP_CIPHER_CTX_freer   re   r?   EVP_CipherInit_ex)r   r   r%   r1   r#   rd   rG   rX   r   r   r   r)     s    

r)   tagtyping.Optional[bytes]	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)re   r   rg   r!   rD   rh   ri   r"   r0   _ENCRYPTrC   EVP_CIPHER_CTX_ctrlEVP_CTRL_AEAD_SET_IVLENrB   _DECRYPT_evp_cipher_set_tagr   EVP_CTRL_AEAD_SET_TAGr?   )r   r#   r%   r+   rj   r<   rl   rd   r1   rX   rU   rG   r   r   r   _evp_cipher_aead_setup"  sT   
	



rs   Nonec                 C  s8   | j |}| j|| jjt||}| |dk d S rf   )r!   r?   r   rn   rr   rB   rC   )r   r1   rj   tag_ptrrX   r   r   r   rq   Y  s
   rq   c              
   C  sH   | j |}| j|| j j| j j| j j|t|tk}| |dk d S rf   )r!   r?   r   ri   r"   r0   rm   rC   )r   r1   r+   rl   rU   rX   r   r   r   _evp_cipher_set_nonce_operationa  s   
rv   data_lenc                 C  s:   | j d}| j|| j j|| j j|}| |dk d S Nint *r   )r!   rL   r   EVP_CipherUpdater"   rC   )r   r1   rw   intptrrX   r   r   r   _evp_cipher_set_lengthp  s
   r|   c                 C  sF   | j d}| j |}| j|| j j||t|}| |dk d S rx   )r!   rL   r?   r   rz   r"   rB   rC   )r   r1   r-   outlen
a_data_ptrrX   r   r   r   _evp_cipher_process_aadx  s   r   c                 C  sp   | j d}| j dt|}| j |}| j||||t|}|dkr+|   t| j ||d d d  S )Nry   unsigned char[]r   )	r!   rL   rB   r?   r   rz   r[   r   rP   )r   r1   r,   r}   bufrT   rX   r   r   r   _evp_cipher_process_data  s   r   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	   ry   r      )r   r   r	   r   rs   r`   rm   rv   r   r|   rB   r   r   r!   rL   r   EVP_CipherFinal_exrC   rP   rn   EVP_CTRL_AEAD_GET_TAG)r   r   r+   r,   r-   r/   r1   r   r	   r#   adprocessed_datar}   r   rX   tag_bufrj   r   r   r   r5     sB   	


r5   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|}| 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   r   ry   r   r   r   )r   r   r	   rB   r   r   r   rs   r`   rp   rv   rq   r|   r   r!   rL   r?   r   rz   r[   rP   r   r   )r   r   r+   r,   r-   r/   r1   r   r	   rj   r#   r   r}   r   d_ptrrX   r   r   r   r   r:     sX   	



r:   )r   r   r   r   r   r   )r   r   r   r   r%   r&   r'   )r   r   r   r   r+   r&   r,   r&   r-   r.   r/   r0   r1   r2   r   r&   )r   r   r   r   r%   r&   r<   r=   )r   r   r   r   )r   r   r   r&   )r#   r&   r   r   )r   r   r#   r&   r%   r&   r+   r&   rj   rk   r<   r0   rl   r0   )rj   r&   r   rt   )r+   r&   rl   r0   r   rt   )r   r   rw   r0   r   rt   )r   r   r-   r&   r   rt   )r   r   r,   r&   r   r&   )&
__future__r   typingcryptography.exceptionsr   TYPE_CHECKING,cryptography.hazmat.backends.openssl.backendr   r   r   r   r   r	   r
   Unionr   r   r$   r*   r7   r;   r(   r>   r4   r9   rm   rp   r   re   r)   rs   rq   rv   r|   r   r   r5   r:   r   r   r   r   <module>   sH   






),




7



B