U
    Nf                     @  sV  d dl mZ d dlZd dlmZ ejrPd dlmZ d dlm	Z	m
Z
 eje	e
f Zdddd	d
dZddddddddddZddddddddddZdZd ZdddddZdddddZddddddddddZddd d!d"Zdddd#d$d%Zdddd&d'd(Zdddd)d*d+Zddddddddd,d-Zddddddddd.d/ZdS )0    )annotationsN)
InvalidTag)BackendAESCCMAESGCMr   
_AEADTypesbool)backendcipherreturnc                 C  s   t |}| j|| jjkS N)_evp_cipher_cipher_name_libEVP_get_cipherbyname_ffiNULL)r
   r   cipher_name r   M/tmp/pip-unpacked-wheel-bjwtc2fy/cryptography/hazmat/backends/openssl/aead.py_aead_cipher_supported   s    r   byteszlist[bytes]int)r
   r   noncedataassociated_data
tag_lengthr   c                 C  s   t | |||||S r   )_evp_cipher_encryptr
   r   r   r   r   r   r   r   r   _encrypt   s         r   c                 C  s   t | |||||S r   )_evp_cipher_decryptr   r   r   r   _decrypt(   s         r!      )r   r   c                 C  sd   ddl m}m} t| |r6dt| jd  ddS t| |sDtdt| jd  ddS d S )Nr   r   zaes-   z-ccmasciiz-gcm)+cryptography.hazmat.primitives.ciphers.aeadr   r   
isinstancelen_keyencodeAssertionError)r   r   r   r   r   r   r   9   s
    
r   )r   r
   c                 C  s"   |j | }|||jjk |S r   )r   r   openssl_assertr   r   )r   r
   
evp_cipherr   r   r   _evp_cipherF   s    r-   zbytes | None)r
   r   keyr   tagtag_len	operationc              
   C  s.  t || }| j }| j|| jj}| j||| jj| jj| jjt|t	k}	| 
|	dk | j|| jjt|| jj}	| 
|	dk |tkr|d k	stt| || n2|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)r-   r   ZEVP_CIPHER_CTX_newr   gcZEVP_CIPHER_CTX_freeZEVP_CipherInit_exr   r   _ENCRYPTr+   EVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLENr'   _DECRYPTr*   _evp_cipher_set_tagendswithEVP_CTRL_AEAD_SET_TAGfrom_buffer)r
   r   r.   r   r/   r0   r1   r,   ctxresZ	nonce_ptrZkey_ptrr   r   r   _evp_cipher_aead_setupL   sT    	




r<   None)r/   r   c                 C  s8   | j |}| j|| jjt||}| |dk d S )Nr   )r   r9   r   r4   r8   r'   r+   )r
   r:   r/   Ztag_ptrr;   r   r   r   r6      s       r6   )r
   data_lenr   c                 C  s:   | j d}| j|| j j|| j j|}| |dk d S Nint *r   )r   newr   EVP_CipherUpdater   r+   )r
   r:   r>   Zintptrr;   r   r   r   _evp_cipher_set_length   s        rC   )r
   r   r   c                 C  sF   | j d}| j |}| j|| j j||t|}| |dk d S r?   )r   rA   r9   r   rB   r   r'   r+   )r
   r:   r   outlenZ
a_data_ptrr;   r   r   r   _evp_cipher_process_aad   s        rE   )r
   r   r   c                 C  sj   | j d}| j dt|}| j |}| j||||t|}| |dk | j ||d d d  S )Nr@   unsigned char[]r   )r   rA   r'   r9   r   rB   r+   buffer)r
   r:   r   rD   bufZdata_ptrr;   r   r   r   _evp_cipher_process_data   s    rI   c                 C  s
  ddl m} t|}t| ||j|d |t}t||rDt| |t| |D ]}	t	| ||	 qHt
| ||}
| jd}| jdd}| j|||}| |dk |
| j||d d d  7 }
| jd|}| j|| jj||}| |dk | j|d d  }|
| S )Nr   r   r@   rF      )r%   r   r   r<   r(   r3   r&   rC   r'   rE   rI   r   rA   r   EVP_CipherFinal_exr+   rG   r4   ZEVP_CTRL_AEAD_GET_TAG)r
   r   r   r   r   r   r   r   r:   adprocessed_datarD   rH   r;   Ztag_bufr/   r   r   r   r      s>    
   r   c                 C  sr  ddl m} t||k rt|| d  }|d |  }t|}t| ||j|||t}	t||rpt	| |	t| |D ]}
t
| |	|
 qtt||r| jd}| jdt|}| j|}| j|	|||t|}|dkr|   t| j||d d d  }njt| |	|}| jd}| jdd}| j|	||}|| j||d d d  7 }|dkrn|   t|S )Nr   rJ   r@   rF   r"   rK   )r%   r   r'   r   r   r<   r(   r5   r&   rC   rE   r   rA   r9   r   rB   Z_consume_errorsrG   rI   rL   )r
   r   r   r   r   r   r   r/   r   r:   rM   rD   rH   Zd_ptrr;   rN   r   r   r   r       sJ    

r    )
__future__r   typingZcryptography.exceptionsr   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r%   r   r   Unionr   r   r   r!   r3   r5   r   r-   r<   r6   rC   rE   rI   r   r    r   r   r   r   <module>   s(   7	0