
     h                     J   d Z ddlZddlZ ej                  e      ZddlmZmZm	Z	m
Z
 ddlmZmZ ddlmc mZ ddlmZ g dZ G d dej*                        Zedd	fd
Z edd      Z eddd      Z edd      Z ed      Z ed      Z G d dej:                        Zy)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                   J    e Zd ZdZdZdZej                  ZdZ	e
d        Zd Zy)HexDigestHashzTthis provides a template for supporting passwords stored as plain hexadecimal hashesNTc                 "    |j                         S N)lowerclshashs     Z/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/passlib/handlers/digests.py
_norm_hashzHexDigestHash._norm_hash+   s    zz|    c                     t        |t              r|j                  d      }t        | j	                  |      j                               S )Nutf-8)
isinstancer   encoder   
_hash_func	hexdigest)selfsecrets     r   _calc_checksumzHexDigestHash._calc_checksum/   s7    fg&]]7+FT__V4>>@AAr   )__name__
__module____qualname____doc__r   checksum_sizeuh	HEX_CHARSchecksum_chars	supportedclassmethodr   r#    r   r   r   r      s;    ^ JM\\N I
  Br   r   Tc                 8   t        | |      }d|j                  z   }|j                  sd|_        t	        |t
        ft        ||t        |j                        |j                  dz  d|j                  d            }|j                  sd|_        |r||_	        |S )	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	   r4   r,   digest_sizetyper   dictstaticmethodconstdjango_name)digestmoduler:   r1   infor4   hashers          r   r
   r
   8   s     v1DDIID>>$($

+&&q( yy	+ 	F >> (Mr   md4Fr0   md5unsalted_md5)r:   r1   sha1sha256sha512c                       e Zd ZdZd ZdZdZdZedd       Z	ed        Z
edd       Zed	        Z ej                  d
d      ed               Z ej                  d
d      edd              Zy)htdigestzFhtdigest hash function.

    .. todo::
        document this hash
    r.   )userrealmencodingr   Nc                     |s| j                   }t        j                  |       t        |t              r|j                  |      }t        ||d      }t        ||d      }t        d|||      }t        j                  |      j                         S )NrG   rH   z%s:%s:%s)default_encodingr)   validate_secretr   r   r   r   r   hashlibr@   r    )r   r"   rG   rH   rI   datas         r   r   zhtdigest.hashr   s|     ++H
6"fg&]]8,Fh/'2JeV<{{4 **,,r   c                     t        |d      }t        |      dk7  r t        j                  j	                  | d      |D ]4  }|t        j
                  vst        j                  j	                  | d       |S )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   zhtdigest._norm_hash   sn     T0t9?&&++C>> 	ND2??*ff//5LMM	N r   c                 d    | j                  |      }| j                  ||||      }t        ||      S r   )r   r   r   )r   r"   r   rG   rH   rI   others          r   verifyzhtdigest.verify   s1    ~~d#uh7tU##r   c                 F    	 | j                  |       y# t        $ r Y yw xY w)NFT)r   
ValueErrorr   s     r   identifyzhtdigest.identify   s,    	NN4    		s    	  z1.7z2.0)
deprecatedremovedc                 (    | j                  ddd      S )N )r   )r   s    r   	genconfigzhtdigest.genconfig   s     xxB##r   c                 L    | j                  |       | j                  ||||      S r   )r   r   )r   r"   configrG   rH   rI   s         r   genhashzhtdigest.genhash   s%    
 	vxxeX66r   r   )r   )r$   r%   r&   r'   r4   setting_kwdscontext_kwdsrK   r-   r   r   rY   r\   r)   deprecated_methodra   rd   r.   r   r   rF   rF   g   s    
 DL0L- -   $ $
   RUE:$  ;$ RUE:7  ;7r   rF   )r'   rM   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   MinimalHandlerrF   r.   r   r   <module>rt      s     'g''1 I H 7 # # -BB$$ B8 $, L ee4e%Pfu5h'
h'

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