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sha3840   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   +