OpenSSL 3.0 FIPS questions

Matt Caswell matt at openssl.org
Thu Oct 28 18:03:20 UTC 2021



On 28/10/2021 18:33, Jason Schultz wrote:
> Thanks Matt. I think I have what I need as far as loading providers. I 
> also did the test you suggested with EVP_MD_fetch() and things failed as 
> expected, the fetch did not work.
> 
> One other question on providers, given how I load everything, it seems 
> like before application exit, the cleanup should be the following:
> 
>      OSSL_LIB_CTX_free(fips_libctx);
>      OSSL_LIB_CTX_free(non_fips_libctx);
>      OSSL_PROVIDER_unload(defp);

Yes, but I would recommend unloading the default provider before freeing 
the libctx it is associated with. Otherwise bad things might happen.

> 
> Since I didn't "explicitly" load the fips and base providers with API 
> calls, I only need to unlead the default provider, as well as free both 
> library contexts.

Correct.

> 
> Also, when I did try to unload the fips and base providers, the call to 
> OSSL_PROVIDER_unload() hung, with the following backtrace:

Yeah. Don't do that. :-)

Matt

> 
> #1  0x00007fb37f51d709 in CRYPTO_THREAD_read_lock () from 
> /lib64/libcrypto.so.3
> #2  0x00007fb37f50c068 in ossl_lib_ctx_get_data () from 
> /lib64/libcrypto.so.3
> #3  0x00007fb37f519482 in get_provider_store () from /lib64/libcrypto.so.3
> #4  0x00007fb37f519af9 in provider_deactivate () from /lib64/libcrypto.so.3
> #5  0x00007fb37f51b813 in ossl_provider_deactivate () from 
> /lib64/libcrypto.so.3
> #6  0x00007fb37f518399 in OSSL_PROVIDER_unload () from /lib64/libcrypto.so.3
> 
> Thanks,
> 
> Jason
> 
> 
> ------------------------------------------------------------------------
> *From:* Matt Caswell <matt at openssl.org>
> *Sent:* Thursday, October 28, 2021 2:00 PM
> *To:* Jason Schultz <jetson23 at hotmail.com>; Dr Paul Dale 
> <pauli at openssl.org>; openssl-users at openssl.org <openssl-users at openssl.org>
> *Subject:* Re: OpenSSL 3.0 FIPS questions
> 
> 
> On 28/10/2021 14:49, Jason Schultz wrote:
>> A call to OSSL_PROVIDER_available() says the "default" provider is 
>> available;  however, I'm wondering if I should be loading the default 
>> provider via *load_config() as well? I would have to uncomment the 
>> "activate = 1" in the default section of my config though.
> 
> This is entirely a matter of personal taste. It makes no difference
> functionally whether you load a provider via OSSL_PROVIDER_load()
> directly, or whether you do it via the config file. Obviously if you do
> it via a config file it gives you the ability to modify what providers
> get loaded later without having to recompile.
> 
> If you decided to do it via config then you probably want *2* different
> config files. One for the fips libctx and one for the non-fips libctx.
> 
> 
>> 
>> I also still have this in my code:
>> 
>>      /* Disallow falling back to the default library context */
>>      nullp = OSSL_PROVIDER_load(NULL, "null");
>> 
>> But not sure it's having any affect?
> 
> You could attempt to test it by attempting to fetch an algorithm. We
> would expect it to fail if it is working as expected. E.g.
> 
> EVP_MD *md = EVP_MD_fetch(NULL, "SHA2-256", NULL);
> if (md != NULL) {
>       /* Should not happen! The null provider should prevent this */
> }
> 
> 
>> 
>> I do know that later in my application, both in "FIPS" or "non-FIPS" 
>> mode, I can  create an SSL_CTX with SSL_CTX_new_ex(). I also 
>> successfully call several APIs using both the fips_libctx or the 
>> non_fips_libctx, for example:
>> 
>> status = SSL_CTX_use_PrivateKey_file(ctx,<file>,SSL_FILETYPE_PEM);
>> 
>> status = SSL_CTX_use_certificate_file(ctx,<file>,SSL_FILETYPE_PEM);
>> 
>> status = SSL_CTX_check_private_key(ctx);
>> 
>> 
>> All return successfully. So I think what I have between configuration 
>> files and API calls accomplishes what I need to. Would anyone reading 
>> this agree?
> 
> It sounds correct from what you have described.
> 
> Matt
> 
>> 
>> I'm running into another issue that I need to troubleshoot a bit more 
>> before I add too much information and too many questions to a single 
>> message.
>> 
>> Thanks to everyone for their help with this, things are starting to make 
>> more sense now.
>> 
>> 
>> 
>> ------------------------------------------------------------------------
>> *From:* Matt Caswell <matt at openssl.org>
>> *Sent:* Thursday, October 28, 2021 7:39 AM
>> *To:* Jason Schultz <jetson23 at hotmail.com>; Dr Paul Dale 
>> <pauli at openssl.org>; openssl-users at openssl.org <openssl-users at openssl.org>
>> *Subject:* Re: OpenSSL 3.0 FIPS questions
>> 
>> 
>> On 27/10/2021 17:28, Jason Schultz wrote:
>>> With these config files and the code above, the 
>>> OSSL_PROVIDER_load(fips_libctx, "fips") call fails. Here are the 
>>> messages from the ERR_print_errors_fp() call:
>>> 
>>> 2097C692B57F0000:error:1C8000D5:Provider routines:(unknown 
>>> function):missing config data:providers/fips/self_test.c:289:
>>> 2097C692B57F0000:error:1C8000E0:Provider routines:(unknown 
>>> function):fips module entering error state:providers/fips/self_test.c:387:
>>> 2097C692B57F0000:error:1C8000D8:Provider routines:(unknown 
>>> function):self test post failure:providers/fips/fipsprov.c:706:
>>> 2097C692B57F0000:error:078C0105:common libcrypto routines:(unknown 
>>> function):init fail:crypto/provider_core.c:903:name=fips
>> 
>> 
>> This tells us that the fips provider has successfully loaded, but then
>> subsequently failed during its self-test because it cannot find its
>> config data.
>> 
>> I can see that you have created a separate libctx for fips. However
>> automatic loading of the config file only works for the *default*
>> libctx. If you create your own one then you need to explicitly load the
>> config file:
>> 
>> if (!OSSL_LIB_CTX_load_config(fips_libtx, "/usr/local/ssl/openssl.cnf")) {
>>       /* error handling */
>> }
>> 
>> Actually if you do this then you should not need to call
>> OSSL_PROVIDER_load() explicitly to load the fips provider since you
>> already activated it in the config file. You can either drop the
>> explicit call to OSSL_PROVIDER_load() for the fips provider, or remove
>> the "activate = 1" line in "fips_sect" in fipsmodule.cnf. This is just a
>> minor optimisation though. Doing both is redundant but harmless. You
>> could also load the base provider via config if you wanted to.
>> 
>> Matt
>> 
>> 


More information about the openssl-users mailing list