o
    Þý°jå$  ã                   @   sr   d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZ eddƒZG dd„ deƒZd	d
„ ZdS )é    )Ú	unhexlify)ÚbordÚtobytes)Úget_random_bytes)Úload_pycryptodome_raw_libÚVoidPointerÚSmartPointerÚcreate_string_bufferÚget_raw_bufferÚc_size_tÚc_uint8_ptrzCryptodome.Hash._BLAKE2sa²  
                        int blake2s_init(void **state,
                                         const uint8_t *key,
                                         size_t key_size,
                                         size_t digest_size);
                        int blake2s_destroy(void *state);
                        int blake2s_update(void *state,
                                           const uint8_t *buf,
                                           size_t len);
                        int blake2s_digest(const void *state,
                                           uint8_t digest[32]);
                        int blake2s_copy(const void *src, void *dst);
                        c                   @   sL   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚBLAKE2s_Hasha–  A BLAKE2s hash object.
    Do not instantiate directly. Use the :func:`new` function.

    :ivar oid: ASN.1 Object ID
    :vartype oid: string

    :ivar block_size: the size in bytes of the internal message block,
                      input to the compression function
    :vartype block_size: integer

    :ivar digest_size: the size in bytes of the resulting hash
    :vartype digest_size: integer
    é    c                 C   sŽ   || _ || _d| _|dv r|sdt|ƒ | _tƒ }t | ¡ t	|ƒt
t|ƒƒt
|ƒ¡}|r3td| ƒ‚t| ¡ tjƒ| _|rE|  |¡ d S d S )NF)é   é   é   r   z1.3.6.1.4.1.1722.12.2.2.z$Error %d while instantiating BLAKE2s)Údigest_sizeÚ_update_after_digestÚ_digest_doneÚstrÚoidr   Ú_raw_blake2s_libÚblake2s_initÚ
address_ofr   r   ÚlenÚ
ValueErrorr   ÚgetÚblake2s_destroyÚ_stateÚupdate)ÚselfÚdataÚkeyÚdigest_bytesÚupdate_after_digestÚstateÚresult© r'   úŠ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2s.pyÚ__init__L   s&   

ýÿÿzBLAKE2s_Hash.__init__c                 C   sH   | j r
| js
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.
        z8You can only call 'digest' or 'hexdigest' on this objectz#Error %d while hashing BLAKE2s data)r   r   Ú	TypeErrorr   Úblake2s_updater   r   r   r   r   r   )r    r!   r&   r'   r'   r(   r   f   s   
þzBLAKE2s_Hash.updatec                 C   sB   t dƒ}t | j ¡ |¡}|rtd| ƒ‚d| _t|ƒd| j… S )zçReturn the **binary** (non-printable) digest of the message that has been hashed so far.

        :return: The hash digest, computed over the data processed so far.
                 Binary form.
        :rtype: byte string
        r   z&Error %d while creating BLAKE2s digestTN)	r	   r   Úblake2s_digestr   r   r   r   r
   r   )r    Úbfrr&   r'   r'   r(   Údigestx   s   ÿzBLAKE2s_Hash.digestc                 C   s   d  dd„ t|  ¡ ƒD ƒ¡S )zÝReturn the **printable** digest of the message that has been hashed so far.

        :return: The hash digest, computed over the data processed so far.
                 Hexadecimal encoded.
        :rtype: string
        Ú c                 S   s   g | ]}d t |ƒ ‘qS )z%02x)r   )Ú.0Úxr'   r'   r(   Ú
<listcomp>“   s    z*BLAKE2s_Hash.hexdigest.<locals>.<listcomp>)ÚjoinÚtupler.   )r    r'   r'   r(   Ú	hexdigest‹   s   zBLAKE2s_Hash.hexdigestc                 C   sD   t dƒ}td||d�}td||  ¡ d�}| ¡ | ¡ kr tdƒ‚dS )ag  Verify that a given **binary** MAC (computed by another party)
        is valid.

        Args:
          mac_tag (byte string/byte array/memoryview): the expected MAC of the message.

        Raises:
            ValueError: if the MAC does not match. It means that the message
                has been tampered with or that the MAC key is incorrect.
        r   é    )Údigest_bitsr"   r!   zMAC check failedN)r   Únewr.   r   )r    Úmac_tagÚsecretÚmac1Úmac2r'   r'   r(   Úverify–   s   ÿzBLAKE2s_Hash.verifyc                 C   s   |   tt|ƒƒ¡ dS )an  Verify that a given **printable** MAC (computed by another party)
        is valid.

        Args:
            hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string.

        Raises:
            ValueError: if the MAC does not match. It means that the message
                has been tampered with or that the MAC key is incorrect.
        N)r=   r   r   )r    Úhex_mac_tagr'   r'   r(   Ú	hexverify«   s   zBLAKE2s_Hash.hexverifyc                 K   s(   d|vrd|vr| j |d< tdi |¤ŽS )zQReturn a new instance of a BLAKE2s hash object.
        See :func:`new`.
        r#   r7   Nr'   )r   r8   )r    Úkwargsr'   r'   r(   r8   º   s   
zBLAKE2s_Hash.newN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
block_sizer)   r   r.   r5   r=   r?   r8   r'   r'   r'   r(   r   :   s    r   c                  K   sú   |   dd¡}|   dd¡}|   dd¡}|   dd¡}d||fvr"tdƒ‚d||fkr*d	}|durAd
|  kr;d	ks@tdƒ‚ tdƒ‚nd|  krKdkrTn tdƒ‚|d rXtdƒ‚|d }|   dd¡}t|ƒd	krltdƒ‚| rvtdt| ƒ ƒ‚t||||ƒS )aÏ  Create a new hash object.

    Args:
        data (byte string/byte array/memoryview):
            Optional. The very first chunk of the message to hash.
            It is equivalent to an early call to :meth:`BLAKE2s_Hash.update`.
        digest_bytes (integer):
            Optional. The size of the digest, in bytes (1 to 32). Default is 32.
        digest_bits (integer):
            Optional and alternative to ``digest_bytes``.
            The size of the digest, in bits (8 to 256, in steps of 8).
            Default is 256.
        key (byte string):
            Optional. The key to use to compute the MAC (1 to 64 bytes).
            If not specified, no key will be used.
        update_after_digest (boolean):
            Optional. By default, a hash object cannot be updated anymore after
            the digest is computed. When this flag is ``True``, such check
            is no longer enforced.

    Returns:
        A :class:`BLAKE2s_Hash` hash object
    r!   Nr$   Fr#   r7   z*Only one digest parameter must be provided)NNr   é   z!'digest_bytes' not in range 1..32é   é   z2'digest_bits' not in range 8..256, with steps of 8r"   ó    z"BLAKE2s key cannot exceed 32 byteszUnknown parameters: )Úpopr*   r   r   r   r   )r@   r!   r$   r#   r7   r"   r'   r'   r(   r8   Å   s2   ÿÿÿr8   N)Úbinasciir   ÚCryptodome.Util.py3compatr   r   ÚCryptodome.Randomr   ÚCryptodome.Util._raw_apir   r   r   r	   r
   r   r   r   Úobjectr   r8   r'   r'   r'   r(   Ú<module>   s   $ÿ 