U
    *”}f…  ã                   @   sd   d dl mZmZmZ 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 )é    )Úabsolute_importÚdivisionÚprint_function)Ú
InvalidTagé   c                 C   sr   ddl m}m}m} t| |ƒr"dS t| |ƒrFd t| jƒd ¡ d¡S t| |ƒsTt	‚d t| jƒd ¡ d¡S 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ÚAssertionError)Úcipherr   r   r	   © r   úM/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/backends/openssl/aead.pyÚ_aead_cipher_name   s    

r   c              
   C   st  | 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rð| j  || j jt|ƒ|¡}	|  |	dk¡ n4| 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   sd    

úü   ÿ   ÿ
ú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'   Zdata_lenZintptrr(   r   r   r   Ú_set_lengthN   s        ÿ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_aadV   s        ÿr1   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'   Údatar0   Úbufr(   r   r   r   Ú_process_data^   s
    r6   c                 C   sê   ddl m} t|ƒ}t| ||j|d |tƒ}t||ƒrDt| |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+   r2   )r   r   r   r)   r   r   r   r.   r   r1   r6   r   r,   r   ÚEVP_CipherFinal_exr   r   r   ZEVP_CTRL_AEAD_GET_TAGr3   )r"   r   r%   r4   r/   Ú
tag_lengthr   r#   r'   Úprocessed_datar0   r(   Ztag_bufr&   r   r   r   Ú_encryptf   s:          ÿ
   ÿr;   c                 C   s2  ddl m} t|ƒ|k rt‚|| d … }|d | … }t|ƒ}t| ||j|||tƒ}	t||ƒrpt	| |	t|ƒƒ t
| |	|ƒ t||ƒrì| j d¡}
| j dt|ƒ¡}| j |	||
|t|ƒ¡}|dkrÐ|  ¡  t‚| j ||
d ¡d d … }nBt| |	|ƒ}| j d¡}
| j |	| jj|
¡}|dkr.|  ¡  t‚|S )Nr   r7   r+   r2   r   )r   r   r   r   r   r)   r   r   r   r.   r1   r   r,   r   r-   Z_consume_errorsr3   r6   r8   r   )r"   r   r%   r4   r/   r9   r   r&   r#   r'   r0   r5   r(   r:   r   r   r   Ú_decrypt‚   sB          ÿ


r<   N)Ú
__future__r   r   r   Zcryptography.exceptionsr   r   r   r   r)   r.   r1   r6   r;   r<   r   r   r   r   Ú<module>   s   0