a
    xd                     @   sl   d dl mZ d dlmZ edZdd Zdd Zdd	 ZG d
d dZ	ej
ejejdZedZdd ZdS )   )InvalidHash)TypeNc                  K   s   g }|   D ]X\}\}}t||st|trBddd |D }n|j}|dj||t|jd q|g kr|d|d S dS )	zy
    Check each ``name: (value, types)`` in *kw*.

    Returns a human-readable string of all violations or `None``.
    z, or c                 s   s   | ]}|j V  qd S N)__name__).0t r   E/var/www/html/Ranjet/env/lib/python3.9/site-packages/argon2/_utils.py	<genexpr>       z_check_types.<locals>.<genexpr>z('{name}' must be a {type} (got {actual}))nametypeactualz, .N)items
isinstancetuplejoinr   appendformatr   )kwerrorsr   valuetypesr   r   r	   _check_types   s    

r   c                 C   s   | d> d d S )zQ
    Compute how long a byte string of length *l* becomes if encoded to hex.
          r   )lr   r   r	   _encoded_str_len   s    r   c                 C   s8   | d }|dkrd}n|dkr$d}nd}| d d | S )zC
    Compute how long an encoded string of length *l* becomes.
       r   r   r       r   )r   remZlast_group_lenr   r   r	   _decoded_str_len&   s    r"   c                   @   s8   e Zd ZdZg dZdd Zdd Zdd Zd	d
 ZdS )
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                 C   s.   || _ || _|| _|| _|| _|| _|| _d S r   r$   )selfr   r%   r&   r'   r(   r)   r*   r   r   r	   __init__Q   s    
zParameters.__init__c                 C   s$   d| j | j| j| j| j| j| jf 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(   r)   r*   )r+   r   r   r	   __repr__c   s    zParameters.__repr__c                 C   sP   | j |j k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(   r)   r*   r+   otherr   r   r	   __eq__r   s&    	zParameters.__eq__c                 C   s   | j |j krtS | | S r   )r.   r/   r2   r0   r   r   r	   __ne__   s    zParameters.__ne__N)	r   
__module____qualname____doc__	__slots__r,   r-   r2   r3   r   r   r   r	   r#   6   s   
r#   )Zargon2idZargon2iZargon2d)vmr   pc              	   C   s   |  d}t|dkr"|dd t|dkr2t|d dkrBtz<t|d  }d	d
 dd |d g|d  d D D }W n ty   tY n0 t| tkrtt	|t
t|d t
t|d |d |d |d |d dS )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                 S   s   i | ]\}}|t |qS r   )int)r   kr8   r   r   r	   
<dictcomp>   s   z&extract_parameters.<locals>.<dictcomp>c                 s   s   | ]}| d V  qdS )=N)split)r   sr   r   r	   r
      s   z%extract_parameters.<locals>.<genexpr>r   ,r   r8   r   r9   r:   )r   r&   r'   r%   r(   r)   r*   )rC   leninsertr   _NAME_TO_TYPE	Exceptionsortedkeys_REQUIRED_KEYSr#   r"   )hashpartsr   Zkvsr   r   r	   extract_parameters   s6    



rO   )
exceptionsr   Z	low_levelr   r   ZNoneTyper   r   r"   r#   ZIDIDrH   rJ   rL   rO   r   r   r   r	   <module>   s   Y