3
dZ                 @   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jt| jd jdS t| |sTt	djt| jd jdS d S )Nr   )AESCCMAESGCMChaCha20Poly1305s   chacha20-poly1305zaes-{0}-ccm   asciizaes-{0}-gcm)
+cryptography.hazmat.primitives.ciphers.aeadr   r   r	   
isinstanceformatlen_keyencodeAssertionError)cipherr   r   r	    r   K/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/aead.py_aead_cipher_name   s    

r   c       
   	   C   sB  | j j|}| j|| jjk | j j }| jj|| j j}| j j||| jj| jj| jjt	|t
k}	| j|	dk | j j|t|}	| j|	dk | j j|| j jt|| jj}	| j|	dk |tkr| j j|| j jt||}	| j|	dk n| j j|| j j|| jj}	| j j|| jj| jj||t	|t
k}	| j|	dk |S )Nr   )_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)
backendcipher_namekeynoncetagZtag_lenZ	operationZ
evp_cipherctxresr   r   r   _aead_setup   s@    

r'   c             C   s:   | j jd}| jj|| j j|| j j|}| j|dk d S )Nzint *r   )r   newr   EVP_CipherUpdater   r   )r    r%   Zdata_lenZintptrr&   r   r   r   _set_lengthE   s    r*   c             C   s:   | j jd}| jj|| j j||t|}| j|dk d S )Nzint *r   )r   r(   r   r)   r   r   r   )r    r%   associated_dataoutlenr&   r   r   r   _process_aadQ   s    r-   c             C   s^   | j jd}| j jdt|}| jj||||t|}| j|dk | j j||d d d  S )Nzint *zunsigned char[]r   )r   r(   r   r   r)   r   buffer)r    r%   datar,   bufr&   r   r   r   _process_dataY   s
    r1   c             C   s   ddl m} t|}t| ||j|d |t}t||rDt| |t| t	| || t
| ||}	| jjd}
| jj|| jj|
}| j|dk | j|
d dk | jjd|}| jj|| jj||}| j|dk | jj|d d  }|	| S )Nr   )r   zint *zunsigned char[])r   r   r   r'   r   r   r   r*   r   r-   r1   r   r(   r   EVP_CipherFinal_exr   r   r   ZEVP_CTRL_AEAD_GET_TAGr.   )r    r   r#   r/   r+   
tag_lengthr   r!   r%   processed_datar,   r&   Ztag_bufr$   r   r   r   _encrypta   s$    
r5   c             C   s2  ddl m} t||k rt|| d  }|d |  }t|}t| ||j|||t}	t||rpt	| |	t| t
| |	| t||r| jjd}
| jjdt|}| jj|	||
|t|}|dkr| j  t| jj||
d d d  }nBt| |	|}| jjd}
| jj|	| jj|
}|dkr.| j  t|S )Nr   )r   zint *zunsigned char[]r   )r   r   r   r   r   r'   r   r   r   r*   r-   r   r(   r   r)   Z_consume_errorsr.   r1   r2   r   )r    r   r#   r/   r+   r3   r   r$   r!   r%   r,   r0   r&   r4   r   r   r   _decrypt|   s4    


r6   N)Z
__future__r   r   r   Zcryptography.exceptionsr   r   r   r   r'   r*   r-   r1   r5   r6   r   r   r   r   <module>   s   *