From 5ed033b5a21d56db0dbb0b2535b83afd5cad143d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 9 Jul 2007 14:29:40 +0000 Subject: [PATCH] Change hashlib to return bytes from digest() instead of str8. --- Lib/test/test_hashlib.py | 41 +++++++++++++++++++++------------------- Lib/uuid.py | 4 ++-- Modules/_hashopenssl.c | 4 ++-- Modules/sha256module.c | 6 +++--- Modules/sha512module.c | 6 +++--- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py index 1dcadcda611..e32f7880ae6 100644 --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -12,12 +12,12 @@ from test import test_support def hexstr(s): - import string - h = string.hexdigits - r = '' - for c in s: - i = ord(c) - r = r + h[(i >> 4) & 0xF] + h[i & 0xF] + assert isinstance(s, bytes), repr(s) + h = b"0123456789abcdef" + r = b'' + for i in s: + r.append(h[(i >> 4) & 0xF]) + r.append(h[i & 0xF]) return r @@ -37,7 +37,8 @@ class HashLibTestCase(unittest.TestCase): def test_hexdigest(self): for name in self.supported_hash_names: h = hashlib.new(name) - self.assert_(hexstr(h.digest()) == h.hexdigest()) + assert isinstance(h.digest(), bytes), name + self.assertEqual(hexstr(h.digest()), h.hexdigest()) def test_large_update(self): @@ -66,14 +67,15 @@ class HashLibTestCase(unittest.TestCase): def test_case_md5_0(self): - self.check('md5', '', 'd41d8cd98f00b204e9800998ecf8427e') + self.check('md5', b'', b'd41d8cd98f00b204e9800998ecf8427e') def test_case_md5_1(self): - self.check('md5', 'abc', '900150983cd24fb0d6963f7d28e17f72') + self.check('md5', b'abc', b'900150983cd24fb0d6963f7d28e17f72') def test_case_md5_2(self): - self.check('md5', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', - 'd174ab98d277d9f5a5611c2c9f419d9f') + self.check('md5', + b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + b'd174ab98d277d9f5a5611c2c9f419d9f') # use the three examples from Federal Information Processing Standards @@ -81,20 +83,21 @@ class HashLibTestCase(unittest.TestCase): # http://www.itl.nist.gov/div897/pubs/fip180-1.htm def test_case_sha1_0(self): - self.check('sha1', "", - "da39a3ee5e6b4b0d3255bfef95601890afd80709") + self.check('sha1', b"", + b"da39a3ee5e6b4b0d3255bfef95601890afd80709") def test_case_sha1_1(self): - self.check('sha1', "abc", - "a9993e364706816aba3e25717850c26c9cd0d89d") + self.check('sha1', b"abc", + b"a9993e364706816aba3e25717850c26c9cd0d89d") def test_case_sha1_2(self): - self.check('sha1', "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "84983e441c3bd26ebaae4aa1f95129e5e54670f1") + self.check('sha1', + b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + b"84983e441c3bd26ebaae4aa1f95129e5e54670f1") def test_case_sha1_3(self): - self.check('sha1', "a" * 1000000, - "34aa973cd4c4daa4f61eeb2bdbad27316534016f") + self.check('sha1', b"a" * 1000000, + b"34aa973cd4c4daa4f61eeb2bdbad27316534016f") # use the examples from Federal Information Processing Standards diff --git a/Lib/uuid.py b/Lib/uuid.py index 51b44f8ee9b..30154f03f87 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -528,7 +528,7 @@ def uuid3(namespace, name): """Generate a UUID from the MD5 hash of a namespace UUID and a name.""" from hashlib import md5 hash = md5(namespace.bytes + bytes(name, "utf-8")).digest() - return UUID(bytes=bytes_(hash[:16]), version=3) + return UUID(bytes=hash[:16], version=3) def uuid4(): """Generate a random UUID.""" @@ -551,7 +551,7 @@ def uuid5(namespace, name): """Generate a UUID from the SHA-1 hash of a namespace UUID and a name.""" from hashlib import sha1 hash = sha1(namespace.bytes + bytes(name, "utf-8")).digest() - return UUID(bytes=bytes_(hash[:16]), version=5) + return UUID(bytes=hash[:16], version=5) # The following standard UUIDs are for use with uuid3() or uuid5(). diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 98c91d1699d..47fc674ce3d 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -103,7 +103,7 @@ EVP_digest(EVPobject *self, PyObject *unused) digest_size = EVP_MD_CTX_size(&temp_ctx); EVP_DigestFinal(&temp_ctx, digest, NULL); - retval = PyString_FromStringAndSize((const char *)digest, digest_size); + retval = PyBytes_FromStringAndSize((const char *)digest, digest_size); EVP_MD_CTX_cleanup(&temp_ctx); return retval; } @@ -133,7 +133,7 @@ EVP_hexdigest(EVPobject *self, PyObject *unused) retval = PyString_FromStringAndSize(NULL, digest_size * 2); if (!retval) return NULL; - hex_digest = PyString_AsString(retval); + hex_digest = PyString_AS_STRING(retval); if (!hex_digest) { Py_DECREF(retval); return NULL; diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 0effb0734c6..f81608c20ad 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -432,7 +432,7 @@ SHA256_digest(SHAobject *self, PyObject *unused) SHAcopy(self, &temp); sha_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, self->digestsize); + return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } PyDoc_STRVAR(SHA256_hexdigest__doc__, @@ -510,9 +510,9 @@ static PyObject * SHA256_get_name(PyObject *self, void *closure) { if (((SHAobject *)self)->digestsize == 32) - return PyString_FromStringAndSize("SHA256", 6); + return PyUnicode_FromStringAndSize("SHA256", 6); else - return PyString_FromStringAndSize("SHA224", 6); + return PyUnicode_FromStringAndSize("SHA224", 6); } static PyGetSetDef SHA_getseters[] = { diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 9f47b6128b8..f2aae3a3ce2 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -498,7 +498,7 @@ SHA512_digest(SHAobject *self, PyObject *unused) SHAcopy(self, &temp); sha512_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, self->digestsize); + return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } PyDoc_STRVAR(SHA512_hexdigest__doc__, @@ -576,9 +576,9 @@ static PyObject * SHA512_get_name(PyObject *self, void *closure) { if (((SHAobject *)self)->digestsize == 64) - return PyString_FromStringAndSize("SHA512", 6); + return PyUnicode_FromStringAndSize("SHA512", 6); else - return PyString_FromStringAndSize("SHA384", 6); + return PyUnicode_FromStringAndSize("SHA384", 6); } static PyGetSetDef SHA_getseters[] = {