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   typingZ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   ZBACKEND_MISSING_INTERFACEr   	TypeError
_algorithm_backendZ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   Z_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 )Nr0   )r-   r.   )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 )Nr0   )r,   r   r!   )r   Zdigestr   r   r   r!   j   s
   

zHash.finalize)NN)r	   r'   )r   r   r   r   r/   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 )SHA1Zsha1   @   Nr   r   r   r   r   r   r   r   r   r   r3   r       r3   c                   @   r2   )
SHA512_224z
sha512-224      Nr6   r   r   r   r   r8   x   r7   r8   c                   @   r2   )
SHA512_256z
sha512-256    r:   Nr6   r   r   r   r   r;   ~   r7   r;   c                   @   r2   )SHA224Zsha224r9   r5   Nr6   r   r   r   r   r=      r7   r=   c                   @   r2   )SHA256Zsha256r<   r5   Nr6   r   r   r   r   r>      r7   r>   c                   @   r2   )SHA384Zsha3840   r:   Nr6   r   r   r   r   r?      r7   r?   c                   @   r2   )SHA512Zsha512r5   r:   Nr6   r   r   r   r   rA      r7   rA   c                   @      e Zd ZdZdZdZdS )SHA3_224zsha3-224r9   Nr6   r   r   r   r   rC      r7   rC   c                   @   rB   )SHA3_256zsha3-256r<   Nr6   r   r   r   r   rD      r7   rD   c                   @   rB   )SHA3_384zsha3-384r@   Nr6   r   r   r   r   rE      r7   rE   c                   @   rB   )SHA3_512zsha3-512r5   Nr6   r   r   r   r   rF      r7   rF   c                   @   ,   e Zd ZdZdZdefddZedZ	dS )SHAKE128Z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   r/      
   

zSHAKE128.__init__rN   
r   r   r   r   r   r   r/   r   r1   r   r   r   r   r   rH      
    	rH   c                   @   rG   )SHAKE256Zshake256Nr   c                 C   rI   rJ   rL   rO   r   r   r   r/      rP   zSHAKE256.__init__rN   rQ   r   r   r   r   rS      rR   rS   c                   @   r2   )MD5Zmd5   r5   Nr6   r   r   r   r   rT      r7   rT   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 )
BLAKE2bZblake2br5   rK   r:   r   c                 C      |dkrt d|| _d S )Nr5   zDigest size must be 64rM   rN   rO   r   r   r   r/         
zBLAKE2b.__init__rN   N)r   r   r   r   _max_digest_size_min_digest_sizer   r   r/   r   r1   r   r   r   r   r   rW          rW   c                   @   rV   )
BLAKE2sZblake2sr5   r<   rK   r   c                 C   rX   )Nr<   zDigest size must be 32rY   rO   r   r   r   r/      rZ   zBLAKE2s.__init__rN   N)r   r   r   r   r   r[   r\   r   r/   r   r1   r   r   r   r   r   r^      r]   r^   )!r   r   Zcryptographyr   Zcryptography.exceptionsr   r   r   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr   ABCMetar   r   r%   r'   r3   r8   r;   r=   r>   r?   rA   rC   rD   rE   rF   rH   rS   rT   rW   r^   r   r   r   r   <module>   s4   +