diff options
Diffstat (limited to 'test/evp_pkey_provided_test.c')
-rw-r--r-- | test/evp_pkey_provided_test.c | 627 |
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); |