U
    ÈZjÕ$  ã                   @   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Crypto.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kr,|s,dt|ƒ | _tƒ }t | ¡ t	|ƒt
t|ƒƒt
|ƒ¡}|rftd| ƒ‚t| ¡ tjƒ| _|r†|  |¡ 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_libZblake2s_initZ
address_ofr   r   ÚlenÚ
ValueErrorr   ÚgetZblake2s_destroyÚ_stateÚupdate)ÚselfÚdataÚkeyÚdigest_bytesÚupdate_after_digestÚstateÚresult© r$   úV/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/Hash/BLAKE2s.pyÚ__init__L   s$    

ýÿzBLAKE2s_Hash.__init__c                 C   sH   | j r| jstdƒ‚t | j ¡ t|ƒtt	|ƒƒ¡}|rDt
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   Z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   Zblake2s_digestr   r   r   r   r
   r   )r   Z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   Zmac_tagÚsecretZmac1Z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)r4   r   r   )r   Zhex_mac_tagr$   r$   r%   Ú	hexverify«   s    zBLAKE2s_Hash.hexverifyc                 K   s$   d|krd|kr| j |d< tf |ŽS )zQReturn a new instance of a BLAKE2s hash object.
        See :func:`new`.
        r    r1   )r   r2   )r   Úkwargsr$   r$   r%   r2   º   s    
zBLAKE2s_Hash.newN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
block_sizer&   r   r(   r/   r4   r5   r2   r$   r$   r$   r%   r   :   s   r   c                  K   sî   |   dd¡}|   dd¡}|   dd¡}|   dd¡}d||fkrDtdƒ‚d||fkrTd	}|dk	r|d
|  krpd	ks¬n tdƒ‚n0d|  kr�dkrœn n|d r¤tdƒ‚|d }|   dd¡}t|ƒd	krÌtdƒ‚| ràt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    r1   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   )r6   r   r!   r    r1   r   r$   r$   r%   r2   Å   s(    
 r2   N)Úbinasciir   ZCrypto.Util.py3compatr   r   ZCrypto.Randomr   ZCrypto.Util._raw_apir   r   r   r	   r
   r   r   r   Úobjectr   r2   r$   r$   r$   r%   Ú<module>   s   $ÿ 