§
    HŠtjÎ"  ã                   ó`   — d Z ddlZddlZddlmZ ddlmZ ddlmZ dgZ	 G d„ de
¦  «        ZdS )z<passlib.utils.scrypt._builtin -- scrypt() kdf in pure-pythoné    N)Úizip)Úpbkdf2_hmac)Úsalsa20ÚScryptEnginec                   ój   — e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd	„ ZdS )
r   a  
    helper class used to run scrypt kdf, see scrypt() for frontend

    .. warning::
        this class does NO validation of the input ranges or types.

        it's not intended to be used directly,
        but only as a backend for :func:`passlib.utils.scrypt.scrypt()`.
    r   Nc                 óF   —  | |||¦  «                              |||¦  «        S )z-create engine & run scrypt() hash calculation)Úrun)ÚclsÚsecretÚsaltÚnÚrÚpÚkeylens          ú\/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/crypto/scrypt/_builtin.pyÚexecutezScryptEngine.execute2   s(   € ð ˆs�1�a˜‰|Œ|×Ò ¨¨fÑ5Ô5Ð5ó    c                 óò  ‡‡— || _         || _        || _        |dz  | _        | j        |z  | _        |dz  x| _        }|dz  | _        t          j        d¦  «        dk    sJ ‚t          j	        dt          |¦  «        z   dz   ¦  «        | _        |dk    r| j        | _        |dk    rt          j        d¦  «        }n6|d	k    sJ ‚t          j        d¦  «        Št          j        d
¦  «        Šˆˆfd„}|| _        d S )Né   é   é   ÚIú<é   l   ÿÿ éðÿÿÿl   ÿÿÿÿ iïÿÿÿc                 ó8   •—  ‰| ¦  «         ‰| ¦  «        dz  z  S )Né    © )ÚXÚig1Úig2s    €€r   Ú
integerifyz)ScryptEngine.__init__.<locals>.integerifyU   s"   ø€ Ø�s˜1‘v”v   Q¡¤¨¡Ñ,Ð,r   )r   r   r   Ú
smix_bytesÚiv_bytesÚbmix_lenÚbmix_half_lenÚstructÚcalcsizeÚStructÚstrÚbmix_structÚ_bmix_1ÚbmixÚoperatorÚ
itemgetterr"   )Úselfr   r   r   r%   r"   r    r!   s         @@r   Ú__init__zScryptEngine.__init__:   s  øø€ àˆŒØˆŒØˆŒØ˜q™&ˆŒØœ¨!Ñ+ˆŒØ#$¨¡6Ð)ˆŒ˜Ø !™VˆÔÝŒ˜sÑ#Ô# qÒ(Ð(Ð(Ð(Ý!œ=¨­s°8©}¬}Ñ)<¸sÑ)BÑCÔCˆÔð �Š6ˆ6ØœˆDŒIð �
Š?ˆ?Ý!Ô,¨SÑ1Ô1ˆJˆJàÐ*Ò*Ð*Ð*Ð*ÝÔ% cÑ*Ô*ˆCÝÔ% cÑ*Ô*ˆCð-ð -ð -ð -ð -ð -à$ˆŒˆˆr   c                 ó  ‡‡‡— | j         }t          d||d|¬¦  «        Š| j        Š| j        dk    r ‰‰¦  «        }n9| j        Šd                     ˆˆˆfd„t          d|‰¦  «        D ¦   «         ¦  «        }t          d||d|¬¦  «        S )z®
        run scrypt kdf for specified secret, salt, and keylen

        .. note::

            * time cost is ``O(n * r * p)``
            * mem cost is ``O(n * r)``
        Úsha256r   )Úroundsr   r   c              3   óD   •K  — | ]} ‰‰||‰z   …         ¦  «        V — Œd S ©Nr   )Ú.0ÚoffsetÚinputÚsmixr#   s     €€€r   ú	<genexpr>z#ScryptEngine.run.<locals>.<genexpr>r   sP   øè è € ð ð àð ��U˜6 &¨Ñ"3Ð3Ô4Ñ5Ô5ðð ð ð ð ð r   r   )r$   r   r:   r   r#   ÚjoinÚrange)	r0   r   r   r   r$   Úoutputr9   r:   r#   s	         @@@r   r	   zScryptEngine.run\   s¼   øøø€ ð ”=ˆÝ˜H f¨d¸1ÀXÐNÑNÔNˆð ŒyˆØŒ6�QŠ;ˆ;Ø�T˜%‘[”[ˆFˆFð œˆJØ—X’Xð ð ð ð ð ð å# A x°Ñ<Ô<ðñ ô ñ ô ˆFõ ˜8 V¨V¸AÀfÐMÑMÔMÐMr   c           	      ó¦  ‡‡‡— | j         Š| j        }| j        }| j        Št	          |                     |¦  «        ¦  «        Šˆˆˆfd„}t	           |¦   «         ¦  «        }|j        }‰dz
  }d}|‰k     rU |‰¦  «        |z  }	t          d„ t          ‰ ||	¦  «        ¦  «        D ¦   «         ¦  «        }
 ‰|
‰¦  «         |dz  }|‰k     °U |j	        ‰Ž S )as  run SCrypt smix function on a single input block

        :arg input:
            byte string containing input data.
            interpreted as 32*r little endian 4 byte integers.

        :returns:
            byte string containing output data
            derived by mixing input using n & r parameters.

        .. note:: time & mem cost are both ``O(n * r)``
        c               3   ót   •K  — d} | ‰k     r,t          ‰¦  «        }|V —  ‰|‰¦  «         | dz  } | ‰k     °*d S d S )Nr   r   )Útuple)ÚiÚlastr-   Úbufferr   s     €€€r   ÚvgenzScryptEngine.smix.<locals>.vgen›   sW   øè è € ØˆAØ�a’%�%Ý˜V‘}”}�Ø�
�
�
Ø��T˜6Ñ"Ô"Ð"Ø�Q‘�ð	 �a’%�%�%�%�%�%r   r   r   c              3   ó&   K  — | ]\  }}||z  V — Œd S r6   r   ©r7   ÚaÚbs      r   r;   z$ScryptEngine.smix.<locals>.<genexpr>­   s*   è è € ÐIÐI¡T Q¨˜1˜q™5ÐIÐIÐIÐIÐIÐIr   )
r-   r+   r"   r   ÚlistÚunpackÚ__getitem__rA   r   Úpack)r0   r9   r+   r"   rE   ÚVÚ
get_v_elemÚn_maskrB   ÚjÚresultr-   rD   r   s              @@@r   r:   zScryptEngine.smix}   s  øøø€ ð ŒyˆØÔ&ˆØ”_ˆ
ØŒFˆõ �k×(Ò(¨Ñ/Ô/Ñ0Ô0ˆð	ð 	ð 	ð 	ð 	ð 	ð 	õ ��‘”‰LŒLˆð ”]ˆ
Ø�Q‘ˆØˆØ�!ŠeˆeØ�
˜6Ñ"Ô" VÑ+ˆAÝÐIÐI­T°&¸*¸*ÀQ¹-¼-Ñ-HÔ-HÐIÑIÔIÑIÔIˆFØˆD�˜Ñ Ô Ð Ø�‰FˆAð	 �!Šeˆeð   ˆ{Ô Ð(Ð(r   c                 ó8  — | j         }|dd…         }t          |¦  «        }d}||k     rq|dz   }t          d„ t          ||¦  «        D ¦   «         ¦  «        x|||…<   }t          d„ t          ||¦  «        D ¦   «         ¦  «        x|||z   ||z   …<   }|}||k     °odS dS )aú  
        block mixing function used by smix()
        uses salsa20/8 core to mix block contents.

        :arg source:
            source to read from.
            should be list of 32*r 4-byte integers
            (2*r salsa20 blocks).

        :arg target:
            target to write to.
            should be list with same size as source.
            the existing value of this buffer is ignored.

        .. warning::

            this operates *in place* on target,
            so source & target should NOT be same list.

        .. note::

            * time cost is ``O(r)`` -- loops 16*r times, salsa20() has ``O(1)`` cost.

            * memory cost is ``O(1)`` -- salsa20() uses 16 x uint4,
              all other operations done in-place.
        r   Nr   é   c              3   ó&   K  — | ]\  }}||z  V — Œd S r6   r   rG   s      r   r;   z$ScryptEngine.bmix.<locals>.<genexpr>ä   s*   è è € Ð(LÐ(L±4°1°a¨¨Q©Ð(LÐ(LÐ(LÐ(LÐ(LÐ(Lr   c              3   ó&   K  — | ]\  }}||z  V — Œd S r6   r   rG   s      r   r;   z$ScryptEngine.bmix.<locals>.<genexpr>å   s*   è è € Ð2VÐ2V¹T¸QÀ°1°q±5Ð2VÐ2VÐ2VÐ2VÐ2VÐ2Vr   )r&   Úiterr   r   )r0   ÚsourceÚtargetÚhalfÚtmpÚsiterrQ   Újns           r   r-   zScryptEngine.bmixÀ   sÂ   € ð< Ô!ˆØ�S�T�TŒlˆÝ�V‘”ˆØˆØ�$ŠhˆhØ�2‘ˆBÝ!(Ð(LÐ(L½4ÀÀUÑ;KÔ;KÐ(LÑ(LÔ(LÑ!LÔ!LÐLˆF�1�R�4‰L˜3Ý+2Ð2VÐ2VÅTÈ#ÈuÑEUÔEUÐ2VÑ2VÔ2VÑ+VÔ+VÐVˆF�4˜‘6˜$˜r™'�>Ñ" SØˆAð	 �$Šhˆhˆhˆhˆhˆhr   c           	      óè   — |dd…         }t          d„ t          |t          |¦  «        ¦  «        D ¦   «         ¦  «        x|dd…<   }t          d„ t          ||¦  «        D ¦   «         ¦  «        |dd…<   dS )z0special bmix() method optimized for ``r=1`` caserT   Nc              3   ó&   K  — | ]\  }}||z  V — Œd S r6   r   rG   s      r   r;   z'ScryptEngine._bmix_1.<locals>.<genexpr>ë   s*   è è € Ð#LÐ#L©d¨a° A¨¡EÐ#LÐ#LÐ#LÐ#LÐ#LÐ#Lr   c              3   ó&   K  — | ]\  }}||z  V — Œd S r6   r   rG   s      r   r;   z'ScryptEngine._bmix_1.<locals>.<genexpr>ì   s*   è è € Ð=Ð=©¨¨1˜a !™eÐ=Ð=Ð=Ð=Ð=Ð=r   )r   r   rW   )r0   rX   rY   ÚBr[   s        r   r,   zScryptEngine._bmix_1è   sx   € à�2�3�3ŒKˆÝ#Ð#LÐ#Lµd¸1½dÀ6¹l¼lÑ6KÔ6KÐ#LÑ#LÔ#LÑLÔLÐLˆˆs�ˆs‰�cÝÐ=Ð=µ°S¸!±´Ð=Ñ=Ô=Ñ=Ô=ˆˆrˆsˆs‰ˆˆr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r#   r$   r%   r&   r+   r"   Úclassmethodr   r1   r	   r:   r-   r,   r   r   r   r   r      s¼   € € € € € ðð ð 	
€AØ	€AØ	€Að €JØ€HØ€HØ€MØ€KØ€Jð
 ð6ð 6ñ „[ð6ð%ð %ð %ðDNð Nð NðB>)ð >)ð >)ðF&ð &ð &ðP>ð >ð >ð >ð >r   )re   r.   r'   Úpasslib.utils.compatr   Úpasslib.crypto.digestr   Úpasslib.crypto.scrypt._salsar   Ú__all__Úobjectr   r   r   r   ú<module>rl      sŸ   ðØ BÐ Bð
 €€€Ø €€€à %Ð %Ð %Ð %Ð %Ð %Ø -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ð ð
€ðX>ð X>ð X>ð X>ð X>�6ñ X>ô X>ð X>ð X>ð X>r   