Browse Source

checkpoint fixedbasis

Michele Orrù 7 years ago
parent
commit
c3ca5c5bc2
8 changed files with 75 additions and 29 deletions
  1. 3 2
      configure.ac
  2. 3 2
      src/Makefile.am
  3. 36 0
      src/elgamal.c
  4. 14 1
      src/elgamal.h
  5. 11 4
      src/exp_bench.c
  6. 2 2
      src/group.c
  7. 1 1
      src/group.h
  8. 5 17
      src/rms.c

+ 3 - 2
configure.ac

@@ -33,7 +33,7 @@ AC_FUNC_MALLOC
 #AC_CHECK_FUNCS([dup2 setlocale strdup])
 
 # Clear out compiler/linker flags
-CFLAGS=" -pedantic -Wall "
+CFLAGS+=" -pedantic -Wall "
 
 # Shut up automake
 #AM_SILENT_RULES([yes])
@@ -43,9 +43,10 @@ AC_SUBST([AM_MAKEFLAGS], [--no-print-directory])
 
 AC_ARG_ENABLE(debug,
    AS_HELP_STRING([--enable-debug], [enable debugging, default: no]),
-   CFLAGS+=" -UNDEBUG -O0 -ggdb",
+   CFLAGS+=" -UNDEBUG -O0 -ggdb -fbounds-check -D_FORTIFY_SOURCE=1",
    CFLAGS+=" -DNDEBUG -O3 -march=native")
 
+
 AC_OUTPUT([Makefile
            src/Makefile
            ])

+ 3 - 2
src/Makefile.am

@@ -4,12 +4,13 @@ bin_PROGRAMS = rms ddlog_bench exp_bench
 DDLOG = ddlog.c ddlog.h
 ELGAMAL = elgamal.c elgamal.h
 ENTROPY = entropy.c entropy.h
+FBASE = fbase.c fbase.h
 GROUP = group.c group.h
 HSS = hss.c hss.h
 TIMEIT = timeit.h
 #TESTS = $(check_programs)
 
 #test_ssl1_SOURCES = test_ssl1.c
-rms_SOURCES = rms.c $(DDLOG) $(ELGAMAL) $(ENTROPY) $(GROUP) $(HSS) $(TIMEIT)
+rms_SOURCES = rms.c $(DDLOG) $(ELGAMAL) $(ENTROPY) $(GROUP) $(FBASE) $(HSS) $(TIMEIT)
 ddlog_bench_SOURCES = ddlog_bench.c $(DDLOG) $(ENTROPY) $(GROUP) $(TIMEIT)
-exp_bench_SOURCES = exp_bench.c $(ENTROPY) $(GROUP) $(TIMEIT)
+exp_bench_SOURCES = exp_bench.c $(ENTROPY) $(GROUP) $(FBASE) $(TIMEIT)

+ 36 - 0
src/elgamal.c

@@ -44,6 +44,14 @@ void elgamal_encrypt(elgamal_cipher_t rop, const elgamal_key_t k, const mpz_t m)
   mpz_mod(rop->c2, rop->c2, p);
 
   mpz_clear(x);
+
+  /* fixed bases */
+  //fb_set(rop->fb_c1, rop->c1);
+  /* fb_set(rop->fb_c1e64, rop->c1e64); */
+  /* fb_set(rop->fb_c1e128, rop->c1e128); */
+  /* fb_set(rop->fb_c2, rop->c2); */
+
+
 }
 
 
@@ -54,6 +62,28 @@ void elgamal_decrypt(mpz_t rop, const elgamal_key_t k, const elgamal_cipher_t c)
   mpz_mod(rop, rop, p);
 }
 
+
+void elgamal_cipher_init(elgamal_cipher_t c)
+{
+  mpz_inits(c->c1, c->c2, c->c1e64, c->c1e128, NULL);   \
+  c->fb_c1 = fb_init();
+  c->fb_c1e64 = fb_init();
+  c->fb_c1e128 = fb_init();
+  c->fb_c1e128 = fb_init();
+  c->fb_c2 = fb_init();
+}
+
+void elgamal_cipher_clear(elgamal_cipher_t c)
+{
+  mpz_clears(c->c1, c->c2, c->c1e64, c->c1e128, NULL);   \
+  fb_clear(c->fb_c1);
+  fb_clear(c->fb_c1e64);
+  fb_clear(c->fb_c1e128);
+  fb_clear(c->fb_c1e128);
+  fb_clear(c->fb_c2);
+}
+
+
 void elgamal_cipher_set(elgamal_cipher_t rop, const elgamal_cipher_t op1)
 {
   mpz_set(rop->c1, op1->c1);
@@ -61,4 +91,10 @@ void elgamal_cipher_set(elgamal_cipher_t rop, const elgamal_cipher_t op1)
   mpz_set(rop->c1e64, op1->c1e64);
   mpz_set(rop->c1e128, op1->c1e128);
 
+  /* fixed bases */
+  //fb_set(rop->fb_c1, rop->c1);
+  //fb_set(rop->fb_c1e64, rop->c1e64);
+  //fb_set(rop->fb_c1e128, rop->c1e128);
+  //fb_set(rop->fb_c2, rop->c2);
+
 }

+ 14 - 1
src/elgamal.h

@@ -4,6 +4,7 @@
 #include <gmp.h>
 
 #include "entropy.h"
+#include "fbase.h"
 
 typedef struct elgamal_key {
   mpz_t sk;
@@ -15,8 +16,15 @@ typedef struct elgamal_cipher {
   /* NOTE: the first part is already inverted! */
   mpz_t c1;
   mpz_t c2;
+
   mpz_t c1e64;
   mpz_t c1e128;
+
+  fbase_ptr fb_c1;
+  fbase_ptr fb_c1e64;
+  fbase_ptr fb_c1e128;
+  fbase_ptr fb_c2;
+
 } elgamal_cipher_t[1];
 
 void elgamal_encrypt(elgamal_cipher_t c, const elgamal_key_t k, const mpz_t m);
@@ -24,13 +32,18 @@ void elgamal_decrypt(mpz_t rop, const elgamal_key_t k, const elgamal_cipher_t c)
 
 void elgamal_keygen(elgamal_key_t key);
 
+void elgamal_cipher_init(elgamal_cipher_t c);
+void elgamal_cipher_clear(elgamal_cipher_t c);
 void elgamal_cipher_set(elgamal_cipher_t rop, const elgamal_cipher_t op1);
 
 #define ELGAMAL_KEY(func, k)                   \
   mpz_ ## func ## s(k->pk, k->sk, NULL);
 
+/* we're not instantiating just mpz_t anymore :( */
 #define ELGAMAL_CIPHER(func, c)                \
-  mpz_ ## func ## s(c->c1, c->c2, c->c1e64, c->c1e128, NULL)
+  elgamal_cipher_ ## func(c)
+
+
 
 #define elgamal_encrypt_shares(share1, share2, key, plaintext) \
   elgamal_encrypt(share1, key, plaintext);                     \

+ 11 - 4
src/exp_bench.c

@@ -4,6 +4,7 @@
 #include <gmp.h>
 
 #include "entropy.h"
+#include "fbase.h"
 #include "group.h"
 #include "timeit.h"
 
@@ -27,20 +28,26 @@ int main()
   assert(!mpz_cmp(test, expected_mod));
   mpz_clear(expected_mod);
 
+  mpz_urandomm(base, _rstate, p);
+  fbase_ptr pbase = fb_init();
+  fb_set(pbase, base);
+
   INIT_TIMEIT(CLOCK_PROCESS_CPUTIME_ID);
-  for (int i = 0; i < (int) 1e4; i++) {
+  for (int i = 0; i < (int) 1e3; i++) {
     getrandom(&exp, 4, GRND_NONBLOCK);
-    mpz_urandomm(base, _rstate, p);
+    //exp =0xffff;
 
     mpz_powm_ui(expected, base, exp, p);
-    mpz_set(test, base);
     START_TIMEIT();
-    powmp_ui(test, test, exp);
+    fb_powmp_ui(test, pbase, exp);
     END_TIMEIT();
 
     assert(!mpz_cmp(test, expected));
+
   }
 
+
   printf(TIMEIT_FORMAT "\n", GET_TIMEIT());
+  fb_clear(pbase);
   mpz_clears(test, expected, base, NULL);
 }

+ 2 - 2
src/group.c

@@ -15,8 +15,8 @@ void group_init()
 {
   mpz_init_set_str(p, p_str, 0);
 
-  mpz_init_set(q, p);
-  mpz_sub_ui(q, q, 1);
+  mpz_init(q);
+  mpz_sub_ui(q, p, 1);
   mpz_divexact_ui(q, q, 2);
 
 }

+ 1 - 1
src/group.h

@@ -20,7 +20,7 @@ void group_clear();
 
 #define SIZ(x) ((x)->_mp_size)
 #define PTR(x) ((x)->_mp_d)
-#define MPN_NORMALIZE(DST, NLIMBS)				\
+#define MPN_NORMALIZE(DST, NLIMBS)                                      \
   do {									\
     while (1)								\
       {									\

+ 5 - 17
src/rms.c

@@ -15,19 +15,7 @@
 #include "rms.h"
 #include "timeit.h"
 
-static inline
-void fbpowm(mpz_t rop, const mpz_t T[4][256], const uint32_t exp)
-{
-  const uint8_t *e = (uint8_t *) &exp;
-
-  mpz_mul(rop, T[0][e[0]], T[1][e[1]]);
-  mpz_mod(rop, rop, p);
-  mpz_mul(rop, rop, T[2][e[2]]);
-  mpz_mod(rop, rop, p);
-  mpz_mul(rop, rop, T[3][e[3]]);
-  mpz_mod(rop, rop, p);
-}
-
+INIT_TIMEIT(CLOCK_PROCESS_CPUTIME_ID);
 
 static inline
 uint32_t mul_single(const elgamal_cipher_t c,
@@ -39,9 +27,11 @@ uint32_t mul_single(const elgamal_cipher_t c,
   //mpz_powm(op1, c1, cx, p);
   /* first block */
   powmp_ui(op1, c->c1, cx->_mp_d[0]);
+
   /* second block */
   powmp_ui(op2, c->c1e64, cx->_mp_d[1]);
   mpz_mul_modp(op1, op2, op1);
+
   /* third block */
   powmp_ui(op2, c->c1e128, cx->_mp_d[2]);
   mpz_mul_modp(op1, op2, op1);
@@ -57,8 +47,6 @@ uint32_t mul_single(const elgamal_cipher_t c,
 void hss_mul(ssl2_t rop, const ssl1_t sl1, const ssl2_t sl2)
 {
   uint32_t converted;
-  mpz_t op1, op2;
-  mpz_inits(op1, op2, NULL);
 
   rop->x = mul_single(sl1->w, sl2->x, sl2->cx);
 
@@ -108,7 +96,6 @@ int main()
   ssl2_init(t1);
   ssl2_init(t2);
 
-  INIT_TIMEIT(CLOCK_PROCESS_CPUTIME_ID);
   for (int i = 0; i <  (int) 1e2; i++) {
 
     mpz_urandomb(y, _rstate, 1);
@@ -127,7 +114,8 @@ int main()
     START_TIMEIT();
     hss_mul(t1, r1, s1);
     END_TIMEIT();
-     hss_mul(t2, r2, s2);
+
+    hss_mul(t2, r2, s2);
 #ifndef NDEBUG
     gmp_printf("%Zx %Zx\n", x, y);
     gmp_printf("%d %d\n", s1->x, s2->x);