o
    ߭h                     @  s   d Z ddlm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(ddZefd(ddZd)ddZd*d!d"Zd+d%d&Zd'S ),a>  
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.
    )annotations)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   U/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/argon2/low_level.pyr   )   s
    
r   secretbytessalt	time_costint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:`argon2.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   5   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,   r0   r	   r1   r   buffer)
r   r   r    r"   r#   r$   r%   r&   r4   r5   r   r   r   r   x   s&   


r   hashLiteral[True]c                 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,   r0   ARGON2_VERIFY_MISMATCHr   r1   r
   )r7   r   r%   r5   r   r   r   r      s   



r   contextr   c                 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)r;   r%   r   r   r   core   s   r=   errorstrc                 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   r2   r   argon2_error_messagedecode)r>   r   r   r   r1      s   
r1   N)r   r   r   r   r    r!   r"   r!   r#   r!   r$   r!   r%   r   r&   r!   r'   r   )r7   r   r   r   r%   r   r'   r8   )r;   r   r%   r!   r'   r!   )r>   r!   r'   r?   )r   
__future__r   enumr   typingr   _argon2_cffi_bindingsr   r   _typingr   
exceptionsr	   r
   r   __all__ARGON2_VERSION_NUMBERr   r   r   r   r   r=   r1   r   r   r   r   <module>   s$   		K
(
(