blob: d9189fc6f28b473bde40bb9cd34bdf22c7225d41 [file] [log] [blame]
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +03001import sys
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003import unittest
R. David Murraya21e4ca2009-03-31 23:16:50 +00004
Ezio Melottifbd26862013-03-01 14:53:45 +02005crypt = support.import_module('crypt')
Roger E. Massefab8ab81996-12-20 22:36:52 +00006
Christian Heimesdd15f6c2008-03-16 00:07:10 +00007class CryptTestCase(unittest.TestCase):
8
9 def test_crypt(self):
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030010 cr = crypt.crypt('mypassword')
11 cr2 = crypt.crypt('mypassword', cr)
12 self.assertEqual(cr2, cr)
13 cr = crypt.crypt('mypassword', 'ab')
14 if cr is not None:
15 cr2 = crypt.crypt('mypassword', cr)
16 self.assertEqual(cr2, cr)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000017
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000018 def test_salt(self):
Brett Cannondaa57992011-02-22 21:48:06 +000019 self.assertEqual(len(crypt._saltchars), 64)
20 for method in crypt.methods:
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000021 salt = crypt.mksalt(method)
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030022 self.assertIn(len(salt) - method.salt_chars, {0, 1, 3, 4, 6, 7})
23 if method.ident:
24 self.assertIn(method.ident, salt[:len(salt)-method.salt_chars])
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000025
26 def test_saltedcrypt(self):
Brett Cannondaa57992011-02-22 21:48:06 +000027 for method in crypt.methods:
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030028 cr = crypt.crypt('assword', method)
29 self.assertEqual(len(cr), method.total_size)
30 cr2 = crypt.crypt('assword', cr)
31 self.assertEqual(cr2, cr)
32 cr = crypt.crypt('assword', crypt.mksalt(method))
33 self.assertEqual(len(cr), method.total_size)
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000034
35 def test_methods(self):
Brett Cannondaa57992011-02-22 21:48:06 +000036 self.assertTrue(len(crypt.methods) >= 1)
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030037 if sys.platform.startswith('openbsd'):
38 self.assertEqual(crypt.methods, [crypt.METHOD_BLOWFISH])
39 else:
40 self.assertEqual(crypt.methods[-1], crypt.METHOD_CRYPT)
41
Serhiy Storchakacede8c92017-11-16 13:22:51 +020042 @unittest.skipUnless(crypt.METHOD_SHA256 in crypt.methods or
43 crypt.METHOD_SHA512 in crypt.methods,
44 'requires support of SHA-2')
45 def test_sha2_rounds(self):
46 for method in (crypt.METHOD_SHA256, crypt.METHOD_SHA512):
47 for rounds in 1000, 10_000, 100_000:
48 salt = crypt.mksalt(method, rounds=rounds)
49 self.assertIn('$rounds=%d$' % rounds, salt)
50 self.assertEqual(len(salt) - method.salt_chars,
51 11 + len(str(rounds)))
52 cr = crypt.crypt('mypassword', salt)
53 self.assertTrue(cr)
54 cr2 = crypt.crypt('mypassword', cr)
55 self.assertEqual(cr2, cr)
56
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030057 @unittest.skipUnless(crypt.METHOD_BLOWFISH in crypt.methods,
58 'requires support of Blowfish')
Serhiy Storchakacede8c92017-11-16 13:22:51 +020059 def test_blowfish_rounds(self):
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030060 for log_rounds in range(4, 11):
Serhiy Storchakacede8c92017-11-16 13:22:51 +020061 salt = crypt.mksalt(crypt.METHOD_BLOWFISH, rounds=1 << log_rounds)
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030062 self.assertIn('$%02d$' % log_rounds, salt)
63 self.assertIn(len(salt) - crypt.METHOD_BLOWFISH.salt_chars, {6, 7})
64 cr = crypt.crypt('mypassword', salt)
65 self.assertTrue(cr)
66 cr2 = crypt.crypt('mypassword', cr)
67 self.assertEqual(cr2, cr)
68
Serhiy Storchakacede8c92017-11-16 13:22:51 +020069 def test_invalid_rounds(self):
70 for method in (crypt.METHOD_SHA256, crypt.METHOD_SHA512,
71 crypt.METHOD_BLOWFISH):
72 with self.assertRaises(TypeError):
73 crypt.mksalt(method, rounds='4096')
74 with self.assertRaises(TypeError):
75 crypt.mksalt(method, rounds=4096.0)
76 for rounds in (0, 1, -1, 1<<999):
77 with self.assertRaises(ValueError):
78 crypt.mksalt(method, rounds=rounds)
79 with self.assertRaises(ValueError):
80 crypt.mksalt(crypt.METHOD_BLOWFISH, rounds=1000)
81 for method in (crypt.METHOD_CRYPT, crypt.METHOD_MD5):
82 with self.assertRaisesRegex(ValueError, 'support'):
83 crypt.mksalt(method, rounds=4096)
Serhiy Storchakaeab3ff72017-10-24 19:36:17 +030084
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000085
Christian Heimesdd15f6c2008-03-16 00:07:10 +000086if __name__ == "__main__":
Ezio Melotti90bbbd12013-01-11 05:18:45 +020087 unittest.main()