GF2X_STORAGE_CLASS_mul2 void gf2x_mul2(unsigned long *c, const unsigned long *a, const unsigned long *b) { unsigned long t; unsigned long u[2]; gf2x_mul1 (c, a[0], b[0]); gf2x_mul1 (c+2, a[1], b[1]); t = c[1]^c[2]; gf2x_mul1 (u, a[0]^a[1], b[0]^b[1]); c[1] = c[0]^u[0]^t; c[2] = c[3]^u[1]^t; }
/* uses the variant of Karatsuba with 6 multiplications */ GF2X_STORAGE_CLASS_mul3 void gf2x_mul3 (unsigned long *c, const unsigned long *a, const unsigned long *b) { unsigned long aa[3], bb[3]; unsigned long p0[2], p1[2], p2[2]; unsigned long pp0[2], pp1[2], pp2[2]; aa[0] = a[1]^a[2]; aa[1] = a[0]^a[2]; aa[2] = a[0]^a[1]; bb[0] = b[1]^b[2]; bb[1] = b[0]^b[2]; bb[2] = b[0]^b[1]; gf2x_mul1 (p0, a[0], b[0]); gf2x_mul1 (p1, a[1], b[1]); gf2x_mul1 (p2, a[2], b[2]); gf2x_mul1 (pp0, aa[0], bb[0]); gf2x_mul1 (pp1, aa[1], bb[1]); gf2x_mul1 (pp2, aa[2], bb[2]); c[0] = p0[0]; c[1] = p0[0]^p1[0]^pp2[0] ^ p0[1]; c[2] = p0[0]^p1[0]^p2[0]^pp1[0] ^ p0[1]^p1[1]^pp2[1]; c[3] = pp0[0]^p1[0]^p2[0] ^ p0[1]^p1[1]^p2[1]^pp1[1]; c[4] = p2[0] ^ pp0[1]^p1[1]^p2[1]; c[5] = p2[1]; }