Ë
    àU.jw  ã                   ó   — d Z ddlmZmZ ddlZddlZ ej                  e«      Zddl	m
Z
 ddlmc mZ ddlmZmZmZmZ ddlmZ dgZ G d„ dej.                  ej0                  ej2                  ej4                  «      Zy)	zpasslib.handlers.fshp
é    )Ú	b64encodeÚ	b64decodeN)Ú
to_unicode)Úbascii_to_strÚ	iteritemsÚuÚunicode)Úpbkdf1Úfshpc            
       óÖ  ‡— e Zd ZdZd ZdZej                  Z e	d«      Z
dZdZdZdZdZd	ZdZd
ddddœZ eeD � ��cg c]  }t)        |«      |f‘Œ c}}}  ee«      D � ��cg c]  \  }}|d   |f‘Œ c}}} z   «      Zedˆfd„	«       ZdZdˆfd„	Zed„ «       Zed„ «       Zed„ «       Z ej@                   e	d«      ejB                  «      Z"ed„ «       Z#d„ Z$d„ Z%ˆxZ&S c c}}} w c c}}} w )r   ap  This class implements the FSHP password hash, and follows the :ref:`password-hash-api`.

    It supports a variable-length salt, and a variable number of rounds.

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

    :param salt:
        Optional raw salt string.
        If not specified, one will be autogenerated (this is recommended).

    :param salt_size:
        Optional number of bytes to use when autogenerating new salts.
        Defaults to 16 bytes, but can be any non-negative value.

    :param rounds:
        Optional number of rounds to use.
        Defaults to 480000, must be between 1 and 4294967295, inclusive.

    :param variant:
        Optionally specifies variant of FSHP to use.

        * ``0`` - uses SHA-1 digest (deprecated).
        * ``1`` - uses SHA-2/256 digest (default).
        * ``2`` - uses SHA-2/384 digest.
        * ``3`` - uses SHA-2/512 digest.

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

        .. versionadded:: 1.6
    )ÚsaltÚ	salt_sizeÚroundsÚvariantz{FSHPé   Ni S é   l   ÿÿ Úlinear)Úsha1é   )Úsha256é    )Úsha384é0   )Úsha512é@   )r   r   é   é   r   c                 ó^   •— t        t        | �
  di |¤Ž}|�| j                  |«      |_        |S )N© )Úsuperr   ÚusingÚ_norm_variantÚdefault_variant)Úclsr   ÚkwdsÚsubclsÚ	__class__s       €úWC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\passlib/handlers/fshp.pyr!   z
fshp.usingf   s5   ø€ ä”t˜SÑ'Ñ/¨$Ñ/ˆØÐØ%(×%6Ñ%6°wÓ%?ˆFÔ"Øˆó    c                 ó  •— |j                  d«      | _        |�| j                  |«      }nA| j                  r*| j                  }| j                  |«      |k(  sJ d|›�«       ‚t	        d«      ‚|| _        t        t        | �"  di |¤Ž y )NÚuse_defaultszinvalid default variant: zno variant specifiedr   )	Úgetr+   r"   r#   Ú	TypeErrorr   r    r   Ú__init__)Úselfr   r%   r'   s      €r(   r.   zfshp.__init__u   s…   ø€ à ŸH™H ^Ó4ˆÔØÐØ×(Ñ(¨Ó1‰GØ×ÒØ×*Ñ*ˆGØ×%Ñ% gÓ.°'Ò9ÑeÑ\cÐ;eÓeÐ9äÐ2Ó3Ð3ØˆŒÜŒd�DÑ"Ñ* TÓ*r)   c                 ó   — t        |t        «      r|j                  d«      }t        |t        «      r	 | j                  |   }t        |t        «      st        d«      ‚|| j                  vrt        d«      ‚|S # t
        $ r t        d«      ‚w xY w)NÚasciizinvalid fshp variantz'fshp variant must be int or known alias)
Ú
isinstanceÚbytesÚdecoder	   Ú_variant_aliasesÚKeyErrorÚ
ValueErrorÚintr-   Ú_variant_info)r$   r   s     r(   r"   zfshp._norm_variant‚   s�   € ä�gœuÔ%Ø—n‘n WÓ-ˆGÜ�gœwÔ'ð9Ø×.Ñ.¨wÑ7�ô ˜'¤3Ô'ÜÐEÓFÐFØ˜#×+Ñ+Ñ+ÜÐ3Ó4Ð4Øˆøô ò 9Ü Ð!7Ó8Ð8ð9ús   ³A8 Á8Bc                 ó:   — | j                   | j                     d   S )Nr   ©r9   r   ©r/   s    r(   Úchecksum_algzfshp.checksum_alg‘   ó   € à×!Ñ! $§,¡,Ñ/°Ñ2Ð2r)   c                 ó:   — | j                   | j                     d   S )Nr   r;   r<   s    r(   Úchecksum_sizezfshp.checksum_size•   r>   r)   z¶
            ^
            \{FSHP
            (\d+)\| # variant
            (\d+)\| # salt size
            (\d+)\} # rounds
            ([a-zA-Z0-9+/]+={0,3}) # digest
            $c                 óÂ  — t        |dd«      }| j                  j                  |«      }|st        j                  j                  | «      ‚|j                  dddd«      \  }}}}t        |«      }t        |«      }t        |«      }	 t        |j                  d«      «      }|d | }||d  } | ||||¬«      S # t        $ r  t        j                  j                  | «      ‚w xY w)Nr1   Úhashr   r   r   é   )r   Úchecksumr   r   )r   Ú_hash_regexÚmatchÚuhÚexcÚInvalidHashErrorÚgroupr8   r   Úencoder-   ÚMalformedHashError)	r$   rB   Úmr   r   r   Údatar   Úchks	            r(   Úfrom_stringzfshp.from_string¦   sÝ   € ä˜$ ¨Ó0ˆØ�O‰O×!Ñ! $Ó'ˆÙÜ—&‘&×)Ñ)¨#Ó.Ð.Ø+,¯7©7°1°Q°q¸Ó+;Ñ(ˆ�˜F DÜ�g“,ˆÜ˜	“Nˆ	Ü�V“ˆð	1Ü˜TŸ[™[¨Ó1Ó2ˆDð �J�YÐˆØ�9�:ÐˆÙ˜ s°6À7ÔKÐKøô	 ò 	1Ü—&‘&×+Ñ+¨CÓ0Ð0ð	1ús   ÂB5 Â5)Cc                 ó¬   — | j                   }| j                  }t        t        ||z   «      «      }d| j                  t        |«      | j                  |fz  S )Nz{FSHP%d|%d|%d}%s)rD   r   r   r   r   Úlenr   )r/   rO   r   rN   s       r(   Ú	to_stringzfshp.to_string¸   sG   € Ø�m‰mˆØ�y‰yˆÜœY t¨C¡xÓ0Ó1ˆØ! T§\¡\´3°t³9¸d¿k¹kÈ4Ð$PÑPÐPr)   c                 ó´   — t        |t        «      r|j                  d«      }t        | j                  | j
                  || j                  | j                  ¬«      S )Nzutf-8)ÚdigestÚsecretr   r   Úkeylen)r2   r	   rK   r
   r=   r   r   r@   )r/   rV   s     r(   Ú_calc_checksumzfshp._calc_checksumÂ   sL   € Ü�fœgÔ&Ø—]‘] 7Ó+ˆFô Ø×$Ñ$Ø—9‘9ØØ—;‘;Ø×%Ñ%ôð 	r)   )N)'Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnameÚsetting_kwdsrG   ÚPADDED_BASE64_CHARSÚchecksum_charsr   ÚidentÚdefault_salt_sizeÚmax_salt_sizeÚdefault_roundsÚ
min_roundsÚ
max_roundsÚrounds_costr#   r9   Údictr	   r   r5   Úclassmethodr!   r   r.   r"   Úpropertyr=   r@   ÚreÚcompileÚXrE   rP   rS   rX   Ú__classcell__)Ú.0Úkr	   Úvr'   s   0000@r(   r   r      sf  ø„ ñ#ðR €DØ=€LØ×+Ñ+€NÙˆg‹J€Eð ÐØ€Mð
 €NØ€JØ€JØ€Kð €Oð ØØØñ
€Mñ Ù!.Õ/¡˜AŒ'�!‹*�QŠ Ó/Ù& }Ô5Õ6Ñ5‘c�a˜ˆ!ˆA‰$ˆqŠÐ5Ó6ñ	7ó
Ðð ôó ðð €Gõ
+ð ñó ðð ñ3ó ð3ð ñ3ó ð3ð �"—*‘*™Qð  ó ð —4‘4ó€Kð ñLó ðLò"QöùôG 	0ùÜ6s   ½CÁ!C$)r\   Úbase64r   r   rk   ÚloggingÚ	getLoggerrY   ÚlogÚpasslib.utilsr   Úpasslib.utils.handlersÚutilsÚhandlersrG   Úpasslib.utils.compatr   r   r   r	   Úpasslib.crypto.digestr
   Ú__all__Ú	HasRoundsÚ
HasRawSaltÚHasRawChecksumÚGenericHandlerr   r   r)   r(   Ú<module>r�      ss   ðñ÷ (Û 	Û Ð'�g×'Ñ'¨Ó1�õ %ß #Ð #÷)ó )å (ð ð€ôuˆ2�<‰<˜Ÿ™¨×(9Ñ(9¸2×;LÑ;Lõ ur)   