o
    g"                     @   s  U d dl mZmZ d dlmZ d dlmZmZ d dl	m
Z
 e Zeed< e Zeed< e Zeed< e Zeed< e Zeed	< e Zeed
< e Zeed< e Zeed< e Zeed< dZdZ dede!de!de!ddf
ddZ"edddfde!dede!de!de!de!fddZ#edddZ$G dd dZ%dddefde!de!de!dede%f
d d!Z&d"e%de!ddfd#d$Z'd"e%de!fd%d&Z(dS )'    )NoReturnTypeVar)
exceptions)ffilib)ensurecrypto_generichash_BYTEScrypto_generichash_BYTES_MINcrypto_generichash_BYTES_MAXcrypto_generichash_KEYBYTEScrypto_generichash_KEYBYTES_MINcrypto_generichash_KEYBYTES_MAXcrypto_generichash_SALTBYTES crypto_generichash_PERSONALBYTEScrypto_generichash_STATEBYTESz!{0} length greater than {1} bytesz{0} greater than {1}digest_sizekeysaltpersonreturnNc                 C   s   t t|tdtjd t t|tdtjd t t|tdtjd t t| tdtjd t | tktdttj	d t t
|tktdttj	d t t
|tktdttj	d t t
|tktd	ttj	d d
S )zCheck hash parameterszKey must be a bytes sequenceraisingzSalt must be a bytes sequencezPerson must be a bytes sequencez%Digest size must be an integer numberDigest_sizeKeySaltPersonN)r   
isinstancebytesexc	TypeErrorintr
   _TOOBIGformat
ValueErrorlenr   	_OVERLONGr   r   )r   r   r   r    r&   Z/var/www/html/api-tag/env/lib/python3.10/site-packages/nacl/bindings/crypto_generichash.py_checkparams)   sP   







r(       datac           	   
   C   s   t |||| tt| tdtjd td|}tdt}tdt	}t
||t| t
||t| t||| t| |t|||}t|dkdtjd t||dd S )ab  One shot hash interface

    :param data: the input data to the hash function
    :type data: bytes
    :param digest_size: must be at most
                        :py:data:`.crypto_generichash_BYTES_MAX`;
                        the default digest size is
                        :py:data:`.crypto_generichash_BYTES`
    :type digest_size: int
    :param key: must be at most
                :py:data:`.crypto_generichash_KEYBYTES_MAX` long
    :type key: bytes
    :param salt: must be at most
                 :py:data:`.crypto_generichash_SALTBYTES` long;
                 will be zero-padded if needed
    :type salt: bytes
    :param person: must be at most
                   :py:data:`.crypto_generichash_PERSONALBYTES` long:
                   will be zero-padded if needed
    :type person: bytes
    :return: digest_size long digest
    :rtype: bytes
    #Input data must be a bytes sequencer   unsigned char[]unsigned char []r   Unexpected failureN)r(   r   r   r   r   r   r   newr   r   memmover$   r   (crypto_generichash_blake2b_salt_personalRuntimeErrorbuffer)	r*   r   r   r   r   digest_salt_personrcr&   r&   r'   !generichash_blake2b_salt_personal^   s    r8   _Blake2StateBlake2State)boundc                   @   sF   e Zd ZdZddgZdefddZdefddZd	e	de	fd
dZ
dS )r:   zN
    Python-level wrapper for the crypto_generichash_blake2b state buffer
    	_statebufr   c                 C   s   t dt| _|| _d S )Nr,   )r   r/   r   r<   r   )selfr   r&   r&   r'   __init__   s   
zBlake2State.__init__r   c                 C   s   t d| jj)zc
        Raise the same exception as hashlib's blake implementation
        on copy.copy()
        zcan't pickle {} objects)r   r"   	__class____name__)r=   r&   r&   r'   
__reduce__   s   zBlake2State.__reduce__r=   c                 C   s"   |  | j}t|j| jt |S )N)r?   r   r   r0   r<   r   )r=   _str&   r&   r'   copy   s
   
zBlake2State.copyN)r@   
__module____qualname____doc__	__slots__r    r>   r   rA   r9   rC   r&   r&   r&   r'   r:      s    	c                 C   s   t || || t|}tdt}tdt}t||t| t||t| t	|j
| t| |||}t|dkdtjd |S )a@  
    Create a new initialized blake2b hash state

    :param key: must be at most
                :py:data:`.crypto_generichash_KEYBYTES_MAX` long
    :type key: bytes
    :param salt: must be at most
                 :py:data:`.crypto_generichash_SALTBYTES` long;
                 will be zero-padded if needed
    :type salt: bytes
    :param person: must be at most
                   :py:data:`.crypto_generichash_PERSONALBYTES` long:
                   will be zero-padded if needed
    :type person: bytes
    :param digest_size: must be at most
                        :py:data:`.crypto_generichash_BYTES_MAX`;
                        the default digest size is
                        :py:data:`.crypto_generichash_BYTES`
    :type digest_size: int
    :return: a initialized :py:class:`.Blake2State`
    :rtype: object
    r-   r   r.   r   )r(   r:   r   r/   r   r   r0   r$   r   -crypto_generichash_blake2b_init_salt_personalr<   r   r   r2   )r   r   r   r   stater5   r6   r7   r&   r&   r'   generichash_blake2b_init   s   rJ   rI   c                 C   sX   t t| tdtjd t t|tdtjd t| j|t	|}t |dkdtj
d dS )zUpdate the blake2b hash state

    :param state: a initialized Blake2bState object as returned from
                     :py:func:`.crypto_generichash_blake2b_init`
    :type state: :py:class:`.Blake2State`
    :param data:
    :type data: bytes
    "State must be a Blake2State objectr   r+   r   r.   N)r   r   r:   r   r   r   r   !crypto_generichash_blake2b_updater<   r$   r2   )rI   r*   r7   r&   r&   r'   generichash_blake2b_update   s   
rM   c                 C   s^   t t| tdtjd tdt}t	| j
|| j}t |dkdtjd t|| jdd S )a:  Finalize the blake2b hash state and return the digest.

    :param state: a initialized Blake2bState object as returned from
                     :py:func:`.crypto_generichash_blake2b_init`
    :type state: :py:class:`.Blake2State`
    :return: the blake2 digest of the passed-in data stream
    :rtype: bytes
    rK   r   r,   r   r.   N)r   r   r:   r   r   r   r/   r
   r    crypto_generichash_blake2b_finalr<   r   r2   r3   )rI   _digestr7   r&   r&   r'   generichash_blake2b_final  s   

rP   ))typingr   r   naclr   r   nacl._sodiumr   r   nacl.exceptionsr    crypto_generichash_blake2b_bytesr   r    __annotations__$crypto_generichash_blake2b_bytes_minr	   $crypto_generichash_blake2b_bytes_maxr
   #crypto_generichash_blake2b_keybytesr   'crypto_generichash_blake2b_keybytes_minr   'crypto_generichash_blake2b_keybytes_maxr   $crypto_generichash_blake2b_saltbytesr   (crypto_generichash_blake2b_personalbytesr   crypto_generichash_statebytesr   r%   r!   r   r(   r8   r9   r:   rJ   rM   rP   r&   r&   r&   r'   <module>   s   



7
8
0