+
    i                         R t ^ RIt]P                  ! ]4      t^ RIHtHt ^ RIH	t	 ^ RI
HtHtHt ^ RIHt ^ RIHu Ht . tRt ! R R]P,                  ]P.                  ]P0                  ]P2                  4      tR# )	zpasslib.handlers.sha1_crypt
N)
safe_crypt
test_crypt)h64)uunicodeirange)compile_hmac    c                      a  ] tR t^t o RtR tRt]! R4      t^t	]
P                  t^t^@t]
P                  tRt^tRtRt]R 4       tRR ltRt]R 4       tR	 t]R
 4       tR t. ROtRtV tR# )
sha1_crypta  This class implements the SHA1-Crypt 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:

:type salt: str
:param salt:
    Optional salt string.
    If not specified, an 8 character one will be autogenerated (this is recommended).
    If specified, it must be 0-64 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

:type salt_size: int
:param salt_size:
    Optional number of bytes to use when autogenerating new salts.
    Defaults to 8 bytes, but can be any value between 0 and 64.

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

: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$sha1$i S l    linearc                `    \         P                  ! WP                  V R 7      w  r#pV ! W#VR7      # ))handler)roundssaltchecksum)uh	parse_mc3ident)clshashr   r   chks   &&   Y/var/www/html/photoedit/myenv/lib/python3.14/site-packages/passlib/handlers/sha1_crypt.pyfrom_stringsha1_crypt.from_stringS   s(    LLyy#Fc&c::    c                    V'       d   R MV P                   p\        P                  ! V P                  V P                  V P
                  V4      # )N)r   r   
render_mc3r   r   r   )selfconfigr   s   && r   	to_stringsha1_crypt.to_stringX   s0    d$--}}TZZdiiEEr   c                d    \        R R4      '       d   V P                  V P                  4       R# R# )testz-$sha1$1$Wq3GL2Vp$C8U25GvfHS8qGHimExLaiSFlGkAeTF)r   _set_calc_checksum_backend_calc_checksum_os_cryptr   s   &r   _load_backend_os_crypt!sha1_crypt._load_backend_os_cryptd   s0    f - . .**3+F+FGr   c                   V P                  R R7      p\        W4      pVf   V P                  V4      # VP                  V4      '       d!   \	        V4      \	        V4      ^,           8w  d!   \
        P                  P                  WV4      hVRR # )T)r   Ni)r    r   _calc_checksum_builtin
startswithlenr   excCryptBackendError)r   secretr   r   s   &&  r   r%   "sha1_crypt._calc_checksum_os_cryptm   sz    t,&)< ..v66v&&#d)s6{R7G*G&&**4>>CDzr   c                <    V P                  V P                  4       R # )T)r$   r*   r&   s   &r   _load_backend_builtin sha1_crypt._load_backend_builtin{   s    &&s'A'ABr   c                   \        V\        4      '       d   VP                  R 4      p\        V9   d    \        P
                  P                  V 4      hV P                  p\        R4      V P                  V3,          P                  R4      p\        RV4      p\        V4       F  pV! V4      pK  	  \        P                  ! W0P                  4      P                  R4      # )zutf-8z
%s$sha1$%sasciisha1)
isinstancer   encode_BNULLr   r-   NullPasswordErrorr   r   r   r   r   r   encode_transposed_bytes_chk_offsetsdecode)r   r/   r   result
keyed_hmac_s   &&    r   r*   !sha1_crypt._calc_checksum_builtin   s    fg&&]]7+FV&&**400L/TYY$77??H!&&1
A'F  **63D3DELLWUUr    N)r   	salt_sizer   )F)os_cryptbuiltin)                               
   	                     rH         )__name__
__module____qualname____firstlineno____doc__namesetting_kwdsr   r   checksum_sizer   HASH64_CHARSchecksum_charsdefault_salt_sizemax_salt_size
salt_charsdefault_rounds
min_rounds
max_roundsrounds_costclassmethodr   r    backendsr'   r%   r2   r*   r<   __static_attributes____classdictcell__)__classdict__s   @r   r   r      s     J D2LhKEM__N MJ NJJK
 ; ;F 'H
  	  VLr   r   )r^   logging	getLoggerrZ   logpasslib.utilsr   r   passlib.utils.binaryr   passlib.utils.compatr   r   r   passlib.crypto.digestr   passlib.utils.handlersutilshandlersr   __all__r9   HasManyBackends	HasRoundsHasSaltGenericHandlerr   rB   r   r   <module>r      sk    g''1 1 $ 3 3 . # #
 
}##R\\2::r?P?P }r   