3 l�_��@sdddlmZmZmZddlmZdZdZdd�Zdd�Z dd �Z d d �Z d d �Z dd�Z dd�ZdS)�)�absolute_import�division�print_function)� InvalidTag�cCsdddlm}m}m}t||�r"dSt||�rFdjt|j�d�jd�Sdjt|j�d�jd�SdS)Nr)�AESCCM�AESGCM�ChaCha20Poly1305schacha20-poly1305z aes-{}-ccm��asciiz aes-{}-gcm) �+cryptography.hazmat.primitives.ciphers.aeadrrr � isinstance�format�len�_key�encode)�cipherrrr �r�/usr/lib64/python3.6/aead.py�_aead_cipher_names   rc Cst|jj|�}|j||jjk�|jj�}|jj||jj�}|jj|||jj|jj|jjt |t k��} |j| dk�|jj |t |��} |j| dk�|jj ||jjt |�|jj�} |j| dk�|tkr�|jj ||jjt |�|�} |j| dk�n4|jd��r$|jj ||jj||jj�} |j| dk�|jj|�} |jj|�} |jj||jj|jj| | t |t k��} |j| dk�|S)Nrs-ccm)�_libZEVP_get_cipherbyname�openssl_assert�_ffi�NULLZEVP_CIPHER_CTX_new�gcZEVP_CIPHER_CTX_freeZEVP_CipherInit_ex�int�_ENCRYPTZEVP_CIPHER_CTX_set_key_lengthr�EVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLEN�_DECRYPTZEVP_CTRL_AEAD_SET_TAG�endswithZ from_buffer) �backend� cipher_name�key�nonce�tagZtag_lenZ operationZ evp_cipher�ctx�resZ nonce_ptrZkey_ptrrrr� _aead_setupsN      r'cCs:|jjd�}|jj||jj||jj|�}|j|dk�dS)Nzint *r)r�newr�EVP_CipherUpdaterr)r r%Zdata_lenZintptrr&rrr� _set_lengthNs r*cCs:|jjd�}|jj||jj||t|��}|j|dk�dS)Nzint *r)rr(rr)rrr)r r%�associated_data�outlenr&rrr� _process_aadVs r-cCs^|jjd�}|jjdt|��}|jj||||t|��}|j|dk�|jj||d�dd�S)Nzint *zunsigned char[]r)rr(rrr)r�buffer)r r%�datar,�bufr&rrr� _process_data^s  r1cCs�ddlm}t|�}t|||j|d|t�}t||�rDt||t|��t |||�t |||�} |j j d�} |j j||j j| �} |j| dk�|j| ddk�|j j d|�} |j j||j j|| �} |j| dk�|j j| �dd�} | | S)Nr)rzint *zunsigned char[])r rrr'rrr r*rr-r1rr(r�EVP_CipherFinal_exrrrZEVP_CTRL_AEAD_GET_TAGr.)r rr#r/r+� tag_lengthrr!r%�processed_datar,r&Ztag_bufr$rrr�_encryptfs$     r5cCs2ddlm}t|�|krt�|| d�}|d| �}t|�}t|||j|||t�} t||�rpt || t|��t || |�t||�r�|j j d�} |j j dt|��} |j j| | | |t|��} | dkr�|j�t�|j j| | d�dd�} nBt|| |�} |j j d�} |j j| |j j| �} | dk�r.|j�t�| S)Nr)rzint *zunsigned char[]r)r rrrrr'rrr r*r-rr(rr)Z_consume_errorsr.r1r2r)r rr#r/r+r3rr$r!r%r,r0r&r4rrr�_decrypt�s4         r6N)Z __future__rrrZcryptography.exceptionsrrrrr'r*r-r1r5r6rrrr�s 0