diff options
Diffstat (limited to 'tests/auth_tests')
| -rw-r--r-- | tests/auth_tests/test_hashers.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/auth_tests/test_hashers.py b/tests/auth_tests/test_hashers.py index ecd3f276a9..a43c170ec1 100644 --- a/tests/auth_tests/test_hashers.py +++ b/tests/auth_tests/test_hashers.py @@ -25,6 +25,11 @@ try: except ImportError: bcrypt = None +try: + import argon2 +except ImportError: + argon2 = None + class PBKDF2SingleIterationHasher(PBKDF2PasswordHasher): iterations = 1 @@ -434,3 +439,58 @@ class TestUtilsHashPass(SimpleTestCase): with six.assertRaisesRegex(self, ValueError, "Couldn't load 'PlainHasher' algorithm library: No module named '?plain'?"): PlainHasher()._load_library() + + +@skipUnless(argon2, "argon2-cffi not installed") +@override_settings(PASSWORD_HASHERS=PASSWORD_HASHERS) +class TestUtilsHashPassArgon2(SimpleTestCase): + + def test_argon2(self): + encoded = make_password('lètmein', hasher='argon2') + self.assertTrue(is_password_usable(encoded)) + self.assertTrue(encoded.startswith('argon2$')) + self.assertTrue(check_password('lètmein', encoded)) + self.assertFalse(check_password('lètmeinz', encoded)) + self.assertEqual(identify_hasher(encoded).algorithm, 'argon2') + # Blank passwords + blank_encoded = make_password('', hasher='argon2') + self.assertTrue(blank_encoded.startswith('argon2$')) + self.assertTrue(is_password_usable(blank_encoded)) + self.assertTrue(check_password('', blank_encoded)) + self.assertFalse(check_password(' ', blank_encoded)) + + def test_argon2_upgrade(self): + self._test_argon2_upgrade('time_cost', 'time cost', 1) + self._test_argon2_upgrade('memory_cost', 'memory cost', 16) + self._test_argon2_upgrade('parallelism', 'parallelism', 1) + + def _test_argon2_upgrade(self, attr, summary_key, new_value): + hasher = get_hasher('argon2') + self.assertEqual('argon2', hasher.algorithm) + self.assertNotEqual(getattr(hasher, attr), new_value) + + old_value = getattr(hasher, attr) + try: + # Generate hash with attr set to 1 + setattr(hasher, attr, new_value) + encoded = make_password('letmein', hasher='argon2') + attr_value = hasher.safe_summary(encoded)[summary_key] + self.assertEqual(attr_value, new_value) + + state = {'upgraded': False} + + def setter(password): + state['upgraded'] = True + + # Check that no upgrade is triggered. + self.assertTrue(check_password('letmein', encoded, setter, 'argon2')) + self.assertFalse(state['upgraded']) + + # Revert to the old rounds count and ... + setattr(hasher, attr, old_value) + + # ... check if the password would get updated to the new count. + self.assertTrue(check_password('letmein', encoded, setter, 'argon2')) + self.assertTrue(state['upgraded']) + finally: + setattr(hasher, attr, old_value) |
