|
@@ -0,0 +1,69 @@
|
|
|
|
+#include <stdint.h>
|
|
|
|
+#include <stdlib.h>
|
|
|
|
+
|
|
|
|
+#include <gmp.h>
|
|
|
|
+
|
|
|
|
+#include "fbase.h"
|
|
|
|
+#include "group.h"
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+fbase_ptr fb_init()
|
|
|
|
+{
|
|
|
|
+ fbase_ptr pb = (fbase_ptr) calloc(FB_FRAMES, sizeof(fbase_unit));
|
|
|
|
+
|
|
|
|
+ for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
|
|
+ for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
+ mpz_init(pb[j][i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return pb;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void fb_set_small(fbase_t pb, const mpz_t n)
|
|
|
|
+{
|
|
|
|
+ mpz_t e;
|
|
|
|
+ mpz_init(e);
|
|
|
|
+ for (size_t j = 0; j < FB_FRAMES/2; j++) {
|
|
|
|
+ for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
+ uint64_t e = (0x01 << 8*j) * i;
|
|
|
|
+ powmp_ui(pb[j][i], n, e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ mpz_clear(e);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void fb_copy(fbase_t dst, fbase_t source)
|
|
|
|
+{
|
|
|
|
+ for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
|
|
+ for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
+ mpz_set(dst[j][i], source[j][i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void fb_set(fbase_t pb, const mpz_t n)
|
|
|
|
+{
|
|
|
|
+ mpz_t e;
|
|
|
|
+ mpz_init(e);
|
|
|
|
+ for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
|
|
+ for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
+ mpz_set_ui(e, 1);
|
|
|
|
+ mpz_mul_2exp(e, e, 8*j);
|
|
|
|
+ mpz_mul_ui(e, e, i);
|
|
|
|
+
|
|
|
|
+ mpz_powm(pb[j][i], n, e, p);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ mpz_clear(e);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void fb_clear(fbase_t pb)
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+ for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
|
|
+ for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
+ mpz_clear(pb[j][i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ free(pb);
|
|
|
|
+}
|