]> arthur.barton.de Git - netatalk.git/commitdiff
generate mersenne primes at startup
authorFrank Lahm <franklahm@googlemail.com>
Mon, 21 Mar 2011 07:09:53 +0000 (08:09 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Mon, 21 Mar 2011 07:09:53 +0000 (08:09 +0100)
NEWS
VERSION
etc/uams/uams_dhx2_pam.c

diff --git a/NEWS b/NEWS
index 299aeb3237aeca4968be95c087bfc7e8e6945f77..4b5542ae031acd64f63dd8ec6d58aacfa66fe5b4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,9 @@
+Changes in 2.2rc1
+=================
+
+* FIX: afpd: generate mersenne primes for DHX2 UAM once at startup,
+       not for every login
+
 Changes in 2.2beta3
 ===================
 
diff --git a/VERSION b/VERSION
index 6958a38708843810d7fa0b4212672e294067c634..7e266be4ed9394b9c3b5bca6a4d845f0950998da 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.2-beta3
\ No newline at end of file
+2.2rc1
\ No newline at end of file
index ec26b8c6cc03949a1961d9dacad176acf8ecc746..60663c52a76101ce9530ccd463f800e4648765a1 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: uams_dhx2_pam.c,v 1.12 2010-03-30 10:25:49 franklahm Exp $
- *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
  * All Rights Reserved.  See COPYRIGHT.
@@ -72,13 +70,11 @@ static struct passwd *dhxpwd;
  * the Diffie-Hellman key exchange.
  * The bits value should be one of 768, 1024, 2048, 3072 or 4096.
  **/
-
-static int
-dh_params_generate (gcry_mpi_t *ret_p, gcry_mpi_t *ret_g, unsigned int bits) {
+static int dh_params_generate (unsigned int bits) {
 
     int result, times = 0, qbits;
-
-    gcry_mpi_t g = NULL, prime = NULL;
+    gcry_mpi_t gtmp = NULL;
+    gcry_mpi_t prime = NULL;
     gcry_mpi_t *factors = NULL;
     gcry_error_t err;
 
@@ -126,24 +122,17 @@ dh_params_generate (gcry_mpi_t *ret_p, gcry_mpi_t *ret_g, unsigned int bits) {
         goto error;
     }
 
-    gcry_prime_release_factors (factors);
-    factors = NULL;
+    gcry_prime_release_factors(factors);
 
-    if (ret_g)
-        *ret_g = g;
-    else
-        gcry_mpi_release (g);
-    if (ret_p)
-        *ret_p = prime;
-    else
-        gcry_mpi_release (prime);
+    g = gtmp;
+    p = prime;
 
     return 0;
 
 error:
-    gcry_prime_release_factors (factors);
-    gcry_mpi_release (g);
-    gcry_mpi_release (prime);
+    gcry_prime_release_factors(factors);
+    gcry_mpi_release(gtmp);
+    gcry_mpi_release(prime);
 
     return result;
 }
@@ -263,19 +252,11 @@ static int dhx2_setup(void *obj, char *ibuf _U_, size_t ibuflen _U_,
 
     *rbuflen = 0;
 
-    p = gcry_mpi_new(0);
-    g = gcry_mpi_new(0);
+//    p = gcry_mpi_new(0);
+//    g = gcry_mpi_new(0);
     Ra = gcry_mpi_new(0);
     Ma = gcry_mpi_new(0);
 
-    /* Generate p and g for DH */
-    ret = dh_params_generate( &p, &g, PRIMEBITS);
-    if (ret != 0) {
-        LOG(log_info, logtype_uams, "DHX2: Couldn't generate p and g");
-        ret = AFPERR_MISC;
-        goto error;
-    }
-
     /* Generate our random number Ra. */
     Ra_binary = calloc(1, PRIMEBITS/8);
     if (Ra_binary == NULL) {
@@ -330,8 +311,7 @@ static int dhx2_setup(void *obj, char *ibuf _U_, size_t ibuflen _U_,
     ret = AFPERR_AUTHCONT;
 
 error:              /* We exit here anyway */
-    /* We will only need p and Ra later, but mustn't forget to release it ! */
-    gcry_mpi_release(g);
+    /* We will need Ra later, but mustn't forget to release it ! */
     gcry_mpi_release(Ma);
     return ret;
 }
@@ -423,7 +403,6 @@ static int pam_login_ext(void *obj, char *uname, struct passwd **uam_pwd,
 }
 
 /* -------------------------------- */
-
 static int logincont1(void *obj _U_, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen)
 {
     int ret;
@@ -555,7 +534,6 @@ exit:
     gcry_mpi_release(K);
     gcry_mpi_release(Mb);
     gcry_mpi_release(Ra);
-    gcry_mpi_release(p);
     gcry_mpi_release(clientNonce);
     return ret;
 }
@@ -904,6 +882,17 @@ static int uam_setup(const char *path)
         return -1;
     if (uam_register(UAM_SERVER_CHANGEPW, path, "DHX2", dhx2_changepw) < 0)
         return -1;
+
+    p = gcry_mpi_new(0);
+    g = gcry_mpi_new(0);
+
+    LOG(log_note, logtype_uams, "DHX2: generating mersenne primes");
+    /* Generate p and g for DH */
+    if (dh_params_generate(PRIMEBITS) != 0) {
+        LOG(log_error, logtype_uams, "DHX2: Couldn't generate p and g");
+        return -1;
+    }
+
     return 0;
 }
 
@@ -911,6 +900,9 @@ static void uam_cleanup(void)
 {
     uam_unregister(UAM_SERVER_LOGIN, "DHX2");
     uam_unregister(UAM_SERVER_CHANGEPW, "DHX2");
+
+    gcry_mpi_release(p);
+    gcry_mpi_release(g);
 }