Skip to content

Commit dc5ef9c

Browse files
committed
Include supported param keys in error message
1 parent d91d660 commit dc5ef9c

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed

ext/openssl/ossl_pkey.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,6 @@ add_parameter_to_builder(VALUE key, VALUE value, VALUE arg) {
462462

463463
const char *key_ptr = StringValueCStr(key);
464464
const struct pkey_from_parameters_arg *params = (const struct pkey_from_parameters_arg *) arg;
465-
const OSSL_PARAM *settable_params = params->settable_params;
466465

467466
for(size_t i = 0; i < params->nAliases; i++) {
468467
if(strcmp(params->aliases[i].alias, key_ptr) == 0) {
@@ -471,7 +470,7 @@ add_parameter_to_builder(VALUE key, VALUE value, VALUE arg) {
471470
}
472471
}
473472

474-
for (; settable_params->key != NULL; settable_params++) {
473+
for (const OSSL_PARAM *settable_params = params->settable_params; settable_params->key != NULL; settable_params++) {
475474
if(strcmp(settable_params->key, key_ptr) == 0) {
476475
switch (settable_params->data_type) {
477476
case OSSL_PARAM_INTEGER:
@@ -506,9 +505,19 @@ add_parameter_to_builder(VALUE key, VALUE value, VALUE arg) {
506505
return ST_CONTINUE;
507506
}
508507
}
509-
510508
OSSL_PARAM_BLD_free(params->param_bld);
511-
ossl_raise(ePKeyError, "Unsupported parameter \"%s\"", key_ptr);
509+
510+
char message_buffer[512] = { 0 };
511+
char *cur = message_buffer;
512+
char *end = message_buffer + sizeof(message_buffer);
513+
for (const OSSL_PARAM *settable_params = params->settable_params; settable_params->key != NULL; settable_params++) {
514+
const char *fmt = cur == message_buffer ? "%s" : ", %s";
515+
if (cur > end)
516+
break;
517+
cur += snprintf(cur, end-cur, fmt, settable_params->key);
518+
}
519+
520+
ossl_raise(ePKeyError, "Invalid parameter \"%s\". Supported parameters: \"%s\"", key_ptr, message_buffer);
512521
}
513522

514523
static VALUE
@@ -517,12 +526,14 @@ pkey_from_parameters(int argc, VALUE *argv, VALUE self)
517526
VALUE alg, options;
518527
rb_scan_args(argc, argv, "11", &alg, &options);
519528

520-
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(NULL, StringValueCStr(alg), NULL);
529+
const char* algorithm = StringValueCStr(alg);
530+
531+
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(NULL, algorithm, NULL);
521532

522533
if (ctx == NULL)
523534
ossl_raise(ePKeyError, "EVP_PKEY_CTX_new_from_name");
524535

525-
struct pkey_from_parameters_arg from_params_args;
536+
struct pkey_from_parameters_arg from_params_args = { 0 };
526537

527538
from_params_args.param_bld = OSSL_PARAM_BLD_new();
528539

@@ -531,15 +542,12 @@ pkey_from_parameters(int argc, VALUE *argv, VALUE self)
531542

532543
from_params_args.settable_params = EVP_PKEY_fromdata_settable(ctx, EVP_PKEY_KEYPAIR);
533544

534-
if (strcmp("RSA", StringValueCStr(alg)) == 0) {
545+
if (strcmp("RSA", algorithm) == 0) {
535546
from_params_args.aliases = rsa_aliases;
536547
from_params_args.nAliases = sizeof(rsa_aliases)/sizeof((rsa_aliases)[0]);
537-
} else if (strcmp("DSA", StringValueCStr(alg)) == 0 ||
538-
strcmp("DH", StringValueCStr(alg)) == 0) {
548+
} else {
539549
from_params_args.aliases = fcc_aliases;
540550
from_params_args.nAliases = sizeof(fcc_aliases)/sizeof((fcc_aliases)[0]);
541-
} else {
542-
from_params_args.nAliases = 0;
543551
}
544552

545553
rb_hash_foreach(options, &add_parameter_to_builder, (VALUE) &from_params_args);
@@ -559,7 +567,7 @@ pkey_from_parameters(int argc, VALUE *argv, VALUE self)
559567
ossl_raise(ePKeyError, "EVP_PKEY_fromdata_init");
560568
}
561569

562-
if(EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0) {
570+
if (EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0) {
563571
EVP_PKEY_CTX_free(ctx);
564572
EVP_PKEY_free(pkey);
565573
ossl_raise(ePKeyError, "EVP_PKEY_fromdata");

test/openssl/test_pkey.rb

Lines changed: 15 additions & 4 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 parameter "invalid"', e.message
271+
assert_match(/Invalid 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 parameter "invalid"', e.message
324+
assert_match(/Invalid parameter "invalid"/, e.message)
325325
end
326326

327327
def test_s_from_parameters_dsa_with_all_supported_parameters
@@ -347,7 +347,7 @@ def test_s_from_parameters_dsa_with_gem_specific_keys
347347

348348
def test_s_from_parameters_dsa_with_invalid_parameter
349349
e = assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.from_parameters("DSA", invalid: 1234) }
350-
assert_equal 'Unsupported parameter "invalid"', e.message
350+
assert_match(/Invalid parameter "invalid"/, e.message)
351351
end
352352

353353
def test_s_from_parameters_dh_with_all_supported_parameters
@@ -361,7 +361,18 @@ def test_s_from_parameters_dh_with_all_supported_parameters
361361

362362
def test_s_from_parameters_dh_with_invalid_parameter
363363
e = assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.from_parameters("DH", invalid: 1234) }
364-
assert_equal 'Unsupported parameter "invalid"', e.message
364+
assert_match(/Invalid parameter "invalid"/, e.message)
365+
end
366+
367+
def test_s_from_parameters_ed25519
368+
key = OpenSSL::PKey.from_parameters("ED25519", pub: "\xD0\x8E\xA8\x96\xB6Fbi{$k\xAC\xB8\xA2V\xF4n\xC3\xD06}R\x8A\xE6I\xA7r\xF6D{W\x84")
369+
assert_instance_of OpenSSL::PKey::PKey, key
370+
assert_equal "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA0I6olrZGYml7JGusuKJW9G7D0DZ9UormSady9kR7V4Q=\n-----END PUBLIC KEY-----\n", key.public_to_pem
371+
end
372+
373+
def test_s_from_parameters_ed25519_with_invalid_parameters
374+
e = assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.from_parameters("ED25519", invalid: 12345) }
375+
assert_equal 'Invalid parameter "invalid". Supported parameters: "pub, priv"', e.message
365376
end
366377
else
367378
def test_from_parameter_raises_on_pre_3_openssl

0 commit comments

Comments
 (0)