o
    �)%a£  ã                   @   sœ  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ G dd„ de jd�ZG d	d
„ d
e jd�ZG dd„ de jd�ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&eeƒZG d'd(„ d(eeƒZG d)d*„ d*eƒZG d+d,„ d,eƒZG d-d.„ d.eƒZ dS )/é    N)Úutils)ÚAlreadyFinalizedÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚHashBackendc                   @   sN   e Zd Zejdefdd„ƒZejdefdd„ƒZejde	j
e fdd„ƒZdS )	ÚHashAlgorithmÚreturnc                 C   ó   dS )zH
        A string naming this algorithm (e.g. "sha256", "md5").
        N© ©Úselfr   r   úG/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/hashes.pyÚname   ó    zHashAlgorithm.namec                 C   r
   )z<
        The size of the resulting digest in bytes.
        Nr   r   r   r   r   Údigest_size   r   zHashAlgorithm.digest_sizec                 C   r
   )z�
        The internal block size of the hash function, or None if the hash
        function does not use blocks internally (e.g. SHA3).
        Nr   r   r   r   r   Ú
block_size   r   zHashAlgorithm.block_sizeN)Ú__name__Ú
__module__Ú__qualname__ÚabcÚabstractpropertyÚstrr   Úintr   ÚtypingÚOptionalr   r   r   r   r   r      s    r   )Ú	metaclassc                   @   s\   e Zd Zejdefdd„ƒZejdeddfdd„ƒZ	ejdefdd	„ƒZ
ejdd
d„ƒZdS )ÚHashContextr	   c                 C   r
   )zD
        A HashAlgorithm that will be used by this context.
        Nr   r   r   r   r   Ú	algorithm(   r   zHashContext.algorithmÚdataNc                 C   r
   )z@
        Processes the provided bytes through the hash.
        Nr   ©r   r   r   r   r   Úupdate.   r   zHashContext.updatec                 C   r
   )zR
        Finalizes the hash context and returns the hash digest as bytes.
        Nr   r   r   r   r   Úfinalize4   r   zHashContext.finalizec                 C   r
   )zM
        Return a HashContext that is a copy of the current context.
        Nr   r   r   r   r   Úcopy:   r   zHashContext.copy)r	   r   )r   r   r   r   r   r   r   ÚabstractmethodÚbytesr!   r"   r#   r   r   r   r   r   '   s    r   c                   @   s   e Zd ZdZdS )ÚExtendableOutputFunctionz7
    An interface for extendable output functions.
    N)r   r   r   Ú__doc__r   r   r   r   r&   A   s    r&   c                   @   sP   e Zd Zddefdd„Ze d¡Zdeddfdd	„Z	dd
d„Z
defdd„ZdS )ÚHashNr   c                 C   sb   t |ƒ}t|tƒstdtjƒ‚t|tƒstdƒ‚|| _|| _	|d u r,| j	 
| j¡| _d S || _d S )Nz.Backend object does not implement HashBackend.z*Expected instance of hashes.HashAlgorithm.)r   Ú
isinstancer   r   r   ÚBACKEND_MISSING_INTERFACEr   Ú	TypeErrorÚ
_algorithmÚ_backendÚcreate_hash_ctxr   Ú_ctx)r   r   ÚbackendÚctxr   r   r   Ú__init__H   s   
þ

zHash.__init__r,   r   r	   c                 C   s.   | j d u r	tdƒ‚t d|¡ | j  |¡ d S )NúContext was already finalized.r   )r/   r   r   Ú_check_bytesliker!   r    r   r   r   r!   ]   s   
zHash.updatec                 C   s*   | j d u r	tdƒ‚t| j| j| j  ¡ d�S )Nr3   )r0   r1   )r/   r   r(   r   r-   r#   r   r   r   r   r#   c   s
   
ÿz	Hash.copyc                 C   s&   | j d u r	tdƒ‚| j  ¡ }d | _ |S )Nr3   )r/   r   r"   )r   Údigestr   r   r   r"   j   s
   

zHash.finalize)NN)r	   r(   )r   r   r   r   r2   r   Úread_only_propertyr   r%   r!   r#   r"   r   r   r   r   r(   G   s    

r(   c                   @   ó   e Zd ZdZdZdZdS )ÚSHA1Úsha1é   é@   N©r   r   r   r   r   r   r   r   r   r   r8   r   ó    r8   c                   @   r7   )Ú
SHA512_224z
sha512-224é   é€   Nr<   r   r   r   r   r>   x   r=   r>   c                   @   r7   )Ú
SHA512_256z
sha512-256é    r@   Nr<   r   r   r   r   rA   ~   r=   rA   c                   @   r7   )ÚSHA224Úsha224r?   r;   Nr<   r   r   r   r   rC   „   r=   rC   c                   @   r7   )ÚSHA256Úsha256rB   r;   Nr<   r   r   r   r   rE   Š   r=   rE   c                   @   r7   )ÚSHA384Úsha384é0   r@   Nr<   r   r   r   r   rG   �   r=   rG   c                   @   r7   )ÚSHA512Úsha512r;   r@   Nr<   r   r   r   r   rJ   –   r=   rJ   c                   @   ó   e Zd ZdZdZdZdS )ÚSHA3_224zsha3-224r?   Nr<   r   r   r   r   rM   œ   r=   rM   c                   @   rL   )ÚSHA3_256zsha3-256rB   Nr<   r   r   r   r   rN   ¢   r=   rN   c                   @   rL   )ÚSHA3_384zsha3-384rI   Nr<   r   r   r   r   rO   ¨   r=   rO   c                   @   rL   )ÚSHA3_512zsha3-512r;   Nr<   r   r   r   r   rP   ®   r=   rP   c                   @   ó,   e Zd ZdZdZdefdd„Ze d¡Z	dS )ÚSHAKE128Úshake128Nr   c                 C   ó,   t |tƒs	tdƒ‚|dk rtdƒ‚|| _d S ©Nzdigest_size must be an integeré   z&digest_size must be a positive integer©r)   r   r+   Ú
ValueErrorÚ_digest_size©r   r   r   r   r   r2   ¸   ó
   

zSHAKE128.__init__rY   ©
r   r   r   r   r   r   r2   r   r6   r   r   r   r   r   rR   ´   ó
    	rR   c                   @   rQ   )ÚSHAKE256Úshake256Nr   c                 C   rT   rU   rW   rZ   r   r   r   r2   È   r[   zSHAKE256.__init__rY   r\   r   r   r   r   r^   Ä   r]   r^   c                   @   r7   )ÚMD5Úmd5é   r;   Nr<   r   r   r   r   r`   Ô   r=   r`   c                   @   ó4   e Zd ZdZdZdZdZdefdd„Ze	 
d¡Zd	S )
ÚBLAKE2bÚblake2br;   rV   r@   r   c                 C   ó   |dkrt dƒ‚|| _d S )Nr;   zDigest size must be 64©rX   rY   rZ   r   r   r   r2   à   ó   
zBLAKE2b.__init__rY   N)r   r   r   r   Ú_max_digest_sizeÚ_min_digest_sizer   r   r2   r   r6   r   r   r   r   r   rd   Ú   ó    rd   c                   @   rc   )
ÚBLAKE2sÚblake2sr;   rB   rV   r   c                 C   rf   )NrB   zDigest size must be 32rg   rZ   r   r   r   r2   ð   rh   zBLAKE2s.__init__rY   N)r   r   r   r   r   ri   rj   r   r2   r   r6   r   r   r   r   r   rl   ê   rk   rl   )!r   r   Úcryptographyr   Úcryptography.exceptionsr   r   r   Úcryptography.hazmat.backendsr   Ú'cryptography.hazmat.backends.interfacesr   ÚABCMetar   r   r&   r(   r8   r>   rA   rC   rE   rG   rJ   rM   rN   rO   rP   rR   r^   r`   rd   rl   r   r   r   r   Ú<module>   s4   +