| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  SelfTest/Hash/common.py: Common code for Crypto.SelfTest.Hash | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2009-02-28 13:24:04 -05:00
										 |  |  | # Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2009-02-28 13:24:04 -05:00
										 |  |  | # =================================================================== | 
					
						
							|  |  |  | # The contents of this file are dedicated to the public domain.  To | 
					
						
							|  |  |  | # the extent that dedication to the public domain is not available, | 
					
						
							|  |  |  | # everyone is granted a worldwide, perpetual, royalty-free, | 
					
						
							|  |  |  | # non-exclusive license to exercise all rights associated with the | 
					
						
							|  |  |  | # contents of this file for any purpose whatsoever. | 
					
						
							|  |  |  | # No rights are reserved. | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2009-02-28 13:24:04 -05:00
										 |  |  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
					
						
							|  |  |  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
					
						
							|  |  |  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
					
						
							|  |  |  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | 
					
						
							|  |  |  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | 
					
						
							|  |  |  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | 
					
						
							|  |  |  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
					
						
							|  |  |  | # SOFTWARE. | 
					
						
							|  |  |  | # =================================================================== | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | """Self-testing for PyCrypto hash modules""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __revision__ = "$Id$" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-14 15:20:19 -04:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | import unittest | 
					
						
							|  |  |  | import binascii | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  | from Crypto.Util.py3compat import * | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-14 15:20:19 -04:00
										 |  |  | # For compatibility with Python 2.1 and Python 2.2 | 
					
						
							|  |  |  | if sys.hexversion < 0x02030000: | 
					
						
							|  |  |  |     # Python 2.1 doesn't have a dict() function | 
					
						
							|  |  |  |     # Python 2.2 dict() function raises TypeError if you do dict(MD5='blah') | 
					
						
							|  |  |  |     def dict(**kwargs): | 
					
						
							|  |  |  |         return kwargs.copy() | 
					
						
							|  |  |  | else: | 
					
						
							| 
									
										
										
										
											2011-10-10 23:57:42 -04:00
										 |  |  |     dict = dict | 
					
						
							| 
									
										
										
										
											2008-09-14 15:20:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-16 22:41:21 +02:00
										 |  |  | class HashDigestSizeSelfTest(unittest.TestCase): | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     def __init__(self, hashmod, description, expected): | 
					
						
							|  |  |  |         unittest.TestCase.__init__(self) | 
					
						
							|  |  |  |         self.hashmod = hashmod | 
					
						
							|  |  |  |         self.expected = expected | 
					
						
							|  |  |  |         self.description = description | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |     def shortDescription(self): | 
					
						
							|  |  |  |         return self.description | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def runTest(self): | 
					
						
							|  |  |  |         self.failUnless(hasattr(self.hashmod, "digest_size")) | 
					
						
							|  |  |  |         self.assertEquals(self.hashmod.digest_size, self.expected) | 
					
						
							|  |  |  |         h = self.hashmod.new() | 
					
						
							|  |  |  |         self.failUnless(hasattr(h, "digest_size")) | 
					
						
							|  |  |  |         self.assertEquals(h.digest_size, self.expected) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | class HashSelfTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, hashmod, description, expected, input): | 
					
						
							|  |  |  |         unittest.TestCase.__init__(self) | 
					
						
							|  |  |  |         self.hashmod = hashmod | 
					
						
							|  |  |  |         self.expected = expected | 
					
						
							|  |  |  |         self.input = input | 
					
						
							|  |  |  |         self.description = description | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def shortDescription(self): | 
					
						
							|  |  |  |         return self.description | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def runTest(self): | 
					
						
							|  |  |  |         h = self.hashmod.new() | 
					
						
							|  |  |  |         h.update(self.input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         out1 = binascii.b2a_hex(h.digest()) | 
					
						
							|  |  |  |         out2 = h.hexdigest() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         h = self.hashmod.new(self.input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         out3 = h.hexdigest() | 
					
						
							|  |  |  |         out4 = binascii.b2a_hex(h.digest()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  |         # PY3K: hexdigest() should return str(), and digest() bytes  | 
					
						
							| 
									
										
										
										
											2008-11-23 16:37:17 -05:00
										 |  |  |         self.assertEqual(self.expected, out1)   # h = .new(); h.update(data); h.digest() | 
					
						
							| 
									
										
										
										
											2010-12-29 13:21:05 -05:00
										 |  |  |         if sys.version_info[0] == 2: | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  |             self.assertEqual(self.expected, out2)   # h = .new(); h.update(data); h.hexdigest() | 
					
						
							|  |  |  |             self.assertEqual(self.expected, out3)   # h = .new(data); h.hexdigest() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.assertEqual(self.expected.decode(), out2)   # h = .new(); h.update(data); h.hexdigest() | 
					
						
							|  |  |  |             self.assertEqual(self.expected.decode(), out3)   # h = .new(data); h.hexdigest() | 
					
						
							| 
									
										
										
										
											2008-11-23 16:37:17 -05:00
										 |  |  |         self.assertEqual(self.expected, out4)   # h = .new(data); h.digest() | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-07 22:32:49 +01:00
										 |  |  |         # Verify that new() object method produces a fresh hash object | 
					
						
							|  |  |  |         h2 = h.new() | 
					
						
							|  |  |  |         h2.update(self.input) | 
					
						
							|  |  |  |         out5 = binascii.b2a_hex(h2.digest()) | 
					
						
							|  |  |  |         self.assertEqual(self.expected, out5) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 01:22:13 +01:00
										 |  |  | class HashTestOID(unittest.TestCase): | 
					
						
							|  |  |  |     def __init__(self, hashmod, oid): | 
					
						
							|  |  |  |         unittest.TestCase.__init__(self) | 
					
						
							|  |  |  |         self.hashmod = hashmod | 
					
						
							|  |  |  |         self.oid = oid | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def runTest(self): | 
					
						
							|  |  |  |         h = self.hashmod.new() | 
					
						
							|  |  |  |         if self.oid==None: | 
					
						
							| 
									
										
										
										
											2011-02-03 19:34:47 +01:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 raised = 0 | 
					
						
							|  |  |  |                 a = h.oid | 
					
						
							|  |  |  |             except AttributeError: | 
					
						
							|  |  |  |                 raised = 1 | 
					
						
							|  |  |  |             self.assertEqual(raised,1) | 
					
						
							| 
									
										
										
										
											2011-02-03 01:22:13 +01:00
										 |  |  |         else: | 
					
						
							|  |  |  |             self.assertEqual(h.oid, self.oid) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  | class MACSelfTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, hashmod, description, expected_dict, input, key, hashmods): | 
					
						
							|  |  |  |         unittest.TestCase.__init__(self) | 
					
						
							|  |  |  |         self.hashmod = hashmod | 
					
						
							|  |  |  |         self.expected_dict = expected_dict | 
					
						
							|  |  |  |         self.input = input | 
					
						
							|  |  |  |         self.key = key | 
					
						
							|  |  |  |         self.hashmods = hashmods | 
					
						
							|  |  |  |         self.description = description | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def shortDescription(self): | 
					
						
							|  |  |  |         return self.description | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def runTest(self): | 
					
						
							|  |  |  |         for hashname in self.expected_dict.keys(): | 
					
						
							|  |  |  |             hashmod = self.hashmods[hashname] | 
					
						
							| 
									
										
										
										
											2011-10-10 15:21:35 -04:00
										 |  |  |             key = binascii.a2b_hex(b(self.key)) | 
					
						
							|  |  |  |             data = binascii.a2b_hex(b(self.input)) | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # Strip whitespace from the expected string (which should be in lowercase-hex) | 
					
						
							| 
									
										
										
										
											2011-04-21 18:47:23 +02:00
										 |  |  |             expected = b("".join(self.expected_dict[hashname].split())) | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             h = self.hashmod.new(key, digestmod=hashmod) | 
					
						
							|  |  |  |             h.update(data) | 
					
						
							|  |  |  |             out1 = binascii.b2a_hex(h.digest()) | 
					
						
							|  |  |  |             out2 = h.hexdigest() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             h = self.hashmod.new(key, data, hashmod) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             out3 = h.hexdigest() | 
					
						
							|  |  |  |             out4 = binascii.b2a_hex(h.digest()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-20 12:03:37 -04:00
										 |  |  |             # Test .copy() | 
					
						
							|  |  |  |             h2 = h.copy() | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  |             h.update(b("blah blah blah"))  # Corrupt the original hash object | 
					
						
							| 
									
										
										
										
											2008-09-20 12:03:37 -04:00
										 |  |  |             out5 = binascii.b2a_hex(h2.digest())    # The copied hash object should return the correct result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  |             # PY3K: hexdigest() should return str(), and digest() bytes  | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  |             self.assertEqual(expected, out1) | 
					
						
							| 
									
										
										
										
											2010-12-29 13:21:05 -05:00
										 |  |  |             if sys.version_info[0] == 2: | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  |                 self.assertEqual(expected, out2) | 
					
						
							|  |  |  |                 self.assertEqual(expected, out3) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.assertEqual(expected.decode(), out2) | 
					
						
							|  |  |  |                 self.assertEqual(expected.decode(), out3)                 | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  |             self.assertEqual(expected, out4) | 
					
						
							| 
									
										
										
										
											2008-09-20 12:03:37 -04:00
										 |  |  |             self.assertEqual(expected, out5) | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-16 22:41:21 +02:00
										 |  |  | def make_hash_tests(module, module_name, test_data, digest_size, oid=None): | 
					
						
							| 
									
										
										
										
											2008-09-17 13:12:24 -04:00
										 |  |  |     tests = [] | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  |     for i in range(len(test_data)): | 
					
						
							|  |  |  |         row = test_data[i] | 
					
						
							| 
									
										
										
										
											2011-10-18 23:20:26 +02:00
										 |  |  |         (expected, input) = map(b,row[0:2]) | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  |         if len(row) < 3: | 
					
						
							|  |  |  |             description = repr(input) | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2011-10-18 23:20:26 +02:00
										 |  |  |             description = row[2].encode('latin-1') | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  |         name = "%s #%d: %s" % (module_name, i+1, description) | 
					
						
							| 
									
										
										
										
											2008-09-17 13:12:24 -04:00
										 |  |  |         tests.append(HashSelfTest(module, name, expected, input)) | 
					
						
							| 
									
										
										
										
											2011-10-18 23:20:26 +02:00
										 |  |  |     if oid is not None: | 
					
						
							|  |  |  |         oid = b(oid) | 
					
						
							| 
									
										
										
										
											2011-10-16 22:41:21 +02:00
										 |  |  |     name = "%s #%d: digest_size" % (module_name, i+1) | 
					
						
							|  |  |  |     tests.append(HashDigestSizeSelfTest(module, name, digest_size)) | 
					
						
							| 
									
										
										
										
											2011-02-03 01:22:13 +01:00
										 |  |  |     tests.append(HashTestOID(module, oid)) | 
					
						
							| 
									
										
										
										
											2008-09-17 13:12:24 -04:00
										 |  |  |     return tests | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 13:12:24 -04:00
										 |  |  | def make_mac_tests(module, module_name, test_data, hashmods): | 
					
						
							|  |  |  |     tests = [] | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  |     for i in range(len(test_data)): | 
					
						
							|  |  |  |         row = test_data[i] | 
					
						
							|  |  |  |         (key, data, results, description) = row | 
					
						
							|  |  |  |         name = "%s #%d: %s" % (module_name, i+1, description) | 
					
						
							| 
									
										
										
										
											2008-09-17 13:12:24 -04:00
										 |  |  |         tests.append(MACSelfTest(module, name, results, data, key, hashmods)) | 
					
						
							|  |  |  |     return tests | 
					
						
							| 
									
										
										
										
											2008-09-14 14:40:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-12 15:26:24 -04:00
										 |  |  | # vim:set ts=4 sw=4 sts=4 expandtab: |