From 8ecba51ea0e3a70a6cb0d823acc6f660007081dc Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Mon, 4 Nov 2013 09:45:27 -0800 Subject: [PATCH] Simplify (and very very slightly speed up) the pbkdf2 implementation --- django/utils/crypto.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/django/utils/crypto.py b/django/utils/crypto.py index 14c1df82f2..bef7b2cc4f 100644 --- a/django/utils/crypto.py +++ b/django/utils/crypto.py @@ -152,15 +152,15 @@ def pbkdf2(password, salt, iterations, dklen=0, digest=None): outer.update(password.translate(hmac.trans_5C)) def F(i): - def U(): - u = salt + struct.pack(b'>I', i) - for j in xrange(int(iterations)): - dig1, dig2 = inner.copy(), outer.copy() - dig1.update(u) - dig2.update(dig1.digest()) - u = dig2.digest() - yield _bin_to_long(u) - return _long_to_bin(reduce(operator.xor, U()), hex_format_string) + u = salt + struct.pack(b'>I', i) + result = 0 + for j in xrange(int(iterations)): + dig1, dig2 = inner.copy(), outer.copy() + dig1.update(u) + dig2.update(dig1.digest()) + u = dig2.digest() + result ^= _bin_to_long(u) + return _long_to_bin(result, hex_format_string) - T = [F(x) for x in range(1, l + 1)] - return b''.join(T[:-1]) + T[-1][:r] + T = [F(x) for x in range(1, l)] + return b''.join(T) + F(l)[:r]