summaryrefslogtreecommitdiff
path: root/src/pycryptopp/hash/sha256.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pycryptopp/hash/sha256.py')
-rw-r--r--src/pycryptopp/hash/sha256.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/pycryptopp/hash/sha256.py b/src/pycryptopp/hash/sha256.py
new file mode 100644
index 0000000..cf52a31
--- /dev/null
+++ b/src/pycryptopp/hash/sha256.py
@@ -0,0 +1,43 @@
+from pycryptopp import _import_my_names
+
+# These initializations to None are just to pacify pyflakes, which
+# doesn't understand that we have to do some funky import trickery
+# below in _import_my_names() in order to get sensible namespaces.
+SHA256=None
+Error=None
+
+_import_my_names(globals(), "sha256_")
+
+del _import_my_names
+
+def start_up_self_test():
+ """
+ This is a quick test intended to detect major errors such as the library being
+ miscompiled and segfaulting or returning incorrect answers. We've had problems
+ of that kind many times, thus justifying running this self-test on import.
+ This idea was suggested to me by the second edition of "Practical
+ Cryptography" by Ferguson, Schneier, and Kohno.
+ This test was copied from pycryptopp/test/test_sha256.py on 2010-09-04.
+
+ This test takes up to 1.5 milliseconds on a VirtualBox instance on
+ my Macbook Pro (fast 64-bit Intel dual-core).
+
+ Test that updating a hasher with various sized inputs yields
+ the expected answer. This is somewhat redundant with
+ test_chunksize(), but that's okay. This one exercises some
+ slightly different situations (such as finalizing a hash after
+ different length inputs.) This one is recursive so that there
+ is a single fixed result that we expect.
+ """
+ hx = SHA256()
+ s = ''.join([ chr(c) for c in range(65) ])
+ for i in range(0, 65):
+ hy = SHA256(s[:i]).digest()
+ hx.update(hy)
+ for i in range(0, 65):
+ hx.update(chr(0xFE))
+ hx.update(s[:64])
+ if hx.hexdigest().lower() != '5191c7841dd4e16aa454d40af924585dffc67157ffdbfd0236acddd07901629d':
+ raise Error("pycryptopp failed startup self-test. Please run pycryptopp unit tests.")
+
+start_up_self_test()