]> Cypherpunks.ru repositories - pygost.git/commitdiff
3x faster 34.11-2012
authorSergey Matveev <stargrave@stargrave.org>
Thu, 21 Jan 2021 21:02:39 +0000 (00:02 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 21 Jan 2021 21:02:39 +0000 (00:02 +0300)
pygost/gost34112012.py

index ac20edd790741dd915fd52d3f8fc1494eaacfdca..2e43fe1cb6c04e3c2d80189948b55aea400b67f9 100644 (file)
@@ -162,6 +162,28 @@ C = [hexdec("".join(s))[::-1] for s in (
     ),
 )]
 
+# 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 @@ def PS(data):
 
 
 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)