o
    ÿÑÐbD  ã                   @   sP   d dl mZ dZd Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )é    )Ú
InvalidTagé   c                 C   sn   ddl m}m}m} t| |ƒrdS t| |ƒr#d t| jƒd ¡ d¡S t| |ƒs*J ‚d t| jƒd ¡ d¡S )Nr   )ÚAESCCMÚAESGCMÚChaCha20Poly1305s   chacha20-poly1305z
aes-{}-ccmé   Úasciiz
aes-{}-gcm)	Ú+cryptography.hazmat.primitives.ciphers.aeadr   r   r   Ú
isinstanceÚformatÚlenÚ_keyÚencode)Úcipherr   r   r   © r   úh/var/www/secure340b-portal/env/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/aead.pyÚ_aead_cipher_name   s   

r   c              
   C   sr  | j  |¡}|  || jjk¡ | 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rx| 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)Ú_libZEVP_get_cipherbynameÚopenssl_assertÚ_ffiÚNULLZEVP_CIPHER_CTX_newÚgcZEVP_CIPHER_CTX_freeZEVP_CipherInit_exÚintÚ_ENCRYPTZEVP_CIPHER_CTX_set_key_lengthr   ÚEVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLENÚ_DECRYPTZEVP_CTRL_AEAD_SET_TAGÚendswithÚfrom_buffer)ÚbackendÚcipher_nameÚkeyÚnonceÚtagZtag_lenZ	operationZ
evp_cipherÚctxÚresZ	nonce_ptrZkey_ptrr   r   r   Ú_aead_setup   sX   

úüÿ
ÿ
úr%   c                 C   s:   | j  d¡}| j || j j|| j j|¡}|  |dk¡ d S ©Núint *r   )r   Únewr   ÚEVP_CipherUpdater   r   )r   r#   Údata_lenZintptrr$   r   r   r   Ú_set_lengthM   ó
   ÿr+   c                 C   s:   | j  d¡}| j || j j||t|ƒ¡}|  |dk¡ d S r&   )r   r(   r   r)   r   r   r   )r   r#   Úassociated_dataÚoutlenr$   r   r   r   Ú_process_aadU   r,   r/   c                 C   s^   | j  d¡}| j  dt|ƒ¡}| j ||||t|ƒ¡}|  |dk¡ | j  ||d ¡d d … S )Nr'   úunsigned char[]r   )r   r(   r   r   r)   r   Úbuffer)r   r#   Údatar.   Úbufr$   r   r   r   Ú_process_data]   s
   r4   c                 C   sê   ddl m} t|ƒ}t| ||j|d |tƒ}t||ƒr"t| |t|ƒƒ t	| ||ƒ t
| ||ƒ}	| j d¡}
| j || jj|
¡}|  |dk¡ |  |
d dk¡ | j d|¡}| j || jj||¡}|  |dk¡ | j |¡d d … }|	| S )Nr   ©r   r'   r0   )r	   r   r   r%   r   r   r
   r+   r   r/   r4   r   r(   r   ÚEVP_CipherFinal_exr   r   r   ZEVP_CTRL_AEAD_GET_TAGr1   )r   r   r!   r2   r-   Ú
tag_lengthr   r   r#   Úprocessed_datar.   r$   Ztag_bufr"   r   r   r   Ú_encrypte   s(   ÿ
ÿr9   c                 C   s2  ddl m} t|ƒ|k rt‚|| d … }|d | … }t|ƒ}t| ||j|||tƒ}	t||ƒr8t	| |	t|ƒƒ t
| |	|ƒ t||ƒrw| j d¡}
| j dt|ƒ¡}| j |	||
|t|ƒ¡}|dkrh|  ¡  t‚| j ||
d ¡d d … }|S t| |	|ƒ}| j d¡}
| j |	| jj|
¡}|dkr—|  ¡  t‚|S )Nr   r5   r'   r0   r   )r	   r   r   r   r   r%   r   r   r
   r+   r/   r   r(   r   r)   Z_consume_errorsr1   r4   r6   r   )r   r   r!   r2   r-   r7   r   r"   r   r#   r.   r3   r$   r8   r   r   r   Ú_decrypt   s8   ÿ

	ùr:   N)Zcryptography.exceptionsr   r   r   r   r%   r+   r/   r4   r9   r:   r   r   r   r   Ú<module>   s   0