+
    ¢THi¤  ã                   óÆ   € ^ RI t ^ RIHtHt ^ RIHu Ht ^ RIH	t	 ^ RI
Ht ^ RIHt R.t ! R R]P                  ]P                   ]P"                  ]P$                  4      tR# )é    N)Ú	b64decodeÚ	b64encode)Úpbkdf1)Ú
to_unicode)Úbascii_to_strÚfshpc            	       óò  aa€ ] tR t^t oRtR tRt]P                  t	R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 ]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]P@                  ! R]PB                  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                ó\   <€ \         SV `  ! R/ VB pVe   V P                  V4      Vn        V# )N© )ÚsuperÚusingÚ_norm_variantÚdefault_variant)ÚclsÚvariantÚkwdsÚsubclsÚ	__class__s   &&, €Ú7/usr/lib/python3/dist-packages/passlib/handlers/fshp.pyr   Ú
fshp.usingZ   s2   ø€ ä‘’Ñ& Ñ&ˆØÒØ%(×%6Ñ%6°wÓ%?ˆ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        \        SV `  ! R/ VB  R# )Úuse_defaultsNzinvalid default variant: zno variant specifiedr   )Úgetr   r   r   Ú	TypeErrorr   r   Ú__init__)Úselfr   r   r   s   &&,€r   r   Úfshp.__init__c   sŽ   ø€ à ŸH™H ^Ó4ˆÔØÒØ×(Ñ(¨Ó1‰GØ××ÐØ×*Ñ*ˆGØ×%Ñ% gÓ.°'Ô9ð Ø+¨G©;Ð7óÑ9ô Ð2Ó3Ð3ØŒÜ‰ÒÑ ˜4Ô 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ÚdecodeÚstrÚ_variant_aliasesÚKeyErrorÚ
ValueErrorÚintr   Ú_variant_info)r   r   s   &&r   r   Úfshp._norm_variantr   s”   € ä�gœu×%Ò%Ø—n‘n WÓ-ˆGÜ�gœs×#Ò#ð9Ø×.Ñ.¨wÕ7�ô ˜'¤3×'Ò'ÜÐEÓFÐFØ×+Ñ+Ô+ÜÐ3Ó4Ð4Øˆøô ô 9Ü Ð!7Ó8Ð8ð9ús   ¿B ÂB'c                óJ   € V P                   V P                  ,          ^ ,          # )r   ©r*   r   ©r   s   &r   Úchecksum_algÚfshp.checksum_alg�   ó   € à×!Ñ! $§,¡,Õ/°Õ2Ð2r   c                óJ   € V P                   V P                  ,          ^,          # )é   r-   r.   s   &r   Úchecksum_sizeÚfshp.checksum_size…   r1   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   r7   Úmr   Ú	salt_sizer:   Údatar8   Úchks	   &&       r   Úfrom_stringÚfshp.from_string•   sÓ   € ä˜$ ¨Ó0ˆØ�O‰O×!Ñ! $Ó'ˆßÜ—&‘&×)Ñ)¨#Ó.Ð.Ø+,¯7©7°1°a¸¸AÓ+>Ñ(ˆ˜FÜ�g“,ˆÜ˜	“Nˆ	Ü�V“ˆð	1Ü˜TŸ[™[¨Ó1Ó2ˆDð �J�YÐˆØ�:ÐˆÙ˜°6ÔKÐKøô	 ô 	1Ü—&‘&×+Ñ+¨CÓ0Ð0ð	1ús   Â	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)r9   r8   r   r   r   Úlenr:   )r   rF   r8   rE   s   &   r   Ú	to_stringÚfshp.to_string§   sE   € Ø�m‰mˆØ�y‰yˆÜœY t¥zÓ2Ó3ˆØ! T§\¡\´3°t³9¸d¿k¹kÈ4Ð$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Úsecretr8   r:   Úkeylen)r"   r%   rA   r   r/   r8   r:   r4   )r   rO   s   &&r   Ú_calc_checksumÚfshp._calc_checksum­   sO   € Ü�fœc×"Ò"Ø—]‘] 7Ó+ˆFô Ø×$Ñ$Ø—9‘9ØØ—;‘;Ø×%Ñ%ô
ð 	
r   )r   r   )r8   rD   r:   r   )Úsha1é   )Úsha256é    )Úsha384é0   )Úsha512é@   )N))Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚnameÚsetting_kwdsr=   ÚPADDED_BASE64_CHARSÚchecksum_charsÚidentÚdefault_salt_sizeÚmax_salt_sizeÚdefault_roundsÚ
min_roundsÚ
max_roundsÚrounds_costr   r*   Údictr%   Úitemsr&   Úclassmethodr   r   r   r   Úpropertyr/   r4   ÚreÚcompileÚVERBOSEr;   rG   rK   rQ   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)ÚkÚvr   Ú__classdict__s   00@@r   r   r      sj  ù‡ € ñ#ðL €DØ=€LØ×+Ñ+€NØ€Eð ÐØ€Mð
 €NØ€JØ€JØ€Kð €Oð 	
ˆ<Ø	ˆ>Ø	ˆ>Ø	ˆ>ð€Mñ Ù+Ó,™m˜Œ#ˆa‹&�!‹™mÑ,Ø!.×!4Ñ!4Ô!6Ô
7Ñ!6™˜ˆAˆa�D�!‹9Ñ!6Ò
7õ	8óÐð
 öó ðð €G÷!ð ñó ðð ñ3ó ð3ð ñ3ó ð3ð —*’*ð	ð 	�
‰
ó
€Kð ñLó ðLò"Q÷
ò 
ùòo 	-ùÛ
7s   ½C.Á(C3)ro   Úbase64r   r   Úpasslib.utils.handlersÚutilsÚhandlersr=   Úpasslib.crypto.digestr   Úpasslib.utilsr   Úpasslib.utils.compatr   Ú__all__Ú	HasRoundsÚ
HasRawSaltÚHasRawChecksumÚGenericHandlerr   r   r   r   Ú<module>r„      sR   ðÛ 	ß 'ç #Ð #Ý (Ý $Ý .ð ð€ô
k
Ø‡L�LØ‡M�MØ×ÑØ×Ñö	k
r   