From: Richard Levitte Date: Mon, 14 Oct 2019 08:37:08 +0000 (+0200) Subject: DSA: Add export of keys and domain parameters from provider X-Git-Tag: openssl-3.0.0-alpha1~1120 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=13aa5d29601683e0971763836ec37302fc7cece9;p=oweals%2Fopenssl.git DSA: Add export of keys and domain parameters from provider Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/10169) --- diff --git a/providers/implementations/keymgmt/dsa_kmgmt.c b/providers/implementations/keymgmt/dsa_kmgmt.c index aae9ddac65..a3bf11a570 100644 --- a/providers/implementations/keymgmt/dsa_kmgmt.c +++ b/providers/implementations/keymgmt/dsa_kmgmt.c @@ -15,7 +15,9 @@ #include "prov/implementations.h" static OSSL_OP_keymgmt_importdomparams_fn dsa_importdomparams; +static OSSL_OP_keymgmt_exportdomparams_fn dsa_exportdomparams; static OSSL_OP_keymgmt_importkey_fn dsa_importkey; +static OSSL_OP_keymgmt_exportkey_fn dsa_exportkey; static int params_to_domparams(DSA *dsa, const OSSL_PARAM params[]) { @@ -46,6 +48,28 @@ static int params_to_domparams(DSA *dsa, const OSSL_PARAM params[]) return 0; } +static int domparams_to_params(DSA *dsa, OSSL_PARAM params[]) +{ + OSSL_PARAM *p; + const BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL; + + if (dsa == NULL) + return 0; + + DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g); + if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_FFC_P)) != NULL + && !OSSL_PARAM_set_BN(p, dsa_p)) + return 0; + if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_FFC_Q)) != NULL + && !OSSL_PARAM_set_BN(p, dsa_q)) + return 0; + if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_FFC_G)) != NULL + && !OSSL_PARAM_set_BN(p, dsa_g)) + return 0; + + return 1; +} + static int params_to_key(DSA *dsa, const OSSL_PARAM params[]) { const OSSL_PARAM *param_priv_key, *param_pub_key; @@ -86,6 +110,27 @@ static int params_to_key(DSA *dsa, const OSSL_PARAM params[]) return 0; } +static int key_to_params(DSA *dsa, OSSL_PARAM params[]) +{ + OSSL_PARAM *p; + const BIGNUM *priv_key = NULL, *pub_key = NULL; + + if (dsa == NULL) + return 0; + if (!domparams_to_params(dsa, params)) + return 0; + + DSA_get0_key(dsa, &pub_key, &priv_key); + if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_DSA_PRIV_KEY)) != NULL + && !OSSL_PARAM_set_BN(p, priv_key)) + return 0; + if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_DSA_PUB_KEY)) != NULL + && !OSSL_PARAM_set_BN(p, pub_key)) + return 0; + + return 1; +} + static void *dsa_importdomparams(void *provctx, const OSSL_PARAM params[]) { DSA *dsa; @@ -98,6 +143,13 @@ static void *dsa_importdomparams(void *provctx, const OSSL_PARAM params[]) return dsa; } +static int dsa_exportdomparams(void *domparams, OSSL_PARAM params[]) +{ + DSA *dsa = domparams; + + return dsa != NULL && !domparams_to_params(dsa, params); +} + static void *dsa_importkey(void *provctx, const OSSL_PARAM params[]) { DSA *dsa; @@ -110,14 +162,23 @@ static void *dsa_importkey(void *provctx, const OSSL_PARAM params[]) return dsa; } +static int dsa_exportkey(void *key, OSSL_PARAM params[]) +{ + DSA *dsa = key; + + return dsa != NULL && !key_to_params(dsa, params); +} + const OSSL_DISPATCH dsa_keymgmt_functions[] = { /* * TODO(3.0) When implementing OSSL_FUNC_KEYMGMT_GENKEY, remember to also * implement OSSL_FUNC_KEYMGMT_EXPORTKEY. */ { OSSL_FUNC_KEYMGMT_IMPORTDOMPARAMS, (void (*)(void))dsa_importdomparams }, + { OSSL_FUNC_KEYMGMT_EXPORTDOMPARAMS, (void (*)(void))dsa_exportdomparams }, { OSSL_FUNC_KEYMGMT_FREEDOMPARAMS, (void (*)(void))DSA_free }, { OSSL_FUNC_KEYMGMT_IMPORTKEY, (void (*)(void))dsa_importkey }, + { OSSL_FUNC_KEYMGMT_EXPORTKEY, (void (*)(void))dsa_exportkey }, { OSSL_FUNC_KEYMGMT_FREEKEY, (void (*)(void))DSA_free }, { 0, NULL } };