§
    HŠtjž%  ã                   óú   — 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
 ddlmZ ddlmZ dd	gZd
ZdZdZd„ ZdZdd„Zdadadd„Zd„ Zd„ Zd„ ZdZ eeee¬¦  «        Zdd„Z ed¦  «         d„ Z dS )zg
passlib.utils.scrypt -- scrypt hash frontend and help utilities

XXX: add this module to public docs?
é    )Úabsolute_importN)Úwarn)Úexc)Úto_bytes)ÚPYPYÚvalidateÚscryptéÿÿÿÿl   àÿ iÿÿÿ?c                 óì   — |dk     rt          d|z  ¦  «        ‚|dk     rt          d|z  ¦  «        ‚||z  t          k    rt          d|›d|›�¦  «        ‚| dk     s| | dz
  z  rt          d| z  ¦  «        ‚dS )	aI  
    helper which validates a set of scrypt config parameters.
    scrypt will take ``O(n * r * p)`` time and ``O(n * r)`` memory.
    limitations are that ``n = 2**<positive integer>``, ``n < 2**(16*r)``, ``r * p < 2 ** 30``.

    :param n: scrypt rounds
    :param r: scrypt block size
    :param p: scrypt parallel factor
    é   zr must be > 0: r=%rzp must be > 0: p=%rzr * p must be < 2**30: r=z, p=é   z%n must be > 1, and a power of 2: n=%rT)Ú
ValueErrorÚMAX_RP)ÚnÚrÚps      ú\/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/crypto/scrypt/__init__.pyr   r   )   s–   € ð 	ˆ1‚u€uÝÐ.°Ñ2Ñ3Ô3Ð3àˆ1‚u€uÝÐ.°Ñ2Ñ3Ô3Ð3àˆ1�u�v‚~€~õ ˆjÀÀÀÀ!À!ÐDÑEÔEÐEàˆ1‚u€u��Q˜‘U‘€uÝÐ@À1ÑDÑEÔEÐEàˆ4ó    é   çÍÌÌÌÌÌð?c                 ó\   — |d|z  d| dz   z  t           z  z   z  }t          ||z  ¦  «        }|S )a?  
    calculate memory required for parameter combination.
    assumes parameters have already been validated.

    .. warning::
        this is derived from OpenSSL's scrypt maxmem formula;
        and may not be correct for other implementations
        (additional buffers, different parallelism tradeoffs, etc).
    é€   é    r   )ÚUINT32_SIZEÚint)r   r   r   ÚfudgeÚmaxmems        r   Úestimate_maxmemr   H   s:   € ð" �#˜‘'˜B ! a¡%™L­;Ñ6Ñ6Ñ7€Få�˜%‘Ñ Ô €FØ€Mr   r   r   c                 óþ   — t          |||¦  «         t          | d¬¦  «        } t          |d¬¦  «        }|dk     rt          d¦  «        ‚|t          k    rt          dt          z  ¦  «        ‚t	          | |||||¦  «        S )a4  run SCrypt key derivation function using specified parameters.

    :arg secret:
        passphrase string (unicode is encoded to bytes using utf-8).

    :arg salt:
        salt string (unicode is encoded to bytes using utf-8).

    :arg n:
        integer 'N' parameter

    :arg r:
        integer 'r' parameter

    :arg p:
        integer 'p' parameter

    :arg keylen:
        number of bytes of key to generate.
        defaults to 32 (the internal block size).

    :returns:
        a *keylen*-sized bytes instance

    SCrypt imposes a number of constraints on it's input parameters:

    * ``r * p < 2**30`` -- due to a limitation of PBKDF2-HMAC-SHA256.
    * ``keylen < (2**32 - 1) * 32`` -- due to a limitation of PBKDF2-HMAC-SHA256.
    * ``n`` must a be a power of 2, and > 1 -- internal limitation of scrypt() implementation

    :raises ValueError: if the provided parameters are invalid (see constraints above).

    .. warning::

        Unless the third-party ``scrypt <https://pypi.python.org/pypi/scrypt/>``_ package
        is installed, passlib will use a builtin pure-python implementation of scrypt,
        which is *considerably* slower (and thus requires a much lower / less secure
        ``n`` value in order to be usuable). Installing the :mod:`!scrypt` package
        is strongly recommended.
    Úsecret)ÚparamÚsaltr   zkeylen must be at least 1zkeylen too large, must be <= %d)r   r   r   Ú
MAX_KEYLENÚ_scrypt)r    r"   r   r   r   Úkeylens         r   r	   r	   k   sŠ   € õR ˆQ��1ÑÔÐÝ�f HÐ-Ñ-Ô-€FÝ�D Ð'Ñ'Ô'€DØ�‚z€zÝÐ4Ñ5Ô5Ð5Ø•
ÒÐÝÐ:½ZÑGÑHÔHÐHÝ�6˜4  A q¨&Ñ1Ô1Ð1r   c                  ól   — t           rdnd} t          d| z  t          j        ¦  «         ddlm} |j        S )zD
    Load pure-python scrypt implementation built into passlib.
    é
   éd   z¦Using builtin scrypt backend, which is %dx slower than is required for adequate security. Installing scrypt support (via 'pip install scrypt') is strongly recommendedr   )ÚScryptEngine)r   r   r   ÚPasslibSecurityWarningÚ_builtinr)   Úexecute)Úslowdownr)   s     r   Ú_load_builtin_backendr.   ž   sW   € õ Ð"ˆrˆr˜s€HÝð 
#à%-ñ
.å/2Ô/IñKô Kð Kð 'Ð&Ð&Ð&Ð&Ð&ØÔÐr   c                  óü   — 	 ddl m}  | S # t          $ r Y nw xY w	 ddl }t          dt          j        ¦  «         nB# t          $ r5}dt          |¦  «        vrt          dt          j        ¦  «         Y d}~nd}~ww xY wdS )z�
    Try to import the ctypes-based scrypt hash function provided by the
    ``scrypt <https://pypi.python.org/pypi/scrypt/>``_ package.
    r   )ÚhashNz5'scrypt' package is too old (lacks ``hash()`` method)r	   zJ'scrypt' package failed to import correctly (possible installation issue?))r	   r0   ÚImportErrorr   r   ÚPasslibWarningÚstr)r0   r	   Úerrs      r   Ú_load_cffi_backendr5   ª   sÁ   € ð
ØÐÐÐÐÐØˆøÝð ð ð Øˆðøøøð
ZØˆˆˆõ 	ÐDÅcÔFXÑYÔYÐYÐYøõ ð %ð %ð %Ø�3˜s™8œ8Ð#Ð#õ Ð]ÝÔ#ñ%ô %ð %øøøøøøøøøð	%øøøð ˆ4s!   ‚
 Š
–›: º
A9Á+A4Á4A9c                  óD   ‡— 	 ddl mŠ n# t          $ r Y dS w xY wˆfd„} | S )zf
    Attempt to load stdlib scrypt() implement and return wrapper.
    Returns None if not found.
    r   )r	   Nc           	      ód   •— t           }|dk     rt          |||¦  «        } ‰| ||||||¬¦  «        S )Nr   )Úpasswordr"   r   r   r   Údklenr   )ÚSCRYPT_MAXMEMr   )r    r"   r   r   r   r%   r   Ústdlib_scrypts          €r   Ústdlib_scrypt_wrapperz3_load_stdlib_backend.<locals>.stdlib_scrypt_wrapperÎ   sL   ø€ õ ˆØ�AŠ:ˆ:Ý$ Q¨¨1Ñ-Ô-ˆFØˆ} f°4¸1ÀÀQÈfØ$*ð,ñ ,ô ,ð 	,r   )Úhashlibr	   r1   )r<   r;   s    @r   Ú_load_stdlib_backendr>   Ã   s`   ø€ ð
à3Ð3Ð3Ð3Ð3Ð3Ð3øÝð ð ð Øˆtˆtðøøøð,ð ,ð ,ð ,ð ,ð$ !Ð s   ƒ
 Š
—)Ústdlibr	   ÚbuiltinFc                 ó`  — | dk    rdS | dk    rFt           D ]*} 	 t          | |¬¦  «        c S # t          j        $ r Y Œ'w xY wt          j        d¦  «        ‚t                               | ¦  «        }|st          d| ›�¦  «        ‚ |¦   «         }|st          j        d| z  ¦  «        ‚|rdS | a|adS )zì
    set backend for scrypt(). if name not specified, loads first available.

    :raises ~passlib.exc.MissingBackendError: if backend can't be found

    .. note:: mainly intended to be called by unittests, and scrypt hash handler
    ÚanyNÚdefault©Údryrunzno scrypt backends availablezunknown scrypt backend: zscrypt backend %r not available)	Úbackend_valuesÚ_set_backendr   ÚMissingBackendErrorÚ_backend_loadersÚgetr   Úbackendr$   )ÚnamerE   Úloaderr0   s       r   rG   rG   î   sö   € ð ˆu‚}€}ØˆØ	�Ò	Ð	Ý"ð 	ð 	ˆDðÝ# D°Ð8Ñ8Ô8Ð8Ð8Ð8øÝÔ*ð ð ð Ø�ðøøøåÔ%Ð&DÑEÔEÐEå!×%Ò% dÑ+Ô+ˆØð 	EÝ�*¸T¸TÐCÑDÔDÐDØˆv‰xŒxˆØð 	TÝÔ)Ð*KÈdÑ*RÑSÔSÐSØð 	ØˆFàˆØˆˆˆs   ™,¬>½>rC   c                 óV   — 	 t          | d¬¦  «         dS # t          j        $ r Y dS w xY w)NTrD   F)rG   r   rH   )rL   s    r   Ú_has_backendrO     sD   € ðÝ�T $Ð'Ñ'Ô'Ð'ØˆtøÝÔ"ð ð ð Øˆuˆuðøøøs   ‚ •(§()r   )r   r   )F)!Ú__doc__Ú
__future__r   ÚloggingÚ	getLoggerÚ__name__ÚlogÚwarningsr   Úpasslibr   Úpasslib.utilsr   Úpasslib.utils.compatr   Ú__all__r:   r#   r   r   r   r   r$   rK   r	   r.   r5   r>   rF   ÚdictrI   rG   rO   © r   r   ú<module>r]      s�  ððð ð 'Ð &Ð &Ð &Ð &Ð &à €€€Ð'�gÔ'¨Ñ1Ô1�Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ø %Ð %Ð %Ð %Ð %Ð %ð Øð
€ð €ð "€
ð 
€ðð ð ð8 €ðð ð ð ð< €ð €ð02ð 02ð 02ð 02ðf	 ð 	 ð 	 ðð ð ð2!ð !ð !ðB 1€ð �4ØØØ!ðñ ô Ð ðð ð ð ð> €ˆYÑ Ô Ð ðð ð ð ð r   