§
    HŠtjw  ã                   óÜ   — 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j        ej        ej        ¦  «        ZdS )	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d„ eD ¦   «         d„  ee¦  «        D ¦   «         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j         ¦  «        Z!ed„ ¦   «         Z"d„ Z#d„ Z$ˆ xZ%S )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   é   é   c                 ó0   — g | ]}t          |¦  «        |f‘ŒS © )r	   )Ú.0Úks     úS/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/handlers/fshp.pyú
<listcomp>zfshp.<listcomp>_   s"   € Ð/Ð/Ð/˜A�'�!‰*Œ*�QˆÐ/Ð/Ð/ó    c                 ó(   — g | ]\  }}|d          |f‘ŒS )r   r   )r    r!   Úvs      r"   r#   zfshp.<listcomp>`   s$   € Ð6Ð6Ð6‘c�a˜ˆ!ˆAŒ$ˆqˆÐ6Ð6Ð6r$   c                 ó€   •—  t          t          | ¦  «        j        di |¤Ž}|�|                      |¦  «        |_        |S )Nr   )Úsuperr   ÚusingÚ_norm_variantÚdefault_variant)Úclsr   ÚkwdsÚsubclsÚ	__class__s       €r"   r)   z
fshp.usingf   sF   ø€ à'••t˜SÑ!Ô!Ô'Ð/Ð/¨$Ð/Ð/ˆØÐØ%(×%6Ò%6°wÑ%?Ô%?ˆFÔ"Øˆr$   c                 óB  •— |                      d¦  «        | _        |�|                      |¦  «        }nD| j        r.| j        }|                      |¦  «        |k    sJ d|›�¦   «         ‚nt	          d¦  «        ‚|| _         t          t          | ¦  «        j        di |¤Ž d S )NÚuse_defaultszinvalid default variant: zno variant specifiedr   )	Úgetr1   r*   r+   Ú	TypeErrorr   r(   r   Ú__init__)Úselfr   r-   r/   s      €r"   r4   zfshp.__init__u   s¸   ø€ à ŸHšH ^Ñ4Ô4ˆÔØÐØ×(Ò(¨Ñ1Ô1ˆGˆGØÔð 	4ØÔ*ˆGØ×%Ò% gÑ.Ô.°'Ò9Ð9Ð9Ð9Ð\cÐ\cÐ;eÑ9Ô9Ð9Ð9åÐ2Ñ3Ô3Ð3ØˆŒØ"��d�DÑÔÔ"Ð*Ð* TÐ*Ð*Ð*Ð*Ð*r$   c                 óT  — t          |t          ¦  «        r|                     d¦  «        }t          |t          ¦  «        r,	 | j        |         }n# t
          $ r t          d¦  «        ‚w xY wt          |t          ¦  «        st          d¦  «        ‚|| j	        vrt          d¦  «        ‚|S )NÚasciizinvalid fshp variantz'fshp variant must be int or known alias)
Ú
isinstanceÚbytesÚdecoder	   Ú_variant_aliasesÚKeyErrorÚ
ValueErrorÚintr3   Ú_variant_info)r,   r   s     r"   r*   zfshp._norm_variant‚   s¹   € å�g�uÑ%Ô%ð 	.Ø—n’n WÑ-Ô-ˆGÝ�g�wÑ'Ô'ð 	9ð9ØÔ.¨wÔ7��øÝð 9ð 9ð 9Ý Ð!7Ñ8Ô8Ð8ð9øøøå˜'¥3Ñ'Ô'ð 	GÝÐEÑFÔFÐFØ˜#Ô+Ð+Ð+ÝÐ3Ñ4Ô4Ð4Øˆs   ÁA ÁA)c                 ó2   — | j         | j                 d         S )Nr   ©r?   r   ©r5   s    r"   Úchecksum_algzfshp.checksum_alg‘   ó   € àÔ! $¤,Ô/°Ô2Ð2r$   c                 ó2   — | j         | j                 d         S )Nr   rA   rB   s    r"   Úchecksum_sizezfshp.checksum_size•   rD   r$   z¶
            ^
            \{FSHP
            (\d+)\| # variant
            (\d+)\| # salt size
            (\d+)\} # rounds
            ([a-zA-Z0-9+/]+={0,3}) # digest
            $c                 ó  — t          |dd¦  «        }| j                             |¦  «        }|st          j                             | ¦  «        ‚|                     dddd¦  «        \  }}}}t          |¦  «        }t          |¦  «        }t          |¦  «        }	 t          | 	                    d¦  «        ¦  «        }n-# t          $ r  t          j                             | ¦  «        ‚w xY w|d |…         }||d …         } | ||||¬¦  «        S )Nr7   Úhashr   r   r   é   )r   Úchecksumr   r   )r   Ú_hash_regexÚmatchÚuhÚexcÚInvalidHashErrorÚgroupr>   r   Úencoder3   ÚMalformedHashError)	r,   rH   Úmr   r   r   Údatar   Úchks	            r"   Úfrom_stringzfshp.from_string¦   s  € å˜$ ¨Ñ0Ô0ˆØŒO×!Ò! $Ñ'Ô'ˆØð 	/Ý”&×)Ò)¨#Ñ.Ô.Ð.Ø+,¯7ª7°1°Q°q¸Ñ+;Ô+;Ñ(ˆ�˜F DÝ�g‘,”,ˆÝ˜	‘N”Nˆ	Ý�V‘”ˆð	1Ý˜TŸ[š[¨Ñ1Ô1Ñ2Ô2ˆDˆDøÝð 	1ð 	1ð 	1Ý”&×+Ò+¨CÑ0Ô0Ð0ð	1øøøà�J�Y�JÔˆØ�9�:�:ÔˆØˆs˜ s°6À7ÐKÑKÔKÐKs   Â"B; Â;*C%c                 óœ   — | j         }| j        }t          t          ||z   ¦  «        ¦  «        }d| j        t          |¦  «        | j        |fz  S )Nz{FSHP%d|%d|%d}%s)rJ   r   r   r   r   Úlenr   )r5   rU   r   rT   s       r"   Ú	to_stringzfshp.to_string¸   sG   € ØŒmˆØŒyˆÝ�Y t¨C¡xÑ0Ô0Ñ1Ô1ˆØ! T¤\µ3°t±9´9¸d¼kÈ4Ð$PÑPÐPr$   c                 ó¦   — t          |t          ¦  «        r|                     d¦  «        }t          | j        | j        || j        | j        ¬¦  «        S )Nzutf-8)ÚdigestÚsecretr   r   Úkeylen)r8   r	   rQ   r
   rC   r   r   rF   )r5   r\   s     r"   Ú_calc_checksumzfshp._calc_checksumÂ   sW   € Ý�f�gÑ&Ô&ð 	,Ø—]’] 7Ñ+Ô+ˆFõ ØÔ$Ø”9ØØ”;ØÔ%ðñ ô ð 	r$   )N)&Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnameÚsetting_kwdsrM   ÚPADDED_BASE64_CHARSÚchecksum_charsr   ÚidentÚdefault_salt_sizeÚmax_salt_sizeÚdefault_roundsÚ
min_roundsÚ
max_roundsÚrounds_costr+   r?   Údictr   r;   Úclassmethodr)   r   r4   r*   ÚpropertyrC   rF   ÚreÚcompileÚXrK   rV   rY   r^   Ú__classcell__)r/   s   @r"   r   r      sâ  ø€ € € € € ð#ð #ðR €DØ=€LØÔ+€NØˆAˆg‰JŒJ€Eð ÐØ€Mð
 €NØ€JØ€JØ€Kð €Oð ØØØð
ð 
€Mð �tØ/Ð/ Ð/Ñ/Ô/Ø6Ð6˜Y˜Y }Ñ5Ô5Ð6Ñ6Ô6ñ	7ñ
ô 
Ðð ðð ð ð ð ñ „[ðð €Gð
+ð +ð +ð +ð +ð +ð ðð ñ „[ðð ð3ð 3ñ „Xð3ð ð3ð 3ñ „Xð3ð �"”*˜Q˜Qð  ñ ô ð ”4ñô €Kð ðLð Lñ „[ðLð"Qð Qð Qðð ð ð ð ð ð r$   )rb   Úbase64r   r   rq   ÚloggingÚ	getLoggerr_   ÚlogÚpasslib.utilsr   Úpasslib.utils.handlersÚutilsÚhandlersrM   Úpasslib.utils.compatr   r   r   r	   Úpasslib.crypto.digestr
   Ú__all__Ú	HasRoundsÚ
HasRawSaltÚHasRawChecksumÚGenericHandlerr   r   r$   r"   ú<module>r„      s$  ððð ð (Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 	€	€	€	Ø €€€Ð'�gÔ'¨Ñ1Ô1�ð %Ð $Ð $Ð $Ð $Ð $Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #ð)ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )à (Ð (Ð (Ð (Ð (Ð (ð ð€ðuð uð uð uð uˆ2Œ<˜œ¨Ô(9¸2Ô;Lñ uô uð uð uð ur$   