X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/55b6b7226e0d53b657e533ad232aa85705ec6815..b39fadb608dd52cbd6fc8a11001661083d8d078b:/utils/advmodes diff --git a/utils/advmodes b/utils/advmodes index 62b4cde3..e0dd3868 100755 --- a/utils/advmodes +++ b/utils/advmodes @@ -522,6 +522,140 @@ def eaxgen(bc): (bc.blksz - 1, 3*bc.blksz - 5, 3*bc.blksz + 5)] ###-------------------------------------------------------------------------- +### PMAC. + +def ocb_masks(E): + blksz = E.__class__.blksz + p = poly(8*blksz) + x = C.GF(2); xinv = p.modinv(x) + z = Z(blksz) + L = E.encrypt(z) + Lxinv = mul_blk_gf(L, xinv, p) + Lgamma = 66*[L] + for i in xrange(1, len(Lgamma)): + Lgamma[i] = mul_blk_gf(Lgamma[i - 1], x, p) + return Lgamma, Lxinv + +def dump_ocb(E): + Lgamma, Lxinv = ocb_masks(E) + print 'L x^-1 = %s' % hex(Lxinv) + for i, lg in enumerate(Lgamma[:16]): + print 'L x^%d = %s' % (i, hex(lg)) + +def pmac1(E, m): + blksz = E.__class__.blksz + Lgamma, Lxinv = ocb_masks(E) + a = o = Z(blksz) + i = 0 + v, tl = blocks(m, blksz) + for x in v: + i += 1 + b = ntz(i) + o ^= Lgamma[b] + a ^= E.encrypt(x ^ o) + if VERBOSE: + print 'Z[%d]: %d -> %s' % (i, b, hex(o)) + print 'A[%d]: %s' % (i, hex(a)) + if len(tl) == blksz: a ^= tl ^ Lxinv + else: a ^= pad10star(tl, blksz) + return E.encrypt(a) + +def pmac1_pub(E, m): + if VERBOSE: dump_ocb(E) + return pmac1(E, m), + +def pmacgen(bc): + return [(0,), (1,), + (3*bc.blksz,), + (3*bc.blksz - 5,)] + +###-------------------------------------------------------------------------- +### OCB. + +def ocb1enc(E, n, h, m, tsz = None): + ## This is OCB1.PMAC1 from Rogaway's `Authenticated-Encryption with + ## Associated-Data'. + blksz = E.__class__.blksz + if VERBOSE: dump_ocb(E) + Lgamma, Lxinv = ocb_masks(E) + if tsz is None: tsz = blksz + a = Z(blksz) + o = E.encrypt(n ^ Lgamma[0]) + if VERBOSE: print 'R = %s' % hex(o) + i = 0 + y = C.WriteBuffer() + v, tl = blocks(m, blksz) + for x in v: + i += 1 + b = ntz(i) + o ^= Lgamma[b] + a ^= x + if VERBOSE: + print 'Z[%d]: %d -> %s' % (i, b, hex(o)) + print 'A[%d]: %s' % (i, hex(a)) + y.put(E.encrypt(x ^ o) ^ o) + i += 1 + b = ntz(i) + o ^= Lgamma[b] + n = len(tl) + if VERBOSE: + print 'Z[%d]: %d -> %s' % (i, b, hex(o)) + print 'LEN = %s' % hex(C.MP(8*n).storeb(blksz)) + yfinal = E.encrypt(C.MP(8*n).storeb(blksz) ^ Lxinv ^ o) + cfinal = tl ^ yfinal[:n] + a ^= o ^ (tl + yfinal[n:]) + y.put(cfinal) + t = E.encrypt(a) + if h: t ^= pmac1(E, h) + return C.ByteString(y), C.ByteString(t[:tsz]) + +def ocb1dec(E, n, h, y, t): + ## This is OCB1.PMAC1 from Rogaway's `Authenticated-Encryption with + ## Associated-Data'. + blksz = E.__class__.blksz + if VERBOSE: dump_ocb(E) + Lgamma, Lxinv = ocb_masks(E) + a = Z(blksz) + o = E.encrypt(n ^ Lgamma[0]) + if VERBOSE: print 'R = %s' % hex(o) + i = 0 + m = C.WriteBuffer() + v, tl = blocks(y, blksz) + for x in v: + i += 1 + b = ntz(i) + o ^= Lgamma[b] + if VERBOSE: + print 'Z[%d]: %d -> %s' % (i, b, hex(o)) + print 'A[%d]: %s' % (i, hex(a)) + u = E.decrypt(x ^ o) ^ o + m.put(u) + a ^= u + i += 1 + b = ntz(i) + o ^= Lgamma[b] + n = len(tl) + if VERBOSE: + print 'Z[%d]: %d -> %s' % (i, b, hex(o)) + print 'LEN = %s' % hex(C.MP(8*n).storeb(blksz)) + yfinal = E.encrypt(C.MP(8*n).storeb(blksz) ^ Lxinv ^ o) + mfinal = tl ^ yfinal[:n] + a ^= o ^ (mfinal + yfinal[n:]) + m.put(mfinal) + u = E.encrypt(a) + if h: u ^= pmac1(E, h) + if t == u[:len(t)]: return C.ByteString(m), + else: return None, + +def ocbgen(bc): + w = bc.blksz + return [(w, 0, 0), (w, 1, 0), (w, 0, 1), + (w, 0, 3*w), + (w, 3*w, 3*w), + (w, 0, 3*w + 5), + (w, 3*w - 5, 3*w + 5)] + +###-------------------------------------------------------------------------- ### Main program. class struct (object): @@ -537,7 +671,10 @@ MODEMAP = { 'eax-enc': (eaxgen, 3*[binarg] + [intarg], eaxenc), 'ccm-dec': (dummygen, 4*[binarg], ccmdec), 'cmac': (cmacgen, [binarg], cmac), 'gcm-enc': (gcmgen, 3*[binarg] + [intarg], gcmenc), - 'gcm-dec': (dummygen, 4*[binarg], gcmdec) } + 'gcm-dec': (dummygen, 4*[binarg], gcmdec), + 'ocb1-enc': (ocbgen, 3*[binarg] + [intarg], ocb1enc), + 'ocb1-dec': (dummygen, 4*[binarg], ocb1dec), + 'pmac1': (pmacgen, [binarg], pmac1_pub) } mode = argv[1] bc = None