o
    hb                     @   s   d dl mZ d dlmZmZ ddlmZ ddlmZ e	dZ
dedee fd	d
ZdedefddZeG dd dZejejejdZedZdedefddZdS )    )	dataclass)AnyOptional   )InvalidHash)TypeNkwreturnc                  K   s   g }|   D ],\}\}}t||s2t|tr!d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   H/var/www/html/env_mimamsha/lib/python3.10/site-packages/argon2/_utils.py	<genexpr>   s    z_check_types.<locals>.<genexpr>z('{name}' must be a {type} (got {actual}))nametypeactualz, .N)items
isinstancetuplejoinr
   appendformatr   )r   errorsr   valuetypesr   r   r   _check_types   s   

r   lc                 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   remlast_group_lenr   r   r   _decoded_str_len&   s   r$   c                   @   sR   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< g 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parallelism)r   r&   r'   r(   r)   r*   r+   N)r
   
__module____qualname____doc__r   __annotations__int	__slots__r   r   r   r   r%   6   s   
 r%   )argon2idargon2iargon2d)vmr   phashc              	   C   s   |  d}t|dkr|dd t|dkrt|d dkr!tzt|d  }d	d
 dd |d g|d  d D D }W n	 tyH   tw t| tkrSt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   )r0   )r   kr5   r   r   r   
<dictcomp>x   s    z&extract_parameters.<locals>.<dictcomp>c                 s   s    | ]}| d V  qdS )=N)split)r   sr   r   r   r   z   s    

z%extract_parameters.<locals>.<genexpr>r    ,r   r5   r   r6   r7   )r   r'   r(   r&   r)   r*   r+   )r@   leninsertr   _NAME_TO_TYPE	Exceptionsortedkeys_REQUIRED_KEYSr%   r$   )r8   partsr   kvsr   r   r   extract_parameters_   s8   


rL   )dataclassesr   typingr   r   
exceptionsr   	low_levelr   r   NoneTypestrr   r0   r$   r%   IDIDrE   rG   rI   rL   r   r   r   r   <module>   s   $