a fWc"@sRdZddlZddlZddlmZddlmZddlmZdgZ Gddde Z dS)z|_|j||_|d>|_}|d>|_tdt |d|_ |dkrh|j |_ |dkr|t d}n"t dt d fd d }||_dS) N<Ilics||d>BS)N r)XZig1Zig2rr integerifyUsz)ScryptEngine.__init__..integerify)r r r smix_bytesiv_bytesbmix_len bmix_half_lenstructStructstr 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)rrr1r rjoinrange)r(rr r routputrr/rr\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-abrrrr2r+z$ScryptEngine.smix..) r%r#rr listunpack __getitem__r6rpack) r(r0r#rr:VZ get_v_elemZn_maskr7jresultrr8rr1}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;rrrr2r+z$ScryptEngine.bmix..css|]\}}||AVqdSr,rr;rrrr2r+)riterrr)r(sourcetargetZhalftmpZsiterrCZjnrrrr%s $,zScryptEngine.bmixcCsX|dd}tddt|t|D|dd<}tddt||D|dd<dS)z0special bmix() method optimized for ``r=1`` caserENcss|]\}}||AVqdSr,rr;rrrr2r+z'ScryptEngine._bmix_1..css|]\}}||AVqdSr,rr;rrrr2r+)rrrF)r(rGrHBrIrrrr$s (zScryptEngine._bmix_1)__name__ __module__ __qualname____doc__r r r rrrrr#r classmethodrr)rr1r%r$rrrrrs" "!C() rNr&r Zpasslib.utils.compatrZpasslib.crypto.digestrZpasslib.crypto.scrypt._salsar__all__objectrrrrrs