]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
jitter: support an internal jitter entropy source in the FIPS provider
authorPauli <ppzgs1@gmail.com>
Thu, 19 Sep 2024 22:58:47 +0000 (08:58 +1000)
committerPauli <ppzgs1@gmail.com>
Wed, 9 Oct 2024 02:53:10 +0000 (13:53 +1100)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/25498)

crypto/rand/build.info
crypto/rand/rand_lib.c
providers/fips/fipsprov.c
providers/implementations/rands/build.info

index 7c01577b0d3d459f4ff781983f498bc231b0489b..e4436521e7c479684f416ae95d6c9ea3db2c7693 100644 (file)
@@ -1,8 +1,7 @@
 LIBS=../../libcrypto
 
 $COMMON=rand_lib.c
-$CRYPTO=randfile.c rand_err.c rand_deprecated.c prov_seed.c rand_pool.c \
-        rand_uniform.c
+$CRYPTO=randfile.c rand_err.c rand_deprecated.c prov_seed.c rand_uniform.c
 
 IF[{- !$disabled{'egd'} -}]
   $CRYPTO=$CRYPTO rand_egd.c
@@ -11,5 +10,11 @@ IF[{- !$disabled{'deprecated-3.0'} -}]
   $CRYPTO=$CRYPTO rand_meth.c
 ENDIF
 
+IF[{- !$disabled{'fips-jitter'} -}]
+  $COMMON=$COMMON rand_pool.c
+ELSE
+  $CRYPTO=$CRYPTO rand_pool.c
+ENDIF
+
 SOURCE[../../libcrypto]=$COMMON $CRYPTO
 SOURCE[../../providers/libfips.a]=$COMMON
index 54302901924eee8ac2e9b66dbe03173d6b6ccfbd..ad66cd77911729523e7e03a891737a19e4c9a0aa 100644 (file)
@@ -534,14 +534,16 @@ static void rand_delete_thread_state(void *arg)
     EVP_RAND_CTX_free(rand);
 }
 
-#ifndef FIPS_MODULE
+#if !defined(FIPS_MODULE) || !defined(OPENSSL_NO_FIPS_JITTER)
 static EVP_RAND_CTX *rand_new_seed(OSSL_LIB_CTX *libctx)
 {
     EVP_RAND *rand;
-    RAND_GLOBAL *dgbl = rand_get_global(libctx);
-    EVP_RAND_CTX *ctx = NULL;
     const char *propq;
-    char *name, *props = NULL;
+    char *name;
+    EVP_RAND_CTX *ctx = NULL;
+# ifdef OPENSSL_NO_FIPS_JITTER
+    RAND_GLOBAL *dgbl = rand_get_global(libctx);
+    char *props = NULL;
     size_t props_len;
     OSSL_PROPERTY_LIST *pl1, *pl2, *pl3 = NULL;
 
@@ -599,6 +601,10 @@ static EVP_RAND_CTX *rand_new_seed(OSSL_LIB_CTX *libctx)
         }
         name = OPENSSL_MSTR(OPENSSL_DEFAULT_SEED_SRC);
     }
+# else /* !OPENSSL_NO_FIPS_JITTER */
+    name = "JITTER";
+    propq = "-fips";  /* precautionary: shouldn't matter since it's internal */
+# endif /* OPENSSL_NO_FIPS_JITTER */
 
     rand = EVP_RAND_fetch(libctx, name, propq);
     if (rand == NULL) {
@@ -615,15 +621,21 @@ static EVP_RAND_CTX *rand_new_seed(OSSL_LIB_CTX *libctx)
         ERR_raise(ERR_LIB_RAND, RAND_R_ERROR_INSTANTIATING_DRBG);
         goto err;
     }
+# ifdef OPENSSL_NO_FIPS_JITTER
     OPENSSL_free(props);
+# endif /* OPENSSL_NO_FIPS_JITTER */
     return ctx;
  err:
     EVP_RAND_CTX_free(ctx);
+# ifdef OPENSSL_NO_FIPS_JITTER
     ossl_property_free(pl3);
     OPENSSL_free(props);
+# endif /* OPENSSL_NO_FIPS_JITTER */
     return NULL;
 }
+#endif  /* !FIPS_MODULE || !OPENSSL_NO_FIPS_JITTER */
 
+#ifndef FIPS_MODULE
 EVP_RAND_CTX *ossl_rand_get0_seed_noncreating(OSSL_LIB_CTX *ctx)
 {
     RAND_GLOBAL *dgbl = rand_get_global(ctx);
@@ -638,7 +650,7 @@ EVP_RAND_CTX *ossl_rand_get0_seed_noncreating(OSSL_LIB_CTX *ctx)
     CRYPTO_THREAD_unlock(dgbl->lock);
     return ret;
 }
-#endif
+#endif  /* !FIPS_MODULE */
 
 static EVP_RAND_CTX *rand_new_drbg(OSSL_LIB_CTX *libctx, EVP_RAND_CTX *parent,
                                    unsigned int reseed_interval,
@@ -697,13 +709,13 @@ static EVP_RAND_CTX *rand_new_drbg(OSSL_LIB_CTX *libctx, EVP_RAND_CTX *parent,
     return ctx;
 }
 
-#ifdef FIPS_MODULE
+#if defined(FIPS_MODULE)
 static EVP_RAND_CTX *rand_new_crngt(OSSL_LIB_CTX *libctx, EVP_RAND_CTX *parent)
 {
     EVP_RAND *rand;
     EVP_RAND_CTX *ctx;
 
-    rand = EVP_RAND_fetch(libctx, "CRNG-TEST", "fips=no");
+    rand = EVP_RAND_fetch(libctx, "CRNG-TEST", "-fips");
     if (rand == NULL) {
         ERR_raise(ERR_LIB_RAND, RAND_R_UNABLE_TO_FETCH_DRBG);
         return NULL;
@@ -722,7 +734,7 @@ static EVP_RAND_CTX *rand_new_crngt(OSSL_LIB_CTX *libctx, EVP_RAND_CTX *parent)
     }
     return ctx;
 }
-#endif
+#endif  /* FIPS_MODULE */
 
 /*
  * Get the primary random generator.
@@ -755,17 +767,22 @@ EVP_RAND_CTX *RAND_get0_primary(OSSL_LIB_CTX *ctx)
         return ret;
     }
 
-#ifdef FIPS_MODULE
-    ret = rand_new_crngt(ctx, dgbl->seed);
-#else
+#if !defined(FIPS_MODULE) || !defined(OPENSSL_NO_FIPS_JITTER)
+    /* Create a seed source for libcrypto or jitter enabled FIPS provider */
     if (dgbl->seed == NULL) {
         ERR_set_mark();
         dgbl->seed = rand_new_seed(ctx);
         ERR_pop_to_mark();
     }
+#endif  /* !FIPS_MODULE || !OPENSSL_NO_FIPS_JITTER */
+
+#if defined(FIPS_MODULE)
+    /* The FIPS provider has entropy health tests instead of the primary */
+    ret = rand_new_crngt(ctx, dgbl->seed);
+#else   /* FIPS_MODULE */
     ret = rand_new_drbg(ctx, dgbl->seed, PRIMARY_RESEED_INTERVAL,
                         PRIMARY_RESEED_TIME_INTERVAL);
-#endif
+#endif  /* FIPS_MODULE */
 
     /*
      * The primary DRBG may be shared between multiple threads so we must
index 561f7123ad2ce77c9c981442a422ab68dda6c999..ba82435dd9a856d5e7168f77c00a51eef267a256 100644 (file)
@@ -390,6 +390,9 @@ static const OSSL_ALGORITHM fips_rands[] = {
     { PROV_NAMES_CTR_DRBG, FIPS_DEFAULT_PROPERTIES, ossl_drbg_ctr_functions },
     { PROV_NAMES_HASH_DRBG, FIPS_DEFAULT_PROPERTIES, ossl_drbg_hash_functions },
     { PROV_NAMES_HMAC_DRBG, FIPS_DEFAULT_PROPERTIES, ossl_drbg_ossl_hmac_functions },
+#ifndef OPENSSL_NO_FIPS_JITTER
+    { PROV_NAMES_JITTER, FIPS_DEFAULT_PROPERTIES, ossl_jitter_functions },
+#endif
     { PROV_NAMES_TEST_RAND, FIPS_UNAPPROVED_PROPERTIES, ossl_test_rng_functions },
     { NULL, NULL, NULL }
 };
index 8e0894faa65aac8ebbe1e9dd4d831b0441414351..98230648e354f9d43553a5593678a3cc772ada7f 100644 (file)
@@ -5,3 +5,7 @@ $RANDS_GOAL=../../libdefault.a ../../libfips.a
 SOURCE[$RANDS_GOAL]=drbg.c test_rng.c drbg_ctr.c drbg_hash.c drbg_hmac.c
 SOURCE[../../libdefault.a]=seed_src.c seed_src_jitter.c
 SOURCE[../../libfips.a]=fips_crng_test.c
+
+IF[{- !$disabled{'fips-jitter'} -}]
+  SOURCE[../../libfips.a]=seed_src_jitter.c
+ENDIF