aboutsummaryrefslogtreecommitdiff
path: root/test/provider_pkey_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/provider_pkey_test.c')
-rw-r--r--test/provider_pkey_test.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/test/provider_pkey_test.c b/test/provider_pkey_test.c
index cb656a62a650..9ffe3581d62a 100644
--- a/test/provider_pkey_test.c
+++ b/test/provider_pkey_test.c
@@ -239,6 +239,77 @@ end:
return ret;
}
+static int test_pkey_can_sign(void)
+{
+ OSSL_PROVIDER *fake_rsa = NULL;
+ EVP_PKEY *pkey_fake = NULL;
+ EVP_PKEY_CTX *ctx = NULL;
+ OSSL_PARAM *params = NULL;
+ int ret = 0;
+
+ if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
+ return 0;
+
+ /*
+ * Ensure other tests did not forget to reset fake_rsa_query_operation_name
+ * to its default value: 0
+ */
+ if (!TEST_int_eq(fake_rsa_query_operation_name, 0))
+ goto end;
+
+ if (!TEST_ptr(params = fake_rsa_key_params(0))
+ || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
+ "provider=fake-rsa"))
+ || !TEST_true(EVP_PKEY_fromdata_init(ctx))
+ || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_fake, EVP_PKEY_PUBLIC_KEY,
+ params))
+ || !TEST_true(EVP_PKEY_can_sign(pkey_fake))
+ || !TEST_ptr(pkey_fake))
+ goto end;
+
+ EVP_PKEY_CTX_free(ctx);
+ ctx = NULL;
+ EVP_PKEY_free(pkey_fake);
+ pkey_fake = NULL;
+ OSSL_PARAM_free(params);
+ params = NULL;
+
+ /*
+ * Documented behavior for OSSL_FUNC_keymgmt_query_operation_name()
+ * allows it to return NULL, in which case the fallback should be to use
+ * EVP_KEYMGMT_get0_name(). That is exactly the thing we are testing here.
+ */
+ fake_rsa_query_operation_name = 1;
+
+ if (!TEST_ptr(params = fake_rsa_key_params(0))
+ || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
+ "provider=fake-rsa"))
+ || !TEST_true(EVP_PKEY_fromdata_init(ctx))
+ || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_fake, EVP_PKEY_PUBLIC_KEY,
+ params))
+ || !TEST_true(EVP_PKEY_can_sign(pkey_fake))
+ || !TEST_ptr(pkey_fake))
+ goto end;
+
+ EVP_PKEY_CTX_free(ctx);
+ ctx = NULL;
+ EVP_PKEY_free(pkey_fake);
+ pkey_fake = NULL;
+ OSSL_PARAM_free(params);
+ params = NULL;
+
+ ret = 1;
+end:
+
+ EVP_PKEY_CTX_free(ctx);
+ EVP_PKEY_free(pkey_fake);
+ OSSL_PARAM_free(params);
+ fake_rsa_query_operation_name = 0;
+
+ fake_rsa_finish(fake_rsa);
+ return ret;
+}
+
static int test_pkey_store(int idx)
{
OSSL_PROVIDER *deflt = NULL;
@@ -719,6 +790,7 @@ int setup_tests(void)
ADD_TEST(test_pkey_sig);
ADD_TEST(test_alternative_keygen_init);
ADD_TEST(test_pkey_eq);
+ ADD_TEST(test_pkey_can_sign);
ADD_ALL_TESTS(test_pkey_store, 2);
ADD_TEST(test_pkey_delete);
ADD_TEST(test_pkey_store_open_ex);