3
K^v                 @   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-{}-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-vvkwn1hz/cryptography/hazmat/backends/openssl/aead.py_aead_cipher_name   s    

r   c          	   C   st  | 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 n4|jdr$| j j|| j j|| jj}	| j|	dk | jj|}
| jj|}| j j|| jj| jj||
t	|t
k}	| j|	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   sH    

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_lengthH   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_aadT   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_data\   s
    r3   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/   r3   r   r*   r   EVP_CipherFinal_exr   r   r   ZEVP_CTRL_AEAD_GET_TAGr0   )r"   r   r%   r1   r-   
tag_lengthr   r#   r'   processed_datar.   r(   Ztag_bufr&   r   r   r   _encryptd   s$    
r7   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_errorsr0   r3   r4   r   )r"   r   r%   r1   r-   r5   r   r&   r#   r'   r.   r2   r(   r6   r   r   r   _decrypt   s4    


r8   N)
__future__r   r   r   Zcryptography.exceptionsr   r   r   r   r)   r,   r/   r3   r7   r8   r   r   r   r   <module>   s   -