§
    HŠtjB7  ã            
       óN  — 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j!        ej"        ej#        ej$        ¦  «        Z	dS )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                   ód  ‡ — 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é   Nc           	      óÌ  •—  t          t          | ¦  «        j        di |¤Ž}|�Xt          |t          j        ¦  «        rt          |¦  «        }|                     ||                     d¦  «        ¬¦  «        |_	        	 t          j        d| j        z  | j	        | j        ¦  «         n># t          $ r1}t          t          dt!          |¦  «        z   ¦  «        ¦  «        ‚d }~ww xY w|S )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        €úU/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/handlers/scrypt.pyr    zscrypt.using›   sí   ø€ à)••v˜sÑ#Ô#Ô)Ð1Ð1¨DÐ1Ð1ˆØÐ!Ý˜*¥bÔ&<Ñ=Ô=ð -Ý  ™_œ_�
Ø &× 7Ò 7¸
ÈDÏHÊHÐU^ÑL_ÔL_Ð 7Ñ `Ô `ˆFÔð	bÝÔ˜Q #Ô"4Ñ4°c´nÀcÄoÑVÔVÐVÐVøÝð 	bð 	bð 	bÝ ¥Ð,TÕWZÐ[^ÑW_ÔW_Ñ,_Ñ!`Ô!`ÑaÔaÐaøøøøð	bøøøð ˆs   Á=(B& Â&
C!Â0,CÃC!c                 ó8   —  | di |                       |¦  «        ¤ŽS )Nr   )Úparse)r,   Úhashs     r1   Úfrom_stringzscrypt.from_string¯   s"   € àˆsÐ%Ð%�S—Y’Y˜t‘_”_Ð%Ð%Ð%ó    c                 óâ   — |                       |¦  «        \  }}t          | d|                     t          ¦  «        z  d ¦  «        }|r ||¦  «        S t          j                             | ¦  «        ‚)Nz_parse_%s_string)Ú_parse_identÚgetattrÚstripÚ_UDOLLARr"   ÚexcÚInvalidHashError)r,   r4   r   ÚsuffixÚfuncs        r1   r3   zscrypt.parse³   sh   € à×(Ò(¨Ñ.Ô.‰ˆˆvÝ�sÐ.°·²½XÑ1FÔ1FÑFÈÑMÔMˆØð 	/Ø�4˜‘<”<Ðå”&×)Ò)¨#Ñ.Ô.Ð.r6   c                 ó8  — |                      d¦  «        }t          |¦  «        dk    r|\  }}}n;t          |¦  «        dk    r|\  }}d }n t          j                             | d¦  «        ‚|                      d¦  «        }t          |¦  «        dk    rL|\  }}}|                     d¦  «        sJ ‚|                     d¦  «        sJ ‚|                     d¦  «        sJ ‚n t          j                             | d	¦  «        ‚t          t          t          |dd …         ¦  «        t          |dd …         ¦  «        t          |dd …         ¦  «        t          | 
                    d
¦  «        ¦  «        |r"t          | 
                    d
¦  «        ¦  «        n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ŒZ˜1Š_ˆ_Ø ‰LˆF�DØˆFˆFå”&×+Ò+¨CÐ1AÑBÔBÐBð —’˜SÑ!Ô!ˆÝˆu‰:Œ:˜Š?ˆ?Ø$ÑˆD�$˜Ø—?’? 5Ñ)Ô)Ð)Ð)Ð)Ø—?’? 4Ñ(Ô(Ð(Ð(Ð(Ø—?’? 4Ñ(Ô(Ð(Ð(Ð(Ð(å”&×+Ò+¨CÐ1KÑLÔLÐLåÝÝ�t˜A˜B˜B”x‘=”=Ý˜4   œ8‘}”}Ý˜D   œH™œÝ˜TŸ[š[¨Ñ1Ô1Ñ2Ô2Ø<BÐL•[ §¢¨wÑ!7Ô!7Ñ8Ô8Ð8Èðñ ô ð 	r6   c           
      óf  — |                      d¦  «                             d¦  «        }t          |¦  «        dk    r|\  }}n8t          |¦  «        dk    r|\  }d }nt          j                             ¦   «         ‚t          |¦  «        dk     r t          j                             | d¦  «        ‚t          t          t          j	        |d d…         ¦  «        t          j
        |dd…         ¦  «        t          j
        |dd…         ¦  «        |dd …         |rt          j        |¦  «        n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Ô2ˆÝˆu‰:Œ:˜Š?ˆ?Ø"‰NˆF�F�FÝ�‰ZŒZ˜1Š_ˆ_Ø‰GˆFØˆFˆFå”&×+Ò+Ñ-Ô-Ð-õ ˆv‰;Œ;˜ÒÐÝ”&×+Ò+¨CÐ1IÑJÔJÐJÝÝÝ”? 6¨"¨1¨"¤:Ñ.Ô.ÝÔ'¨¨q°¨s¬Ñ4Ô4ÝÔ(¨°°"°¬Ñ6Ô6Ø˜˜˜”Ø17ÐA•SÔ% fÑ-Ô-Ð-¸Tð
ñ 
ô 
ð 	
r6   c                 ó’  — | j         }|t          k    rWd| j        | j        | j        t          t          | j        ¦  «        ¦  «        t          t          | j        ¦  «        ¦  «        fz  S |t          k    sJ ‚| j        }	 | 
                    d¦  «         n*# t          $ r t          t          d¦  «        ¦  «        ‚w xY wt          d                     dt          j        | j        ¦  «        t          j        | j        ¦  «        t          j        | j        ¦  «        | j        dt          j        | j        ¦  «        g¦  «        ¦  «        S )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Ô4Ñ5Ô5Ý�k¨$¬-Ñ8Ô8Ñ9Ô9ð6ñ ð ð �GÒ#Ð#Ð#Ð#Ø”9ˆDðlØ—’˜GÑ$Ô$Ð$Ð$øÝ%ð lð lð lÝ$Õ%8Ð9iÑ%jÔ%jÑkÔkÐkðløøøå  §¢ØÝ” ¤Ñ,Ô,ÝÔ  ¤Ñ1Ô1ÝÔ  Ô!1Ñ2Ô2Ø”	ØÝÔ  ¤Ñ/Ô/ð+ñ "ô "ñ ô ð s   Á?B Â'B<c                 óÌ   •—  t          t          | ¦  «        j        di |¤Ž |€&t          j        | | j        | j        d¬¦  «        sJ ‚d S |                      |¦  «        | _        d S )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Ø3?ðAñ Aô Að Að Að Að Að Að #×3Ò3°JÑ?Ô?ˆDŒOˆOˆOr6   Fc                 ó4   — 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                 ó”   •— 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Ò1Ñ3Ô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   Úanyc                 ól   — 	 |                       |d¬¦  «         dS # t          j        j        $ r Y dS w xY w)NT©ÚdryrunF)Úset_backendr"   r<   ÚMissingBackendError)r,   Únames     r1   Úhas_backendzscrypt.has_backendX  sI   € ð	Ø�OŠO˜D¨ˆOÑ.Ô.Ð.Ø�4øÝŒvÔ)ð 	ð 	ð 	Ø�5�5ð	øøøs   ‚ ›3²3c                 ó2   — t          j        ||¬¦  «         d S )Nr|   )r'   Ú_set_backend)r,   r€   r}   s      r1   r~   zscrypt.set_backend`  s   € åÔ˜T¨&Ð1Ñ1Ô1Ð1Ð1Ð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  sO   € Ý˜&¨Ð1Ñ1Ô1ˆÝŒ~˜f d¤i°A¸¼Ñ4DÈÌØ $Ô 0¸Ô9KðMñ Mô Mð 	Mr6   c                 ó‚   •— | j         t          | ¦  «        j         k    rdS  t          t          | ¦  «        j        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  sC   ø€ ð
 Œ?�d 4™jœjÔ3Ò3Ð3Ø�4Ø5�u•V˜TÑ"Ô"Ô5Ð=Ð=¸Ð=Ð=Ð=r6   rq   )F)rz   )rz   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   !   s'  ø€ € € € € ð>ð >ðN €DØX€Lð €Mð
 !€MØ  'Ð*€Lð
 ÐØ€Mð €NØ€JØ€JØ€Kð €Kð €Jð ðð ð ð ð ñ „[ðð& ð&ð &ñ „[ð&ð ð/ð /ñ „[ð/ð& ðð ñ „[ððZ ð
ð 
ñ „[ð
ð:ð ð ð<@ð @ð @ð @ð @ð @ð ð\ð \ð \ñ „[ð\ðð ð ð ð ð ð&ð &ñ „]ð&ð ðð ñ „[ðð ðð ð ñ „[ðð ð2ð 2ð 2ñ „[ð2ðMð Mð 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°      sd  ðØ 5Ð 5ð 7Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6à €€€Ð'�gÔ'¨Ñ1Ô1�ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ -Ð -Ð -Ð -Ð -Ð -Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #ð ð€ð ˆq�‰}Œ}€Ø
ˆ!ˆE‰(Œ(€àˆ1ˆS‰6Œ6€ð
V>ð V>ð V>ð V>ð V>ˆRÔ  "¤,°´¸rÔ?PÐRTÔRbØÔñV>ô V>ð V>ð V>ð V>r6   