§
    HŠtj˜  ã            
       óú  — 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n# e-$ r dZY nw xY w e,ed¦  «        r ej.        ¦   «         Z/ej0        j1        Z2n G d„ d¦  «        Z3 e3¦   «         Z/dZ2 G d„ de"j4        e"j5        e"j6        e"j7        e"j8        e"j9        ¦  «        Z: G d„ de:¦  «        Z; G d„ de:¦  «        Z< G d„ de:¦  «        Z= G d„ d
e;e:¦  «        Z+dS )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dS )Ú_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© ó    úU/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/handlers/argon2.pyr   r   ]   s3   € € € € € ð	ð 	ð ˆ	ØˆØˆØˆØˆˆˆ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j#        Z#eZ$ej%        Z%e&d„ ¦   «         Z'd
Z(e)	 	 dˆ fd„	¦   «         Z*e)d„ ¦   «         Z+ e,j-        d¦  «        Z.e)d„ ¦   «         Z/ e,j-        de,j0        ¦  «        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                 óR   — |                       ¦   «          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�FÒ"Ð"r'   c	                 ót  •— |�d|	v rt          d¦  «        ‚||	d<   |�d|	v rt          d¦  «        ‚||	d<   |�|�t          d¦  «        ‚|}|�|�t          d¦  «        ‚|} t          t          | ¦  «        j        di |	¤Ž}
|�|
                     |¦  «        |
_        |	                     d¦  «        }|�Mt          |t          j	        ¦  «        rt          |¦  «        }t          j        |
|dt          d	|¬
¦  «        |
_        |�Et          |t          j	        ¦  «        rt          |¦  «        }|
                     ||¬¦  «        |
_        |
                     |
j        |
j        ¦  «         |�Ot          |t          j	        ¦  «        rt          |¦  «        }|dk     r|dk    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ÐRØ&ˆD�‰NàÐØ˜dÐ"Ð"ÝÐ SÑTÔTÐTØ (ˆD�ÑàÐØÐ&ÝÐ UÑVÔVÐVØ"ˆKàÐ$ØÐ&ÝÐ ZÑ[Ô[Ð[Ø'ˆKð 1••} cÑ*Ô*Ô0Ð8Ð8°4Ð8Ð8ˆð ÐØ ×+Ò+¨DÑ1Ô1ˆFŒKð —(’(˜9Ñ%Ô%ˆØÐ"Ý˜+¥rÔ'=Ñ>Ô>ð /Ý! +Ñ.Ô.�å#%¤?°6¸;ÈBÕT^Ø9FÐPWð$Yñ $Yô $YˆFÔ ð Ð"Ý˜+¥rÔ'=Ñ>Ô>ð /Ý! +Ñ.Ô.�Ø!'×!9Ò!9¸+ÈwÐ!9Ñ!WÔ!WˆFÔð 	×$Ò$ VÔ%7¸Ô9KÑLÔLÐLð Ð"Ý˜+¥rÔ'=Ñ>Ô>ð /Ý! +Ñ.Ô.�Ø˜QŠˆ ;°"Ò#4Ð#4Ý Ð!ZØ"- ñ"0ñ 1ô 1ð 1à!,ˆFÔàˆr'   c                 óR   — d|z  }||k     rt          d| j        |||fz  ¦  «        ‚d S )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  sM   € ð ˜k™/ˆØ˜Ò(Ð(Ýð =à!œh¨Ø)¨?ð<ñ<ñ =ô =ð =ð )Ð(r'   z^\$argon2[a-z]+\$c                 ób   — t          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|                     d¦  «        }t          |t          ¦  «        st	          j        |d¦  «        ‚| j                             |¦  «        }|st	          j        | ¦  «        ‚| 	                    ddddddd	d
d¦	  «	        \	  }}}}}}}	}
}|rt          d¦  «        ‚ | |                     d¦  «        |rt          |¦  «        ndt          |¦  «        t          |¦  «        t          |¦  «        |
rt          |
¦  «        nd |	rt          |	¦  «        nd |rt          |¦  «        n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‹  sh  € õ �d�GÑ$Ô$ð 	(Ø—;’;˜wÑ'Ô'ˆDÝ˜$¥Ñ&Ô&ð 	8ÝÔ)¨$°Ñ7Ô7Ð7ØŒO×!Ò! $Ñ'Ô'ˆØð 	.ÝÔ(¨Ñ-Ô-Ð-à�GŠG�F˜I }°kÀ=Ø˜V V¨Xñ7ô 7ñ 	Vˆˆg�{ I¨{¸EÀ4ÈÈvð ð 	PÝ%Ð&NÑOÔOÐOØˆsØ—’˜WÑ%Ô%Ø$+Ð5•C˜‘L”L�L°Ý˜KÑ(Ô(Ý�y‘>”>Ý˜KÑ(Ô(Ø&*Ð4•˜TÑ"Ô"Ð"°Ø&*Ð4•˜TÑ"Ô"Ð"°Ø,2Ð<•[ Ñ(Ô(Ð(¸ð	
ñ 	
ô 	
ð 		
r'   c                 ód  — | 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ˆDà˜WÑ$ˆDàŒyˆØð 	Ø�}­[¸¼Ñ-CÔ-CÑDÔDÑDˆEˆEàˆEð 4Ý˜$œ)Ñ$Ô$ØØÔØŒKØÔØÝ�+ d¤iÑ0Ô0Ñ1Ô1Ý�+ d¤mÑ4Ô4Ñ5Ô5ð	7
ñ 	
ð 		
r'   c                 óð  •— |rt          d¦  «         |�J ‚t          }|                     d¦  «        }|�t          |¦  «        | _         t          t          | ¦  «        j        d	i |¤Ž |€%t          j	        | | j
        | j        d¬¦  «        sJ ‚n|                      |¦  «        | _
        |€%t          j	        | | j        | j        d¬¦  «        sJ ‚n|                      |¦  «        | _        |€%t          j	        | | j        | j        d¬¦  «        sJ ‚n|                      |¦  «        | _        |€| j        �J ‚d S t#          |t$          ¦  «        s!t          j                             |dd¦  «        ‚|| _        d S )
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__Â  sÇ  ø€ ð ð 	Ýð 3ñ 4ô 4ð 4à�<�<�<ÝˆDð —8’8˜JÑ'Ô'ˆØÐÝ!$ X¡¤ˆDÔð 	,��m˜TÑ"Ô"Ô+Ð3Ð3¨dÐ3Ð3Ð3ð ˆ<ÝÔ,¨T°4´9¸d¼oÐU[Ð\Ñ\Ô\Ð\Ð\Ð\Ð\àŸš¨Ñ-Ô-ˆDŒIð ˆ?ÝÔ,¨T°4´<ÀÔASØ3<ð>ñ >ô >ð >ð >ð >ð >ð  ×-Ò-¨gÑ6Ô6ˆDŒLð ÐÝÔ,¨T°4Ô3CÀTÔE[Ø3@ðBñ Bô Bð Bð Bð Bð Bð  $×5Ò5°kÑBÔBˆDÔð ˆ<Ø”9Ð$Ð$Ð$Ð$Ð$å˜d¥EÑ*Ô*ð FÝ”f×.Ò.¨t°W¸fÑEÔEÐEØˆDŒIˆIˆIr'   c                 óJ  — t          |t          ¦  «        sSt          r+t          |t          ¦  «        r|                     d¦  «        }n!t
          j                             |dd¦  «        ‚|t          v r|S | 	                    ¦   «         }|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ô  s§   € õ ˜%¥Ñ)Ô)ð 	EÝð E•z %­Ñ/Ô/ð EØŸš WÑ-Ô-��å”f×.Ò.¨u°e¸VÑDÔDÐDð •MÐ!Ð!ØˆLð �{Š{‰}Œ}ˆØ•=Ð Ð ØˆKõ ˆj¸5¸5ÐBÑCÔCÐCr'   c                 ó8  — t          |t          j        ¦  «        s!t          j                             |dd¦  «        ‚|dk     r|dk    rt          d|fz  ¦  «        ‚|                      ¦   «         }|| j        k    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Ô0ð 	JÝ”&×*Ò*¨7°I¸yÑIÔIÐIð �TŠ>ˆ>˜g¨šo˜oÝÐ>À'ÀÑKÑLÔLÐLð —/’/Ñ#Ô#ˆØ�S”_Ò$Ð$Ýð Yà!œh¨°¸#¼/ÐJñKñ Lô Lð Lð ˆr'   c                 ó>   — 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Ø%2¸GðEñ Eô Eð 	Er'   c                 ó’   — 	 | j         |         S # t          $ r Y nw xY wd|›d|                      ¦   «         ›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%  sf   € ð
	ØÔ(¨Ô/Ð/øÝð 	ð 	ð 	ØˆDð	øøøØð ˆuˆu�c—o’oÑ'Ô'Ð'Ð'ð)ˆå˜‰oŒoÐs   ‚ �
›c                 ó  •— t          | ¦  «        }| j         |j         k    rdS |j        }|�||j        k    r|j        }| j        |k     rdS | j        |j        k    rdS | j        |j        k    rdS  t          t          | ¦  «        j        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ŒjˆØŒ9˜œÒ Ð Ø�4ØÔ(ˆØˆ>˜V c¤oÒ5Ð5Ø”_ˆFØŒ<˜&Ò Ð à�4ØÔ˜sœÒ.Ð.Ø�4ØÔ Ô!2Ò2Ð2Ø�4Ø<�u•] DÑ)Ô)Ô<ÐDÐD¸tÐDÐDÐDr'   z> -- recommend you install one (e.g. 'pip install argon2_cffi')c                 ó2  — | j         }t          |t          ¦  «        r|dk    sJ ‚|dk     r"t          d|z  t          j        j        ¦  «         t          D ]}|| j        v r	|| _	         n/Œt          d|z  t          j        j
        ¦  «         t          | _	        dS )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Ñ+Ô+ÐC°¸tÒ0CÐ0CÐ0CÐCØ˜ÒÐÝÐIÈDÑPÝ”Ô.ñ0ô 0ð 0õ ð 	%ð 	%ˆDØ�yÔ2Ð2Ð2Ø!%�	”Ø�ð 3õ Ð<¸tÑCÅRÄVÔEaÑbÔbÐbå$ˆIŒNàˆtr'   c                 ó^  — |                       ¦   «         }|€|�|                      |¦  «        }|�<|                     |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.
        NÚ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¸Ô9IÑJÔJÐJð ˜-Ò'Ð'¨D¬IÐ,AÝ)Ð*dÑeÔeÐeõ �3‰xŒxˆØð ð ð ð 4;°7°7¸D¸D¸DÀ$À$ÐGˆFˆFå˜$‘Z”ZˆFÝÔ$ S°Ð8Ñ8Ô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   sæ  ø€ € € € € ðð ð  €Dð
€Lð0 &Ô.€Mð  Ô.ÔEØ&ñ'Ðð Ô*Ô=ØMñNÐð *Ô2ÐØ€MØ€Mð 'Ô0€NØ€JØ€JØ€Kð
 $€Oð #€Kð Ðð €Oð €Kð Ðð
 Ðàð,ð ,ñ „]ð,ð €Dð $Ô/€Kð €Gð $Ô/€Kàð#ð #ñ „Xð#ð €Dð Ø[_Ø=Að9ð 9ð 9ð 9ð 9ñ „[ð9ðv ð=ð =ñ „[ð=ð �2”:Ð2Ñ3Ô3€Làð8ð 8ñ „[ð8ð2 �"”*ð ð6 
Œñ7ô €Kð: ð
ð 
ñ „[ð
ð4
ð 
ð 
ð8,ð ,ð ,ð ,ð ,ð ,ðd ðDð Dñ „[ðDð( ðð ñ „[ðð  ðEð Eð Eñ „[ðEð ðð ñ „[ðð"Eð Eð Eð Eð Eð( ^Ðàðð ñ „[ðð2 ð9ð 9ð 9ñ „[ð9ð 9ð 9ð 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                 óT   — |                       ¦   «          |                      |¦  «        S r[   )Ú_stub_requires_backendr_   )r9   Úsecrets     r(   r_   z_NoBackend.hash–  s&   € à×"Ò"Ñ$Ô$Ð$Ø�xŠx˜ÑÔÐr'   c                 óV   — |                       ¦   «          |                      ||¦  «        S r[   )r»   Úverify)r9   r¼   r_   s      r(   r¾   z_NoBackend.verify›  s(   € à×"Ò"Ñ$Ô$Ð$Ø�zŠz˜& $Ñ'Ô'Ð'r'   z1.7z2.0)Ú
deprecatedÚremovedc                 óV   — |                       ¦   «          |                      ||¦  «        S r[   )r»   Úgenhash)r9   r¼   Úconfigs      r(   rÂ   z_NoBackend.genhash   s*   € ð 	×"Ò"Ñ$Ô$Ð$Ø�{Š{˜6 6Ñ*Ô*Ð*r'   c                 ó|   •— |                       ¦   «          t          t          | ¦  «                             |¦  «        S r[   )r»   rF   r   Ú_calc_checksum)r>   r¼   rV   s     €r(   rÅ   z_NoBackend._calc_checksum©  s7   ø€ ð 	×#Ò#Ñ%Ô%Ð%õ •V˜TÑ"Ô"×1Ò1°&Ñ9Ô9Ð9r'   )r   r   r   r    r±   r_   r¾   rK   Údeprecated_methodrÂ   rÅ   r¶   r·   s   @r(   r¹   r¹   Ž  s°   ø€ € € € € ðð ð ð ð  ñ „[ð ð ð(ð (ñ „[ð(ð €RÔ U°EÐ:Ñ:Ô:Øð+ð +ñ „[ñ ;Ô:ð+ð:ð :ð :ð :ð :ð :ð :ð :ð :r'   r¹   c                   óš   — 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dS )	Ú_CffiBackendz
    argon2_cffi backend
    c                 ó  — | t           u sJ ‚t          €"t          rt          j        t          ¦  «        ‚dS t          j        j        }t                               dt          j	        |¦  «         t          j
        }i }t          D ]U}	 t          ||                     ¦   «         ¦  «        ||<   Œ)# t          $ r  |t          t           fvsJ d|z  ¦   «         ‚Y ŒRw xY w|| _        |x| _        | _        |                      ||¦  «        S )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Ð(Ð(Ð(Ð(õ ÐÝ!ð CÝÔ.Õ/AÑBÔBÐBØ�5Ý"Ô,Ô;ˆÝ�	Š	ÐcÝÔ*¨Kñ	9ô 	9ð 	9õ  Ô$ˆØˆÝð 	Zð 	ZˆDðZÝ!(¨°4·:²:±<´<Ñ!@Ô!@�˜‘�øÝ!ð Zð Zð Zà¥F­FÐ#3Ð3Ð3Ð3Ð5RÐUYÑ5YÑ3Ô3Ð3Ð3Ð3ðZøøøð '/ˆ	Ô#ð 5@Ð?ˆ	Ô˜IÔ1Ø×0Ò0°°vÑ>Ô>Ð>s   Â%B*Â*'CÃCc                 óª  — t          j        |¦  «         t          |d¦  «        }	 t          t          j                             |                      | j        ¦  «        | j	        | j
        | j        t          |                      ¦   «         ¦  «        | j        |¬¦  «        ¦  «        S # t          j        j        $ r}|                      |¦  «        ‚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×!CÒ!CØ×*Ò*¨3¬8Ñ4Ô4ØœOØÔ,ØœOÝ˜c×0Ò0Ñ2Ô2Ñ3Ô3ØÔ*Øð "Dñ "ô "ñ ô ð øõ Ô&Ô3ð 	0ð 	0ð 	0Ø×*Ò*¨3Ñ/Ô/Ð/øøøøð	0øøøs   ¦A=B$ Â$CÂ8CÃCc              #   ó`   K  — | ])}t          d |                     d¦  «        ¦  «        |fV — Œ*dS )s
   $argon2%s$rg   N)r
   ri   )Ú.0r0   s     r(   ú	<genexpr>z_CffiBackend.<genexpr>ô  sQ   è è € ð 2ð 2Ø#õ )¨¸¿ºÀGÑ8LÔ8LÑMÔMÈtÐTð 2ð 2ð 2ð 2ð 2ð 2r'   c           	      óø  — t          j        |¦  «         t          |d¦  «        }t          |d¦  «        }| j                             |d d|                     dd¦  «        z   …         t          ¦  «        }|                      |¦  «        }	 t          j	         
                    |||¦  «        }|du sJ ‚dS # t          j        j        $ r Y dS t          j        j        $ r}|                      ||¬¦  «        ‚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Ñ-AÐ,AÔ'BÅFÑKÔKˆØ×)Ò)¨$Ñ/Ô/ˆ	ð	;Ý!Ô+×9Ò9¸$ÀÈ	ÑRÔRˆFØ˜T�>�>�>�>Ø�4øÝÔ&Ô:ð 	ð 	ð 	Ø�5�5ÝÔ&Ô8ð 	;ð 	;ð 	;Ø×*Ò*¨3°TÐ*Ñ:Ô:Ð:øøøøð	;øøøs   Â
'B3 Â3C9Ã
C9ÃC4Ã4C9c                 ó  — t          j        |¦  «         t          |d¦  «        }|                      |¦  «        }	 t	          t
          j                             |                      |j	        ¦  «        |j
        |j        |j        t          |j        ¦  «        |j        ||j        ¬¦  «        ¦  «        }n3# t
          j        j        $ r}|                      ||¬¦  «        ‚d }~ww xY w|j        dk    r|                     dd¦  «        }|S )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×#EÒ#EØ×*Ò*¨4¬9Ñ5Ô5Ø Ô,Øœ+Ø Ô,Ý˜dœiÑ(Ô(ØÔ+ØØœð $Fñ 	$ô 	$ñ 	ô 	ˆFˆFøõ Ô&Ô3ð 	=ð 	=ð 	=Ø×*Ò*¨3°VÐ*Ñ<Ô<Ð<øøøøð	=øøøàŒ<˜4ÒÐà—^’^ H¨cÑ2Ô2ˆFØˆs   »A7B3 Â3C#ÃCÃC#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ÔMÐMr'   N)r   r   r   r    r±   rØ   r_   Údictr”   rå   r¾   rÂ   rÅ   r&   r'   r(   rÈ   rÈ   ¸  sÍ   € € € € € ðð ð ð?ð ?ñ „[ð?ð> ð0ð 0ñ „[ð0ð& �dð 2ð 2Ø'0ð2ñ 2ô 2ñ 2ô 2€Oð ð;ð ;ñ „[ð;ð, ðð ñ „[ðð6Nð Nð Nð Nð Nr'   rÈ   c                   ó.   — e Zd ZdZed„ ¦   «         Zd„ ZdS )Ú_PureBackendz
    argon2pure backend
    c                 ó>  — | t           u sJ ‚	 dd lan# t          $ r Y dS w xY w	 ddlm} n+# t          $ r t
                               d¦  «         Y dS w xY wt
                               d|¦  «         |st          dt          j
        ¦  «         i }t          D ]]}	 t          t          d|                     ¦   «         z   ¦  «        ||<   Œ1# t          $ r  |t          t           fvsJ d|z  ¦   «         ‚Y ŒZw xY w|| _        |x| _        | _        |                      ||¦  «        S )	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Ð(Ð(Ð(Ð(ð	Ø,Ð,Ð,Ð,Ð,øÝð 	ð 	ð 	Ø�5�5ð	øøøð	ØHÐHÐHÐHÐHÐHÐHøÝð 	ð 	ð 	Ý�KŠKð Añ Bô Bð Bà�5�5ð	øøøõ
 	�	Š	ÐVØñ	ô 	ð 	ð ð 	HÝð +å,/Ô,FñHô Hð Hð
 ˆÝð 	Zð 	ZˆDðZÝ!(­°hÀÇÂÁÄÑ6MÑ!NÔ!N�˜‘�øÝ!ð Zð Zð Zà¥F­FÐ#3Ð3Ð3Ð3Ð5RÐUYÑ5YÑ3Ô3Ð3Ð3Ð3ðZøøøð '/ˆ	Ô#à4?Ð?ˆ	Ô˜IÔ1Ø×0Ò0°°vÑ>Ô>Ð>s-   � ’
 Ÿ ¤+ «$AÁAÂ-CÃ'C1Ã0C1c                 óÈ  — t          j        |¦  «         t          |d¦  «        }t          || j        | j        | j        | j        | j        |  	                    | j
        ¦  «        | j        ¬¦  «        }| j        dk    r
| j        |d<   | j        rd|d<   | j        r
| j        |d<   	 t          j        d	i |¤ŽS # t          j        $ r}|                      || ¬¦  «        ‚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ØÔ(ØÔ(ØÔ)Ø×,Ò,¨T¬YÑ7Ô7Ø”Lð	
ñ 	
ô 	
ˆð Ô˜aÒÐØ"Ô.ˆD�‰OØÔ ð 	'Ø"&ˆD�ÑØŒ9ð 	0Ø&*¤iˆDÐ"Ñ#ð	<ÝÔ%Ð-Ð-¨Ð-Ð-Ð-øÝÔ&ð 	<ð 	<ð 	<Ø×+Ò+¨C°dÐ+Ñ;Ô;Ð;øøøøð	<øøøs   Â%B6 Â6C!ÃCÃC!N)r   r   r   r    r±   rØ   rÅ   r&   r'   r(   ró   ró   4  sI   € € € € € ðð ð ð&?ð &?ñ „[ð&?ðb<ð <ð <ð <ð <r'   ró   c                   ó&   — e Zd ZdZdZdZeeedœZ	dS )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   Ž  sD   € € € € € ðEð 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Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6à €€€Ø€gÔ˜Ñ!Ô!€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð à€Ø€à Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #ð ð€ð  
ˆˆ3‰Œ€Ø	
ˆˆ3‰Œ€Ø
ˆ!ˆD‰'Œ'€ð �f˜fÐ%€	Ø��I‘”€ð Ð ðØ!Ð!Ð!Ð!ð ˆ7�< Ñ(Ô(ð 
ð4ð 	ð ˆˆØˆW�\ ;Ñ/Ô/ð à_ÐØˆøøð ð ð ð Ø€L€L€Lðøøøð" €7ˆ<Ð)Ñ*Ô*ð à3˜Ô3Ñ5Ô5ÐØ#Ô-Ô<ÐÐðð ð ð ð ñ ô ð ð  )Ð(Ñ*Ô*ÐØÐð
R9ð R9ð R9ð R9ð R9�BÔ+¨RÔ-@Ø”L "¤-°Ô1BØÔ%ñR9ô R9ð R9ðv!:ð !:ð !:ð !:ð !:�ñ !:ô !:ð !:ðTsNð sNð sNð sNð sN�=ñ sNô sNð sNðxT<ð T<ð T<ð T<ð T<�=ñ T<ô T<ð T<ðt[ð [ð [ð [ð [ˆZ˜ñ [ô [ð [ð [ð [s   ÂC ÃCÃC