o
    ÖèFhq(  ã                   @  sh   d dl mZ d dlZd dlmZmZmZ d dlmZ d dl	m
Z
mZ ejr+d dlmZ G dd„ dƒZdS )	é    )ÚannotationsN)Ú
InvalidTagÚUnsupportedAlgorithmÚ_Reasons)Úciphers)Ú
algorithmsÚmodes)ÚBackendc                   @  sb   e Zd ZdZdZdZdd
d„Zddd„Zd dd„Zd!dd„Z	d"dd„Z
d#dd„Zed$dd„ƒZdS )%Ú_CipherContexté   r   i    Úbackendr	   Ú	operationÚintÚreturnÚNonec                 C  s@  || _ || _|| _|| _d | _t| jtjƒr| jjd | _	nd| _	| j j
 ¡ }| j j || j j
j¡}| j j}z|t|ƒt|ƒf }W n tyY   td |j|rS|jn|¡tjƒ‚w || j ||ƒ}|| j jjkrŒd|j› d�}	|d ur||	d|j› d�7 }	|	d | j  ¡ ¡7 }	t|	tjƒ‚t|tjƒr›| j j |j¡}
n2t|tjƒrª| j j |j¡}
n#t|tjƒr¹| j j |j ¡}
nt|t!j"ƒrÈ| j j |j ¡}
n| j jj}
| j j
 #||| j jj| j jj| j jj|¡}| j  $|d	k¡ | j j
 %|t&|j'ƒ¡}| j  $|d	k¡ t|tj(ƒ�rA| j j
 )|| j j
j*t&|
ƒ| j jj¡}| j  $|d	k¡ |j+d u�rA| j j
 )|| j j
j,t&|j+ƒ|j+¡}| j  $|d	k¡ |j+| _| j j
 #|| j jj| j jj| j j |j'¡|
|¡}| j  -¡ }| j j
}|d	k�r‰|j.�sv|d	  /|j0|j1¡�s…|j2�r‰|d	  /|j3|j4¡�r‰t5d
ƒ‚| j j$|d	k|d� | j j
 6|d	¡ || _7d S )Né   r   z6cipher {} in {} mode is not supported by this backend.zcipher ú zin z mode z_is not supported by this backend (Your version of OpenSSL may be too old. Current version: {}.)r   z+In XTS mode duplicated keys are not allowed©Úerrors)8Ú_backendÚ_cipherÚ_modeÚ
_operationÚ_tagÚ
isinstancer   ÚBlockCipherAlgorithmÚ
block_sizeÚ_block_size_bytesÚ_libÚEVP_CIPHER_CTX_newÚ_ffiÚgcÚEVP_CIPHER_CTX_freeÚ_cipher_registryÚtypeÚKeyErrorr   ÚformatÚnamer   ÚUNSUPPORTED_CIPHERÚNULLÚopenssl_version_textr   ÚModeWithInitializationVectorÚfrom_bufferÚinitialization_vectorÚModeWithTweakÚtweakÚModeWithNonceÚnoncer   ÚChaCha20ÚEVP_CipherInit_exÚopenssl_assertÚEVP_CIPHER_CTX_set_key_lengthÚlenÚkeyÚGCMÚEVP_CIPHER_CTX_ctrlÚEVP_CTRL_AEAD_SET_IVLENÚtagÚEVP_CTRL_AEAD_SET_TAGÚ_consume_errorsÚCRYPTOGRAPHY_IS_LIBRESSLÚ_lib_reason_matchÚERR_LIB_EVPÚEVP_R_XTS_DUPLICATED_KEYSÚCryptography_HAS_PROVIDERSÚERR_LIB_PROVÚPROV_R_XTS_DUPLICATED_KEYSÚ
ValueErrorÚEVP_CIPHER_CTX_set_paddingÚ_ctx)Úselfr   ÚcipherÚmoder   ÚctxÚregistryÚadapterÚ
evp_cipherÚmsgÚiv_nonceÚresr   Úlib© rS   úe/var/www/html/loop/nvenv/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/ciphers.pyÚ__init__   sÌ   
ÿÿûÿ	ýÿ
ú
ÿüüú


þÿýø	ÿ÷
z_CipherContext.__init__ÚdataÚbytesc                 C  s2   t t|ƒ| j d ƒ}|  ||¡}t|d |… ƒS )Nr   )Ú	bytearrayr6   r   Úupdate_intorW   )rH   rV   ÚbufÚnrS   rS   rT   Úupdate�   s   z_CipherContext.updaterZ   c                 C  s  t |ƒ}t |ƒ|| j d k rtd t |ƒ| j d ¡ƒ‚d}d}| jj d¡}| jjj|dd�}| jj |¡}||kr‚|| }	|| }
t| j	|| ƒ}| jj
 | j|	||
|¡}|dkrlt| jtjƒrl| j ¡  tdƒ‚| j |dk¡ ||7 }||d 7 }||ks<|S )Nr   z1buffer must be at least {} bytes for this payloadr   úint *T)Úrequire_writablezeIn XTS mode you must supply at least a full block in the first update call. For AES this is 16 bytes.)r6   r   rE   r&   r   r    Únewr,   ÚminÚ_MAX_CHUNK_SIZEr   ÚEVP_CipherUpdaterG   r   r   r   ÚXTSr=   r4   )rH   rV   rZ   Útotal_data_lenÚdata_processedÚ	total_outÚoutlenÚ
baseoutbufÚ	baseinbufÚoutbufÚinbufÚinlenrQ   rS   rS   rT   rY   ”   s:   ÿÿÿ
ÿïz_CipherContext.update_intoc                 C  s”  | j | jkrt| jtjƒr| jd u rtdƒ‚| jj	 
d| j¡}| jj	 
d¡}| jj | j||¡}|dkrt| j ¡ }|sDt| jtjƒrDt‚| jj}| jj|d  |j|j¡pl|joa|d  |j|j¡pl|jol|d j|jk|d� tdƒ‚t| jtjƒr­| j | jkr­| jj	 
d| j¡}| jj | j| jjj| j|¡}| j |dk¡ | jj	 |¡d d … | _ | jj !| j¡}| j |dk¡ | jj	 |¡d |d … S )Nz4Authentication tag must be provided when decrypting.zunsigned char[]r]   r   r   zFThe length of the provided data is not a multiple of the block length.r   )"r   Ú_DECRYPTr   r   r   ÚModeWithAuthenticationTagr;   rE   r   r    r_   r   r   ÚEVP_CipherFinal_exrG   r=   r8   r   r4   r?   r@   Ú'EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHrB   rC   ÚPROV_R_WRONG_FINAL_BLOCK_LENGTHÚCRYPTOGRAPHY_IS_BORINGSSLÚreasonÚ*CIPHER_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHÚ_ENCRYPTr9   ÚEVP_CTRL_AEAD_GET_TAGÚbufferr   ÚEVP_CIPHER_CTX_reset)rH   rZ   rg   rQ   r   rR   Útag_bufrS   rS   rT   Úfinalize¸   sh   ÿ
ÿ
þþúÿïÿÿÿüz_CipherContext.finalizer;   c                 C  s~   t |ƒ}|| jjk rtd | jj¡ƒ‚|| jkr td | j¡ƒ‚| jj | j	| jjj
t |ƒ|¡}| j |dk¡ || _|  ¡ S )Nz.Authentication tag must be {} bytes or longer.z0Authentication tag cannot be more than {} bytes.r   )r6   r   Ú_min_tag_lengthrE   r&   r   r   r   r9   rG   r<   r4   r   rz   )rH   r;   Útag_lenrQ   rS   rS   rT   Úfinalize_with_tagø   s&   ÿÿ
ÿÿÿz _CipherContext.finalize_with_tagc                 C  sN   | j j d¡}| j j | j| j jj|| j j |¡t|ƒ¡}| j  	|dk¡ d S )Nr]   r   )
r   r    r_   r   rb   rG   r)   r,   r6   r4   )rH   rV   rg   rQ   rS   rS   rT   Úauthenticate_additional_data  s   ûz+_CipherContext.authenticate_additional_dataúbytes | Nonec                 C  s   | j S )N)r   )rH   rS   rS   rT   r;     s   z_CipherContext.tagN)r   r	   r   r   r   r   )rV   rW   r   rW   )rV   rW   rZ   rW   r   r   )r   rW   )r;   rW   r   rW   )rV   rW   r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__ru   rm   ra   rU   r\   rY   rz   r}   r~   Úpropertyr;   rS   rS   rS   rT   r
      s    

y

$
@
r
   )Ú
__future__r   ÚtypingÚcryptography.exceptionsr   r   r   Úcryptography.hazmat.primitivesr   Ú&cryptography.hazmat.primitives.ciphersr   r   ÚTYPE_CHECKINGÚ,cryptography.hazmat.backends.openssl.backendr	   r
   rS   rS   rS   rT   Ú<module>   s   