ó
øÐLac           @   s;  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 j j Z d d l m Z d d d d	 d
 d g Z d e j f d „  ƒ  YZ e d e d „ Z e d d e ƒZ e d d d d e ƒZ e d d e ƒZ e d ƒ Z e d ƒ Z d e j  f d „  ƒ  YZ! d S(   s.   passlib.handlers.digests - plain hash digests
iÿÿÿÿN(   t   to_native_strt   to_bytest   render_bytest   consteq(   t   unicodet   str_to_uascii(   t   lookup_hasht   create_hex_hasht   hex_md4t   hex_md5t   hex_sha1t
   hex_sha256t
   hex_sha512t   HexDigestHashc           B   sA   e  Z d  Z d Z d Z e j Z e	 Z
 e d „  ƒ Z d „  Z RS(   sT   this provides a template for supporting passwords stored as plain hexadecimal hashesc         C   s
   | j  ƒ  S(   N(   t   lower(   t   clst   hash(    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyt
   _norm_hash+   s    c         C   s:   t  | t ƒ r! | j d ƒ } n  t |  j | ƒ j ƒ  ƒ S(   Ns   utf-8(   t
   isinstanceR   t   encodeR   t
   _hash_funct	   hexdigest(   t   selft   secret(    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyt   _calc_checksum/   s    N(   t   __name__t
   __module__t   __doc__t   NoneR   t   checksum_sizet   uht	   HEX_CHARSt   checksum_charst   Truet	   supportedt   classmethodR   R   (    (    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyR      s   	c         C   s¯   t  |  d | ƒ} d | j } | j s4 d | _ n  t | t f t d | d | d t | j ƒ d | j d d	 d
 | j f ƒ ƒ } | j s™ t	 | _ n  | r« | | _
 n  | S(   s@  
    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.
    t   requiredt   hex_i    t   nameR   R   R   i   R   sŽ   This class implements a plain hexadecimal %s hash, and follows the :ref:`password-hash-api`.

It supports no optional or contextual keywords.
(   R   R&   R"   t   digest_sizet   typeR   t   dictt   staticmethodt   constt   Falset   django_name(   t   digestt   moduleR-   R$   t   infoR&   t   hasher(    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyR   8   s    
		t   md4R$   t   md5R-   t   unsalted_md5t   sha1t   sha256t   sha512t   htdigestc           B   s¹   e  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 d d ƒ e d „  ƒ ƒ Z e j d
 d d d ƒ e d d „ ƒ ƒ Z RS(   sF   htdigest hash function.

    .. todo::
        document this hash
    R8   t   usert   realmt   encodings   utf-8c         C   sŒ   | s |  j  } n  t j | ƒ t | t ƒ r@ | j | ƒ } n  t | | d ƒ } t | | d ƒ } t d | | | ƒ } t j	 | ƒ j
 ƒ  S(   NR9   R:   s   %s:%s:%s(   t   default_encodingR   t   validate_secretR   R   R   R   R   t   hashlibR3   R   (   R   R   R9   R:   R;   t   data(    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyR   r   s    c         C   sx   t  | d d ƒ} t | ƒ d k r< t j j |  d ƒ ‚ n  x5 | D]- } | t j k rC t j j |  d ƒ ‚ qC qC W| S(   s0   normalize hash to native string, and validate itt   paramR   i    s
   wrong sizes   invalid chars in hash(   R    t   lenR   t   exct   MalformedHashErrort   LC_HEX_CHARS(   R   R   t   char(    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyR   €   s    c         C   s4   |  j  | ƒ } |  j | | | | ƒ } t | | ƒ S(   N(   R   R   R   (   R   R   R   R9   R:   R;   t   other(    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyt   verify‹   s    c         C   s*   y |  j  | ƒ Wn t k
 r% t SXt S(   N(   R   t
   ValueErrorR,   R!   (   R   R   (    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyt   identify‘   s
    t
   deprecateds   1.7t   removeds   2.0c         C   s   |  j  d d d ƒ S(   Nt    (   R   (   R   (    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyt	   genconfig™   s    c         C   s#   |  j  | ƒ |  j | | | | ƒ S(   N(   R   R   (   R   R   t   configR9   R:   R;   (    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyt   genhashž   s    (    (   R9   R:   R;   N(   R   R   R   R&   t   setting_kwdst   context_kwdsR<   R#   R   R   R   RG   RI   R   t   deprecated_methodRM   RO   (    (    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyR8   g   s    ("   R   R>   t   loggingt	   getLoggerR   t   logt   passlib.utilsR    R   R   R   t   passlib.utils.compatR   R   t   passlib.utils.handlerst   utilst   handlersR   t   passlib.crypto.digestR   t   __all__t   StaticHandlerR   R   R!   R   R,   R   R	   R
   R   R   t   MinimalHandlerR8   (    (    (    sS   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/digests.pyt   <module>   s*    "	&