52#define MUL(x, y) (((uint64_t)(x)) * ((uint64_t)(y)))
65#define MUL32(h, l, x, y) do { \
66 uint64_t mul32tmp = MUL(x, y); \
67 (h) = (uint32_t)(mul32tmp >> 32); \
68 (l) = (uint32_t)mul32tmp; \
72bmul(uint32_t *hi, uint32_t *lo, uint32_t x, uint32_t y)
74 uint32_t x0, x1, x2, x3;
75 uint32_t y0, y1, y2, y3;
76 uint32_t a0, a1, a2, a3, a4, a5, a6, a7, a8;
77 uint32_t b0, b1, b2, b3, b4, b5, b6, b7, b8;
79 x0 = x & (uint32_t)0x11111111;
80 x1 = x & (uint32_t)0x22222222;
81 x2 = x & (uint32_t)0x44444444;
82 x3 = x & (uint32_t)0x88888888;
83 y0 = y & (uint32_t)0x11111111;
84 y1 = y & (uint32_t)0x22222222;
85 y2 = y & (uint32_t)0x44444444;
86 y3 = y & (uint32_t)0x88888888;
112 MUL32(b0, a0, b0, a0);
113 MUL32(b1, a1, b1, a1);
114 MUL32(b2, a2, b2, a2);
115 MUL32(b3, a3, b3, a3);
116 MUL32(b4, a4, b4, a4);
117 MUL32(b5, a5, b5, a5);
118 MUL32(b6, a6, b6, a6);
119 MUL32(b7, a7, b7, a7);
120 MUL32(b8, a8, b8, a8);
122 a0 &= (uint32_t)0x11111111;
123 a1 &= (uint32_t)0x11111111;
124 a2 &= (uint32_t)0x11111111;
125 a3 &= (uint32_t)0x11111111;
126 a4 &= (uint32_t)0x11111111;
127 a5 &= (uint32_t)0x11111111;
128 a6 &= (uint32_t)0x11111111;
129 a7 &= (uint32_t)0x11111111;
130 a8 &= (uint32_t)0x11111111;
131 b0 &= (uint32_t)0x11111111;
132 b1 &= (uint32_t)0x11111111;
133 b2 &= (uint32_t)0x11111111;
134 b3 &= (uint32_t)0x11111111;
135 b4 &= (uint32_t)0x11111111;
136 b5 &= (uint32_t)0x11111111;
137 b6 &= (uint32_t)0x11111111;
138 b7 &= (uint32_t)0x11111111;
139 b8 &= (uint32_t)0x11111111;
143 a0 ^= (a2 << 1) ^ (a1 << 2);
144 b0 ^= (b2 << 1) ^ (b1 << 2);
147 a3 ^= (a5 << 1) ^ (a4 << 2);
148 b3 ^= (b5 << 1) ^ (b4 << 2);
151 a6 ^= (a8 << 1) ^ (a7 << 2);
152 b6 ^= (b8 << 1) ^ (b7 << 2);
155 *lo = a0 ^ (a6 << 2) ^ (a3 << 4);
156 *hi = b0 ^ (b6 << 2) ^ (b3 << 4) ^ (a6 >> 30) ^ (a3 >> 28);
166bmul(uint32_t *hi, uint32_t *lo, uint32_t x, uint32_t y)
168 uint32_t x0, x1, x2, x3;
169 uint32_t y0, y1, y2, y3;
170 uint64_t z0, z1, z2, z3;
173 x0 = x & (uint32_t)0x11111111;
174 x1 = x & (uint32_t)0x22222222;
175 x2 = x & (uint32_t)0x44444444;
176 x3 = x & (uint32_t)0x88888888;
177 y0 = y & (uint32_t)0x11111111;
178 y1 = y & (uint32_t)0x22222222;
179 y2 = y & (uint32_t)0x44444444;
180 y3 = y & (uint32_t)0x88888888;
181 z0 = MUL(x0, y0) ^ MUL(x1, y3) ^ MUL(x2, y2) ^ MUL(x3, y1);
182 z1 = MUL(x0, y1) ^ MUL(x1, y0) ^ MUL(x2, y3) ^ MUL(x3, y2);
183 z2 = MUL(x0, y2) ^ MUL(x1, y1) ^ MUL(x2, y0) ^ MUL(x3, y3);
184 z3 = MUL(x0, y3) ^ MUL(x1, y2) ^ MUL(x2, y1) ^ MUL(x3, y0);
185 z0 &= (uint64_t)0x1111111111111111;
186 z1 &= (uint64_t)0x2222222222222222;
187 z2 &= (uint64_t)0x4444444444444444;
188 z3 &= (uint64_t)0x8888888888888888;
189 z = z0 | z1 | z2 | z3;
191 *hi = (uint32_t)(z >> 32);
199 uint32_t *yw = pv->
y.v;
200 const uint32_t *hw = pv->
key.h.v;
208 uint32_t a[9], b[9], zw[8];
209 uint32_t c0, c1, c2, c3, d0, d1, d2, d3, e0, e1, e2, e3;
244 for (i = 0; i < 9; i ++) {
245 bmul(&b[i], &a[i], b[i], a[i]);
249 c1 = b[0] ^ a[2] ^ a[0] ^ a[1];
250 c2 = a[1] ^ b[2] ^ b[0] ^ b[1];
253 d1 = b[3] ^ a[5] ^ a[3] ^ a[4];
254 d2 = a[4] ^ b[5] ^ b[3] ^ b[4];
257 e1 = b[6] ^ a[8] ^ a[6] ^ a[7];
258 e2 = a[7] ^ b[8] ^ b[6] ^ b[7];
279 zw[1] = (c1 << 1) | (c0 >> 31);
280 zw[2] = (c2 << 1) | (c1 >> 31);
281 zw[3] = (c3 << 1) | (c2 >> 31);
282 zw[4] = (d0 << 1) | (c3 >> 31);
283 zw[5] = (d1 << 1) | (d0 >> 31);
284 zw[6] = (d2 << 1) | (d1 >> 31);
285 zw[7] = (d3 << 1) | (d2 >> 31);
301 for (i = 0; i < 4; i ++) {
305 zw[i + 4] ^= lw ^ (lw >> 1) ^ (lw >> 2) ^ (lw >> 7);
306 zw[i + 3] ^= (lw << 31) ^ (lw << 30) ^ (lw << 25);
308 memcpy(yw, zw + 4, 16);