
    g                         S r SSKJr  SSKr\R                  " \5      rSSKJr  SSK	J
r
JrJr  SSKJs  Jr  S/r " S S\R$                  \R&                  \R(                  \R*                  5      rg)zpasslib.handlers.phpass - PHPass Portable Crypt

phppass located - http://www.openwall.com/phpass/
algorithm described - http://www.openwall.com/articles/PHP-Users-Passwords

phpass context - blowfish, bsdi_crypt, phpass
    )md5N)h64)uuascii_to_strunicodephpassc                       \ rS rSrSrS rSr\R                  r	S=r
r\R                  rSrSrSrSr\" S	5      r\" S	5      \" S
5      4r\" S5      \" S	5      \" S5      \" S
5      0r\S 5       rS rS rSrg)r      a  This class implements the PHPass Portable Hash, and follows the :ref:`password-hash-api`.

It supports a fixed-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, one will be autogenerated (this is recommended).
    If specified, it must be 8 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

:type rounds: int
:param rounds:
    Optional number of rounds to use.
    Defaults to 19, must be between 7 and 30, inclusive.
    This value is logarithmic, the actual number of iterations used will be :samp:`2**{rounds}`.

:type ident: str
:param ident:
    phpBB3 uses ``H`` instead of ``P`` for its identifier,
    this may be set to ``H`` in order to generate phpBB3 compatible hashes.
    it defaults to ``P``.

: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roundsident            log2z$P$z$H$PHc                     U R                  U5      u  p#US   USS USS  penU " U[        R                  " UR                  S5      5      UU=(       d    S S9$ )Nr      	   ascii)r   r   r   checksum)_parse_identr   decode_int6encode)clshashr   datar   r   chks          P/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/handlers/phpass.pyfrom_stringphpass.from_string`   s^    &&t, GT!AYQRc??6==#9:[D	
 	
    c                     [        S5      U R                  [        R                  " U R                  5      R                  S5      U R                  U R                  =(       d    [        S5      4-  n[        U5      $ )Nz%s%s%s%sr    )	r   r   r   encode_int6r   decoder   r   r   )selfr   s     r!   	to_stringphpass.to_stringk   sZ    }

!oodkk:AA'J"ii"mm4qu 6 6 T""r$   c                 |   [        U[        5      (       a  UR                  S5      nSU R                  -  n[	        U R
                  R                  S5      U-   5      R                  5       nSnXB:  a'  [	        X1-   5      R                  5       nUS-  nXB:  a  M'  [        R                  " U5      R                  S5      $ )Nzutf-8r   r   r   )

isinstancer   r   r   r   r   digestr   encode_bytesr(   )r)   secretreal_roundsresultrs        r!   _calc_checksumphpass._calc_checksumu   s    fg&&]]7+FnTYY%%g.78??Ao)002FFA o '..w77r$    N)__name__
__module____qualname____firstlineno____doc__namesetting_kwdsuhHASH64_CHARSchecksum_charsmin_salt_sizemax_salt_size
salt_charsdefault_rounds
min_rounds
max_roundsrounds_costr   default_identident_valuesident_aliasesclassmethodr"   r*   r4   __static_attributes__r6   r$   r!   r   r      s    !N D.L__N %&%MMJ NJJK eHMeHah'LsVAeHafQuX6M 
 
#
8r$   )r;   hashlibr   logging	getLoggerr7   logpasslib.utils.binaryr   passlib.utils.compatr   r   r   passlib.utils.handlersutilshandlersr>   __all__HasManyIdents	HasRoundsHasSaltGenericHandlerr   r6   r$   r!   <module>r[      sf     g''1 % : : # # d8Rr||RZZ9J9J d8r$   