관리-도구
편집 파일: ciphers.cpython-39.opt-1.pyc
a ope�( � @ s| d dl mZ d dlmZmZmZ d dlmZ d dlm Z e� ej�e� ej�e� ej �e� ej�G dd� de�����ZdS )� )�utils)� InvalidTag�UnsupportedAlgorithm�_Reasons)�ciphers)�modesc @ sx e Zd ZdZdZdZdd� Zeed�dd�Zee d�d d �Z ed�dd �Zeed�dd�Zedd�dd�Z e�d�ZdS )�_CipherContext� r i���?c C sF || _ || _|| _|| _d | _t| jtj�r<| jjd | _ nd| _ | j j �� }| j j� || j j j�}| j j}z|t|�t|�f }W n2 ty� td�|j|r�|jn|�tj��Y n0 || j ||�}|| j jjk�rd�|�} |d ur�| d�|�7 } | d�| j �� �7 } t| tj��t|tj��r6| j j�|j�} njt|tj��rV| j j�|j�} nJt|tj��rv| j j�|j �} n*t|tj��r�| 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 u�r�| j j �'|| j j j*t$|j)�|j)�}| j �"|dk� |j)| _| j j �!|| j jj| j jj| j j�|j%�| |�}| j �+� }| j j } |dk�r| j,�r�|d �-| j.| j/��s| j0�r|d �-| j1| j2��rt3d��| 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 allowed��errors)6�_backendZ_cipher�_mode� _operation�_tag� isinstancer ZBlockCipherAlgorithm� block_size�_block_size_bytes�_libZEVP_CIPHER_CTX_new�_ffi�gcZEVP_CIPHER_CTX_freeZ_cipher_registry�type�KeyErrorr �format�namer ZUNSUPPORTED_CIPHER�NULLZopenssl_version_textr ZModeWithInitializationVector�from_bufferZinitialization_vectorZ ModeWithTweakZtweakZ ModeWithNonceZnonceZEVP_CipherInit_ex�openssl_assertZEVP_CIPHER_CTX_set_key_length�len�key�GCM�EVP_CIPHER_CTX_ctrlZEVP_CTRL_AEAD_SET_IVLEN�tag�EVP_CTRL_AEAD_SET_TAG�_consume_errorsZ$CRYPTOGRAPHY_OPENSSL_111D_OR_GREATER�_lib_reason_match�ERR_LIB_EVPZEVP_R_XTS_DUPLICATED_KEYS�Cryptography_HAS_PROVIDERS�ERR_LIB_PROVZPROV_R_XTS_DUPLICATED_KEYS� ValueErrorZEVP_CIPHER_CTX_set_padding�_ctx)�selfZbackendZcipher�modeZ operation�ctx�registryZadapterZ evp_cipher�msgZiv_nonce�resr �lib� r2 �R/usr/lib64/python3.9/site-packages/cryptography/hazmat/backends/openssl/ciphers.py�__init__ s� ��� ��� � ���� ���� ��z_CipherContext.__init__)�data�returnc C s2 t t|�| j d �}| �||�}t|d |� �S )Nr )� bytearrayr r �update_into�bytes)r+ r5 �buf�nr2 r2 r3 �update� s z_CipherContext.updatec C s t |�}t |�|| j d k r:td�t |�| j d ���d}d}| jj�d�}| jjj|dd�}| jj�|�}||k�r|| } || } t| j || �}| jj �| j| || |�}|dkr�t | jtj�r�| j�� td��n| 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+ r5 r: Ztotal_data_lenZdata_processedZ total_out�outlenZ baseoutbufZ baseinbufZoutbufZinbufZinlenr0 r2 r2 r3 r8 � s8 �� � �z_CipherContext.update_into)r6 c C s� | j | jkr,t| jtj�r,| jd u r,td��| jj � d| j�}| jj � d�}| jj� | j||�}|dkr�| j�� }|s�t| jtj�r�t�| jj}| jj|d �|j|j�p�|jr�|d �|j|j�p�|jo�|d j|jk|d� td��t| jtj��r^| j | jk�r^| 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= r r zFThe length of the provided data is not a multiple of the block length.r )"r �_DECRYPTr r r ZModeWithAuthenticationTagr"