+
    iw                        R t ^ RIHtHt ^ RIt^ RIt]P                  ! ]4      t^ RI	H
t
 ^ RIHu Ht ^ RIHtHtHtHt ^ RIHt R.t ! R R]P.                  ]P0                  ]P2                  ]P4                  4      tR# )zpasslib.handlers.fshp
)	b64encode	b64decodeN)
to_unicode)bascii_to_str	iteritemsuunicode)pbkdf1fshpc            	         aa ] tR t^t oRtR tRt]P                  t	]
! R4      t^tRtRt^tRtRt^t^ R^R^R^R/t]! ] U u. uF  p \+        V 4      V 3NK  	  up ]! ]4       U Uu. uF  w  rV^ ,          V 3NK  	  upp ,           4      t]RV3R ll4       tRtRV3R llt]R	 4       t]R
 4       t]R 4       t] PB                  ! ]
! R4      ] PD                  4      t#]R 4       t$R t%R t&Rt'Vt(V;t)# u up i u upp i )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
z{FSHPNi S l    linearc                d   < \         \        V `
  ! R/ VB pVe   V P                  V4      Vn        V# )N )superr
   using_norm_variantdefault_variant)clsvariantkwdssubcls	__class__s   &&, S/var/www/html/photoedit/myenv/lib/python3.14/site-packages/passlib/handlers/fshp.pyr   
fshp.usingf   s5    tS'/$/%(%6%6w%?F"    c                *  < VP                  R 4      V n        Ve   V P                  V4      pMKV P                  '       d/   V P                  pV P                  V4      V8X  g   Q RV: 24       hM\	        R4      hWn        \        \        V `"  ! R/ VB  R# )use_defaultsNzinvalid default variant: zno variant specifiedr   )	getr   r   r   	TypeErrorr   r   r
   __init__)selfr   r   r   s   &&,r   r   fshp.__init__u   s     HH^4((1G**G%%g.'9e\c;ee9233dD"*T*r   c                T   \        V\        4      '       d   VP                  R 4      p\        V\        4      '       d    V P                  V,          p\        V\        4      '       g   \        R4      hWP                  9  d   \        R4      hV#   \
         d    \        R4      hi ; i)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                J    V P                   V P                  ,          ^ ,          # )    r+   r   r    s   &r   checksum_algfshp.checksum_alg       !!$,,/22r   c                J    V P                   V P                  ,          ^,          # )   r/   r0   s   &r   checksum_sizefshp.checksum_size   r3   r   z
            ^
            \{FSHP
            (\d+)\| # variant
            (\d+)\| # salt size
            (\d+)\} # rounds
            ([a-zA-Z0-9+/]+={0,3}) # digest
            $c                   \        VR R4      pV P                  P                  V4      pV'       g    \        P                  P                  V 4      hVP                  ^^^^4      w  r4rV\        V4      p\        V4      p\        V4      p \        VP                  R 4      4      pTRT pYdR pT ! YxYSR7      #   \         d!    \        P                  P                  T 4      hi ; i)r#   hashN)saltchecksumroundsr   )r   _hash_regexmatchuhexcInvalidHashErrorgroupr*   r   encoder   MalformedHashError)	r   r9   mr   	salt_sizer<   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   	B6 6+C!c                    V P                   pV P                  p\        \        W!,           4      4      pR V P                  \        V4      V P                  V3,          # )z{FSHP%d|%d|%d}%s)r;   r:   r   r   r   lenr<   )r    rH   r:   rG   s   &   r   	to_stringfshp.to_string   sE    mmyyYtx01!T\\3t9dkk4$PPPr   c                    \        V\        4      '       d   VP                  R 4      p\        V P                  V P
                  VV P                  V P                  R7      # )zutf-8)digestsecretr:   r<   keylen)r$   r   rC   r	   r1   r:   r<   r6   )r    rQ   s   &&r   _calc_checksumfshp._calc_checksum   sO    fg&&]]7+F $$99;;%% 	r   )r   r   )r:   rF   r<   r   )sha1   )sha256    )sha3840   )sha512@   )N)*__name__
__module____qualname____firstlineno____doc__namesetting_kwdsr?   PADDED_BASE64_CHARSchecksum_charsr   identdefault_salt_sizemax_salt_sizedefault_rounds
min_rounds
max_roundsrounds_costr   r+   dictr   r   r'   classmethodr   r   r   r   propertyr1   r6   recompileXr=   rI   rM   rS   __static_attributes____classdictcell____classcell__)kvr   __classdict__s   00@@r   r
   r
      su    #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   C2&C7)ra   base64r   r   rp   logging	getLoggerr]   logpasslib.utilsr   passlib.utils.handlersutilshandlersr?   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   