pygost/gost34112012.py | 30 +++++++++++++++++++++++++----- diff --git a/pygost/gost34112012.py b/pygost/gost34112012.py index 3eeb57d626a2a9159dd91e1e8ce0567181f55d2aec40168a5f8d9e021c748b3f..928e104787a2f1598a9f6f6c51b7b9faee39ea1cb7aafdab6a455d4961b58263 100644 --- a/pygost/gost34112012.py +++ b/pygost/gost34112012.py @@ -162,6 +162,28 @@ "faf417d5d9b21b9948bc924af11bd720", ), )] +# 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 @@ -200,14 +222,12 @@ return res def L(data): + _cache_ensure() res = [] for i in range(8): - val = unpack("