forked from wolfSSL/wolfssl
EVP_PKEY_copy_parameters: add support for EVP_PKEY_DH
This commit is contained in:
58
tests/api.c
58
tests/api.c
@ -43529,7 +43529,8 @@ static void test_wolfSSL_EVP_PKEY_keygen(void)
|
|||||||
{
|
{
|
||||||
WOLFSSL_EVP_PKEY* pkey = NULL;
|
WOLFSSL_EVP_PKEY* pkey = NULL;
|
||||||
EVP_PKEY_CTX* ctx = NULL;
|
EVP_PKEY_CTX* ctx = NULL;
|
||||||
#ifndef NO_DH
|
#if !defined(NO_DH) && (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
|
||||||
|
(HAVE_FIPS_VERSION>2)))
|
||||||
WOLFSSL_EVP_PKEY* params = NULL;
|
WOLFSSL_EVP_PKEY* params = NULL;
|
||||||
DH* dh = NULL;
|
DH* dh = NULL;
|
||||||
const BIGNUM* pubkey = NULL;
|
const BIGNUM* pubkey = NULL;
|
||||||
@ -43623,6 +43624,60 @@ static void test_wolfSSL_EVP_PKEY_missing_parameters(void)
|
|||||||
printf(resultFmt, passed);
|
printf(resultFmt, passed);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
static void test_wolfSSL_EVP_PKEY_copy_parameters(void)
|
||||||
|
{
|
||||||
|
#if defined(OPENSSL_EXTRA) && !defined(NO_DH) && defined(WOLFSSL_KEY_GEN) && \
|
||||||
|
!defined(HAVE_SELFTEST) && (defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
|
||||||
|
defined(WOLFSSL_OPENSSH)) && defined(WOLFSSL_DH_EXTRA) && \
|
||||||
|
!defined(NO_FILESYSTEM)
|
||||||
|
|
||||||
|
WOLFSSL_EVP_PKEY* params = NULL;
|
||||||
|
WOLFSSL_EVP_PKEY* copy = NULL;
|
||||||
|
DH* dh = NULL;
|
||||||
|
BIGNUM* p1;
|
||||||
|
BIGNUM* g1;
|
||||||
|
BIGNUM* q1;
|
||||||
|
BIGNUM* p2;
|
||||||
|
BIGNUM* g2;
|
||||||
|
BIGNUM* q2;
|
||||||
|
|
||||||
|
printf(testingFmt, "wolfSSL_EVP_PKEY_copy_parameters");
|
||||||
|
|
||||||
|
/* create DH with DH_get_2048_256 params */
|
||||||
|
AssertNotNull(params = wolfSSL_EVP_PKEY_new());
|
||||||
|
AssertNotNull(dh = DH_get_2048_256());
|
||||||
|
AssertIntEQ(EVP_PKEY_set1_DH(params, dh), WOLFSSL_SUCCESS);
|
||||||
|
DH_get0_pqg(dh, (const BIGNUM**)&p1,
|
||||||
|
(const BIGNUM**)&q1,
|
||||||
|
(const BIGNUM**)&g1);
|
||||||
|
DH_free(dh);
|
||||||
|
|
||||||
|
/* create DH with random generated DH params */
|
||||||
|
AssertNotNull(copy = wolfSSL_EVP_PKEY_new());
|
||||||
|
AssertNotNull(dh = DH_generate_parameters(2048, 2, NULL, NULL));
|
||||||
|
AssertIntEQ(EVP_PKEY_set1_DH(copy, dh), WOLFSSL_SUCCESS);
|
||||||
|
DH_free(dh);
|
||||||
|
|
||||||
|
AssertIntEQ(EVP_PKEY_copy_parameters(copy, params), WOLFSSL_SUCCESS);
|
||||||
|
AssertNotNull(dh = EVP_PKEY_get1_DH(copy));
|
||||||
|
AssertNotNull(dh->p);
|
||||||
|
AssertNotNull(dh->g);
|
||||||
|
AssertNotNull(dh->q);
|
||||||
|
DH_get0_pqg(dh, (const BIGNUM**)&p2,
|
||||||
|
(const BIGNUM**)&q2,
|
||||||
|
(const BIGNUM**)&g2);
|
||||||
|
|
||||||
|
AssertIntEQ(BN_cmp(p1, p2), 0);
|
||||||
|
AssertIntEQ(BN_cmp(q1, q2), 0);
|
||||||
|
AssertIntEQ(BN_cmp(g1, g2), 0);
|
||||||
|
|
||||||
|
DH_free(dh);
|
||||||
|
EVP_PKEY_free(copy);
|
||||||
|
EVP_PKEY_free(params);
|
||||||
|
|
||||||
|
printf(resultFmt, passed);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
static void test_wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(void)
|
static void test_wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(void)
|
||||||
{
|
{
|
||||||
WOLFSSL_EVP_PKEY* pkey;
|
WOLFSSL_EVP_PKEY* pkey;
|
||||||
@ -52852,6 +52907,7 @@ void ApiTest(void)
|
|||||||
test_wolfSSL_EVP_PKEY_keygen();
|
test_wolfSSL_EVP_PKEY_keygen();
|
||||||
test_wolfSSL_EVP_PKEY_keygen_init();
|
test_wolfSSL_EVP_PKEY_keygen_init();
|
||||||
test_wolfSSL_EVP_PKEY_missing_parameters();
|
test_wolfSSL_EVP_PKEY_missing_parameters();
|
||||||
|
test_wolfSSL_EVP_PKEY_copy_parameters();
|
||||||
test_wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits();
|
test_wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits();
|
||||||
test_wolfSSL_EVP_CIPHER_CTX_iv_length();
|
test_wolfSSL_EVP_CIPHER_CTX_iv_length();
|
||||||
test_wolfSSL_EVP_CIPHER_CTX_key_length();
|
test_wolfSSL_EVP_CIPHER_CTX_key_length();
|
||||||
|
@ -2248,19 +2248,54 @@ int wolfSSL_EVP_PKEY_copy_parameters(WOLFSSL_EVP_PKEY *to,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_RSA
|
|
||||||
case EVP_PKEY_RSA:
|
|
||||||
#endif
|
|
||||||
#ifndef NO_DH
|
#ifndef NO_DH
|
||||||
case EVP_PKEY_DH:
|
case EVP_PKEY_DH:
|
||||||
|
if (from->dh) {
|
||||||
|
WOLFSSL_BIGNUM* cpy;
|
||||||
|
if (!to->dh && !(to->dh = wolfSSL_DH_new())) {
|
||||||
|
WOLFSSL_MSG("wolfSSL_DH_new error");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free existing BIGNUMs if needed before copying over new */
|
||||||
|
wolfSSL_BN_free(to->dh->p);
|
||||||
|
wolfSSL_BN_free(to->dh->g);
|
||||||
|
wolfSSL_BN_free(to->dh->q);
|
||||||
|
to->dh->p = NULL;
|
||||||
|
to->dh->g = NULL;
|
||||||
|
to->dh->q = NULL;
|
||||||
|
|
||||||
|
if (!(cpy = wolfSSL_BN_dup(from->dh->p))) {
|
||||||
|
WOLFSSL_MSG("wolfSSL_BN_dup error, DH p");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
to->dh->p = cpy;
|
||||||
|
if (!(cpy = wolfSSL_BN_dup(from->dh->g))) {
|
||||||
|
WOLFSSL_MSG("wolfSSL_BN_dup error, DH g");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
to->dh->g = cpy;
|
||||||
|
if (!(cpy = wolfSSL_BN_dup(from->dh->q))) {
|
||||||
|
WOLFSSL_MSG("wolfSSL_BN_dup error, DH q");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
to->dh->q = cpy;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
WOLFSSL_MSG("Missing DH struct");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case EVP_PKEY_RSA:
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
WOLFSSL_MSG("Copy parameters not available for this key type");
|
WOLFSSL_MSG("Copy parameters not available for this key type");
|
||||||
return WOLFSSL_FAILURE;
|
return WOLFSSL_FAILURE;
|
||||||
}
|
}
|
||||||
#if defined(HAVE_ECC) || !defined(NO_DSA)
|
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NO_WOLFSSL_STUB
|
#ifndef NO_WOLFSSL_STUB
|
||||||
|
Reference in New Issue
Block a user