
    g                         S r SSKJr  SSKr\R                  " \5      rSSKJr  SSK	J
r
  SSKJr  SSKJrJrJrJrJr  / SQrSS	KJr  \" S
\5        \
" SS\SS9" \5      r0 qSrS rSS jrSS jrg)zpasslib.pbkdf2 - PBKDF2 support

this module is getting increasingly poorly named.
maybe rename to "kdf" since it's getting more key derivation functions added.
    )divisionN)ExpectedTypeError)deprecated_function)native_string_types)norm_hash_namelookup_hashpbkdf1pbkdf2_hmaccompile_hmac)r   get_prfr	   pbkdf2)warnzthe module 'passlib.utils.pbkdf2' is deprecated as of Passlib 1.7, and will be removed in Passlib 2.0, please use 'passlib.crypto' insteadz1.7z1.8z$passlib.crypto.digest.norm_hash_name)
deprecatedremovedfunc_modulereplacement)hmac_zhmac-c                   ^ U [         ;   a	  [         U    $ [        U [        5      (       a_  U R                  [        5      (       d  [        SU < 35      e[        U SS 5      R                  mU4S jnXR                  R                  4nO3[        U 5      (       a  [        U " SS5      5      nX4nO[        U SS5      eU[         U '   U$ )	a  Lookup pseudo-random family (PRF) by name.

:arg name:
    This must be the name of a recognized prf.
    Currently this only recognizes names with the format
    :samp:`hmac-{digest}`, where :samp:`{digest}`
    is the name of a hash function such as
    ``md5``, ``sha256``, etc.

    todo: restore text about callables.

:raises ValueError: if the name is not known
:raises TypeError: if the name is not a callable or string

:returns:
    a tuple of :samp:`({prf_func}, {digest_size})`, where:

    * :samp:`{prf_func}` is a function implementing
      the specified PRF, and has the signature
      ``prf_func(secret, message) -> digest``.

    * :samp:`{digest_size}` is an integer indicating
      the number of bytes the function returns.

Usage example::

    >>> from passlib.utils.pbkdf2 import get_prf
    >>> hmac_sha256, dsize = get_prf("hmac-sha256")
    >>> hmac_sha256
    <function hmac_sha256 at 0x1e37c80>
    >>> dsize
    32
    >>> digest = hmac_sha256('password', 'message')

.. deprecated:: 1.7

    This function is deprecated, and will be removed in Passlib 2.0.
    This only related replacement is :func:`passlib.crypto.digest.compile_hmac`.
zunknown prf algorithm:    Nc                 (   > [        TU 5      " U5      $ )N)r   )keymsgdigests     M/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/utils/pbkdf2.pyhmacget_prf.<locals>.hmach   s    ,S11       x   yzstr or callablezprf name)
_prf_cache
isinstancer   
startswith_HMAC_PREFIXES
ValueErrorr   namedigest_infodigest_sizecallablelenr   )r%   r   recordr'   r   s       @r   r   r   9   s    R z$$+,,~..DBCCT!"X&++	2((445	$$tT*+$&7DDJtMr   c                     [        X@XU5      $ )a  pkcs#5 password-based key derivation v1.5

:arg secret: passphrase to use to generate key
:arg salt: salt string to use when generating key
:param rounds: number of rounds to use to generate key
:arg keylen: number of bytes to generate (if ``None``, uses digest's native size)
:param hash:
    hash function to use. must be name of a hash recognized by hashlib.

:returns:
    raw bytes of generated key

.. note::

    This algorithm has been deprecated, new code should use PBKDF2.
    Among other limitations, ``keylen`` cannot be larger
    than the digest size of the specified hash.

.. deprecated:: 1.7

    This has been relocated to :func:`passlib.crypto.digest.pbkdf1`,
    and this version will be removed in Passlib 2.0.
    *Note the call signature has changed.*
)_pbkdf1)secretsaltroundskeylenhashs        r   r	   r	   w   s    2 4v66r   c                     [        U5      (       d/  [        U[        5      (       a%  UR                  [        5      (       d  [        S5      eUSS n[        XPXU5      $ )a  pkcs#5 password-based key derivation v2.0

:arg secret:
    passphrase to use to generate key

:arg salt:
    salt string to use when generating key

:param rounds:
    number of rounds to use to generate key

:arg keylen:
    number of bytes to generate.
    if set to ``None``, will use digest size of selected prf.

:param prf:
    psuedo-random family to use for key strengthening.
    this must be a string starting with ``"hmac-"``, followed by the name of a known digest.
    this defaults to ``"hmac-sha1"`` (the only prf explicitly listed in
    the PBKDF2 specification)

    .. rst-class:: warning

    .. versionchanged 1.7:

        This argument no longer supports arbitrary PRF callables --
        These were rarely / never used, and created too many unwanted codepaths.

:returns:
    raw bytes of generated key

.. deprecated:: 1.7

    This has been deprecated in favor of :func:`passlib.crypto.digest.pbkdf2_hmac`,
    and will be removed in Passlib 2.0.  *Note the call signature has changed.*
z1non-HMAC prfs are not supported as of Passlib 1.7r   N)r(   r!   r   r"   r#   NotImplementedErrorr
   )r-   r.   r/   r0   prfr   s         r   r   r      sP    J }}C)<==cnnUcFdFd!"UVVWFvtV<<r   )Nsha1)Nz	hmac-sha1)__doc__
__future__r   logging	getLogger__name__logpasslib.excr   passlib.utils.decorr   passlib.utils.compatr   passlib.crypto.digestr   r   r	   r,   r
   r   __all__warningsr   DeprecationWarningr    r#   r   r    r   r   <module>rD      s      g''1 * 3 4 k k
   O %uRZ688FH 
 $9|7<(=r   