diff --git a/test/build.info b/test/build.info index 0b67d49b380dacd54fba68cee57ab9f379b4306f..51100d1418d64773f75ac4cb58523cafca51697c 100644 --- a/test/build.info +++ b/test/build.info @@ -139,7 +139,7 @@ IF[{- !$disabled{tests} -}] SOURCE[evp_extra_test]=evp_extra_test.c INCLUDE[evp_extra_test]=../include ../apps/include - DEPEND[evp_extra_test]=../libcrypto libtestutil.a + DEPEND[evp_extra_test]=../libcrypto.a libtestutil.a SOURCE[evp_extra_test2]=evp_extra_test2.c INCLUDE[evp_extra_test2]=../include ../apps/include diff --git a/test/evp_extra_test.c b/test/evp_extra_test.c index 94b95eeac8caa1a72023d1d885c4ce55415f1e62..6949b13c7ac58b0fcb8a0d27fae0f27ad31c96b4 100644 --- a/test/evp_extra_test.c +++ b/test/evp_extra_test.c @@ -32,6 +32,7 @@ #include "internal/nelem.h" #include "internal/sizes.h" #include "crypto/evp.h" +#include "../e_os.h" /* strcasecmp */ #ifndef OPENSSL_NO_SM2 /* @@ -842,6 +843,80 @@ static int test_privatekey_to_pkcs8(void) return ok; } +#ifndef OPENSSL_NO_EC +static const struct { + int encoding; + const char *encoding_name; +} ec_encodings[] = { + { OPENSSL_EC_EXPLICIT_CURVE, OSSL_PKEY_EC_ENCODING_EXPLICIT }, + { OPENSSL_EC_NAMED_CURVE, OSSL_PKEY_EC_ENCODING_GROUP } +}; + +static int ec_export_get_encoding_cb(const OSSL_PARAM params[], void *arg) +{ + const OSSL_PARAM *p; + const char *enc_name = NULL; + int *enc = arg; + size_t i; + + *enc = -1; + + if (!TEST_ptr(p = OSSL_PARAM_locate_const(params, + OSSL_PKEY_PARAM_EC_ENCODING)) + || !TEST_true(OSSL_PARAM_get_utf8_string_ptr(p, &enc_name))) + return 0; + + for (i = 0; i < OSSL_NELEM(ec_encodings); i++) { + if (strcasecmp(enc_name, ec_encodings[i].encoding_name) == 0) { + *enc = ec_encodings[i].encoding; + break; + } + } + + return (*enc != -1); +} + +static int test_EC_keygen_with_enc(int idx) +{ + EVP_PKEY *params = NULL, *key = NULL; + EVP_PKEY_CTX *pctx = NULL, *kctx = NULL; + int enc; + int ret = 0; + + enc = ec_encodings[idx].encoding; + + /* Create key parameters */ + if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "EC", NULL)) + || !TEST_true(EVP_PKEY_paramgen_init(pctx)) + || !TEST_true(EVP_PKEY_CTX_set_group_name(pctx, "P-256")) + || !TEST_true(EVP_PKEY_CTX_set_ec_param_enc(pctx, enc)) + || !TEST_true(EVP_PKEY_paramgen(pctx, ¶ms)) + || !TEST_ptr(params)) + goto done; + + /* Create key */ + if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx, params, NULL)) + || !TEST_true(EVP_PKEY_keygen_init(kctx)) + || !TEST_true(EVP_PKEY_keygen(kctx, &key)) + || !TEST_ptr(key)) + goto done; + + /* Check that the encoding got all the way into the key */ + if (!TEST_true(evp_keymgmt_util_export(key, OSSL_KEYMGMT_SELECT_ALL, + ec_export_get_encoding_cb, &enc)) + || !TEST_int_eq(enc, ec_encodings[idx].encoding)) + goto done; + + ret = 1; + done: + EVP_PKEY_free(key); + EVP_PKEY_free(params); + EVP_PKEY_CTX_free(kctx); + EVP_PKEY_CTX_free(pctx); + return ret; +} +#endif + #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE) static int test_EVP_SM2_verify(void) @@ -2029,6 +2104,9 @@ int setup_tests(void) #ifndef OPENSSL_NO_EC ADD_TEST(test_EVP_PKCS82PKEY); #endif +#ifndef OPENSSL_NO_EC + ADD_ALL_TESTS(test_EC_keygen_with_enc, OSSL_NELEM(ec_encodings)); +#endif #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE) ADD_TEST(test_EVP_SM2); ADD_TEST(test_EVP_SM2_verify);