aboutsummaryrefslogtreecommitdiff
path: root/crypto/dsa
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2019-10-14 10:11:40 +0200
committerRichard Levitte <levitte@openssl.org>2019-10-17 13:01:14 +0200
commit073f59c407b06c1b64d84808f1bee9f9457222f9 (patch)
tree79b0b25f4d90ce3485556271b9eecac17c03d9e0 /crypto/dsa
parent14e3e00fe2c20a8594e3e20545d9f001fd7fa850 (diff)
downloadopenssl-073f59c407b06c1b64d84808f1bee9f9457222f9.zip
openssl-073f59c407b06c1b64d84808f1bee9f9457222f9.tar.gz
openssl-073f59c407b06c1b64d84808f1bee9f9457222f9.tar.bz2
DSA: Add export of domain parameters to provider
Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/10169)
Diffstat (limited to 'crypto/dsa')
-rw-r--r--crypto/dsa/dsa_ameth.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/crypto/dsa/dsa_ameth.c b/crypto/dsa/dsa_ameth.c
index b72005a..ddd262b 100644
--- a/crypto/dsa/dsa_ameth.c
+++ b/crypto/dsa/dsa_ameth.c
@@ -533,7 +533,8 @@ static size_t dsa_pkey_dirty_cnt(const EVP_PKEY *pkey)
return pkey->pkey.dsa->dirty_cnt;
}
-static void *dsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt)
+static void *dsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt,
+ int want_domainparams)
{
DSA *dsa = pk->pkey.dsa;
OSSL_PARAM_BLD tmpl;
@@ -541,7 +542,7 @@ static void *dsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt)
const BIGNUM *q = DSA_get0_q(dsa), *pub_key = DSA_get0_pub_key(dsa);
const BIGNUM *priv_key = DSA_get0_priv_key(dsa);
OSSL_PARAM *params;
- void *provkey = NULL;
+ void *provdata = NULL;
if (p == NULL || q == NULL || g == NULL)
return NULL;
@@ -552,12 +553,8 @@ static void *dsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt)
|| !ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_FFC_G, g))
return NULL;
- /*
- * This may be used to pass domain parameters only without any key data -
- * so "pub_key" is optional. We can never have a "priv_key" without a
- * corresponding "pub_key" though.
- */
- if (pub_key != NULL) {
+ if (!want_domainparams) {
+ /* A key must at least have a public part. */
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_DSA_PUB_KEY,
pub_key))
return NULL;
@@ -572,10 +569,12 @@ static void *dsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt)
params = ossl_param_bld_to_param(&tmpl);
/* We export, the provider imports */
- provkey = evp_keymgmt_importkey(keymgmt, params);
+ provdata = want_domainparams
+ ? evp_keymgmt_importdomparams(keymgmt, params)
+ : evp_keymgmt_importkey(keymgmt, params);
ossl_param_bld_free(params);
- return provkey;
+ return provdata;
}
/* NB these are sorted in pkey_id order, lowest first */