Commit 127b461b authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

[py3] Ported django.utils.crypto.

parent b55e0777
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ def salted_hmac(key_salt, value, secret=None):
    # line is redundant and could be replaced by key = key_salt + secret, since
    # the hmac module does the same thing for keys longer than the block size.
    # However, we need to ensure that we *always* do this.
    return hmac.new(key, msg=value, digestmod=hashlib.sha1)
    return hmac.new(key, msg=smart_bytes(value), digestmod=hashlib.sha1)


def get_random_string(length=12,
@@ -99,7 +99,7 @@ def _bin_to_long(x):

    This is a clever optimization for fast xor vector math
    """
    return int(x.encode('hex'), 16)
    return int(binascii.hexlify(x), 16)


def _long_to_bin(x, hex_format_string):
@@ -112,13 +112,14 @@ def _long_to_bin(x, hex_format_string):

def _fast_hmac(key, msg, digest):
    """
    A trimmed down version of Python's HMAC implementation
    A trimmed down version of Python's HMAC implementation.

    This function operates on bytes.
    """
    dig1, dig2 = digest(), digest()
    key = smart_bytes(key)
    if len(key) > dig1.block_size:
        key = digest(key).digest()
    key += chr(0) * (dig1.block_size - len(key))
    key += b'\x00' * (dig1.block_size - len(key))
    dig1.update(key.translate(_trans_36))
    dig1.update(msg)
    dig2.update(key.translate(_trans_5c))
+16 −12
Original line number Diff line number Diff line
from __future__ import unicode_literals

import binascii
import math
import timeit
import hashlib
@@ -111,7 +113,7 @@ class TestUtilsCryptoPBKDF2(unittest.TestCase):
        # Check leading zeros are not stripped (#17481)
        {
            "args": {
                "password": chr(186), 
                "password": b'\xba',
                "salt": "salt",
                "iterations": 1,
                "dklen": 20,
@@ -124,12 +126,14 @@ class TestUtilsCryptoPBKDF2(unittest.TestCase):
    def test_public_vectors(self):
        for vector in self.rfc_vectors:
            result = pbkdf2(**vector['args'])
            self.assertEqual(result.encode('hex'), vector['result'])
            self.assertEqual(binascii.hexlify(result).decode('ascii'),
                             vector['result'])

    def test_regression_vectors(self):
        for vector in self.regression_vectors:
            result = pbkdf2(**vector['args'])
            self.assertEqual(result.encode('hex'), vector['result'])
            self.assertEqual(binascii.hexlify(result).decode('ascii'),
                             vector['result'])

    def test_performance_scalability(self):
        """