Skip to content

Commit 3b0b74a

Browse files
committed
provider: add OpenSSL::Provider#add_conf_parameter
Expose OSSL_PROVIDER_add_conf_parameter() for OpenSSL 3.5. This allows setting parameters for an OpenSSL provider directly from Ruby code. Currently, configuring providers requires a configuration file and setting the OPENSSL_CONF environment variable before OpenSSL is initialized.
1 parent d3a4879 commit 3b0b74a

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

ext/openssl/ossl_provider.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,30 @@ ossl_provider_inspect(VALUE self)
184184
rb_obj_class(self), OSSL_PROVIDER_get0_name(prov));
185185
}
186186

187+
#if OSSL_OPENSSL_PREREQ(3, 5, 0)
188+
/*
189+
* call-seq:
190+
* provider.add_conf_parameter(name, value) -> nil
191+
*
192+
* Sets the provider configuration parameter _name_ to _value_. Both name and
193+
* value must be given as strings.
194+
*
195+
* See the documentation of the provider for possible parameters. See also the
196+
* man page OSSL_PROVIDER_add_conf_parameter(3).
197+
*/
198+
static VALUE
199+
ossl_provider_add_conf_parameter(VALUE self, VALUE name, VALUE value)
200+
{
201+
OSSL_PROVIDER *prov;
202+
203+
GetProvider(self, prov);
204+
if (OSSL_PROVIDER_add_conf_parameter(prov, StringValueCStr(name),
205+
StringValueCStr(value)) != 1)
206+
ossl_raise(eProviderError, "OSSL_PROVIDER_add_conf_parameter");
207+
return Qnil;
208+
}
209+
#endif
210+
187211
void
188212
Init_ossl_provider(void)
189213
{
@@ -202,6 +226,9 @@ Init_ossl_provider(void)
202226
rb_define_method(cProvider, "unload", ossl_provider_unload, 0);
203227
rb_define_method(cProvider, "name", ossl_provider_get_name, 0);
204228
rb_define_method(cProvider, "inspect", ossl_provider_inspect, 0);
229+
#if OSSL_OPENSSL_PREREQ(3, 5, 0)
230+
rb_define_method(cProvider, "add_conf_parameter", ossl_provider_add_conf_parameter, 2);
231+
#endif
205232
}
206233
#else
207234
void

test/openssl/test_provider.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,27 @@ def test_openssl_legacy_provider
7070
end;
7171
end
7272

73+
def test_add_conf_parameter
74+
with_openssl <<-'end;'
75+
prov = OpenSSL::Provider.load("null")
76+
assert_raise(TypeError) { prov.add_conf_parameter("foo", nil) }
77+
end;
78+
79+
# This assumes that ML-DSA is provided by the "default" provider, which
80+
# may not always be the case.
81+
# TODO: OpenSSL::PKey should allow specifying the provider to use
82+
return if OpenSSL.fips_mode
83+
with_openssl <<-'end;'
84+
pkey = OpenSSL::PKey.generate_key("ML-DSA-87")
85+
out_a = pkey.private_to_der
86+
prov = OpenSSL::Provider.load("default")
87+
prov.add_conf_parameter("ml-dsa.output_formats", "seed-only")
88+
out_b = pkey.private_to_der
89+
omit "ML-DSA not provided by the \"default\" provider?" if out_a == out_b
90+
assert_not_equal(out_a, out_b)
91+
end;
92+
end if openssl?(3, 5, 0)
93+
7394
private
7495

7596
# this is required because OpenSSL::Provider methods change global state

0 commit comments

Comments
 (0)