+
    THi                        R t ^ RIt^ RIHu Ht ^ RIHt ^ RIH	t	H
t
HtHt . ROt ! R R]P                  4      t]RR3R lt]! RR	R
7      t]! RRR	R7      t]! RR	R
7      t]! R4      t]! R4      t ! R R]P.                  4      tR# )zplain hash digestsN)lookup_hash)consteqrender_bytesto_bytesto_native_strc                   ^   a  ] tR t^t o RtRtRt]P                  t	Rt
]R 4       tR tRtV tR# )HexDigestHashzTthis provides a template for supporting passwords stored as plain hexadecimal hashesNTc                "    VP                  4       # N)lowerclshashs   &&:/usr/lib/python3/dist-packages/passlib/handlers/digests.py
_norm_hashHexDigestHash._norm_hash   s    zz|    c                    \        V\        4      '       d   VP                  R 4      pV P                  V4      P	                  4       # utf-8)
isinstancestrencode
_hash_func	hexdigest)selfsecrets   &&r   _calc_checksumHexDigestHash._calc_checksum!   s5    fc""]]7+Fv&0022r    )__name__
__module____qualname____firstlineno____doc__r   checksum_sizeuh	HEX_CHARSchecksum_chars	supportedclassmethodr   r   __static_attributes____classdictcell____classdict__s   @r   r   r      s>     ^JM\\N I 3 3r   r   Tc                h   \        WR7      pRVP                  ,           pVP                  '       g   ^ Vn        \	        V\
        3\        VV\        VP                  4      VP                  ^,          RVP                   R2R7      4      pVP                  '       g   RVn        V'       d   W&n	        V# )a(  
create hex-encoded unsalted hasher for specified digest algorithm.

.. versionchanged:: 1.7.3
    If called with unknown/supported digest, won't throw error immediately,
    but instead return a dummy hasher that will throw error when called.

    set ``required=True`` to restore old behavior.
requiredhex_z*This class implements a plain hexadecimal zb hash, and follows the :ref:`password-hash-api`.

It supports no optional or contextual keywords.
)namer!   r   r%   r$   F)
r   r3   r)   digest_sizetyper   dictstaticmethodconstdjango_name)digestmoduler9   r1   infor3   hashers   &&&&   r   create_hex_hashr>   '   s     v1DDIID>>>	#

 **Q.B499+ N 	
F  >>> (Mr   md4Fr0   md5unsalted_md5)r9   r1   sha1sha256sha512c                      a  ] tR t^Wt o RtR tRtRtRt]	RR l4       t
]	R 4       t]	RR l4       t]	R 4       t]P                  ! RR	R
7      ]	R 4       4       t]P                  ! RR	R
7      ]	RR l4       4       tRtV tR# )htdigestz:htdigest hash function.

.. todo::
    document this hash
r   Nc                6   V'       g   V P                   p\        P                  ! V4       \        V\        4      '       d   VP                  V4      p\        W$R 4      p\        W4R4      p\        RW#V4      p\        P                  ! V4      P                  4       # )userrealmz%s:%s:%s)default_encodingr&   validate_secretr   r   r   r   r   hashlibr@   r   )r   r   rH   rI   encodingdatas   &&&&& r   r   htdigest.hashc   sy     ++H
6"fc""]]8,F/'2JV<{{4 **,,r   c                    \        VRR7      p\        V4      ^ 8w  d!   \        P                  P	                  V R4      hV F8  pV\        P
                  9  g   K  \        P                  P	                  V R4      h	  V# )z0normalize hash to native string, and validate itr   )paramz
wrong sizezinvalid chars in hash)r   lenr&   excMalformedHashErrorLC_HEX_CHARS)r   r   chars   && r   r   htdigest._norm_hashq   sg     T0t9?&&++C>>D2??*ff//5LMM  r   c                ^    V P                  V4      pV P                  WWE4      p\        W&4      # r
   )r   r   r   )r   r   r   rH   rI   rM   others   &&&&&& r   verifyhtdigest.verify|   s+    ~~d#u7t##r   c                N     V P                  V4       R#   \         d     R # i ; i)FT)r   
ValueErrorr   s   &&r   identifyhtdigest.identify   s,    	NN4    		s    $$z1.7z2.0)
deprecatedremovedc                (    V P                  R R R 4      # ) )r   )r   s   &r   	genconfightdigest.genconfig   s     xxB##r   c                H    V P                  V4       V P                  WWE4      # r
   )r   r   )r   r   configrH   rI   rM   s   &&&&&&r   genhashhtdigest.genhash   s!    
 	vxxe66r   r   )rH   rI   rM   r
   r   )r    r!   r"   r#   r$   r3   setting_kwdscontext_kwdsrJ   r*   r   r   rZ   r^   r&   deprecated_methodrd   rh   r+   r,   r-   s   @r   rF   rF   W   s      DL0L- -   $ $
   UE:$  ;$ UE:7  ;7r   rF   )r>   hex_md4hex_md5hex_sha1
hex_sha256
hex_sha512)r$   rL   passlib.utils.handlersutilshandlersr&   passlib.crypto.digestr   passlib.utilsr   r   r   r   __all__StaticHandlerr   r    r>   rm   rn   ro   rp   rq   MinimalHandlerrF   r   r   r   <module>rz      s      # # - H H3B$$ 3( $, "R %%
0
%^e
L6E2X&
X&
>7r   >7r   