
     h                         d Z ddlmZ ddlZ ej                  e      ZddlmZ ddl	m
Z
mZmZ ddlmc mZ dgZ G d dej$                  ej&                  ej(                  ej*                        Zy)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                       e Zd ZdZd ZdZej                  ZdxZ	Z
ej                  ZdZdZdZdZ ed      Z ed       ed	      fZ ed
       ed       ed       ed	      iZed        Zd Zd Zy)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                     | j                  |      \  }}|d   |dd |dd  }}} | |t        j                  |j                  d            ||xs d       S )Nr      	   ascii)r   r   r
   checksum)_parse_identr   decode_int6encode)clshashr   datar   r
   chks          Y/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/passlib/handlers/phpass.pyfrom_stringzphpass.from_string`   sb    &&t,t GT!AYQRc??6==#9:[D	
 	
    c                     t        d      | j                  t        j                  | j                        j                  d      | j                  | j                  xs t        d      fz  }t        |      S )Nz%s%s%s%sr    )	r   r   r   encode_int6r   decoder
   r   r   )selfr   s     r    	to_stringzphpass.to_stringk   sZ    }

!oodkk:AA'J"ii"mm4qu 6 6 T""r"   c                 p   t        |t              r|j                  d      }d| j                  z  }t	        | j
                  j                  d      |z         j                         }d}||k  r't	        ||z         j                         }|dz  }||k  r't        j                  |      j                  d      S )Nzutf-8r   r   r   )

isinstancer   r   r   r   r
   digestr   encode_bytesr&   )r'   secretreal_roundsresultrs        r    _calc_checksumz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____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(   r1    r"   r    r   r      s    !N D.L__N %&%MMJ NJJK eHMeHah'LsVAeHafQuX6M 
 
#
8r"   )r5   hashlibr   logging	getLoggerr2   logpasslib.utils.binaryr   passlib.utils.compatr   r   r   passlib.utils.handlersutilshandlersr8   __all__HasManyIdents	HasRoundsHasSaltGenericHandlerr   rF   r"   r    <module>rU      si     'g''1 % : : # # d8Rr||RZZ9J9J d8r"   