
    +a                         d dl mZ d dlmZ  ed      Zd Zd Zd Z G d d      Z	ej                  ej                  ej                  d	Z ed
      Zd Zy)   )InvalidHash)TypeNc            
      `   g }| j                         D ]  \  }\  }}t        ||      rt        |t              rdj                  d |D              }n|j                  }|j                  dj                  ||t        |      j                                |g k7  rdj                  |      dz   S y)zy
    Check each ``name: (value, types)`` in *kw*.

    Returns a human-readable string of all violations or `None``.
    z, or c              3   4   K   | ]  }|j                     y wN)__name__).0ts     //usr/lib/python3/dist-packages/argon2/_utils.py	<genexpr>z_check_types.<locals>.<genexpr>   s     $?AQZZ$?s   z('{name}' must be a {type} (got {actual}))nametypeactualz, .N)items
isinstancetuplejoinr   appendformatr   )kwerrorsr   valuetypess        r   _check_typesr      s     F "
 
nue%'%'$?$??MM:AAE$u+2F2F B 
 |yy 3&&     c                     | dz  dz  dz   S )zQ
    Compute how long a byte string of length *l* becomes if encoded to hex.
           )ls    r   _encoded_str_lenr"      s     Fa<!r   c                 F    | dz  }|dk(  rd}n
|dk(  rd}nd}| dz  dz  |z   S )zC
    Compute how long an encoded string of length *l* becomes.
       r   r   r       r    )r!   remlast_group_lens      r   _decoded_str_lenr(   &   s=     a%C
ax	6A:&&r   c                   0    e Zd ZdZg dZd Zd Zd Zd Zy)
Parametersa  
    Argon2 hash parameters.

    See :doc:`parameters` on how to pick them.

    :ivar Type type: Hash type.
    :ivar int version: Argon2 version.
    :ivar int salt_len: Length of the salt in bytes.
    :ivar int hash_len: Length of the hash in bytes.
    :ivar int time_cost: Time cost in iterations.
    :ivar int memory_cost: Memory cost in kibibytes.
    :ivar int parallelism: Number of parallel threads.

    .. versionadded:: 18.2.0
    r   versionsalt_lenhash_len	time_costmemory_costparallelismc                 f    || _         || _        || _        || _        || _        || _        || _        y r   r+   )selfr   r,   r-   r.   r/   r0   r1   s           r   __init__zParameters.__init__Q   s7     	  "&&r   c                     d| j                   | j                  | j                  | j                  | j                  | j
                  | j                  fz  S )Nzi<Parameters(type=%r, version=%d, hash_len=%d, salt_len=%d, time_cost=%d, memory_cost=%d, parallelism=%d)>)r   r,   r.   r-   r/   r0   r1   )r3   s    r   __repr__zParameters.__repr__c   sM    = 		    
	
r   c                 ~   | j                   |j                   k7  rt        S | j                  | j                  | j                  | j
                  | j                  | j                  | j                  f|j                  |j                  |j                  |j
                  |j                  |j                  |j                  fk(  S r   )		__class__NotImplementedr   r,   r-   r.   r/   r0   r1   r3   others     r   __eq__zParameters.__eq__r   s    >>U__,!! IILLMMMMNN
 JJMMNNNNOO

 	
r   c                 d    | j                   |j                   k7  rt        S | j                  |       S r   )r8   r9   r<   r:   s     r   __ne__zParameters.__ne__   s*    >>U__,!!;;u%%%r   N)	r   
__module____qualname____doc__	__slots__r4   r6   r<   r>   r    r   r   r*   r*   6   s"     I'$

,&r   r*   )argon2idargon2iargon2d)vmr
   pc           
      L   | j                  d      }t        |      dk(  r|j                  dd       t        |      dk7  rt        |d   dk7  rt        	 t        |d      }d	 |d   g|d
   j                  d      z   D        D ci c]  \  }}|t        |       }}}t        |j                               t        k7  rt        t        |t        t        |d               t        t        |d               |d   |d   |d   |d         S c c}}w # t        $ r t        w xY w)z
    Extract parameters from an encoded *hash*.

    :param str params: An encoded Argon2 hash string.

    :rtype: Parameters

    .. versionadded:: 18.2.0
    $   r   zv=18   r%    r   c              3   >   K   | ]  }|j                  d         yw)=N)split)r	   ss     r   r   z%extract_parameters.<locals>.<genexpr>   s      !"s   r   ,r$   rF   r
   rG   rH   )r   r-   r.   r,   r/   r0   r1   )rP   leninsertr   _NAME_TO_TYPEint	Exceptionsortedkeys_REQUIRED_KEYSr*   r(   )hashpartsr   krF   kvss         r   extract_parametersr_      s/    JJsOE 5zQQ
5zQQx2~
U1X&',Qxj58>>#3F&F
1 s1vI
 
 chhj^+!#eAh-0!#eAh-0Cc(HH 
  s   1D DD D D#)
exceptionsr   	low_levelr   r   NoneTyper   r"   r(   r*   IDIDrU   rX   rZ   r_   r    r   r   <module>rf      s\    #  :'.' V& V&r "WWDFFK,--r   