B
    5db                 @   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
eee ddd	Zeed
ddZeG dd dZejejejdZedZeedddZdS )    )	dataclass)AnyOptional   )InvalidHash)TypeN)kwreturnc              K   s   g }xd|   D ]X\}\}}t||st|trDddd |D }n|j}|dj||t|jd qW |g krd|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   Z/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/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   )lr	   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   remZlast_group_lenr   r   r   _decoded_str_len&   s    r#   c               @   s\   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< dddddddg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parallelismN)r
   
__module____qualname____doc__r   __annotations__int	__slots__r   r   r   r   r$   6   s   
r$   )Zargon2idZargon2iZargon2d)vmr   p)hashr	   c          	   C   s   |  d}t|dkr"|dd t|dkr2t|d dkrBty<t|d  }d	d
 dd |d g|d  d D D }W n tk
r   tY nX 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   )r/   )r   kr1   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   {   s    z%extract_parameters.<locals>.<genexpr>r    ,r   r1   r   r2   r3   )r   r&   r'   r%   r(   r)   r*   )r<   leninsertr   _NAME_TO_TYPE	Exceptionsortedkeys_REQUIRED_KEYSr$   r#   )r4   partsr   Zkvsr   r   r   extract_parameters_   s.    

*
rG   )dataclassesr   typingr   r   
exceptionsr   Z	low_levelr   r   ZNoneTypestrr   r/   r#   r$   ZIDIDrA   rC   rE   rG   r   r   r   r   <module>   s   %