diff --git a/cipher/cipher-gcm.c b/cipher/cipher-gcm.c
index a9c48551..9134d77b 100644
--- a/cipher/cipher-gcm.c
+++ b/cipher/cipher-gcm.c
@@ -30,8 +30,6 @@
 #include "./cipher-internal.h"
 
 
-static gcry_err_code_t _gcry_cipher_gcm_setiv_zero (gcry_cipher_hd_t c);
-
 /* Helper macro to force alignment to 16 or 64 bytes.  */
 #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
 # define ATTR_ALIGNED_64  __attribute__ ((aligned (64)))
@@ -979,9 +977,6 @@ _gcry_cipher_gcm_encrypt (gcry_cipher_hd_t c,
     return GPG_ERR_INV_STATE;
 
   if (!c->marks.iv)
-    _gcry_cipher_gcm_setiv_zero (c);
-
-  if (c->u_mode.gcm.disallow_encryption_because_of_setiv_in_fips_mode)
     return GPG_ERR_INV_STATE;
 
   if (!c->u_mode.gcm.ghash_aad_finalized)
@@ -1019,7 +1014,7 @@ _gcry_cipher_gcm_decrypt (gcry_cipher_hd_t c,
     return GPG_ERR_INV_STATE;
 
   if (!c->marks.iv)
-    _gcry_cipher_gcm_setiv_zero (c);
+    return GPG_ERR_INV_STATE;
 
   if (!c->u_mode.gcm.ghash_aad_finalized)
     {
@@ -1054,7 +1049,7 @@ _gcry_cipher_gcm_authenticate (gcry_cipher_hd_t c,
     return GPG_ERR_INV_STATE;
 
   if (!c->marks.iv)
-    _gcry_cipher_gcm_setiv_zero (c);
+    return GPG_ERR_INV_STATE;
 
   gcm_bytecounter_add(c->u_mode.gcm.aadlen, aadbuflen);
   if (!gcm_check_aadlen_or_ivlen(c->u_mode.gcm.aadlen))
@@ -1161,55 +1156,6 @@ _gcry_cipher_gcm_setiv (gcry_cipher_hd_t c, const byte *iv, size_t ivlen)
   return _gcry_cipher_gcm_initiv (c, iv, ivlen);
 }
 
-static gcry_err_code_t
-_gcry_cipher_gcm_setiv_zero (gcry_cipher_hd_t c)
-{
-  static const unsigned char zerobuf[MAX_BLOCKSIZE];
-
-  c->u_mode.gcm.disallow_encryption_because_of_setiv_in_fips_mode = 0;
-
-  if (fips_mode ())
-    {
-      /* Direct invocation of GCM setiv in FIPS mode disables encryption. */
-      c->u_mode.gcm.disallow_encryption_because_of_setiv_in_fips_mode = 1;
-    }
-
-  return _gcry_cipher_gcm_setiv (c, zerobuf, GCRY_GCM_BLOCK_LEN);
-}
-
-
-#if 0 && TODO
-void
-_gcry_cipher_gcm_geniv (gcry_cipher_hd_t c,
-                        byte *ivout, size_t ivoutlen, const byte *nonce,
-                        size_t noncelen)
-{
-  /* nonce:    user provided part (might be null) */
-  /* noncelen: check if proper length (if nonce not null) */
-  /* ivout:    iv used to initialize gcm, output to user */
-  /* ivoutlen: check correct size */
-  byte iv[IVLEN];
-
-  if (!ivout)
-    return GPG_ERR_INV_ARG;
-  if (ivoutlen != IVLEN)
-    return GPG_ERR_INV_LENGTH;
-  if (nonce != NULL && !is_nonce_ok_len(noncelen))
-    return GPG_ERR_INV_ARG;
-
-  gcm_generate_iv(iv, nonce, noncelen);
-
-  c->marks.iv = 0;
-  c->marks.tag = 0;
-  c->u_mode.gcm.disallow_encryption_because_of_setiv_in_fips_mode = 0;
-
-  _gcry_cipher_gcm_initiv (c, iv, IVLEN);
-
-  buf_cpy(ivout, iv, IVLEN);
-  wipememory(iv, sizeof(iv));
-}
-#endif
-
 
 static int
 is_tag_length_valid(size_t taglen)
@@ -1302,9 +1248,6 @@ _gcry_cipher_gcm_get_tag (gcry_cipher_hd_t c, unsigned char *outtag,
                           size_t taglen)
 {
   /* Outputting authentication tag is part of encryption. */
-  if (c->u_mode.gcm.disallow_encryption_because_of_setiv_in_fips_mode)
-    return GPG_ERR_INV_STATE;
-
   return _gcry_cipher_gcm_tag (c, outtag, taglen, 0);
 }
 
diff --git a/cipher/cipher-internal.h b/cipher/cipher-internal.h
index dc4878bb..7bbf4837 100644
--- a/cipher/cipher-internal.h
+++ b/cipher/cipher-internal.h
@@ -375,7 +375,6 @@ struct gcry_cipher_handle
       unsigned int ghash_aad_finalized:1;
 
       unsigned int datalen_over_limits:1;
-      unsigned int disallow_encryption_because_of_setiv_in_fips_mode:1;
 
       /* --- Following members are not cleared in gcry_cipher_reset --- */
 
diff --git a/cipher/cipher.c b/cipher/cipher.c
index fc130907..a5d59cb3 100644
--- a/cipher/cipher.c
+++ b/cipher/cipher.c
@@ -1328,17 +1328,6 @@ _gcry_cipher_setkey (gcry_cipher_hd_t hd, const void *key, size_t keylen)
 gcry_err_code_t
 _gcry_cipher_setiv (gcry_cipher_hd_t c, const void *iv, size_t ivlen)
 {
-  if (c->mode == GCRY_CIPHER_MODE_GCM)
-    {
-      c->u_mode.gcm.disallow_encryption_because_of_setiv_in_fips_mode = 0;
-
-      if (fips_mode ())
-        {
-          /* Direct invocation of GCM setiv in FIPS mode disables encryption. */
-          c->u_mode.gcm.disallow_encryption_because_of_setiv_in_fips_mode = 1;
-        }
-    }
-
   return c->mode_ops.setiv (c, iv, ivlen);
 }
 
