From 9c45222ddc36124b8826d98dc0794f3eef1e5f0b Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Wed, 4 Sep 2019 12:46:02 +0100 Subject: Revise EVP_PKEY param handling We add new functions for getting parameters and discovering the gettable and settable parameters. We also make EVP_PKEY_CTX_get_signature_md() a function and implement it in terms of the new functions. This enables applications to discover the set of parameters that are supported for a given algorithm implementation. Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/9753) --- providers/common/exchange/dh_exch.c | 18 ++++++++-- providers/common/signature/dsa.c | 72 +++++++++++++++++++++++++++++++++---- 2 files changed, 82 insertions(+), 8 deletions(-) (limited to 'providers/common') diff --git a/providers/common/exchange/dh_exch.c b/providers/common/exchange/dh_exch.c index 5ff8318725..cfbda43fb8 100644 --- a/providers/common/exchange/dh_exch.c +++ b/providers/common/exchange/dh_exch.c @@ -20,6 +20,8 @@ static OSSL_OP_keyexch_set_peer_fn dh_set_peer; static OSSL_OP_keyexch_derive_fn dh_derive; static OSSL_OP_keyexch_freectx_fn dh_freectx; static OSSL_OP_keyexch_dupctx_fn dh_dupctx; +static OSSL_OP_keyexch_set_ctx_params_fn dh_set_ctx_params; +static OSSL_OP_keyexch_settable_ctx_params_fn dh_settable_ctx_params; /* * What's passed as an actual key is defined by the KEYMGMT interface. @@ -124,7 +126,7 @@ static void *dh_dupctx(void *vpdhctx) return dstctx; } -static int dh_set_params(void *vpdhctx, const OSSL_PARAM params[]) +static int dh_set_ctx_params(void *vpdhctx, const OSSL_PARAM params[]) { PROV_DH_CTX *pdhctx = (PROV_DH_CTX *)vpdhctx; const OSSL_PARAM *p; @@ -140,6 +142,16 @@ static int dh_set_params(void *vpdhctx, const OSSL_PARAM params[]) return 1; } +static const OSSL_PARAM known_settable_ctx_params[] = { + OSSL_PARAM_int(OSSL_EXCHANGE_PARAM_PAD, NULL), + OSSL_PARAM_END +}; + +static const OSSL_PARAM *dh_settable_ctx_params(void) +{ + return known_settable_ctx_params; +} + const OSSL_DISPATCH dh_keyexch_functions[] = { { OSSL_FUNC_KEYEXCH_NEWCTX, (void (*)(void))dh_newctx }, { OSSL_FUNC_KEYEXCH_INIT, (void (*)(void))dh_init }, @@ -147,6 +159,8 @@ const OSSL_DISPATCH dh_keyexch_functions[] = { { OSSL_FUNC_KEYEXCH_SET_PEER, (void (*)(void))dh_set_peer }, { OSSL_FUNC_KEYEXCH_FREECTX, (void (*)(void))dh_freectx }, { OSSL_FUNC_KEYEXCH_DUPCTX, (void (*)(void))dh_dupctx }, - { OSSL_FUNC_KEYEXCH_SET_PARAMS, (void (*)(void))dh_set_params }, + { OSSL_FUNC_KEYEXCH_SET_CTX_PARAMS, (void (*)(void))dh_set_ctx_params }, + { OSSL_FUNC_KEYEXCH_SETTABLE_CTX_PARAMS, + (void (*)(void))dh_settable_ctx_params }, { 0, NULL } }; diff --git a/providers/common/signature/dsa.c b/providers/common/signature/dsa.c index c0cd29381c..dc4eb6c6d4 100644 --- a/providers/common/signature/dsa.c +++ b/providers/common/signature/dsa.c @@ -20,7 +20,10 @@ static OSSL_OP_signature_verify_init_fn dsa_signature_init; static OSSL_OP_signature_sign_fn dsa_sign; static OSSL_OP_signature_freectx_fn dsa_freectx; static OSSL_OP_signature_dupctx_fn dsa_dupctx; -static OSSL_OP_signature_set_params_fn dsa_set_params; +static OSSL_OP_signature_get_ctx_params_fn dsa_get_ctx_params; +static OSSL_OP_signature_gettable_ctx_params_fn dsa_gettable_ctx_params; +static OSSL_OP_signature_set_ctx_params_fn dsa_set_ctx_params; +static OSSL_OP_signature_settable_ctx_params_fn dsa_settable_ctx_params; /* * What's passed as an actual key is defined by the KEYMGMT interface. @@ -31,6 +34,8 @@ static OSSL_OP_signature_set_params_fn dsa_set_params; typedef struct { DSA *dsa; size_t mdsize; + /* Should be big enough */ + char mdname[80]; } PROV_DSA_CTX; static void *dsa_newctx(void *provctx) @@ -116,24 +121,74 @@ static void *dsa_dupctx(void *vpdsactx) return dstctx; } -static int dsa_set_params(void *vpdsactx, const OSSL_PARAM params[]) +static int dsa_get_ctx_params(void *vpdsactx, OSSL_PARAM *params) +{ + PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx; + OSSL_PARAM *p; + + if (pdsactx == NULL || params == NULL) + return 0; + + p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_DIGEST_SIZE); + if (p != NULL && !OSSL_PARAM_set_size_t(p, pdsactx->mdsize)) + return 0; + + p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_DIGEST); + if (p != NULL && !OSSL_PARAM_set_utf8_string(p, pdsactx->mdname)) + return 0; + + return 1; +} + +static const OSSL_PARAM known_gettable_ctx_params[] = { + OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL), + OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0), + OSSL_PARAM_END +}; + +static const OSSL_PARAM *dsa_gettable_ctx_params(void) +{ + return known_gettable_ctx_params; +} + +static int dsa_set_ctx_params(void *vpdsactx, const OSSL_PARAM params[]) { PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx; const OSSL_PARAM *p; - size_t mdsize; + char *mdname; if (pdsactx == NULL || params == NULL) return 0; p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST_SIZE); - if (p == NULL || !OSSL_PARAM_get_size_t(p, &mdsize)) + if (p != NULL && !OSSL_PARAM_get_size_t(p, &pdsactx->mdsize)) return 0; - pdsactx->mdsize = mdsize; + /* + * We never actually use the mdname, but we do support getting it later. + * This can be useful for applications that want to know the MD that they + * previously set. + */ + p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST); + mdname = pdsactx->mdname; + if (p != NULL + && !OSSL_PARAM_get_utf8_string(p, &mdname, sizeof(pdsactx->mdname))) + return 0; return 1; } +static const OSSL_PARAM known_settable_ctx_params[] = { + OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL), + OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0), + OSSL_PARAM_END +}; + +static const OSSL_PARAM *dsa_settable_ctx_params(void) +{ + return known_settable_ctx_params; +} + const OSSL_DISPATCH dsa_signature_functions[] = { { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))dsa_newctx }, { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))dsa_signature_init }, @@ -142,6 +197,11 @@ const OSSL_DISPATCH dsa_signature_functions[] = { { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))dsa_verify }, { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))dsa_freectx }, { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))dsa_dupctx }, - { OSSL_FUNC_SIGNATURE_SET_PARAMS, (void (*)(void))dsa_set_params }, + { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))dsa_get_ctx_params }, + { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS, + (void (*)(void))dsa_gettable_ctx_params }, + { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))dsa_set_ctx_params }, + { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS, + (void (*)(void))dsa_settable_ctx_params }, { 0, NULL } }; -- cgit v1.2.3