diff --git a/ChangeLog b/ChangeLog
index 8fd30374d445e2aa12611914decd277ac286f4f9..83e56a0a8386b7fc4a646de3bde809a154652373 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-07-31  Niels Möller  <nisse@lysator.liu.se>
+
+	* rsa.c (_rsa_check_size): Check that n is odd. Otherwise, using
+	an invalid key may crash in mpz_powm_sec. Problem reported by
+	Hanno Böck.
+
 2016-07-13  Niels Möller  <nisse@lysator.liu.se>
 
 	* bignum.c (nettle_mpz_from_octets): Unconditionally use
diff --git a/rsa.c b/rsa.c
index 19d93de74c45fa94418ff2eb3aadb809f96d7b0e..f5941409c2c153594342f68f7f4389ef301024a1 100644
--- a/rsa.c
+++ b/rsa.c
@@ -58,13 +58,18 @@ rsa_public_key_clear(struct rsa_public_key *key)
 }
 
 /* Computes the size, in octets, of a the modulo. Returns 0 if the
- * modulo is too small to be useful. */
-
+ * modulo is too small to be useful, or otherwise appears invalid. */
 size_t
 _rsa_check_size(mpz_t n)
 {
   /* Round upwards */
-  size_t size = (mpz_sizeinbase(n, 2) + 7) / 8;
+  size_t size;
+
+  /* Even moduli are invalid, and not supported by mpz_powm_sec. */
+  if (mpz_even_p (n))
+    return 0;
+
+  size = (mpz_sizeinbase(n, 2) + 7) / 8;
 
   if (size < RSA_MINIMUM_N_OCTETS)
     return 0;
diff --git a/testsuite/rsa-test.c b/testsuite/rsa-test.c
index e9b1c0300c179f7eddd77bd4f1a91c7f59e12c4a..a4296646270d772e4084dfa1d9e04bca7b20dece 100644
--- a/testsuite/rsa-test.c
+++ b/testsuite/rsa-test.c
@@ -57,6 +57,13 @@ test_main(void)
 
   test_rsa_sha512(&pub, &key, expected);
 
+  /* Test detection of invalid keys with even modulo */
+  mpz_clrbit (pub.n, 0);
+  ASSERT (!rsa_public_key_prepare (&pub));
+
+  mpz_clrbit (key.p, 0);
+  ASSERT (!rsa_private_key_prepare (&key));
+
   /* 777-bit key, generated by
    *
    *   lsh-keygen -a rsa -l 777 -f advanced-hex