a fŸWcùã@sZdZddlmZddlZddlmZmZmZdgZdd„Z dd „Z d Z Gd d„de ƒZ dS) a¹ passlib.crypto._md4 -- fallback implementation of MD4 Helper implementing insecure and obsolete md4 algorithm. used for NTHASH format, which is also insecure and broken, since it's just md4(password). Implementated based on rfc at http://www.faqs.org/rfcs/rfc1320.html .. note:: This shouldn't be imported directly, it's merely used conditionally by ``passlib.crypto.lookup_hash()`` when a native implementation can't be found. é)ÚhexlifyN)Ú bascii_to_strÚirangeÚPY3Úmd4cCs||@||@BS©N©©ÚxÚyÚzrrú7/usr/lib/python3.9/site-packages/passlib/crypto/_md4.pyÚFsrcCs||@||@B||@BSrrr rrr ÚG!srlÿÿc@sŠeZdZdZdZdZZdZdZdZ dZ dt@| d| ?||<q |jD]\\}}}}} } ||t||||||ƒ|| dt@} | | >t@| d| ?||<q€|j D]\\}}}}} } ||||||A||A|| dt@} | | >t@| d| ?||<qät dƒD]} || || t@|| <qJdS)zprocess 64 byte blockz<16Ié i™y‚Zi¡ëÙnr N) ÚstructÚunpackrÚlistÚ_round1rÚMASK_32Ú_round2rÚ_round3r) rÚblockÚXÚorigÚstateÚaÚbÚcÚdÚkÚsÚtÚirrr Ú_processšs ,00 z md4._processcCsŽt|tƒs"trtdƒ‚n | d¡}|j}|r4||}d}t|ƒ}|d}||krv| |||…¡|jd7_|}q@||d…|_dSq@dS)Nzexpected bytesÚasciirrr) Ú isinstanceÚbytesrÚ TypeErrorÚencoderÚlenr>r)rrÚbufÚidxÚendÚnextrrr r¶s    z md4.updatecCs&tƒ}|j|_t|jƒ|_|j|_|Sr)rrr-rr)rÚotherrrr ÚcopyÌs  zmd4.copycCsÆt|jƒ}|j}|jdt|ƒd}|dddt|ƒdt d|t@|d?t@¡}t|ƒd krŽ| |dd…¡| |dd…¡nt|ƒdksžJ‚| |¡tjd g|j¢RŽ}||_|S) Nir#ó€óéwrz<2Ir*é€z<4I) r-rrrrDr+Úpackr/r>)rr4rEZmsglenr2Úoutrrr ÚdigestÓs ÿ  z md4.digestcCstt| ¡ƒƒSr)rrrQ)rrrr Ú hexdigestësz md4.hexdigest)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚnameÚ digest_sizeZ digestsizeÚ block_sizerrrrr.r0r1r>rrJrQrRrrrr r,s€ ííí)rVZbinasciirr+Zpasslib.utils.compatrrrÚ__all__rrr/Úobjectrrrrr Ús