
    k"gf
                     x    d Z ddlZddlZddlZddlmZ ddlmZ  G d de      Z	dddd	Z
d
ZefdZd ZddZy)z3
Django's standard crypto functions and utilities.
    N)settings)force_bytesc                       e Zd ZdZy)InvalidAlgorithmz&Algorithm is not supported by hashlib.N)__name__
__module____qualname____doc__     L/var/www/html/djangosite/lib/python3.12/site-packages/django/utils/crypto.pyr   r      s    0r   r   sha1)	algorithmc                (   |t         j                  }t        |       } t        |      }	 t        t        |      } || |z         j                         }t        j                  |t        |      |      S # t
        $ r}t        d|z        |d}~ww xY w)a*  
    Return the HMAC of 'value', using a key generated from key_salt and a
    secret (which defaults to settings.SECRET_KEY). Default algorithm is SHA1,
    but any algorithm name supported by hashlib can be passed.

    A different key_salt should be passed in for every application of HMAC.
    Nz6%r is not an algorithm accepted by the hashlib module.)msg	digestmod)
r   
SECRET_KEYr   getattrhashlibAttributeErrorr   digesthmacnew)key_saltvaluesecretr   hasherekeys          r   salted_hmacr       s     ~$$8$H F), F"
#
*
*
,C
 88C[/6BB  DyP
	s   A4 4	B=BB>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789c                 J    dj                  fdt        |       D              S )aG  
    Return a securely generated random string.

    The bit length of the returned value can be calculated with the formula:
        log_2(len(allowed_chars)^length)

    For example, with default `allowed_chars` (26+26+10), this gives:
      * length: 12, bit length =~ 71 bits
      * length: 22, bit length =~ 131 bits
     c              3   H   K   | ]  }t        j                          y wN)secretschoice).0iallowed_charss     r   	<genexpr>z$get_random_string.<locals>.<genexpr>>   s     HQ7>>-0Hs   ")joinrange)lengthr*   s    `r   get_random_stringr/   3   s     77H%-HHHr   c                 R    t        j                  t        |       t        |            S )z:Return True if the two strings are equal, False otherwise.)r&   compare_digestr   )val1val2s     r   constant_time_comparer4   A   s    !!+d"3[5FGGr   c                     |t         j                  }|xs d}t        |       } t        |      }t        j                   |       j                  | |||      S )z)Return the hash of password using pbkdf2.N)r   sha256r   pbkdf2_hmacname)passwordsalt
iterationsdklenr   s        r   pbkdf2r=   F   sL    ~MTE8$HtDvx}}hj%PPr   r%   )r   N)r
   r   r   r&   django.confr   django.utils.encodingr   
ValueErrorr   r    RANDOM_STRING_CHARSr/   r4   r=   r   r   r   <module>rB      sV         -	z 	C6 C: W  -@ IH
Qr   