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