o
    -&%aD  ã                   @   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   úK/usr/lib/python3/dist-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)Ú_libÚEVP_get_cipherbynameÚopenssl_assertÚ_ffiÚNULLÚEVP_CIPHER_CTX_newÚgcÚEVP_CIPHER_CTX_freeÚEVP_CipherInit_exÚintÚ_ENCRYPTÚEVP_CIPHER_CTX_set_key_lengthr   ÚEVP_CIPHER_CTX_ctrlÚEVP_CTRL_AEAD_SET_IVLENÚ_DECRYPTÚEVP_CTRL_AEAD_SET_TAGÚendswithÚfrom_buffer)ÚbackendÚcipher_nameÚkeyÚnonceÚtagÚtag_lenÚ	operationÚ
evp_cipherÚctxÚresÚ	nonce_ptrÚkey_ptrr   r   r   Ú_aead_setup   sX   

úüÿ
ÿ
úr1   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_lenÚintptrr.   r   r   r   Ú_set_lengthM   ó
   ÿr8   c                 C   s:   | j  d¡}| j || j j||t|ƒ¡}|  |dk¡ d S r2   )r   r4   r   r5   r   r   r   )r%   r-   Úassociated_dataÚoutlenr.   r   r   r   Ú_process_aadU   r9   r<   c                 C   s^   | j  d¡}| j  dt|ƒ¡}| j ||||t|ƒ¡}|  |dk¡ | j  ||d ¡d d … S )Nr3   úunsigned char[]r   )r   r4   r   r   r5   r   Úbuffer)r%   r-   Údatar;   Úbufr.   r   r   r   Ú_process_data]   s
   rA   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   r3   r=   )r	   r   r   r1   r   r   r
   r8   r   r<   rA   r   r4   r   ÚEVP_CipherFinal_exr   r   r   ÚEVP_CTRL_AEAD_GET_TAGr>   )r%   r   r(   r?   r:   Ú
tag_lengthr   r&   r-   Úprocessed_datar;   r.   Útag_bufr)   r   r   r   Ú_encrypte   s(   ÿ
ÿrH   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   rB   r3   r=   r   )r	   r   r   r   r   r1   r   r!   r
   r8   r<   r   r4   r   r5   Ú_consume_errorsr>   rA   rC   r   )r%   r   r(   r?   r:   rE   r   r)   r&   r-   r;   r@   r.   rF   r   r   r   Ú_decrypt   s8   ÿ

	ùrJ   N)Úcryptography.exceptionsr   r   r!   r   r1   r8   r<   rA   rH   rJ   r   r   r   r   Ú<module>   s   0