File 0714-crypto-Workaround-fips-bug-causing-RAND_bytes-to-fai.patch of Package erlang

From 85edb09c595336388737b3beed24f82cb39aaa57 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Tue, 10 Sep 2024 17:54:11 +0200
Subject: [PATCH] crypto: Workaround fips bug causing RAND_bytes to fail

Symtom:
RAND_bytes fails on Ubuntu pro with fips enabled.

Problem:
init_curve_types() switched FIPS mode off and on again (and generates
random keys) which seem to cause RAND_bytes to fail accessing its
fips provider.

Solution:
Remove init_curve_types() call at init as this check will be done
by get_curve_cnt() anyway first time crypto:supports(curves) is called.
---
 lib/crypto/c_src/algorithms.c | 42 +++++------------------------------
 1 file changed, 5 insertions(+), 37 deletions(-)

diff --git a/lib/crypto/c_src/algorithms.c b/lib/crypto/c_src/algorithms.c
index c7e1fdea04..578f79e4f1 100644
--- a/lib/crypto/c_src/algorithms.c
+++ b/lib/crypto/c_src/algorithms.c
@@ -39,8 +39,7 @@ void init_pubkey_types(ErlNifEnv* env);
 
 static ERL_NIF_TERM algo_curve[2][89]; /* increase when extending the list */
 static ErlNifMutex* mtx_init_curve_types;
-void init_curve_types(ErlNifEnv* env);
-int get_curve_cnt(ErlNifEnv* env, int fips);
+static int get_curve_cnt(ErlNifEnv* env, int fips);
 
 static unsigned int algo_rsa_opts_cnt, algo_rsa_opts_fips_cnt;
 static ERL_NIF_TERM algo_rsa_opts[11]; /* increase when extending the list */
@@ -56,7 +55,6 @@ void init_algorithms_types(ErlNifEnv* env)
     init_hash_types(env);
 #endif
     init_pubkey_types(env);
-    init_curve_types(env);
     init_rsa_opts_types(env);
     /* ciphers and macs are initiated statically */
 }
@@ -230,9 +228,9 @@ ERL_NIF_TERM curve_algorithms(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
     return enif_make_list_from_array(env, algo_curve[fips_mode], algo_curve_cnt);
 }
 
-int init_curves(ErlNifEnv* env, int fips);
+static int init_curves(ErlNifEnv* env, int fips);
 #if defined(HAVE_EC)
-int valid_curve(int nid);
+static int valid_curve(int nid);
 #endif
 
 int get_curve_cnt(ErlNifEnv* env, int fips) {
@@ -266,38 +264,6 @@ int get_curve_cnt(ErlNifEnv* env, int fips) {
     return cnt;
 }
 
-void init_curve_types(ErlNifEnv* env) {
-    /* Initialize the curve counters and curve's lists
-       by calling get_curve_cnt
-    */
-#ifdef FIPS_SUPPORT
-    if (FIPS_MODE()) {
-        // FIPS enabled
-        get_curve_cnt(env, 1);
-        FIPS_mode_set(0); // disable
-        get_curve_cnt(env, 0);
-        FIPS_mode_set(1); // re-enable
-    } else {
-        // FIPS disabled but available
-        get_curve_cnt(env, 0);
-        FIPS_mode_set(1); // enable
-        get_curve_cnt(env, 1);
-        FIPS_mode_set(0); // re-disable
-    }
-#else
-    // FIPS mode is not available
-    get_curve_cnt(env, 0);
-#endif
-
-# ifdef DEBUG
-    {
-        int curve_cnt = get_curve_cnt(env, 0);
-        ASSERT(curve_cnt <= sizeof(algo_curve[0])/sizeof(ERL_NIF_TERM));
-    }
-# endif 
-}
-
-
 int init_curves(ErlNifEnv* env, int fips) {
 #if defined(HAVE_EC)
     int cnt = 0;
@@ -647,6 +613,8 @@ int init_curves(ErlNifEnv* env, int fips) {
 #endif
     }
 
+    ASSERT(cnt <= sizeof(algo_curve[0])/sizeof(ERL_NIF_TERM));
+
     return cnt;
 #else /* if not HAVE_EC */
     return 0;
-- 
2.43.0

openSUSE Build Service is sponsored by