summaryrefslogtreecommitdiff
path: root/test/evp_pkey_provided_test.c
diff options
context:
space:
mode:
authorTomas Mraz <tomas@openssl.org>2021-03-19 18:45:43 +0100
committerPauli <pauli@openssl.org>2021-03-28 16:38:57 +1000
commit2145ba5e8383184d7f212500ec2f759bdf08503a (patch)
treea862106cc508e75f170b3105e3b5919fb38219d3 /test/evp_pkey_provided_test.c
parentc464583483df70ad8df9907168bf015d672742bd (diff)
downloadopenssl-new-2145ba5e8383184d7f212500ec2f759bdf08503a.tar.gz
Implement EVP_PKEY_dup() function
Fixes #14501 Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/14624)
Diffstat (limited to 'test/evp_pkey_provided_test.c')
-rw-r--r--test/evp_pkey_provided_test.c627
1 files changed, 395 insertions, 232 deletions
diff --git a/test/evp_pkey_provided_test.c b/test/evp_pkey_provided_test.c
index c89bb36628..6aa566cac4 100644
--- a/test/evp_pkey_provided_test.c
+++ b/test/evp_pkey_provided_test.c
@@ -305,7 +305,7 @@ static int test_fromdata_rsa(void)
{
int ret = 0, i;
EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
- EVP_PKEY *pk = NULL, *copy_pk = NULL;
+ EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
/*
* 32-bit RSA key, extracted from this command,
* executed with OpenSSL 1.0.2:
@@ -341,29 +341,45 @@ static int test_fromdata_rsa(void)
if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
|| !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
- fromdata_params))
- || !TEST_int_eq(EVP_PKEY_bits(pk), 32)
- || !TEST_int_eq(EVP_PKEY_security_bits(pk), 8)
- || !TEST_int_eq(EVP_PKEY_size(pk), 4)
- || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ fromdata_params)))
goto err;
- if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
- goto err;
+ while (dup_pk == NULL) {
+ ret = 0;
+ if (!TEST_int_eq(EVP_PKEY_bits(pk), 32)
+ || !TEST_int_eq(EVP_PKEY_security_bits(pk), 8)
+ || !TEST_int_eq(EVP_PKEY_size(pk), 4)
+ || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ goto err;
- if (!TEST_true(EVP_PKEY_check(key_ctx))
- || !TEST_true(EVP_PKEY_public_check(key_ctx))
- || !TEST_true(EVP_PKEY_private_check(key_ctx))
- || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
- goto err;
+ EVP_PKEY_CTX_free(key_ctx);
+ if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
+ goto err;
- /* EVP_PKEY_copy_parameters() should fail for RSA */
- if (!TEST_ptr(copy_pk = EVP_PKEY_new())
- || !TEST_false(EVP_PKEY_copy_parameters(copy_pk, pk)))
- goto err;
+ if (!TEST_true(EVP_PKEY_check(key_ctx))
+ || !TEST_true(EVP_PKEY_public_check(key_ctx))
+ || !TEST_true(EVP_PKEY_private_check(key_ctx))
+ || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
+ goto err;
+
+ /* EVP_PKEY_copy_parameters() should fail for RSA */
+ if (!TEST_ptr(copy_pk = EVP_PKEY_new())
+ || !TEST_false(EVP_PKEY_copy_parameters(copy_pk, pk)))
+ goto err;
+ EVP_PKEY_free(copy_pk);
+ copy_pk = NULL;
- ret = test_print_key_using_pem("RSA", pk)
- && test_print_key_using_encoder("RSA", pk);
+ ret = test_print_key_using_pem("RSA", pk)
+ && test_print_key_using_encoder("RSA", pk);
+
+ if (!ret || !TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
+ goto err;
+ ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
+ EVP_PKEY_free(pk);
+ pk = dup_pk;
+ if (!ret)
+ goto err;
+ }
err:
/* for better diagnostics always compare key params */
for (i = 0; fromdata_params[i].key != NULL; ++i) {
@@ -442,7 +458,7 @@ static int test_fromdata_dh_named_group(void)
int ret = 0;
int gindex = 0, pcounter = 0, hindex = 0;
EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
- EVP_PKEY *pk = NULL, *copy_pk = NULL;
+ EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
size_t len;
BIGNUM *pub = NULL, *priv = NULL;
BIGNUM *pub_out = NULL, *priv_out = NULL;
@@ -507,62 +523,97 @@ static int test_fromdata_dh_named_group(void)
if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
|| !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
- fromdata_params))
- || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
- || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
- || !TEST_int_eq(EVP_PKEY_size(pk), 256)
- || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ fromdata_params)))
goto err;
- if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
- name_out, sizeof(name_out),
- &len))
- || !TEST_str_eq(name_out, group_name)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
- &pub_out))
-
- || !TEST_BN_eq(pub, pub_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
- &priv_out))
- || !TEST_BN_eq(priv, priv_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
- || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
- || !TEST_ptr(q)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
- || !TEST_BN_eq(&ossl_bignum_const_2, g)
- || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
- &j))
- || !TEST_ptr_null(j)
- || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
- OSSL_PKEY_PARAM_FFC_SEED,
- seed_out,
- sizeof(seed_out), &len))
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
- &gindex))
- || !TEST_int_eq(gindex, -1)
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
- || !TEST_int_eq(hindex, 0)
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
- &pcounter))
- || !TEST_int_eq(pcounter, -1))
- goto err;
+ while (dup_pk == NULL) {
+ ret = 0;
+ if (!TEST_int_eq(EVP_PKEY_bits(pk), 2048)
+ || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
+ || !TEST_int_eq(EVP_PKEY_size(pk), 256)
+ || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ goto err;
- if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
- goto err;
+ if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk,
+ OSSL_PKEY_PARAM_GROUP_NAME,
+ name_out,
+ sizeof(name_out),
+ &len))
+ || !TEST_str_eq(name_out, group_name)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
+ &pub_out))
+
+ || !TEST_BN_eq(pub, pub_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
+ &priv_out))
+ || !TEST_BN_eq(priv, priv_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
+ || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
+ || !TEST_ptr(q)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
+ || !TEST_BN_eq(&ossl_bignum_const_2, g)
+ || !TEST_false(EVP_PKEY_get_bn_param(pk,
+ OSSL_PKEY_PARAM_FFC_COFACTOR,
+ &j))
+ || !TEST_ptr_null(j)
+ || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
+ OSSL_PKEY_PARAM_FFC_SEED,
+ seed_out,
+ sizeof(seed_out),
+ &len))
+ || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
+ &gindex))
+ || !TEST_int_eq(gindex, -1)
+ || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
+ &hindex))
+ || !TEST_int_eq(hindex, 0)
+ || !TEST_true(EVP_PKEY_get_int_param(pk,
+ OSSL_PKEY_PARAM_FFC_PCOUNTER,
+ &pcounter))
+ || !TEST_int_eq(pcounter, -1))
+ goto err;
+ BN_free(p);
+ p = NULL;
+ BN_free(q);
+ q = NULL;
+ BN_free(g);
+ g = NULL;
+ BN_free(j);
+ j = NULL;
+ BN_free(pub_out);
+ pub_out = NULL;
+ BN_free(priv_out);
+ priv_out = NULL;
+
+ if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
+ goto err;
- if (!TEST_true(EVP_PKEY_check(key_ctx))
- || !TEST_true(EVP_PKEY_public_check(key_ctx))
- || !TEST_true(EVP_PKEY_private_check(key_ctx))
- || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
- goto err;
+ if (!TEST_true(EVP_PKEY_check(key_ctx))
+ || !TEST_true(EVP_PKEY_public_check(key_ctx))
+ || !TEST_true(EVP_PKEY_private_check(key_ctx))
+ || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
+ goto err;
+ EVP_PKEY_CTX_free(key_ctx);
+ key_ctx = NULL;
- if (!TEST_ptr(copy_pk = EVP_PKEY_new())
- || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
- goto err;
+ if (!TEST_ptr(copy_pk = EVP_PKEY_new())
+ || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
+ goto err;
+ EVP_PKEY_free(copy_pk);
+ copy_pk = NULL;
- ret = test_print_key_using_pem("DH", pk)
- && test_print_key_using_encoder("DH", pk);
+ ret = test_print_key_using_pem("DH", pk)
+ && test_print_key_using_encoder("DH", pk);
+
+ if (!ret || !TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
+ goto err;
+ ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
+ EVP_PKEY_free(pk);
+ pk = dup_pk;
+ if (!ret)
+ goto err;
+ }
err:
BN_free(p);
BN_free(q);
@@ -587,7 +638,7 @@ static int test_fromdata_dh_fips186_4(void)
int ret = 0;
int gindex = 0, pcounter = 0, hindex = 0;
EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
- EVP_PKEY *pk = NULL;
+ EVP_PKEY *pk = NULL, *dup_pk = NULL;
size_t len;
BIGNUM *pub = NULL, *priv = NULL;
BIGNUM *pub_out = NULL, *priv_out = NULL;
@@ -653,57 +704,91 @@ static int test_fromdata_dh_fips186_4(void)
if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
|| !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
- fromdata_params))
- || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
- || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
- || !TEST_int_eq(EVP_PKEY_size(pk), 256)
- || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ fromdata_params)))
goto err;
- if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
- name_out, sizeof(name_out),
- &len))
- || !TEST_str_eq(name_out, group_name)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
- &pub_out))
- || !TEST_BN_eq(pub, pub_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
- &priv_out))
- || !TEST_BN_eq(priv, priv_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
- || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
- || !TEST_ptr(q)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
- || !TEST_BN_eq(&ossl_bignum_const_2, g)
- || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
- &j))
- || !TEST_ptr_null(j)
- || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
- OSSL_PKEY_PARAM_FFC_SEED,
- seed_out,
- sizeof(seed_out), &len))
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
- &gindex))
- || !TEST_int_eq(gindex, -1)
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
- || !TEST_int_eq(hindex, 0)
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
- &pcounter))
- || !TEST_int_eq(pcounter, -1))
- goto err;
+ while (dup_pk == NULL) {
+ ret = 0;
+ if (!TEST_int_eq(EVP_PKEY_bits(pk), 2048)
+ || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
+ || !TEST_int_eq(EVP_PKEY_size(pk), 256)
+ || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ goto err;
- if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
- goto err;
+ if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk,
+ OSSL_PKEY_PARAM_GROUP_NAME,
+ name_out,
+ sizeof(name_out),
+ &len))
+ || !TEST_str_eq(name_out, group_name)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
+ &pub_out))
+ || !TEST_BN_eq(pub, pub_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
+ &priv_out))
+ || !TEST_BN_eq(priv, priv_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
+ || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
+ || !TEST_ptr(q)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
+ || !TEST_BN_eq(&ossl_bignum_const_2, g)
+ || !TEST_false(EVP_PKEY_get_bn_param(pk,
+ OSSL_PKEY_PARAM_FFC_COFACTOR,
+ &j))
+ || !TEST_ptr_null(j)
+ || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
+ OSSL_PKEY_PARAM_FFC_SEED,
+ seed_out,
+ sizeof(seed_out),
+ &len))
+ || !TEST_true(EVP_PKEY_get_int_param(pk,
+ OSSL_PKEY_PARAM_FFC_GINDEX,
+ &gindex))
+ || !TEST_int_eq(gindex, -1)
+ || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
+ &hindex))
+ || !TEST_int_eq(hindex, 0)
+ || !TEST_true(EVP_PKEY_get_int_param(pk,
+ OSSL_PKEY_PARAM_FFC_PCOUNTER,
+ &pcounter))
+ || !TEST_int_eq(pcounter, -1))
+ goto err;
+ BN_free(p);
+ p = NULL;
+ BN_free(q);
+ q = NULL;
+ BN_free(g);
+ g = NULL;
+ BN_free(j);
+ j = NULL;
+ BN_free(pub_out);
+ pub_out = NULL;
+ BN_free(priv_out);
+ priv_out = NULL;
+
+ if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
+ goto err;
- if (!TEST_true(EVP_PKEY_check(key_ctx))
- || !TEST_true(EVP_PKEY_public_check(key_ctx))
- || !TEST_true(EVP_PKEY_private_check(key_ctx))
- || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
- goto err;
+ if (!TEST_true(EVP_PKEY_check(key_ctx))
+ || !TEST_true(EVP_PKEY_public_check(key_ctx))
+ || !TEST_true(EVP_PKEY_private_check(key_ctx))
+ || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
+ goto err;
+ EVP_PKEY_CTX_free(key_ctx);
+ key_ctx = NULL;
+
+ ret = test_print_key_using_pem("DH", pk)
+ && test_print_key_using_encoder("DH", pk);
- ret = test_print_key_using_pem("DH", pk)
- && test_print_key_using_encoder("DH", pk);
+ if (!ret || !TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
+ goto err;
+ ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
+ EVP_PKEY_free(pk);
+ pk = dup_pk;
+ if (!ret)
+ goto err;
+ }
err:
BN_free(p);
BN_free(q);
@@ -747,7 +832,7 @@ static int test_fromdata_ecx(int tst)
{
int ret = 0;
EVP_PKEY_CTX *ctx = NULL, *ctx2 = NULL;
- EVP_PKEY *pk = NULL, *copy_pk = NULL;
+ EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
const char *alg = NULL;
size_t len;
unsigned char out_pub[ED448_KEYLEN];
@@ -926,49 +1011,66 @@ static int test_fromdata_ecx(int tst)
if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
|| !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
- fromdata_params))
- || !TEST_int_eq(EVP_PKEY_bits(pk), bits)
- || !TEST_int_eq(EVP_PKEY_security_bits(pk), security_bits)
- || !TEST_int_eq(EVP_PKEY_size(pk), size)
- || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ fromdata_params)))
goto err;
- if (!TEST_ptr(ctx2 = EVP_PKEY_CTX_new_from_pkey(NULL, pk, NULL)))
- goto err;
- if (tst <= 7) {
- if (!TEST_true(EVP_PKEY_check(ctx2)))
+ while (dup_pk == NULL) {
+ ret = 0;
+ if (!TEST_int_eq(EVP_PKEY_bits(pk), bits)
+ || !TEST_int_eq(EVP_PKEY_security_bits(pk), security_bits)
+ || !TEST_int_eq(EVP_PKEY_size(pk), size)
+ || !TEST_false(EVP_PKEY_missing_parameters(pk)))
goto err;
- if (!TEST_true(EVP_PKEY_get_octet_string_param(
- pk, orig_fromdata_params[PRIV_KEY].key,
- out_priv, sizeof(out_priv), &len))
- || !TEST_mem_eq(out_priv, len,
- orig_fromdata_params[PRIV_KEY].data,
- orig_fromdata_params[PRIV_KEY].data_size)
- || !TEST_true(EVP_PKEY_get_octet_string_param(
- pk, orig_fromdata_params[PUB_KEY].key,
- out_pub, sizeof(out_pub), &len))
- || !TEST_mem_eq(out_pub, len,
- orig_fromdata_params[PUB_KEY].data,
- orig_fromdata_params[PUB_KEY].data_size))
+
+ if (!TEST_ptr(ctx2 = EVP_PKEY_CTX_new_from_pkey(NULL, pk, NULL)))
goto err;
- } else {
- /* The private key check should fail if there is only a public key */
- if (!TEST_true(EVP_PKEY_public_check(ctx2))
- || !TEST_false(EVP_PKEY_private_check(ctx2))
- || !TEST_false(EVP_PKEY_check(ctx2)))
+ if (tst <= 7) {
+ if (!TEST_true(EVP_PKEY_check(ctx2)))
+ goto err;
+ if (!TEST_true(EVP_PKEY_get_octet_string_param(
+ pk, orig_fromdata_params[PRIV_KEY].key,
+ out_priv, sizeof(out_priv), &len))
+ || !TEST_mem_eq(out_priv, len,
+ orig_fromdata_params[PRIV_KEY].data,
+ orig_fromdata_params[PRIV_KEY].data_size)
+ || !TEST_true(EVP_PKEY_get_octet_string_param(
+ pk, orig_fromdata_params[PUB_KEY].key,
+ out_pub, sizeof(out_pub), &len))
+ || !TEST_mem_eq(out_pub, len,
+ orig_fromdata_params[PUB_KEY].data,
+ orig_fromdata_params[PUB_KEY].data_size))
+ goto err;
+ } else {
+ /* The private key check should fail if there is only a public key */
+ if (!TEST_true(EVP_PKEY_public_check(ctx2))
+ || !TEST_false(EVP_PKEY_private_check(ctx2))
+ || !TEST_false(EVP_PKEY_check(ctx2)))
+ goto err;
+ }
+ EVP_PKEY_CTX_free(ctx2);
+ ctx2 = NULL;
+
+ if (!TEST_ptr(copy_pk = EVP_PKEY_new())
+ /* This should succeed because there are no parameters to copy */
+ || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
goto err;
- }
+ EVP_PKEY_free(copy_pk);
+ copy_pk = NULL;
- if (!TEST_ptr(copy_pk = EVP_PKEY_new())
- /* This should succeed because there are no parameters to copy */
- || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
- goto err;
+ if (tst > 7)
+ ret = test_print_key_using_encoder_public(alg, pk);
+ else
+ ret = test_print_key_using_pem(alg, pk)
+ && test_print_key_using_encoder(alg, pk);
- if (tst > 7)
- ret = test_print_key_using_encoder_public(alg, pk);
- else
- ret = test_print_key_using_pem(alg, pk)
- && test_print_key_using_encoder(alg, pk);
+ if (!ret || !TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
+ goto err;
+ ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
+ EVP_PKEY_free(pk);
+ pk = dup_pk;
+ if (!ret)
+ goto err;
+ }
err:
EVP_PKEY_free(pk);
@@ -985,7 +1087,7 @@ static int test_fromdata_ec(void)
{
int ret = 0;
EVP_PKEY_CTX *ctx = NULL;
- EVP_PKEY *pk = NULL, *copy_pk = NULL;
+ EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
OSSL_PARAM_BLD *bld = NULL;
BIGNUM *ec_priv_bn = NULL;
BIGNUM *bn_priv = NULL;
@@ -1040,39 +1142,61 @@ static int test_fromdata_ec(void)
if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
|| !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
- fromdata_params))
- || !TEST_int_eq(EVP_PKEY_bits(pk), 256)
- || !TEST_int_eq(EVP_PKEY_security_bits(pk), 128)
- || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 35 * 2)
- || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ fromdata_params)))
goto err;
- if (!TEST_ptr(copy_pk = EVP_PKEY_new())
- || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
- goto err;
+ while (dup_pk == NULL) {
+ ret = 0;
+ if (!TEST_int_eq(EVP_PKEY_bits(pk), 256)
+ || !TEST_int_eq(EVP_PKEY_security_bits(pk), 128)
+ || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 35 * 2)
+ || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ goto err;
- if (!TEST_ptr(gettable = EVP_PKEY_gettable_params(pk))
- || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_GROUP_NAME))
- || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PUB_KEY))
- || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PRIV_KEY)))
- goto err;
+ if (!TEST_ptr(copy_pk = EVP_PKEY_new())
+ || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
+ goto err;
+ EVP_PKEY_free(copy_pk);
+ copy_pk = NULL;
+
+ if (!TEST_ptr(gettable = EVP_PKEY_gettable_params(pk))
+ || !TEST_ptr(OSSL_PARAM_locate_const(gettable,
+ OSSL_PKEY_PARAM_GROUP_NAME))
+ || !TEST_ptr(OSSL_PARAM_locate_const(gettable,
+ OSSL_PKEY_PARAM_PUB_KEY))
+ || !TEST_ptr(OSSL_PARAM_locate_const(gettable,
+ OSSL_PKEY_PARAM_PRIV_KEY)))
+ goto err;
- if (!EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
- out_curve_name, sizeof(out_curve_name),
- &len)
- || !TEST_str_eq(out_curve_name, curve)
- || !EVP_PKEY_get_octet_string_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
+ if (!EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
+ out_curve_name,
+ sizeof(out_curve_name),
+ &len)
+ || !TEST_str_eq(out_curve_name, curve)
+ || !EVP_PKEY_get_octet_string_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
out_pub, sizeof(out_pub), &len)
- || !TEST_true(out_pub[0] == (POINT_CONVERSION_COMPRESSED + 1))
- || !TEST_mem_eq(out_pub + 1, len - 1,
- ec_pub_keydata + 1, compressed_sz - 1)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
- &bn_priv))
- || !TEST_BN_eq(ec_priv_bn, bn_priv))
- goto err;
+ || !TEST_true(out_pub[0] == (POINT_CONVERSION_COMPRESSED + 1))
+ || !TEST_mem_eq(out_pub + 1, len - 1,
+ ec_pub_keydata + 1, compressed_sz - 1)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
+ &bn_priv))
+ || !TEST_BN_eq(ec_priv_bn, bn_priv))
+ goto err;
+ BN_free(bn_priv);
+ bn_priv = NULL;
+
+ ret = test_print_key_using_pem(alg, pk)
+ && test_print_key_using_encoder(alg, pk);
+
+ if (!ret || !TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
+ goto err;
+ ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
+ EVP_PKEY_free(pk);
+ pk = dup_pk;
+ if (!ret)
+ goto err;
+ }
- ret = test_print_key_using_pem(alg, pk)
- && test_print_key_using_encoder(alg, pk);
err:
BN_free(bn_priv);
BN_free(ec_priv_bn);
@@ -1155,7 +1279,7 @@ static int test_fromdata_dsa_fips186_4(void)
{
int ret = 0;
EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
- EVP_PKEY *pk = NULL, *copy_pk = NULL;
+ EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
BIGNUM *pub = NULL, *priv = NULL;
BIGNUM *p = NULL, *q = NULL, *g = NULL;
BIGNUM *pub_out = NULL, *priv_out = NULL;
@@ -1300,61 +1424,100 @@ static int test_fromdata_dsa_fips186_4(void)
if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
|| !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
- fromdata_params))
- || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
- || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
- || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 2 * (3 + sizeof(q_data)))
- || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ fromdata_params)))
goto err;
- if (!TEST_false(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
- name_out, sizeof(name_out),
- &len))
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
- &pub_out))
- || !TEST_BN_eq(pub, pub_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
- &priv_out))
- || !TEST_BN_eq(priv, priv_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p_out))
- || !TEST_BN_eq(p, p_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q_out))
- || !TEST_BN_eq(q, q_out)
- || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g_out))
- || !TEST_BN_eq(g, g_out)
- || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
- &j_out))
- || !TEST_ptr_null(j_out)
- || !TEST_true(EVP_PKEY_get_octet_string_param(pk,
- OSSL_PKEY_PARAM_FFC_SEED,
- seed_out, sizeof(seed_out),
- &len))
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
- &gindex_out))
- || !TEST_int_eq(gindex, gindex_out)
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
- &hindex_out))
- || !TEST_int_eq(hindex_out, 0)
- || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
- &pcounter_out))
- || !TEST_int_eq(pcounter, pcounter_out))
- goto err;
+ while (dup_pk == NULL) {
+ ret = 0;
+ if (!TEST_int_eq(EVP_PKEY_bits(pk), 2048)
+ || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
+ || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 2 * (3 + sizeof(q_data)))
+ || !TEST_false(EVP_PKEY_missing_parameters(pk)))
+ goto err;
- if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
- goto err;
+ if (!TEST_false(EVP_PKEY_get_utf8_string_param(pk,
+ OSSL_PKEY_PARAM_GROUP_NAME,
+ name_out,
+ sizeof(name_out),
+ &len))
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
+ &pub_out))
+ || !TEST_BN_eq(pub, pub_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
+ &priv_out))
+ || !TEST_BN_eq(priv, priv_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P,
+ &p_out))
+ || !TEST_BN_eq(p, p_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q,
+ &q_out))
+ || !TEST_BN_eq(q, q_out)
+ || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G,
+ &g_out))
+ || !TEST_BN_eq(g, g_out)
+ || !TEST_false(EVP_PKEY_get_bn_param(pk,
+ OSSL_PKEY_PARAM_FFC_COFACTOR,
+ &j_out))
+ || !TEST_ptr_null(j_out)
+ || !TEST_true(EVP_PKEY_get_octet_string_param(pk,
+ OSSL_PKEY_PARAM_FFC_SEED,
+ seed_out,
+ sizeof(seed_out),
+ &len))
+ || !TEST_true(EVP_PKEY_get_int_param(pk,
+ OSSL_PKEY_PARAM_FFC_GINDEX,
+ &gindex_out))
+ || !TEST_int_eq(gindex, gindex_out)
+ || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
+ &hindex_out))
+ || !TEST_int_eq(hindex_out, 0)
+ || !TEST_true(EVP_PKEY_get_int_param(pk,
+ OSSL_PKEY_PARAM_FFC_PCOUNTER,
+ &pcounter_out))
+ || !TEST_int_eq(pcounter, pcounter_out))
+ goto err;
+ BN_free(p);
+ p = NULL;
+ BN_free(q);
+ q = NULL;
+ BN_free(g);
+ g = NULL;
+ BN_free(j_out);
+ j_out = NULL;
+ BN_free(pub_out);
+ pub_out = NULL;
+ BN_free(priv_out);
+ priv_out = NULL;
+
+ if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
+ goto err;
- if (!TEST_true(EVP_PKEY_check(key_ctx))
- || !TEST_true(EVP_PKEY_public_check(key_ctx))
- || !TEST_true(EVP_PKEY_private_check(key_ctx))
- || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
- goto err;
+ if (!TEST_true(EVP_PKEY_check(key_ctx))
+ || !TEST_true(EVP_PKEY_public_check(key_ctx))
+ || !TEST_true(EVP_PKEY_private_check(key_ctx))
+ || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
+ goto err;
+ EVP_PKEY_CTX_free(key_ctx);
+ key_ctx = NULL;
- if (!TEST_ptr(copy_pk = EVP_PKEY_new())
- || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
- goto err;
+ if (!TEST_ptr(copy_pk = EVP_PKEY_new())
+ || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
+ goto err;
+ EVP_PKEY_free(copy_pk);
+ copy_pk = NULL;
+
+ ret = test_print_key_using_pem("DSA", pk)
+ && test_print_key_using_encoder("DSA", pk);
+
+ if (!ret || !TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
+ goto err;
+ ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
+ EVP_PKEY_free(pk);
+ pk = dup_pk;
+ if (!ret)
+ goto err;
+ }
- ret = test_print_key_using_pem("DSA", pk)
- && test_print_key_using_encoder("DSA", pk);
err:
OSSL_PARAM_BLD_free_params(fromdata_params);
OSSL_PARAM_BLD_free(bld);