Ë
    àU.jB7  ã            
       ót  — d Z ddlmZmZ ddlZ ej
                  e«      Zddlm	Z
 ddlmZmZ ddlmZmZmZ ddlmZmZmZ ddlmZ ddlmc mZ d	gZ ed
«      Z ed«      Z ed«      Z G d„ d	ej>                  ej@                  ejB                  ejD                  ejF                  ejH                  «      Z	y)z/passlib.handlers.scrypt -- scrypt password hashé    )Úwith_statementÚabsolute_importN)Úscrypt)Úh64Úto_bytes)r   Úb64s_decodeÚb64s_encode)ÚuÚbascii_to_strÚsuppress_cause)Úclasspropertyr   z$scrypt$z$7$Ú$c                   ó(  ‡ — e Zd ZdZd ZdZdZeZee	fZ
dZdZdZdZdZdZdZd	Zedˆ fd
„	«       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zd„ Zdˆ fd„	Zedd„«       Zˆ fd„Zed„ «       Zed„ «       Zedd„«       Z edd„«       Z!d„ Z"ˆ fd„Z#ˆ xZ$S )r   a“	  This class implements an SCrypt-based password [#scrypt-home]_ hash, and follows the :ref:`password-hash-api`.

    It supports a variable-length salt, a variable number of rounds,
    as well as some custom tuning parameters unique to scrypt (see below).

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

    :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.
        Defaults to 16 bytes, but can be any value between 0 and 1024.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        Defaults to 16, but must be within ``range(1,32)``.

        .. warning::

            Unlike many hash algorithms, increasing the rounds value
            will increase both the time *and memory* required to hash a password.

    :type block_size: int
    :param block_size:
        Optional block size to pass to scrypt hash function (the ``r`` parameter).
        Useful for tuning scrypt to optimal performance for your CPU architecture.
        Defaults to 8.

    :type parallelism: int
    :param parallelism:
        Optional parallelism to pass to scrypt hash function (the ``p`` parameter).
        Defaults to 1.

    :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.

    .. note::

        The underlying scrypt hash function has a number of limitations
        on it's parameter values, which forbids certain combinations of settings.
        The requirements are:

        * ``linear_rounds = 2**<some positive integer>``
        * ``linear_rounds < 2**(16 * block_size)``
        * ``block_size * parallelism <= 2**30-1``

    .. todo::

        This class currently does not support configuring default values
        for ``block_size`` or ``parallelism`` via a :class:`~passlib.context.CryptContext`
        configuration.
    )ÚidentÚsaltÚ	salt_sizeÚroundsÚ
block_sizeÚparallelismé    é   i   é   é   Úlog2é   c           	      óž  •— t        t        | �
  di |¤Ž}|�Lt        |t        j
                  «      rt        |«      }|j                  ||j                  d«      ¬«      |_	        	 t        j                  d| j                  z  | j                  | j                  «       |S # t        $ r%}t        t        dt!        |«      z   «      «      ‚d }~ww xY w)NÚrelaxed)r   r   z&scrypt: invalid settings combination: © )Úsuperr   ÚusingÚ
isinstanceÚuhÚnative_string_typesÚintÚ_norm_block_sizeÚgetr   Ú_scryptÚvalidateÚdefault_roundsr   Ú
ValueErrorr   Ústr)Úclsr   ÚkwdsÚsubclsÚerrÚ	__class__s        €úYC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\passlib/handlers/scrypt.pyr    zscrypt.using›   s»   ø€ ä”v˜sÑ)Ñ1¨DÑ1ˆØÐ!Ü˜*¤b×&<Ñ&<Ô=Ü  ›_�
Ø &× 7Ñ 7¸
ÈDÏHÉHÐU^ÓL_Ð 7Ó `ˆFÔð	bÜ×Ñ˜Q #×"4Ñ"4Ñ4°c·n±nÀcÇoÁoÔVð ˆøô ò 	bÜ ¤Ð,TÔWZÐ[^ÓW_Ñ,_Ó!`ÓaÐaûð	bús   Á$8B Â	CÂ' CÃCc                 ó0   —  | di | j                  |«      ¤ŽS )Nr   )Úparse)r,   Úhashs     r1   Úfrom_stringzscrypt.from_string¯   s   € áÑ%�S—Y‘Y˜t“_Ñ%Ð%ó    c                 óÂ   — | j                  |«      \  }}t        | d|j                  t        «      z  d «      }|r ||«      S t        j
                  j                  | «      ‚)Nz_parse_%s_string)Ú_parse_identÚgetattrÚstripÚ_UDOLLARr"   ÚexcÚInvalidHashError)r,   r4   r   ÚsuffixÚfuncs        r1   r3   zscrypt.parse³   sU   € à×(Ñ(¨Ó.‰ˆˆvÜ�sÐ.°·±¼XÓ1FÑFÈÓMˆÙÙ˜“<Ðä—&‘&×)Ñ)¨#Ó.Ð.r6   c                 óš  — |j                  d«      }t        |«      dk(  r|\  }}}n6t        |«      dk(  r|\  }}d }n t        j                  j	                  | d«      ‚|j                  d«      }t        |«      dk(  r?|\  }}}|j                  d«      sJ ‚|j                  d«      sJ ‚|j                  d«      s"J ‚t        j                  j	                  | d	«      ‚t        t        t        |dd  «      t        |dd  «      t        |dd  «      t        |j                  d
«      «      |rt        |j                  d
«      «      ¬«      S d ¬«      S )Nr   é   é   zmalformed hashÚ,zln=zr=zp=zmalformed settings fieldÚascii©r   r   r   r   r   Úchecksum)ÚsplitÚlenr"   r<   ÚMalformedHashErrorÚ
startswithÚdictÚIDENT_SCRYPTr$   r   Úencode)	r,   r>   ÚpartsÚparamsr   ÚdigestÚnstrÚbstrÚpstrs	            r1   Ú_parse_scrypt_stringzscrypt._parse_scrypt_stringÇ   s;  € ð —‘˜SÓ!ˆÜˆu‹:˜Š?Ø#(Ñ ˆF�D™&Ü�‹Z˜1Š_Ø ‰LˆF�DØ‰Fä—&‘&×+Ñ+¨CÐ1AÓBÐBð —‘˜SÓ!ˆÜˆu‹:˜Š?Ø$ÑˆD�$˜Ø—?‘? 5Ô)Ð)Ð)Ø—?‘? 4Ô(Ð(Ð(Ø—?‘? 4Ô(Ð(Ð(ä—&‘&×+Ñ+¨CÐ1KÓLÐLäÜÜ�t˜A˜B�x“=Ü˜4  ˜8“}Ü˜D  ˜H›Ü˜TŸ[™[¨Ó1Ó2Ù<B”[ §¡¨wÓ!7Ó8ôð 	ð IMôð 	r6   c           
      ó  — |j                  d«      j                  d«      }t        |«      dk(  r|\  }}n3t        |«      dk(  r|\  }d }nt        j                  j                  «       ‚t        |«      dk  r t        j                  j                  | d«      ‚t        t        t        j                  |d d «      t        j                  |dd «      t        j                  |dd «      |dd  |rt        j                  |«      ¬«      S d ¬«      S )	NrD   ó   $rB   r   é   zparams field too shorté   rE   )rM   rG   rH   r"   r<   rI   rK   ÚIDENT_7r   Údecode_int6Údecode_int30Údecode_bytes)r,   r>   rN   rO   rP   s        r1   Ú_parse_7_stringzscrypt._parse_7_stringõ   sô   € ð —‘˜gÓ&×,Ñ,¨TÓ2ˆÜˆu‹:˜Š?Ø"‰NˆF‘FÜ�‹Z˜1Š_Ø‰GˆFØ‰Fä—&‘&×+Ñ+Ó-Ð-ô ˆv‹;˜ÒÜ—&‘&×+Ñ+¨CÐ1IÓJÐJÜÜÜ—?‘? 6¨"¨1 :Ó.Ü×'Ñ'¨¨q°¨Ó4Ü×(Ñ(¨°°"¨Ó6Ø˜˜�Ù17”S×%Ñ% fÓ-ô
ð 	
ð >Bô
ð 	
r6   c                 ó¾  — | j                   }|t        k(  r`d| j                  | j                  | j                  t        t        | j                  «      «      t        t        | j                  «      «      fz  S |t        k(  sJ ‚| j                  }	 |j                  d«       t        dj                  dt        j                   | j                  «      t        j"                  | j                  «      t        j"                  | j                  «      | j                  dt        j$                  | j                  «      g«      «      S # t        $ r t        t        d«      «      ‚w xY w)Nz$scrypt$ln=%d,r=%d,p=%d$%s$%srD   z.scrypt $7$ hashes dont support non-ascii saltsr6   s   $7$rV   )r   rL   r   r   r   r   r	   r   rF   rY   ÚdecodeÚUnicodeDecodeErrorr   ÚNotImplementedErrorÚjoinr   Úencode_int6Úencode_int30Úencode_bytes)Úselfr   r   s      r1   Ú	to_stringzscrypt.to_string  s"  € Ø—
‘
ˆØ”LÒ Ø2Ø—‘Ø—‘Ø× Ñ Üœk¨$¯)©)Ó4Ó5Üœk¨$¯-©-Ó8Ó9ð6ñ ð ð œGÒ#Ð#Ð#Ø—9‘9ˆDðlØ—‘˜GÔ$ô ! §¡ØÜ—‘ §¡Ó,Ü× Ñ  §¡Ó1Ü× Ñ  ×!1Ñ!1Ó2Ø—	‘	ØÜ× Ñ  §¡Ó/ð+ó "ó ð øô &ò lÜ$Ô%8Ð9iÓ%jÓkÐkðlús   ÂD> Ä>Ec                 ó¼   •— t        t        | �
  di |¤Ž |€0t        j                  | | j
                  | j                  d¬«      sJ ‚y | j                  |«      | _        y )Nr   ©Úparamr   )r   r   Ú__init__r"   Úvalidate_default_valuer   r%   )rf   r   r-   r0   s      €r1   rk   zscrypt.__init__1  s_   ø€ ÜŒf�dÑ$Ñ, tÒ,ð ÐÜ×,Ñ,¨T°4·?±?ÀD×DYÑDYØ3?õAð Añ Að #×3Ñ3°JÓ?ˆD�Or6   c                 ó6   — t        j                  | |dd|¬«      S )Nr   r   )Úminrj   r   )r"   Únorm_integer)r,   r   r   s      r1   r%   zscrypt._norm_block_size>  s   € ä�‰˜s J°A¸\ÐSZÔ[Ð[r6   c                 óh   •— t         t        | �  «       }| j                  t        k(  rt        |«      }|S ©N)r   r   Ú_generate_saltr   rY   r	   )rf   r   r0   s     €r1   rr   zscrypt._generate_saltB  s/   ø€ Ü”V˜TÑ1Ó3ˆØ�:‰:œÒ ô ˜tÓ$ˆDØˆr6   c                 ó"   — t         j                  S rq   )r'   Úbackend_values©r,   s    r1   Úbackendszscrypt.backendsP  s   € ä×%Ñ%Ð%r6   c                 ó"   — t         j                  S rq   )r'   Úbackendru   s    r1   Úget_backendzscrypt.get_backendT  s   € ä�‰Ðr6   c                 ór   — 	 | j                  |d¬«       y# t        j                  j                  $ r Y yw xY w)NT©ÚdryrunF)Úset_backendr"   r<   ÚMissingBackendError)r,   Únames     r1   Úhas_backendzscrypt.has_backendX  s6   € ð	Ø�O‰O˜D¨ˆOÔ.ØøÜ�v‰v×)Ñ)ò 	Ùð	ús   ‚ –6µ6c                 ó2   — t        j                  ||¬«       y )Nr{   )r'   Ú_set_backend)r,   r   r|   s      r1   r}   zscrypt.set_backend`  s   € ä×Ñ˜T¨&Ö1r6   c                 ó¼   — t        |d¬«      }t        j                  || j                  d| j                  z  | j
                  | j                  | j                  ¬«      S )NÚsecretri   r   )ÚnÚrÚpÚkeylen)r   r'   r   r   r   r   r   Úchecksum_size)rf   r„   s     r1   Ú_calc_checksumzscrypt._calc_checksumg  sK   € Ü˜&¨Ô1ˆÜ�~‰~˜f d§i¡i°A¸¿¹Ñ4DÈÏÉØ $× 0Ñ 0¸×9KÑ9KôMð 	Mr6   c                 óp   •— | j                   t        | «      j                   k7  ryt        t        | �  di |¤ŽS )zR
        mark hash as needing update if rounds is outside desired bounds.
        Tr   )r   Útyper   r   Ú_calc_needs_update)rf   r-   r0   s     €r1   r�   zscrypt._calc_needs_updatep  s3   ø€ ð
 �?‰?œd 4›j×3Ñ3Ò3ØÜ”V˜TÑ5Ñ=¸Ñ=Ð=r6   rq   )F)Úany)rŽ   F)%Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úsetting_kwdsr‰   rL   Údefault_identrY   Úident_valuesÚdefault_salt_sizeÚmax_salt_sizer)   Ú
min_roundsÚ
max_roundsÚrounds_costr   r   Úclassmethodr    r5   r3   rT   r]   rg   rk   r%   rr   r   rv   ry   r€   r}   rŠ   r�   Ú__classcell__)r0   s   @r1   r   r   !   sI  ø„ ñ>ðN €DØX€Lð €Mð
 !€MØ  'Ð*€Lð
 ÐØ€Mð €NØ€JØ€JØ€Kð €Kð €Jð ôó ðð& ñ&ó ð&ð ñ/ó ð/ð& ñó ððZ ñ
ó ð
ò:õ<@ð ò\ó ð\ôð ñ&ó ð&ð ñó ðð òó ðð ò2ó ð2òM÷>ð >r6   )%r’   Ú
__future__r   r   ÚloggingÚ	getLoggerr�   ÚlogÚpasslib.cryptor   r'   Úpasslib.utilsr   r   Úpasslib.utils.binaryr   r	   Úpasslib.utils.compatr
   r   r   Úpasslib.utils.decorr   Úpasslib.utils.handlersÚutilsÚhandlersr"   Ú__all__rL   rY   r;   ÚParallelismMixinÚ	HasRoundsÚ
HasRawSaltÚHasRawChecksumÚHasManyIdentsÚGenericHandlerr   r6   r1   Ú<module>r°      s¢   ðÙ 5÷ 7ã Ð'�g×'Ñ'¨Ó1�õ -ß 'ß >Ñ >ß AÑ AÝ -ß #Ð #ð ð€ñ �‹}€Ù
ˆE‹(€áˆS‹6€ô
V>ˆR× Ñ  "§,¡,°·±¸r×?PÑ?PÐRT×RbÑRbØ×ÑõV>r6   