Added SelfTest module + some fixes
[python-cryptoplus.git] / src / SelfTest / Hash / test_HMAC.py
blob56d0c2762b68309d602d95804aae1a939b1801a6
1 # -*- coding: utf-8 -*-
3 # SelfTest/Hash/HMAC.py: Self-test for the HMAC module
5 # =======================================================================
6 # Copyright (C) 2008 Dwayne C. Litzenberger <dlitz@dlitz.net>
8 # Permission is hereby granted, free of charge, to any person obtaining
9 # a copy of this software and associated documentation files (the
10 # "Software"), to deal in the Software without restriction, including
11 # without limitation the rights to use, copy, modify, merge, publish,
12 # distribute, sublicense, and/or sell copies of the Software, and to
13 # permit persons to whom the Software is furnished to do so.
15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 # =======================================================================
29 """Self-test suite for CryptoPlus.Hash.HMAC"""
31 __revision__ = "$Id$"
33 from common import dict # For compatibility with Python 2.1 and 2.2
35 # This is a list of (key, data, results, description) tuples.
36 test_data = [
37 ## Test vectors from RFC 2202 ##
38 # Test that the default hashmod is MD5
39 ('0b' * 16,
40 '4869205468657265',
41 dict(default='9294727a3638bb1c13f48ef8158bfc9d'),
42 'default-is-MD5'),
44 # Test case 1 (MD5)
45 ('0b' * 16,
46 '4869205468657265',
47 dict(MD5='9294727a3638bb1c13f48ef8158bfc9d'),
48 'RFC 2202 #1-MD5 (HMAC-MD5)'),
50 # Test case 1 (SHA1)
51 ('0b' * 20,
52 '4869205468657265',
53 dict(SHA1='b617318655057264e28bc0b6fb378c8ef146be00'),
54 'RFC 2202 #1-SHA1 (HMAC-SHA1)'),
56 # Test case 2
57 ('4a656665',
58 '7768617420646f2079612077616e7420666f72206e6f7468696e673f',
59 dict(MD5='750c783e6ab0b503eaa86e310a5db738',
60 SHA1='effcdf6ae5eb2fa2d27416d5f184df9c259a7c79'),
61 'RFC 2202 #2 (HMAC-MD5/SHA1)'),
63 # Test case 3 (MD5)
64 ('aa' * 16,
65 'dd' * 50,
66 dict(MD5='56be34521d144c88dbb8c733f0e8b3f6'),
67 'RFC 2202 #3-MD5 (HMAC-MD5)'),
69 # Test case 3 (SHA1)
70 ('aa' * 20,
71 'dd' * 50,
72 dict(SHA1='125d7342b9ac11cd91a39af48aa17b4f63f175d3'),
73 'RFC 2202 #3-SHA1 (HMAC-SHA1)'),
75 # Test case 4
76 ('0102030405060708090a0b0c0d0e0f10111213141516171819',
77 'cd' * 50,
78 dict(MD5='697eaf0aca3a3aea3a75164746ffaa79',
79 SHA1='4c9007f4026250c6bc8414f9bf50c86c2d7235da'),
80 'RFC 2202 #4 (HMAC-MD5/SHA1)'),
82 # Test case 5 (MD5)
83 ('0c' * 16,
84 '546573742057697468205472756e636174696f6e',
85 dict(MD5='56461ef2342edc00f9bab995690efd4c'),
86 'RFC 2202 #5-MD5 (HMAC-MD5)'),
88 # Test case 5 (SHA1)
89 # NB: We do not implement hash truncation, so we only test the full hash here.
90 ('0c' * 20,
91 '546573742057697468205472756e636174696f6e',
92 dict(SHA1='4c1a03424b55e07fe7f27be1d58bb9324a9a5a04'),
93 'RFC 2202 #5-SHA1 (HMAC-SHA1)'),
95 # Test case 6
96 ('aa' * 80,
97 '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a'
98 + '65204b6579202d2048617368204b6579204669727374',
99 dict(MD5='6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd',
100 SHA1='aa4ae5e15272d00e95705637ce8a3b55ed402112'),
101 'RFC 2202 #6 (HMAC-MD5/SHA1)'),
103 # Test case 7
104 ('aa' * 80,
105 '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a'
106 + '65204b657920616e64204c6172676572205468616e204f6e6520426c6f636b2d'
107 + '53697a652044617461',
108 dict(MD5='6f630fad67cda0ee1fb1f562db3aa53e',
109 SHA1='e8e99d0f45237d786d6bbaa7965c7808bbff1a91'),
110 'RFC 2202 #7 (HMAC-MD5/SHA1)'),
112 ## Test vectors from RFC 4231 ##
113 # 4.2. Test Case 1
114 ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
115 '4869205468657265',
116 dict(SHA256='''
117 b0344c61d8db38535ca8afceaf0bf12b
118 881dc200c9833da726e9376c2e32cff7
119 '''),
120 'RFC 4231 #1 (HMAC-SHA256)'),
122 # 4.3. Test Case 2 - Test with a key shorter than the length of the HMAC
123 # output.
124 ('4a656665',
125 '7768617420646f2079612077616e7420666f72206e6f7468696e673f',
126 dict(SHA256='''
127 5bdcc146bf60754e6a042426089575c7
128 5a003f089d2739839dec58b964ec3843
129 '''),
130 'RFC 4231 #2 (HMAC-SHA256)'),
132 # 4.4. Test Case 3 - Test with a combined length of key and data that is
133 # larger than 64 bytes (= block-size of SHA-224 and SHA-256).
134 ('aa' * 20,
135 'dd' * 50,
136 dict(SHA256='''
137 773ea91e36800e46854db8ebd09181a7
138 2959098b3ef8c122d9635514ced565fe
139 '''),
140 'RFC 4231 #3 (HMAC-SHA256)'),
142 # 4.5. Test Case 4 - Test with a combined length of key and data that is
143 # larger than 64 bytes (= block-size of SHA-224 and SHA-256).
144 ('0102030405060708090a0b0c0d0e0f10111213141516171819',
145 'cd' * 50,
146 dict(SHA256='''
147 82558a389a443c0ea4cc819899f2083a
148 85f0faa3e578f8077a2e3ff46729665b
149 '''),
150 'RFC 4231 #4 (HMAC-SHA256)'),
152 # 4.6. Test Case 5 - Test with a truncation of output to 128 bits.
154 # Not included because we do not implement hash truncation.
157 # 4.7. Test Case 6 - Test with a key larger than 128 bytes (= block-size of
158 # SHA-384 and SHA-512).
159 ('aa' * 131,
160 '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a'
161 + '65204b6579202d2048617368204b6579204669727374',
162 dict(SHA256='''
163 60e431591ee0b67f0d8a26aacbf5b77f
164 8e0bc6213728c5140546040f0ee37f54
165 '''),
166 'RFC 4231 #6 (HMAC-SHA256)'),
168 # 4.8. Test Case 7 - Test with a key and data that is larger than 128 bytes
169 # (= block-size of SHA-384 and SHA-512).
170 ('aa' * 131,
171 '5468697320697320612074657374207573696e672061206c6172676572207468'
172 + '616e20626c6f636b2d73697a65206b657920616e642061206c61726765722074'
173 + '68616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565'
174 + '647320746f20626520686173686564206265666f7265206265696e6720757365'
175 + '642062792074686520484d414320616c676f726974686d2e',
176 dict(SHA256='''
177 9b09ffa71b942fcb27635fbcd5b0e944
178 bfdc63644f0713938a7f51535c3a35e2
179 '''),
180 'RFC 4231 #7 (HMAC-SHA256)'),
183 def get_tests():
184 from CryptoPlus.Hash import HMAC, MD5, SHA as SHA1, SHA256
185 from common import make_mac_tests
186 hashmods = dict(MD5=MD5, SHA1=SHA1, SHA256=SHA256, default=None)
187 return make_mac_tests(HMAC, "HMAC", test_data, hashmods)
189 if __name__ == '__main__':
190 import unittest
191 suite = lambda: unittest.TestSuite(get_tests())
192 unittest.main(defaultTest='suite')
194 # vim:set ts=4 sw=4 sts=4 expandtab: