}
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
-static int test_fromdata(char *keytype, int selection, OSSL_PARAM *params)
+static EVP_PKEY *make_key_fromdata(char *keytype, OSSL_PARAM *params)
{
EVP_PKEY_CTX *pctx = NULL;
- EVP_PKEY *pkey = NULL;
- int testresult = 0;
- int ret;
- BIO *bio = BIO_new(BIO_s_mem());
+ EVP_PKEY *tmp_pkey = NULL, *pkey = NULL;
if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, keytype, testpropq)))
goto err;
if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
- || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
+ || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &tmp_pkey, EVP_PKEY_KEYPAIR,
params), 0))
goto err;
- if (!TEST_ptr(pkey))
+ if (!TEST_ptr(tmp_pkey))
goto err;
- /* Check we can use the resulting key */
+ pkey = tmp_pkey;
+ tmp_pkey = NULL;
+ err:
+ EVP_PKEY_free(tmp_pkey);
+ EVP_PKEY_CTX_free(pctx);
+ return pkey;
+}
+
+static int test_selection(EVP_PKEY *pkey, int selection)
+{
+ int testresult = 0;
+ int ret;
+ BIO *bio = BIO_new(BIO_s_mem());
+
ret = PEM_write_bio_PUBKEY(bio, pkey);
if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
if (!TEST_true(ret))
testresult = 1;
err:
- EVP_PKEY_free(pkey);
- EVP_PKEY_CTX_free(pctx);
BIO_free(bio);
return testresult;
{
OSSL_PARAM_BLD *bld = NULL;
OSSL_PARAM *params = NULL;
+ EVP_PKEY *just_params = NULL;
+ EVP_PKEY *params_and_priv = NULL;
+ EVP_PKEY *params_and_pub = NULL;
+ EVP_PKEY *params_and_keypair = NULL;
BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
int ret = 0;
|| !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
|| !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g)))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(just_params = make_key_fromdata(keytype, params)))
goto err;
- if (!test_fromdata(keytype, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS, params))
- goto err;
OSSL_PARAM_free(params);
- params = NULL;
OSSL_PARAM_BLD_free(bld);
+ params = NULL;
+ bld = NULL;
+
+ if (!test_selection(just_params, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
+ || test_selection(just_params, OSSL_KEYMGMT_SELECT_KEYPAIR))
+ goto err;
/* Test priv and !pub */
if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
|| !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
priv)))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(params_and_priv = make_key_fromdata(keytype, params)))
goto err;
- if (!test_fromdata(keytype, OSSL_KEYMGMT_SELECT_PRIVATE_KEY, params))
- goto err;
OSSL_PARAM_free(params);
- params = NULL;
OSSL_PARAM_BLD_free(bld);
+ params = NULL;
+ bld = NULL;
+
+ if (!test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PRIVATE_KEY)
+ || test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PUBLIC_KEY))
+ goto err;
/* Test !priv and pub */
if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
|| !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
pub)))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(params_and_pub = make_key_fromdata(keytype, params)))
goto err;
- if (!test_fromdata(keytype, OSSL_KEYMGMT_SELECT_PUBLIC_KEY, params))
- goto err;
OSSL_PARAM_free(params);
- params = NULL;
OSSL_PARAM_BLD_free(bld);
+ params = NULL;
+ bld = NULL;
+
+ if (!test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
+ || test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PRIVATE_KEY))
+ goto err;
/* Test priv and pub */
if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
|| !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
priv)))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(params_and_keypair = make_key_fromdata(keytype, params)))
goto err;
- if (!test_fromdata(keytype, EVP_PKEY_KEYPAIR, params))
+ if (!test_selection(params_and_keypair, EVP_PKEY_KEYPAIR))
goto err;
ret = 1;
err:
OSSL_PARAM_free(params);
OSSL_PARAM_BLD_free(bld);
+ EVP_PKEY_free(just_params);
+ EVP_PKEY_free(params_and_priv);
+ EVP_PKEY_free(params_and_pub);
+ EVP_PKEY_free(params_and_keypair);
BN_free(p);
BN_free(q);
BN_free(g);
{
OSSL_PARAM_BLD *bld = NULL;
OSSL_PARAM *params = NULL;
+ EVP_PKEY *just_params = NULL;
+ EVP_PKEY *params_and_priv = NULL;
+ EVP_PKEY *params_and_pub = NULL;
+ EVP_PKEY *params_and_keypair = NULL;
BIGNUM *priv = NULL;
int ret = 0;
OSSL_PKEY_PARAM_GROUP_NAME,
"P-256", 0)))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(just_params = make_key_fromdata("EC", params)))
goto err;
- if (!test_fromdata("EC", OSSL_KEYMGMT_SELECT_ALL_PARAMETERS, params))
- goto err;
OSSL_PARAM_free(params);
- params = NULL;
OSSL_PARAM_BLD_free(bld);
+ params = NULL;
+ bld = NULL;
+
+ if (!test_selection(just_params, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
+ || test_selection(just_params, OSSL_KEYMGMT_SELECT_KEYPAIR))
+ goto err;
/* Test priv and !pub */
if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
|| !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
priv)))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(params_and_priv = make_key_fromdata("EC", params)))
goto err;
+ OSSL_PARAM_free(params);
+ OSSL_PARAM_BLD_free(bld);
+ params = NULL;
+ bld = NULL;
+
/*
- * We indicate only parameters here. The "EVP_PKEY_fromdata" call will do
- * the private key anyway, but the subsequent PEM_write_bio_PrivateKey_ex
- * call is expected to fail because PEM_write_bio_PrivateKey_ex does not
- * support exporting a private EC key without a corresponding public key
+ * We indicate only parameters here, in spite of having built a key that
+ * has a private part, because the PEM_write_bio_PrivateKey_ex call is
+ * expected to fail because it does not support exporting a private EC
+ * key without a corresponding public key
*/
- if (!test_fromdata("EC", OSSL_KEYMGMT_SELECT_ALL_PARAMETERS, params))
+ if (!test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
+ || test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PUBLIC_KEY))
goto err;
- OSSL_PARAM_free(params);
- params = NULL;
- OSSL_PARAM_BLD_free(bld);
/* Test !priv and pub */
if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
OSSL_PKEY_PARAM_PUB_KEY,
ec_pub, sizeof(ec_pub))))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(params_and_pub = make_key_fromdata("EC", params)))
goto err;
- if (!test_fromdata("EC", OSSL_KEYMGMT_SELECT_PUBLIC_KEY, params))
- goto err;
OSSL_PARAM_free(params);
- params = NULL;
OSSL_PARAM_BLD_free(bld);
+ params = NULL;
+ bld = NULL;
+
+ if (!test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
+ || test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PRIVATE_KEY))
+ goto err;
/* Test priv and pub */
if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
|| !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
priv)))
goto err;
- if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
+ if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(params_and_keypair = make_key_fromdata("EC", params)))
goto err;
- if (!test_fromdata("EC", EVP_PKEY_KEYPAIR, params))
+ if (!test_selection(params_and_keypair, EVP_PKEY_KEYPAIR))
goto err;
ret = 1;
err:
OSSL_PARAM_free(params);
OSSL_PARAM_BLD_free(bld);
+ EVP_PKEY_free(just_params);
+ EVP_PKEY_free(params_and_priv);
+ EVP_PKEY_free(params_and_pub);
+ EVP_PKEY_free(params_and_keypair);
BN_free(priv);
return ret;