ó ö 5Xc@s&dZddlZddlZejeƒZddlmZmZm Z m Z ddl m Z m Z ddljjZddlmZdddd d d gZd ejfd „ƒYZed„ZedƒZedƒZde_edƒZedƒZedƒZdejfd„ƒYZdS(s.passlib.handlers.digests - plain hash digests iÿÿÿÿN(t to_native_strtto_bytest render_bytestconsteq(tunicodet str_to_uascii(t lookup_hashtcreate_hex_hashthex_md4thex_md5thex_sha1t hex_sha256t hex_sha512t HexDigestHashcBs;eZdZdZdZejZe d„ƒZ d„Z RS(sTthis provides a template for supporting passwords stored as plain hexadecimal hashescCs |jƒS(N(tlower(tclsthash((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyt _norm_hash(scCs:t|tƒr!|jdƒ}nt|j|ƒjƒƒS(Nsutf-8(t isinstanceRtencodeRt _hash_funct hexdigest(tselftsecret((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyt_calc_checksum,sN( t__name__t __module__t__doc__tNoneRt checksum_sizetuht HEX_CHARStchecksum_charst classmethodRR(((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyR s  cCsgt|ƒ}d|j}t|tftd|d|dt|jƒd|jddd|jfƒƒS( Nthex_tnameRRRiRsŽThis class implements a plain hexadecimal %s hash, and follows the :ref:`password-hash-api`. It supports no optional or contextual keywords. (RR#ttypeR tdictt staticmethodtconstt digest_size(tdigesttmoduletinfoR#((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyR5s   tmd4tmd5t unsalted_md5tsha1tsha256tsha512thtdigestcBs¹eZdZdZdZdZdZedd„ƒZ ed„ƒZ edd„ƒZ ed „ƒZ e jd d d d ƒed„ƒƒZe jd d d d ƒedd„ƒƒZRS(sFhtdigest hash function. .. todo:: document this hash R2tusertrealmtencodingsutf-8cCsŒ|s|j}ntj|ƒt|tƒr@|j|ƒ}nt||dƒ}t||dƒ}td|||ƒ}tj |ƒj ƒS(NR3R4s%s:%s:%s( tdefault_encodingRtvalidate_secretRRRRRthashlibR-R(RRR3R4R5tdata((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyR\s  cCsxt|ddƒ}t|ƒdkr<tjj|dƒ‚nx5|D]-}|tjkrCtjj|dƒ‚qCqCW|S(s0normalize hash to native string, and validate ittparamRi s wrong sizesinvalid chars in hash(RtlenRtexctMalformedHashErrort LC_HEX_CHARS(RRtchar((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyRjs cCs4|j|ƒ}|j||||ƒ}t||ƒS(N(RRR(RRRR3R4R5tother((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pytverifyuscCs*y|j|ƒWntk r%tSXtS(N(Rt ValueErrortFalsetTrue(RR((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pytidentify{s  t deprecateds1.7tremoveds2.0cCs|jdddƒS(Nt(R(R((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyt genconfigƒscCs#|j|ƒ|j||||ƒS(N(RR(RRtconfigR3R4R5((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pytgenhashˆs ((susersrealmsencodingN(RRRR#t setting_kwdst context_kwdsR6R!RRRRARERtdeprecated_methodRIRK(((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyR2Qs   ( RR8tloggingt getLoggerRtlogt passlib.utilsRRRRtpasslib.utils.compatRRtpasslib.utils.handlerstutilsthandlersRtpasslib.crypto.digestRt__all__t StaticHandlerR RRR t django_nameR R R tMinimalHandlerR2(((s</usr/lib/python2.7/site-packages/passlib/handlers/digests.pyts,  "