%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python3.9/site-packages/passlib/handlers/__pycache__/
Upload File :
Create Path :
Current File : //lib/python3.9/site-packages/passlib/handlers/__pycache__/bcrypt.cpython-39.pyc

a

f�WcN��	@s
dZddlmZmZddlmZddlmZddlZddl	Z	ddl
Z
e
�e�Z
ddlmZdadadadaddlmZddlmZmZmZdd	lmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%dd
l&m'Z'ddl(m)Z)ddl(m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddl0m1m2Z3d
gZ4e*d�Z5e*d�Z6e*d�Z7e*d�Z8e*d�Z9dZ:dZ;dd�Z<Gdd�de3j=e3j>e3j?e3j@e3jAe3jB�ZCGdd�deC�ZDGdd�deC�ZEGdd�deC�ZFGdd �d eC�ZGGd!d"�d"eC�ZHGd#d$�d$eC�ZIGd%d
�d
eDeC�ZJe*d&�ZKGd'd(�d(eJ�ZLGd)d*�d*eL�ZMdS)+z�passlib.bcrypt -- implementation of OpenBSD's BCrypt algorithm.

TODO:

* support 2x and altered-2a hashes?
  http://www.openwall.com/lists/oss-security/2011/06/27/9

* deal with lack of PY3-compatibile c-ext implementation
�)�with_statement�absolute_import)�	b64encode)�sha256N)�warn)�compile_hmac)�PasslibHashWarning�PasslibSecurityWarning�PasslibSecurityError)�
safe_crypt�
repeat_string�to_bytes�
parse_version�rng�
getrandstr�
test_crypt�
to_unicode�
utf8_truncate�utf8_repeat_string�crypt_accepts_bytes)�bcrypt64)�get_unbound_method_function)�u�
uascii_to_str�unicode�
str_to_uascii�PY3�
error_from�bcryptz$2$z$2a$z$2x$z$2y$z$2b$�z<$2a$04$5BJqKfqMQvV7nS.yUguNcueVirQqDBGaLXSqj.rs.pZPlNR0UX/HKcCsLzddl}Wnty YdS0zddlm}WntyFYdS0dS)a!
    internal helper which tries to distinguish pybcrypt vs bcrypt.

    :returns:
        True if cext-based py-bcrypt,
        False if ffi-based bcrypt,
        None if 'bcrypt' module not found.

    .. versionchanged:: 1.6.3

        Now assuming bcrypt installed, unless py-bcrypt explicitly detected.
        Previous releases assumed py-bcrypt by default.

        Making this change since py-bcrypt is (apparently) unmaintained and static,
        whereas bcrypt is being actively maintained, and it's internal structure may shift.
    rN)�__version__FT)r�ImportErrorZbcrypt._bcryptr )rr �r"�;/usr/lib/python3.9/site-packages/passlib/handlers/bcrypt.py�_detect_pybcrypt7sr$cs*eZdZdZdZdZdZejZ	e
Zee
eee
fZed�eed�e
ed�eed�e
iZd	ZZejZd
ZdZdZdZd
ZdZdZdZdZdZdZ e
Z!dZ"e#dd��Z$dd�Z%dd�Z&e#�fdd��Z'e#dd��Z(e#�fdd��Z)e#�fdd��Z*d'�fdd�	Z+d Z,e#d!d"��Z-d#d$�Z.e#d(d%d&��Z/�Z0S))�
_BcryptCommona&
    Base class which implements brunt of BCrypt code.
    This is then subclassed by the various backends,
    to override w/ backend-specific methods.

    When a backend is loaded, the bases of the 'bcrypt' class proper
    are modified to prepend the correct backend-specific subclass.
    r)�salt�rounds�ident�truncate_error��2�2a�2y�2b�z.Oeu��Zlog2�HFc	Cs�|�|�\}}|tkrtd��|�td��\}}t|�}|td�|fkrXtj�|d��|dd�|dd�}}||||p~d|d�S)Nz>crypt_blowfish's buggy '2x' hashes are not currently supported�$z%02dzmalformed cost fieldr/)r'r&�checksumr()	Z_parse_ident�IDENT_2X�
ValueError�splitr�int�uh�exc�MalformedHashError)	�cls�hashr(�tailZ
rounds_str�datar'r&�chkr"r"r#�from_string�s�z_BcryptCommon.from_stringcCs$td�|j|j|j|jf}t|�S)Nz%s%02d$%s%s)rr(r'r&r4r)�selfr=r"r"r#�	to_string�sz_BcryptCommon.to_stringcCstd�||j|jf}t|�S)z5internal helper to prepare config string for backendsz	%s%02d$%s)rr'r&r)rBr(�configr"r"r#�_get_config�sz_BcryptCommon._get_configcsHt|t�r|�d�}|�t�r0|d|jvr0dStt|�j|fi|��S)N�ascii�T)	�
isinstance�bytes�decode�
startswith�IDENT_2A�final_salt_chars�superr%�needs_update)r<r=�kwds��	__class__r"r#rO�s


z_BcryptCommon.needs_updatecCs |�|�r|�|���S|SdS)z<helper to normalize hash, correcting any bcrypt padding bitsN)�identifyrArC�r<r=r"r"r#�normhash�s
z_BcryptCommon.normhashcstt|���}t�|�S�N)rNr%�_generate_saltrZ
repair_unused)r<r&rQr"r#rW�sz_BcryptCommon._generate_saltcsHtt|�j|fi|��}|dus(Jd��t�|�\}}|rDtdt�|S)Nz!HasSalt didn't generate new salt!z�encountered a bcrypt salt with incorrectly set padding bits; you may want to use bcrypt.normhash() to fix this; this will be an error under Passlib 2.0)rNr%�
_norm_saltr�check_repair_unusedrr)r<r&rP�changedrQr"r#rX�s�z_BcryptCommon._norm_saltcs4tt|�j||d�}t�|�\}}|r0tdt�|S)N)�relaxedz�encountered a bcrypt hash with incorrectly set padding bits; you may want to use bcrypt.normhash() to fix this; this will be an error under Passlib 2.0)rNr%�_norm_checksumrrYrr)rBr4r[rZrQr"r#r\�s�z_BcryptCommon._norm_checksumz9 -- recommend you install one (e.g. 'pip install bcrypt')c
s�|tj�usJd��|jr dS|j�ttjjf�trD�tj	j
f7����fdd�}��fdd�}��fdd����fd	d
�}d}|d|�}|tur�d|_t
�d
��n|s�td���|dt�}|tur�td���nT|s�td���nB|t��t��r,�dk�rt
�d��ntd�tjj�d|_t�dd�}|d|�}|tu�r`d|_t
�d��n$|�sttd���n|t�|t�t�dd�}	|d|	�}|tu�r�d|_t
�d��n*|�s�td���nt|_|t�|t�d|_dS)z�
        helper called by from backend mixin classes' _load_backend_mixin() --
        invoked after backend imports have been loaded, and performs
        feature detection & testing common to all backends.
        z1_configure_workarounds() invoked from wrong classTc
sTz�||�WS�y"tYStjjyNtjd�||dd�tYS0dS)z8verify() wrapper which traps 'unknown identifier' errorsz<trapped unexpected response from %r backend: verify(%r, %r):T��exc_infoN)�NotImplementedr9r:�InternalBackendError�log�debug)�secretr=)�backend�	err_types�verifyr"r#�safe_verify,s	�z:_BcryptCommon._finalize_backend_mixin.<locals>.safe_verifycsXd}|�d�d}|�d�d}�||�r:td�|f���||�sTtd�|f��dS)a
            helper to check for cryptblowfish 8bit bug (fixed in 2y/2b);
            even though it's not known to be present in any of passlib's backends.
            this is treated as FATAL, because it can easily result in seriously malformed hashes,
            and we can't correct for it ourselves.

            test cases from <http://cvsweb.openwall.com/cgi/cvsweb.cgi/Owl/packages/glibc/crypt_blowfish/wrapper.c.diff?r1=1.9;r2=1.10>
            reference hash is the incorrectly generated $2x$ hash taken from above url
            sёrFs805$6bNw2HLQYeqHYyBfLMsv/OiwqTymGIGzFsA4hOTWebfehXHNprcASs805$6bNw2HLQYeqHYyBfLMsv/OUcZd0LKP39b87nBw3.S2tVZSqiQX6euz�passlib.hash.bcrypt: Your installation of the %r backend is vulnerable to the crypt_blowfish 8-bit bug (CVE-2011-2483) under %r hashes, and should be upgraded or replaced with another backendz(%s backend failed to verify %s 8bit hashN)�encoder
�RuntimeError�r(rcZbug_hashZcorrect_hash�rdrfr"r#�assert_lacks_8bit_bugBs
��
zD_BcryptCommon._finalize_backend_mixin.<locals>.assert_lacks_8bit_bugcsTddd�}|�d�d}�||�r(dS|�d�d}�||�sPtd�|f��d	S)
a>
            check for bsd wraparound bug (fixed in 2b)
            this is treated as a warning, because it's rare in the field,
            and pybcrypt (as of 2015-7-21) is unpatched, but some people may be stuck with it.

            test cases from <http://www.openwall.com/lists/oss-security/2012/01/02/4>

            NOTE: reference hash is of password "0"*72

            NOTE: if in future we need to deliberately create hashes which have this bug,
                  can use something like 'hashpw(repeat_string(secret[:((1+secret) % 256) or 1]), 72)'
            s01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789N�rFs804$R1lJ2gkNaoPGdafE.H.16.nVyh2niHsGJhayOHLMiXlI45o8/DU.6Ts804$R1lJ2gkNaoPGdafE.H.16.1MKHPvmKwryeulRe225LKProWYwt9Oiz.%s backend failed to verify %s wraparound hashF)rhrirjrkr"r#�detect_wrap_bugls

z>_BcryptCommon._finalize_backend_mixin.<locals>.detect_wrap_bugcs �|�sdStd�|f��dS)Nz1%s backend unexpectedly has wraparound bug for %s)ri)r()rdrnr"r#�assert_lacks_wrap_bug�szD_BcryptCommon._finalize_backend_mixin.<locals>.assert_lacks_wrap_bugs;$2$04$5BJqKfqMQvV7nS.yUguNcuRfMMOXK0xPWavM7pOzjEi5ze5T1k8/S�testz1%r backend lacks $2$ support, enabling workaroundz %s incorrectly rejected $2$ hashz %s lacks support for $2a$ hashesz!%s incorrectly rejected $2a$ hash�os_cryptz;%r backend has $2a$ bsd wraparound bug, enabling workaroundz�passlib.hash.bcrypt: Your installation of the %r backend is vulnerable to the bsd wraparound bug, and should be upgraded or replaced with another backend (enabling workaround for now).r,r-z2%r backend lacks $2y$ support, enabling workaroundz!%s incorrectly rejected $2y$ hashr.z2%r backend lacks $2b$ support, enabling workaroundz!%s incorrectly rejected $2b$ hash)r�_backend_mixin_map�_workrounds_initializedrfr6r9r:ZMissingBackendError�	_bcryptor�engineZ	SaltErrorr_�_lacks_20_supportrarbri�TEST_HASH_2ArLrr	�_has_2a_wraparound_bug�replace�_lacks_2y_support�IDENT_2Y�_lacks_2b_support�IDENT_2B�_fallback_ident)
�	mixin_clsrd�dryrunrgrlroZtest_hash_20�resultZtest_hash_2yZtest_hash_2br")rdrnrerfr#�_finalize_backend_mixinsp
�*



��

	

z%_BcryptCommon._finalize_backend_mixincCs|j||j|jd�S)z�
        common helper for backends to implement _calc_checksum().
        takes in secret, returns (secret, ident) pair,
        )�new)�_norm_digest_argsr(Zuse_defaults�rBrcr"r"r#�_prepare_digest_args�sz"_BcryptCommon._prepare_digest_argscCs8|j}t|t�r|�d�}n*|rFz|�d�WntyDd}Yn0t�|�|r^|�|�t	|vrrtj
�|��|jr�t
|�dkr�|r�t|d�}n|dd�}|tkr�n�|tkr�|jr�|j}np|tkr�|jr�|j}nZ|tk�r|j�r0|�r|r�t|d�}n
t|d�}|j}n |tk�r$td��ntd|��||fS)N�utf-8Frmr2z.$2x$ hashes not currently supported by passlibzunexpected ident value: %r)�_require_valid_utf8_bytesrHrrhrJ�UnicodeDecodeErrorr9Zvalidate_secret�_check_truncate_policy�_BNULLr:ZNullPasswordErrorrx�lenrrLr}r|r~r{rz�IDENT_2rvrrr5ri�AssertionError)r<rcr(r�Zrequire_valid_utf8_bytesr"r"r#r��sH







z_BcryptCommon._norm_digest_args)F)F)1�__name__�
__module__�__qualname__�__doc__�name�setting_kwdsZ
checksum_sizer�charmapZchecksum_charsr}�
default_identr�rLr5r{�ident_valuesr�
ident_aliasesZ
min_salt_sizeZ
max_salt_sizeZ
salt_charsrMZdefault_roundsZ
min_roundsZ
max_roundsZrounds_cost�
truncate_sizersrxrvrzr|r~r��classmethodrArCrErOrUrWrXr\Z_no_backend_suggestionr�r�r��
__classcell__r"r"rQr#r%^sZ�
	

Lr%cs eZdZdZ�fdd�Z�ZS)�
_NoBackendz�
    mixin used before any backend has been loaded.
    contains stubs that force loading of one of the available backends.
    cs|��tt|��|�SrV)Z_stub_requires_backendrNr�_calc_checksumr�rQr"r#r�Nsz_NoBackend._calc_checksum)r�r�r�r�r�r�r"r"rQr#r�Fsr�c@s$eZdZdZedd��Zdd�ZdS)�_BcryptBackendz-
    backend which uses 'bcrypt' package
    cCspt�r
dSzddlaWnty*YdS0ztjj}Wntjddd�d}Yn0t�d|�|�	||�S)NFrz&(trapped) error reading bcrypt versionTr]�	<unknown>z%detected 'bcrypt' backend, version %r)
r$r�_bcryptr!�	__about__r ra�warningrbr�)rr�r��versionr"r"r#�_load_backend_mixin`s
z"_BcryptBackend._load_backend_mixincCs�|�|�\}}|�|�}t|t�r,|�d�}t�||�}t|t�sFJ�|�|�rdt	|�t	|�dkrxt
jj|||dd��|dd��
d�S)NrFr*z`bcrypt` package��source���)r�rErHrrhr��hashpwrIrKr�r9r:�CryptBackendErrorrJ�rBrcr(rDr=r"r"r#r��s


z_BcryptBackend._calc_checksumN�r�r�r�r�r�r�r�r"r"r"r#r�[s
%r�c@s$eZdZdZedd��Zdd�ZdS)�_BcryptorBackendz/
    backend which uses 'bcryptor' package
    cCs<zddlaWnty YdS0|s0tdt�|�||�S)NrFzqSupport for `bcryptor` is deprecated, and will be removed in Passlib 1.8; Please use `pip install bcrypt` instead)�bcryptorrtr!r�DeprecationWarningr��rr�r�r"r"r#r��s�z$_BcryptorBackend._load_backend_mixincCsn|�|�\}}|�|�}tj�d��||�}|�|�rJt|�t|�dkr^tj	j
|||dd��t|dd��S)NFr*zbcryptor libraryr�r�)r�rErtruZEngineZhash_keyrKr�r9r:r�rr�r"r"r#r��s
z_BcryptorBackend._calc_checksumNr�r"r"r"r#r��s
r�c@s4eZdZdZdZedd��Zdd�Zdd�ZeZ	dS)	�_PyBcryptBackendz/
    backend which uses 'pybcrypt' package
    NcCs�t�s
dSzddlaWnty*YdS0|s:tdt�ztjj}Wntj	ddd�d}Yn0t�
d|�t|�p|d	}|d
kr�td|tj
j�|jdur�ddl}|��|_t|j�|_|�||�S)NFrzrSupport for `py-bcrypt` is deprecated, and will be removed in Passlib 1.8; Please use `pip install bcrypt` insteadz((trapped) error reading pybcrypt versionTr]r�z'detected 'pybcrypt' backend, version %r)rr)r�zapy-bcrypt %s has a major security vulnerability, you should upgrade to py-bcrypt 0.3 immediately.)r$r�	_pybcryptr!rr�r�r rar�rbrr9r:r	�
_calc_lock�	threading�Lockr�_calc_checksum_threadsafer�r�)rr�r�r�Zvinfor�r"r"r#r��s8�
��

z$_PyBcryptBackend._load_backend_mixincCs4|j�|�|�Wd�S1s&0YdSrV)r��_calc_checksum_rawr�r"r"r#r��sz*_PyBcryptBackend._calc_checksum_threadsafecCsf|�|�\}}|�|�}t�||�}|�|�rBt|�t|�dkrVtjj|||dd��t	|dd��S)Nr*zpybcrypt libraryr�r�)
r�rEr�r�rKr�r9r:r�rr�r"r"r#r��s
z#_PyBcryptBackend._calc_checksum_raw)
r�r�r�r�r�r�r�r�r�r�r"r"r"r#r��s
&
r�c@s*eZdZdZeZedd��Zdd�ZdS)�_OsCryptBackendz0
    backend which uses :func:`crypt.crypt`
    cCstdt�sdS|�||�S)NrpF)rrwr�r�r"r"r#r�
s
z#_OsCryptBackend._load_backend_mixincCs�|�|�\}}|�|�}t||�}|durd|�|�rHt|�t|�dkrXtj�|||��|dd�Str�t	|t
�r�z|�d�Wn$ty�t
tj�d�d��Yn0tjj}tj�d||�||�f��dS)Nr*r�r�z�python3 crypt.crypt() ony supports bytes passwords using UTF8; passlib recommends running `pip install bcrypt` for general bcrypt support.z�crypt.crypt() failed for unknown reason; passlib recommends running `pip install bcrypt` for general bcrypt support.(config=%s, secret=%s))r�rErrKr�r9r:r�rrHrIrJr�rZPasswordValueError�debug_only_reprr`)rBrcr(rDr=r�r"r"r#r�s,

��
��z_OsCryptBackend._calc_checksumN)	r�r�r�r�rr�r�r�r�r"r"r"r#r�s

r�c@s$eZdZdZedd��Zdd�ZdS)�_BuiltinBackendzA
    backend which uses passlib's pure-python implementation
    cCsBddlm}|tj�d��s*t�d�dSddlma	|�
||�S)Nr)�as_boolZPASSLIB_BUILTIN_BCRYPTz@bcrypt 'builtin' backend not enabled via $PASSLIB_BUILTIN_BCRYPTF)�
raw_bcrypt)�
passlib.utilsr��os�environ�getrarbZpasslib.crypto._blowfishr��_builtin_bcryptr�)rr�r�r�r"r"r#r�Ss
z#_BuiltinBackend._load_backend_mixincCs8|�|�\}}t||dd�|j�d�|j�}|�d�S)N����rF)r�r�r&rhr'rJ)rBrcr(r@r"r"r#r�]s
�z_BuiltinBackend._calc_checksumNr�r"r"r"r#r�Os
	r�c@s*eZdZdZdZdZeeee	e
ed�ZdS)ra�
This class implements the BCrypt password 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 22 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        Defaults to 12, must be between 4 and 31, inclusive.
        This value is logarithmic, the actual number of iterations used will be :samp:`2**{rounds}`
        -- increasing the rounds by +1 will double the amount of time taken.

    :type ident: str
    :param ident:
        Specifies which version of the BCrypt algorithm will be used when creating a new hash.
        Typically this option is not needed, as the default (``"2b"``) is usually the correct choice.
        If specified, it must be one of the following:

        * ``"2"`` - the first revision of BCrypt, which suffers from a minor security flaw and is generally not used anymore.
        * ``"2a"`` - some implementations suffered from rare security flaws, replaced by 2b.
        * ``"2y"`` - format specific to the *crypt_blowfish* BCrypt implementation,
          identical to ``"2b"`` in all but name.
        * ``"2b"`` - latest revision of the official BCrypt algorithm, current default.

    :param bool truncate_error:
        By default, BCrypt will silently truncate passwords larger than 72 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :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

    .. versionchanged:: 1.6
        This class now supports ``"2y"`` hashes, and recognizes
        (but does not support) the broken ``"2x"`` hashes.
        (see the :ref:`crypt_blowfish bug <crypt-blowfish-bug>`
        for details).

    .. versionchanged:: 1.6
        Added a pure-python backend.

    .. versionchanged:: 1.6.3

        Added support for ``"2b"`` variant.

    .. versionchanged:: 1.7

        Now defaults to ``"2b"`` variant.
    )r�pybcryptr�rq�builtinT)Nrr�r�rqr�N)
r�r�r�r�ZbackendsZ_backend_mixin_targetr�r�r�r�r�r�rrr"r"r"r#rfsK�r3c@s4eZdZdZedd�ejD��ZdZedd��Z	dS)�_wrapped_bcryptz�
    abstracts out some bits bcrypt_sha256 & django_bcrypt_sha256 share.
    - bypass backend-loading wrappers for hash() etc
    - disable truncation support, sha256 wrappers don't need it.
    ccs|]}|dvr|VqdS))r)Nr")�.0�elemr"r"r#�	<genexpr>��z_wrapped_bcrypt.<genexpr>NcCsdSrVr")r<rcr"r"r#r��sz&_wrapped_bcrypt._check_truncate_policy)
r�r�r�r��tuplerr�r�r�r�r"r"r"r#r��s
r�cs�eZdZdZdZeefZdd�e�ZeZ	e
ddg�ZdZe
d�fdd�	�Zed	�Ze�d
�Ze�d�Ze
dd
��Ze
dd��Zed�Zed�Zdd�Zd�fdd�	Ze
dd��Z�fdd�Z�fdd�Z�ZS)�
bcrypt_sha256a�
    This class implements a composition of BCrypt + HMAC_SHA256,
    and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.hash` and :meth:`~passlib.ifc.PasswordHash.genconfig` methods accept
    all the same optional keywords as the base :class:`bcrypt` hash.

    .. versionadded:: 1.6.2

    .. versionchanged:: 1.7

        Now defaults to ``"2b"`` bcrypt variant; though supports older hashes
        generated using the ``"2a"`` bcrypt variant.

    .. versionchanged:: 1.7.3

        For increased security, updated to use HMAC-SHA256 instead of plain SHA256.
        Now only supports the ``"2b"`` bcrypt variant.  Hash format updated to "v=2".
    cst�fdd�tj��D��S)Nc3s|]}|d�vr|VqdS)r�Nr")r��item�r�r"r#r�s�z)bcrypt_sha256.<lambda>.<locals>.<genexpr>)�dictrr��itemsr�r"r�r#�<lambda>r�zbcrypt_sha256.<lambda>r��NcsXtt|�jfi|��}|dur*|�|�|_|j}|jdkrT|tkrTtd||jf��|S)Nr�z+bcrypt %r hashes not allowed for version %r)rNr��using�
_norm_versionr�r�r}r6)r<r�rP�subclsr(rQr"r#r�,s�zbcrypt_sha256.usingz$bcrypt-sha256$z�(?x)
        ^
        [$]bcrypt-sha256[$]
        v=(?P<version>\d+),
        t=(?P<type>2b),
        r=(?P<rounds>\d{1,2})
        [$](?P<salt>[^$]{22})
        (?:[$](?P<digest>[^$]{31}))?
        $
        z�(?x)
        ^
        [$]bcrypt-sha256[$]
        (?P<type>2[ab]),
        (?P<rounds>\d{1,2})
        [$](?P<salt>[^$]{22})
        (?:[$](?P<digest>[^$]{31}))?
        $
        cCst�|�}|sdS|�|j�S)NF)r9Zto_unicode_for_identifyrK�prefixrTr"r"r#rSas
zbcrypt_sha256.identifycCs�t|dd�}|�|j�s$tj�|��|j�|�}|rXt|�	d��}|dkrztj�
|��n"|j�|�}|rnd}ntj�
|��|�	d�}|�tj�r�|tjkr�tj�
|��|||�	d�t|�|�	d�|�	d	�d
�S)NrFr=r�r�r�r'�typer&�digest)r�r(r'r&r4)rrKr�r9r:ZInvalidHashError�_v2_hash_re�matchr8�groupr;�_v1_hash_reZ_UZEROZZeroPaddedRoundsError)r<r=�mr�r'r"r"r#rAhs,
�zbcrypt_sha256.from_stringz"$bcrypt-sha256$v=2,t=%s,r=%d$%s$%sz$bcrypt-sha256$%s,%d$%s$%scCs>|jdkr|j}n|j}||j�t�|j|j|jf}t	|�S)Nr�)
r��_v1_template�_v2_templater(�strip�_UDOLLARr'r&r4r)rB�templater=r"r"r#rC�s

zbcrypt_sha256.to_stringcs.|dur|�|�|_tt|�jfi|��dSrV)r�r�rNr��__init__)rBr�rPrQr"r#r��szbcrypt_sha256.__init__cCs ||jvrtd|j|f��|S)Nz&%s: unknown or unsupported version: %r)�_supported_versionsr6r�)r<r�r"r"r#r��s
zbcrypt_sha256._norm_versioncstt|t�r|�d�}|jdkr,t|���}n0|j}|d|jvrHtd��t	d|�d��|�}t
|�}tt|��
|�S)Nr�r�r�zinvalid salt stringrrF)rHrrhr�rr�r&rMr6rrrNr�r�)rBrcr�r&�keyrQr"r#r��s



zbcrypt_sha256._calc_checksumcs*|jt|�jkrdStt|�jfi|��S)NT)r�r�rNr��_calc_needs_update)rBrPrQr"r#r��sz bcrypt_sha256._calc_needs_update)N)N)r�r�r�r�r�rLr}r�r�r��setr�r�r�r�rr��re�compiler�r�rSrAr�r�rCr�r�r�r�r�r"r"rQr#r��s4�	




	
	+r�)Nr�Z
__future__rr�base64rZhashlibrr�r�ZloggingZ	getLoggerr�ra�warningsrr�r�rtr�Zpasslib.crypto.digestrZpasslib.excrr	r
r�rrr
rrrrrrrrZpasslib.utils.binaryrZpasslib.utils.compatrrrrrrrZpasslib.utils.handlersZutils�handlersr9�__all__r�rLr5r{r}r�rwr$ZSubclassBackendMixinZ
TruncateMixinZ
HasManyIdentsZ	HasRoundsZHasSaltZGenericHandlerr%r�r�r�r�r�r�rr�r�r�r"r"r"r#�<module>sX4 �'�k=$HKb#

Zerion Mini Shell 1.0