diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-10-24 16:36:17 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-24 16:36:17 (GMT) |
commit | eab3ff72ebe79416cc032b8508ae13332955a157 (patch) | |
tree | aa3c36c6d3cfc0720d1755d9d9a558c6dc86bad6 /Lib/test/test_crypt.py | |
parent | 831d61d56c5b0f15cfcfd5083638aa111cddb72b (diff) | |
download | cpython-eab3ff72ebe79416cc032b8508ae13332955a157.zip cpython-eab3ff72ebe79416cc032b8508ae13332955a157.tar.gz cpython-eab3ff72ebe79416cc032b8508ae13332955a157.tar.bz2 |
bpo-31664: Add support for the Blowfish method in crypt. (#3854)
Diffstat (limited to 'Lib/test/test_crypt.py')
-rw-r--r-- | Lib/test/test_crypt.py | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py index e4f5897..8db1aef 100644 --- a/Lib/test/test_crypt.py +++ b/Lib/test/test_crypt.py @@ -1,3 +1,4 @@ +import sys from test import support import unittest @@ -6,28 +7,58 @@ crypt = support.import_module('crypt') class CryptTestCase(unittest.TestCase): def test_crypt(self): - c = crypt.crypt('mypassword', 'ab') - if support.verbose: - print('Test encryption: ', c) + cr = crypt.crypt('mypassword') + cr2 = crypt.crypt('mypassword', cr) + self.assertEqual(cr2, cr) + cr = crypt.crypt('mypassword', 'ab') + if cr is not None: + cr2 = crypt.crypt('mypassword', cr) + self.assertEqual(cr2, cr) def test_salt(self): self.assertEqual(len(crypt._saltchars), 64) for method in crypt.methods: salt = crypt.mksalt(method) - self.assertEqual(len(salt), - method.salt_chars + (3 if method.ident else 0)) + self.assertIn(len(salt) - method.salt_chars, {0, 1, 3, 4, 6, 7}) + if method.ident: + self.assertIn(method.ident, salt[:len(salt)-method.salt_chars]) def test_saltedcrypt(self): for method in crypt.methods: - pw = crypt.crypt('assword', method) - self.assertEqual(len(pw), method.total_size) - pw = crypt.crypt('assword', crypt.mksalt(method)) - self.assertEqual(len(pw), method.total_size) + cr = crypt.crypt('assword', method) + self.assertEqual(len(cr), method.total_size) + cr2 = crypt.crypt('assword', cr) + self.assertEqual(cr2, cr) + cr = crypt.crypt('assword', crypt.mksalt(method)) + self.assertEqual(len(cr), method.total_size) def test_methods(self): - # Guarantee that METHOD_CRYPT is the last method in crypt.methods. self.assertTrue(len(crypt.methods) >= 1) - self.assertEqual(crypt.METHOD_CRYPT, crypt.methods[-1]) + if sys.platform.startswith('openbsd'): + self.assertEqual(crypt.methods, [crypt.METHOD_BLOWFISH]) + else: + self.assertEqual(crypt.methods[-1], crypt.METHOD_CRYPT) + + @unittest.skipUnless(crypt.METHOD_BLOWFISH in crypt.methods, + 'requires support of Blowfish') + def test_log_rounds(self): + self.assertEqual(len(crypt._saltchars), 64) + for log_rounds in range(4, 11): + salt = crypt.mksalt(crypt.METHOD_BLOWFISH, log_rounds=log_rounds) + self.assertIn('$%02d$' % log_rounds, salt) + self.assertIn(len(salt) - crypt.METHOD_BLOWFISH.salt_chars, {6, 7}) + cr = crypt.crypt('mypassword', salt) + self.assertTrue(cr) + cr2 = crypt.crypt('mypassword', cr) + self.assertEqual(cr2, cr) + + @unittest.skipUnless(crypt.METHOD_BLOWFISH in crypt.methods, + 'requires support of Blowfish') + def test_invalid_log_rounds(self): + for log_rounds in (1, -1, 999): + salt = crypt.mksalt(crypt.METHOD_BLOWFISH, log_rounds=log_rounds) + self.assertIsNone(crypt.crypt('mypassword', salt)) + if __name__ == "__main__": unittest.main() |