+
    ¢THix†  ã            
       óÐ  € R t ^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIH	u H
t ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ R	IHtHt ^ R
IHt RtRsR.tRtRtRt ] ]]3t!]"! ]!4      t#Rt$ ^ RI%t]&! ]R4      '       g   Rt$RtM]&! ]R4      '       g   Rt$Rt]&! ]R4      '       d)   ]PP                  ! 4       t)]PT                  PV                  t,M ! R R4      t-]-! 4       t)^t, ! R R]P\                  ]P^                  ]P`                  ]Pb                  ]Pd                  ]Pf                  4      t4 ! R R]44      t5 ! R R]44      t6 ! R R]44      t7 ! R R]5]44      t%R#   ]' d    Rt LÐi ; i)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
N)Úmetadata©ÚAny)Úwarn)Úexc)Úlogger)Ú
MAX_UINT32)ÚclasspropertyÚrender_bytesÚto_bytes)Úb64s_decodeÚb64s_encode)Úbascii_to_strÚ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                   ó.   € ] tR t^UtRt^tRt^t^t^t	Rt
R# )Ú_DummyCffiHasherzð
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__Ú__firstlineno__Ú__doc__Ú	time_costÚmemory_costÚparallelismÚsalt_lenÚhash_lenÚ__static_attributes__r   ó    Ú9/usr/lib/python3/dist-packages/passlib/handlers/argon2.pyr   r   U   s"   † ñ	ð ˆ	ØˆØˆØˆØŒr$   r   c                   ó¼  a a€ ] tR t^jt oRtRtRt]P                  t	]
P                  P                  R,           t]
P                  P                  R,           t]P                  t^t]t]P&                  t^t]tRtRt]tRt^tRtRt/ t] R 4       t!]"t#]PH                  t$]t%]PL                  t&]'R 4       t(Rt)]*RV 3R ll4       t+]*R	 4       t,]-P\                  ! R
4      t/]*R 4       t0]-P\                  ! R]-Pb                  4      t2]*R 4       t3R t4R V 3R llt5]*R 4       t6]*R 4       t7]*R!R l4       t8]*R 4       t9V 3R lt:Rt;]*R 4       t<]*R"R l4       t=V3R lt>Rt?Vt@V ;tA# )#Ú_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   ÚlinearNFc                óL   € V P                  4        \        V P                  4      # )zJ
return tuple of types supported by this backend

.. versionadded:: 1.7.2
)Úget_backendÚtupleÚ_backend_type_map)Úclss   &r%   Útype_valuesÚ_Argon2Common.type_values×   s   € ð 	�‰ÔÜ�S×*Ñ*Ó+Ð+r$   c                ó(   € V P                   \        8H  # )zV
flag indicating a Type D hash

.. deprecated:: 1.7.2; will be removed in passlib 2.0
)ÚtypeÚTYPE_D©Úselfs   &r%   Útype_dÚ_Argon2Common.type_dï   s   € ð �y‰yœFÑ"Ð"r$   c	           	     ó*  <€ Ve   RV	9   d   \        R4      hWIR&   Ve   RV	9   d   \        R4      hW9R&   Ve   Ve   \        R4      hTpVe   Ve   \        R4      hTp\        SV `  ! R/ V	B p
Ve   V
P                  V4      V
n        V	P                  R4      pVeG   \        V\        4      '       d   \        V4      p\        P                  ! V
V^\        RVR	7      V
n        Ve9   \        V\        4      '       d   \        V4      pV
P                  W+R
7      V
n        V
P                  V
P                  V
P                   4       VeI   \        V\        4      '       d   \        V4      pV^8  d   VR8w  d   \#        RV3,          4      hWŠn        V
# )NÚroundsz/'time_cost' and 'rounds' are mutually exclusiveÚ	salt_sizez1'salt_len' and 'salt_size' are mutually exclusivez3'hash_len' and 'digest_size' are mutually exclusivez8'checksum_size' and 'digest_size' are mutually exclusiveÚrelaxedÚdigest_size)ÚminÚmaxÚparamr:   )r:   z7max_threads (%d) must be -1 (unlimited), or at least 1.r   éÿÿÿÿ)Ú	TypeErrorÚsuperÚusingÚ
_norm_typer1   ÚgetÚ
isinstanceÚstrÚintÚuhÚnorm_integerr   Úchecksum_sizeÚ_norm_memory_costr   Ú_validate_constraintsr    Ú
ValueErrorÚmax_threads)r-   r1   r   r!   r   r;   rJ   r"   rN   ÚkwdsÚsubclsr:   Ú	__class__s   &&&&&&&&&,  €r%   rB   Ú_Argon2Common.usingû   s¬  ø€ ð Ò Ø˜4ÔÜÐ QÓRÐRØ&�‰NàÒØ˜dÔ"ÜÐ SÓTÐTØ (�ÑàÒØÒ&ÜÐ UÓVÐVØ"ˆKàÒ$ØÒ&ÜØNóð ð (ˆKô ‘’Ñ& Ñ&ˆð ÒØ ×+Ñ+¨DÓ1ˆFŒKð —(‘(˜9Ó%ˆØÒ"Ü˜+¤s×+Ò+Ü! +Ó.�ä#%§?¢?ØØØÜØ#Øô$ˆFÔ ð Ò"Ü˜+¤s×+Ò+Ü! +Ó.�Ø!'×!9Ñ!9¸+Ð!9Ó!WˆFÔð 	×$Ñ$ V×%7Ñ%7¸×9KÑ9KÔLð Ò"Ü˜+¤s×+Ò+Ü! +Ó.�Ø˜QŒ ;°"Ô#4Ü ØMØ"�nõ%óð ð "-Ôàˆr$   c                ób   € ^V,          pW8  d    \        RV P                  WV3,          4      hR# )é   zO%s: memory_cost (%d) is too low, must be at least 8 * parallelism (8 * %d = %d)N)rM   Úname)r-   r   r    Úmin_memory_costs   &&& r%   rL   Ú#_Argon2Common._validate_constraintsK  s>   € ð ˜k�/ˆØÔ(Üð0à—8‘8˜[°ÐGõHóð ñ )r$   z^\$argon2[a-z]+\$c                óh   € \         P                  ! V4      pV P                  P                  V4      R J# ©N)rH   Úto_unicode_for_identifyÚ_ident_regexÚmatch)r-   Úhashs   &&r%   ÚidentifyÚ_Argon2Common.identifyZ  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                óž  € \        V\        4      '       d   VP                  R 4      p\        V\        4      '       g   \        P
                  ! VR4      hV P                  P                  V4      pV'       g   \        P                  ! V 4      hVP                  RRRRRRRR	R
4	      w	  ppppppp	p
pV'       d   \        R4      hT ! VP                  R4      V'       d   \        V4      M^\        V4      \        V4      \        V4      V
'       d   \        V
4      MRV	'       d   \        V	4      MRV'       d   \        V4      R7      # RR7      # )úutf-8r]   r1   Úversionr   r   r    ÚkeyidÚdataÚsaltÚdigestz&argon2 'keyid' parameter not supportedÚasciiN)r1   rb   r   r8   r    re   rd   Úchecksum)rE   rF   ÚencodeÚbytesr   ÚExpectedStringErrorÚ_hash_regexr\   ÚMalformedHashErrorÚgroupÚNotImplementedErrorÚdecoderG   r   )r-   r]   Úmr1   rb   r   r   r    rc   rd   re   rf   s   &&          r%   Úfrom_stringÚ_Argon2Common.from_string�  s-  € ô �dœC× Ò Ø—;‘;˜wÓ'ˆDÜ˜$¤×&Ò&Ü×)Ò)¨$°Ó7Ð7Ø�O‰O×!Ñ! $Ó'ˆßÜ×(Ò(¨Ó-Ð-ð �G‰GØØØØØØØØØó

ñ
	
ØØØØØØØØØ÷ Ü%Ð&NÓOÐOÙØ—‘˜WÓ%ß$+”C˜”L°Ü˜KÓ(Ü�y“>Ü˜KÓ(ß&*”˜TÔ"°ß&*”˜TÔ"°ß,2”[ Ó(ô	
ð 		
ð 9=ô	
ð 		
r$   c                óš  € V P                   pV^8X  d   RpM	RV,          pV P                  pV'       d'   R\        \        V P                  4      4      ,           pMRpRV P                  VV P
                  V P                  V P                  V\        \        V P                  4      4      \        \        V P                  4      4      3,          # )é   Ú zv=%d$z,data=z"$argon2%s$%sm=%d,t=%d,p=%d%s$%s$%s)
rb   rd   r   r   r1   r   r8   r    re   rh   )r4   rb   Úvstrrd   Úkdstrs   &    r%   Ú	to_stringÚ_Argon2Common.to_string½  s¦   € Ø—,‘,ˆØ�dŒ?Ø‰Dà˜WÕ$ˆDà�y‰yˆßØœ}¬[¸¿¹Ó-CÓDÕD‰EàˆEð 4Ø�I‰IØØ×ÑØ�K‰KØ×ÑØÜœ+ d§i¡iÓ0Ó1Üœ+ d§m¡mÓ4Ó5ð	7
õ 	
ð 		
r$   c                ó6  <€ V'       d   \        R 4       Ve   Q h\        pVP                  R4      pVe   \        V4      V n        \
        SV `  ! R	/ VB  Vf7   \        P                  ! W P                  V P                  RR7      '       g   Q hMV P                  V4      V n	        Vf7   \        P                  ! W P                  V P                  RR7      '       g   Q hMV P                  V4      V n        Vf7   \        P                  ! W P                  V P                  RR7      '       g   Q hMV P                  V4      V n        Vf   V P                  e   Q hR# \!        V\"        4      '       g"   \        P$                  P'                  VRR4      hWPn        R# )
zoargon2 `type_d=True` keyword is deprecated, and will be removed in passlib 2.0; please use ``type="d"`` insteadNrh   r1   )r>   rb   r   rj   rd   r   )r   r2   rD   ÚlenrJ   rA   Ú__init__rH   Úvalidate_default_valuer1   rC   rb   Ú_norm_versionr   rK   rd   rE   rj   r   ÚExpectedTypeError)	r4   r1   r5   rb   r   rd   rO   rh   rQ   s	   &&&&&&, €r%   r}   Ú_Argon2Common.__init__Ö  sw  ø€ ÷ Üð2ôð ’<Ð�<ÜˆDð —8‘8˜JÓ'ˆØÒÜ!$ X£ˆDÔô 	‰ÒÑ ˜4Ò ð Š<Ü×,Ò,Ø—i‘i §¡¸÷ó ð ñ ð Ÿ™¨Ó-ˆDŒIð Š?Ü×,Ò,Ø—l‘l D×$6Ñ$6¸i÷ó ð ñ ð  ×-Ñ-¨gÓ6ˆDŒLð ÒÜ×,Ò,Ø×&Ñ&¨×(>Ñ(>Àm÷ó ð ñ ð  $×5Ñ5°kÓBˆDÔð Š<Ø—9‘9Ò$Ð$Ò$ä˜d¤E×*Ò*Ü—f‘f×.Ñ.¨t°W¸fÓEÐEØŽIr$   c                óâ   € \        V\        4      '       g"   \        P                  P	                  VR R4      hV\
        9   d   V# VP                  4       pV\
        9   d   V# \        RV: 24      h)rF   r1   zunknown argon2 hash type: )rE   rF   rH   r   r€   ÚALL_TYPES_SETÚlowerrM   )r-   ÚvalueÚtemps   && r%   rC   Ú_Argon2Common._norm_type  sh   € ô ˜%¤×%Ò%Ü—&‘&×*Ñ*¨5°%¸Ó@Ð@ð ”MÔ!ØˆLð �{‰{‹}ˆØ”=Ô ØˆKô Ð5°e±YÐ?Ó@Ð@r$   c           
     óR  € \        V\        4      '       g"   \        P                  P	                  VR R4      hV^8  d   V^8w  d   \        RV3,          4      hV P                  4       pWP                  8”  d/   \        V P                   RVR RV: RV P                  R R24      hV# )Úintegerrb   zinvalid argon2 hash version: %dz: hash version 0xÚXú not supported by z backend (max version is 0xz%); try updating or switching backends)	rE   rG   rH   r   r€   rM   r*   Úmax_versionrU   )r-   rb   Úbackends   && r%   r   Ú_Argon2Common._norm_version!  sª   € ä˜'¤3×'Ò'Ü—&‘&×*Ñ*¨7°I¸yÓIÐIð �TŒ>˜g¨œoÜÐ>À'ÀÕKÓLÐLð —/‘/Ó#ˆØ—_‘_Ô$ÜØ—8‘8�*Ð-¨g°a¨[Ð8JÈ7É+ð V%Ø%(§_¡_°QÐ$7Ð7\ð^óð ð ˆr$   c                óL   € \         P                  ! V VV P                  R VR7      # )r   )r<   r>   r:   )rH   rI   rV   )r-   r   r:   s   &&&r%   rK   Ú_Argon2Common._norm_memory_cost3  s(   € ä�ŠØØØ×#Ñ#ØØô
ð 	
r$   c                ó’   €  V P                   V,          #   \         d     Mi ; iRT: RT P                  4        R2p\        T4      h)z.
helper to resolve backend constant from type
zunsupported argon2 hash (type r‹   z	 backend))r,   ÚKeyErrorr*   rM   )r-   r…   Úmsgs   && r%   Ú_get_backend_typeÚ_Argon2Common._get_backend_type?  sT   € ð
	Ø×(Ñ(¨Õ/Ð/øÜô 	Ùð	úð /¨u©iÐ7IÈ#Ï/É/ÓJ[ÐI\Ð\eÐfˆÜ˜‹oÐs   ‚ •#¢#c                óf  <€ \        V 4      pV P                   VP                   8w  d   R # VP                  pVe   W2P                  8”  d   VP                  pV P                  V8  d   R # V P                  VP                  8w  d   R # V P
                  VP
                  8w  d   R # \        SV `  ! R/ VB # )Tr   )r1   Úmin_desired_versionrŒ   rb   r   rJ   rA   Ú_calc_needs_update)r4   rO   r-   ÚminverrQ   s   &,  €r%   r˜   Ú _Argon2Common._calc_needs_updateL  s�   ø€ Ü�4‹jˆØ�9‰9˜Ÿ™Ô ÙØ×(Ñ(ˆØŠ>˜V§o¡oÔ5Ø—_‘_ˆFØ�<‰<˜&Ô áØ×Ñ˜sŸ™Ô.ÙØ×Ñ ×!2Ñ!2Ô2ÙÜ‰wÒ)Ñ1¨DÑ1Ð1r$   z> -- recommend you install one (e.g. 'pip install argon2_cffi')c                óp  € V P                   p\        V\        4      '       g   Q hV^8¼  g   Q hV^8  d)   \        V: R2\        P
                  P                  4       \         F  pW@P                  9   g   K  W@n	         R# 	  \        V: R2\        P
                  P                  4       \        V n	        R# )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.
z4 doesn't support argon2 v1.3, and should be upgradedz' lacks support for all known hash typesT)rŒ   rE   rG   r   rH   r   ÚPasslibSecurityWarningÚ	ALL_TYPESr,   r1   ÚPasslibRuntimeWarningÚTYPE_ID)Ú	mixin_clsrU   ÚdryrunrŒ   r1   s   &&&  r%   Ú_finalize_backend_mixinÚ%_Argon2Common._finalize_backend_mixin`  s«   € ð  ×+Ñ+ˆÜ˜+¤s×+Ò+Ð+Ð+Ø˜dÔ"Ð"Ð"Ø˜ÔÜØ‘(ÐNÐOÜ—‘×-Ñ-ô÷ ˆDØ×2Ñ2Ö2Ø!%”Øñ ñ ô
 Ø‘(ÐAÐBÜ—‘×,Ñ,ôô
 %ˆIŒNár$   c                óh  € V P                  4       pVf   Ve   V P                  V4      pVeG   VP                  VP                  VP                  4       VR8X  d   VP
                  e   \        R4      h\        V4      pVR9  d   V RV RV: 2pM\        V4      p\        P                  ! WR7      h)ze
internal helper invoked when backend has hash/verification error;
used to adapt to passlib message.
Úargon2_cffiz8argon2_cffi backend doesn't support the 'data' parameterz reported: z: hash=)Úreason)zDecoding failed)r*   rr   rL   r   r    rd   ro   rF   Úreprr   rm   )r-   Úerrr]   r4   r�   Útextr¦   s   &&&&   r%   Ú_adapt_backend_errorÚ"_Argon2Common._adapt_backend_error€  s»   € ð —/‘/Ó#ˆð Š<˜DÒ,Ø—?‘? 4Ó(ˆDð ÒØ×&Ñ& t×'7Ñ'7¸×9IÑ9IÔJð ˜-Ô'¨D¯I©IÒ,AÜ)ØNóð ô
 �3‹xˆØð 
ô 
ð  �y ¨D¨6°¸¹ÐA‰Fä˜$“ZˆFÜ×$Ò$ SÔ8Ð8r$   c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # )é   r,   r   )ÚformatÚ__classdict__s   "€r%   Ú__annotate__Ú_Argon2Common.__annotate__j   s   ø‡ ‚ ñV ÑòW r$   )rJ   rd   r   r1   rb   )
re   r9   r!   r8   r   r   r    r;   r"   r1   )r1   )r!   r   r"   r;   iÿÿÿ r?   )NNNNNNNN)NFNNN)F)NN)Br   r   r   r   r   rU   Úsetting_kwdsÚ_default_settingsr"   rJ   rH   Ú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—   rV   rN   Úpure_use_threadsr,   r	   r.   rŸ   r1   r    rb   r   Úpropertyr5   rd   ÚclassmethodrB   rL   ÚreÚcompiler[   r^   ÚVERBOSErl   rr   ry   r}   rC   r   rK   r”   r˜   Ú_no_backend_suggestionr¢   rª   Ú__annotate_func__r#   Ú__classdictcell__Ú__classcell__©rQ   r¯   s   @@r%   r'   r'   j   s5  ù‡ € ñð €Dð€Lð2 &×.Ñ.€Mð  ×.Ñ.×EÑEÈ	ÕQÐð ×*Ñ*×=Ñ=ð Aõ Ðð *×2Ñ2ÐØ€MØ€Mð '×0Ñ0€NØ€JØ€JØ€Kð
 $€Oð #€Kð Ðð €Oð €Kð Ðð
  Ðàñ,ó ð,ð €Dð $×/Ñ/€Kð €Gð $×/Ñ/€Kàñ#ó ð#ð €DàöMó ðMð^ ñ	ó ð	ð —:’:Ð2Ó3€Làñ8ó ð8ð* —*’*ð	ð8 	�
‰
ó;€Kð@ ñ*
ó ð*
òX
÷23ðr ñAó ðAð" ñó ðð" ó
ó ð
ð ñ
ó ð
õ2ð" 	Ið ð ñó ðð> ó9ó ð9÷o … r$   r'   c                   ó”   a a€ ] tR tRt oRt]R 4       t]R 4       t]P                  ! RRR7      ]R 4       4       t
V 3R	 ltR
tVtV ;t# )Ú
_NoBackendi£  zt
mixin used before any backend has been loaded.
contains stubs that force loading of one of the available backends.
c                óD   € V P                  4        V P                  V4      # rY   )Ú_stub_requires_backendr]   )r-   Úsecrets   &&r%   r]   Ú_NoBackend.hash©  s   € à×"Ñ"Ô$Ø�x‰x˜ÓÐr$   c                óD   € V P                  4        V P                  W4      # rY   )rÎ   Úverify)r-   rÏ   r]   s   &&&r%   rÒ   Ú_NoBackend.verify®  s   € à×"Ñ"Ô$Ø�z‰z˜&Ó'Ð'r$   z1.7z2.0)Ú
deprecatedÚremovedc                óD   € V P                  4        V P                  W4      # rY   )rÎ   Úgenhash)r-   rÏ   Úconfigs   &&&r%   r×   Ú_NoBackend.genhash³  s   € ð 	×"Ñ"Ô$Ø�{‰{˜6Ó*Ð*r$   c                óB   <€ V P                  4        \        SV `	  V4      # rY   )rÎ   rA   Ú_calc_checksum)r4   rÏ   rQ   s   &&€r%   rÛ   Ú_NoBackend._calc_checksum¹  s#   ø€ ð 	×#Ñ#Ô%ô ‰wÑ% fÓ-Ð-r$   r   )r   r   r   r   r   rÂ   r]   rÒ   rH   Údeprecated_methodr×   rÛ   r#   rÈ   rÉ   rÊ   s   @@r%   rÌ   rÌ   £  se   ù‡ € ñð
 ñ ó ð ð ñ(ó ð(ð ×Ò U°EÔ:Øñ+ó ó ;ð+÷.õ .r$   rÌ   c                   óˆ   a € ] tR tRt o Rt]R 4       t]R 4       t]! R ]	 4       4      t
]R 4       t]R 4       tR tR	tV tR
# )Ú_CffiBackendiÂ  z
argon2_cffi backend
c                ó"  € V \         J g   Q h\        f)   \        '       d   \        P                  ! \        4      hR# \        P
                  P                  p\        P                  ! R\        P                  ! R4      V4       \        P                  p/ p\         F  p \        WFP                  4       4      WV&   K!  	  WPn        V;V n
        V n        V P)                  W4      #   \         d!    T\         \"        39  g   Q RT: 24       h Kr  i ; i)NFzOdetected 'argon2_cffi' backend, version %r, with support for 0x%x argon2 hashesr¥   úunexpected missing type: )rß   Ú_argon2_cffiÚ_argon2_cffi_errorr   ÚPasslibSecurityErrorr   ÚARGON2_VERSIONr   Údebugr   rb   r   r�   ÚgetattrÚupperÚAttributeErrorÚTYPE_Ir2   r,   rŒ   r¢   )r    rU   r¡   rŒ   ÚTypeEnumÚtype_mapr1   s   &&&    r%   Ú_load_backend_mixinÚ _CffiBackend._load_backend_mixinÇ  s  € ð œLÓ(Ð(Ð(ô Òß!Ó!Ü×.Ò.Ô/AÓBÐBÙÜ"×,Ñ,×;Ñ;ˆÜ�ŠØ]Ü×Ò˜]Ó+Øô	
ô  ×$Ñ$ˆØˆßˆDð8Ü!(¨·:±:³<Ó!@�“ñ ð '/Ô#ð 5@Ð?ˆ	Ô˜IÔ1Ø×0Ñ0°Ó>Ð>øô "ô 8àÜÜð$ô ð 8ð /¨t©hÐ7ó8ó ð8ús   ÂC#Ã#'DÄDc                óÆ  € \         P                  ! V4       \        VR 4      p \        \        P
                  P                  V P                  V P                  4      V P                  V P                  V P                  \        V P                  4       4      V P                  VR7      4      #   \        P                  P                   d   pT P!                  T4      hRp?ii ; i)ra   )r1   r   r   r    re   r"   rÏ   N)rH   Úvalidate_secretr   r   râ   r   Úhash_secretr”   r1   r   rº   r    Ú_generate_saltrJ   Ú
exceptionsÚHashingErrorrª   )r-   rÏ   r¨   s   && r%   r]   Ú_CffiBackend.hashê  s¾   € ô 	×Ò˜6Ô"Ü˜& 'Ó*ˆð	0Ü Ü×&Ñ&×2Ñ2Ø×.Ñ.¨s¯x©xÓ8Ø #§¡Ø!×0Ñ0Ø #§¡Ü! #×"4Ñ"4Ó"6Ó7Ø ×.Ñ.Ø!ð 3ó ó
ð 
øô ×&Ñ&×3Ñ3ô 	0Ø×*Ñ*¨3Ó/Ð/ûð	0ús   ¤BB+ Â+C Ã
CÃC c              #  ó\   "  € T F"  p\        R VP                  R4      4      V3x € K$  	  R# 5i)s
   $argon2%s$rg   N)r
   ri   )Ú.0r1   s   & r%   Ú	<genexpr>Ú_CffiBackend.<genexpr>   s(   é € ð ÙNWÀdŒ�m T§[¡[°Ó%9Ó	:¸DÕAËiùs   ‚*,c           	     óþ  € \         P                  ! V4       \        VR 4      p\        VR4      pV P                  P	                  VR^VP                  R^4      ,            \        4      pV P                  V4      p \        P                  P                  W!V4      pVRJ g   Q hR#   \        P                  P                   d     R# \        P                  P                   d   pT P                  YbR7      hRp?ii ; i)ra   rg   Nó   $TF©r]   )rH   rð   r   Ú_byte_ident_maprD   Úfindrê   r”   râ   r   Úverify_secretró   ÚVerifyMismatchErrorÚVerificationErrorrª   )r-   rÏ   r]   r1   Ú	type_codeÚresultr¨   s   &&&    r%   rÒ   Ú_CffiBackend.verify  sß   € ô 	×Ò˜6Ô"Ü˜& 'Ó*ˆÜ˜˜gÓ&ˆð ×"Ñ"×&Ñ& tÐ,D¨a°$·)±)¸DÀ!Ó2DÕ.DÐ'EÄvÓNˆØ×)Ñ)¨$Ó/ˆ	ð	;Ü!×+Ñ+×9Ñ9¸$È	ÓRˆFØ˜T“>Ð!�>ÙøÜ×&Ñ&×:Ñ:ô 	ÚÜ×&Ñ&×8Ñ8ô 	;Ø×*Ñ*¨3Ð*Ó:Ð:ûð	;ús$   Á;(B% Â%C<ÃC<Ã$C<Ã%C7Ã7C<c                óB  € \         P                  ! V4       \        VR 4      pV P                  V4      p \	        \
        P                  P                  V P                  VP                  4      VP                  VP                  VP                  \        VP                  4      VP                  VVP                  R7      4      pTP                  ^8X  d   TP'                  RR4      pT#   \
        P                   P"                   d   pT P%                  YRR7      hRp?ii ; i)ra   )r1   r   r   r    re   r"   rÏ   rb   rü   Nz$v=16$Ú$)rH   rð   r   rr   r   râ   r   rñ   r”   r1   r   r8   r    re   rJ   rb   ró   rô   rª   Úreplace)r-   rÏ   rØ   r4   r  r¨   s   &&&   r%   r×   Ú_CffiBackend.genhash  só   € ô 	×Ò˜6Ô"Ü˜& 'Ó*ˆØ�‰˜vÓ&ˆð	=Ü"Ü×&Ñ&×2Ñ2Ø×.Ñ.¨t¯y©yÓ9Ø $× 0Ñ 0Ø"Ÿk™kØ $× 0Ñ 0Ü! $§)¡)Ó,Ø!×/Ñ/Ø!Ø ŸL™Lð 3ó 	óˆFð �<‰<˜4Ôà—^‘^ H¨cÓ2ˆFØˆøô ×&Ñ&×3Ñ3ô 	=Ø×*Ñ*¨3Ð*Ó<Ð<ûð	=ús   µBC( Ã(DÄDÄDc                ó   € \        R 4      h)z-shouldn't be called under argon2_cffi backend)ÚAssertionError)r4   rÏ   s   &&r%   rÛ   Ú_CffiBackend._calc_checksum6  s   € ÜÐLÓMÐMr$   r   N)r   r   r   r   r   rÂ   rí   r]   Údictr�   rý   rÒ   r×   rÛ   r#   rÈ   ©r¯   s   @r%   rß   rß   Â  s€   ø‡ € ñð ñ ?ó ð ?ðD ñ0ó ð0ñ* ñ ÙNWóó €Oð ñ;ó ð;ð, ñó ð÷4Nð Nr$   rß   c                   ó:   a € ] tR tRt o Rt]R 4       tR tRtV t	R# )Ú_PureBackendi:  z
argon2pure backend
c                ó,  € V \         J g   Q h ^ RIs ^ RIHp \
        P                  ! RT4       T'       g   \        R\        P                  4       / p\         F+  p \        \        RTP                  4       ,           4      YE&   K-  	  Y@n        T;T n        T n        T P)                  Y4      #   \         d     R# i ; i  \         d    \
        P                  ! R4        R# i ; i  \         d!    T\        \         39  g   Q RT: 24       h K¸  i ; i)	é    NF)Ú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ê   r2   r,   rb   rŒ   r¢   )r    rU   r¡   rŒ   rì   r1   s   &&&   r%   rí   Ú _PureBackend._load_backend_mixin?  s$  € ð œLÓ(Ð(Ð(ð	Û,ð
	ÝHô 	�ŠØPØô	
÷
 Üð*ô ×*Ñ*ô	ð ˆßˆDð8Ü!(¬°hÀÇÁÃÕ6MÓ!N�“ñ ð '/Ô#à4?Ð?ˆ	Ô˜IÔ1Ø×0Ñ0°Ó>Ð>øôQ ô 	Úð	ûô ô 	Ü�NŠNð9ôò ð	ûô2 "ô 8àÜÜð$ô ð 8ð /¨t©hÐ7ó8ó ð8ús4   ŽB. “C  Á'C(Â.B=Â<B=Ã !C%Ã$C%Ã('DÄDc                óR  € \         P                  ! V4       \        VR 4      p\        VV P                  V P
                  V P                  V P                  V P                  V P                  V P                  4      V P                  R7      pV P                  ^ 8”  d   V P                  VR&   V P                  '       d   RVR&   V P                  '       d   V P                  VR&    \        P                   ! R/ VB #   \        P"                   d   pT P%                  Y0R7      hRp?ii ; i)	ra   )Úpasswordre   r   r   r    Ú
tag_lengthr  rb   ÚthreadsTÚuse_threadsÚassociated_datar3   Nr   )rH   rð   r   r  re   r8   r   r    rJ   r”   r1   rb   rN   rÀ   rd   r  r   ÚArgon2Errorrª   )r4   rÏ   rO   r¨   s   &&  r%   rÛ   Ú_PureBackend._calc_checksums  sû   € ä
×Ò˜6Ô"Ü˜& 'Ó*ˆÜØØ—‘Ø—k‘kØ×(Ñ(Ø×(Ñ(Ø×)Ñ)Ø×,Ñ,¨T¯Y©YÓ7Ø—L‘Lô	
ˆð ×Ñ˜aÔØ"×.Ñ.ˆD�‰OØ× × Ð Ø"&ˆD�ÑØ�9�9ˆ9Ø&*§i¡iˆDÐ"Ñ#ð	<Ü×%Ò%Ñ-¨Ñ-Ð-øÜ×&Ñ&ô 	<Ø×+Ñ+¨CÐ+Ó;Ð;ûð	<ús   Ã$C: Ã:D&ÄD!Ä!D&r   N)
r   r   r   r   r   rÂ   rí   rÛ   r#   rÈ   r  s   @r%   r  r  :  s)   ø‡ € ñð ñ0?ó ð0?÷f<ð <r$   r  c                   ó2   € ] tR tRtRtRtRtR]R]R]	/t
RtR# )	r   i�  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  TNr   )r¥   r  )r   r   r   r   r   ÚbackendsÚ_backend_mixin_targetrÌ   rß   r  Ú_backend_mixin_mapr#   r   r$   r%   r   r   �  s1   † ñEðZ -€Hð !Ðð 	ˆjØ�|Ø�lðÔr$   )8r   rÃ   Ú	importlibr   Útypingr   Úwarningsr   Úpasslib.utils.handlersÚutilsÚhandlersrH   Úpasslibr   Úpasslib._loggingr   Úpasslib.crypto.digestr   Úpasslib.utilsr	   r
   r   Úpasslib.utils.binaryr   r   Úpasslib.utils.compatr   râ   r  Ú__all__rê   r2   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>r9     sž  ðñó 
Ý Ý Ý ç #Ð #Ý Ý #Ý ,ß ?Ñ ?ß 9Ý .à€Ø€ð ð€ð 
€Ø	€Ø
€ð �f˜fÐ%€	Ù�I“€ð Ð ðÛ!ñ �< ×(Ò(ð4ð 	ð ‰Ù�\ ;×/Ò/ð Oð 	ð ˆñ ˆ<Ð)×*Ò*à$×3Ò3Ó5ÐØ#×-Ñ-×<Ñ<Ñ÷ñ ñ" )Ó*ÐØÐôv9Ø×ÑØ×ÑØ‡L�LØ‡M�MØ×ÑØ×Ñôv9ôr.�ô .ô>uN�=ô uNôpS<�=ô S<ôlXˆZ˜ö Xøði ô Ø‚Lðús   Á)E Å	E%Å$E%