| 1 | # Test hashlib module
|
|---|
| 2 | #
|
|---|
| 3 | # $Id: test_hashlib.py 39316 2005-08-21 18:45:59Z greg $
|
|---|
| 4 | #
|
|---|
| 5 | # Copyright (C) 2005 Gregory P. Smith ([email protected])
|
|---|
| 6 | # Licensed to PSF under a Contributor Agreement.
|
|---|
| 7 | #
|
|---|
| 8 |
|
|---|
| 9 | import hashlib
|
|---|
| 10 | import unittest
|
|---|
| 11 | from test import test_support
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 | def hexstr(s):
|
|---|
| 15 | import string
|
|---|
| 16 | h = string.hexdigits
|
|---|
| 17 | r = ''
|
|---|
| 18 | for c in s:
|
|---|
| 19 | i = ord(c)
|
|---|
| 20 | r = r + h[(i >> 4) & 0xF] + h[i & 0xF]
|
|---|
| 21 | return r
|
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 | class HashLibTestCase(unittest.TestCase):
|
|---|
| 25 | supported_hash_names = ( 'md5', 'MD5', 'sha1', 'SHA1',
|
|---|
| 26 | 'sha224', 'SHA224', 'sha256', 'SHA256',
|
|---|
| 27 | 'sha384', 'SHA384', 'sha512', 'SHA512' )
|
|---|
| 28 |
|
|---|
| 29 | def test_unknown_hash(self):
|
|---|
| 30 | try:
|
|---|
| 31 | hashlib.new('spam spam spam spam spam')
|
|---|
| 32 | except ValueError:
|
|---|
| 33 | pass
|
|---|
| 34 | else:
|
|---|
| 35 | self.assert_(0 == "hashlib didn't reject bogus hash name")
|
|---|
| 36 |
|
|---|
| 37 | def test_hexdigest(self):
|
|---|
| 38 | for name in self.supported_hash_names:
|
|---|
| 39 | h = hashlib.new(name)
|
|---|
| 40 | self.assert_(hexstr(h.digest()) == h.hexdigest())
|
|---|
| 41 |
|
|---|
| 42 |
|
|---|
| 43 | def test_large_update(self):
|
|---|
| 44 | aas = 'a' * 128
|
|---|
| 45 | bees = 'b' * 127
|
|---|
| 46 | cees = 'c' * 126
|
|---|
| 47 |
|
|---|
| 48 | for name in self.supported_hash_names:
|
|---|
| 49 | m1 = hashlib.new(name)
|
|---|
| 50 | m1.update(aas)
|
|---|
| 51 | m1.update(bees)
|
|---|
| 52 | m1.update(cees)
|
|---|
| 53 |
|
|---|
| 54 | m2 = hashlib.new(name)
|
|---|
| 55 | m2.update(aas + bees + cees)
|
|---|
| 56 | self.assertEqual(m1.digest(), m2.digest())
|
|---|
| 57 |
|
|---|
| 58 |
|
|---|
| 59 | def check(self, name, data, digest):
|
|---|
| 60 | # test the direct constructors
|
|---|
| 61 | computed = getattr(hashlib, name)(data).hexdigest()
|
|---|
| 62 | self.assert_(computed == digest)
|
|---|
| 63 | # test the general new() interface
|
|---|
| 64 | computed = hashlib.new(name, data).hexdigest()
|
|---|
| 65 | self.assert_(computed == digest)
|
|---|
| 66 |
|
|---|
| 67 |
|
|---|
| 68 | def test_case_md5_0(self):
|
|---|
| 69 | self.check('md5', '', 'd41d8cd98f00b204e9800998ecf8427e')
|
|---|
| 70 |
|
|---|
| 71 | def test_case_md5_1(self):
|
|---|
| 72 | self.check('md5', 'abc', '900150983cd24fb0d6963f7d28e17f72')
|
|---|
| 73 |
|
|---|
| 74 | def test_case_md5_2(self):
|
|---|
| 75 | self.check('md5', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
|
|---|
| 76 | 'd174ab98d277d9f5a5611c2c9f419d9f')
|
|---|
| 77 |
|
|---|
| 78 |
|
|---|
| 79 | # use the three examples from Federal Information Processing Standards
|
|---|
| 80 | # Publication 180-1, Secure Hash Standard, 1995 April 17
|
|---|
| 81 | # http://www.itl.nist.gov/div897/pubs/fip180-1.htm
|
|---|
| 82 |
|
|---|
| 83 | def test_case_sha1_0(self):
|
|---|
| 84 | self.check('sha1', "",
|
|---|
| 85 | "da39a3ee5e6b4b0d3255bfef95601890afd80709")
|
|---|
| 86 |
|
|---|
| 87 | def test_case_sha1_1(self):
|
|---|
| 88 | self.check('sha1', "abc",
|
|---|
| 89 | "a9993e364706816aba3e25717850c26c9cd0d89d")
|
|---|
| 90 |
|
|---|
| 91 | def test_case_sha1_2(self):
|
|---|
| 92 | self.check('sha1', "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
|
|---|
| 93 | "84983e441c3bd26ebaae4aa1f95129e5e54670f1")
|
|---|
| 94 |
|
|---|
| 95 | def test_case_sha1_3(self):
|
|---|
| 96 | self.check('sha1', "a" * 1000000,
|
|---|
| 97 | "34aa973cd4c4daa4f61eeb2bdbad27316534016f")
|
|---|
| 98 |
|
|---|
| 99 |
|
|---|
| 100 | # use the examples from Federal Information Processing Standards
|
|---|
| 101 | # Publication 180-2, Secure Hash Standard, 2002 August 1
|
|---|
| 102 | # http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
|
|---|
| 103 |
|
|---|
| 104 | def test_case_sha224_0(self):
|
|---|
| 105 | self.check('sha224', "",
|
|---|
| 106 | "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f")
|
|---|
| 107 |
|
|---|
| 108 | def test_case_sha224_1(self):
|
|---|
| 109 | self.check('sha224', "abc",
|
|---|
| 110 | "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7")
|
|---|
| 111 |
|
|---|
| 112 | def test_case_sha224_2(self):
|
|---|
| 113 | self.check('sha224',
|
|---|
| 114 | "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
|
|---|
| 115 | "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525")
|
|---|
| 116 |
|
|---|
| 117 | def test_case_sha224_3(self):
|
|---|
| 118 | self.check('sha224', "a" * 1000000,
|
|---|
| 119 | "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67")
|
|---|
| 120 |
|
|---|
| 121 |
|
|---|
| 122 | def test_case_sha256_0(self):
|
|---|
| 123 | self.check('sha256', "",
|
|---|
| 124 | "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
|
|---|
| 125 |
|
|---|
| 126 | def test_case_sha256_1(self):
|
|---|
| 127 | self.check('sha256', "abc",
|
|---|
| 128 | "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
|
|---|
| 129 |
|
|---|
| 130 | def test_case_sha256_2(self):
|
|---|
| 131 | self.check('sha256',
|
|---|
| 132 | "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
|
|---|
| 133 | "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1")
|
|---|
| 134 |
|
|---|
| 135 | def test_case_sha256_3(self):
|
|---|
| 136 | self.check('sha256', "a" * 1000000,
|
|---|
| 137 | "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0")
|
|---|
| 138 |
|
|---|
| 139 |
|
|---|
| 140 | def test_case_sha384_0(self):
|
|---|
| 141 | self.check('sha384', "",
|
|---|
| 142 | "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da"+
|
|---|
| 143 | "274edebfe76f65fbd51ad2f14898b95b")
|
|---|
| 144 |
|
|---|
| 145 | def test_case_sha384_1(self):
|
|---|
| 146 | self.check('sha384', "abc",
|
|---|
| 147 | "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed"+
|
|---|
| 148 | "8086072ba1e7cc2358baeca134c825a7")
|
|---|
| 149 |
|
|---|
| 150 | def test_case_sha384_2(self):
|
|---|
| 151 | self.check('sha384',
|
|---|
| 152 | "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"+
|
|---|
| 153 | "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
|
|---|
| 154 | "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712"+
|
|---|
| 155 | "fcc7c71a557e2db966c3e9fa91746039")
|
|---|
| 156 |
|
|---|
| 157 | def test_case_sha384_3(self):
|
|---|
| 158 | self.check('sha384', "a" * 1000000,
|
|---|
| 159 | "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b"+
|
|---|
| 160 | "07b8b3dc38ecc4ebae97ddd87f3d8985")
|
|---|
| 161 |
|
|---|
| 162 |
|
|---|
| 163 | def test_case_sha512_0(self):
|
|---|
| 164 | self.check('sha512', "",
|
|---|
| 165 | "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce"+
|
|---|
| 166 | "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")
|
|---|
| 167 |
|
|---|
| 168 | def test_case_sha512_1(self):
|
|---|
| 169 | self.check('sha512', "abc",
|
|---|
| 170 | "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"+
|
|---|
| 171 | "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f")
|
|---|
| 172 |
|
|---|
| 173 | def test_case_sha512_2(self):
|
|---|
| 174 | self.check('sha512',
|
|---|
| 175 | "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"+
|
|---|
| 176 | "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
|
|---|
| 177 | "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018"+
|
|---|
| 178 | "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909")
|
|---|
| 179 |
|
|---|
| 180 | def test_case_sha512_3(self):
|
|---|
| 181 | self.check('sha512', "a" * 1000000,
|
|---|
| 182 | "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb"+
|
|---|
| 183 | "de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b")
|
|---|
| 184 |
|
|---|
| 185 |
|
|---|
| 186 | def test_main():
|
|---|
| 187 | test_support.run_unittest(HashLibTestCase)
|
|---|
| 188 |
|
|---|
| 189 |
|
|---|
| 190 | if __name__ == "__main__":
|
|---|
| 191 | test_main()
|
|---|