]> arthur.barton.de Git - netatalk.git/blobdiff - etc/uams/uams_dhx2_pam.c
Merge branch 2-1
[netatalk.git] / etc / uams / uams_dhx2_pam.c
index ec26b8c6cc03949a1961d9dacad176acf8ecc746..46c0d9700b7248fae5a424dd52d9109135dfdd29 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,9 @@ 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 *factors = NULL;
     gcry_error_t err;
 
@@ -101,16 +95,16 @@ dh_params_generate (gcry_mpi_t *ret_p, gcry_mpi_t *ret_g, unsigned int bits) {
     /* find a prime number of size bits. */
     do {
         if (times) {
-            gcry_mpi_release (prime);
+            gcry_mpi_release(p);
             gcry_prime_release_factors (factors);
         }
-        err = gcry_prime_generate (&prime, bits, qbits, &factors, NULL, NULL,
-                                   GCRY_STRONG_RANDOM, GCRY_PRIME_FLAG_SPECIAL_FACTOR);
+        err = gcry_prime_generate(&p, bits, qbits, &factors, NULL, NULL,
+                                  GCRY_STRONG_RANDOM, GCRY_PRIME_FLAG_SPECIAL_FACTOR);
         if (err != 0) {
             result = AFPERR_MISC;
             goto error;
         }
-        err = gcry_prime_check (prime, 0);
+        err = gcry_prime_check(p, 0);
         times++;
     } while (err != 0 && times < 10);
 
@@ -120,30 +114,18 @@ dh_params_generate (gcry_mpi_t *ret_p, gcry_mpi_t *ret_g, unsigned int bits) {
     }
 
     /* generate the group generator. */
-    err = gcry_prime_group_generator (&g, prime, factors, NULL);
+    err = gcry_prime_group_generator(&g, p, factors, NULL);
     if (err != 0) {
         result = AFPERR_MISC;
         goto error;
     }
 
-    gcry_prime_release_factors (factors);
-    factors = NULL;
-
-    if (ret_g)
-        *ret_g = g;
-    else
-        gcry_mpi_release (g);
-    if (ret_p)
-        *ret_p = prime;
-    else
-        gcry_mpi_release (prime);
+    gcry_prime_release_factors(factors);
 
     return 0;
 
 error:
-    gcry_prime_release_factors (factors);
-    gcry_mpi_release (g);
-    gcry_mpi_release (prime);
+    gcry_prime_release_factors(factors);
 
     return result;
 }
@@ -258,24 +240,14 @@ static int dhx2_setup(void *obj, char *ibuf _U_, size_t ibuflen _U_,
 {
     int ret;
     size_t nwritten;
-    gcry_mpi_t g, Ma;
+    gcry_mpi_t Ma;
     char *Ra_binary = NULL;
 
     *rbuflen = 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 +302,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 +394,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 +525,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 +873,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_debug, 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 +891,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);
 }
 
 
@@ -928,4 +911,3 @@ UAM_MODULE_EXPORT struct uam_export uams_dhx2_pam = {
 };
 
 #endif /* USE_PAM && UAM_DHX2 */
-