Ë
    àU.jž%  ã                   óð   — 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 y)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        kD  rt        d|›d|›�«      ‚| dk  s| | dz
  z  rt        d| z  «      ‚y)	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      ú`C:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\passlib/crypto/scrypt/__init__.pyr   r   )   sv   € ð 	ˆ1‚uÜÐ.°Ñ2Ó3Ð3àˆ1‚uÜÐ.°Ñ2Ó3Ð3àˆ1�uŒv‚~õ ÂÁ!ÐDÓEÐEàˆ1‚u��Q˜‘U’ÜÐ@À1ÑDÓEÐEàó    é   c                 óR   — |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   s7   € ð" �#˜‘'˜B ! a¡%™L¬;Ñ6Ñ6Ñ7€Fä�˜%‘Ó €FØ€Mr   c                 óÆ   — t        |||«       t        | d¬«      } t        |d¬«      }|dk  rt        d«      ‚|t        kD  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   sj   € ôR ˆQ��1ÔÜ�f HÔ-€FÜ�D Ô'€DØ�‚zÜÐ4Ó5Ð5Ø”
ÒÜÐ:¼ZÑGÓHÐHÜ�6˜4  A q¨&Ó1Ð1r   c                  ót   — 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-   ž   s=   € õ ‰r˜s€HÜð 
#à%-ñ
.ä/2×/IÑ/IôKõ 'Ø×ÑÐr   c                  óì   — 	 ddl m}  | S # t        $ r Y nw xY w	 ddl }t        dt        j
                  «       y# t        $ r1}dt        |«      vrt        dt        j
                  «       Y d}~yd}~ww xY w)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	   r/   ÚImportErrorr   r   ÚPasslibWarningÚstr)r/   r	   Úerrs      r   Ú_load_cffi_backendr4   ª   sz   € ð
ÝØˆøÜò Ùðúð
ZÛô 	ÐDÄc×FXÑFXÔYØøô ò %Øœ3˜s›8Ñ#ô Ð]Ü×#Ñ#ô%ûð
 ûð%ús!   ‚
 Š	•š9 ¹	A3Á'A.Á.A3c                  ó>   ‡— 	 ddl mŠ ˆfd„} | S # t        $ r Y yw xY w)zf
    Attempt to load stdlib scrypt() implement and return wrapper.
    Returns None if not found.
    r   )r	   Nc           	      óR   •— 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Î   s;   ø€ ô ˆØ�AŠ:Ü$ Q¨¨1Ó-ˆFÙ f°4¸1ÀÀQÈfØ$*ô,ð 	,r   )Úhashlibr	   r0   )r;   r:   s    @r   Ú_load_stdlib_backendr=   Ã   s,   ø€ ð
å3ô,ð$ !Ð øô+ ò Ùðús   ƒ �	›)Ústdlibr	   Úbuiltinc                 óD  — | dk(  ry| dk(  r/t         D ]  } 	 t        | |¬«      c S  t        j                  d«      ‚t        j                  | «      }|st        d| ›�«      ‚ |«       }|st        j                  d| z  «      ‚|ry| a|ay# t        j                  $ r Y ŒŒw xY w)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#   )ÚnamerD   Úloaderr/   s       r   rF   rF   î   s²   € ð ˆu‚}ØØ	�Ò	ß"ˆDðÜ# D°Ô8Ò8ð #ô
 ×%Ñ%Ð&DÓEÐEä!×%Ñ% dÓ+ˆÙÝ¹TÐCÓDÐDÙ‹xˆÙÜ×)Ñ)Ð*KÈdÑ*RÓSÐSÙØàˆØ‰øô ×*Ñ*ò Ùðús   –B	Â	BÂBrB   c                 óR   — 	 t        | d¬«       y# t        j                  $ r Y yw xY w)NTrC   F)rF   r   rG   )rK   s    r   Ú_has_backendrN     s,   € ðÜ�T $Õ'ØøÜ×"Ñ"ò Ùðús   ‚ �&¥&)gÍÌÌÌÌÌð?)r   r   )F)!Ú__doc__Ú
__future__r   ÚloggingÚ	getLoggerÚ__name__ÚlogÚwarningsr   Úpasslibr   Úpasslib.utilsr   Úpasslib.utils.compatr   Ú__all__r9   r"   r   r   r   r   r#   rJ   r	   r-   r4   r=   rE   ÚdictrH   rF   rN   © r   r   Ú<module>r\      sº   ðñõ 'ã Ð'�g×'Ñ'¨Ó1�Ý å Ý "Ý %ð Øð
€ð €ð "€
ð 
€òð8 €óð< €ð €ó02òf	 òò2!ðB 1€ñ ØØØ!ôÐ óñ> ˆYÔ ór   