Makefile, ocbgen: Support Ukrainian `Kalyna' block cipher.
[ocb-tv] / ocbgen
diff --git a/ocbgen b/ocbgen
index a0c360f..6368b30 100755 (executable)
--- a/ocbgen
+++ b/ocbgen
@@ -26,6 +26,8 @@ from sys import argv, stderr
 from struct import pack
 from itertools import izip
 from contextlib import contextmanager
+try: from kalyna import Kalyna
+except ImportError: Kalyna = None
 import catacomb as C
 
 R = C.FibRand(0)
@@ -140,6 +142,35 @@ def blocks0(x, w):
   return v, tl
 
 ###--------------------------------------------------------------------------
+### Kalyna decoration.
+
+KALYNA = {}
+
+if Kalyna is not None:
+
+  class KalynaCipher (type):
+    def __new__(cls, blksz):
+      assert blksz in [16, 32, 64]
+      name = 'Kalyna-%d' % (8*blksz)
+      me = type(name, (KalynaBase,), {})
+      me.name = name
+      me.blksz = blksz
+      if blksz == 64: me.keysz = C.KeySZSet(64)
+      else: me.keysz = C.KeySZSet(2*blksz, [blksz])
+      return me
+
+  class KalynaBase (object):
+    def __init__(me, k):
+      me._k = Kalyna(k, me.blksz)
+    def encrypt(me, m):
+      return C.ByteString(me._k.encrypt(m))
+    def decrypt(me, m):
+      return C.ByteString(me._k.decrypt(m))
+
+  for i in [16, 32, 64]:
+    KALYNA['kalyna%d' % (8*i)] = KalynaCipher(i)
+
+###--------------------------------------------------------------------------
 ### Luby--Rackoff large-block ciphers.
 
 class LubyRackoffCipher (type):
@@ -549,7 +580,7 @@ ocb = MODEMAP[opt]
 
 bcname = arg()
 bc = None
-for d in LRAES, C.gcprps:
+for d in LRAES, KALYNA, C.gcprps:
   try: bc = d[bcname]
   except KeyError: pass
   else: break