Skip to content

Commit 7f95cd8

Browse files
committed
Support generating DH pkeys from parameters
1 parent 9683dfa commit 7f95cd8

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

ext/openssl/ossl_pkey.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,12 +454,12 @@ add_ec_parameters_to_builder(VALUE key, VALUE value, VALUE arg) {
454454
}
455455

456456
if(strcmp(OSSL_PKEY_PARAM_PRIV_KEY, key_ptr) == 0) {
457-
if(!OSSL_PARAM_BLD_push_BN(params_builder, OSSL_PKEY_PARAM_PRIV_KEY, GetBNPtr(value))) // unsigned integer, but presented as BN will work just fine
457+
if(!OSSL_PARAM_BLD_push_BN(params_builder, OSSL_PKEY_PARAM_PRIV_KEY, GetBNPtr(value)))
458458
ossl_raise(ePKeyError, "OSSL_PARAM_BLD_push_BN");
459459
return ST_CONTINUE;
460460
}
461461

462-
ossl_raise(ePKeyError, "Unsupported EC parameter \"%s\"", key_ptr);
462+
ossl_raise(ePKeyError, "Unsupported parameter \"%s\"", key_ptr);
463463
}
464464

465465
static int
@@ -529,11 +529,11 @@ add_rsa_parameters_to_builder(VALUE key, VALUE value, VALUE arg) {
529529
return ST_CONTINUE;
530530
}
531531

532-
ossl_raise(ePKeyError, "Unsupported RSA parameter \"%s\"", key_ptr);
532+
ossl_raise(ePKeyError, "Unsupported parameter \"%s\"", key_ptr);
533533
}
534534

535535
static int
536-
add_dsa_parameters_to_builder(VALUE key, VALUE value, VALUE arg) {
536+
add_ffc_parameters_to_builder(VALUE key, VALUE value, VALUE arg) {
537537
OSSL_PARAM_BLD *params_builder = (OSSL_PARAM_BLD *) arg;
538538

539539
if(NIL_P(value))
@@ -583,7 +583,7 @@ add_dsa_parameters_to_builder(VALUE key, VALUE value, VALUE arg) {
583583
return ST_CONTINUE;
584584
}
585585

586-
ossl_raise(ePKeyError, "Unsupported DSA parameter \"%s\"", key_ptr);
586+
ossl_raise(ePKeyError, "Unsupported parameter \"%s\"", key_ptr);
587587
}
588588

589589
static VALUE
@@ -604,7 +604,9 @@ pkey_from_parameters(int argc, VALUE *argv, VALUE self)
604604
else if (strcmp("EC", StringValueCStr(alg)) == 0)
605605
param_adder = &add_ec_parameters_to_builder;
606606
else if (strcmp("DSA", StringValueCStr(alg)) == 0)
607-
param_adder = &add_dsa_parameters_to_builder;
607+
param_adder = &add_ffc_parameters_to_builder;
608+
else if (strcmp("DH", StringValueCStr(alg)) == 0)
609+
param_adder = &add_ffc_parameters_to_builder;
608610
else
609611
ossl_raise(ePKeyError, "\"%s\" is not a supported algorithm", StringValueCStr(alg));
610612

test/openssl/test_pkey.rb

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ def test_s_from_parameters_rsa_with_simple_names
268268

269269
def test_s_from_parameters_rsa_with_invalid_parameter
270270
e = assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.from_parameters("RSA", invalid: 1234) }
271-
assert_equal 'Unsupported RSA parameter "invalid"', e.message
271+
assert_equal 'Unsupported parameter "invalid"', e.message
272272
end
273273

274274
def test_s_from_parameters_ec_pub_given_as_string
@@ -321,7 +321,7 @@ def test_s_from_parameters_ec_pub_given_as_integer
321321

322322
def test_s_from_parameters_ec_with_invalid_parameter
323323
e = assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.from_parameters("EC", invalid: 1234) }
324-
assert_equal 'Unsupported EC parameter "invalid"', e.message
324+
assert_equal 'Unsupported parameter "invalid"', e.message
325325
end
326326

327327
def test_s_from_parameters_dsa_with_all_supported_parameters
@@ -333,6 +333,7 @@ def test_s_from_parameters_dsa_with_all_supported_parameters
333333
q: source.params["q"],
334334
g: source.params["g"])
335335

336+
assert_instance_of OpenSSL::PKey::DSA, new_key
336337
assert_equal source.params, new_key.params
337338
end
338339

@@ -346,7 +347,21 @@ def test_s_from_parameters_dsa_with_gem_specific_keys
346347

347348
def test_s_from_parameters_dsa_with_invalid_parameter
348349
e = assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.from_parameters("DSA", invalid: 1234) }
349-
assert_equal 'Unsupported DSA parameter "invalid"', e.message
350+
assert_equal 'Unsupported parameter "invalid"', e.message
351+
end
352+
353+
def test_s_from_parameters_dh_with_all_supported_parameters
354+
source = OpenSSL::PKey::DH.generate(512)
355+
356+
new_key = OpenSSL::PKey.from_parameters("DH", source.params)
357+
358+
assert_instance_of OpenSSL::PKey::DH, new_key
359+
assert_equal source.params, new_key.params
360+
end
361+
362+
def test_s_from_parameters_dh_with_invalid_parameter
363+
e = assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.from_parameters("DH", invalid: 1234) }
364+
assert_equal 'Unsupported parameter "invalid"', e.message
350365
end
351366
else
352367
def test_from_parameter_raises_on_pre_3_openssl

0 commit comments

Comments
 (0)