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&   úK/usr/local/lib/python3.10/dist-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 )zúUpdate 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