U
    ςd_>                  
   @  s  d dl mZ d dlZd dlmZ ejrbd dlmZ d dlm	Z	m
Z
mZmZmZ eje	e
eeef Zdddd	d
dZdddd	ddZddddddZdFdddddddddddZdGdddddddddddZdHdddddddZddddd Zdddddddddd!d"Zd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-Zddddd.ddd/d0d1Zdd2d3d4d5Zddd2d6d7d8Z ddd2d9d:d;Z!ddd2d<d=d>Z"dddd?d@dAZ#dIddddddddddBdCZ$dJddddddddddDdEZ%dS )K    )annotationsN)
InvalidTag)BackendAESCCMAESGCMAESOCB3AESSIVChaCha20Poly1305r   
_AEADTypesbool)backendcipherreturnc                 C  s   ddl m} | jjot||S )zz
    Checks whether the given cipher is supported through
    EVP_AEAD rather than the normal OpenSSL EVP_CIPHER API.
    r   r
   )+cryptography.hazmat.primitives.ciphers.aeadr
   _libZCryptography_HAS_EVP_AEAD
isinstancer   r   r
    r   f/var/www/html/myproject/myenv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/aead.py_is_evp_aead_supported_cipher   s
    
 r   c                 C  sX   t | |rdS t|}| jr*|| jkr*dS |dr@| jjdkS | j|| jj	kS d S )NTF   -siv   )
r   _evp_cipher_cipher_nameZ_fips_enabledZ
_fips_aeadendswithr   Z#CRYPTOGRAPHY_OPENSSL_300_OR_GREATEREVP_get_cipherbyname_ffiNULL)r   r   cipher_namer   r   r   _aead_cipher_supported(   s    


r    bytesr   r   keyc                 C  s&   t | |rt| ||S t| ||S d S N)r   _evp_aead_create_ctx_evp_cipher_create_ctxr"   r   r   r   _aead_create_ctx;   s    
r'   ztyping.List[bytes]intz
typing.Any)r   r   noncedataassociated_data
tag_lengthctxr   c                 C  s6   t | |rt| ||||||S t| ||||||S d S r$   )r   _evp_aead_encrypt_evp_cipher_encryptr   r   r)   r*   r+   r,   r-   r   r   r   _encryptF   s&    	
            r1   c                 C  s6   t | |rt| ||||||S t| ||||||S d S r$   )r   _evp_aead_decrypt_evp_cipher_decryptr0   r   r   r   _decryptY   s&    	
            r4   ztyping.Optional[int])r   r   r#   tag_lenc                 C  st   t | |}|d k	st| j|}|d kr2| jjn|}| j||t||}| || jj	k | j
|| jj}|S r$   )_evp_aead_get_cipherAssertionErrorr   from_bufferr   ZEVP_AEAD_DEFAULT_TAG_LENGTHZCryptography_EVP_AEAD_CTX_newlenopenssl_assertr   gcZEVP_AEAD_CTX_free)r   r   r#   r5   aead_cipherkey_ptrr-   r   r   r   r%   l   s     

   r%   )r   r   c                 C  s$   ddl m} t||st| j S )Nr   r   )r   r
   r   r7   r   ZEVP_aead_chacha20_poly1305r   r   r   r   r6      s    r6   c                 C  s   |d k	st t| |}|d k	s"t | jd}t|| j| }	| jd|	}
| j|}| j|}d|}| j|}| j	||
||	|t||t||t|
}| 
|dk | j|
|d d d  }|S )Nsize_t *	uint8_t[]    r   r   )r7   r6   r   newr9   r   ZEVP_AEAD_max_overheadr8   joinZEVP_AEAD_CTX_sealr:   buffer)r   r   r)   r*   r+   r,   r-   r<   out_lenmax_out_lenout_bufdata_ptr	nonce_ptraadaad_ptrresZencrypted_datar   r   r   r.      s2    	

r.   c                 C  s   t ||k rt|d k	st| jd}t |}| jd|}	| j|}
| j|}d|}| j|}| j||	|||t ||
t ||t |
}|dkr| 	  t| j
|	|d d d  }|S )Nr>   r?   r@   r   )r9   r   r7   r   rA   r8   rB   r   ZEVP_AEAD_CTX_open_consume_errorsrC   )r   r   r)   r*   r+   r,   r-   rD   rE   rF   rG   rH   rI   rJ   rK   Zdecrypted_datar   r   r   r2      s6    	
r2   r   )r   r   c                 C  s   ddl m}m}m}m}m} t| |r*dS t| |rPdt| jd  d	dS t| |rvdt| jd  d	dS t| |rdt| jd d	  d
	dS t| |st
dt| jd  d	dS d S )Nr   r   s   chacha20-poly1305zaes-   z-ccmasciiz-ocb   z-sivz-gcm)r   r   r   r   r	   r
   r   r9   _keyencoder7   )r   r   r   r   r	   r
   r   r   r   r      s    



 r   )r   r   c                 C  sj   |  drH|j|jj| |jj}|||jjk |j||jj}n|j| }|||jjk |S )Nr   )	r   r   ZEVP_CIPHER_fetchr   r   r:   r;   ZEVP_CIPHER_freer   )r   r   
evp_cipherr   r   r   _evp_cipher   s    
rS   c                 C  s|   | j  }| || jjk | j|| j j}t|}t|| }| j	|}| j 
||| jj|| jjd}| |dk |S Nr   )r   EVP_CIPHER_CTX_newr:   r   r   r;   EVP_CIPHER_CTX_freer   rS   r8   EVP_CipherInit_ex)r   r   r#   r-   r   rR   r=   rK   r   r   r   r&     s     

r&   ztyping.Optional[bytes])r   r   r#   r)   tagr5   	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)rS   r   rU   r   r;   rV   rW   r   r(   _ENCRYPTr:   EVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLENr9   _DECRYPTr7   _evp_cipher_set_tagr   EVP_CTRL_AEAD_SET_TAGr8   )r   r   r#   r)   rX   r5   rY   rR   r-   rK   rH   r=   r   r   r   _evp_cipher_aead_setup"  sT    	




r_   None)rX   r   c                 C  s8   | j |}| j|| jjt||}| |dk d S rT   )r   r8   r   r[   r^   r9   r:   )r   r-   rX   Ztag_ptrrK   r   r   r   r]   Y  s       r]   )r)   rY   r   c              
   C  sH   | j |}| j|| j j| j j| j j|t|tk}| |dk d S rT   )r   r8   r   rW   r   r(   rZ   r:   )r   r-   r)   rY   rH   rK   r   r   r   _evp_cipher_set_nonce_operationa  s    
ra   )r   data_lenr   c                 C  s:   | j d}| j|| j j|| j j|}| |dk d S Nint *r   )r   rA   r   EVP_CipherUpdater   r:   )r   r-   rb   ZintptrrK   r   r   r   _evp_cipher_set_lengthp  s        rf   )r   r+   r   c                 C  sF   | j d}| j |}| j|| j j||t|}| |dk d S rc   )r   rA   r8   r   re   r   r9   r:   )r   r-   r+   outlenZ
a_data_ptrrK   r   r   r   _evp_cipher_process_aadx  s        rh   )r   r*   r   c                 C  sp   | j d}| j dt|}| j |}| j||||t|}|dkrV|   t| j ||d d d  S )Nrd   unsigned char[]r   )	r   rA   r9   r8   r   re   rL   r   rC   )r   r-   r*   rg   bufrG   rK   r   r   r   _evp_cipher_process_data  s    rk   c                 C  sP  ddl m}m} |d kr8t|}	t| |	|j|d |t}nt| ||t t||r`t	| |t
| |D ]}
t| ||
 qdt| ||}| jd}| jdd}| j|||}| |dk || j||d d d  7 }| jd|}| j|| jj||}| |dk | j|d d  }t||rD| t
|dk || S || S d S )Nr   r   r	   rd   ri      )r   r   r	   r   r_   rP   rZ   ra   r   rf   r9   rh   rk   r   rA   r   EVP_CipherFinal_exr:   rC   r[   ZEVP_CTRL_AEAD_GET_TAG)r   r   r)   r*   r+   r,   r-   r   r	   r   adprocessed_datarg   rj   rK   Ztag_bufrX   r   r   r   r/     sH    	

   r/   c                 C  s  ddl m}m} t||k r tt||rD|d | }	||d  }n|| d  }	|d |  }|d krt|}
t| |
|j||	|t	}nt
| ||t	 t| ||	 t||rt| |t| |D ]}t| || qt||rR| jd}| jdt|}| j|}| j||||t|}|dkr6|   t| j||d d d  }njt| ||}| jd}| jdd}| j|||}|| j||d d d  7 }|dkr|   t|S )Nr   rl   rd   ri   r   rm   )r   r   r	   r9   r   r   r   r_   rP   r\   ra   r]   rf   rh   r   rA   r8   r   re   rL   rC   rk   rn   )r   r   r)   r*   r+   r,   r-   r   r	   rX   r   ro   rg   rj   Zd_ptrrK   rp   r   r   r   r3     sV    	




r3   )N)N)N)N)N)&
__future__r   typingZcryptography.exceptionsr   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r   r   r   r   r	   r
   Unionr   r   r    r'   r1   r4   r%   r6   r.   r2   rZ   r\   r   rS   r&   r_   r]   ra   rf   rh   rk   r/   r3   r   r   r   r   <module>   sF      
),7 B 