Ë
    àU.jÎ"  ã                   óX   — 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y)z<passlib.utils.scrypt._builtin -- scrypt() kdf in pure-pythoné    N)Úizip)Úpbkdf2_hmac)Úsalsa20ÚScryptEnginec                   ób   — 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y)
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                 ó8   —  | |||«      j                  |||«      S )z-create engine & run scrypt() hash calculation)Úrun)ÚclsÚsecretÚsaltÚnÚrÚpÚkeylens          ú`C:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\passlib/crypto/scrypt/_builtin.pyÚexecutezScryptEngine.execute2   s!   € ñ �1�a˜‹|×Ñ ¨¨fÓ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«      }|| _        y |d	k  sJ ‚t        j                  d«      Št        j                  d
«      Šˆˆfd„}|| _        y )Né   é   é   ÚIÚ<é   l   ÿÿ éðÿÿÿl   ÿÿÿÿ iïÿÿÿc                 ó,   •—  ‰| «       ‰| «      dz  z  S )Né    © )ÚXÚig1Úig2s    €€r   Ú
integerifyz)ScryptEngine.__init__.<locals>.integerifyU   s   ø€ Ù˜1“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ˆÔð �Š6ØŸ™ˆDŒIð �
Š?Ü!×,Ñ,¨SÓ1ˆJð %ˆ�ð Ð*Ò*Ð*Ð*Ü×%Ñ% cÓ*ˆCÜ×%Ñ% cÓ*ˆCõ-à$ˆ�r   c                 ó  ‡‡‡— | j                   }t        d||d|¬«      Š| j                  Š| j                  dk(  r	 ‰‰«      }n3| j                  Šdj                  ˆˆˆ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   ó:   •K  — | ]  } ‰‰||‰z    «      –— Œ y ­w©Nr   )Ú.0ÚoffsetÚinputÚsmixr#   s     €€€r   Ú	<genexpr>z#ScryptEngine.run.<locals>.<genexpr>r   s*   øè ø€ ð á<�Fñ �U˜6 &¨Ñ"3Ð4×5Ù<ùs   ƒ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ˆð �y‰yˆØ�6‰6�QŠ;Ù˜%“[‰Fð Ÿ™ˆJØ—X‘Xõ ä# A x°Ô<óó ˆFô ˜8 V¨V¸AÀfÔMÐMr   c           	      óš  ‡‡‡— | j                   Š| j                  }| j                  }| j                  Št	        |j                  |«      «      Šˆˆˆfd„}t	         |«       «      }|j                  }‰dz
  }d}|‰k  rA |‰«      |z  }	t        d„ t        ‰ ||	«      «      D «       «      }
 ‰|
‰«       |dz  }|‰k  rŒA |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   ód   •K  — d} | ‰k  r$t        ‰«      }|–—  ‰|‰«       | dz  } | ‰k  rŒ#y y ­w)Nr   r   )Útuple)ÚiÚlastr-   Úbufferr   s     €€€r   ÚvgenzScryptEngine.smix.<locals>.vgen›   s=   øè ø€ ØˆAØ�a’%Ü˜V“}�Ø’
Ù�T˜6Ô"Ø�Q‘�ð	 �a•%ùs   ƒ*0®0r   r   c              3   ó,   K  — | ]  \  }}||z  –— Œ y ­wr6   r   ©r7   ÚaÚbs      r   r;   z$ScryptEngine.smix.<locals>.<genexpr>­   s   è ø€ ÐIÑ-H¡T Q¨˜1˜q�5Ñ-Hùó   ‚)
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‰yˆØ×&Ñ&ˆØ—_‘_ˆ
Ø�F‰Fˆô �k×(Ñ(¨Ó/Ó0ˆö	ô ‘“‹Lˆð —]‘]ˆ
Ø�Q‘ˆØˆØ�!ŠeÙ˜6Ó" VÑ+ˆAÜÑI¬T°&¹*ÀQ»-Ô-HÓIÓIˆFÙ�˜Ô Ø�‰FˆAð	 �!‹eð   ˆ{×Ñ Ð(Ð(r   c                 óö   — | j                   }|dd }t        |«      }d}||k  rV|dz   }t        d„ t        ||«      D «       «      x||| }t        d„ t        ||«      D «       «      x|||z   ||z    }|}||k  rŒUyy)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  –— Œ y ­wr6   r   rG   s      r   r;   z$ScryptEngine.bmix.<locals>.<genexpr>ä   s   è ø€ Ð(LÑ;K±4°1°a¨¨Q­Ñ;KùrJ   c              3   ó,   K  — | ]  \  }}||z  –— Œ y ­wr6   r   rG   s      r   r;   z$ScryptEngine.bmix.<locals>.<genexpr>å   s   è ø€ Ð2VÑEU¹T¸QÀ°1°qµ5ÑEUùrJ   )r&   Úiterr   r   )r0   ÚsourceÚtargetÚhalfÚtmpÚsiterrR   Újns           r   r-   zScryptEngine.bmixÀ   s“   € ð< ×!Ñ!ˆØ�S�TˆlˆÜ�V“ˆØˆØ�$ŠhØ�2‘ˆBÜ!(Ñ(L¼4ÀÀUÔ;KÓ(LÓ!LÐLˆF�1�RˆL˜3Ü+2Ñ2VÄTÈ#ÈuÔEUÓ2VÓ+VÐVˆF�4˜‘6˜$˜r™'Ð" SØˆAð	 �$�hr   c           	      ó    — |dd }t        d„ t        |t        |«      «      D «       «      x|dd }t        d„ t        ||«      D «       «      |dd y)z0special bmix() method optimized for ``r=1`` caserU   Nc              3   ó,   K  — | ]  \  }}||z  –— Œ y ­wr6   r   rG   s      r   r;   z'ScryptEngine._bmix_1.<locals>.<genexpr>ë   s   è ø€ Ð#LÑ6K©d¨a° A¨¥EÑ6KùrJ   c              3   ó,   K  — | ]  \  }}||z  –— Œ y ­wr6   r   rG   s      r   r;   z'ScryptEngine._bmix_1.<locals>.<genexpr>ì   s   è ø€ Ð=±©¨¨1˜a !�e±ùrJ   )r   r   rX   )r0   rY   rZ   ÚBr\   s        r   r,   zScryptEngine._bmix_1è   sO   € à�2�3ˆKˆÜ#Ñ#L´d¸1¼dÀ6»lÔ6KÓ#LÓLÐLˆˆs�ˆ�cÜÑ=´°S¸!´Ó=Ó=ˆˆrˆ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      sj   „ ñð 	
€AØ	€AØ	€Að €JØ€HØ€HØ€MØ€KØ€Jð
 ñ6ó ð6ò%òDNòB>)òF&óP>r   )rf   r.   r'   Úpasslib.utils.compatr   Úpasslib.crypto.digestr   Úpasslib.crypto.scrypt._salsar   Ú__all__Úobjectr   r   r   r   Ú<module>rm      s3   ðÙ Bó
 Û å %Ý -Ý 0ð ð
€ôX>�6õ X>r   