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   