o
    )%a                     @   s>   d dl mZ d dlmZmZ d dlmZ G dd dejZdS )    )utils)UnsupportedAlgorithm_Reasons)hashesc                   @   s`   e Zd ZddejfddZedZdddZ	d	e
ddfd
dZde
fddZde
fddZdS )_HashContextN	algorithmc                 C   s   || _ || _|d u rF| jj }| jj|| jjj}| j|}|| jjjkr2t	d
|jtj| jj||| jjj}| j|dk || _d S )Nz+{} is not a supported hash on this backend.r   )
_algorithm_backend_libEVP_MD_CTX_new_ffigcEVP_MD_CTX_free_evp_md_from_algorithmNULLr   formatnamer   UNSUPPORTED_HASHEVP_DigestInit_exopenssl_assert_ctx)selfbackendr   ctxevp_mdres r   M/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/hashes.py__init__   s(   

z_HashContext.__init__r   returnc                 C   sV   | j j }| j j|| j jj}| j j|| j}| j |dk t	| j | j
|dS )Nr   )r   )r	   r
   r   r   r   r   EVP_MD_CTX_copy_exr   r   r   r   )r   
copied_ctxr   r   r   r   copy'   s   
z_HashContext.copydatac                 C   s:   | j j|}| j j| j|t|}| j |dk d S )Nr   )r	   r   from_bufferr
   EVP_DigestUpdater   lenr   )r   r#   data_ptrr   r   r   r   update0   s
   z_HashContext.updatec                 C   s   t | jtjr|  S | jjd| jjj	}| jjd}| jj
| j||}| j|dk | j|d | jjk | jj|d |d  S )Nunsigned char[]zunsigned int *r   )
isinstancer   r   ExtendableOutputFunction_finalize_xofr	   r   newr
   EVP_MAX_MD_SIZEEVP_DigestFinal_exr   r   digest_sizebuffer)r   bufoutlenr   r   r   r   finalize7   s   
z_HashContext.finalizec                 C   sV   | j jd| jj}| j j| j|| jj}| j |dk | j j	|d | jj S )Nr)   r   )
r	   r   r-   r   r0   r
   EVP_DigestFinalXOFr   r   r1   )r   r2   r   r   r   r   r,   G   s   z_HashContext._finalize_xof)N)r   r   )__name__
__module____qualname__r   HashAlgorithmr   r   read_only_propertyr   r"   bytesr(   r4   r,   r   r   r   r   r      s    

	r   N)	cryptographyr   cryptography.exceptionsr   r   cryptography.hazmat.primitivesr   HashContextr   r   r   r   r   <module>   s   