checking mpz_export return value properly
authorMartin Willi <martin@strongswan.org>
Wed, 17 Sep 2008 08:10:48 +0000 (08:10 -0000)
committerMartin Willi <martin@strongswan.org>
Wed, 17 Sep 2008 08:10:48 +0000 (08:10 -0000)
fixes a potential DoS attack if a DH value of zero gets processed

src/libstrongswan/plugins/gmp/gmp_diffie_hellman.c
src/libstrongswan/plugins/gmp/gmp_rsa_private_key.c
src/libstrongswan/plugins/gmp/gmp_rsa_public_key.c
src/openac/openac.c

index 7f549ef..1d885d1 100644 (file)
@@ -343,7 +343,7 @@ struct private_gmp_diffie_hellman_t {
         * Generator value.
         */     
        mpz_t g;
-
+       
        /**
         * My private value.
         */
@@ -353,7 +353,7 @@ struct private_gmp_diffie_hellman_t {
         * My public value.
         */
        mpz_t ya;
-
+       
        /**
         * Other public value.
         */     
@@ -373,7 +373,7 @@ struct private_gmp_diffie_hellman_t {
         * Modulus length.
         */
        size_t p_len;
-
+       
        /**
         * True if shared secret is computed and stored in my_public_value.
         */
@@ -440,7 +440,11 @@ static status_t get_other_public_value(private_gmp_diffie_hellman_t *this,
                return FAILED;
        }
        value->len = this->p_len;
-    value->ptr = mpz_export(NULL, NULL, 1, value->len, 1, 0, this->yb);
+       value->ptr = mpz_export(NULL, NULL, 1, value->len, 1, 0, this->yb);
+       if (value->ptr == NULL)
+       {
+               return FAILED;
+       }
        return SUCCESS;
 }
 
@@ -451,6 +455,10 @@ static void get_my_public_value(private_gmp_diffie_hellman_t *this,chunk_t *valu
 {
        value->len = this->p_len;
     value->ptr = mpz_export(NULL, NULL, 1, value->len, 1, 0, this->ya);
+    if (value->ptr == NULL)
+    {
+       value->len = 0;
+    }
 }
 
 /**
@@ -463,7 +471,11 @@ static status_t get_shared_secret(private_gmp_diffie_hellman_t *this, chunk_t *s
                return FAILED;
        }
        secret->len = this->p_len;
-    secret->ptr = mpz_export(NULL, NULL, 1, secret->len, 1, 0, this->zz);
+       secret->ptr = mpz_export(NULL, NULL, 1, secret->len, 1, 0, this->zz);
+       if (secret->ptr == NULL)
+       {
+               return FAILED;
+       }
        return SUCCESS;
 }
 
index c3fc464..84fbb32 100644 (file)
@@ -191,6 +191,10 @@ static chunk_t rsadp(private_gmp_rsa_private_key_t *this, chunk_t data)
        
        decrypted.len = this->k;
        decrypted.ptr = mpz_export(NULL, NULL, 1, decrypted.len, 1, 0, t1);
+       if (decrypted.ptr == NULL)
+       {
+               decrypted.len = 0;
+       }
        
        mpz_clear_randomized(t1);
        mpz_clear_randomized(t2);
index f58e28f..c5f8244 100644 (file)
@@ -93,11 +93,15 @@ static chunk_t rsaep(private_gmp_rsa_public_key_t *this, chunk_t data)
        
        mpz_powm(c, m, this->e, this->n);
 
-    encrypted.len = this->k;
-    encrypted.ptr = mpz_export(NULL, NULL, 1, encrypted.len, 1, 0, c);
+       encrypted.len = this->k;
+       encrypted.ptr = mpz_export(NULL, NULL, 1, encrypted.len, 1, 0, c);
+       if (encrypted.ptr == NULL)
+       {
+               encrypted.len = 0;
+       }
        
        mpz_clear(c);
-       mpz_clear(m);   
+       mpz_clear(m);
        
        return encrypted;
 }
index 38dc327..999447d 100755 (executable)
@@ -103,6 +103,10 @@ static chunk_t mpz_to_chunk(mpz_t number)
 
        chunk.len = 1 + mpz_sizeinbase(number, 2)/BITS_PER_BYTE;
        chunk.ptr = mpz_export(NULL, NULL, 1, chunk.len, 1, 0, number);
+       if (chunk.ptr == NULL)
+       {
+               chunk.len = 0;
+       }
        return chunk;
 }