Commit cb68eb3e authored by Alex Gaynor's avatar Alex Gaynor
Browse files

Use the stdlib's PBKDF2 implementation when available.

This is a bit faster than ours, which is good, because it lets you increase
the iteration counts.

This will be used on Python 3.4+, and, pending the acceptance of PEP466, on
newer Python 2.7s.
parent 47927eb7
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -15,9 +15,10 @@ class ExpressionNode(tree.Node):
    MUL = '*'
    DIV = '/'
    POW = '^'
    MOD = '%%'  # This is a quoted % operator - it is quoted
    # This is a quoted % operator - it is quoted
    # because it can be used in strings that also
    # have parameter substitution.
    MOD = '%%'

    # Bitwise operators - note that these are generated by .bitand()
    # and .bitor(), the '&' and '|' are reserved for boolean operator
+65 −48
Original line number Diff line number Diff line
@@ -117,6 +117,23 @@ def _long_to_bin(x, hex_format_string):
    return binascii.unhexlify((hex_format_string % x).encode('ascii'))


if hasattr(hashlib, "pbkdf2_hmac"):
    def pbkdf2(password, salt, iterations, dklen=0, digest=None):
        """
        Implements PBDF2 with the same API as Django's existing implementation,
        using the stdlib.

        This is used in Python 3.4 and up.
        """
        if digest is None:
            digest = hashlib.sha256
        if not dklen:
            dklen = None
        password = force_bytes(password)
        salt = force_bytes(salt)
        return hashlib.pbkdf2_hmac(
            digest().name, password, salt, iterations, dklen)
else:
    def pbkdf2(password, salt, iterations, dklen=0, digest=None):
        """
        Implements PBKDF2 as defined in RFC 2898, section 5.2