diff -up openssl-3.0.0-alpha13/crypto/context.c.kernel-fips openssl-3.0.0-alpha13/crypto/context.c --- openssl-3.0.0-alpha13/crypto/context.c.kernel-fips 2021-03-16 00:09:55.814826432 +0100 +++ openssl-3.0.0-alpha13/crypto/context.c 2021-03-16 00:15:55.129043811 +0100 @@ -12,11 +12,54 @@ #include "internal/bio.h" #include "internal/provider.h" +#ifndef FIPS_MODULE +# include +# include +# include +# include +# include +#endif + struct ossl_lib_ctx_onfree_list_st { ossl_lib_ctx_onfree_fn *fn; struct ossl_lib_ctx_onfree_list_st *next; }; +# ifndef FIPS_MODULE +# define FIPS_MODE_SWITCH_FILE "/proc/sys/crypto/fips_enabled" + +static int kernel_fips_flag; + +static void read_kernel_fips_flag(void) +{ + char buf[2] = "0"; + int fd; + + if (ossl_safe_getenv("OPENSSL_FORCE_FIPS_MODE") != NULL) { + buf[0] = '1'; + } else if ((fd = open(FIPS_MODE_SWITCH_FILE, O_RDONLY)) >= 0) { + while (read(fd, buf, sizeof(buf)) < 0 && errno == EINTR) ; + close(fd); + } + + if (buf[0] == '1') { + kernel_fips_flag = 1; + } + + return; +} + +static int apply_kernel_fips_flag(OSSL_LIB_CTX *ctx) +{ + if (kernel_fips_flag) { + return EVP_default_properties_enable_fips(ctx, 1); + } + + return 1; +} +# endif + + struct ossl_lib_ctx_st { CRYPTO_RWLOCK *lock; CRYPTO_EX_DATA data; @@ -74,6 +117,12 @@ static int context_init(OSSL_LIB_CTX *ct if (!ossl_property_parse_init(ctx)) goto err; +# ifndef FIPS_MODULE + /* Preset the fips=yes default property with kernel FIPS mode */ + if (!apply_kernel_fips_flag(ctx)) + goto err; +# endif + return 1; err: if (exdata_done) @@ -121,6 +170,7 @@ static CRYPTO_THREAD_LOCAL default_conte DEFINE_RUN_ONCE_STATIC(default_context_do_init) { + read_kernel_fips_flag(); return CRYPTO_THREAD_init_local(&default_context_thread_local, NULL) && context_init(&default_context_int); }