
    gw                         S r SSKJrJr  SSKrSSKr\R                  " \5      rSSK	J
r
  SSKJs  Jr  SSKJrJrJrJr  SSKJr  S/r " S S\R.                  \R0                  \R2                  \R4                  5      rg)	zpasslib.handlers.fshp
    )	b64encode	b64decodeN)
to_unicode)bascii_to_str	iteritemsuunicode)pbkdf1fshpc            
         ^ \ rS rSrSrS rSr\R                  r	\
" S5      rSrSrSrSrS	rS
rSrSSSSS.r\" \ V VVs/ s H  n[+        U5      U4PM     snnn \" \5       V VVs/ s H  u  pUS   U4PM     snnn -   5      r\SU4S jj5       rSrSU4S jjr\S 5       r\S 5       r\S 5       r\ RB                  " \
" S5      \ RD                  5      r#\S 5       r$S r%S r&Sr'U=r($ s  snnn f s  snnn f )r      a  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                 b   > [         [        U ]
  " S0 UD6nUb  U R                  U5      Ul        U$ )N )superr   using_norm_variantdefault_variant)clsr   kwdssubcls	__class__s       N/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/handlers/fshp.pyr"   
fshp.usingf   s5    tS'/$/%(%6%6w%?F"    c                 "  > UR                  S5      U l        Ub  U R                  U5      nOIU R                  (       a-  U R                  nU R                  U5      U:X  d   SU< 35       eO[	        S5      eXl        [        [        U ]"  " S0 UD6  g )Nuse_defaultszinvalid default variant: zno variant specifiedr    )	getr-   r#   r$   	TypeErrorr   r!   r   __init__)selfr   r&   r(   s      r)   r0   fshp.__init__u   s     HH^4((1G**G%%g.'9e\c;ee9233dD"*T*r+   c                 B   [        U[        5      (       a  UR                  S5      n[        U[        5      (       a   U R                  U   n[        U[        5      (       d  [        S5      eXR                  ;  a  [        S5      eU$ ! [
         a    [        S5      ef = f)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#   fshp._norm_variant   s    gu%%nnW-Ggw''9..w7 '3''EFF+++344  9 !7889s   B Bc                 :    U R                   U R                     S   $ )Nr   r<   r   r1   s    r)   checksum_algfshp.checksum_alg       !!$,,/22r+   c                 :    U R                   U R                     S   $ )Nr   r?   r@   s    r)   checksum_sizefshp.checksum_size   rC   r+   z
            ^
            \{FSHP
            (\d+)\| # variant
            (\d+)\| # salt size
            (\d+)\} # rounds
            ([a-zA-Z0-9+/]+={0,3}) # digest
            $c                    [        USS5      nU R                  R                  U5      nU(       d  [        R                  R                  U 5      eUR                  SSSS5      u  p4pV[        U5      n[        U5      n[        U5      n [        UR                  S5      5      nUS U nXdS  nU " XxXSS9$ ! [         a     [        R                  R                  U 5      ef = f)Nr4   hashr   r   r      )r   checksumr   r   )r   _hash_regexmatchuhexcInvalidHashErrorgroupr;   r   encoder/   MalformedHashError)	r%   rH   mr   r   r   datar   chks	            r)   from_stringfshp.from_string   s    $0OO!!$'&&))#..+,771Qq+;(Fg,	N	V	1T[[12D JY:6KK	  	1&&++C00	1s   B2 2*Cc                     U R                   nU R                  n[        [        X!-   5      5      nSU R                  [        U5      U R                  U4-  $ )Nz{FSHP%d|%d|%d}%s)rJ   r   r   r   r   lenr   )r1   rU   r   rT   s       r)   	to_stringfshp.to_string   sE    mmyyYtx01!T\\3t9dkk4$PPPr+   c                     [        U[        5      (       a  UR                  S5      n[        U R                  U R
                  UU R                  U R                  S9$ )Nzutf-8)digestsecretr   r   keylen)r5   r	   rQ   r
   rA   r   r   rE   )r1   r^   s     r)   _calc_checksumfshp._calc_checksum   sO    fg&&]]7+F $$99;;%% 	r+   )r-   r   )N))__name__
__module____qualname____firstlineno____doc__namesetting_kwdsrM   PADDED_BASE64_CHARSchecksum_charsr   identdefault_salt_sizemax_salt_sizedefault_rounds
min_rounds
max_roundsrounds_costr$   r<   dictr	   r   r8   classmethodr"   r   r0   r#   propertyrA   rE   recompileXrK   rV   rZ   r`   __static_attributes____classcell__).0kr	   vr(   s   0000@r)   r   r      sg   #R D=L++NgJE M
 NJJK O 
M !./A'!*Q/&}565ca!A$q56	7
   G
+   3 3 3 3 **Q    44K L L"Q G 	06s   C*&C1)rf   base64r   r   ru   logging	getLoggerrb   logpasslib.utilsr   passlib.utils.handlersutilshandlersrM   passlib.utils.compatr   r   r   r	   passlib.crypto.digestr
   __all__	HasRounds
HasRawSaltHasRawChecksumGenericHandlerr   r    r+   r)   <module>r      sp    ( 	 g''1 % # #) ) ( u2<<(9(92;L;L ur+   