
    g"                     X    S r SSKrSSKrSSKJr  SSKJr  SSKJr  S/r	 " S S\
5      rg)z<passlib.utils.scrypt._builtin -- scrypt() kdf in pure-python    N)izip)pbkdf2_hmac)salsa20ScryptEnginec                   j    \ rS rSrSrSrSrSrSrSr	Sr
SrSrSr\S 5       rS rS rS rS	 rS
 rSrg)r      z
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                 4    U " X4U5      R                  XU5      $ )z-create engine & run scrypt() hash calculation)run)clssecretsaltnrpkeylens          W/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/crypto/scrypt/_builtin.pyexecuteScryptEngine.execute2   s     1|f55    c                 
  ^^ Xl         X l        X0l        US-  U l        U R                  U-  U l        US-  =U l        nUS-  U l        [        R                  " S5      S:X  d   e[        R                  " S[        U5      -   S-   5      U l        US:X  a  U R                  U l        US::  a  [        R                  " S5      nO;US	::  d   e[        R                  " S5      m[        R                  " S
5      mUU4S jnXPl        g )N         I<   l    l    ic                 ,   > T" U 5      T" U 5      S-  -  $ )N     )Xig1ig2s    r   
integerify)ScryptEngine.__init__.<locals>.integerifyU   s    1v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__ScryptEngine.__init__:   s    q&!+#$6)!Vs#q(((!==s8})<s)BC 6DI 
?!,,S1J****%%c*C%%c*C-$r   c                   ^^^ U R                   n[        SXSUS9mU R                  mU R                  S:X  a	  T" T5      nO4U R                  mSR                  UUU4S j[        SUT5       5       5      n[        SXSUS9$ )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   >   >#    U  H  nT" TXT-    5      v   M     g 7fNr    ).0offsetinputsmixr&   s     r   	<genexpr>#ScryptEngine.run.<locals>.<genexpr>r   s*      <F U6"3455<s   r   )r'   r   r>   r   r&   joinrange)	r3   r   r   r   r'   outputr=   r>   r&   s	         @@@r   r
   ScryptEngine.run\   s     ==Hf1XN yy66Q;%[F JXX #Ax< F 8VAfMMr   c           	        ^^^ U R                   mU R                  nU R                  nU R                  m[	        UR                  U5      5      mUUU4S jn[	        U" 5       5      nUR                  nTS-
  nSnUT:  aC  U" T5      U-  n	[        S [        TU" U	5      5       5       5      n
T" U
T5        US-  nUT:  a  MC  UR                  " T6 $ )a3  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   j   >#    Sn U T:  a&  [        T5      nUv   T" UT5        U S-  n U T:  a  M%  g g 7f)Nr   r   )tuple)ilastr0   bufferr   s     r   vgenScryptEngine.smix.<locals>.vgen   s<     Aa%V}
T6"Q	 a%s   ,33r   r   c              3   .   #    U  H  u  pX-  v   M     g 7fr:   r    r;   abs      r   r?   $ScryptEngine.smix.<locals>.<genexpr>   s     I-HTQ15-H   )
r0   r.   r$   r   listunpack__getitem__rG   r   pack)r3   r=   r.   r$   rK   V
get_v_elemn_maskrH   jresultr0   rJ   r   s              @@@r   r>   ScryptEngine.smix}   s     yy&&__
FF k((/0	 L ]]
Q!e6"V+AIT&*Q--HIIF FA	 !e  ((r   c                     U R                   nUSS n[        U5      nSnXc:  aR  US-   n[        S [        XE5       5       5      =X&U& n[        S [        XE5       5       5      =X#U-   X7-   & nUnXc:  a  MQ  gg)aj  
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   .   #    U  H  u  pX-  v   M     g 7fr:   r    rN   s      r   r?   $ScryptEngine.bmix.<locals>.<genexpr>   s     (L;K41;KrR   c              3   .   #    U  H  u  pX-  v   M     g 7fr:   r    rN   s      r   r?   r`      s     2VEUTQ15EUrR   )r)   iterr   r   )r3   sourcetargethalftmpsiterrZ   jns           r   r0   ScryptEngine.bmix   s    < !!STlVh2B!((L4;K(L!LLFRL3+22VT#EU2V+VVF6$'"SA	 hr   c           	          USS n[        S [        U[        U5      5       5       5      =USS& n[        S [        XC5       5       5      USS& g)z0special bmix() method optimized for ``r=1`` caser^   Nc              3   .   #    U  H  u  pX-  v   M     g 7fr:   r    rN   s      r   r?   'ScryptEngine._bmix_1.<locals>.<genexpr>   s     #L6KdaAE6KrR   c              3   .   #    U  H  u  pX-  v   M     g 7fr:   r    rN   s      r   r?   rl      s     =aerR   )r   r   rb   )r3   rc   rd   Brf   s        r   r/   ScryptEngine._bmix_1   sM    23K##Ld1d6l6K#LLLsc=S==rsr   )
r0   r)   r(   r.   r$   r'   r   r   r   r&   )__name__
__module____qualname____firstlineno____doc__r   r   r   r&   r'   r(   r)   r.   r$   classmethodr   r4   r
   r>   r0   r/   __static_attributes__r    r   r   r   r      sj     	
A	A	A JHHMKJ
 6 6%DNB>)F&P>r   )rt   r1   r*   passlib.utils.compatr   passlib.crypto.digestr   passlib.crypto.scrypt._salsar   __all__objectr   r    r   r   <module>r|      s3    B
   % - 0 
X>6 X>r   