
    =b                         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	eeef         d
edefdZ G d d          ZdS )    N)Union   )Literal)
Parameters_check_typesextract_parameters)InvalidHash)Typehash_secretverify_secret)RFC_9106_LOW_MEMORYsencodingreturnc                 Z    t          | t                    r| S |                     |          S )zM
    Ensure *s* is a bytes string.  Encode using *encoding* if it isn't.
    )
isinstancebytesencode)r   r   s     7lib/python3.11/site-packages/argon2/_password_hasher.py_ensure_bytesr      s-     !U 88H    c                      e Zd ZU dZddgZeed<   eed<   ee	e
eedej        fdedededed	eded
efdZededd fd            Zedefd            Zedefd            Zedefd            Zedefd            Zedefd            Zedefd            Zdeeef         defdZej        ej        ej        dZdeeef         deeef         de d         fdZ!dede"fd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   zutf-8	time_costmemory_costparallelismhash_lensalt_lentypec           
          t          |t          f|t          f|t          f|t          f|t          f|t          f|t          f          }|rt	          |          t          |d|||||          | _        || _        d S )N)r   r   r   r   r   r   r       )r    versionr   r   r   r   r   )r   intstrr
   	TypeErrorr   r   r   )	selfr   r   r   r   r   r   r    es	            r   __init__zPasswordHasher.__init__L   s      #&$c*$c*___
 
 
  	A,, &##
 
 
 !r   paramsr   c                 (     |             }||_         |S )z_
        Construct a `PasswordHasher` from *params*.

        .. versionadded:: 21.2.0
        )r   )clsr*   phs      r   from_parameterszPasswordHasher.from_parametersn   s     SUU	r   c                     | j         j        S N)r   r   r'   s    r   r   zPasswordHasher.time_costz   s    ))r   c                     | j         j        S r0   )r   r   r1   s    r   r   zPasswordHasher.memory_cost~       ++r   c                     | j         j        S r0   )r   r   r1   s    r   r   zPasswordHasher.parallelism   r3   r   c                     | j         j        S r0   )r   r   r1   s    r   r   zPasswordHasher.hash_len       ((r   c                     | j         j        S r0   )r   r   r1   s    r   r   zPasswordHasher.salt_len   r6   r   c                     | j         j        S r0   )r   r    r1   s    r   r    zPasswordHasher.type   s    $$r   passwordc           	          t          t          || j                  t          j        | j                  | j        | j        | j        | j	        | j
                                      d          S )z
        Hash *password* and return an encoded hash.

        :param password: Password to hash.
        :type password: ``bytes`` or ``str``

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

        :rtype: str
        )secretsaltr   r   r   r   r    ascii)r   r   r   osurandomr   r   r   r   r   r    decode)r'   r9   s     r   hashzPasswordHasher.hash   sa      4=99DM**n((]
 
 
 &//	r   )s	   $argon2i$s	   $argon2d$s	   $argon2idrA   Tc                     t          |d          }	 | j        |dd                  }n)# t          t          t          f$ r t                      w xY 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.InvalidHash: 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.
        r=   N	   )r   _header_to_type
IndexErrorKeyErrorLookupErrorr	   r   r   )r'   rA   r9   	hash_types       r   verifyzPasswordHasher.verify   s    F T7++	 ,T"1"X6IIHk2 	  	  	 --	  -$-88)
 
 	
s	   ( &Ac                 2    | j         t          |          k    S )aO  
        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'   rA   s     r   check_needs_rehashz!PasswordHasher.check_needs_rehash   s    " #5d#;#;;;r   N)$__name__
__module____qualname____doc__	__slots__r   __annotations__r%   DEFAULT_TIME_COSTDEFAULT_MEMORY_COSTDEFAULT_PARALLELISMDEFAULT_HASH_LENGTHDEFAULT_RANDOM_SALT_LENGTHr
   IDr$   r)   classmethodr.   propertyr   r   r   r   r   r    r   r   rA   IDrD   r   rI   boolrK    r   r   r   r      s        ' 'P 
+IMMM +..+2W !  ! !  ! 	 !
  !  !  !  !  !  !  !D 	Z 	4D 	 	 	 [	 *3 * * * X* ,S , , , X, ,S , , , X, )# ) ) ) X) )# ) ) ) X) %d % % % X%U3:. 3    , ffg O+
#u*%+
16sEz1B+
	+
 +
 +
 +
Z<s <t < < < < < <r   r   )r>   typingr   _typingr   _utilsr   r   r   
exceptionsr	   	low_levelr
   r   r   profilesr   r   rV   r   rU   r   rR   r   rS   r   rT   r   r%   r   r   r]   r   r   <module>rd      s1   
			             @ @ @ @ @ @ @ @ @ @ # # # # # # 7 7 7 7 7 7 7 7 7 7 ) ) ) ) ) ) 19 )2 '1 )5 )5 U5#:& # %    M< M< M< M< M< M< M< M< M< M<r   