Change our view of the Diffie--Hellman closure protocol.
[secnet] / dh.c
diff --git a/dh.c b/dh.c
index 4300a91..68318ce 100644 (file)
--- a/dh.c
+++ b/dh.c
@@ -52,7 +52,7 @@ static string_t dh_makepublic(void *sst, uint8_t *secret, int32_t secretlen)
 
     read_mpbin(&a, secret, secretlen);
 
-    mpz_powm(&b, &st->g, &a, &st->p);
+    mpz_powm_sec(&b, &st->g, &a, &st->p);
 
     r=write_mpstring(&b);
 
@@ -62,9 +62,9 @@ static string_t dh_makepublic(void *sst, uint8_t *secret, int32_t secretlen)
 }
 
 static dh_makeshared_fn dh_makeshared;
-static void dh_makeshared(void *sst, uint8_t *secret, int32_t secretlen,
-                         cstring_t rempublic, uint8_t *sharedsecret,
-                         int32_t buflen)
+static bool_t dh_makeshared(void *sst, uint8_t *secret, int32_t secretlen,
+                           cstring_t rempublic, uint8_t *sharedsecret,
+                           int32_t buflen)
 {
     struct dh *st=sst;
     MP_INT a, b, c;
@@ -76,13 +76,15 @@ static void dh_makeshared(void *sst, uint8_t *secret, int32_t secretlen,
     read_mpbin(&a, secret, secretlen);
     mpz_set_str(&b, rempublic, 16);
 
-    mpz_powm(&c, &b, &a, &st->p);
+    mpz_powm_sec(&c, &b, &a, &st->p);
 
     write_mpbin(&c,sharedsecret,buflen);
 
     mpz_clear(&a);
     mpz_clear(&b);
     mpz_clear(&c);
+
+    return True;
 }
 
 static list_t *dh_apply(closure_t *self, struct cloc loc, dict_t *context,
@@ -152,9 +154,9 @@ static list_t *dh_apply(closure_t *self, struct cloc loc, dict_t *context,
        cfgfatal(loc,"diffie-hellman","generator must be less than modulus\n");
     }
 
-    st->ops.len=sz;
+    st->ops.secret_len=sz;
 
-    st->ops.ceil_len=(mpz_sizeinbase(&st->p,2)+7)/8;
+    st->ops.shared_len=(mpz_sizeinbase(&st->p,2)+7)/8;
     /* According to the docs, mpz_sizeinbase(,256) is allowed to return
      * an answer which is 1 too large.  But mpz_sizeinbase(,2) isn't. */