1 /* polynomial basis GF(2^w) routines */
6 #define FORLOOP for (i = 0; i < LSIZE; i++)
9 void gf_add(gf_intp a, gf_intp b, gf_intp c)
12 FORLOOP c[i] = a[i]^b[i];
16 void gf_copy(gf_intp a, gf_intp b)
23 void gf_zero(gf_intp a)
30 int gf_iszero(gf_intp a)
40 int gf_isone(gf_intp a)
43 for (i = 1; i < LSIZE; i++) {
52 void gf_shl(gf_intp a, gf_intp b)
58 for (i = LSIZE-1; i > 0; i--)
59 b[i] = ((tmp[i]<<1)|((tmp[i-1]&0xFFFFFFFFUL)>>31))&0xFFFFFFFFUL;
60 b[0] = (tmp[0] << 1)&0xFFFFFFFFUL;
65 void gf_shr(gf_intp a, gf_intp b)
71 for (i = 0; i < LSIZE-1; i++)
72 b[i] = (((tmp[i]&0xFFFFFFFFUL)>>1)|(tmp[i+1]<<31))&0xFFFFFFFFUL;
73 b[LSIZE-1] = (tmp[LSIZE-1]&0xFFFFFFFFUL)>>1;
77 /* returns -1 if its zero, otherwise degree of a */
84 for (i = LSIZE-1; i >= 0; i--)
86 for (t = a[i], ii = 0; t; t >>= 1, ++ii);
94 void gf_mul(gf_intp a, gf_intp b, gf_intp c)
103 for (i = 0; i < n; i++) {
104 if (ta[i>>5]&(1<<(i&31)))
112 /* q = a/b, r = a%b */
113 void gf_div(gf_intp a, gf_intp b, gf_intp q, gf_intp r)
115 gf_int ta, tb, shifts[LSIZE*32];
136 /* make shifted versions of "b" */
137 gf_copy(tb, shifts[0]);
138 for (i = 1; i <= (mag-magb); i++)
139 gf_shl(shifts[i-1], shifts[i]);
141 while (mag >= magb) {
143 q[i>>5] |= (1<<(i&31));
144 gf_add(ta, shifts[i], ta);
150 zeromem(shifts, sizeof(shifts));
154 void gf_mod(gf_intp a, gf_intp m, gf_intp b)
162 void gf_mulmod(gf_intp a, gf_intp b, gf_intp m, gf_intp c)
171 void gf_invmod(gf_intp A, gf_intp M, gf_intp B)
173 gf_int m, n, p0, p1, p2, r, q, tmp;
175 /* put all variables in known setup state */
184 /* loop until r == 0 */
185 while (!gf_iszero(r)) {
198 /* find a square root modulo a prime. Note the number of
199 * elements is 2^k - 1, so we must square k-2 times to get the
202 void gf_sqrt(gf_intp a, gf_intp M, gf_intp b)
208 gf_mulmod(b, b, M, b);
212 void gf_gcd(gf_intp A, gf_intp B, gf_intp c)
231 } while (!gf_iszero(r));
237 /* returns non-zero if 'a' is irreducible */
238 int gf_is_prime(gf_intp a)
244 u[0] = 2; /* u(x) = x */
246 for (n = 0; n < (m/2); n++) {
247 gf_mulmod(u, u, a, u); /* u(x) = u(x)^2 mod a(x) */
249 tmp[0] ^= 2; /* tmp(x) = u(x) - x */
250 gf_gcd(tmp, a, tmp); /* tmp(x) = gcd(a(x), u(x) - x) */
251 if (!gf_isone(tmp)) {
258 /* returns bytes required to store a gf_int */
259 int gf_size(gf_intp a)
267 n = n + (32 - (n&31));
272 void gf_toraw(gf_intp a, unsigned char *dst)
276 for (x = 0; x < n; x++) {
282 /* read a gf_int (len == in bytes) */
283 void gf_readraw(gf_intp a, unsigned char *str, int len)
287 for (x = 0; x < len/4; x++) {