Current File : //usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyo
�
�
5Xc@sqdZddlZddlZddlmZddlmZddlmZdgZ	de
fd��YZdS(s<passlib.utils.scrypt._builtin -- scrypt() kdf in pure-pythoni����N(tizip(tpbkdf2_hmac(tsalsa20tScryptEnginecBs�eZdZdZdZdZdZdZdZdZ	dZdZe
d��Zd�Zd�Zd�Zd�Zd�ZRS(	s
    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()`.
    icCs||||�j|||�S(s-create engine & run scrypt() hash calculation(trun(tclstsecrettsalttntrtptkeylen((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pytexecute2scs�||_||_||_|d>|_|j||_|d>|_}|d>|_tjdt	|�d�|_
|dkr�|j|_n|dkr�t
jd�}n0t
jd��t
jd	����fd
�}||_dS(Niiit<tIiI����i�i��cs�|��|�d>BS(Ni ((tX(tig1tig2(sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyt
integerifyUs(RR	R
t
smix_bytestiv_bytestbmix_lent
bmix_half_lentstructtStructtstrtbmix_structt_bmix_1tbmixtoperatort
itemgetterR(tselfRR	R
RR((RRsB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyt__init__:s 			

 cs�|j}td||ddd|��|j�|jdkrN���}n:|j�dj���fd�td|��D��}td||ddd|�S(s�
        run scrypt kdf for specified secret, salt, and keylen

        .. note::

            * time cost is ``O(n * r * p)``
            * mem cost is ``O(n * r)``
        tsha256troundsiRtc3s&|]}��||�!�VqdS(N((t.0toffset(tinputtsmixR(sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys	<genexpr>ssi(RRR'R
Rtjointrange(RRRRRtoutput((R&R'RsB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyR\s
			cs�|j�|j}|j}|j�t|j|������fd�}t|��}|j}�d}d}x\|�kr�|��|@}	td�t�||	��D��}
�|
��|d7}qyW|j	��S(ssrun 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)``
        c3sEd}x8|�kr@t��}|V�|��|d7}q	WdS(Nii(ttuple(titlast(RtbufferR(sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pytvgen�s
iicss|]\}}||AVqdS(N((R$tatb((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys	<genexpr>�s(
RRRRtlisttunpackt__getitem__R+Rtpack(RR&RRR/tVt
get_v_elemtn_maskR,tjtresult((RR.RsB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyR'}s 						
%
cCs�|j}|d}t|�}d}x|||kr�|d}td�t||�D��|||+}td�t||�D��|||||+}|}q(WdS(s�
        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.
        i�iicss|]\}}||AVqdS(N((R$R0R1((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys	<genexpr>�scss|]\}}||AVqdS(N((R$R0R1((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys	<genexpr>�sN(RtiterRR(RtsourcettargetthalfttmptsiterR9tjn((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyR�s	

*2cCs^|d}td�t|t|��D��|d*}td�t||�D��|d)dS(s0special bmix() method optimized for ``r=1`` caseicss|]\}}||AVqdS(N((R$R0R1((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys	<genexpr>�scss|]\}}||AVqdS(N((R$R0R1((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys	<genexpr>�sN(RRR;(RR<R=tBR?((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyR�s
-N(t__name__t
__module__t__doc__RR	R
RRRRtNoneRRtclassmethodRR RR'RR(((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyRs 		"	!	C	((RERRtpasslib.utils.compatRtpasslib.crypto.digestRtpasslib.crypto.scrypt._salsaRt__all__tobjectR(((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyt<module>s