[PATCH] wolfSSL: Fixes for FIPS builds

Juliusz Sosinowicz juliusz at wolfssl.com
Fri Apr 29 07:21:32 PDT 2022


This patch extends some code submitted in the earlier patch "SAE-PK 
support with wolfSSL".

Sincerely
Juliusz

On 29/04/2022 16:18, Juliusz Sosinowicz wrote:
> - Register a callback with wolfCrypt_SetCb_fips to inform the user of errors in the wolfCrypt FIPS module
> - Some API is not available when using FIPS. We need to allocate memory and initialize the structs directly.
>
> Signed-off-by: Juliusz Sosinowicz <juliusz at wolfssl.com>
> ---
>   src/crypto/crypto_wolfssl.c | 30 +++++++++++++++++++++++++++++-
>   src/crypto/tls_wolfssl.c    | 28 +++++++++++++++++++++++++++-
>   2 files changed, 56 insertions(+), 2 deletions(-)
>
> diff --git a/src/crypto/crypto_wolfssl.c b/src/crypto/crypto_wolfssl.c
> index 336e59a0c6..7a5b410694 100644
> --- a/src/crypto/crypto_wolfssl.c
> +++ b/src/crypto/crypto_wolfssl.c
> @@ -1736,7 +1736,7 @@ struct crypto_ecdh * crypto_ecdh_init(int group)
>   	if (ret < 0)
>   		goto fail;
>   
> -#ifdef ECC_TIMING_RESISTANT
> +#if defined(ECC_TIMING_RESISTANT) && !defined(CONFIG_FIPS)
>   	ret = wc_ecc_set_rng(&ecdh->ec->key, &ecdh->rng);
>   	if (ret < 0)
>   		goto fail;
> @@ -1858,7 +1858,11 @@ static struct crypto_ec_key* crypto_ec_key_init(void)
>   	wpa_printf(MSG_DEBUG, "wolfSSL: crypto_ec_key_init starting");
>   	key = os_zalloc(sizeof(struct crypto_ec_key));
>   	if (key) {
> +#ifndef CONFIG_FIPS
>   		key->eckey = wc_ecc_key_new(NULL);
> +#else
> +		key->eckey = os_zalloc(sizeof(ecc_key));
> +#endif
>   		/* Omit key->rng initialization because it seeds itself and thus
>   		 * consumes entropy that may never be used. Lazy initialize when
>   		 * necessary. */
> @@ -1867,6 +1871,13 @@ static struct crypto_ec_key* crypto_ec_key_init(void)
>   			crypto_ec_key_deinit(key);
>   			key = NULL;
>   		}
> +#ifdef CONFIG_FIPS
> +		else if (wc_ecc_init_ex(key->eckey, NULL, INVALID_DEVID) != 0) {
> +			wpa_printf(MSG_ERROR, "wolfSSL: wc_ecc_init_ex failed");
> +			crypto_ec_key_deinit(key);
> +			key = NULL;
> +		}
> +#endif
>   	}
>   	return key;
>   }
> @@ -1875,8 +1886,15 @@ void crypto_ec_key_deinit(struct crypto_ec_key *key)
>   {
>   	wpa_printf(MSG_DEBUG, "wolfSSL: crypto_ec_key_deinit starting");
>   	if (key) {
> +#ifndef CONFIG_FIPS
>   		wc_rng_free(key->rng);
>   		wc_ecc_key_free(key->eckey);
> +#else
> +		if (key->rng)
> +			os_free(key->rng);
> +		if (key->eckey)
> +			os_free(key->eckey);
> +#endif
>   		os_free(key);
>   	}
>   }
> @@ -2037,11 +2055,21 @@ struct wpabuf * crypto_ec_key_sign(struct crypto_ec_key *key, const u8 *data,
>   
>   	if (!key->rng) {
>   		/* Lazy init key->rng */
> +#ifndef CONFIG_FIPS
>   		key->rng = wc_rng_new(NULL, 0, NULL);
> +#else
> +		key->rng = os_zalloc(sizeof(WC_RNG));
> +#endif
>   		if (!key->rng) {
>   			wpa_printf(MSG_ERROR, "wolfSSL: wc_rng_new failed");
>   			goto fail;
>   		}
> +#ifdef CONFIG_FIPS
> +		if (wc_InitRng(key->rng) != 0) {
> +			wpa_printf(MSG_ERROR, "wolfSSL: wc_InitRng failed");
> +			goto fail;
> +		}
> +#endif
>   	}
>   
>   	derLen = wc_ecc_sig_size(key->eckey);
> diff --git a/src/crypto/tls_wolfssl.c b/src/crypto/tls_wolfssl.c
> index 04e1e0e810..91299befe9 100644
> --- a/src/crypto/tls_wolfssl.c
> +++ b/src/crypto/tls_wolfssl.c
> @@ -26,6 +26,10 @@
>   #include <wolfssl/wolfcrypt/aes.h>
>   #endif
>   
> +#if defined(CONFIG_FIPS)
> +#include <wolfssl/wolfcrypt/fips_test.h>
> +#endif
> +
>   #if !defined(CONFIG_FIPS) &&                             \
>       (defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) ||   \
>        defined(EAP_SERVER_FAST))
> @@ -191,6 +195,21 @@ static void remove_session_cb(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *sess)
>   	wolfSSL_SESSION_set_ex_data(sess, tls_ex_idx_session, NULL);
>   }
>   
> +#if defined(CONFIG_FIPS) && defined(HAVE_FIPS)
> +static void wcFipsCb(int ok, int err, const char* hash)
> +{
> +    wpa_printf(MSG_ERROR, "wolfFIPS: wolfCrypt Fips error callback, ok = %d, "
> +    						"err = %d\n", ok, err);
> +    wpa_printf(MSG_ERROR, "wolfFIPS: message = %s\n", wc_GetErrorString(err));
> +    wpa_printf(MSG_ERROR, "wolfFIPS: hash = %s\n", hash);
> +    if (err == IN_CORE_FIPS_E) {
> +        wpa_printf(MSG_ERROR, "wolfFIPS: In core integrity hash check failure, "
> +        						"copy above hash\n");
> +        wpa_printf(MSG_ERROR, "wolfFIPS: into verifyCore[] in fips_test.c and "
> +        						"rebuild\n");
> +    }
> +}
> +#endif
>   
>   #ifdef DEBUG_WOLFSSL
>   static void wolfSSL_logging_cb(const int log_level,
> @@ -222,7 +241,9 @@ void * tls_init(const struct tls_config *conf)
>   
>   		if (wolfSSL_Init() < 0)
>   			return NULL;
> -		/* wolfSSL_Debugging_ON(); */
> +#if defined(CONFIG_FIPS) && defined(HAVE_FIPS)
> +			wolfCrypt_SetCb_fips(wcFipsCb);
> +#endif
>   	}
>   
>   	tls_ref_count++;
> @@ -2059,9 +2080,14 @@ int tls_connection_get_eap_fast_key(void *tls_ctx, struct tls_connection *conn,
>   			       _out, skip + out_len);
>   		ret = 0;
>   	} else {
> +#ifndef CONFIG_FIPS
>   		ret = tls_prf_sha1_md5(master_key, master_key_len,
>   				       "key expansion", seed, sizeof(seed),
>   				       _out, skip + out_len);
> +#else
> +		wpa_printf(MSG_ERROR, "wolfSSL: Can't use sha1_md5 in FIPS build");
> +		ret = -1;
> +#endif
>   	}
>   
>   	forced_memzero(master_key, master_key_len);



More information about the Hostap mailing list