Blob Blame History Raw
diff -up libgcrypt-1.5.3/cipher/dsa.c.fips-reqs libgcrypt-1.5.3/cipher/dsa.c
--- libgcrypt-1.5.3/cipher/dsa.c.fips-reqs	2014-11-12 17:05:01.000000000 +0100
+++ libgcrypt-1.5.3/cipher/dsa.c	2014-11-14 14:32:23.751354070 +0100
@@ -55,42 +55,86 @@ typedef struct
 } dsa_domain_t;
 
 
-/* A sample 1024 bit DSA key used for the selftests.  */
+/* A sample 2048 bit DSA key used for the selftests.  */
 static const char sample_secret_key[] =
 "(private-key"
 " (dsa"
-"  (p #00AD7C0025BA1A15F775F3F2D673718391D00456978D347B33D7B49E7F32EDAB"
-"      96273899DD8B2BB46CD6ECA263FAF04A28903503D59062A8865D2AE8ADFB5191"
-"      CF36FFB562D0E2F5809801A1F675DAE59698A9E01EFE8D7DCFCA084F4C6F5A44"
-"      44D499A06FFAEA5E8EF5E01F2FD20A7B7EF3F6968AFBA1FB8D91F1559D52D8777B#)"
-"  (q #00EB7B5751D25EBBB7BD59D920315FD840E19AEBF9#)"
-"  (g #1574363387FDFD1DDF38F4FBE135BB20C7EE4772FB94C337AF86EA8E49666503"
-"      AE04B6BE81A2F8DD095311E0217ACA698A11E6C5D33CCDAE71498ED35D13991E"
-"      B02F09AB40BD8F4C5ED8C75DA779D0AE104BC34C960B002377068AB4B5A1F984"
-"      3FBA91F537F1B7CAC4D8DD6D89B0D863AF7025D549F9C765D2FC07EE208F8D15#)"
-"  (y #64B11EF8871BE4AB572AA810D5D3CA11A6CDBC637A8014602C72960DB135BF46"
-"      A1816A724C34F87330FC9E187C5D66897A04535CC2AC9164A7150ABFA8179827"
-"      6E45831AB811EEE848EBB24D9F5F2883B6E5DDC4C659DEF944DCFD80BF4D0A20"
-"      42CAA7DC289F0C5A9D155F02D3D551DB741A81695B74D4C8F477F9C7838EB0FB#)"
-"  (x #11D54E4ADBD3034160F2CED4B7CD292A4EBF3EC0#)))";
-/* A sample 1024 bit DSA key used for the selftests (public only).  */
+"  (p #a85378d8fd3f8d72ec7418080da21317e43ec4b62ba8c862"
+"      3b7e4d04441dd1a0658662596493ca8e9e8fbb7e34aaddb6"
+"      2e5d67b6d09a6e61b769e7c352aa2b10e20ca0636963b552"
+"      3e86470decbbeda027e797e7b67635d4d49c30700e74af8a"
+"      0ff156a801af57a26e7078f1d82f74908ecb6d07e70b3503"
+"      eed94fa32cf17a7fc3d6cf40dc7b00830e6a2566dc073e34"
+"      3312517c6aa5152b4bfecd2e551fee346318a153423c996b"
+"      0d5dcb9102aedd38798616f1f1e0d6c403525b1f9b3d4dc7"
+"      66de2dfc4a56d7b8ba5963d60f3e16318870ad436952e557"
+"      65374eab85e8ec17d6b9a4547b9b5f2752f3105be809b23a"
+"      2c8d7469db02e24d592394a7dba069e9#)"
+"  (q #d277044e50f5a4e3f510a50a0b84fdffbca047ed27602056"
+"      7441a0a5#)"
+"  (g #13d754e21fd241655da891c522a65a72a89bdc64ec9b54a8"
+"      21ed4a898b490e0c4fcb72192a4a20f541f3f2925399f0ba"
+"      ecf929aafbf79dfe4332393b32cd2e2fcf272f32a627434a"
+"      0df242b75b414df372121e53a553f222f836b000f016485b"
+"      6bd0898451801dcd8de64cd5365696ffc532d528c506620a"
+"      942a0305046d8f1876341f1e570bc3974ba6b9a438e97023"
+"      02a2e6e67bfd06d32bc679962271d7b40cd72f386e64e0d7"
+"      ef86ca8ca5d14228dc2a4f16e3189886b5990674f4200f3a"
+"      4cf65a3f0ddba1fa672dff2f5e143d10e4e97ae84f6da095"
+"      35d5b9df259181a79b63b069e949972b02ba36b3586aab7e"
+"      45f322f82e4e85ca3ab85591b3c2a966#)"
+"  (y #2452f3ccbe9ed5ca7dc74c602b99226e8f2fab38e7d7ddfb"
+"      75539b17155e9fcfd1aba564eb8535d812c9c2dcf9728444"
+"      1bc482243624c7f457580c1c38a57c46c457392470edb52c"
+"      b5a6e03fe6287bb6f49a42a2065a054f030839df1fd3149c"
+"      4ca0531dd8ca8aaa9cc7337193387348336118224545e88c"
+"      80ffd8765d74360333ccab9972779b6525a65bdd0d10c675"
+"      c109bbd3e5be4d72ef6eba6e438d5226237db888379c5fcc"
+"      47a3847ff63711baed6d03afe81e694a413b680bd38ab490"
+"      3f8370a707ef551d4941026d9579d691de8edaa16105eb9d"
+"      ba3c2f4c1bec508275aa0207e251b5eccb286a4b01d449d3"
+"      0acb673717a0d2fb3b50c893f7dab14f#)"
+"  (x #0c4b3089d1b862cb3c436491f0915470c52796e3acbee800"
+"      ec55f6cc#)))";
+/* A sample 2048 bit DSA key used for the selftests (public only).  */
 static const char sample_public_key[] =
 "(public-key"
 " (dsa"
-"  (p #00AD7C0025BA1A15F775F3F2D673718391D00456978D347B33D7B49E7F32EDAB"
-"      96273899DD8B2BB46CD6ECA263FAF04A28903503D59062A8865D2AE8ADFB5191"
-"      CF36FFB562D0E2F5809801A1F675DAE59698A9E01EFE8D7DCFCA084F4C6F5A44"
-"      44D499A06FFAEA5E8EF5E01F2FD20A7B7EF3F6968AFBA1FB8D91F1559D52D8777B#)"
-"  (q #00EB7B5751D25EBBB7BD59D920315FD840E19AEBF9#)"
-"  (g #1574363387FDFD1DDF38F4FBE135BB20C7EE4772FB94C337AF86EA8E49666503"
-"      AE04B6BE81A2F8DD095311E0217ACA698A11E6C5D33CCDAE71498ED35D13991E"
-"      B02F09AB40BD8F4C5ED8C75DA779D0AE104BC34C960B002377068AB4B5A1F984"
-"      3FBA91F537F1B7CAC4D8DD6D89B0D863AF7025D549F9C765D2FC07EE208F8D15#)"
-"  (y #64B11EF8871BE4AB572AA810D5D3CA11A6CDBC637A8014602C72960DB135BF46"
-"      A1816A724C34F87330FC9E187C5D66897A04535CC2AC9164A7150ABFA8179827"
-"      6E45831AB811EEE848EBB24D9F5F2883B6E5DDC4C659DEF944DCFD80BF4D0A20"
-"      42CAA7DC289F0C5A9D155F02D3D551DB741A81695B74D4C8F477F9C7838EB0FB#)))";
-
+"  (p #a85378d8fd3f8d72ec7418080da21317e43ec4b62ba8c862"
+"      3b7e4d04441dd1a0658662596493ca8e9e8fbb7e34aaddb6"
+"      2e5d67b6d09a6e61b769e7c352aa2b10e20ca0636963b552"
+"      3e86470decbbeda027e797e7b67635d4d49c30700e74af8a"
+"      0ff156a801af57a26e7078f1d82f74908ecb6d07e70b3503"
+"      eed94fa32cf17a7fc3d6cf40dc7b00830e6a2566dc073e34"
+"      3312517c6aa5152b4bfecd2e551fee346318a153423c996b"
+"      0d5dcb9102aedd38798616f1f1e0d6c403525b1f9b3d4dc7"
+"      66de2dfc4a56d7b8ba5963d60f3e16318870ad436952e557"
+"      65374eab85e8ec17d6b9a4547b9b5f2752f3105be809b23a"
+"      2c8d7469db02e24d592394a7dba069e9#)"
+"  (q #d277044e50f5a4e3f510a50a0b84fdffbca047ed27602056"
+"      7441a0a5#)"
+"  (g #13d754e21fd241655da891c522a65a72a89bdc64ec9b54a8"
+"      21ed4a898b490e0c4fcb72192a4a20f541f3f2925399f0ba"
+"      ecf929aafbf79dfe4332393b32cd2e2fcf272f32a627434a"
+"      0df242b75b414df372121e53a553f222f836b000f016485b"
+"      6bd0898451801dcd8de64cd5365696ffc532d528c506620a"
+"      942a0305046d8f1876341f1e570bc3974ba6b9a438e97023"
+"      02a2e6e67bfd06d32bc679962271d7b40cd72f386e64e0d7"
+"      ef86ca8ca5d14228dc2a4f16e3189886b5990674f4200f3a"
+"      4cf65a3f0ddba1fa672dff2f5e143d10e4e97ae84f6da095"
+"      35d5b9df259181a79b63b069e949972b02ba36b3586aab7e"
+"      45f322f82e4e85ca3ab85591b3c2a966#)"
+"  (y #2452f3ccbe9ed5ca7dc74c602b99226e8f2fab38e7d7ddfb"
+"      75539b17155e9fcfd1aba564eb8535d812c9c2dcf9728444"
+"      1bc482243624c7f457580c1c38a57c46c457392470edb52c"
+"      b5a6e03fe6287bb6f49a42a2065a054f030839df1fd3149c"
+"      4ca0531dd8ca8aaa9cc7337193387348336118224545e88c"
+"      80ffd8765d74360333ccab9972779b6525a65bdd0d10c675"
+"      c109bbd3e5be4d72ef6eba6e438d5226237db888379c5fcc"
+"      47a3847ff63711baed6d03afe81e694a413b680bd38ab490"
+"      3f8370a707ef551d4941026d9579d691de8edaa16105eb9d"
+"      ba3c2f4c1bec508275aa0207e251b5eccb286a4b01d449d3"
+"      0acb673717a0d2fb3b50c893f7dab14f#)))";
 
 
 
@@ -1046,14 +1090,14 @@ dsa_get_nbits (int algo, gcry_mpi_t *pke
  */
 
 static const char *
-selftest_sign_1024 (gcry_sexp_t pkey, gcry_sexp_t skey)
+selftest_sign (gcry_sexp_t pkey, gcry_sexp_t skey)
 {
   static const char sample_data[] =
     "(data (flags raw)"
-    " (value #a0b1c2d3e4f500102030405060708090a1b2c3d4#))";
+    " (value #a0b1c2d3e4f500102030405060708090a1b2c3d4f1e2d3c4b5a6978879605142#))";
   static const char sample_data_bad[] =
     "(data (flags raw)"
-    " (value #a0b1c2d3e4f510102030405060708090a1b2c3d4#))";
+    " (value #a0b1c2d3e4f500102030405060708090a1b2c3d401e2d3c4b5a6978879605142#))";
 
   const char *errtxt = NULL;
   gcry_error_t err;
@@ -1131,7 +1175,7 @@ selftests_dsa (selftest_report_func_t re
     }
 
   what = "sign";
-  errtxt = selftest_sign_1024 (pkey, skey);
+  errtxt = selftest_sign (pkey, skey);
   if (errtxt)
     goto failed;
 
diff -up libgcrypt-1.5.3/cipher/rsa.c.fips-reqs libgcrypt-1.5.3/cipher/rsa.c
--- libgcrypt-1.5.3/cipher/rsa.c.fips-reqs	2014-11-12 17:05:01.299387339 +0100
+++ libgcrypt-1.5.3/cipher/rsa.c	2014-11-14 14:06:00.099602441 +0100
@@ -52,33 +52,57 @@ typedef struct
 } RSA_secret_key;
 
 
-/* A sample 1024 bit RSA key used for the selftests.  */
+/* A sample 2048 bit RSA key used for the selftests.  */
 static const char sample_secret_key[] =
 "(private-key"
 " (rsa"
-"  (n #00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
-"      2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
-"      ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
-"      891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)"
+"  (n #00c9d56d9d90db43d602ed9688138ab2bf6ea10610b27837a714a8ffdd00"
+"      ddb493a045cc9690edada9ddc4d6ca0cf0ed4f725e21499a1812158f905a"
+"      dbb63399a3e6b4f0c4972126bbe3baf2ffa072da89638e8b3e089d922abe"
+"      16e14315fc57c71f0911671ca996d18b3e8093c159d06d39f2ac95cc1075"
+"      e93124d143af68524be716d749656f26c086adc0070ac1e12f8785863bdc"
+"      5a99bee9f9b9e98227510415ab060e765a288d92bdc5b57ba8df4e47a2c1"
+"      e752bf47f762e03a6f4d6a4d4ed4b95969fab214c1eee62f95cd9472aee4"
+"      db189ac4cd70bdee3116b74965ac40190eb56d83f136bb082f2e4e9262a4"
+"      ff50db2045a2eb167af2d528c1fd4e0371#)"
 "  (e #010001#)"
-"  (d #046129f2489d71579be0a75fe029bd6cdb574ebf57ea8a5b0fda942cab943b11"
-"      7d7bb95e5d28875e0f9fc5fcc06a72f6d502464dabded78ef6b716177b83d5bd"
-"      c543dc5d3fed932e59f5897e92e6f58a0f33424106a3b6fa2cbf877510e4ac21"
-"      c3ee47851e97d12996222ac3566d4ccb0b83d164074abf7de655fc2446da1781#)"
-"  (p #00e861b700e17e8afe6837e7512e35b6ca11d0ae47d8b85161c67baf64377213"
-"      fe52d772f2035b3ca830af41d8a4120e1c1c70d12cc22f00d28d31dd48a8d424f1#)"
-"  (q #00f7a7ca5367c661f8e62df34f0d05c10c88e5492348dd7bddc942c9a8f369f9"
-"      35a07785d2db805215ed786e4285df1658eed3ce84f469b81b50d358407b4ad361#)"
-"  (u #304559a9ead56d2309d203811a641bb1a09626bc8eb36fffa23c968ec5bd891e"
-"      ebbafc73ae666e01ba7c8990bae06cc2bbe10b75e69fcacb353a6473079d8e9b#)))";
-/* A sample 1024 bit RSA key used for the selftests (public only).  */
+"  (d #03b1e24a94e50ab21f8619701ec97679be2cf8f733c9331d9e2974dba721"
+"      27e5def480290e78a769f96b19d28397a284868fb614ca9b1fb3a0d7efed"
+"      df41451204ce71aceba659f6ed15964ebb317712364e1cfaf2fded77d658"
+"      8561acc49c97c2d7efe75f1534b35bd4f6561e1f468b45590db34553d4d0"
+"      c2cb4d806b74e1b2c52740462538865d9792b0aefbbf7b9827f4b3badcb3"
+"      5adab638266a2d2fb8422a7a19142e08848e56af77a66c39b2afafa2e15b"
+"      1a7e4ed1f2c7ed350678c0465d86472af97371b13ef5058662f835ef9087"
+"      f6cca8281bbf1b6b155c737b33d9e443350df85e7cc3b507231fb839f41f"
+"      02c654b29017f35d69007c70e13ba0e5#)"
+"  (p #00ccbe7b096906ee45bf884738a8f817e5b6ba6755e3e8058bb8e253d68e"
+"      ef2ce74f4af74e268d850b3fecc31cd4ebec6ac8722a257dfda67796f01e"
+"      cd2857f83730756bbdd47b0c87c56c8740a5bb272c78c9745a545b0b306f"
+"      444afa71e4216166f9ee65de7c04d7fda9155b7fe27aba698672a6068d9b"
+"      9055609e4c5da9b655#)"
+"  (q #00fc5c6e16ce1f037bcdf7b372b28f1672b856aef7cd67d84e7d07afd543"
+"      26c335be438f4e2f1c434e6bd2b2ec526d97522bcc5c3a6bf414c674da66"
+"      381c7a3f842fe3f95ab865694606a33779b2a15b58ed5ea75f8c6566bbd1"
+"      2436e637a73d49778a8c34d86929f34d5822b05124b640a886590ab7ba5c"
+"      97da57e836da7a9cad#)"
+"  (u #2396c191175e0a83d2dc7b69b2591d3358523f18c709501cb9a1bb4ca238"
+"      404c9a8efe9c9092d0719f899950911f348b745311114a70e2f730d88c80"
+"      e1cc9ff163171a7d67294ccb4e747be03e9e2ff4678fecb95c001e7ea27b"
+"      92c96f4ce40ef94863cd50225dbfb69d01336af450be86984fca3f3afacf"
+"      0740c4aaadaebebf#)))";
+/* A sample 2048 bit RSA key used for the selftests (public only).  */
 static const char sample_public_key[] =
 "(public-key"
 " (rsa"
-"  (n #00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
-"      2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
-"      ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
-"      891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)"
+"  (n #00c9d56d9d90db43d602ed9688138ab2bf6ea10610b27837a714a8ffdd00"
+"      ddb493a045cc9690edada9ddc4d6ca0cf0ed4f725e21499a1812158f905a"
+"      dbb63399a3e6b4f0c4972126bbe3baf2ffa072da89638e8b3e089d922abe"
+"      16e14315fc57c71f0911671ca996d18b3e8093c159d06d39f2ac95cc1075"
+"      e93124d143af68524be716d749656f26c086adc0070ac1e12f8785863bdc"
+"      5a99bee9f9b9e98227510415ab060e765a288d92bdc5b57ba8df4e47a2c1"
+"      e752bf47f762e03a6f4d6a4d4ed4b95969fab214c1eee62f95cd9472aee4"
+"      db189ac4cd70bdee3116b74965ac40190eb56d83f136bb082f2e4e9262a4"
+"      ff50db2045a2eb167af2d528c1fd4e0371#)"
 "  (e #010001#)))";
 
 
@@ -1379,20 +1403,35 @@ compute_keygrip (gcry_md_hd_t md, gcry_s
  */
 
 static const char *
-selftest_sign_1024 (gcry_sexp_t pkey, gcry_sexp_t skey)
+selftest_sign (gcry_sexp_t pkey, gcry_sexp_t skey)
 {
   static const char sample_data[] =
     "(data (flags pkcs1)"
-    " (hash sha1 #11223344556677889900aabbccddeeff10203040#))";
+    " (hash sha256 #11223344556677889900aabbccddeeffa0b0c0d0102030405060708090a1b1c1#))";
   static const char sample_data_bad[] =
     "(data (flags pkcs1)"
-    " (hash sha1 #11223344556677889900aabbccddeeff80203040#))";
+    " (hash sha256 #11223344556677889900aabbccddeeffa0b0c0d0102030405060708091a1b1c1#))";
+  static const char signature_ka[] =
+    "(sig-val \n"
+    " (rsa \n"
+    "  (s #0B12D55738B099D401C81BEEDA54E045B4B7D9CDA5A8769E9C484F696A58912A"
+          "1E5DE7E5A2D181DA15A5C254D802AB75F1056E27406850AC7BE310BC32D2CED8"
+          "6697FE84508F7EFFF4D147C52E955A0873EF2F52ED71F2FC9C3C12D4045CB643"
+          "70158378E1494D8FBAD2248B9B64233D2CC2C1932B0531E539DEB07434B76D3B"
+          "6959E8A37E33B234C0C8C2C8FB1D00939239C9C491B2EBEED77BF952B597E11B"
+          "D4ED0C103D2B88BC78B4E505CF9D8D08B585CE3688D4FBE83ED58D1E1341AC4D"
+          "7C5EFF3CBC565CC7AE61C2F568426763A5239D31C1FFFD366984901679A343C4"
+          "01BB778BBA5E533B7875BA658A19AA9E56170F4A28E4322BF1621175FB06463E#)\n"
+    "  )\n"
+    " )\n";
 
   const char *errtxt = NULL;
   gcry_error_t err;
   gcry_sexp_t data = NULL;
   gcry_sexp_t data_bad = NULL;
   gcry_sexp_t sig = NULL;
+  char buf[1024];
+  size_t len;
 
   err = gcry_sexp_sscan (&data, NULL,
                          sample_data, strlen (sample_data));
@@ -1411,6 +1450,12 @@ selftest_sign_1024 (gcry_sexp_t pkey, gc
       errtxt = "signing failed";
       goto leave;
     }
+  len = gcry_sexp_sprint (sig, GCRYSEXP_FMT_ADVANCED, buf, sizeof(buf));
+  if (len != sizeof (signature_ka) - 1 || memcmp (buf, signature_ka, len) != 0)
+    {
+      errtxt = "signature KAT failed";
+      goto leave;
+    }
   err = gcry_pk_verify (sig, data, pkey);
   if (err)
     {
@@ -1467,11 +1512,11 @@ extract_a_from_sexp (gcry_sexp_t encr_da
 
 
 static const char *
-selftest_encr_1024 (gcry_sexp_t pkey, gcry_sexp_t skey)
+selftest_encr (gcry_sexp_t pkey, gcry_sexp_t skey)
 {
   const char *errtxt = NULL;
   gcry_error_t err;
-  const unsigned int nbits = 1000; /* Encrypt 1000 random bits.  */
+  const unsigned int nbits = 2000; /* Encrypt 2000 random bits.  */
   gcry_mpi_t plaintext = NULL;
   gcry_sexp_t plain = NULL;
   gcry_sexp_t encr  = NULL;
@@ -1594,12 +1639,12 @@ selftests_rsa (selftest_report_func_t re
     }
 
   what = "sign";
-  errtxt = selftest_sign_1024 (pkey, skey);
+  errtxt = selftest_sign (pkey, skey);
   if (errtxt)
     goto failed;
 
   what = "encrypt";
-  errtxt = selftest_encr_1024 (pkey, skey);
+  errtxt = selftest_encr (pkey, skey);
   if (errtxt)
     goto failed;
 
diff -up libgcrypt-1.5.3/random/drbg.c.fips-reqs libgcrypt-1.5.3/random/drbg.c
--- libgcrypt-1.5.3/random/drbg.c.fips-reqs	2014-11-12 17:05:01.000000000 +0100
+++ libgcrypt-1.5.3/random/drbg.c	2014-11-14 14:45:33.820190218 +0100
@@ -390,6 +390,9 @@ gcry_drbg_fips_continuous_test (struct g
   ret = memcmp (drbg->prev, buf, gcry_drbg_blocklen (drbg));
   memcpy (drbg->prev, buf, gcry_drbg_blocklen (drbg));
   /* the test shall pass when the two compared values are not equal */
+  if (ret == 0)
+    fips_signal_error ("duplicate block returned by DRBG");
+
   return ret != 0;
 }
 
diff -up libgcrypt-1.5.3/src/visibility.c.fips-reqs libgcrypt-1.5.3/src/visibility.c
--- libgcrypt-1.5.3/src/visibility.c.fips-reqs	2013-07-25 11:10:04.000000000 +0200
+++ libgcrypt-1.5.3/src/visibility.c	2014-11-12 17:05:27.251973230 +0100
@@ -1217,6 +1217,9 @@ gcry_kdf_derive (const void *passphrase,
                  unsigned long iterations,
                  size_t keysize, void *keybuffer)
 {
+  if (!fips_is_operational ())
+    return gpg_error (fips_not_operational ());
+
   return _gcry_kdf_derive (passphrase, passphraselen, algo, hashalgo,
                            salt, saltlen, iterations, keysize, keybuffer);
 }
@@ -1271,6 +1274,13 @@ void
 gcry_mpi_randomize (gcry_mpi_t w,
                     unsigned int nbits, enum gcry_random_level level)
 {
+  if (!fips_is_operational ())
+    {
+      (void)fips_not_operational ();
+      fips_signal_fatal_error ("called in non-operational state");
+      fips_noreturn ();
+    }
+
   _gcry_mpi_randomize (w, nbits, level);
 }
 
@@ -1296,6 +1306,9 @@ gcry_prime_generate (gcry_mpi_t *prime,
                      gcry_random_level_t random_level,
                      unsigned int flags)
 {
+  if (!fips_is_operational ())
+    return gpg_error (fips_not_operational ());
+
   return _gcry_prime_generate (prime, prime_bits, factor_bits, factors,
                                cb_func, cb_arg, random_level, flags);
 }