11# frozen_string_literal: true
22require_relative 'utils'
3- if defined? ( OpenSSL ) && defined? ( OpenSSL ::Provider ) && ! OpenSSL . fips_mode
3+ if defined? ( OpenSSL ) && defined? ( OpenSSL ::Provider )
44
55class OpenSSL ::TestProvider < OpenSSL ::TestCase
66 def test_openssl_provider_name_inspect
@@ -12,14 +12,41 @@ def test_openssl_provider_name_inspect
1212 end
1313
1414 def test_openssl_provider_names
15+ # We expect the following providers are loaded in the cases:
16+ # * Non-FIPS: default
17+ # * FIPS: fips, base
18+ # Use the null provider to test the added provider.
19+ # See provider(7) - OPENSSL PROVIDERS to see the list of providers, and
20+ # OSSL_PROVIDER-null(7) to check the details of the null provider.
1521 with_openssl <<-'end;'
16- base_provider = OpenSSL::Provider.load("base")
17- assert_equal(2, OpenSSL::Provider.provider_names.size)
18- assert_includes(OpenSSL::Provider.provider_names, "base")
22+ num = OpenSSL::Provider.provider_names.size
1923
20- assert_equal(true, base_provider.unload)
21- assert_equal(1, OpenSSL::Provider.provider_names.size)
22- assert_not_includes(OpenSSL::Provider.provider_names, "base")
24+ added_provider = OpenSSL::Provider.load("null")
25+ assert_equal(num + 1, OpenSSL::Provider.provider_names.size)
26+ assert_includes(OpenSSL::Provider.provider_names, "null")
27+
28+ assert_equal(true, added_provider.unload)
29+ assert_equal(num, OpenSSL::Provider.provider_names.size)
30+ assert_not_includes(OpenSSL::Provider.provider_names, "null")
31+ end;
32+ end
33+
34+ # Test providers to run OpenSSL FIPS perperly in OpenSSL 3.x.
35+ # The `OpenSSL.fips_mode` calling the EVP_default_properties_is_fips_enabled
36+ # only indicates if fips=yes is a default property. It doesn't check the
37+ # providers.
38+ # See EVP_default_properties_is_fips_enabled(3) for details.
39+ def test_openssl_provider_names_on_fips
40+ omit "Only for FIPS" unless OpenSSL . fips_mode
41+
42+ # The number of providers is at least 2 in FIPS: the fips provider for the
43+ # key management, and another provider base or default for the
44+ # encoding/decoding.
45+ # See fips_module(7) - "Making all applications use the FIPS module by
46+ # default" for details.
47+ with_openssl ( <<-'end;' )
48+ assert_compare(2, "<=", OpenSSL::Provider.provider_names.size)
49+ assert_include(OpenSSL::Provider.provider_names, "fips")
2350 end;
2451 end
2552
@@ -33,6 +60,9 @@ def test_unloaded_openssl_provider
3360 end
3461
3562 def test_openssl_legacy_provider
63+ # The legacy provider is not supported on FIPS.
64+ omit_on_fips
65+
3666 with_openssl ( <<-'end;' )
3767 begin
3868 OpenSSL::Provider.load("legacy")
0 commit comments