gf: add gf operations
[transsip-mirror.git] / src / gf.h
blobb440d5166722b5e3e04331a4df7b9d8914f1fe14
1 /*
2 * transsip - the telephony toolkit
3 * By Daniel Borkmann <daniel@transsip.org>
4 * Copyright 2012 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
5 * Swiss federal institute of technology (ETH Zurich)
6 * Subject to the GPL, version 2.
7 * Based on Bhaskar Biswas and Nicolas Sendrier McEliece
8 * implementation, LGPL 2.1.
9 */
11 #ifndef GF_H
12 #define GF_H
14 #include <stdint.h>
16 typedef uint16_t gf16_t;
18 extern uint32_t gf_extension_degree, gf_cardinality, gf_multiplicative_order;
19 extern gf16_t *gf_log_t, *gf_exp_t;
21 #define gf_extd() gf_extension_degree
22 #define gf_card() gf_cardinality
23 #define gf_ord() gf_multiplicative_order
25 #define gf_unit() 1
26 #define gf_zero() 0
28 #define gf_add(x, y) ((x) ^ (y))
29 #define gf_sub(x, y) ((x) ^ (y))
30 #define gf_exp(i) gf_exp_t[i] /* alpha^i */
31 #define gf_log(x) gf_log_t[x] /* return i when x=alpha^i */
33 #define gf_zdo(t, func) ((t) ? (func) : 0)
35 /**
36 * residual modulo q-1
37 * when -q < d < 0, we get (q-1+d)
38 * when 0 <= d < q, we get (d)
39 * when q <= d < 2q-1, we get (d-q+1)
40 * we obtain a value between 0 and (q-1) included, the class of 0 is
41 * represented by 0 or q-1 (this is why we write
42 * _K->exp[q-1] = _K->exp[0] = 1)
44 #define _gf_modq_1(d) (((d) & gf_ord()) + ((d) >> gf_extd()))
46 #define gf_mul_fast(x, y) gf_zdo(y, gf_exp[_gf_modq_1(gf_log[x] + gf_log[y])])
47 #define gf_mul(x, y) gf_zdo(x, gf_mul_fast(x, y))
48 #define gf_square(x) gf_zdo(x, gf_exp[_gf_modq_1(gf_log[x] << 1)])
49 #define gf_sqrt(x) gf_zdo(x, gf_exp[_gf_modq_1(gf_log[x] << (gf_extd() - 1))])
50 #define gf_div(x, y) gf_zdo(x, gf_exp[_gf_modq_1(gf_log[x] - gf_log[y])])
51 #define gf_inv(x) gf_exp[gf_ord() - gf_log[x]]
53 extern void gf_init(int extdeg);
54 extern gf16_t gf_rand(int (*rnd_u8)(void));
55 extern gf16_t gf_pow(gf16_t x, int i);
57 #endif /* GF_H */