diff --git a/hashlib/hashlib/__init__.py b/hashlib/hashlib/__init__.py index e9d3d0c6..cfbf355f 100644 --- a/hashlib/hashlib/__init__.py +++ b/hashlib/hashlib/__init__.py @@ -1,2 +1,22 @@ -from ._sha256 import sha224, sha256 -from ._sha512 import sha384, sha512 +try: + import uhashlib +except ImportError: + uhashlib = None + +def init(): + for i in ("sha1", "sha224", "sha256", "sha384", "sha512"): + c = getattr(uhashlib, i, None) + if not c: + c = __import__("_" + i, None, None, (), 1) + c = getattr(c, i) + globals()[i] = c + +init() + + +def new(algo, data=b""): + try: + c = globals()[algo] + return c(data) + except KeyError: + raise ValueError(algo) diff --git a/hashlib/test_hashlib.py b/hashlib/test_hashlib.py index e61d3ef0..1f5f9be8 100644 --- a/hashlib/test_hashlib.py +++ b/hashlib/test_hashlib.py @@ -4,4 +4,23 @@ from hashlib._sha512 import test as sha512_test sha256_test() sha512_test() -print("OK") + + +import hashlib + +patterns = [ + ("sha224", b"1234", + b'\x99\xfb/H\xc6\xafGa\xf9\x04\xfc\x85\xf9^\xb5a\x90\xe5\xd4\x0b\x1fD\xec:\x9c\x1f\xa3\x19'), + + ("sha256", b"1234", + b'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'), + + ("sha384", b"1234", + b'PO\x00\x8c\x8f\xcf\x8b.\xd5\xdf\xcd\xe7R\xfcTd\xab\x8b\xa0d!]\x9c[_\xc4\x86\xaf=\x9a\xb8\xc8\x1b\x14xQ\x80\xd2\xad|\xee\x1a\xb7\x92\xadDy\x8c'), + + ("sha512", b"1234", + b'\xd4\x04U\x9f`.\xabo\xd6\x02\xacv\x80\xda\xcb\xfa\xad\xd1603^\x95\x1f\tz\xf3\x90\x0e\x9d\xe1v\xb6\xdb(Q/.\x00\x0b\x9d\x04\xfb\xa5\x13>\x8b\x1cn\x8d\xf5\x9d\xb3\xa8\xab\x9d`\xbeK\x97\xcc\x9e\x81\xdb'), +] + +for algo, input, output in patterns: + assert hashlib.new(algo, input).digest() == output