
     hw                         d Z ddlmZmZ ddlZddlZ ej                  e      Zddl	m
Z
 ddlmc mZ ddlmZmZmZmZ ddlmZ dgZ G d dej.                  ej0                  ej2                  ej4                        Zy)	zpasslib.handlers.fshp
    )	b64encode	b64decodeN)
to_unicode)bascii_to_str	iteritemsuunicode)pbkdf1fshpc            
          e Zd ZdZd ZdZej                  Z e	d      Z
dZdZdZdZdZd	ZdZd
ddddZ eeD  cg c]  }t)        |      |f c}}}  ee      D  cg c]  \  }}|d   |f c}}} z         Zedfd	       ZdZdfd	Zed        Zed        Zed        Z ej@                   e	d      ejB                        Z"ed        Z#d Z$d Z%xZ&S c c}}} w c c}}} w )r   ap  This class implements the FSHP password hash, and follows the :ref:`password-hash-api`.

    It supports a variable-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :param salt:
        Optional raw salt string.
        If not specified, one will be autogenerated (this is recommended).

    :param salt_size:
        Optional number of bytes to use when autogenerating new salts.
        Defaults to 16 bytes, but can be any non-negative value.

    :param rounds:
        Optional number of rounds to use.
        Defaults to 480000, must be between 1 and 4294967295, inclusive.

    :param variant:
        Optionally specifies variant of FSHP to use.

        * ``0`` - uses SHA-1 digest (deprecated).
        * ``1`` - uses SHA-2/256 digest (default).
        * ``2`` - uses SHA-2/384 digest.
        * ``3`` - uses SHA-2/512 digest.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include ``rounds``
        that are too small or too large, and ``salt`` strings that are too long.

        .. versionadded:: 1.6
    )salt	salt_sizeroundsvariantz{FSHP   Ni S    l    linear)sha1   )sha256    )sha3840   )sha512@   )r   r         r   c                 ^    t        t        | 
  di |}|| j                  |      |_        |S )N )superr   using_norm_variantdefault_variant)clsr   kwdssubcls	__class__s       W/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/passlib/handlers/fshp.pyr!   z
fshp.usingf   s5    tS'/$/%(%6%6w%?F"    c                    |j                  d      | _        || j                  |      }nA| j                  r*| j                  }| j                  |      |k(  sJ d|       t	        d      || _        t        t        | "  di | y )Nuse_defaultszinvalid default variant: zno variant specifiedr   )	getr+   r"   r#   	TypeErrorr   r    r   __init__)selfr   r%   r'   s      r(   r.   zfshp.__init__u   s     HH^4((1G**G%%g.'9e\c;ee233dD"*T*r)   c                     t        |t              r|j                  d      }t        |t              r	 | j                  |   }t        |t              st        d      || j                  vrt        d      |S # t
        $ r t        d      w xY w)Nasciizinvalid fshp variantz'fshp variant must be int or known alias)

isinstancebytesdecoder	   _variant_aliasesKeyError
ValueErrorintr-   _variant_info)r$   r   s     r(   r"   zfshp._norm_variant   s    gu%nnW-Ggw'9..w7 '3'EFF#+++344  9 !7889s   A8 8Bc                 :    | j                   | j                     d   S )Nr   r9   r   r/   s    r(   checksum_algzfshp.checksum_alg       !!$,,/22r)   c                 :    | j                   | j                     d   S )Nr   r;   r<   s    r(   checksum_sizezfshp.checksum_size   r>   r)   z
            ^
            \{FSHP
            (\d+)\| # variant
            (\d+)\| # salt size
            (\d+)\} # rounds
            ([a-zA-Z0-9+/]+={0,3}) # digest
            $c                    t        |dd      }| j                  j                  |      }|st        j                  j                  |       |j                  dddd      \  }}}}t        |      }t        |      }t        |      }	 t        |j                  d            }|d | }||d  } | ||||      S # t        $ r  t        j                  j                  |       w xY w)Nr1   hashr   r   r      )r   checksumr   r   )r   _hash_regexmatchuhexcInvalidHashErrorgroupr8   r   encoder-   MalformedHashError)	r$   rB   mr   r   r   datar   chks	            r(   from_stringzfshp.from_string   s    $0OO!!$'&&))#..+,771Qq+;(FDg,	N	V	1T[[12D JY9:s67KK	  	1&&++C00	1s   B5 5)Cc                     | j                   }| j                  }t        t        ||z               }d| j                  t        |      | j                  |fz  S )Nz{FSHP%d|%d|%d}%s)rD   r   r   r   r   lenr   )r/   rO   r   rN   s       r(   	to_stringzfshp.to_string   sG    mmyyYtCx01!T\\3t9dkk4$PPPr)   c                     t        |t              r|j                  d      }t        | j                  | j
                  || j                  | j                        S )Nzutf-8)digestsecretr   r   keylen)r2   r	   rK   r
   r=   r   r   r@   )r/   rV   s     r(   _calc_checksumzfshp._calc_checksum   sL    fg&]]7+F $$99;;%% 	r)   )N)'__name__
__module____qualname____doc__namesetting_kwdsrG   PADDED_BASE64_CHARSchecksum_charsr   identdefault_salt_sizemax_salt_sizedefault_rounds
min_rounds
max_roundsrounds_costr#   r9   dictr	   r   r5   classmethodr!   r   r.   r"   propertyr=   r@   recompileXrE   rP   rS   rX   __classcell__).0kr	   vr'   s   0000@r(   r   r      sb   #R D=L++NgJE M
 NJJK O 
M !.//A'!*Q/&}566ca!A$q6	7
   G
+   3 3 3 3 "**Q    44K L L"QG 	06s   C!C$)r\   base64r   r   rk   logging	getLoggerrY   logpasslib.utilsr   passlib.utils.handlersutilshandlersrG   passlib.utils.compatr   r   r   r	   passlib.crypto.digestr
   __all__	HasRounds
HasRawSaltHasRawChecksumGenericHandlerr   r   r)   r(   <module>r      ss    ( 	 'g''1 % # #) ) ( u2<<(9(92;L;L ur)   