a h( @ s| d dl mZ d dlmZmZmZ d dlmZ d dlm Z e eje eje ej e ejG dd deZdS ) )utils) InvalidTagUnsupportedAlgorithm_Reasons)ciphers)modesc @ sx e Zd ZdZdZdZdd ZeedddZee dd d Z eddd ZeedddZeddddZ edZdS )_CipherContext r i?c C sF || _ || _|| _|| _d | _t| jtjr<| jjd | _ nd| _ | j j }| j j || j j j}| j j}z|t|t|f }W n2 ty td|j|r|jn|tjY n0 || j ||}|| j jjkrd|} |d ur| d|7 } | d| j 7 } t| tjt|tjr6| j j|j} njt|tjrV| j j|j} nJt|tjrv| j j|j } n*t|tjr| j j|j } n | j jj} | j j !||| j jj| j jj| j jj|}| j "|dk | j j #|t$|j%}| j "|dk t|tj&r| j j '|| j j j(t$| | j jj}| j "|dk |j)d ur| j j '|| j j j*t$|j)|j)}| j "|dk |j)| _| j j !|| j jj| j jj| j j|j%| |}| j + }| j j } |dkr| j,r|d -| j.| j/s| j0r|d -| j1| j2rt3d| j j"|dk|d | j j 4|d || _5d S ) N r z6cipher {} in {} mode is not supported by this backend.zcipher {0.name} zin {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 allowederrors)6_backendZ_cipher_mode _operation_tag isinstancer ZBlockCipherAlgorithmZ block_size_block_size_bytes_libZEVP_CIPHER_CTX_new_ffigcZEVP_CIPHER_CTX_freeZ_cipher_registrytypeKeyErrorr formatnamer ZUNSUPPORTED_CIPHERNULLZopenssl_version_textr ZModeWithInitializationVectorfrom_bufferZinitialization_vectorZ ModeWithTweakZtweakZ ModeWithNonceZnonceZEVP_CipherInit_exopenssl_assertZEVP_CIPHER_CTX_set_key_lengthlenkeyGCMEVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLENtagEVP_CTRL_AEAD_SET_TAG_consume_errorsZ$CRYPTOGRAPHY_OPENSSL_111D_OR_GREATER_lib_reason_matchERR_LIB_EVPZEVP_R_XTS_DUPLICATED_KEYSCryptography_HAS_PROVIDERSERR_LIB_PROVZPROV_R_XTS_DUPLICATED_KEYS ValueErrorZEVP_CIPHER_CTX_set_padding_ctx)selfZbackendZciphermodeZ operationctxregistryZadapterZ evp_ciphermsgZiv_nonceresr lib r1 R/usr/lib64/python3.9/site-packages/cryptography/hazmat/backends/openssl/ciphers.py__init__ s z_CipherContext.__init__)datareturnc C s2 t t|| j d }| ||}t|d | S )Nr ) bytearrayr r update_intobytes)r* r4 bufnr1 r1 r2 update s z_CipherContext.updatec C s t |}t ||| j d k r:tdt || j d d}d}| jjd}| jjj|dd}| jj|}||kr|| } || } t| j || }| jj | j| || |}|dkrt | jtjr| j tdn| j|dk ||7 }||d 7 }qp|S )Nr z1buffer must be at least {} bytes for this payloadr int *T)Zrequire_writablezeIn 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 ZXTSr# r ) r* r4 r9 Ztotal_data_lenZdata_processedZ total_outoutlenZ baseoutbufZ baseinbufZoutbufZinbufZinlenr/ r1 r1 r2 r7 s8 z_CipherContext.update_into)r5 c C s | j | jkr,t| jtjr,| jd u r,td| jj d| j}| jj d}| jj | j||}|dkr| j }|st| jtjrt| jj}| jj|d |j|jp|jr|d |j|jp|jo|d j|jk|d tdt| jtjr^| j | jkr^| jj d| j}| jj| j| jjj| j|}| j|dk | jj |d d | _ | jj!| j}| j|dk | jj |d |d S )Nz4Authentication tag must be provided when decrypting.zunsigned char[]r<