
     h"                     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          `/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/passlib/crypto/scrypt/_builtin.pyexecutezScryptEngine.execute2   s!     1a|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    ic                 ,     |        |       dz  z  S )N     )Xig1ig2s    r   
integerifyz)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__zScryptEngine.__init__:   s    q&!+#$6)!Vs#q((!==s8})<s)BC 6DI 
?!,,S1J % ***%%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*       U6&"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     ==Hfd1XN yy66Q;%[F JXX #Ax< F 8VVAf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}
T6"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     ITQ1q5I   )
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     yy&&__
FF k((/0	 L ]]
Q!e6"V+AIT&*Q--HIIF FA	 !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     (L41aQ(LrJ   c              3   ,   K   | ]  \  }}||z    y wr6   r   rG   s      r   r;   z$ScryptEngine.bmix.<locals>.<genexpr>   s     2VTQ1q52VrJ   )r&   iterr   r   )r0   sourcetargethalftmpsiterrR   jns           r   r-   zScryptEngine.bmix   s    < !!STlV$h2B!((L4U;K(L!LLF1RL3+22VT#uEU2V+VVF4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     #LdaAE#LrJ   c              3   ,   K   | ]  \  }}||z    y wr6   r   rG   s      r   r;   z'ScryptEngine._bmix_1.<locals>.<genexpr>   s     =1a!e=rJ   )r   r   rX   )r0   rY   rZ   Br\   s        r   r,   zScryptEngine._bmix_1   sO    23K##Ld1d6l6K#LLLsc=S!==rs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   