),
)]
+# Trade memory for CPU for part of L() calculations
+_Cache = None
+
+
+def _cache_ensure():
+ global _Cache
+ if _Cache is not None:
+ return
+ cache = []
+ for byteN in xrange(8):
+ cache.append([0 for _ in xrange(256)])
+ for byteN in xrange(8):
+ for byteVal in xrange(256):
+ res64 = 0
+ val = byteVal
+ for bitN in xrange(8):
+ if val & 0x80 > 0:
+ res64 ^= A[(7 - byteN) * 8 + bitN]
+ val <<= 1
+ cache[byteN][byteVal] = res64
+ _Cache = cache
+
def add512bit(a, b):
"""Add two 512 integers
def L(data):
+ _cache_ensure()
res = []
for i in range(8):
- val = unpack("<Q", data[i * 8:i * 8 + 8])[0]
res64 = 0
- for j in range(BLOCKSIZE):
- if val & 0x8000000000000000:
- res64 ^= A[j]
- val <<= 1
+ for j in range(8):
+ res64 ^= _Cache[j][data[8 * i + j]]
res.append(pack("<Q", res64))
return b"".join(res)