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._BLAKE2ba²  
                        int blake2b_init(void **state,
                                         const uint8_t *key,
                                         size_t key_size,
                                         size_t digest_size);
                        int blake2b_destroy(void *state);
                        int blake2b_update(void *state,
                                           const uint8_t *buf,
                                           size_t len);
                        int blake2b_digest(const void *state,
                                           uint8_t digest[64]);
                        int blake2b_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 )ÚBLAKE2b_Hasha–  A BLAKE2b 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)é   é    é0   r   z1.3.6.1.4.1.1722.12.2.1.z$Error %d while instantiating BLAKE2b)Údigest_sizeÚ_update_after_digestÚ_digest_doneÚstrÚoidr   Ú_raw_blake2b_libÚblake2b_initÚ
address_ofr   r   ÚlenÚ
ValueErrorr   ÚgetÚblake2b_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/BLAKE2b.pyÚ__init__L   s&   

ýÿÿzBLAKE2b_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 (bytes/bytearray/memoryview): The next chunk of the message being hashed.
        z8You can only call 'digest' or 'hexdigest' on this objectz#Error %d while hashing BLAKE2b data)r   r   Ú	TypeErrorr   Úblake2b_updater   r   r   r   r   r   )r    r!   r&   r'   r'   r(   r   f   s   
þzBLAKE2b_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 BLAKE2b digestTN)	r	   r   Úblake2b_digestr   r   r   r   r
   r   )r    Úbfrr&   r'   r'   r(   Údigestx   s   ÿzBLAKE2b_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*BLAKE2b_Hash.hexdigest.<locals>.<listcomp>)ÚjoinÚtupler.   )r    r'   r'   r(   Ú	hexdigest‹   s   zBLAKE2b_Hash.hexdigestc                 C   sD   t dƒ}td||d�}td||  ¡ d�}| ¡ | ¡ kr tdƒ‚dS )a`  Verify that a given **binary** MAC (computed by another party)
        is valid.

        Args:
          mac_tag (bytes/bytearray/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.
        é   é    )Údigest_bitsr"   r!   zMAC check failedN)r   Únewr.   r   )r    Úmac_tagÚsecretÚmac1Úmac2r'   r'   r(   Úverify–   s   ÿzBLAKE2b_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BLAKE2b_Hash.hexverifyc                 K   s(   d|vrd|vr| j |d< tdi |¤ŽS )zQReturn a new instance of a BLAKE2b hash object.
        See :func:`new`.
        r#   r8   Nr'   )r   r9   )r    Úkwargsr'   r'   r(   r9   º   s   
zBLAKE2b_Hash.newN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
block_sizer)   r   r.   r5   r>   r@   r9   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 (bytes/bytearray/memoryview):
            Optional. The very first chunk of the message to hash.
            It is equivalent to an early call to :meth:`BLAKE2b_Hash.update`.
        digest_bytes (integer):
            Optional. The size of the digest, in bytes (1 to 64). Default is 64.
        digest_bits (integer):
            Optional and alternative to ``digest_bytes``.
            The size of the digest, in bits (8 to 512, in steps of 8).
            Default is 512.
        key (bytes/bytearray/memoryview):
            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:`BLAKE2b_Hash` hash object
    r!   Nr$   Fr#   r8   z*Only one digest parameter must be provided)NNr   é   z!'digest_bytes' not in range 1..64é   i   z2'digest_bits' not in range 8..512, with steps of 8r"   ó    z"BLAKE2b key cannot exceed 64 byteszUnknown parameters: )Úpopr*   r   r   r   r   )rA   r!   r$   r#   r8   r"   r'   r'   r(   r9   Å   s2   ÿÿÿr9   N)Úbinasciir   ÚCryptodome.Util.py3compatr   r   ÚCryptodome.Randomr   ÚCryptodome.Util._raw_apir   r   r   r	   r
   r   r   r   Úobjectr   r9   r'   r'   r'   r(   Ú<module>   s   $ÿ 