Subversion Repositories pub

Compare Revisions

Ignore whitespace Rev 181 → Rev 182

/relevation/ext/cryptopy-1.2.5.orig/crypto/keyedHash/hmacHash_test.py
0,0 → 1,121
#!/usr/bin/env python
""" hmacHash_test.py
Unit tests for hmacHash.py
 
So far only runs test vectors from RFC2104
References
[IETF] RFC 2104 "HMAC: Keyed-Hashing for Message Authentication"
[IETF] RFC 2202
"""
 
import unittest
from crypto.keyedHash.hmacHash import HMAC, HMAC_SHA1
from crypto.hash.sha1Hash import SHA1
from crypto.hash.md5Hash import MD5
from binascii import a2b_hex, b2a_hex
 
class HMAC_Simple_TestCases(unittest.TestCase):
""" HMAC constructed ny hand """
def testSHA1_NullKey(self):
""" HMAC_SHA1 testNullKey """
ki = ''.join([chr(0x36) for i in range(64)])
ko = ''.join([chr(0x5C) for i in range(64)])
h = SHA1()
keyedHashAlg = HMAC(SHA1,key='')
assert ( keyedHashAlg('') == h(ko+h(ki)) ), 'Null key, Null data test'
assert ( keyedHashAlg('a') == h(ko+h(ki+'a')) ), 'Null key, a data test'
assert ( keyedHashAlg('ab') == h(ko+h(ki+'ab')) ), 'Null key, ab data test'
assert ( keyedHashAlg(50*'a') == h(ko+h(ki+50*'a')) ), 'Null key, 50*a data test'
# try hmac in two steps of 25 chrs
manual_hmac = h(ko+h(ki+50*'a'))
keyedHashAlg.update(25*'a')
keyedHashAlg.update(25*'a')
hm = keyedHashAlg.digest()
assert (hm == manual_hmac), 'HMAC as update, update and digest'
 
def testMD5_NullKey(self):
""" HMAC_MD5 testNullKey """
ki = ''.join([chr(0x36) for i in range(64)])
ko = ''.join([chr(0x5C) for i in range(64)])
h = MD5()
keyedHashAlg = HMAC(MD5,key='')
assert ( keyedHashAlg('') == h(ko+h(ki)) ), 'Null key, Null data test'
assert ( keyedHashAlg('a') == h(ko+h(ki+'a')) ), 'Null key, a data test'
assert ( keyedHashAlg('ab') == h(ko+h(ki+'ab')) ), 'Null key, ab data test'
assert ( keyedHashAlg(50*'a') == h(ko+h(ki+50*'a')) ), 'Null key, 50*a data test'
 
def testSHA1_oneByteKey(self):
""" HMAC_SHA1 oneByteKey of 0xFF"""
ki = ''.join([chr(0x36) for i in range(64)])
ko = ''.join([chr(0x5C) for i in range(64)])
ki = chr(ord(ki[0])^0xFF)+ ki[1:]
ko = chr(ord(ko[0])^0xFF)+ ko[1:]
h = SHA1()
keyedHashAlg = HMAC(SHA1,chr(0xff))
assert ( keyedHashAlg('') == h(ko+h(ki)) ), 'one byte key, Null data test'
assert ( keyedHashAlg('a') == h(ko+h(ki+'a')) ), 'one byte key, a data test'
assert ( keyedHashAlg('ab') == h(ko+h(ki+'ab')) ), 'one byte key, ab data test'
assert ( keyedHashAlg(50*'a') == h(ko+h(ki+50*'a')) ), 'one byte key, 50*a data test'
 
class HMAC_RFC2104_TestCases(unittest.TestCase):
""" HMAC tests from RFC2104 """
 
def testRFC2104_1(self):
""" RFC2104 test 1 and various calling methods """
key = chr(0x0b)*20
keyedHashAlg = HMAC(SHA1,key)
data = "Hi There"
digest = a2b_hex('b617318655057264e28bc0b6fb378c8ef146be00')
cd=keyedHashAlg(data)
assert( cd == digest ), 'RFC2104 test 1 failed'
 
hmac_sha1 = HMAC_SHA1(key)
cd = hmac_sha1.hash(data)
assert( cd == digest ), 'RFC2104 test 1 failed, HMAC_SHA1 called'
 
cd = hmac_sha1.hash(data[:3],more=1)
cd = hmac_sha1.hash(data[3:])
assert( cd == digest ), 'RFC2104 test 1 failed, HMAC_SHA1 called twice'
 
hmac_sha1.update(data[:3])
hmac_sha1.update(data[3:])
cd = hmac_sha1.digest()
print b2a_hex(cd)
assert( cd == digest ), 'RFC2104 test 1 failed, HMAC_SHA1 called with update'
 
hmac_sha1.reset(data)
cd1 = hmac_sha1.hash(data)
cd2 = hmac_sha1.hash(data)
print b2a_hex(cd1)
print b2a_hex(cd2)
assert( cd1 == cd2 ), 'hash method should default to reseting state'
 
 
def testRFC2104_2(self):
""" RFC2104 test 2 """
keyedHashAlg = HMAC(SHA1)
key = 'Jefe'
keyedHashAlg.setKey(key)
data = 'what do ya want for nothing?'
digest = a2b_hex('effcdf6ae5eb2fa2d27416d5f184df9c259a7c79')
cd = keyedHashAlg(data)
assert( cd == digest ), 'RFC2104 test 2 failed'
 
def testRFC2104_3(self):
""" RFC2104 test 3 """
key = a2b_hex('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
keyedHashAlg = HMAC_SHA1(key)
data = 50*chr(0xdd)
digest = a2b_hex('125d7342b9ac11cd91a39af48aa17b4f63f175d3')
cd = keyedHashAlg(data)
assert( cd == digest ), 'RFC2104 test 3 failed'
 
 
 
 
if __name__ == '__main__':
# Run the tests from the command line
unittest.main()