File: //lib/python3/dist-packages/cryptography/hazmat/backends/openssl/__pycache__/hashes.cpython-38.pyc
U
�e�]| � @ s\ d dl mZmZmZ d dlmZ d dlmZmZ d dl m
Z
e�e
j�G dd� de
��ZdS )� )�absolute_import�division�print_function)�utils)�UnsupportedAlgorithm�_Reasons)�hashesc @ s@ e Zd Zd
dd�Ze�d�Zdd� Zdd� Zd d
� Z dd� Z
dS )�_HashContextNc C s� || _ || _|d kr�| jj�� }| jj�|| jjj�}| j�|�}|| jjjkrdt d�
|j�tj
��| jj�||| jjj�}| j�|dk� || _d S )Nz+{} is not a supported hash on this backend.r )�
_algorithm�_backend�_lib�Cryptography_EVP_MD_CTX_new�_ffi�gc�Cryptography_EVP_MD_CTX_freeZ_evp_md_from_algorithmZNULLr �format�namer ZUNSUPPORTED_HASHZEVP_DigestInit_ex�openssl_assert�_ctx)�selfZbackend� algorithm�ctxZevp_md�res� r �M/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/hashes.py�__init__ s* ����z_HashContext.__init__r
c C sV | j j�� }| j j�|| j jj�}| j j�|| j�}| j �|dk� t | j | j
|d�S )Nr )r )r r r
r r r ZEVP_MD_CTX_copy_exr r r r )r Z
copied_ctxr r r r �copy( s �z_HashContext.copyc C s: | j j�|�}| j j�| j|t|��}| j �|dk� d S )Nr )r r Zfrom_bufferr ZEVP_DigestUpdater �lenr )r �dataZdata_ptrr r r r �update1 s �z_HashContext.updatec C s� t | jtj�r| �� S | jj�d| jjj �}| jj�d�}| jj�
| j||�}| j�|dk� | j�|d | jj
k� | jj�|�d |d � S d S )N�unsigned char[]zunsigned int *r )�
isinstancer r ZExtendableOutputFunction�
_finalize_xofr r �newr ZEVP_MAX_MD_SIZEZEVP_DigestFinal_exr r �digest_size�buffer)r �bufZoutlenr r r r �finalize8 s
��z_HashContext.finalizec C sV | j j�d| jj�}| j j�| j|| jj�}| j �|dk� | j j� |�d | jj� S )Nr r )
r r r# r r$ r ZEVP_DigestFinalXOFr r r% )r r&