o
    8;h                      @  s   d dl mZ d dlZd dlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZ dd	lmZ ejZejZejZejZejZdddZG dd dZdS )    )annotationsN)ClassVar   )Literal)
Parameters_check_typesextract_parameters)InvalidHashError)Typehash_secretverify_secret)RFC_9106_LOW_MEMORYsbytes | strencodingstrreturnbytesc                 C  s   t | tr| S | |S )zM
    Ensure *s* is a bytes string.  Encode using *encoding* if it isn't.
    )
isinstancer   encode)r   r    r   J/var/www/html/venv/lib/python3.10/site-packages/argon2/_password_hasher.py_ensure_bytes   s   

r   c                   @  s   e Zd ZU dZddgZded< ded< eeee	e
dejfd3ddZed4ddZed5ddZed5ddZed5ddZed5ddZed5ddZed6dd Zd!d"d7d'd(Zejejejd)Zd*ed+< d8d.d/Zd9d1d2Zd!S ):PasswordHashera  
    High level class to hash passwords with sensible defaults.

    Uses Argon2\ **id** by default and always uses a random salt_ for hashing.
    But it can verify any type of Argon2 as long as the hash is correctly
    encoded.

    The reason for this being a class is both for convenience to carry
    parameters and to verify the parameters only *once*.  Any unnecessary
    slowdown when hashing is a tangible advantage for a brute force attacker.

    :param int time_cost: Defines the amount of computation realized and
        therefore the execution time, given in number of iterations.
    :param int memory_cost: Defines the memory usage, given in kibibytes_.
    :param int parallelism: Defines the number of parallel threads (*changes*
        the resulting hash value).
    :param int hash_len: Length of the hash in bytes.
    :param int salt_len: Length of random salt to be generated for each
        password.
    :param str encoding: The Argon2 C library expects bytes.  So if
        :meth:`hash` or :meth:`verify` are passed a ``str``, it will be
        encoded using this encoding.
    :param Type type: Argon2 type to use.  Only change for interoperability
        with legacy systems.

    .. versionadded:: 16.0.0
    .. versionchanged:: 18.2.0
       Switch from Argon2i to Argon2id based on the recommendation by the
       current RFC draft. See also :doc:`parameters`.
    .. versionchanged:: 18.2.0
       Changed default *memory_cost* to 100 MiB and default *parallelism* to 8.
    .. versionchanged:: 18.2.0 ``verify`` now will determine the type of hash.
    .. versionchanged:: 18.3.0 The Argon2 type is configurable now.
    .. versionadded:: 21.2.0 :meth:`from_parameters`
    .. versionchanged:: 21.2.0
       Changed defaults to :data:`argon2.profiles.RFC_9106_LOW_MEMORY`.

    .. _salt: https://en.wikipedia.org/wiki/Salt_(cryptography)
    .. _kibibytes: https://en.wikipedia.org/wiki/Binary_prefix#kibi
    _parametersr   r   r   zutf-8	time_costintmemory_costparallelismhash_lensalt_lentyper
   c           	   	   C  s`   t |tf|tf|tf|tf|tf|tf|tfd}|rt|t|d|||||d| _|| _d S )N)r   r   r   r   r    r   r!      )r!   versionr    r   r   r   r   )r   r   r   r
   	TypeErrorr   r   r   )	selfr   r   r   r   r    r   r!   er   r   r   __init__N   s*   
	
	zPasswordHasher.__init__paramsr   c                 C  s   |  }||_ |S )z_
        Construct a `PasswordHasher` from *params*.

        .. versionadded:: 21.2.0
        )r   )clsr(   phr   r   r   from_parametersp   s   zPasswordHasher.from_parametersc                 C     | j jS N)r   r   r%   r   r   r   r   |      zPasswordHasher.time_costc                 C  r,   r-   )r   r   r.   r   r   r   r      r/   zPasswordHasher.memory_costc                 C  r,   r-   )r   r   r.   r   r   r   r      r/   zPasswordHasher.parallelismc                 C  r,   r-   )r   r   r.   r   r   r   r      r/   zPasswordHasher.hash_lenc                 C  r,   r-   )r   r    r.   r   r   r   r       r/   zPasswordHasher.salt_lenc                 C  r,   r-   )r   r!   r.   r   r   r   r!      r/   zPasswordHasher.typeN)saltpasswordstr | bytesr0   bytes | Nonec             	   C  s:   t t|| j|pt| j| j| j| j| j	| j
ddS )a  
        Hash *password* and return an encoded hash.

        Parameters:

            password: Password to hash.

            salt: If None, a random salt is securely created.

                .. danger::

                    You should **not** pass a salt unless you really know what
                    you are doing.

        Raises:

            argon2.exceptions.HashingError: If hashing fails.

        Returns:

            Hashed *password*.

        .. versionadded:: 23.1.0 *salt* parameter
        )secretr0   r   r   r   r   r!   ascii)r   r   r   osurandomr    r   r   r   r   r!   decode)r%   r1   r0   r   r   r   hash   s   
zPasswordHasher.hash)s	   $argon2i$s	   $argon2d$s	   $argon2idzClassVar[dict[bytes, Type]]_header_to_typer9   Literal[True]c                 C  sJ   t |d}z| j|dd  }W n
 ty   tdw t|t || j|S )a  
        Verify that *password* matches *hash*.

        .. warning::

            It is assumed that the caller is in full control of the hash.  No
            other parsing than the determination of the hash type is done by
            *argon2-cffi*.

        :param hash: An encoded hash as returned from
            :meth:`PasswordHasher.hash`.
        :type hash: ``bytes`` or ``str``

        :param password: The password to verify.
        :type password: ``bytes`` or ``str``

        :raises argon2.exceptions.VerifyMismatchError: If verification fails
            because *hash* is not valid for *password*.
        :raises argon2.exceptions.VerificationError: If verification fails for
            other reasons.
        :raises argon2.exceptions.InvalidHashError: If *hash* is so clearly
            invalid, that it couldn't be passed to Argon2.

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

        .. versionchanged:: 16.1.0
            Raise :exc:`~argon2.exceptions.VerifyMismatchError` on mismatches
            instead of its more generic superclass.
        .. versionadded:: 18.2.0 Hash type agility.
        r5   N	   )r   r:   LookupErrorr	   r   r   )r%   r9   r1   Z	hash_typer   r   r   verify   s   
#zPasswordHasher.verifyboolc                 C  s   | j t|kS )aM  
        Check whether *hash* was created using the instance's parameters.

        Whenever your Argon2 parameters -- or *argon2-cffi*'s defaults! --
        change, you should rehash your passwords at the next opportunity.  The
        common approach is to do that whenever a user logs in, since that
        should be the only time when you have access to the cleartext
        password.

        Therefore it's best practice to check -- and if necessary rehash --
        passwords after each successful authentication.

        :rtype: bool

        .. versionadded:: 18.2.0
        )r   r   )r%   r9   r   r   r   check_needs_rehash   s   z!PasswordHasher.check_needs_rehash)r   r   r   r   r   r   r   r   r    r   r   r   r!   r
   )r(   r   r   r   )r   r   )r   r
   )r1   r2   r0   r3   r   r   )r9   r2   r1   r2   r   r;   )r9   r   r   r?   )__name__
__module____qualname____doc__	__slots____annotations__DEFAULT_TIME_COSTDEFAULT_MEMORY_COSTDEFAULT_PARALLELISMDEFAULT_HASH_LENGTHDEFAULT_RANDOM_SALT_LENGTHr
   IDr'   classmethodr+   propertyr   r   r   r   r    r!   r9   IDr:   r>   r@   r   r   r   r   r       sD   
 ("$
-r   )r   r   r   r   r   r   )
__future__r   r6   typingr   Z_typingr   Z_utilsr   r   r   
exceptionsr	   Z	low_levelr
   r   r   Zprofilesr   r    rK   r   rJ   r   rG   r   rH   r   rI   r   r   r   r   r   r   <module>   s   
	