
     h"                     `    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          Z/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/passlib/crypto/scrypt/_builtin.pyexecutezScryptEngine.execute2   s(     s1a||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    ic                 8     |            |           dz  z  S )N     )Xig1ig2s    r   
integerifyz)ScryptEngine.__init__.<locals>.integerifyU   s"    s1vv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C 66DI 
??!,S11JJ*****%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         U6&"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     =Hfd1XNNN y6Q;;T%[[FF JXX      #Ax<<    F 8VVAf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}}


T6"""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ITQ1q5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	 	 	 	 	 	 	 LL ]
Q!ee
6""V+AIIT&**Q---H-HIIIIIFD   FA	 !ee   {((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(L41a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*      2V2VTQ1q52V2V2V2V2V2Vr   )r&   iterr   r   )r0   sourcetargethalftmpsiterrQ   jns           r   r-   zScryptEngine.bmix   s    < !STTlV$hh2B!((L(L4U;K;K(L(L(L!L!LLF1R4L3+22V2VT#uEUEU2V2V2V+V+VVF46$r'>"SA	 $hhhhhhr   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#Lda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*      ==1a!e======r   )r   r   rW   )r0   rX   rY   Br[   s        r   r,   zScryptEngine._bmix_1   sx    233K##L#Ld1d6ll6K6K#L#L#LLLLssc==S!=====rss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   