ó ö 5Xc@sqdZddlZddlZddlmZddlmZddlmZdgZ de fd„ƒYZ dS(s<passlib.utils.scrypt._builtin -- scrypt() kdf in pure-pythoniÿÿÿÿN(tizip(t pbkdf2_hmac(tsalsa20t ScryptEnginecBs€eZdZdZdZdZdZdZdZdZ dZ dZ 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( NiiitBS(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_lentstructtStructtstrt bmix_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)`` tsha256troundsiR tc3s&|]}ˆˆ||ˆ!ƒVqdS(N((t.0toffset(tinputtsmixR(sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys ssi(RRR'R Rtjointrange(RRRR Rtoutput((R&R'RsB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pyR\s   c sâ|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 ­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 äscss|]\}}||AVqdS(N((R$R0R1((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys å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 ëscss|]\}}||AVqdS(N((R$R0R1((sB/usr/lib/python2.7/site-packages/passlib/crypto/scrypt/_builtin.pys ì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 RRRRtNoneRRt classmethodR 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.pyts