U
    ÒZjf(  ã                   @   s\   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
rJd dlmZ G dd„ dƒZdS )é    N)Ú
InvalidTagÚUnsupportedAlgorithmÚ_Reasons)Úciphers)Ú
algorithmsÚmodes)ÚBackendc                   @   s’   e Zd ZdZdZdZdeddœdd„Zeed	œd
d„Z	eeedœdd„Z
edœdd„Zeedœdd„Zedd	œdd„Zeeje dœdd„ƒZdS )Ú_CipherContexté   r   iÿÿÿ?r   N)ÚbackendÚ	operationÚreturnc                 C   sH  || _ || _|| _|| _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 n4 tk
r¸   td |j|r¨|jn|¡tjƒ‚Y nX || j ||ƒ}|| j jjk�rd |¡}	|d k	rø|	d |¡7 }	|	d | j  ¡ ¡7 }	t|	tjƒ‚t|tjƒ�r8| j j |j¡}
njt|tjƒ�rX| j j |j¡}
nJt|tjƒ�rx| 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(ƒ�rŠ| j j
 )|| j j
j*t&|
ƒ| j jj¡}| j  $|dk¡ |j+d k	�rŠ| 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.�rô|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 {0.name} zin {0.name} 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Ú_backendZ_cipherÚ_modeÚ
_operationÚ_tagÚ
isinstancer   ZBlockCipherAlgorithmÚ
block_sizeÚ_block_size_bytesÚ_libZEVP_CIPHER_CTX_newÚ_ffiÚgcZEVP_CIPHER_CTX_freeZ_cipher_registryÚtypeÚKeyErrorr   ÚformatÚnamer   ZUNSUPPORTED_CIPHERÚNULLZopenssl_version_textr   ZModeWithInitializationVectorÚfrom_bufferZinitialization_vectorZModeWithTweakZtweakZModeWithNonceÚnoncer   ZChaCha20ZEVP_CipherInit_exÚopenssl_assertZEVP_CIPHER_CTX_set_key_lengthÚlenÚkeyÚGCMÚEVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLENÚtagÚEVP_CTRL_AEAD_SET_TAGÚ_consume_errorsZ$CRYPTOGRAPHY_OPENSSL_111D_OR_GREATERÚ_lib_reason_matchÚERR_LIB_EVPZEVP_R_XTS_DUPLICATED_KEYSÚCryptography_HAS_PROVIDERSÚERR_LIB_PROVZPROV_R_XTS_DUPLICATED_KEYSÚ
ValueErrorZEVP_CIPHER_CTX_set_paddingÚ_ctx)Úselfr   ÚcipherÚmoder   ÚctxÚregistryÚadapterZ
evp_cipherÚmsgZiv_nonceÚresr   Úlib© r9   úo/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/ciphers.pyÚ__init__   sÔ     ÿ þû

ÿýÿ
ú ÿüüú


þ ÿýø	 ÿ÷z_CipherContext.__init__)Údatar   c                 C   s2   t t|ƒ| j d ƒ}|  ||¡}t|d |… ƒS )Nr
   )Ú	bytearrayr#   r   Úupdate_intoÚbytes)r0   r<   ÚbufÚnr9   r9   r:   Úupdate�   s    z_CipherContext.update)r<   r@   r   c                 C   s   t |ƒ}t |ƒ|| j d k r:td t |ƒ| j d ¡ƒ‚d}d}| jj d¡}| jj |¡}| jj |¡}||krü|| }	|| }
t| j	|| ƒ}| jj
 | j|	||
|¡}|dkrÖt| jtjƒrÖ| j ¡  tdƒ‚n| j |dk¡ ||7 }||d 7 }ql|S )Nr
   z1buffer must be at least {} bytes for this payloadr   úint *zeIn XTS mode you must supply at least a full block in the first update call. For AES this is 16 bytes.)r#   r   r.   r   r   r   Únewr    ÚminÚ_MAX_CHUNK_SIZEr   ÚEVP_CipherUpdater/   r   r   r   ZXTSr)   r"   )r0   r<   r@   Ztotal_data_lenZdata_processedZ	total_outÚoutlenZ
baseoutbufZ	baseinbufZoutbufZinbufZinlenr7   r9   r9   r:   r>   •   s@    ÿÿ    ÿ
ÿz_CipherContext.update_into)r   c                 C   s˜  | j | jkr,t| jtjƒr,| jd kr,tdƒ‚| jj	 
d| j¡}| jj	 
d¡}| jj | j||¡}|dkrè| j ¡ }|sˆt| jtjƒrˆt‚| jj}| jj|d  |j|j¡pØ|jrÄ|d  |j|j¡pØ|joØ|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[]rC   r   r   zFThe length of the provided data is not a multiple of the block length.r
   )"r   Ú_DECRYPTr   r   r   ZModeWithAuthenticationTagr'   r.   r   r   rD   r   r   ZEVP_CipherFinal_exr/   r)   r%   r   r"   r*   r+   Z'EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHr,   r-   ZPROV_R_WRONG_FINAL_BLOCK_LENGTHZCRYPTOGRAPHY_IS_BORINGSSLÚreasonZ*CIPHER_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHÚ_ENCRYPTr&   ZEVP_CTRL_AEAD_GET_TAGÚbufferr   ZEVP_CIPHER_CTX_reset)r0   r@   rH   r7   r   r8   Ztag_bufr9   r9   r:   Úfinalize¸   sp    
ÿþýÿ
þþúÿïÿÿ
þ ÿüz_CipherContext.finalize)r'   r   c                 C   s€   t |ƒ}|| jjk r(td | jj¡ƒ‚n|| jkrBt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   )r#   r   Z_min_tag_lengthr.   r   r   r   r   r&   r/   r(   r"   r   rM   )r0   r'   Ztag_lenr7   r9   r9   r:   Ú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 )NrC   r   )
r   r   rD   r   rG   r/   r   r    r#   r"   )r0   r<   rH   r7   r9   r9   r:   Úauthenticate_additional_data  s    ûz+_CipherContext.authenticate_additional_datac                 C   s   | j S )N)r   )r0   r9   r9   r:   r'     s    z_CipherContext.tag)Ú__name__Ú
__module__Ú__qualname__rK   rI   rF   Úintr;   r?   rB   r>   rM   rN   rO   ÚpropertyÚtypingÚOptionalr'   r9   r9   r9   r:   r	      s    þ{#@r	   )rU   Zcryptography.exceptionsr   r   r   Zcryptography.hazmat.primitivesr   Z&cryptography.hazmat.primitives.ciphersr   r   ÚTYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r	   r9   r9   r9   r:   Ú<module>   s   