o
    Þý°j  ã                   @   sd   d dl mZmZmZmZmZmZmZ d dlm	Z	 d dl
mZ ddlmZ G dd„ deƒZdd	„ Zd
S )é    )ÚVoidPointerÚSmartPointerÚcreate_string_bufferÚget_raw_bufferÚc_size_tÚc_uint8_ptrÚc_ubyte)Úlong_to_bytes)Úbchré   )Ú_raw_keccak_libc                   @   s:   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„Zdd„ ZdS )Ú
TurboSHAKEzaA TurboSHAKE hash object.
    Do not instantiate directly.
    Use the :func:`new` function.
    c                 C   sj   t ƒ }t | ¡ t|ƒtdƒ¡}|rtd| ƒ‚t| ¡ tj	ƒ| _
d| _|| _|| _|r3|  |¡ d S d S )Né   z'Error %d while instantiating TurboSHAKEF)r   r   Úkeccak_initÚ
address_ofr   r   Ú
ValueErrorr   ÚgetÚkeccak_destroyÚ_stateÚ_is_squeezingÚ	_capacityÚ_domainÚupdate)ÚselfÚcapacityÚdomain_separationÚdataÚstateÚresult© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/Hash/TurboSHAKE128.pyÚ__init__   s    
þÿÿzTurboSHAKE.__init__c                 C   sB   | j rtdƒ‚t | j ¡ t|ƒtt|ƒƒ¡}|rt	d| ƒ‚| S )z¼Continue hashing of a message by consuming the next chunk of data.

        Args:
            data (byte string/byte array/memoryview): The next chunk of the message being hashed.
        z/You cannot call 'update' after the first 'read'z(Error %d while updating TurboSHAKE state)
r   Ú	TypeErrorr   Úkeccak_absorbr   r   r   r   Úlenr   )r   r   r   r   r   r    r   %   s   
þÿzTurboSHAKE.updatec                 C   sF   d| _ t|ƒ}t | j ¡ |t|ƒt| jƒ¡}|rt	d| ƒ‚t
|ƒS )ah  
        Compute the next piece of XOF output.

        .. note::
            You cannot use :meth:`update` anymore after the first call to
            :meth:`read`.

        Args:
            length (integer): the amount of bytes this method must return

        :return: the next piece of XOF output (of the given length)
        :rtype: byte string
        Tz)Error %d while extracting from TurboSHAKE)r   r   r   Úkeccak_squeezer   r   r   r   r   r   r   )r   ÚlengthÚbfrr   r   r   r    Úread7   s   ýÿzTurboSHAKE.readNc                 C   s   t | ƒ| j| j|ƒS ©N)Útyper   r   )r   r   r   r   r    ÚnewR   s   zTurboSHAKE.newc                 C   s*   t  | j ¡ ¡}|rtd| ƒ‚d| _d S )Nz)Error %d while resetting TurboSHAKE stateF)r   Úkeccak_resetr   r   r   r   )r   r   r   r   r    Ú_resetU   s   ÿ
zTurboSHAKE._resetr)   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r   r(   r+   r-   r   r   r   r    r      s    
r   c                  K   sF   |   dd¡}d|  krdksn td| ƒ‚|   d¡}td||d�S )	a†  Create a new TurboSHAKE128 object.

    Args:
       domain (integer):
         Optional - A domain separation byte, between 0x01 and 0x7F.
         The default value is 0x1F.
       data (bytes/bytearray/memoryview):
        Optional - The very first chunk of the message to hash.
        It is equivalent to an early call to :meth:`update`.

    :Return: A :class:`TurboSHAKE` object
    Údomainé   r   é   z&Incorrect domain separation value (%d)r   é    )r   )r   r   r   )Úkwargsr   r   r   r   r    r+   ]   s   ÿ
r+   N)ÚCryptodome.Util._raw_apir   r   r   r   r   r   r   ÚCryptodome.Util.numberr	   ÚCryptodome.Util.py3compatr
   Úkeccakr   Úobjectr   r+   r   r   r   r    Ú<module>   s   $ Q