]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
fips: verify that the RNG was restored after the self tests
authorPauli <pauli@openssl.org>
Wed, 26 Oct 2022 09:09:24 +0000 (20:09 +1100)
committerPauli <pauli@openssl.org>
Tue, 1 Nov 2022 21:42:46 +0000 (08:42 +1100)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/19510)

providers/fips/self_test.c

index e10b00b5aab77dee8e7251ec9ba491e84ca36607..10804d9f59fb425d10eaac6a8b7594bde18cf2c6 100644 (file)
@@ -15,6 +15,7 @@
 #include <openssl/fipskey.h>
 #include <openssl/err.h>
 #include <openssl/proverr.h>
+#include <openssl/rand.h>
 #include "internal/e_os.h"
 #include "prov/providercommon.h"
 
@@ -307,6 +308,8 @@ int SELF_TEST_post(SELF_TEST_POST_PARAMS *st, int on_demand_test)
     unsigned char *indicator_checksum = NULL;
     int loclstate;
     OSSL_SELF_TEST *ev = NULL;
+    EVP_RAND *testrand = NULL;
+    EVP_RAND_CTX *rng;
 
     if (!RUN_ONCE(&fips_self_test_init, do_fips_self_test_init))
         return 0;
@@ -417,8 +420,19 @@ int SELF_TEST_post(SELF_TEST_POST_PARAMS *st, int on_demand_test)
         }
     }
 
+    /* Verify that the RNG has been restored properly */
+    testrand = EVP_RAND_fetch(st->libctx, "TEST-RAND", NULL);
+    if (testrand == NULL
+            || (rng = RAND_get0_private(st->libctx)) == NULL
+            || strcmp(EVP_RAND_get0_name(EVP_RAND_CTX_get0_rand(rng)),
+                      EVP_RAND_get0_name(testrand)) == 0) {
+        ERR_raise(ERR_LIB_PROV, PROV_R_SELF_TEST_KAT_FAILURE);
+        goto end;
+    }
+
     ok = 1;
 end:
+    EVP_RAND_free(testrand);
     OSSL_SELF_TEST_free(ev);
     OPENSSL_free(module_checksum);
     OPENSSL_free(indicator_checksum);