
    g                     :   S r SSKrSSKr\R                  " \5      rSSKJrJrJ	r	J
r
  SSKJrJr  SSKJs  Jr  SSKJr  / SQr " S S\R*                  5      r\SS	4S
 jr\" SSS9r\" SSSS9r\" SSS9r\" S5      r\" S5      r " S S\R:                  5      rg)z.passlib.handlers.digests - plain hash digests
    N)to_native_strto_bytesrender_bytesconsteq)unicodestr_to_uascii)lookup_hash)create_hex_hashhex_md4hex_md5hex_sha1
hex_sha256
hex_sha512c                   R    \ rS rSrSrSrSr\R                  r	Sr
\S 5       rS rSrg)HexDigestHash   zTthis provides a template for supporting passwords stored as plain hexadecimal hashesNTc                 "    UR                  5       $ N)lowerclshashs     Q/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/handlers/digests.py
_norm_hashHexDigestHash._norm_hash+   s    zz|    c                     [        U[        5      (       a  UR                  S5      n[        U R	                  U5      R                  5       5      $ )Nutf-8)
isinstancer   encoder   
_hash_func	hexdigest)selfsecrets     r   _calc_checksumHexDigestHash._calc_checksum/   s:    fg&&]]7+FT__V4>>@AAr    )__name__
__module____qualname____firstlineno____doc__r!   checksum_sizeuh	HEX_CHARSchecksum_chars	supportedclassmethodr   r%   __static_attributes__r'   r   r   r   r      s;    ^ JM\\N I
  Br   r   Tc                 H   [        XS9nSUR                  -   nUR                  (       d  SUl        [	        U[
        4[        UU[        UR                  5      UR                  S-  SUR                  < S3S95      nUR                  (       d  SUl        U(       a  X&l	        U$ )	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_r      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	   r9   r1   digest_sizetyper   dictstaticmethodconstdjango_name)digestmoduler?   r6   infor9   hashers          r   r
   r
   8   s     v1DDIID>>$($

+&&q( yy	+ 	F >> (Mr   md4Fr5   md5unsalted_md5)r?   r6   sha1sha256sha512c                       \ rS rSrSrS rSrSrSr\	SS j5       r
\	S 5       r\	SS	 j5       r\	S
 5       r\R                  " SSS9\	S 5       5       r\R                  " SSS9\	SS j5       5       rSrg)htdigestg   z:htdigest hash function.

.. todo::
    document this hash
r'   )userrealmencodingr   Nc                 2   U(       d  U R                   n[        R                  " U5        [        U[        5      (       a  UR                  U5      n[        X$S5      n[        X4S5      n[        SX#U5      n[        R                  " U5      R                  5       $ )NrM   rN   z%s:%s:%s)default_encodingr.   validate_secretr   r   r    r   r   hashlibrE   r"   )r   r$   rM   rN   rO   datas         r   r   htdigest.hashr   sy     ++H
6"fg&&]]8,F/'2JV<{{4 **,,r   c                     [        USS9n[        U5      S:w  a   [        R                  R	                  U S5      eU H7  nU[        R
                  ;  d  M  [        R                  R	                  U S5      e   U$ )z0normalize hash to native string, and validate itr   )param    z
wrong sizezinvalid chars in hash)r   lenr.   excMalformedHashErrorLC_HEX_CHARS)r   r   chars      r   r   htdigest._norm_hash   sg     T0t9?&&++C>>D2??*ff//5LMM  r   c                 ^    U R                  U5      nU R                  XXE5      n[        X&5      $ r   )r   r   r   )r   r$   r   rM   rN   rO   others          r   verifyhtdigest.verify   s+    ~~d#u7t##r   c                 H     U R                  U5        g! [         a     gf = f)NFT)r   
ValueErrorr   s     r   identifyhtdigest.identify   s,    	NN4    		s    
!!z1.7z2.0)
deprecatedremovedc                 (    U R                  SSS5      $ )N )r   )r   s    r   	genconfightdigest.genconfig   s     xxB##r   c                 H    U R                  U5        U R                  XXE5      $ r   )r   r   )r   r$   configrM   rN   rO   s         r   genhashhtdigest.genhash   s!    
 	vxxe66r   r   )r   )r(   r)   r*   r+   r,   r9   setting_kwdscontext_kwdsrQ   r2   r   r   ra   re   r.   deprecated_methodrk   ro   r3   r'   r   r   rK   rK   g   s    
 DL0L- -   $ $
   UE:$  ;$ UE:7  ;7r   rK   )r,   rS   logging	getLoggerr(   logpasslib.utilsr   r   r   r   passlib.utils.compatr   r   passlib.utils.handlersutilshandlersr.   passlib.crypto.digestr	   __all__StaticHandlerr   r
   r   r   r   r   r   MinimalHandlerrK   r'   r   r   <module>r      s     g''1 I H 7 # # -BB$$ B8 $, L ee4e%Pfu5h'
h'

=7r   =7r   