if (rad_check_lib_magic(RADIUSD_MAGIC_NUMBER) < 0) EXIT_WITH_FAILURE;
-
#ifdef HAVE_OPENSSL_CRYPTO_H
/*
* Mismatch between build time OpenSSL and linked SSL, better to die
#ifdef HAVE_OPENSSL_CRYPTO_H
/*
- * Toggle OpenSSL FIPS mode
+ * Toggle FIPS mode
*/
- if (config->openssl_fips_mode_is_set) {
- if (FIPS_mode_set(config->openssl_fips_mode ? 1 : 0) == 0) {
- fr_tls_log_error(NULL, "Failed %s OpenSSL FIPS mode",
- config->openssl_fips_mode ? "enabling" : "disabling");
- EXIT_WITH_FAILURE;
- }
- }
+ if (config->openssl_fips_mode_is_set &&
+ (fr_openssl_fips_mode(config->openssl_fips_mode) < 0)) EXIT_WITH_FAILURE;
#endif
/*
fr_perror("unit_test_attribute");
EXIT_WITH_FAILURE;
}
-
+
unlang_thread_instantiate(autofree);
if (!xlat_register(NULL, "test", xlat_test, false)) {
int fr_openssl_init(void);
+int fr_openssl_fips_mode(bool enabled);
+
void fr_openssl_free(void);
int fr_tls_dict_init(void);
#define LOG_PREFIX "tls - "
#include <openssl/conf.h>
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+# include <openssl/provider.h>
+#endif
#include <freeradius-devel/server/base.h>
#include <freeradius-devel/tls/attrs.h>
return -1;
}
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ /*
+ * Load the default provider for most algorithms
+ */
+ if (!OSSL_PROVIDER_load(NULL, "default")) {
+ fr_tls_log_error(NULL, "Failed loading default provider");
+ return -1;
+ }
+
+ /*
+ * Needed for MD4
+ *
+ * https://www.openssl.org/docs/man3.0/man7/migration_guide.html#Legacy-Algorithms
+ */
+ if (!OSSL_PROVIDER_load(NULL, "legacy")) {
+ fr_tls_log_error(NULL, "Failed loading legacy provider");
+ return -1;
+ }
+#endif
+
+ OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
+
/*
* SHA256 is in all versions of OpenSSL, but isn't
* initialized by default. It's needed for WiMAX
*/
EVP_add_digest(EVP_sha256());
- OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
-
/*
* FIXME - This should be done _after_
* running any engine controls.
return 0;
}
+/** Enable or disable fips mode
+ *
+ * @param[in] enabled If true enable fips mode if false disable fips mode.
+ * @return
+ * - 0 on success.
+ * - -1 on failure
+ */
+int fr_openssl_fips_mode(bool enabled)
+{
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ if (!EVP_set_default_properties(NULL, enabled ? "fips=yes" : "fips=no")) {
+ fr_tls_log_error(NULL, "Failed %s OpenSSL FIPS mode", enabled ? "enabling" : "disabling");
+ return -1;
+ }
+#else
+ if (!FIPS_mode_set(enabled ? 1 : 0)) {
+ fr_tls_log_error(NULL, "Failed %s OpenSSL FIPS mode", enabled ? "enabling" : "disabling");
+ return -1;
+ }
+#endif
+
+ return 0;
+}
+
/** Load dictionary attributes
*
* This is a separate function because of ordering issues.
#include <openssl/rand.h>
#include <openssl/dh.h>
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+# include <openssl/provider.h>
+#endif
#include "base.h"
#include "utils.h"
* Change suggested by @t8m
*/
#if OPENSSL_VERSION_NUMBER >= 0x10101000L
+# if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ if (EVP_default_properties_is_fips_enabled(NULL)) {
+# else
if (FIPS_mode() > 0) {
+#endif
WARN(LOG_PREFIX ": Ignoring user-selected DH parameters in FIPS mode. Using defaults.");
return 0;
}
* be operating in FIPS mode where MD4 digest functions are unavailable.
*/
#ifdef HAVE_OPENSSL_EVP_H
+
# include <openssl/evp.h>
# include <openssl/crypto.h>
+# include <openssl/err.h>
+
+# if OPENSSL_VERSION_NUMBER >= 0x30000000L
+# include <openssl/provider.h>
+# endif
static int have_openssl_md4 = -1;
return NULL;
}
fr_atexit_thread_local(md4_ctx, _md4_ctx_openssl_free_on_exit, md_ctx);
- EVP_DigestInit_ex(md_ctx, EVP_md4(), NULL);
+ if (unlikely(EVP_DigestInit_ex(md_ctx, EVP_md4(), NULL) != 1)) {
+ char buffer[256];
+ error:
+
+ ERR_error_string_n(ERR_get_error(), buffer, sizeof(buffer));
+
+ fr_strerror_printf("Failed initialising MD4 ctx: %s", buffer);
+ EVP_MD_CTX_free(md_ctx);
+ md_ctx = NULL;
+
+ return NULL;
+ }
} else {
md_ctx = md4_ctx;
}
} else {
md_ctx = EVP_MD_CTX_new();
if (unlikely(!md_ctx)) goto oom;
- EVP_DigestInit_ex(md_ctx, EVP_md4(), NULL);
+ if (EVP_DigestInit_ex(md_ctx, EVP_md4(), NULL) != 1) goto error;
}
return md_ctx;
* md4 functions, and call the OpenSSL init
* function.
*/
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ if (!EVP_default_properties_is_fips_enabled(NULL)) {
+#else
if (FIPS_mode() == 0) {
+#endif
have_openssl_md4 = 1;
/*
bool used;
fr_md5_ctx_t *md_ctx;
} fr_md5_free_list_t;
-static _Thread_local fr_md5_free_list_t * md5_array;
+static _Thread_local fr_md5_free_list_t *md5_array;
# include <openssl/evp.h>
# include <openssl/crypto.h>
+# include <openssl/err.h>
+
+# if OPENSSL_VERSION_NUMBER >= 0x30000000L
+# include <openssl/provider.h>
+# endif
static int have_openssl_md5 = -1;
fr_strerror_const("Out of memory");
return NULL;
}
- EVP_DigestInit_ex(md_ctx, EVP_md5(), NULL);
+ if (unlikely(EVP_DigestInit_ex(md_ctx, EVP_md5(), NULL) != 1)) {
+ char buffer[256];
+ error:
+
+ ERR_error_string_n(ERR_get_error(), buffer, sizeof(buffer));
+
+ fr_strerror_printf("Failed initialising MD5 ctx: %s", buffer);
+ EVP_MD_CTX_free(md_ctx);
+ md_ctx = NULL;
+
+ return NULL;
+ }
return md_ctx;
}
* Initialize all MD5 contexts
*/
for (i = 0; i < ARRAY_SIZE; i++) {
- free_list[i].md_ctx = EVP_MD_CTX_new();
- if (!free_list[i].md_ctx ) goto oom;
- EVP_DigestInit_ex(free_list[i].md_ctx, EVP_md5(), NULL);
+ md_ctx = EVP_MD_CTX_new();
+ if (unlikely(md_ctx == NULL)) goto oom;
+
+ if (unlikely(EVP_DigestInit_ex(md_ctx, EVP_md5(), NULL) != 1)) goto error;
+ free_list[i].md_ctx = md_ctx;
}
} else {
free_list = md5_array;
* md5 functions, and call the OpenSSL init
* function.
*/
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ if (!EVP_default_properties_is_fips_enabled(NULL)) {
+#else
if (FIPS_mode() == 0) {
+#endif
have_openssl_md5 = 1;
/*
void fr_md5_calc(uint8_t out[static MD5_DIGEST_LENGTH], uint8_t const *in, size_t inlen);
/* hmac.c */
-void fr_hmac_md5(uint8_t digest[static MD5_DIGEST_LENGTH], uint8_t const *in, size_t inlen,
+int fr_hmac_md5(uint8_t digest[static MD5_DIGEST_LENGTH], uint8_t const *in, size_t inlen,
uint8_t const *key, size_t key_len);
#ifdef __cplusplus
}
/* hmacsha1.c */
-void fr_hmac_sha1(uint8_t digest[static SHA1_DIGEST_LENGTH], uint8_t const *in, size_t inlen,
- uint8_t const *key, size_t key_len);
+int fr_hmac_sha1(uint8_t digest[static SHA1_DIGEST_LENGTH], uint8_t const *in, size_t inlen,
+ uint8_t const *key, size_t key_len);
#ifdef __cplusplus
}