p = poly(8*w)
return gcm_mangle(C.GF.storel((C.GF.loadl(gcm_mangle(x)) << 1)%p))
+def shift_right(x):
+ """Given a field element X (in external format), return X/t."""
+ w = len(x)
+ p = poly(8*w)
+ return gcm_mangle(C.GF.storel((C.GF.loadl(gcm_mangle(x))*p.modinv(2))%p))
+
def table_common(u, v, flip, getword, ixmask):
"""
Multiply U by V using table lookup; common for `table-b' and `table-l'.
_i = iota()
TAG_INPUT_U = _i()
TAG_INPUT_V = _i()
+TAG_SHIFTED_V = _i()
TAG_KPIECE_U = _i()
TAG_KPIECE_V = _i()
TAG_PRODPIECE = _i()
TAG_PRODSUM = _i()
TAG_PRODUCT = _i()
-TAG_SHIFTED = _i()
TAG_REDCBITS = _i()
TAG_REDCFULL = _i()
TAG_REDCMIX = _i()
present_gf(y, (w + 63)&~63, n, what)
def present_gf_pmull(tag, wd, x, w, n, what):
- if tag == TAG_PRODPIECE or tag == TAG_REDCFULL or tag == TAG_SHIFTED:
+ if tag == TAG_PRODPIECE or tag == TAG_REDCFULL:
return
- elif tag == TAG_INPUT_V or tag == TAG_KPIECE_V:
+ elif tag == TAG_INPUT_V or tag == TAG_SHIFTED_V or tag == TAG_KPIECE_V:
w = (w + 63)&~63
bx = C.ReadBuffer(x.storeb(w/8))
by = C.WriteBuffer()
## And we're done.
return z.storeb(w/8)
-def poly64_common(u, v, presfn, dispwd = 32, mulwd = 64,
- redcwd = 32, klimit = 256):
+def poly64_shiftcommon(u, v, presfn, dispwd = 32, mulwd = 64,
+ redcwd = 32, klimit = 256):
+ w = 8*len(u)
+ presfn(TAG_INPUT_U, w, C.GF.loadb(u), w, dispwd, 'u')
+ presfn(TAG_INPUT_V, w, C.GF.loadb(v), w, dispwd, 'v')
+ vv = shift_right(v)
+ presfn(TAG_SHIFTED_V, w, C.GF.loadb(vv), w, dispwd, "v'")
+ y = poly64_mul(u, vv, presfn, dispwd, mulwd, klimit, "u", "v'")
+ z = poly64_redc(y, presfn, dispwd, redcwd)
+ return z
+
+def poly64_directcommon(u, v, presfn, dispwd = 32, mulwd = 64,
+ redcwd = 32, klimit = 256):
w = 8*len(u)
presfn(TAG_INPUT_U, w, C.GF.loadb(u), w, dispwd, 'u')
presfn(TAG_INPUT_V, w, C.GF.loadb(v), w, dispwd, 'v')
@demo
def demo_pclmul(u, v):
- return poly64_common(u, v, presfn = present_gf_pclmul)
+ return poly64_shiftcommon(u, v, presfn = present_gf_pclmul)
@demo
def demo_vmullp64(u, v):
w = 8*len(u)
- return poly64_common(u, v, presfn = present_gf_vmullp64,
- redcwd = w%64 == 32 and 32 or 64)
+ return poly64_shiftcommon(u, v, presfn = present_gf_vmullp64,
+ redcwd = w%64 == 32 and 32 or 64)
@demo
def demo_pmull(u, v):
w = 8*len(u)
- return poly64_common(u, v, presfn = present_gf_pmull,
- redcwd = w%64 == 32 and 32 or 64)
+ return poly64_directcommon(u, v, presfn = present_gf_pmull,
+ redcwd = w%64 == 32 and 32 or 64)
###--------------------------------------------------------------------------
### @@@ Random debris to be deleted. @@@