a
     `                     @   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| |sTJ 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)cipherr   r   r	    r   K/usr/lib/python3/dist-packages/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endswithZ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%   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
    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||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)   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   _encryptf   s(    
r9   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   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   s6    


r:   N)Z
__future__r   r   r   Zcryptography.exceptionsr   r   r   r   r'   r,   r/   r4   r9   r:   r   r   r   r   <module>   s   0