a fŸWc±ã@s|dZddlmZddlZe e¡ZddlmZddl m Z m Z m Z ddl mmZdgZGdd„dejejejejƒZdS)zÝpasslib.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@sŒeZdZdZdZdZejZdZ Z ejZ dZ dZ dZdZedƒZedƒed ƒfZed ƒedƒed ƒed ƒiZed d „ƒZdd„Zdd„ZdS)ra€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ééééZlog2z$P$z$H$ÚPÚHcCsR| |¡\}}|d|dd…|dd…}}}||t | d¡¡||pLddS)Nréé Úascii)r r rÚchecksum)Z _parse_identrZ decode_int6Úencode)ÚclsÚhashr Údatar rZchk©rú;/usr/lib/python3.9/site-packages/passlib/handlers/phpass.pyÚ from_string`s$üzphpass.from_stringcCs8tdƒ|jt |j¡ d¡|j|jp*tdƒf}t|ƒS)Nz%s%s%s%srÚ) rr rZ encode_int6r Údecoderrr)ÚselfrrrrÚ to_stringks   ýzphpass.to_stringcCslt|tƒr| d¡}d|j>}t|j d¡|ƒ ¡}d}||kr\t||ƒ ¡}|d7}q:t |¡  d¡S)Nzutf-8rrr) Ú isinstancerrr rrÚdigestrZ encode_bytesr)rZsecretZ real_roundsÚresultÚrrrrÚ_calc_checksumus    zphpass._calc_checksumN)Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚnameZ setting_kwdsÚuhZ HASH64_CHARSZchecksum_charsZ min_salt_sizeZ max_salt_sizeZ salt_charsZdefault_roundsZ min_roundsZ max_roundsZ rounds_costrZ default_identZ ident_valuesZ ident_aliasesÚ classmethodrrr$rrrrrs"'   )r(ZhashlibrZloggingZ getLoggerr%ÚlogZpasslib.utils.binaryrZpasslib.utils.compatrrrZpasslib.utils.handlersZutilsÚhandlersr*Ú__all__Z HasManyIdentsZ HasRoundsZHasSaltZGenericHandlerrrrrrÚs  ÿ