o
    ©—hô  ã                   @   s  d Z ddlmZ 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 g d¢ZejZ	 G d	d
„ d
eƒZefdededededededededefdd„Zefdededededededededefdd„Zdededede	d fdd„Zdededefdd„Zdedefd d!„Zd"S )#u@  
Low-level functions if you want to build your own higher level abstractions.

.. warning::
    This is a "Hazardous Materials" module.  You should **ONLY** use it if
    you're 100% absolutely sure that you know what youâ€™re doing because this
    module is full of land mines, dragons, and dinosaurs with laser guns.
é    )ÚEnum)ÚAny)ÚffiÚlibé   )ÚLiteral)ÚHashingErrorÚVerificationErrorÚVerifyMismatchError)ÚARGON2_VERSIONÚTyper   Úhash_secretÚhash_secret_rawÚverify_secretc                   @   s&   e Zd ZdZejZ	 ejZ	 ej	Z
dS )r   zX
    Enum of Argon2 variants.

    Please see :doc:`parameters` on how to pick one.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚArgon2_dÚDÚArgon2_iÚIÚ	Argon2_idÚID© r   r   úK/var/www/html/env_mimamsha/lib/python3.10/site-packages/argon2/low_level.pyr   '   s    r   ÚsecretÚsaltÚ	time_costÚmemory_costÚparallelismÚhash_lenÚtypeÚversionÚreturnc                 C   sˆ   t  |||t|ƒ||j¡d }t d|¡}	t  |||t d| ¡t| ƒt d|¡t|ƒtj||	||j|¡}
|
t jkr?t	t
|
ƒƒ‚t |	¡S )aÜ  
    Hash *secret* and return an **encoded** hash.

    An encoded hash can be directly passed into :func:`verify_secret` as it
    contains all parameters and the salt.

    :param bytes secret: Secret to hash.
    :param bytes salt: A salt_.  Should be random and different for each
        secret.
    :param Type type: Which Argon2 variant to use.
    :param int version: Which Argon2 version to use.

    For an explanation of the Argon2 parameters see :class:`PasswordHasher`.

    :rtype: bytes

    :raises argon2.exceptions.HashingError: If hashing fails.

    .. versionadded:: 16.0.0

    .. _salt: https://en.wikipedia.org/wiki/Salt_(cryptography)
    .. _kibibytes: https://en.wikipedia.org/wiki/Binary_prefix#kibi
    r   úchar[]ú	uint8_t[])r   Úargon2_encodedlenÚlenÚvaluer   ÚnewÚargon2_hashÚNULLÚ	ARGON2_OKr   Úerror_to_strÚstring)r   r   r   r   r    r!   r"   r#   ÚsizeÚbufÚrvr   r   r   r   G   s<   "úøÿ

ó

r   c           
      C   sp   t  d|¡}t |||t  d| ¡t| ƒt  d|¡t|ƒ||t jd|j|¡}	|	tjkr0tt	|	ƒƒ‚t
t  ||¡ƒS )z—
    Hash *password* and return a **raw** hash.

    This function takes the same parameters as :func:`hash_secret`.

    .. versionadded:: 16.0.0
    r&   r   )r   r*   r   r+   r(   r,   r)   r-   r   r.   ÚbytesÚbuffer)
r   r   r   r   r    r!   r"   r#   r1   r2   r   r   r   r   ‰   s&   

ó
r   ÚhashTc                 C   sV   t  t d| ¡t d|¡t|ƒ|j¡}|t jkrdS |t jkr%tt	|ƒƒ‚t
t	|ƒƒ‚)a8  
    Verify whether *secret* is correct for *hash* of *type*.

    :param bytes hash: An encoded Argon2 hash as returned by
        :func:`hash_secret`.
    :param bytes secret: The secret to verify whether it matches the one
        in *hash*.
    :param Type type: Type for *hash*.

    :raises argon2.exceptions.VerifyMismatchError: If verification fails
        because *hash* is not valid for *secret* of *type*.
    :raises argon2.exceptions.VerificationError: If verification fails for
        other reasons.

    :return: ``True`` on success, raise
        :exc:`~argon2.exceptions.VerificationError` otherwise.
    :rtype: bool

    .. versionadded:: 16.0.0
    .. versionchanged:: 16.1.0
        Raise :exc:`~argon2.exceptions.VerifyMismatchError` on mismatches
        instead of its more generic superclass.
    r%   r&   T)r   Úargon2_verifyr   r*   r(   r)   r-   ÚARGON2_VERIFY_MISMATCHr
   r.   r	   )r5   r   r"   r2   r   r   r   r   ±   s   

ü

r   Úcontextc                 C   s   t  | |¡S )a“  
    Direct binding to the ``argon2_ctx`` function.

    .. warning::
        This is a strictly advanced function working on raw C data structures.
        Both *Argon2*'s and *argon2-cffi*'s higher-level bindings do a lot of
        sanity checks and housekeeping work that *you* are now responsible for
        (e.g. clearing buffers). The structure of the *context* object can,
        has, and will change with *any* release!

        Use at your own peril; *argon2-cffi* does *not* use this binding
        itself.

    :param context: A CFFI *Argon2* context object (i.e. an ``struct
        Argon2_Context``/``argon2_context``).
    :param int type: Which *Argon2* variant to use.  You can use the ``value``
        field of :class:`Type`'s fields.

    :rtype: int
    :return: An *Argon2* error code.  Can be transformed into a string using
        :func:`error_to_str`.

    .. versionadded:: 16.0.0
    )r   Ú
argon2_ctx)r8   r"   r   r   r   Úcore×   s   r:   Úerrorc                 C   s   t  t | ¡¡}| d¡}|S )z´
    Convert an Argon2 error code into a native string.

    :param int error: An Argon2 error code as returned by :func:`core`.

    :rtype: str

    .. versionadded:: 16.0.0
    Úascii)r   r/   r   Úargon2_error_messageÚdecode)r;   Úmsgr   r   r   r.   ó   s   

r.   N)r   Úenumr   Útypingr   Ú_argon2_cffi_bindingsr   r   Ú_typingr   Ú
exceptionsr   r	   r
   Ú__all__ÚARGON2_VERSION_NUMBERr   r   r3   Úintr   r   r   r:   Ústrr.   r   r   r   r   Ú<module>   sj   		(øÿþýüûúùø	
÷Jøÿþýüûúùø	
÷(&