From d1b0c7faaea1376ec69471b7a541f059d3d47684 Mon Sep 17 00:00:00 2001 From: dherrada Date: Thu, 12 Mar 2020 16:28:49 -0400 Subject: [PATCH] Ran black, updated to pylint 2.x --- .github/workflows/build.yml | 2 +- adafruit_hashlib/__init__.py | 2 + adafruit_hashlib/_md5.py | 8 +- adafruit_hashlib/_sha1.py | 49 +-- adafruit_hashlib/_sha256.py | 421 ++++++++++++++++++-------- adafruit_hashlib/_sha512.py | 535 +++++++++++++++++++++++---------- docs/conf.py | 112 ++++--- examples/hashlib_simpletest.py | 35 ++- setup.py | 54 ++-- 9 files changed, 808 insertions(+), 410 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fff3aa9..97fe64d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,7 +40,7 @@ jobs: source actions-ci/install.sh - name: Pip install pylint, black, & Sphinx run: | - pip install --force-reinstall pylint==1.9.2 black==19.10b0 Sphinx sphinx-rtd-theme + pip install pylint black==19.10b0 Sphinx sphinx-rtd-theme - name: Library version run: git describe --dirty --always --tags - name: PyLint diff --git a/adafruit_hashlib/__init__.py b/adafruit_hashlib/__init__.py index 733bfb2..edb513e 100644 --- a/adafruit_hashlib/__init__.py +++ b/adafruit_hashlib/__init__.py @@ -53,6 +53,7 @@ # FIPS secure hash algorithms supported by this library ALGOS_AVAIL = ["sha1", "md5", "sha224", "sha256", "sha384", "sha512"] + def new(algo, data=b""): """Creates a new hashlib object. :param str algo: Name of the desired algorithm. @@ -64,6 +65,7 @@ def new(algo, data=b""): except KeyError: raise ValueError(algo) + @property def algorithms_available(): """Returns a list containing the names of the hash diff --git a/adafruit_hashlib/_md5.py b/adafruit_hashlib/_md5.py index 4b597a9..00a82ea 100644 --- a/adafruit_hashlib/_md5.py +++ b/adafruit_hashlib/_md5.py @@ -1,4 +1,3 @@ - # The MIT License (MIT) # # Brent Rubell for Adafruit Industries, 2019 @@ -27,7 +26,10 @@ * Author(s): Brent Rubell """ # pylint: disable=too-few-public-methods, invalid-name -class md5(): +class md5: """RSA MD5 Algorithm class.""" + def __init__(self, s=None): - raise NotImplementedError("MD5 digests not currently implemented in this module.") + raise NotImplementedError( + "MD5 digests not currently implemented in this module." + ) diff --git a/adafruit_hashlib/_sha1.py b/adafruit_hashlib/_sha1.py index 2aaeb9c..6e27764 100755 --- a/adafruit_hashlib/_sha1.py +++ b/adafruit_hashlib/_sha1.py @@ -46,6 +46,7 @@ K2 = const(0x8F1BBCDC) K3 = const(0xCA62C1D6) + def _getbuf(data): """Converts data into ascii, returns bytes of data. @@ -53,7 +54,7 @@ def _getbuf(data): """ if isinstance(data, str): - return data.encode('ascii') + return data.encode("ascii") return bytes(data) @@ -63,7 +64,8 @@ def _left_rotate(n, b): :param int b: Desired rotation amount, in bits. """ - return ((n << b) | (n >> (32 - b))) & 0xffffffff + return ((n << b) | (n >> (32 - b))) & 0xFFFFFFFF + # pylint: disable=invalid-name, too-many-arguments def _hash_computation(chunk, h0, h1, h2, h3, h4): @@ -79,7 +81,7 @@ def _hash_computation(chunk, h0, h1, h2, h3, h4): # Break chunk into sixteen 4-byte big-endian words w[i] for i in range(16): - w[i] = struct.unpack(b'>I', chunk[i * 4:i * 4 + 4])[0] + w[i] = struct.unpack(b">I", chunk[i * 4 : i * 4 + 4])[0] # Extend the sixteen 4-byte words into eighty 4-byte words for i in range(16, 80): @@ -107,42 +109,45 @@ def _hash_computation(chunk, h0, h1, h2, h3, h4): f = b ^ c ^ d k = K3 - a, b, c, d, e = ((_left_rotate(a, 5) + f + e + k + w[i]) & 0xffffffff, - a, _left_rotate(b, 30), c, d) + a, b, c, d, e = ( + (_left_rotate(a, 5) + f + e + k + w[i]) & 0xFFFFFFFF, + a, + _left_rotate(b, 30), + c, + d, + ) # Add to chunk's hash result so far - h0 = (h0 + a) & 0xffffffff - h1 = (h1 + b) & 0xffffffff - h2 = (h2 + c) & 0xffffffff - h3 = (h3 + d) & 0xffffffff - h4 = (h4 + e) & 0xffffffff + h0 = (h0 + a) & 0xFFFFFFFF + h1 = (h1 + b) & 0xFFFFFFFF + h2 = (h2 + c) & 0xFFFFFFFF + h3 = (h3 + d) & 0xFFFFFFFF + h4 = (h4 + e) & 0xFFFFFFFF return h0, h1, h2, h3, h4 # pylint: disable=too-few-public-methods, invalid-name -class sha1(): +class sha1: """SHA-1 Hash Object """ + digest_size = SHA_DIGESTSIZE block_size = SHA_BLOCKSIZE name = "sha1" + def __init__(self, data=None): """Construct a SHA-1 hash object. :param bytes data: Optional data to process """ # Initial Digest Variables - self._h = (0x67452301, - 0xEFCDAB89, - 0x98BADCFE, - 0x10325476, - 0xC3D2E1F0) + self._h = (0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0) # bytes object with 0 <= len < 64 used to store the end of the message # if the message length is not congruent to 64 - self._unprocessed = b'' + self._unprocessed = b"" # Length in bytes of all data that has been processed so far self._msg_byte_len = 0 @@ -159,15 +164,15 @@ def _create_digest(self): message_len = self._msg_byte_len + len(message) # add trailing '1' bit (+ 0's padding) to string [FIPS 5.1.1] - message += b'\x80' + message += b"\x80" # append 0 <= k < 512 bits '0', so that the resulting message length (in bytes) # is congruent to 56 (mod 64) - message += b'\x00' * ((56 - (message_len + 1) % 64) % 64) + message += b"\x00" * ((56 - (message_len + 1) % 64) % 64) # append ml, the original message length, as a 64-bit big-endian integer. message_bit_length = message_len * 8 - message += struct.pack(b'>Q', message_bit_length) + message += struct.pack(b">Q", message_bit_length) # Process the final chunk h = _hash_computation(message[:64], *self._h) @@ -205,11 +210,11 @@ def digest(self): method so far. """ - return b''.join(struct.pack(b'>I', h) for h in self._create_digest()) + return b"".join(struct.pack(b">I", h) for h in self._create_digest()) def hexdigest(self): """Like digest() except the digest is returned as a string object of double length, containing only hexadecimal digits. """ - return ''.join(['%.2x' % i for i in self.digest()]) + return "".join(["%.2x" % i for i in self.digest()]) diff --git a/adafruit_hashlib/_sha256.py b/adafruit_hashlib/_sha256.py index 7d0ace8..d5bb432 100644 --- a/adafruit_hashlib/_sha256.py +++ b/adafruit_hashlib/_sha256.py @@ -36,20 +36,23 @@ def new_shaobject(): """Struct. for storing SHA information.""" return { - 'digest': [0]*8, - 'count_lo': 0, - 'count_hi': 0, - 'data': [0] * SHA_BLOCKSIZE, - 'local': 0, - 'digestsize': 0 + "digest": [0] * 8, + "count_lo": 0, + "count_hi": 0, + "data": [0] * SHA_BLOCKSIZE, + "local": 0, + "digestsize": 0, } + # Various logical functions -ROR = lambda x, y: (((x & 0xffffffff) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xffffffff +ROR = ( + lambda x, y: (((x & 0xFFFFFFFF) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xFFFFFFFF +) Ch = lambda x, y, z: (z ^ (x & (y ^ z))) Maj = lambda x, y, z: (((x | y) & z) | (x & y)) S = lambda x, n: ROR(x, n) -R = lambda x, n: (x & 0xffffffff) >> n +R = lambda x, n: (x & 0xFFFFFFFF) >> n Sigma0 = lambda x: (S(x, 2) ^ S(x, 13) ^ S(x, 22)) Sigma1 = lambda x: (S(x, 6) ^ S(x, 11) ^ S(x, 25)) Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3)) @@ -59,14 +62,18 @@ def new_shaobject(): def sha_transform(sha_info): W = [] - d = sha_info['data'] + d = sha_info["data"] for i in range(0, 16): - W.append((d[4*i]<<24) + (d[4*i+1]<<16) + (d[4*i+2]<<8) + d[4*i+3]) + W.append( + (d[4 * i] << 24) + (d[4 * i + 1] << 16) + (d[4 * i + 2] << 8) + d[4 * i + 3] + ) for i in range(16, 64): - W.append((Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffff) + W.append( + (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xFFFFFFFF + ) - ss = sha_info['digest'][:] + ss = sha_info["digest"][:] # pylint: disable=too-many-arguments, line-too-long def RND(a, b, c, d, e, f, g, h, i, ki): @@ -75,106 +82,254 @@ def RND(a, b, c, d, e, f, g, h, i, ki): t1 = Sigma0(a) + Maj(a, b, c) d += t0 h = t0 + t1 - return d & 0xffffffff, h & 0xffffffff - - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 0, 0x428a2f98) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 1, 0x71374491) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 2, 0xb5c0fbcf) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 3, 0xe9b5dba5) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 4, 0x3956c25b) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 5, 0x59f111f1) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 6, 0x923f82a4) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 7, 0xab1c5ed5) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 8, 0xd807aa98) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 9, 0x12835b01) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 10, 0x243185be) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 11, 0x550c7dc3) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 12, 0x72be5d74) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 13, 0x80deb1fe) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 14, 0x9bdc06a7) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 15, 0xc19bf174) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 16, 0xe49b69c1) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 17, 0xefbe4786) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 18, 0x0fc19dc6) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 19, 0x240ca1cc) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 20, 0x2de92c6f) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 21, 0x4a7484aa) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 22, 0x5cb0a9dc) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 23, 0x76f988da) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 24, 0x983e5152) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 25, 0xa831c66d) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 26, 0xb00327c8) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 27, 0xbf597fc7) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 28, 0xc6e00bf3) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 29, 0xd5a79147) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 30, 0x06ca6351) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 31, 0x14292967) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 32, 0x27b70a85) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 33, 0x2e1b2138) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 34, 0x4d2c6dfc) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 35, 0x53380d13) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 36, 0x650a7354) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 37, 0x766a0abb) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 38, 0x81c2c92e) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 39, 0x92722c85) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 40, 0xa2bfe8a1) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 41, 0xa81a664b) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 42, 0xc24b8b70) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 43, 0xc76c51a3) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 44, 0xd192e819) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 45, 0xd6990624) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 46, 0xf40e3585) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 47, 0x106aa070) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 48, 0x19a4c116) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 49, 0x1e376c08) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 50, 0x2748774c) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 51, 0x34b0bcb5) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 52, 0x391c0cb3) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 53, 0x4ed8aa4a) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 54, 0x5b9cca4f) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 55, 0x682e6ff3) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 56, 0x748f82ee) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 57, 0x78a5636f) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 58, 0x84c87814) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 59, 0x8cc70208) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 60, 0x90befffa) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 61, 0xa4506ceb) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 62, 0xbef9a3f7) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 63, 0xc67178f2) + return d & 0xFFFFFFFF, h & 0xFFFFFFFF + + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 0, 0x428A2F98 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 1, 0x71374491 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 2, 0xB5C0FBCF + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 3, 0xE9B5DBA5 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 4, 0x3956C25B + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 5, 0x59F111F1 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 6, 0x923F82A4 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 7, 0xAB1C5ED5 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 8, 0xD807AA98 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 9, 0x12835B01 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 10, 0x243185BE + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 11, 0x550C7DC3 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 12, 0x72BE5D74 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 13, 0x80DEB1FE + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 14, 0x9BDC06A7 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 15, 0xC19BF174 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 16, 0xE49B69C1 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 17, 0xEFBE4786 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 18, 0x0FC19DC6 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 19, 0x240CA1CC + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 20, 0x2DE92C6F + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 21, 0x4A7484AA + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 22, 0x5CB0A9DC + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 23, 0x76F988DA + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 24, 0x983E5152 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 25, 0xA831C66D + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 26, 0xB00327C8 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 27, 0xBF597FC7 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 28, 0xC6E00BF3 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 29, 0xD5A79147 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 30, 0x06CA6351 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 31, 0x14292967 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 32, 0x27B70A85 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 33, 0x2E1B2138 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 34, 0x4D2C6DFC + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 35, 0x53380D13 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 36, 0x650A7354 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 37, 0x766A0ABB + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 38, 0x81C2C92E + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 39, 0x92722C85 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 40, 0xA2BFE8A1 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 41, 0xA81A664B + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 42, 0xC24B8B70 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 43, 0xC76C51A3 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 44, 0xD192E819 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 45, 0xD6990624 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 46, 0xF40E3585 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 47, 0x106AA070 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 48, 0x19A4C116 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 49, 0x1E376C08 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 50, 0x2748774C + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 51, 0x34B0BCB5 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 52, 0x391C0CB3 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 53, 0x4ED8AA4A + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 54, 0x5B9CCA4F + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 55, 0x682E6FF3 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 56, 0x748F82EE + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 57, 0x78A5636F + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 58, 0x84C87814 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 59, 0x8CC70208 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 60, 0x90BEFFFA + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 61, 0xA4506CEB + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 62, 0xBEF9A3F7 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 63, 0xC67178F2 + ) # Feedback dig = [] - for i, x in enumerate(sha_info['digest']): - dig.append((x + ss[i]) & 0xffffffff) - sha_info['digest'] = dig + for i, x in enumerate(sha_info["digest"]): + dig.append((x + ss[i]) & 0xFFFFFFFF) + sha_info["digest"] = dig + def sha_init(): """Initialize the SHA digest.""" sha_info = new_shaobject() - sha_info['digest'] = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, - 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 32 + sha_info["digest"] = [ + 0x6A09E667, + 0xBB67AE85, + 0x3C6EF372, + 0xA54FF53A, + 0x510E527F, + 0x9B05688C, + 0x1F83D9AB, + 0x5BE0CD19, + ] + sha_info["count_lo"] = 0 + sha_info["count_hi"] = 0 + sha_info["local"] = 0 + sha_info["digestsize"] = 32 return sha_info + def sha224_init(): """Initialize a SHA224 digest.""" sha_info = new_shaobject() - sha_info['digest'] = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, - 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 28 + sha_info["digest"] = [ + 0xC1059ED8, + 0x367CD507, + 0x3070DD17, + 0xF70E5939, + 0xFFC00B31, + 0x68581511, + 0x64F98FA7, + 0xBEFA4FA4, + ] + sha_info["count_lo"] = 0 + sha_info["count_hi"] = 0 + sha_info["local"] = 0 + sha_info["digestsize"] = 28 return sha_info + def getbuf(s): if isinstance(s, str): - return s.encode('ascii') + return s.encode("ascii") return bytes(s) + def sha_update(sha_info, buffer): """Update the SHA digest. :param dict sha_info: SHA Digest. @@ -184,79 +339,82 @@ def sha_update(sha_info, buffer): raise TypeError("Unicode strings must be encoded before hashing") count = len(buffer) buffer_idx = 0 - clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff - if clo < sha_info['count_lo']: - sha_info['count_hi'] += 1 - sha_info['count_lo'] = clo + clo = (sha_info["count_lo"] + (count << 3)) & 0xFFFFFFFF + if clo < sha_info["count_lo"]: + sha_info["count_hi"] += 1 + sha_info["count_lo"] = clo - sha_info['count_hi'] += (count >> 29) + sha_info["count_hi"] += count >> 29 - if sha_info['local']: - i = SHA_BLOCKSIZE - sha_info['local'] + if sha_info["local"]: + i = SHA_BLOCKSIZE - sha_info["local"] if i > count: i = count # copy buffer - for x in enumerate(buffer[buffer_idx:buffer_idx+i]): - sha_info['data'][sha_info['local']+x[0]] = x[1] + for x in enumerate(buffer[buffer_idx : buffer_idx + i]): + sha_info["data"][sha_info["local"] + x[0]] = x[1] count -= i buffer_idx += i - sha_info['local'] += i - if sha_info['local'] == SHA_BLOCKSIZE: + sha_info["local"] += i + if sha_info["local"] == SHA_BLOCKSIZE: sha_transform(sha_info) - sha_info['local'] = 0 + sha_info["local"] = 0 else: return while count >= SHA_BLOCKSIZE: # copy buffer - sha_info['data'] = list(buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]) + sha_info["data"] = list(buffer[buffer_idx : buffer_idx + SHA_BLOCKSIZE]) count -= SHA_BLOCKSIZE buffer_idx += SHA_BLOCKSIZE sha_transform(sha_info) - # copy buffer - pos = sha_info['local'] - sha_info['data'][pos:pos+count] = list(buffer[buffer_idx:buffer_idx + count]) - sha_info['local'] = count + pos = sha_info["local"] + sha_info["data"][pos : pos + count] = list(buffer[buffer_idx : buffer_idx + count]) + sha_info["local"] = count + def sha_final(sha_info): """Finish computing the SHA Digest.""" - lo_bit_count = sha_info['count_lo'] - hi_bit_count = sha_info['count_hi'] - count = (lo_bit_count >> 3) & 0x3f - sha_info['data'][count] = 0x80 + lo_bit_count = sha_info["count_lo"] + hi_bit_count = sha_info["count_hi"] + count = (lo_bit_count >> 3) & 0x3F + sha_info["data"][count] = 0x80 count += 1 if count > SHA_BLOCKSIZE - 8: # zero the bytes in data after the count - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + sha_info["data"] = sha_info["data"][:count] + ([0] * (SHA_BLOCKSIZE - count)) sha_transform(sha_info) # zero bytes in data - sha_info['data'] = [0] * SHA_BLOCKSIZE + sha_info["data"] = [0] * SHA_BLOCKSIZE else: - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + sha_info["data"] = sha_info["data"][:count] + ([0] * (SHA_BLOCKSIZE - count)) - sha_info['data'][56] = (hi_bit_count >> 24) & 0xff - sha_info['data'][57] = (hi_bit_count >> 16) & 0xff - sha_info['data'][58] = (hi_bit_count >> 8) & 0xff - sha_info['data'][59] = (hi_bit_count >> 0) & 0xff - sha_info['data'][60] = (lo_bit_count >> 24) & 0xff - sha_info['data'][61] = (lo_bit_count >> 16) & 0xff - sha_info['data'][62] = (lo_bit_count >> 8) & 0xff - sha_info['data'][63] = (lo_bit_count >> 0) & 0xff + sha_info["data"][56] = (hi_bit_count >> 24) & 0xFF + sha_info["data"][57] = (hi_bit_count >> 16) & 0xFF + sha_info["data"][58] = (hi_bit_count >> 8) & 0xFF + sha_info["data"][59] = (hi_bit_count >> 0) & 0xFF + sha_info["data"][60] = (lo_bit_count >> 24) & 0xFF + sha_info["data"][61] = (lo_bit_count >> 16) & 0xFF + sha_info["data"][62] = (lo_bit_count >> 8) & 0xFF + sha_info["data"][63] = (lo_bit_count >> 0) & 0xFF sha_transform(sha_info) dig = [] - for i in sha_info['digest']: - dig.extend([((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff)]) + for i in sha_info["digest"]: + dig.extend( + [((i >> 24) & 0xFF), ((i >> 16) & 0xFF), ((i >> 8) & 0xFF), (i & 0xFF)] + ) return bytes(dig) + # pylint: disable=protected-access -class sha256(): +class sha256: digest_size = digestsize = SHA_DIGESTSIZE block_size = SHA_BLOCKSIZE name = "sha256" @@ -275,13 +433,13 @@ def update(self, s): def digest(self): """Returns the digest of the data passed to the update() method so far.""" - return sha_final(self._sha.copy())[:self._sha['digestsize']] + return sha_final(self._sha.copy())[: self._sha["digestsize"]] def hexdigest(self): """Like digest() except the digest is returned as a string object of double length, containing only hexadecimal digits. """ - return ''.join(['%.2x' % i for i in self.digest()]) + return "".join(["%.2x" % i for i in self.digest()]) def copy(self): """Return a copy (“clone”) of the hash object. @@ -290,6 +448,7 @@ def copy(self): new._sha = self._sha.copy() return new + # pylint: disable=protected-access, super-init-not-called class sha224(sha256): digest_size = digestsize = 28 diff --git a/adafruit_hashlib/_sha512.py b/adafruit_hashlib/_sha512.py index 40e9560..b3c9531 100644 --- a/adafruit_hashlib/_sha512.py +++ b/adafruit_hashlib/_sha512.py @@ -33,23 +33,28 @@ SHA_BLOCKSIZE = 128 SHA_DIGESTSIZE = 64 + def new_shaobject(): """Struct. for storing SHA information.""" return { - 'digest': [0]*8, - 'count_lo': 0, - 'count_hi': 0, - 'data': [0]* SHA_BLOCKSIZE, - 'local': 0, - 'digestsize': 0 + "digest": [0] * 8, + "count_lo": 0, + "count_hi": 0, + "data": [0] * SHA_BLOCKSIZE, + "local": 0, + "digestsize": 0, } + # Various logical functions -ROR64 = lambda x, y: (((x & 0xffffffffffffffff) >> (y & 63)) | (x << (64 - (y & 63)))) & 0xffffffffffffffff +ROR64 = ( + lambda x, y: (((x & 0xFFFFFFFFFFFFFFFF) >> (y & 63)) | (x << (64 - (y & 63)))) + & 0xFFFFFFFFFFFFFFFF +) Ch = lambda x, y, z: (z ^ (x & (y ^ z))) Maj = lambda x, y, z: (((x | y) & z) | (x & y)) S = lambda x, n: ROR64(x, n) -R = lambda x, n: (x & 0xffffffffffffffff) >> n +R = lambda x, n: (x & 0xFFFFFFFFFFFFFFFF) >> n Sigma0 = lambda x: (S(x, 28) ^ S(x, 34) ^ S(x, 39)) Sigma1 = lambda x: (S(x, 14) ^ S(x, 18) ^ S(x, 41)) Gamma0 = lambda x: (S(x, 1) ^ S(x, 8) ^ R(x, 7)) @@ -59,141 +64,329 @@ def new_shaobject(): def sha_transform(sha_info): W = [] - d = sha_info['data'] + d = sha_info["data"] for i in range(0, 16): - W.append((d[8*i]<<56) + (d[8*i+1]<<48) + (d[8*i+2]<<40) + (d[8*i+3]<<32) + (d[8*i+4]<<24) + (d[8*i+5]<<16) + (d[8*i+6]<<8) + d[8*i+7]) + W.append( + (d[8 * i] << 56) + + (d[8 * i + 1] << 48) + + (d[8 * i + 2] << 40) + + (d[8 * i + 3] << 32) + + (d[8 * i + 4] << 24) + + (d[8 * i + 5] << 16) + + (d[8 * i + 6] << 8) + + d[8 * i + 7] + ) for i in range(16, 80): - W.append((Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffffffffffff) + W.append( + (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) + & 0xFFFFFFFFFFFFFFFF + ) - ss = sha_info['digest'][:] + ss = sha_info["digest"][:] # pylint: disable=line-too-long, too-many-arguments def RND(a, b, c, d, e, f, g, h, i, ki): - t0 = (h + Sigma1(e) + Ch(e, f, g) + ki + W[i]) & 0xffffffffffffffff - t1 = (Sigma0(a) + Maj(a, b, c)) & 0xffffffffffffffff - d = (d + t0) & 0xffffffffffffffff - h = (t0 + t1) & 0xffffffffffffffff - return d & 0xffffffffffffffff, h & 0xffffffffffffffff - - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 0, 0x428a2f98d728ae22) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 1, 0x7137449123ef65cd) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 2, 0xb5c0fbcfec4d3b2f) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 3, 0xe9b5dba58189dbbc) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 4, 0x3956c25bf348b538) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 5, 0x59f111f1b605d019) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 6, 0x923f82a4af194f9b) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 7, 0xab1c5ed5da6d8118) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 8, 0xd807aa98a3030242) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 9, 0x12835b0145706fbe) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 10, 0x243185be4ee4b28c) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 11, 0x550c7dc3d5ffb4e2) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 12, 0x72be5d74f27b896f) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 13, 0x80deb1fe3b1696b1) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 14, 0x9bdc06a725c71235) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 15, 0xc19bf174cf692694) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 16, 0xe49b69c19ef14ad2) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 17, 0xefbe4786384f25e3) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 18, 0x0fc19dc68b8cd5b5) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 19, 0x240ca1cc77ac9c65) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 20, 0x2de92c6f592b0275) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 21, 0x4a7484aa6ea6e483) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 22, 0x5cb0a9dcbd41fbd4) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 23, 0x76f988da831153b5) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 24, 0x983e5152ee66dfab) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 25, 0xa831c66d2db43210) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 26, 0xb00327c898fb213f) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 27, 0xbf597fc7beef0ee4) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 28, 0xc6e00bf33da88fc2) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 29, 0xd5a79147930aa725) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 30, 0x06ca6351e003826f) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 31, 0x142929670a0e6e70) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 32, 0x27b70a8546d22ffc) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 33, 0x2e1b21385c26c926) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 34, 0x4d2c6dfc5ac42aed) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 35, 0x53380d139d95b3df) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 36, 0x650a73548baf63de) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 37, 0x766a0abb3c77b2a8) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 38, 0x81c2c92e47edaee6) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 39, 0x92722c851482353b) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 40, 0xa2bfe8a14cf10364) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 41, 0xa81a664bbc423001) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 42, 0xc24b8b70d0f89791) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 43, 0xc76c51a30654be30) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 44, 0xd192e819d6ef5218) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 45, 0xd69906245565a910) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 46, 0xf40e35855771202a) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 47, 0x106aa07032bbd1b8) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 48, 0x19a4c116b8d2d0c8) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 49, 0x1e376c085141ab53) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 50, 0x2748774cdf8eeb99) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 51, 0x34b0bcb5e19b48a8) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 52, 0x391c0cb3c5c95a63) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 53, 0x4ed8aa4ae3418acb) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 54, 0x5b9cca4f7763e373) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 55, 0x682e6ff3d6b2b8a3) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 56, 0x748f82ee5defb2fc) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 57, 0x78a5636f43172f60) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 58, 0x84c87814a1f0ab72) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 59, 0x8cc702081a6439ec) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 60, 0x90befffa23631e28) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 61, 0xa4506cebde82bde9) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 62, 0xbef9a3f7b2c67915) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 63, 0xc67178f2e372532b) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 64, 0xca273eceea26619c) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 65, 0xd186b8c721c0c207) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 66, 0xeada7dd6cde0eb1e) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 67, 0xf57d4f7fee6ed178) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 68, 0x06f067aa72176fba) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 69, 0x0a637dc5a2c898a6) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 70, 0x113f9804bef90dae) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 71, 0x1b710b35131c471b) - ss[3], ss[7] = RND(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 72, 0x28db77f523047d84) - ss[2], ss[6] = RND(ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 73, 0x32caab7b40c72493) - ss[1], ss[5] = RND(ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 74, 0x3c9ebe0a15c9bebc) - ss[0], ss[4] = RND(ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 75, 0x431d67c49c100d4c) - ss[7], ss[3] = RND(ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 76, 0x4cc5d4becb3e42b6) - ss[6], ss[2] = RND(ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 77, 0x597f299cfc657e2a) - ss[5], ss[1] = RND(ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 78, 0x5fcb6fab3ad6faec) - ss[4], ss[0] = RND(ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 79, 0x6c44198c4a475817) + t0 = (h + Sigma1(e) + Ch(e, f, g) + ki + W[i]) & 0xFFFFFFFFFFFFFFFF + t1 = (Sigma0(a) + Maj(a, b, c)) & 0xFFFFFFFFFFFFFFFF + d = (d + t0) & 0xFFFFFFFFFFFFFFFF + h = (t0 + t1) & 0xFFFFFFFFFFFFFFFF + return d & 0xFFFFFFFFFFFFFFFF, h & 0xFFFFFFFFFFFFFFFF + + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 0, 0x428A2F98D728AE22 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 1, 0x7137449123EF65CD + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 2, 0xB5C0FBCFEC4D3B2F + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 3, 0xE9B5DBA58189DBBC + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 4, 0x3956C25BF348B538 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 5, 0x59F111F1B605D019 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 6, 0x923F82A4AF194F9B + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 7, 0xAB1C5ED5DA6D8118 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 8, 0xD807AA98A3030242 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 9, 0x12835B0145706FBE + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 10, 0x243185BE4EE4B28C + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 11, 0x550C7DC3D5FFB4E2 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 12, 0x72BE5D74F27B896F + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 13, 0x80DEB1FE3B1696B1 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 14, 0x9BDC06A725C71235 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 15, 0xC19BF174CF692694 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 16, 0xE49B69C19EF14AD2 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 17, 0xEFBE4786384F25E3 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 18, 0x0FC19DC68B8CD5B5 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 19, 0x240CA1CC77AC9C65 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 20, 0x2DE92C6F592B0275 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 21, 0x4A7484AA6EA6E483 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 22, 0x5CB0A9DCBD41FBD4 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 23, 0x76F988DA831153B5 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 24, 0x983E5152EE66DFAB + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 25, 0xA831C66D2DB43210 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 26, 0xB00327C898FB213F + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 27, 0xBF597FC7BEEF0EE4 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 28, 0xC6E00BF33DA88FC2 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 29, 0xD5A79147930AA725 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 30, 0x06CA6351E003826F + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 31, 0x142929670A0E6E70 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 32, 0x27B70A8546D22FFC + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 33, 0x2E1B21385C26C926 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 34, 0x4D2C6DFC5AC42AED + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 35, 0x53380D139D95B3DF + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 36, 0x650A73548BAF63DE + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 37, 0x766A0ABB3C77B2A8 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 38, 0x81C2C92E47EDAEE6 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 39, 0x92722C851482353B + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 40, 0xA2BFE8A14CF10364 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 41, 0xA81A664BBC423001 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 42, 0xC24B8B70D0F89791 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 43, 0xC76C51A30654BE30 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 44, 0xD192E819D6EF5218 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 45, 0xD69906245565A910 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 46, 0xF40E35855771202A + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 47, 0x106AA07032BBD1B8 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 48, 0x19A4C116B8D2D0C8 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 49, 0x1E376C085141AB53 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 50, 0x2748774CDF8EEB99 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 51, 0x34B0BCB5E19B48A8 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 52, 0x391C0CB3C5C95A63 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 53, 0x4ED8AA4AE3418ACB + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 54, 0x5B9CCA4F7763E373 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 55, 0x682E6FF3D6B2B8A3 + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 56, 0x748F82EE5DEFB2FC + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 57, 0x78A5636F43172F60 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 58, 0x84C87814A1F0AB72 + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 59, 0x8CC702081A6439EC + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 60, 0x90BEFFFA23631E28 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 61, 0xA4506CEBDE82BDE9 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 62, 0xBEF9A3F7B2C67915 + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 63, 0xC67178F2E372532B + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 64, 0xCA273ECEEA26619C + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 65, 0xD186B8C721C0C207 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 66, 0xEADA7DD6CDE0EB1E + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 67, 0xF57D4F7FEE6ED178 + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 68, 0x06F067AA72176FBA + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 69, 0x0A637DC5A2C898A6 + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 70, 0x113F9804BEF90DAE + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 71, 0x1B710B35131C471B + ) + ss[3], ss[7] = RND( + ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], 72, 0x28DB77F523047D84 + ) + ss[2], ss[6] = RND( + ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], 73, 0x32CAAB7B40C72493 + ) + ss[1], ss[5] = RND( + ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], 74, 0x3C9EBE0A15C9BEBC + ) + ss[0], ss[4] = RND( + ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], ss[4], 75, 0x431D67C49C100D4C + ) + ss[7], ss[3] = RND( + ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], ss[3], 76, 0x4CC5D4BECB3E42B6 + ) + ss[6], ss[2] = RND( + ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], ss[2], 77, 0x597F299CFC657E2A + ) + ss[5], ss[1] = RND( + ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], ss[1], 78, 0x5FCB6FAB3AD6FAEC + ) + ss[4], ss[0] = RND( + ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7], ss[0], 79, 0x6C44198C4A475817 + ) # Feedback dig = [] - for i, x in enumerate(sha_info['digest']): - dig.append((x + ss[i]) & 0xffffffffffffffff) - sha_info['digest'] = dig + for i, x in enumerate(sha_info["digest"]): + dig.append((x + ss[i]) & 0xFFFFFFFFFFFFFFFF) + sha_info["digest"] = dig + def sha_init(): """Initialize the SHA digest.""" sha_info = new_shaobject() - sha_info['digest'] = [0x6a09e667f3bcc908, 0xbb67ae8584caa73b, - 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, - 0x510e527fade682d1, 0x9b05688c2b3e6c1f, - 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 64 + sha_info["digest"] = [ + 0x6A09E667F3BCC908, + 0xBB67AE8584CAA73B, + 0x3C6EF372FE94F82B, + 0xA54FF53A5F1D36F1, + 0x510E527FADE682D1, + 0x9B05688C2B3E6C1F, + 0x1F83D9ABFB41BD6B, + 0x5BE0CD19137E2179, + ] + sha_info["count_lo"] = 0 + sha_info["count_hi"] = 0 + sha_info["local"] = 0 + sha_info["digestsize"] = 64 return sha_info + def sha384_init(): """Initialize a SHA384 digest.""" sha_info = new_shaobject() - sha_info['digest'] = [0xcbbb9d5dc1059ed8, 0x629a292a367cd507, - 0x9159015a3070dd17, 0x152fecd8f70e5939, - 0x67332667ffc00b31, 0x8eb44a8768581511, - 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 48 + sha_info["digest"] = [ + 0xCBBB9D5DC1059ED8, + 0x629A292A367CD507, + 0x9159015A3070DD17, + 0x152FECD8F70E5939, + 0x67332667FFC00B31, + 0x8EB44A8768581511, + 0xDB0C2E0D64F98FA7, + 0x47B5481DBEFA4FA4, + ] + sha_info["count_lo"] = 0 + sha_info["count_hi"] = 0 + sha_info["local"] = 0 + sha_info["digestsize"] = 48 return sha_info + def getbuf(s): if isinstance(s, str): - return s.encode('ascii') + return s.encode("ascii") return bytes(s) + def sha_update(sha_info, buffer): """Update the SHA digest. :param dict sha_info: SHA Digest. @@ -203,87 +396,100 @@ def sha_update(sha_info, buffer): raise TypeError("Unicode strings must be encoded before hashing") count = len(buffer) buffer_idx = 0 - clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff - if clo < sha_info['count_lo']: - sha_info['count_hi'] += 1 - sha_info['count_lo'] = clo + clo = (sha_info["count_lo"] + (count << 3)) & 0xFFFFFFFF + if clo < sha_info["count_lo"]: + sha_info["count_hi"] += 1 + sha_info["count_lo"] = clo - sha_info['count_hi'] += (count >> 29) + sha_info["count_hi"] += count >> 29 - if sha_info['local']: - i = SHA_BLOCKSIZE - sha_info['local'] + if sha_info["local"]: + i = SHA_BLOCKSIZE - sha_info["local"] if i > count: i = count # copy buffer - for x in enumerate(buffer[buffer_idx:buffer_idx+i]): - sha_info['data'][sha_info['local']+x[0]] = x[1] + for x in enumerate(buffer[buffer_idx : buffer_idx + i]): + sha_info["data"][sha_info["local"] + x[0]] = x[1] count -= i buffer_idx += i - sha_info['local'] += i - if sha_info['local'] == SHA_BLOCKSIZE: + sha_info["local"] += i + if sha_info["local"] == SHA_BLOCKSIZE: sha_transform(sha_info) - sha_info['local'] = 0 + sha_info["local"] = 0 else: return while count >= SHA_BLOCKSIZE: # copy buffer - sha_info['data'] = list(buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]) + sha_info["data"] = list(buffer[buffer_idx : buffer_idx + SHA_BLOCKSIZE]) count -= SHA_BLOCKSIZE buffer_idx += SHA_BLOCKSIZE sha_transform(sha_info) # copy buffer - pos = sha_info['local'] - sha_info['data'][pos:pos+count] = list(buffer[buffer_idx:buffer_idx + count]) - sha_info['local'] = count + pos = sha_info["local"] + sha_info["data"][pos : pos + count] = list(buffer[buffer_idx : buffer_idx + count]) + sha_info["local"] = count + def sha_final(sha_info): """Finish computing the SHA Digest.""" - lo_bit_count = sha_info['count_lo'] - hi_bit_count = sha_info['count_hi'] - count = (lo_bit_count >> 3) & 0x7f - sha_info['data'][count] = 0x80 + lo_bit_count = sha_info["count_lo"] + hi_bit_count = sha_info["count_hi"] + count = (lo_bit_count >> 3) & 0x7F + sha_info["data"][count] = 0x80 count += 1 if count > SHA_BLOCKSIZE - 16: # zero the bytes in data after the count - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + sha_info["data"] = sha_info["data"][:count] + ([0] * (SHA_BLOCKSIZE - count)) sha_transform(sha_info) # zero bytes in data - sha_info['data'] = [0] * SHA_BLOCKSIZE + sha_info["data"] = [0] * SHA_BLOCKSIZE else: - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) - - sha_info['data'][112] = 0 - sha_info['data'][113] = 0 - sha_info['data'][114] = 0 - sha_info['data'][115] = 0 - sha_info['data'][116] = 0 - sha_info['data'][117] = 0 - sha_info['data'][118] = 0 - sha_info['data'][119] = 0 - - sha_info['data'][120] = (hi_bit_count >> 24) & 0xff - sha_info['data'][121] = (hi_bit_count >> 16) & 0xff - sha_info['data'][122] = (hi_bit_count >> 8) & 0xff - sha_info['data'][123] = (hi_bit_count >> 0) & 0xff - sha_info['data'][124] = (lo_bit_count >> 24) & 0xff - sha_info['data'][125] = (lo_bit_count >> 16) & 0xff - sha_info['data'][126] = (lo_bit_count >> 8) & 0xff - sha_info['data'][127] = (lo_bit_count >> 0) & 0xff + sha_info["data"] = sha_info["data"][:count] + ([0] * (SHA_BLOCKSIZE - count)) + + sha_info["data"][112] = 0 + sha_info["data"][113] = 0 + sha_info["data"][114] = 0 + sha_info["data"][115] = 0 + sha_info["data"][116] = 0 + sha_info["data"][117] = 0 + sha_info["data"][118] = 0 + sha_info["data"][119] = 0 + + sha_info["data"][120] = (hi_bit_count >> 24) & 0xFF + sha_info["data"][121] = (hi_bit_count >> 16) & 0xFF + sha_info["data"][122] = (hi_bit_count >> 8) & 0xFF + sha_info["data"][123] = (hi_bit_count >> 0) & 0xFF + sha_info["data"][124] = (lo_bit_count >> 24) & 0xFF + sha_info["data"][125] = (lo_bit_count >> 16) & 0xFF + sha_info["data"][126] = (lo_bit_count >> 8) & 0xFF + sha_info["data"][127] = (lo_bit_count >> 0) & 0xFF sha_transform(sha_info) dig = [] - for i in sha_info['digest']: - dig.extend([((i>>56) & 0xff), ((i>>48) & 0xff), ((i>>40) & 0xff), ((i>>32) & 0xff), ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff)]) + for i in sha_info["digest"]: + dig.extend( + [ + ((i >> 56) & 0xFF), + ((i >> 48) & 0xFF), + ((i >> 40) & 0xFF), + ((i >> 32) & 0xFF), + ((i >> 24) & 0xFF), + ((i >> 16) & 0xFF), + ((i >> 8) & 0xFF), + (i & 0xFF), + ] + ) return bytes(dig) + # pylint: disable=protected-access -class sha512(): +class sha512: digest_size = digestsize = SHA_DIGESTSIZE block_size = SHA_BLOCKSIZE name = "sha512" @@ -302,13 +508,13 @@ def update(self, s): def digest(self): """Returns the digest of the data passed to the update() method so far.""" - return sha_final(self._sha.copy())[:self._sha['digestsize']] + return sha_final(self._sha.copy())[: self._sha["digestsize"]] def hexdigest(self): """Like digest() except the digest is returned as a string object of double length, containing only hexadecimal digits. """ - return ''.join(['%.2x' % i for i in self.digest()]) + return "".join(["%.2x" % i for i in self.digest()]) def copy(self): """Return a copy (“clone”) of the hash object. @@ -317,6 +523,7 @@ def copy(self): new._sha = self._sha.copy() return new + # pylint: disable=protected-access, super-init-not-called class sha384(sha512): digest_size = digestsize = 48 diff --git a/docs/conf.py b/docs/conf.py index c8c24f8..f7d6cef 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,7 +2,8 @@ import os import sys -sys.path.insert(0, os.path.abspath('..')) + +sys.path.insert(0, os.path.abspath("..")) # -- General configuration ------------------------------------------------ @@ -10,10 +11,10 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.napoleon', - 'sphinx.ext.todo', + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", + "sphinx.ext.todo", ] # TODO: Please Read! @@ -23,29 +24,32 @@ # autodoc_mock_imports = ["digitalio", "busio"] -intersphinx_mapping = {'python': ('https://docs.python.org/3.4', None),'CircuitPython': ('https://circuitpython.readthedocs.io/en/latest/', None)} +intersphinx_mapping = { + "python": ("https://docs.python.org/3.4", None), + "CircuitPython": ("https://circuitpython.readthedocs.io/en/latest/", None), +} # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] -source_suffix = '.rst' +source_suffix = ".rst" # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'Adafruit hashlib Library' -copyright = u'2019 Brent Rubell' -author = u'Brent Rubell' +project = "Adafruit hashlib Library" +copyright = "2019 Brent Rubell" +author = "Brent Rubell" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = u'1.0' +version = "1.0" # The full version, including alpha/beta/rc tags. -release = u'1.0' +release = "1.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -57,7 +61,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '.env', 'CODE_OF_CONDUCT.md'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".env", "CODE_OF_CONDUCT.md"] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -69,7 +73,7 @@ add_function_parentheses = True # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -84,59 +88,62 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -on_rtd = os.environ.get('READTHEDOCS', None) == 'True' +on_rtd = os.environ.get("READTHEDOCS", None) == "True" if not on_rtd: # only import and set the theme if we're building docs locally try: import sphinx_rtd_theme - html_theme = 'sphinx_rtd_theme' - html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), '.'] + + html_theme = "sphinx_rtd_theme" + html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] except: - html_theme = 'default' - html_theme_path = ['.'] + html_theme = "default" + html_theme_path = ["."] else: - html_theme_path = ['.'] + html_theme_path = ["."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # -html_favicon = '_static/favicon.ico' +html_favicon = "_static/favicon.ico" # Output file base name for HTML help builder. -htmlhelp_basename = 'AdafruitHashlibLibrarydoc' +htmlhelp_basename = "AdafruitHashlibLibrarydoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'AdafruithashlibLibrary.tex', u'Adafruithashlib Library Documentation', - author, 'manual'), + ( + master_doc, + "AdafruithashlibLibrary.tex", + "Adafruithashlib Library Documentation", + author, + "manual", + ), ] # -- Options for manual page output --------------------------------------- @@ -144,8 +151,13 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'Adafruithashliblibrary', u'Adafruit hashlib Library Documentation', - [author], 1) + ( + master_doc, + "Adafruithashliblibrary", + "Adafruit hashlib Library Documentation", + [author], + 1, + ) ] # -- Options for Texinfo output ------------------------------------------- @@ -154,7 +166,13 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'AdafruithashlibLibrary', u'Adafruit hashlib Library Documentation', - author, 'AdafruithashlibLibrary', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "AdafruithashlibLibrary", + "Adafruit hashlib Library Documentation", + author, + "AdafruithashlibLibrary", + "One line description of project.", + "Miscellaneous", + ), ] diff --git a/examples/hashlib_simpletest.py b/examples/hashlib_simpletest.py index 1c5016b..f23c5ae 100755 --- a/examples/hashlib_simpletest.py +++ b/examples/hashlib_simpletest.py @@ -12,7 +12,9 @@ # Obtain the digest, digest size, and block size print( "Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( - m.hexdigest(), m.digest_size, m.block_size)) + m.hexdigest(), m.digest_size, m.block_size + ) +) # Validate the digest against CPython3 hashlib-sha1 assert ( m.hexdigest() == "62c6e222ccd72f21b8ce0c61f42860d6c70954c0" @@ -27,7 +29,9 @@ # Obtain the digest, digest size, and block size print( "Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( - m.hexdigest(), m.digest_size, m.block_size)) + m.hexdigest(), m.digest_size, m.block_size + ) +) # Validate the digest against CPython hashlib-sha224 assert ( m.hexdigest() == "744535a10879be6b18bbcdd135032891346f530a7845d580f7869f36" @@ -39,8 +43,11 @@ # Update the hash object with byte_string m.update(byte_string) # Obtain the digest, digest size, and block size -print("Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( - m.hexdigest(), m.digest_size, m.block_size)) +print( + "Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( + m.hexdigest(), m.digest_size, m.block_size + ) +) # Validate the digest against CPython hashlib-sha256 assert ( m.hexdigest() == "3ce8334ca39e66afb9c37d571da4caad68ab4a8bcbd6d584f75e4268e36c0954" @@ -52,11 +59,15 @@ # Update the hash object with byte_string m.update(byte_string) # Obtain the digest, digest size, and block size -print("Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( - m.hexdigest(), m.digest_size, m.block_size)) +print( + "Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( + m.hexdigest(), m.digest_size, m.block_size + ) +) # Validate the digest against CPython hashlib-sha384 assert ( - m.hexdigest() == "7a12f0815f5511b8ba52c67922d1ae86dfd9bfcc4e0799ad89a9f01fc526c8f074ddb5948c06db9893536f2e65c7621b" + m.hexdigest() + == "7a12f0815f5511b8ba52c67922d1ae86dfd9bfcc4e0799ad89a9f01fc526c8f074ddb5948c06db9893536f2e65c7621b" ), "Digest does not match expected string." # SHA-512 @@ -65,9 +76,13 @@ # Update the hash object with byte_string m.update(byte_string) # Obtain the digest, digest size, and block size -print("Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( - m.hexdigest(), m.digest_size, m.block_size)) +print( + "Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( + m.hexdigest(), m.digest_size, m.block_size + ) +) # Validate the digest against CPython hashlib-sha512 assert ( - m.hexdigest() == "20a88a9b04aa490e457f8980e57331bc85c4d6ca30735a9e502f817e74011a9ece07078e53adf70c232ac91f6c79d4cd6cc69426cd77535645fe9016a71122c2" + m.hexdigest() + == "20a88a9b04aa490e457f8980e57331bc85c4d6ca30735a9e502f817e74011a9ece07078e53adf70c232ac91f6c79d4cd6cc69426cd77535645fe9016a71122c2" ), "Digest does not match expected string." diff --git a/setup.py b/setup.py index dea6e5b..2c1606e 100644 --- a/setup.py +++ b/setup.py @@ -6,6 +6,7 @@ """ from setuptools import setup, find_packages + # To use a consistent encoding from codecs import open from os import path @@ -13,52 +14,41 @@ here = path.abspath(path.dirname(__file__)) # Get the long description from the README file -with open(path.join(here, 'README.rst'), encoding='utf-8') as f: +with open(path.join(here, "README.rst"), encoding="utf-8") as f: long_description = f.read() setup( - name='adafruit-circuitpython-hashlib', - + name="adafruit-circuitpython-hashlib", use_scm_version=True, - setup_requires=['setuptools_scm'], - - description='Secure hashes and message digests', + setup_requires=["setuptools_scm"], + description="Secure hashes and message digests", long_description=long_description, - long_description_content_type='text/x-rst', - + long_description_content_type="text/x-rst", # The project's main homepage. - url='https://github.com/adafruit/Adafruit_CircuitPython_hashlib', - + url="https://github.com/adafruit/Adafruit_CircuitPython_hashlib", # Author details - author='Adafruit Industries', - author_email='circuitpython@adafruit.com', - - install_requires=[ - 'Adafruit-Blinka' - ], - + author="Adafruit Industries", + author_email="circuitpython@adafruit.com", + install_requires=["Adafruit-Blinka"], # Choose your license - license='MIT', - + license="MIT", # See https://pypi.python.org/pypi?%3Aaction=list_classifiers classifiers=[ - 'Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'Topic :: Software Development :: Libraries', - 'Topic :: System :: Hardware', - 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries", + "Topic :: System :: Hardware", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", ], - # What does your project relate to? - keywords='adafruit blinka circuitpython micropython hashlib hashes, sha1, sha224, sha384, ' - 'sha512', - + keywords="adafruit blinka circuitpython micropython hashlib hashes, sha1, sha224, sha384, " + "sha512", # You can just specify the packages manually here if your project is # simple. Or you can use find_packages(). # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER, # CHANGE `py_modules=['...']` TO `packages=['...']` - py_modules=['adafruit_hashlib'], + py_modules=["adafruit_hashlib"], )