diff options
author | Guido van Rossum <guido@python.org> | 2007-07-10 13:35:52 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-07-10 13:35:52 (GMT) |
commit | 3f42908051dbb4213f213c52fc9ab4a457714327 (patch) | |
tree | 40ae343a5441ccb18498b089d59fad16203d6505 /Lib | |
parent | f895307a945d30fd5207f4c512ac2c0b5f59b335 (diff) | |
download | cpython-3f42908051dbb4213f213c52fc9ab4a457714327.zip cpython-3f42908051dbb4213f213c52fc9ab4a457714327.tar.gz cpython-3f42908051dbb4213f213c52fc9ab4a457714327.tar.bz2 |
Make hmac use bytes. Make test_hmac pass.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/hmac.py | 19 | ||||
-rw-r--r-- | Lib/test/test_hmac.py | 44 |
2 files changed, 37 insertions, 26 deletions
diff --git a/Lib/hmac.py b/Lib/hmac.py index 079b58c..7bf3c03 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -3,8 +3,8 @@ Implements the HMAC algorithm as described by RFC 2104. """ -trans_5C = "".join ([chr (x ^ 0x5C) for x in range(256)]) -trans_36 = "".join ([chr (x ^ 0x36) for x in range(256)]) +trans_5C = bytes((x ^ 0x5C) for x in range(256)) +trans_36 = bytes((x ^ 0x36) for x in range(256)) # The size of the digests returned by HMAC depends on the underlying # hashing module used. Use digest_size from the instance of HMAC instead. @@ -30,11 +30,18 @@ class HMAC: digestmod: A module supporting PEP 247. *OR* A hashlib constructor returning a new hash object. Defaults to hashlib.md5. + + Note: key and msg must be bytes objects. """ if key is _secret_backdoor_key: # cheap return + if not isinstance(key, bytes): + if hasattr(key, "__index__"): + raise TypeError("key can't be a number") + key = bytes(key) + if digestmod is None: import hashlib digestmod = hashlib.md5 @@ -42,7 +49,7 @@ class HMAC: if hasattr(digestmod, '__call__'): self.digest_cons = digestmod else: - self.digest_cons = lambda d='': digestmod.new(d) + self.digest_cons = lambda d=b'': digestmod.new(d) self.outer = self.digest_cons() self.inner = self.digest_cons() @@ -52,7 +59,7 @@ class HMAC: if len(key) > blocksize: key = self.digest_cons(key).digest() - key = key + chr(0) * (blocksize - len(key)) + key = key + bytes(blocksize - len(key)) self.outer.update(key.translate(trans_5C)) self.inner.update(key.translate(trans_36)) if msg is not None: @@ -64,6 +71,10 @@ class HMAC: def update(self, msg): """Update this hashing object with the string msg. """ + if not isinstance(msg, bytes): + if hasattr(msg, "__index__"): + raise TypeError("msg can't be a number") + msg = bytes(msg) self.inner.update(msg) def copy(self): diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index d28490d..b453f04 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -12,31 +12,31 @@ class TestVectorsTestCase(unittest.TestCase): h = hmac.HMAC(key, data) self.assertEqual(h.hexdigest().upper(), digest.upper()) - md5test(chr(0x0b) * 16, - "Hi There", + md5test(b"\x0b" * 16, + b"Hi There", "9294727A3638BB1C13F48EF8158BFC9D") - md5test("Jefe", - "what do ya want for nothing?", + md5test(b"Jefe", + b"what do ya want for nothing?", "750c783e6ab0b503eaa86e310a5db738") - md5test(chr(0xAA)*16, - chr(0xDD)*50, + md5test(b"\xaa" * 16, + b"\xdd" * 50, "56be34521d144c88dbb8c733f0e8b3f6") md5test("".join([chr(i) for i in range(1, 26)]), - chr(0xCD) * 50, + b"\xcd" * 50, "697eaf0aca3a3aea3a75164746ffaa79") md5test(chr(0x0C) * 16, "Test With Truncation", "56461ef2342edc00f9bab995690efd4c") - md5test(chr(0xAA) * 80, + md5test(b"\xaa" * 80, "Test Using Larger Than Block-Size Key - Hash Key First", "6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd") - md5test(chr(0xAA) * 80, + md5test(b"\xaa" * 80, ("Test Using Larger Than Block-Size Key " "and Larger Than One Block-Size Data"), "6f630fad67cda0ee1fb1f562db3aa53e") @@ -46,33 +46,33 @@ class TestVectorsTestCase(unittest.TestCase): h = hmac.HMAC(key, data, digestmod=sha1) self.assertEqual(h.hexdigest().upper(), digest.upper()) - shatest(chr(0x0b) * 20, - "Hi There", + shatest(b"\x0b" * 20, + b"Hi There", "b617318655057264e28bc0b6fb378c8ef146be00") - shatest("Jefe", - "what do ya want for nothing?", + shatest(b"Jefe", + b"what do ya want for nothing?", "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79") - shatest(chr(0xAA)*20, - chr(0xDD)*50, + shatest(b"\xAA" * 20, + b"\xDD" * 50, "125d7342b9ac11cd91a39af48aa17b4f63f175d3") - shatest("".join([chr(i) for i in range(1, 26)]), - chr(0xCD) * 50, + shatest(bytes(range(1, 26)), + b"\xCD" * 50, "4c9007f4026250c6bc8414f9bf50c86c2d7235da") shatest(chr(0x0C) * 20, "Test With Truncation", "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04") - shatest(chr(0xAA) * 80, - "Test Using Larger Than Block-Size Key - Hash Key First", + shatest(b"\xAA" * 80, + b"Test Using Larger Than Block-Size Key - Hash Key First", "aa4ae5e15272d00e95705637ce8a3b55ed402112") - shatest(chr(0xAA) * 80, - ("Test Using Larger Than Block-Size Key " - "and Larger Than One Block-Size Data"), + shatest(b"\xAA" * 80, + (b"Test Using Larger Than Block-Size Key " + b"and Larger Than One Block-Size Data"), "e8e99d0f45237d786d6bbaa7965c7808bbff1a91") |