|
@@ -1,3 +1,5 @@
|
|
|
|
+#include "config.h"
|
|
|
|
+
|
|
#include <stdint.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
@@ -12,7 +14,7 @@ fbase_ptr fb_init()
|
|
fbase_ptr pb = (fbase_ptr) calloc(FB_FRAMES, sizeof(fbase_unit));
|
|
fbase_ptr pb = (fbase_ptr) calloc(FB_FRAMES, sizeof(fbase_unit));
|
|
|
|
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
- for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
|
|
+ for (size_t i = 0; i <= FB_MASK; i++) {
|
|
mpz_init(pb[j][i]);
|
|
mpz_init(pb[j][i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -23,10 +25,12 @@ void fb_set_small(fbase_t pb, const mpz_t n)
|
|
{
|
|
{
|
|
mpz_t e;
|
|
mpz_t e;
|
|
mpz_init(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;
|
|
|
|
|
|
+ for (size_t j = 0; j < (FB_FRAMES)/2; j++) {
|
|
|
|
+ for (size_t i = 0; i <= FB_MASK; i++) {
|
|
|
|
+ uint64_t e = (0x01 << (FB_BASE)*j) * i;
|
|
powmp_ui(pb[j][i], n, e);
|
|
powmp_ui(pb[j][i], n, e);
|
|
|
|
+
|
|
|
|
+ /* force size to be constant. */
|
|
_mpz_realloc(pb[j][i], 24);
|
|
_mpz_realloc(pb[j][i], 24);
|
|
SIZ(pb[j][i]) = 24;
|
|
SIZ(pb[j][i]) = 24;
|
|
|
|
|
|
@@ -38,8 +42,10 @@ void fb_set_small(fbase_t pb, const mpz_t n)
|
|
void fb_copy(fbase_t dst, fbase_t source)
|
|
void fb_copy(fbase_t dst, fbase_t source)
|
|
{
|
|
{
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
- for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
|
|
+ for (size_t i = 0; i <= FB_MASK; i++) {
|
|
mpz_set(dst[j][i], source[j][i]);
|
|
mpz_set(dst[j][i], source[j][i]);
|
|
|
|
+
|
|
|
|
+ /* force size to be constant */
|
|
_mpz_realloc(dst[j][i], 24);
|
|
_mpz_realloc(dst[j][i], 24);
|
|
SIZ(dst[j][i]) = 24;
|
|
SIZ(dst[j][i]) = 24;
|
|
}
|
|
}
|
|
@@ -51,9 +57,9 @@ void fb_set(fbase_t pb, const mpz_t n)
|
|
mpz_t e;
|
|
mpz_t e;
|
|
mpz_init(e);
|
|
mpz_init(e);
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
- for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
|
|
+ for (size_t i = 0; i <= FB_MASK; i++) {
|
|
mpz_set_ui(e, 1);
|
|
mpz_set_ui(e, 1);
|
|
- mpz_mul_2exp(e, e, 8*j);
|
|
|
|
|
|
+ mpz_mul_2exp(e, e, (FB_BASE)*j);
|
|
mpz_mul_ui(e, e, i);
|
|
mpz_mul_ui(e, e, i);
|
|
|
|
|
|
mpz_powm(pb[j][i], n, e, p);
|
|
mpz_powm(pb[j][i], n, e, p);
|
|
@@ -66,7 +72,7 @@ void fb_clear(fbase_t pb)
|
|
{
|
|
{
|
|
|
|
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
for (size_t j = 0; j < FB_FRAMES; j++) {
|
|
- for (size_t i = 0; i <= 0xFF; i++) {
|
|
|
|
|
|
+ for (size_t i = 0; i <= FB_MASK; i++) {
|
|
mpz_clear(pb[j][i]);
|
|
mpz_clear(pb[j][i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -77,13 +83,12 @@ void fb_clear(fbase_t pb)
|
|
void __attribute__((optimize("unroll-loops")))
|
|
void __attribute__((optimize("unroll-loops")))
|
|
fb_powmp_ui(mpz_t rop, fbase_t pb, const uint64_t exp)
|
|
fb_powmp_ui(mpz_t rop, fbase_t pb, const uint64_t exp)
|
|
{
|
|
{
|
|
- const uint8_t *e = (uint8_t *) &exp;
|
|
|
|
|
|
+#define e(i) ((exp >> (i * (FB_BASE))) & (FB_MASK))
|
|
|
|
|
|
- mpz_mul_modp(rop, pb[0][e[0]], pb[1][e[1]]);
|
|
|
|
|
|
+ mpz_mul_modp(rop, pb[0][e(0)], pb[1][e(1)]);
|
|
for (size_t j = 2; j < FB_FRAMES; j++) {
|
|
for (size_t j = 2; j < FB_FRAMES; j++) {
|
|
- const size_t exp = e[j];
|
|
|
|
- if (exp != 0) {
|
|
|
|
- mpz_mul_modp(rop, rop, pb[j][exp]);
|
|
|
|
|
|
+ if (e(j) != 0) {
|
|
|
|
+ mpz_mul_modp(rop, rop, pb[j][e(j)]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|