chiark / gitweb /
Makefile, ocbgen: Handle 512-bit blocks.
[ocb-tv] / ocbgen
diff --git a/ocbgen b/ocbgen
index acdd9979e858fa300b31f1d9de2830105b7e439e..a0c360f2233c5768a28c550f8d446f2b8e0d55cb 100755 (executable)
--- a/ocbgen
+++ b/ocbgen
@@ -25,6 +25,7 @@
 from sys import argv, stderr
 from struct import pack
 from itertools import izip
+from contextlib import contextmanager
 import catacomb as C
 
 R = C.FibRand(0)
@@ -153,25 +154,35 @@ class LubyRackoffCipher (type):
     me.bc = bc
     return me
 
+@contextmanager
+def muffle():
+  global VERBOSE, LRVERBOSE
+  _v, _lrv = VERBOSE, LRVERBOSE
+  try:
+    VERBOSE = LRVERBOSE = False
+    yield None
+  finally:
+    VERBOSE, LRVERBOSE = _v, _lrv
+
 class LubyRackoffBase (object):
   NR = 4 # for strong-PRP security
   def __init__(me, k):
     if LRVERBOSE: print 'K = %s' % hex(k)
     bc, blksz = me.__class__.bc, me.__class__.blksz
-    E = bc(k)
+    with muffle(): E = bc(k)
     me.f = []
     ksz = len(k)
     i = C.MP(0)
     for j in xrange(me.NR):
       b = C.WriteBuffer()
       while b.size < ksz:
-        x = E.encrypt(i.storeb(bc.blksz))
+        with muffle(): x = E.encrypt(i.storeb(bc.blksz))
         b.put(x)
         if LRVERBOSE: print 'E(K; [%d]) = %s' % (i, hex(x))
         i += 1
       kj = C.ByteString(C.ByteString(b)[0:ksz])
       if LRVERBOSE: print 'K_%d = %s' % (j, hex(kj))
-      me.f.append(bc(kj))
+      with muffle(): me.f.append(bc(kj))
   def encrypt(me, m):
     bc, blksz = me.__class__.bc, me.__class__.blksz
     assert len(m) == blksz
@@ -179,7 +190,7 @@ class LubyRackoffBase (object):
     if LRVERBOSE: print 'L_0, R_0 = %s, %s' % (hex(l), hex(r))
     for j in xrange(me.NR):
       l0 = pad0star(l, bc.blksz)
-      t = me.f[j].encrypt(l0)
+      with muffle(): t = me.f[j].encrypt(l0)
       l, r = r ^ t[:blksz/2], l
       if LRVERBOSE:
         print 'E(K_%d; L_%d || 0^*) = %s' % (j, j, hex(t))
@@ -191,7 +202,7 @@ class LubyRackoffBase (object):
     l, r = C.ByteString(c[:blksz/2]), C.ByteString(c[blksz/2:])
     for j in xrange(me.NR - 1, -1, -1):
       l0 = pad0star(l, bc.blksz)
-      t = me.f[j].encrypt(l0)
+      with muffle(): t = me.f[j].encrypt(l0)
       if LRVERBOSE:
         print 'L_%d, R_%d = %s, %s' % (j + 1, j + 1, hex(l), hex(r))
         print 'E(K_%d; L_%d || 0^*) = %s' % (j + 1, j + 1, hex(t))
@@ -202,6 +213,7 @@ class LubyRackoffBase (object):
 LRAES = {}
 for i in [8, 12, 16, 24, 32]:
   LRAES['lraes%d' % (8*i)] = LubyRackoffCipher(C.rijndael, i)
+LRAES['dlraes512'] = LubyRackoffCipher(LubyRackoffCipher(C.rijndael, 32), 64)
 
 ###--------------------------------------------------------------------------
 ### PMAC.
@@ -386,7 +398,8 @@ OCB3_STRETCH = { 8: (5, 25),
                  12: (6, 33),
                  16: (6, 8),
                  24: (7, 40),
-                 32: (7, 120) }
+                 32: (7, 120),
+                 64: (8, 240) }
 
 def ocb3(E, n, h, m, tsz = None):
   blksz = E.__class__.blksz