From 2ee0dfa684d5fbda5758136807e2732bd4f85139 Mon Sep 17 00:00:00 2001 From: Pauli Date: Mon, 10 Feb 2020 13:29:49 +1000 Subject: [PATCH] Params: add argument to the _from_text calls to indicate if the param exists. The extra argument is a integer pointer and is optional. Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/11049) --- apps/lib/apps.c | 2 +- crypto/evp/pkey_kdf.c | 2 +- crypto/evp/pkey_mac.c | 2 +- crypto/evp/pmeth_lib.c | 2 +- crypto/params_from_text.c | 8 +++++--- doc/man3/OSSL_PARAM_allocate_from_text.pod | 8 ++++++-- include/openssl/params.h | 2 +- providers/fips/self_test_kats.c | 2 +- test/evp_test.c | 4 ++-- 9 files changed, 19 insertions(+), 13 deletions(-) diff --git a/apps/lib/apps.c b/apps/lib/apps.c index bf20254463..3a9521f67e 100644 --- a/apps/lib/apps.c +++ b/apps/lib/apps.c @@ -2708,7 +2708,7 @@ OSSL_PARAM *app_params_new_from_opts(STACK_OF(OPENSSL_STRING) *opts, /* Skip over the separator so that vmtp points to the value */ vtmp++; if (!OSSL_PARAM_allocate_from_text(¶ms[params_n], paramdefs, - stmp, vtmp, strlen(vtmp))) + stmp, vtmp, strlen(vtmp), NULL)) goto err; OPENSSL_free(stmp); } diff --git a/crypto/evp/pkey_kdf.c b/crypto/evp/pkey_kdf.c index 818c89eab2..86c2fac612 100644 --- a/crypto/evp/pkey_kdf.c +++ b/crypto/evp/pkey_kdf.c @@ -224,7 +224,7 @@ static int pkey_kdf_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, type = OSSL_KDF_PARAM_SCRYPT_N; if (!OSSL_PARAM_allocate_from_text(¶ms[0], defs, type, - value, strlen(value))) + value, strlen(value), NULL)) return 0; /* diff --git a/crypto/evp/pkey_mac.c b/crypto/evp/pkey_mac.c index 1c8f878512..ed3a075f88 100644 --- a/crypto/evp/pkey_mac.c +++ b/crypto/evp/pkey_mac.c @@ -453,7 +453,7 @@ static int pkey_mac_ctrl_str(EVP_PKEY_CTX *ctx, if (!OSSL_PARAM_allocate_from_text(¶ms[0], EVP_MAC_settable_ctx_params(mac), - type, value, strlen(value) + 1)) + type, value, strlen(value) + 1, NULL)) return 0; params[1] = OSSL_PARAM_construct_end(); ok = EVP_MAC_CTX_set_params(hctx->ctx, params); diff --git a/crypto/evp/pmeth_lib.c b/crypto/evp/pmeth_lib.c index 49af63845e..20cbb08559 100644 --- a/crypto/evp/pmeth_lib.c +++ b/crypto/evp/pmeth_lib.c @@ -940,7 +940,7 @@ static int legacy_ctrl_str_to_param(EVP_PKEY_CTX *ctx, const char *name, int rv = 0; if (!OSSL_PARAM_allocate_from_text(¶ms[0], settable, name, value, - strlen(value))) + strlen(value), NULL)) return 0; if (EVP_PKEY_CTX_set_params(ctx, params)) rv = 1; diff --git a/crypto/params_from_text.c b/crypto/params_from_text.c index 59cee5f115..71fa8aef92 100644 --- a/crypto/params_from_text.c +++ b/crypto/params_from_text.c @@ -24,7 +24,7 @@ static int prepare_from_text(const OSSL_PARAM *paramdefs, const char *key, const char *value, size_t value_n, /* Output parameters */ const OSSL_PARAM **paramdef, int *ishex, - size_t *buf_n, BIGNUM **tmpbn) + size_t *buf_n, BIGNUM **tmpbn, int *found) { const OSSL_PARAM *p; @@ -38,6 +38,8 @@ static int prepare_from_text(const OSSL_PARAM *paramdefs, const char *key, key += 3; p = *paramdef = OSSL_PARAM_locate_const(paramdefs, key); + if (found != NULL) + *found = p != NULL; if (p == NULL) return 0; @@ -163,7 +165,7 @@ static int construct_from_text(OSSL_PARAM *to, const OSSL_PARAM *paramdef, int OSSL_PARAM_allocate_from_text(OSSL_PARAM *to, const OSSL_PARAM *paramdefs, const char *key, const char *value, - size_t value_n) + size_t value_n, int *found) { const OSSL_PARAM *paramdef = NULL; int ishex = 0; @@ -176,7 +178,7 @@ int OSSL_PARAM_allocate_from_text(OSSL_PARAM *to, return 0; if (!prepare_from_text(paramdefs, key, value, value_n, - ¶mdef, &ishex, &buf_n, &tmpbn)) + ¶mdef, &ishex, &buf_n, &tmpbn, found)) return 0; if ((buf = OPENSSL_zalloc(buf_n > 0 ? buf_n : 1)) == NULL) { diff --git a/doc/man3/OSSL_PARAM_allocate_from_text.pod b/doc/man3/OSSL_PARAM_allocate_from_text.pod index c16491e702..48dbfc75c5 100644 --- a/doc/man3/OSSL_PARAM_allocate_from_text.pod +++ b/doc/man3/OSSL_PARAM_allocate_from_text.pod @@ -12,7 +12,8 @@ OSSL_PARAM_allocate_from_text int OSSL_PARAM_allocate_from_text(OSSL_PARAM *to, const OSSL_PARAM *paramdefs, const char *key, const char *value, - size_t value_n); + size_t value_n, + int *found); =head1 DESCRIPTION @@ -37,6 +38,9 @@ left untouched, allowing a caller to find out how large the buffer should be. I needs to be correctly aligned for the type of the B I. +If is not NULL, it is set to 1 if the parameter can be located and +to 0 otherwise. + The caller must remember to free the data of I when it's not useful any more. @@ -127,7 +131,7 @@ Can be written like this instead: *vtmp++ = '\0'; if (!OSSL_PARAM_allocate_from_text(¶ms[params_n], paramdefs, stmp, - vtmp, strlen(vtmp))) + vtmp, strlen(vtmp), NULL)) goto err; } params[params_n] = OSSL_PARAM_construct_end(); diff --git a/include/openssl/params.h b/include/openssl/params.h index a5d2fd4f41..cd0f7846d7 100644 --- a/include/openssl/params.h +++ b/include/openssl/params.h @@ -92,7 +92,7 @@ OSSL_PARAM OSSL_PARAM_construct_end(void); int OSSL_PARAM_allocate_from_text(OSSL_PARAM *to, const OSSL_PARAM *paramdefs, const char *key, const char *value, - size_t value_n); + size_t value_n, int *found); int OSSL_PARAM_get_int(const OSSL_PARAM *p, int *val); int OSSL_PARAM_get_uint(const OSSL_PARAM *p, unsigned int *val); diff --git a/providers/fips/self_test_kats.c b/providers/fips/self_test_kats.c index f67f4f69c8..a383c0c36d 100644 --- a/providers/fips/self_test_kats.c +++ b/providers/fips/self_test_kats.c @@ -167,7 +167,7 @@ static int self_test_kdf(const ST_KAT_KDF *t, OSSL_ST_EVENT *event, if (!OSSL_PARAM_allocate_from_text(¶ms[i], settables, t->ctrls[i].name, t->ctrls[i].value, - strlen(t->ctrls[i].value))) + strlen(t->ctrls[i].value), NULL)) goto end; } if (!EVP_KDF_CTX_set_params(ctx, params)) diff --git a/test/evp_test.c b/test/evp_test.c index 87e901fdb4..63ae144920 100644 --- a/test/evp_test.c +++ b/test/evp_test.c @@ -1310,7 +1310,7 @@ static int mac_test_run_mac(EVP_TEST *t) || !OSSL_PARAM_allocate_from_text(¶ms[params_n], defined_params, tmpkey, tmpval, - strlen(tmpval))) { + strlen(tmpval), NULL)) { OPENSSL_free(tmpkey); t->err = "MAC_PARAM_ERROR"; goto err; @@ -2129,7 +2129,7 @@ static int kdf_test_ctrl(EVP_TEST *t, EVP_KDF_CTX *kctx, *p++ = '\0'; rv = OSSL_PARAM_allocate_from_text(kdata->p, defs, name, p, - p != NULL ? strlen(p) : 0); + p != NULL ? strlen(p) : 0, NULL); *++kdata->p = OSSL_PARAM_construct_end(); if (!rv) { t->err = "KDF_PARAM_ERROR"; -- 2.25.1