diff --git a/ChangeLog b/ChangeLog
index 31735d8faa06b0954b1c4401a100e01828d70893..f2f46ed682a614b722c0a4fd8c410b0e0a04c9e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2020-04-25  Niels Möller  <nisse@lysator.liu.se>
 
+	* configure.ac: Update required version of GMP to 6.1.0, needed
+	for mpn_zero_p.
+	* ecc-ecdsa-verify.c (zero_p): Deleted static function, usage
+	replaced with mpn_zero_p.
+	* testsuite/testutils.c (mpn_zero_p): Delete conditional
+	definition.
+	* testsuite/testutils.h: Delete corresponding declarations.
+
 	* Makefile.in (DISTFILES): Add poly1305-internal.h.
 	* testsuite/Makefile.in (DISTFILES): Delete setup-env.
 
diff --git a/configure.ac b/configure.ac
index e5824ae01cb02913a7d6ac3c1849b385881356de..dd7d66057813461282d8a47667e6537e5a1b4ba7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -243,9 +243,10 @@ fi
 # Checks for libraries
 if test "x$enable_public_key" = "xyes" ; then
   if test "x$enable_mini_gmp" = "xno" ; then
-    AC_CHECK_LIB(gmp, __gmpn_sec_div_r,,
+    # mpn_zero_p was added in GMP-6.1.0
+    AC_CHECK_LIB(gmp, __gmpn_zero_p,,
         [AC_MSG_WARN(
-    [GNU MP not found, or too old. GMP-6.0 or later is needed, see https://gmplib.org/.
+    [GNU MP not found, or too old. GMP-6.1.0 or later is needed, see https://gmplib.org/.
     Support for public key algorithms will be unavailable.])]
         enable_public_key=no)
 
diff --git a/ecc-ecdsa-verify.c b/ecc-ecdsa-verify.c
index 6f9fb5d98175e0efe6addd4b40bb837e5a77be60..c43bdadc68b0d84f4a5952dcdb79c8d3690190be 100644
--- a/ecc-ecdsa-verify.c
+++ b/ecc-ecdsa-verify.c
@@ -43,20 +43,10 @@
 
 /* Low-level ECDSA verify */
 
-/* FIXME: Use mpn_zero_p. */
-static int
-zero_p (const mp_limb_t *xp, mp_size_t n)
-{
-  while (n > 0)
-    if (xp[--n] > 0)
-      return 0;
-  return 1;
-}
-
 static int
 ecdsa_in_range (const struct ecc_curve *ecc, const mp_limb_t *xp)
 {
-  return !zero_p (xp, ecc->p.size)
+  return !mpn_zero_p (xp, ecc->p.size)
     && mpn_cmp (xp, ecc->q.m, ecc->p.size) < 0;
 }
 
@@ -122,7 +112,7 @@ ecc_ecdsa_verify (const struct ecc_curve *ecc,
 
   /* u = 0 can happen only if h = 0 or h = q, which is extremely
      unlikely. */
-  if (!zero_p (u1, ecc->p.size))
+  if (!mpn_zero_p (u1, ecc->p.size))
     {
       /* Total storage: 7*ecc->p.size + ecc->mul_g_itch (ecc->p.size) */
       ecc->mul_g (ecc, P1, u1, P1 + 3*ecc->p.size);
diff --git a/testsuite/testutils.c b/testsuite/testutils.c
index 187da0efda2935323aa27d23a8e62b29a5c34920..1f279e9a0e2ac6b9b0a9b8f6c2847e6fe9bb0d8f 100644
--- a/testsuite/testutils.c
+++ b/testsuite/testutils.c
@@ -1063,19 +1063,6 @@ test_armor(const struct nettle_armor *armor,
 
 #if WITH_HOGWEED
 
-#ifndef mpn_zero_p
-int
-mpn_zero_p (mp_srcptr ap, mp_size_t n)
-{
-  while (--n >= 0)
-    {
-      if (ap[n] != 0)
-	return 0;
-    }
-  return 1;
-}
-#endif
-
 void
 mpn_out_str (FILE *f, int base, const mp_limb_t *xp, mp_size_t xn)
 {
diff --git a/testsuite/testutils.h b/testsuite/testutils.h
index 8ace6a82357f416a4a461d652f6e3acdb4262ee4..0dc235c6c28fa53c272d72f0bd2ac1c5fd3da950 100644
--- a/testsuite/testutils.h
+++ b/testsuite/testutils.h
@@ -164,17 +164,8 @@ void mpz_urandomb (mpz_t r, struct knuth_lfib_ctx *ctx, mp_bitcnt_t bits);
 /* This is cheating */
 #define mpz_rrandomb mpz_urandomb
 
-/* mini-gmp defines this function (in the GMP library, it was added in
-   gmp in version 6.1.0). */
-#define mpn_zero_p mpn_zero_p
-
 #endif /* NETTLE_USE_MINI_GMP */
 
-#ifndef mpn_zero_p
-int
-mpn_zero_p (mp_srcptr ap, mp_size_t n);
-#endif
-
 void
 mpn_out_str (FILE *f, int base, const mp_limb_t *xp, mp_size_t xn);