Ë
    àU.j˜  ã            
       óü  — d Z ddlmZmZ ddlZ ej
                  e«      ZddlZddl	Z	ddl
mZ dZdaddlmZ ddlmZ ddlmZmZmZ ddlmZmZ dd	lmZmZmZmZmZ ddlm c m!Z" d
gZ# ed«      Z$ ed«      Z% ed«      Z&e&e$e%fZ' e(e'«      Z)dZ*	 ddl+Z e,ed«      sdZ*dZn e,ed«      sdZ*dZ	  e,ed«      r( ej\                  «       Z/ej`                  jb                  Z2n G d„ d«      Z3 e3«       Z/dZ2 G d„ de"jh                  e"jj                  e"jl                  e"jn                  e"jp                  e"jr                  «      Z: G d„ de:«      Z; G d„ de:«      Z< G d„ de:«      Z= G d„ d
e;e:«      Z+y# e-$ r dZY ŒÇw xY w)aá  passlib.handlers.argon2 -- argon2 password hash wrapper

References
==========
* argon2
    - home: https://github.com/P-H-C/phc-winner-argon2
    - whitepaper: https://github.com/P-H-C/phc-winner-argon2/blob/master/argon2-specs.pdf
* argon2 cffi wrapper
    - pypi: https://pypi.python.org/pypi/argon2_cffi
    - home: https://github.com/hynek/argon2_cffi
* argon2 pure python
    - pypi: https://pypi.python.org/pypi/argon2pure
    - home: https://github.com/bwesterb/argon2pure
é    )Úwith_statementÚabsolute_importN)Úwarn)Úexc)Ú
MAX_UINT32)ÚclasspropertyÚto_bytesÚrender_bytes)Úb64s_encodeÚb64s_decode)ÚuÚunicodeÚbascii_to_strÚuascii_to_strÚPY2Úargon2ÚiÚdÚidÚTypezb'argon2' module points to unsupported 'argon2' pypi package; please install 'argon2-cffi' instead.Ú	low_levelz@'argon2-cffi' is too old, please update to argon2_cffi >= 18.2.0ÚPasswordHasherc                   ó$   — e Zd ZdZdZdZdZdZdZy)Ú_DummyCffiHashera  
        dummy object to use as source of defaults when argon2_cffi isn't present.
        this tries to mimic the attributes of ``argon2.PasswordHasher()`` which the rest of
        this module reads.

        .. note:: values last synced w/ argon2 19.2 as of 2019-11-09
        é   i   é   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	time_costÚmemory_costÚparallelismÚsalt_lenÚhash_len© ó    úYC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\passlib/handlers/argon2.pyr   r   ]   s"   „ ñ	ð ˆ	ØˆØˆØˆØ‰r'   r   é   c                   ó„  ‡ — e Zd ZdZdZdZej                  Ze	j                  j                  dz   Ze	j                  j                  dz   Zej                  ZdZeZej$                  ZdZeZdZd	ZeZd
ZdZdZdZi Zed„ «       Z e!Z"ejF                  Z#eZ$ejJ                  Z%e&d„ «       Z'd
Z(e)	 	 dˆ fd„	«       Z*e)d„ «       Z+ e,jZ                  d«      Z.e)d„ «       Z/ e,jZ                  de,j`                  «      Z1e)d„ «       Z2d„ Z3d ˆ fd„	Z4e)d„ «       Z5e)d„ «       Z6e)d!d„«       Z7e)d„ «       Z8ˆ fd„Z9dZ:e)d„ «       Z;e)d"d„«       Z<ˆ xZ=S )#Ú_Argon2Commona&  
    Base class which implements brunt of Argon2 code.
    This is then subclassed by the various backends,
    to override w/ backend-specific methods.

    When a backend is loaded, the bases of the 'argon2' class proper
    are modified to prepend the correct backend-specific subclass.
    r   )
ÚsaltÚ	salt_sizer$   Úroundsr!   r"   r#   Údigest_sizer%   Útype)r0   )r$   r!   r%   r/   é   é   Úlineariÿÿÿ NéÿÿÿÿFc                 óL   — | j                  «        t        | j                  «      S )zj
        return tuple of types supported by this backend
        
        .. versionadded:: 1.7.2
        )Úget_backendÚtupleÚ_backend_type_map)Úclss    r(   Útype_valuesz_Argon2Common.type_valuesÚ   s   € ð 	�‰ÔÜ�S×*Ñ*Ó+Ð+r'   c                 ó(   — | j                   t        k(  S )zn
        flag indicating a Type D hash

        .. deprecated:: 1.7.2; will be removed in passlib 2.0
        )r0   ÚTYPE_D©Úselfs    r(   Útype_dz_Argon2Common.type_dö   s   € ð �y‰yœFÑ"Ð"r'   c	                 ó
  •— |�d|	v rt        d«      ‚||	d<   |�d|	v rt        d«      ‚||	d<   |�|�t        d«      ‚|}|�|�t        d«      ‚|}t        t        | �  di |	¤Ž}
|�|
j	                  |«      |
_        |	j                  d«      }|�It        |t        j                  «      rt        |«      }t        j                  |
|dt        d	|¬
«      |
_        |�=t        |t        j                  «      rt        |«      }|
j                  ||¬«      |
_        |
j!                  |
j                  |
j"                  «       |�Et        |t        j                  «      rt        |«      }|dk  r|dk7  rt%        d|fz  «      ‚||
_        |
S )Nr.   z/'time_cost' and 'rounds' are mutually exclusiver-   z1'salt_len' and 'salt_size' are mutually exclusivez3'hash_len' and 'digest_size' are mutually exclusivez8'checksum_size' and 'digest_size' are mutually exclusiveÚrelaxedr   r/   )ÚminÚmaxÚparamrA   )rA   r2   r4   z7max_threads (%d) must be -1 (unlimited), or at least 1.r&   )Ú	TypeErrorÚsuperr+   ÚusingÚ
_norm_typer0   ÚgetÚ
isinstanceÚuhÚnative_string_typesÚintÚnorm_integerr   Úchecksum_sizeÚ_norm_memory_costr"   Ú_validate_constraintsr#   Ú
ValueErrorÚmax_threads)r9   r0   r"   r$   r!   r/   rO   r%   rS   ÚkwdsÚsubclsrA   Ú	__class__s               €r(   rG   z_Argon2Common.using  s¶  ø€ ð Ð Ø˜4ÑÜÐ QÓRÐRØ&ˆD�‰NàÐØ˜dÑ"ÜÐ SÓTÐTØ (ˆD�ÑàÐØÐ&ÜÐ UÓVÐVØ"ˆKàÐ$ØÐ&ÜÐ ZÓ[Ð[Ø'ˆKô ”} cÑ0Ñ8°4Ñ8ˆð ÐØ ×+Ñ+¨DÓ1ˆFŒKð —(‘(˜9Ó%ˆØÐ"Ü˜+¤r×'=Ñ'=Ô>Ü! +Ó.�ä#%§?¡?°6¸;ÈBÔT^Ø9FÐPWô$YˆFÔ ð Ð"Ü˜+¤r×'=Ñ'=Ô>Ü! +Ó.�Ø!'×!9Ñ!9¸+ÈwÐ!9Ó!WˆFÔð 	×$Ñ$ V×%7Ñ%7¸×9KÑ9KÔLð Ð"Ü˜+¤r×'=Ñ'=Ô>Ü! +Ó.�Ø˜QŠ ;°"Ò#4Ü Ð!ZØ"- ñ"0ó 1ð 1à!,ˆFÔàˆr'   c                 óP   — d|z  }||k  rt        d| j                  |||fz  «      ‚y )Nr1   zO%s: memory_cost (%d) is too low, must be at least 8 * parallelism (8 * %d = %d))rR   Úname)r9   r"   r#   Úmin_memory_costs       r(   rQ   z#_Argon2Common._validate_constraintsB  sD   € ð ˜k™/ˆØ˜Ò(Üð =à!Ÿh™h¨Ø)¨?ð<ñ<ó =ð =ð )r'   z^\$argon2[a-z]+\$c                 óf   — t        j                  |«      }| j                  j                  |«      d uS ©N)rK   Úto_unicode_for_identifyÚ_ident_regexÚmatch)r9   Úhashs     r(   Úidentifyz_Argon2Common.identifyT  s.   € ä×)Ñ)¨$Ó/ˆØ×Ñ×%Ñ% dÓ+°4Ð7Ð7r'   sù  
        ^
        \$argon2(?P<type>[a-z]+)\$
        (?:
            v=(?P<version>\d+)
            \$
        )?
        m=(?P<memory_cost>\d+)
        ,
        t=(?P<time_cost>\d+)
        ,
        p=(?P<parallelism>\d+)
        (?:
            ,keyid=(?P<keyid>[^,$]+)
        )?
        (?:
            ,data=(?P<data>[^,$]+)
        )?
        (?:
            \$
            (?P<salt>[^$]+)
            (?:
                \$
                (?P<digest>.+)
            )?
        )?
        $
    c                 ó:  — t        |t        «      r|j                  d«      }t        |t        «      st	        j
                  |d«      ‚| j                  j                  |«      }|st	        j                  | «      ‚|j                  ddddddd	d
d«	      \	  }}}}}}}	}
}|rt        d«      ‚ | |j                  d«      |rt        |«      ndt        |«      t        |«      t        |«      |
rt        |
«      nd |	rt        |	«      nd |rt        |«      ¬«      S d ¬«      S )Núutf-8r_   r0   Úversionr"   r!   r#   ÚkeyidÚdatar,   Údigestz&argon2 'keyid' parameter not supportedÚasciir   )r0   rc   r"   r.   r#   r,   re   Úchecksum)rJ   r   ÚencodeÚbytesr   ÚExpectedStringErrorÚ_hash_regexr^   ÚMalformedHashErrorÚgroupÚNotImplementedErrorÚdecoderM   r   )r9   r_   Úmr0   rc   r"   r!   r#   rd   re   r,   rf   s               r(   Úfrom_stringz_Argon2Common.from_string‹  s  € ô �dœGÔ$Ø—;‘;˜wÓ'ˆDÜ˜$¤Ô&Ü×)Ñ)¨$°Ó7Ð7Ø�O‰O×!Ñ! $Ó'ˆÙÜ×(Ñ(¨Ó-Ð-à�G‰G�F˜I }°kÀ=Ø˜V V¨Xó7ñ 	Vˆˆg�{ I¨{¸EÀ4ÈÈvñ Ü%Ð&NÓOÐOÙØ—‘˜WÓ%Ù$+”C˜”L°Ü˜KÓ(Ü�y“>Ü˜KÓ(Ù&*”˜TÔ"°Ù&*”˜TÔ"°Ù,2”[ Ó(ô	
ð 		
ð 9=ô	
ð 		
r'   c                 ó„  — | j                   }|dk(  rd}nd|z  }| j                  }|r"dt        t        | j                  «      «      z   }nd}dt	        | j
                  «      || j                  | j                  | j                  |t        t        | j                  «      «      t        t        | j                  «      «      fz  S )Nr   Ú zv=%d$z,data=z"$argon2%s$%sm=%d,t=%d,p=%d%s$%s$%s)rc   re   r   r   r   r0   r"   r.   r#   r,   rh   )r>   rc   Úvstrre   Úkdstrs        r(   Ú	to_stringz_Argon2Common.to_string¦  s«   € Ø—,‘,ˆØ�dŠ?Ø‰Dà˜WÑ$ˆDà�y‰yˆÙØœ}¬[¸¿¹Ó-CÓDÑD‰EàˆEð 4Ü˜$Ÿ)™)Ó$ØØ×ÑØ�K‰KØ×ÑØÜœ+ d§i¡iÓ0Ó1Üœ+ d§m¡mÓ4Ó5ð	7
ñ 	
ð 		
r'   c                 óÜ  •— |rt        d«       |�J ‚t        }|j                  d«      }|�t        |«      | _        t        t        | �  d	i |¤Ž |€/t        j                  | | j                  | j                  d¬«      sJ ‚| j                  |«      | _
        |€/t        j                  | | j                  | j                  d¬«      sJ ‚| j                  |«      | _        |€/t        j                  | | j                  | j                  d¬«      sJ ‚| j                  |«      | _        |€| j                   �J ‚y t#        |t$        «      s!t        j&                  j)                  |dd«      ‚|| _        y )
Nzoargon2 `type_d=True` keyword is deprecated, and will be removed in passlib 2.0; please use ``type="d"`` insteadrh   r0   )rD   rc   r"   rj   re   r&   )r   r<   rI   ÚlenrO   rF   r+   Ú__init__rK   Úvalidate_default_valuer0   rH   rc   Ú_norm_versionr"   rP   re   rJ   rj   r   ÚExpectedTypeError)	r>   r0   r?   rc   r"   re   rT   rh   rV   s	           €r(   rz   z_Argon2Common.__init__Â  sh  ø€ ñ Üð 3ô 4à�<Ð�<ÜˆDð —8‘8˜JÓ'ˆØÐÜ!$ X£ˆDÔô 	Œm˜TÑ+Ñ3¨dÒ3ð ˆ<Ü×,Ñ,¨T°4·9±9¸d¿o¹oÐU[Õ\Ð\Ð\àŸ™¨Ó-ˆDŒIð ˆ?Ü×,Ñ,¨T°4·<±<À×ASÑASØ3<õ>ð >ð >ð  ×-Ñ-¨gÓ6ˆDŒLð ÐÜ×,Ñ,¨T°4×3CÑ3CÀT×E[ÑE[Ø3@õBð Bð Bð  $×5Ñ5°kÓBˆDÔð ˆ<Ø—9‘9Ð$Ð$Ñ$ä˜d¤EÔ*Ü—f‘f×.Ñ.¨t°W¸fÓEÐEØˆD�Ir'   c                 ó  — t        |t        «      sIt        r"t        |t        «      r|j	                  d«      }n!t
        j                  j                  |dd«      ‚|t        v r|S |j                  «       }|t        v r|S t        d|›�«      ‚)Nrg   Ústrr0   zunknown argon2 hash type: )rJ   r   r   rj   rp   rK   r   r}   ÚALL_TYPES_SETÚlowerrR   )r9   ÚvalueÚtemps      r(   rH   z_Argon2Common._norm_typeô  sz   € ô ˜%¤Ô)Ý”z %¬Ô/ØŸ™ WÓ-‘ä—f‘f×.Ñ.¨u°e¸VÓDÐDð ”MÑ!ØˆLð �{‰{‹}ˆØ”=Ñ ØˆKõ ¹5ÐBÓCÐCr'   c                 ó8  — t        |t        j                  «      s!t        j                  j	                  |dd«      ‚|dk  r|dk7  rt        d|fz  «      ‚| j                  «       }|| j                  kD  r&t        d| j                  ||| j                  fz  «      ‚|S )NÚintegerrc   r)   r   zinvalid argon2 hash version: %dzk%s: hash version 0x%X not supported by %r backend (max version is 0x%X); try updating or switching backends)	rJ   rK   Ú	int_typesr   r}   rR   r6   Úmax_versionrX   )r9   rc   Úbackends      r(   r|   z_Argon2Common._norm_version	  s›   € ä˜'¤2§<¡<Ô0Ü—&‘&×*Ñ*¨7°I¸yÓIÐIð �TŠ>˜g¨šoÜÐ>À'ÀÑKÓLÐLð —/‘/Ó#ˆØ�S—_‘_Ò$Üð Yà!Ÿh™h¨°¸#¿/¹/ÐJñKó Lð Lð ˆr'   c                 óJ   — t        j                  | || j                  d|¬«      S )Nr"   )rB   rD   rA   )rK   rN   rY   )r9   r"   rA   s      r(   rP   z_Argon2Common._norm_memory_cost  s&   € ä�‰˜s K°S×5HÑ5HØ%2¸GôEð 	Er'   c                 ó„   — 	 | j                   |   S # t        $ r Y nw xY wd|›d| j                  «       ›d�}t        |«      ‚)z>
        helper to resolve backend constant from type
        zunsupported argon2 hash (type z not supported by z	 backend))r8   ÚKeyErrorr6   rR   )r9   r‚   Úmsgs      r(   Ú_get_backend_typez_Argon2Common._get_backend_type%  sL   € ð
	Ø×(Ñ(¨Ñ/Ð/øÜò 	Ùð	úØò �c—o‘oÕ'ð)ˆä˜‹oÐs   ‚ ‘	œc                 óN  •— t        | «      }| j                   |j                   k7  ry|j                  }|�||j                  kD  r|j                  }| j                  |k  ry| j                  |j                  k7  ry| j
                  |j
                  k7  ryt        t        | �"  di |¤ŽS )NTr&   )	r0   Úmin_desired_versionr‡   rc   r"   rO   rF   r+   Ú_calc_needs_update)r>   rT   r9   ÚminverrV   s       €r(   r�   z _Argon2Common._calc_needs_update7  s“   ø€ Ü�4‹jˆØ�9‰9˜Ÿ™Ò ØØ×(Ñ(ˆØˆ>˜V c§o¡oÒ5Ø—_‘_ˆFØ�<‰<˜&Ò àØ×Ñ˜sŸ™Ò.ØØ×Ñ ×!2Ñ!2Ò2ØÜ”] DÑ<ÑD¸tÑDÐDr'   z> -- recommend you install one (e.g. 'pip install argon2_cffi')c                 óJ  — | j                   }t        |t        «      r|dk\  sJ ‚|dk  r't        d|z  t        j
                  j                  «       t        D ]  }|| j                  v sŒ|| _	         y t        d|z  t        j
                  j                  «       t        | _	        y)zØ
        helper called by from backend mixin classes' _load_backend_mixin() --
        invoked after backend imports have been loaded, and performs
        feature detection & testing common to all backends.
        r   r)   z6%r doesn't support argon2 v1.3, and should be upgradedz)%r lacks support for all known hash typesT)r‡   rJ   rM   r   rK   r   ÚPasslibSecurityWarningÚ	ALL_TYPESr8   r0   ÚPasslibRuntimeWarningÚTYPE_ID)Ú	mixin_clsrX   Údryrunr‡   r0   s        r(   Ú_finalize_backend_mixinz%_Argon2Common._finalize_backend_mixinM  sš   € ð  ×+Ñ+ˆÜ˜+¤sÔ+°¸tÒ0CÐCÐCØ˜ÒÜÐIÈDÑPÜ—‘×.Ñ.ô0÷ ˆDØ�y×2Ñ2Ò2Ø!%�	”Øð ð ô
 Ð<¸tÑCÄRÇVÁV×EaÑEaÔbä$ˆIŒNàr'   c                 óL  — | j                  «       }|€|�| j                  |«      }|�B|j                  |j                  |j                  «       |dk(  r|j
                  �t        d«      ‚t        |«      }|dvr|›d|›d|›�}nt        |«      }t        j                  | |¬«      ‚)z}
        internal helper invoked when backend has hash/verification error;
        used to adapt to passlib message.
        Úargon2_cffiz8argon2_cffi backend doesn't support the 'data' parameter)zDecoding failedz reported: z: hash=)Úreason)r6   rr   rQ   r"   r#   re   ro   r   Úreprr   rm   )r9   Úerrr_   r>   rˆ   Útextrœ   s          r(   Ú_adapt_backend_errorz"_Argon2Common._adapt_backend_errorg  s¯   € ð —/‘/Ó#ˆð ˆ<˜DÐ,Ø—?‘? 4Ó(ˆDð ÐØ×&Ñ& t×'7Ñ'7¸×9IÑ9IÔJð ˜-Ò'¨D¯I©IÐ,AÜ)Ð*dÓeÐeô �3‹xˆØð ñ ò 4;ºDÁ$ÐG‰Fä˜$“ZˆFÜ×$Ñ$ S°Ô8Ð8r'   )NNNNNNNN)NFNNN)F)NN)>r   r   r   r    rX   Úsetting_kwdsÚ_default_settingsr%   rO   rK   ÚGenericHandlerÚ_always_parse_settingsÚ_unparsed_settingsr$   Údefault_salt_sizeÚmin_salt_sizer   Úmax_salt_sizer!   Údefault_roundsÚ
min_roundsÚ
max_roundsÚrounds_costÚmax_parallelismÚ_default_versionr‡   r�   rY   rS   Úpure_use_threadsr8   r   r:   r–   r0   r#   rc   r"   Úpropertyr?   re   ÚclassmethodrG   rQ   ÚreÚcompiler]   r`   ÚXrl   rr   rw   rz   rH   r|   rP   r�   r�   Ú_no_backend_suggestionr™   r    Ú__classcell__©rV   s   @r(   r+   r+   s   s3  ø„ ñð  €Dð
€Lð0 &×.Ñ.€Mð  ×.Ñ.×EÑEØ&ñ'Ðð ×*Ñ*×=Ñ=ØMñNÐð *×2Ñ2ÐØ€MØ€Mð '×0Ñ0€NØ€JØ€JØ€Kð
 $€Oð #€Kð Ðð €Oð €Kð Ðð
 Ðàñ,ó ð,ð €Dð $×/Ñ/€Kð €Gð $×/Ñ/€Kàñ#ó ð#ð €Dð Ø[_Ø=Aô9ó ð9ðv ñ=ó ð=ð �2—:‘:Ð2Ó3€Làñ8ó ð8ð2 �"—*‘*ð ð6 
�‰ó7€Kð: ñ
ó ð
ò4
õ8,ðd ñDó ðDð( ñó ðð  òEó ðEð ñó ðô"Eð( ^Ðàñó ðð2 ò9ó ô9r'   r+   c                   ó€   ‡ — e Zd ZdZed„ «       Zed„ «       Z ej                  dd¬«      ed„ «       «       Z	ˆ fd„Z
ˆ xZS )	Ú
_NoBackendz€
    mixin used before any backend has been loaded.
    contains stubs that force loading of one of the available backends.
    c                 óD   — | j                  «        | j                  |«      S r[   )Ú_stub_requires_backendr_   )r9   Úsecrets     r(   r_   z_NoBackend.hash–  s   € à×"Ñ"Ô$Ø�x‰x˜ÓÐr'   c                 óF   — | j                  «        | j                  ||«      S r[   )r»   Úverify)r9   r¼   r_   s      r(   r¾   z_NoBackend.verify›  s   € à×"Ñ"Ô$Ø�z‰z˜& $Ó'Ð'r'   z1.7z2.0)Ú
deprecatedÚremovedc                 óF   — | j                  «        | j                  ||«      S r[   )r»   Úgenhash)r9   r¼   Úconfigs      r(   rÂ   z_NoBackend.genhash   s!   € ð 	×"Ñ"Ô$Ø�{‰{˜6 6Ó*Ð*r'   c                 óJ   •— | j                  «        t        t        | �  |«      S r[   )r»   rF   r   Ú_calc_checksum)r>   r¼   rV   s     €r(   rÅ   z_NoBackend._calc_checksum©  s%   ø€ ð 	×#Ñ#Ô%ô ”V˜TÑ1°&Ó9Ð9r'   )r   r   r   r    r±   r_   r¾   rK   Údeprecated_methodrÂ   rÅ   r¶   r·   s   @r(   r¹   r¹   Ž  se   ø„ ñð ñ ó ð ð ñ(ó ð(ð €R×Ñ U°EÔ:Øñ+ó ó ;ð+÷:ð :r'   r¹   c                   ót   — e Zd ZdZed„ «       Zed„ «       Z ed„ eD «       «      Z	ed„ «       Z
ed„ «       Zd„ Zy)	Ú_CffiBackendz
    argon2_cffi backend
    c                 óò  — | t         u sJ ‚t        € t        rt        j                  t        «      ‚yt        j
                  j                  }t        j                  dt        j                  |«       t        j                  }i }t        D ]   }	 t        ||j                  «       «      ||<   Œ" || _        |x| _        | _        | j)                  ||«      S # t        $ r |t        t         fvs
J d|z  «       ‚Y Œmw xY w)NFzOdetected 'argon2_cffi' backend, version %r, with support for 0x%x argon2 hashesúunexpected missing type: %r)rÈ   Ú_argon2_cffiÚ_argon2_cffi_errorr   ÚPasslibSecurityErrorr   ÚARGON2_VERSIONÚlogÚdebugÚ__version__r   r”   ÚgetattrÚupperÚAttributeErrorÚTYPE_Ir<   r8   rc   r‡   r™   )r—   rX   r˜   r‡   ÚTypeEnumÚtype_mapr0   s          r(   Ú_load_backend_mixinz _CffiBackend._load_backend_mixinÀ  s÷   € ð œLÑ(Ð(Ð(ô ÐÝ!Ü×.Ñ.Ô/AÓBÐBØÜ"×,Ñ,×;Ñ;ˆÜ�	‰	ÐcÜ×*Ñ*¨Kô	9ô  ×$Ñ$ˆØˆßˆDðZÜ!(¨°4·:±:³<Ó!@�˜’ð ð '/ˆ	Ô#ð 5@Ð?ˆ	Ô˜IÔ1Ø×0Ñ0°°vÓ>Ð>øô "ò Zà¤F¬FÐ#3Ñ3ÐYÐ5RÐUYÑ5YÓYÒ3ðZús   ÂCÃ!C6Ã5C6c                 óÀ  — t        j                  |«       t        |d«      }	 t        t        j
                  j                  | j                  | j                  «      | j                  | j                  | j                  t        | j                  «       «      | j                  |¬«      «      S # t        j                  j                  $ r}| j!                  |«      ‚d }~ww xY w)Nrb   )r0   r"   r!   r#   r,   r%   r¼   )rK   Úvalidate_secretr	   r   rË   r   Úhash_secretr�   r0   r"   r©   r#   Ú_generate_saltrO   Ú
exceptionsÚHashingErrorr    )r9   r¼   rž   s      r(   r_   z_CffiBackend.hashà  s¾   € ô 	×Ñ˜6Ô"Ü˜& 'Ó*ˆð	0Ü ¤×!7Ñ!7×!CÑ!CØ×*Ñ*¨3¯8©8Ó4ØŸO™OØ×,Ñ,ØŸO™OÜ˜c×0Ñ0Ó2Ó3Ø×*Ñ*Øð "Dó "ó ð øô ×&Ñ&×3Ñ3ò 	0Ø×*Ñ*¨3Ó/Ð/ûð	0ús   £BB* Â*CÃCÃCc              #   óV   K  — | ]!  }t        d |j                  d«      «      |f–— Œ# y­w)s
   $argon2%s$rg   N)r
   ri   )Ú.0r0   s     r(   Ú	<genexpr>z_CffiBackend.<genexpr>ô  s-   è ø€ ð 2Ù'0˜tô )¨¸¿¹ÀGÓ8LÓMÈtÔTÙ'0ùs   ‚')c           	      óè  — t        j                  |«       t        |d«      }t        |d«      }| j                  j	                  |d d|j                  dd«      z    t        «      }| j                  |«      }	 t        j                  j                  |||«      }|du sJ ‚y# t        j                  j                  $ r Y yt        j                  j                  $ r}| j                  ||¬«      ‚d }~ww xY w)Nrb   rg   r2   ó   $TF©r_   )rK   rÚ   r	   Ú_byte_ident_maprI   ÚfindrÕ   r�   rË   r   Úverify_secretrÝ   ÚVerifyMismatchErrorÚVerificationErrorr    )r9   r¼   r_   r0   Ú	type_codeÚresultrž   s          r(   r¾   z_CffiBackend.verify÷  sã   € ô 	×Ñ˜6Ô"Ü˜& 'Ó*ˆÜ˜˜gÓ&ˆð ×"Ñ"×&Ñ& tÐ,A¨Q¨t¯y©y¸¸qÓ/AÑ-AÐ'BÄFÓKˆØ×)Ñ)¨$Ó/ˆ	ð	;Ü!×+Ñ+×9Ñ9¸$ÀÈ	ÓRˆFØ˜T‘>Ð!�>ØøÜ×&Ñ&×:Ñ:ò 	ÙÜ×&Ñ&×8Ñ8ò 	;Ø×*Ñ*¨3°TÐ*Ó:Ð:ûð	;ús   Á6'B ÂC1Â=C1ÃC,Ã,C1c                 ó:  — t        j                  |«       t        |d«      }| j                  |«      }	 t	        t
        j                  j                  | j                  |j                  «      |j                  |j                  |j                  t        |j                  «      |j                  ||j                  ¬«      «      }|j                  dk(  r|j'                  dd«      }|S # t
        j                   j"                  $ r}| j%                  ||¬«      ‚d }~ww xY w)Nrb   )r0   r"   r!   r#   r,   r%   r¼   rc   rä   r   z$v=16$Ú$)rK   rÚ   r	   rr   r   rË   r   rÛ   r�   r0   r"   r.   r#   r,   rO   rc   rÝ   rÞ   r    Úreplace)r9   r¼   rÃ   r>   rë   rž   s         r(   rÂ   z_CffiBackend.genhash  sõ   € ô 	×Ñ˜6Ô"Ü˜& 'Ó*ˆØ�‰˜vÓ&ˆð	=Ü"¤<×#9Ñ#9×#EÑ#EØ×*Ñ*¨4¯9©9Ó5Ø ×,Ñ,ØŸ+™+Ø ×,Ñ,Ü˜dŸi™iÓ(Ø×+Ñ+ØØŸ™ð $Fó 	$ó 	ˆFð �<‰<˜4Òà—^‘^ H¨cÓ2ˆFØˆøô ×&Ñ&×3Ñ3ò 	=Ø×*Ñ*¨3°VÐ*Ó<Ð<ûð	=ús   ´BC% Ã%DÄDÄDc                 ó   — t        d«      ‚)Nz-shouldn't be called under argon2_cffi backend)ÚAssertionError)r>   r¼   s     r(   rÅ   z_CffiBackend._calc_checksum*  s   € ÜÐLÓMÐMr'   N)r   r   r   r    r±   rØ   r_   Údictr”   rå   r¾   rÂ   rÅ   r&   r'   r(   rÈ   rÈ   ¸  sv   „ ñð ñ?ó ð?ð> ñ0ó ð0ñ& ñ 2Ù'0ó2ó 2€Oð ñ;ó ð;ð, ñó ðó6Nr'   rÈ   c                   ó&   — e Zd ZdZed„ «       Zd„ Zy)Ú_PureBackendz
    argon2pure backend
    c                 óø  — | t         u sJ ‚	 dd la	 ddlm} t
        j                  d|«       |st        dt        j                  «       i }t        D ]'  }	 t        t        d|j                  «       z   «      ||<   Œ) || _        |x| _        | _        | j)                  ||«      S # t        $ r Y yw xY w# t        $ r t
        j                  d«       Y yw xY w# t        $ r |t        t         fvs
J d|z  «       ‚Y Œ§w xY w)	Nr   F)ÚARGON2_DEFAULT_VERSIONz\detected 'argon2pure' backend, but package is too old (passlib requires argon2pure >= 1.2.3)zBdetected 'argon2pure' backend, with support for 0x%x argon2 hashesz¦Using argon2pure backend, which is 100x+ slower than is required for adequate security. Installing argon2_cffi (via 'pip install argon2_cffi') is strongly recommendedÚARGON2rÊ   )ró   Ú
argon2pureÚ_argon2pureÚImportErrorrõ   rÏ   ÚwarningrÐ   r   r   r“   r”   rÒ   rÓ   rÔ   rÕ   r<   r8   rc   r‡   r™   )r—   rX   r˜   r‡   r×   r0   s         r(   rØ   z _PureBackend._load_backend_mixin<  s  € ð œLÑ(Ð(Ð(ð	Û,ð
	ÝHô 	�	‰	ÐVØô	ñ Üð +ä,/×,FÑ,FôHð
 ˆßˆDðZÜ!(¬°hÀÇÁÃÑ6MÓ!N�˜’ð ð '/ˆ	Ô#à4?Ð?ˆ	Ô˜IÔ1Ø×0Ñ0°°vÓ>Ð>øô= ò 	Ùð	ûô ò 	Ü�K‰Kð Aô Báð	ûô$ "ò Zà¤F¬FÐ#3Ñ3ÐYÐ5RÐUYÑ5YÓYÒ3ðZús4   ŒB" ‘B1 Á$CÂ"	B.Â-B.Â1CÃCÃ!C9Ã8C9c                 ó0  — t        j                  |«       t        |d«      }t        || j                  | j
                  | j                  | j                  | j                  | j                  | j                  «      | j                  ¬«      }| j                  dkD  r| j                  |d<   | j                  rd|d<   | j                  r| j                  |d<   	 t        j                   d	i |¤ŽS # t        j"                  $ r}| j%                  || ¬«      ‚d }~ww xY w)
Nrb   )Úpasswordr,   r!   r"   r#   Ú
tag_lengthrê   rc   r   ÚthreadsTÚuse_threadsÚassociated_datar=   r&   )rK   rÚ   r	   rñ   r,   r.   r"   r#   rO   r�   r0   rc   rS   r¯   re   rø   r   ÚArgon2Errorr    )r>   r¼   rT   rž   s       r(   rÅ   z_PureBackend._calc_checksumn  sø   € ä
×Ñ˜6Ô"Ü˜& 'Ó*ˆÜØØ—‘Ø—k‘kØ×(Ñ(Ø×(Ñ(Ø×)Ñ)Ø×,Ñ,¨T¯Y©YÓ7Ø—L‘Lô	
ˆð ×Ñ˜aÒØ"×.Ñ.ˆD�‰OØ× Ò Ø"&ˆD�ÑØ�9Š9Ø&*§i¡iˆDÐ"Ñ#ð	<Ü×%Ñ%Ñ-¨Ñ-Ð-øÜ×&Ñ&ò 	<Ø×+Ñ+¨C°dÐ+Ó;Ð;ûð	<ús   ÃC* Ã*DÃ=DÄDN)r   r   r   r    r±   rØ   rÅ   r&   r'   r(   ró   ró   4  s!   „ ñð ñ&?ó ð&?ób<r'   ró   c                   ó$   — e Zd ZdZdZdZeeedœZ	y)r   aŸ	  
    This class implements the Argon2 password hash [#argon2-home]_, and follows the :ref:`password-hash-api`.

    Argon2 supports a variable-length salt, and variable time & memory cost,
    and a number of other configurable parameters.

    The :meth:`~passlib.ifc.PasswordHash.replace` method accepts the following optional keywords:

    :type type: str
    :param type:
        Specify the type of argon2 hash to generate.
        Can be one of "ID", "I", "D".

        This defaults to "ID" if supported by the backend, otherwise "I".

    :type salt: str
    :param salt:
        Optional salt string.
        If specified, the length must be between 0-1024 bytes.
        If not specified, one will be auto-generated (this is recommended).

    :type salt_size: int
    :param salt_size:
        Optional number of bytes to use when autogenerating new salts.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        This corresponds linearly to the amount of time hashing will take.

    :type time_cost: int
    :param time_cost:
        An alias for **rounds**, for compatibility with underlying argon2 library.

    :param int memory_cost:
        Defines the memory usage in kibibytes.
        This corresponds linearly to the amount of memory hashing will take.

    :param int parallelism:
        Defines the parallelization factor.
        *NOTE: this will affect the resulting hash value.*

    :param int digest_size:
        Length of the digest in bytes.

    :param int max_threads:
        Maximum number of threads that will be used.
        -1 means unlimited; otherwise hashing will use ``min(parallelism, max_threads)`` threads.

        .. note::

            This option is currently only honored by the argon2pure backend.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include ``rounds``
        that are too small or too large, and ``salt`` strings that are too long.

    .. versionchanged:: 1.7.2

        Added the "type" keyword, and support for type "D" and "ID" hashes.
        (Prior versions could verify type "D" hashes, but not generate them).

    .. todo::

        * Support configurable threading limits.
    )r›   r÷   T)Nr›   r÷   N)
r   r   r   r    ÚbackendsÚ_backend_mixin_targetr¹   rÈ   ró   Ú_backend_mixin_mapr&   r'   r(   r   r   Ž  s+   „ ñEð` -€Hð !Ðð Ø#Ø"ñÑr'   )>r    Ú
__future__r   r   ÚloggingÚ	getLoggerr   rÏ   r²   ÚtypesÚwarningsr   rË   rø   Úpasslibr   Úpasslib.crypto.digestr   Úpasslib.utilsr   r	   r
   Úpasslib.utils.binaryr   r   Úpasslib.utils.compatr   r   r   r   r   Úpasslib.utils.handlersÚutilsÚhandlersrK   Ú__all__rÕ   r<   r–   r”   Úsetr€   rÌ   r   Úhasattrrù   r   r¢   r   rÎ   r®   r   ÚSubclassBackendMixinÚParallelismMixinÚ	HasRoundsÚ
HasRawSaltÚHasRawChecksumr£   r+   r¹   rÈ   ró   r&   r'   r(   Ú<module>r     s®  ðñ÷" 7ã Ø€g×Ñ˜Ó!€Û 	Û Ý à€Ø€å Ý ,ß ?Ñ ?ß 9ß NÕ Nß #Ð #ð ð€ñ  
ˆ3‹€Ù	
ˆ3‹€Ù
ˆD‹'€ð �f˜fÐ%€	Ù�I“€ð Ð ðÛ!ñ �< Ô(ð4ð 	ð ‰Ù�\ ;Ô/à_ÐØ‰ñ ˆ<Ð)Ô*à3˜×3Ñ3Ó5ÐØ#×-Ñ-×<Ñ<Ñ÷ñ ñ  )Ó*ÐØÐô
R9�B×+Ñ+¨R×-@Ñ-@Ø—L‘L "§-¡-°×1BÑ1BØ×%Ñ%ôR9ôv!:�ô !:ôTsN�=ô sNôxT<�=ô T<ôt[ˆZ˜õ [øðQ ò Ø‚Lðús   ÂE1 Å1E;Å:E;