a fWc"@sRdZddlZddlZddlmZddlmZddlmZdgZ Gddde Z dS)z|_|j||_|d>|_}|d>|_tddksRJt dt |d|_ |dkrz|j |_ |dkrtd}n.|d ksJtdtd fd d }||_dS) NI<llics||d>BS)N r)XZig1Zig2rr integerifyUsz)ScryptEngine.__init__..integerify)r r r smix_bytesiv_bytesbmix_len bmix_half_lenstructcalcsizeStructstr bmix_struct_bmix_1bmixoperator itemgetterr)selfr r r rrrrr__init__:s$       zScryptEngine.__init__csn|j}td||d|d|j|jdkr2}n*|jdfddtd|D}td||d|dS)z run scrypt kdf for specified secret, salt, and keylen .. note:: * time cost is ``O(n * r * p)`` * mem cost is ``O(n * r)`` Zsha256r)roundsr c3s"|]}||VqdSNr).0offsetinputsmixrrr rsz#ScryptEngine.run..r)rrr2r rjoinrange)r)rr r routputrr0rr\s    zScryptEngine.runc s|j|j}|j}|jt||fdd}t|}|j}d}d}|kr||@} tddt|| D} | |d7}qR|j S)asrun 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)`` c3s2d}|kr.t}|V||d7}qdS)Nrr)tuple)iZlastr&bufferr rrvgens  zScryptEngine.smix..vgenrrcss|]\}}||AVqdSr-rr.abrrrr3r,z$ScryptEngine.smix..) r&r$rr listunpack __getitem__r7rpack) r)r1r$rr;VZ get_v_elemZn_maskr8jresultrr9rr2}s      zScryptEngine.smixcCs|j}|dd}t|}d}||kr|d}tddt||D|||<}tddt||D|||||<}|}qdS)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. rNrcss|]\}}||AVqdSr-rr<rrrr3r,z$ScryptEngine.bmix..css|]\}}||AVqdSr-rr<rrrr3r,)riterrr)r)sourcetargetZhalftmpZsiterrDZjnrrrr&s $,zScryptEngine.bmixcCsX|dd}tddt|t|D|dd<}tddt||D|dd<dS)z0special bmix() method optimized for ``r=1`` caserFNcss|]\}}||AVqdSr-rr<rrrr3r,z'ScryptEngine._bmix_1..css|]\}}||AVqdSr-rr<rrrr3r,)rrrG)r)rHrIBrJrrrr%s (zScryptEngine._bmix_1)__name__ __module__ __qualname____doc__r r r rrrrr$r classmethodrr*rr2r&r%rrrrrs" "!C() rOr'r Zpasslib.utils.compatrZpasslib.crypto.digestrZpasslib.crypto.scrypt._salsar__all__objectrrrrrs