gmp: Make sure the modulus is odd and the exponent not zero
authorTobias Brunner <tobias@strongswan.org>
Wed, 29 Mar 2017 09:26:24 +0000 (11:26 +0200)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Mon, 29 May 2017 09:05:04 +0000 (11:05 +0200)
Unlike mpz_powm() its secure replacement mpz_powm_sec() has the additional
requirement that the exponent must be > 0 and the modulus has to be odd.
Otherwise, it will crash with a floating-point exception.

Fixes: CVE-2017-9022
Fixes: 3e35a6e7a1b0 ("Use side-channel secured mpz_powm_sec of libgmp 5, if available")

src/libstrongswan/plugins/gmp/gmp_rsa_public_key.c

index 2b2c7f2..32a72ac 100644 (file)
@@ -475,7 +475,7 @@ gmp_rsa_public_key_t *gmp_rsa_public_key_load(key_type_t type, va_list args)
                }
                break;
        }
-       if (!e.ptr || !n.ptr)
+       if (!e.len || !n.len || (n.ptr[n.len-1] & 0x01) == 0)
        {
                return NULL;
        }
@@ -506,5 +506,10 @@ gmp_rsa_public_key_t *gmp_rsa_public_key_load(key_type_t type, va_list args)
 
        this->k = (mpz_sizeinbase(this->n, 2) + 7) / BITS_PER_BYTE;
 
+       if (!mpz_sgn(this->e))
+       {
+               destroy(this);
+               return NULL;
+       }
        return &this->public;
 }