From 8d5fb6485282c79bfe9f1ebab14eab515910e370 Mon Sep 17 00:00:00 2001 From: Pauli Date: Tue, 21 Apr 2020 10:49:19 +1000 Subject: [PATCH] params: add functionality to test if an OSSL_PARAM has been set. Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/11588) --- crypto/params.c | 13 ++++++++++++- doc/man3/OSSL_PARAM_int.pod | 19 ++++++++++++++++++- include/openssl/params.h | 7 ++++++- test/params_api_test.c | 5 +++++ test/params_test.c | 6 ++---- util/libcrypto.num | 2 ++ 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/crypto/params.c b/crypto/params.c index 64d53c50e3..1decffdaca 100644 --- a/crypto/params.c +++ b/crypto/params.c @@ -36,10 +36,21 @@ static OSSL_PARAM ossl_param_construct(const char *key, unsigned int data_type, res.data_type = data_type; res.data = data; res.data_size = data_size; - res.return_size = 0; + res.return_size = OSSL_PARAM_UNMODIFIED; return res; } +int OSSL_PARAM_modified(const OSSL_PARAM *p) +{ + return p != NULL && p->return_size != OSSL_PARAM_UNMODIFIED; +} + +void OSSL_PARAM_set_unmodified(OSSL_PARAM *p) +{ + if (p != NULL) + p->return_size = OSSL_PARAM_UNMODIFIED; +} + int OSSL_PARAM_get_int(const OSSL_PARAM *p, int *val) { switch (sizeof(int)) { diff --git a/doc/man3/OSSL_PARAM_int.pod b/doc/man3/OSSL_PARAM_int.pod index 99e4fcf088..c7dbcbcd10 100644 --- a/doc/man3/OSSL_PARAM_int.pod +++ b/doc/man3/OSSL_PARAM_int.pod @@ -27,7 +27,7 @@ OSSL_PARAM_set_int64, OSSL_PARAM_set_long, OSSL_PARAM_set_size_t, OSSL_PARAM_set_uint, OSSL_PARAM_set_uint32, OSSL_PARAM_set_uint64, OSSL_PARAM_set_ulong, OSSL_PARAM_set_BN, OSSL_PARAM_set_utf8_string, OSSL_PARAM_set_octet_string, OSSL_PARAM_set_utf8_ptr, -OSSL_PARAM_set_octet_ptr +OSSL_PARAM_set_octet_ptr, OSSL_PARAM_UNMODIFIED - OSSL_PARAM helpers =head1 SYNOPSIS @@ -52,6 +52,8 @@ OSSL_PARAM_set_octet_ptr #define OSSL_PARAM_octet_ptr(key, address, size) #define OSSL_PARAM_END + #define OSSL_PARAM_UNMODIFIED + OSSL_PARAM OSSL_PARAM_construct_TYPE(const char *key, TYPE *buf); OSSL_PARAM OSSL_PARAM_construct_BN(const char *key, unsigned char *buf, size_t bsize); @@ -91,6 +93,9 @@ OSSL_PARAM_set_octet_ptr int OSSL_PARAM_set_octet_ptr(OSSL_PARAM *p, const void *val, size_t used_len); + int OSSL_PARAM_modified(const OSSL_PARAM *p); + void OSSL_PARAM_set_unmodified(OSSL_PARAM *p); + =head1 DESCRIPTION A collection of utility functions that simplify and add type safety to the @@ -250,6 +255,16 @@ OSSL_PARAM_set_octet_ptr() sets the OCTET string pointer in the parameter referenced by B

to the values B. The length of the OCTET string is provided by B. +The OSSL_PARAM_UNMODIFIED macro is used to detect if a parameter was set. On +creation, via either the macros or construct calls, the I field +is set to this. If the parameter is set using the calls defined herein, the +I field is changed. + +OSSL_PARAM_modified() queries if the parameter has been set or not using the +calls defined herein. + +OSSL_PARAM_set_unmodified() is used to reset unused indicator. + =head1 RETURN VALUES OSSL_PARAM_construct_TYPE(), OSSL_PARAM_construct_BN(), @@ -261,6 +276,8 @@ OSSL_PARAM_locate() and OSSL_PARAM_locate_const() return a pointer to the matching OSSL_PARAM object. They return B on error or when no object matching B exists in the B. +OSSL_PARAM_modified() returns B<1> if the parameter was set and B<0> otherwise. + All other functions return B<1> on success and B<0> on failure. =head1 NOTES diff --git a/include/openssl/params.h b/include/openssl/params.h index cd0f7846d7..441dfbbe0e 100644 --- a/include/openssl/params.h +++ b/include/openssl/params.h @@ -18,11 +18,13 @@ extern "C" { # endif +# define OSSL_PARAM_UNMODIFIED ((size_t)-1) + # define OSSL_PARAM_END \ { NULL, 0, NULL, 0, 0 } # define OSSL_PARAM_DEFN(key, type, addr, sz) \ - { (key), (type), (addr), (sz), 0 } + { (key), (type), (addr), (sz), OSSL_PARAM_UNMODIFIED } /* Basic parameter types without return sizes */ # define OSSL_PARAM_int(key, addr) \ @@ -135,6 +137,9 @@ int OSSL_PARAM_get_octet_ptr(const OSSL_PARAM *p, const void **val, int OSSL_PARAM_set_octet_ptr(OSSL_PARAM *p, const void *val, size_t used_len); +int OSSL_PARAM_modified(const OSSL_PARAM *p); +void OSSL_PARAM_set_unmodified(OSSL_PARAM *p); + # ifdef __cplusplus } # endif diff --git a/test/params_api_test.c b/test/params_api_test.c index c403f39abd..d01044d0eb 100644 --- a/test/params_api_test.c +++ b/test/params_api_test.c @@ -69,6 +69,7 @@ static int test_param_type_extra(OSSL_PARAM *param, const unsigned char *cmp, const int sizet = bit32 && sizeof(size_t) > sizeof(int32_t); const int signd = param->data_type == OSSL_PARAM_INTEGER; + OSSL_PARAM_set_unmodified(param); if (signd) { if ((bit32 && !TEST_true(OSSL_PARAM_get_int32(param, &i32))) || !TEST_true(OSSL_PARAM_get_int64(param, &i64))) @@ -80,6 +81,8 @@ static int test_param_type_extra(OSSL_PARAM *param, const unsigned char *cmp, || (sizet && !TEST_true(OSSL_PARAM_get_size_t(param, &s)))) return 0; } + if (!TEST_false(OSSL_PARAM_modified(param))) + return 0; /* Check signed types */ if (bit32) { @@ -112,6 +115,8 @@ static int test_param_type_extra(OSSL_PARAM *param, const unsigned char *cmp, || !TEST_size_t_eq((size_t)i64, 12345)) return 0; } + if (!TEST_true(OSSL_PARAM_modified(param))) + return 0; } return 1; } diff --git a/test/params_test.c b/test/params_test.c index 339a51694f..5ed7d36a1e 100644 --- a/test/params_test.c +++ b/test/params_test.c @@ -467,8 +467,7 @@ static int test_case_variant(OSSL_PARAM *params, const struct provider_dispatch_ || !TEST_size_t_eq(p->return_size, sizeof(p6_init)) /* "provider" value */ || !TEST_str_eq(app_p6, p6_init) /* "provider" value */ || !TEST_char_eq(foo[0], app_foo_init) /* Should remain untouched */ - || !TEST_ptr(p = OSSL_PARAM_locate(params, "foo")) - || !TEST_int_eq(p->return_size, 0)) + || !TEST_ptr(p = OSSL_PARAM_locate(params, "foo"))) errcnt++; /* @@ -519,8 +518,7 @@ static int test_case_variant(OSSL_PARAM *params, const struct provider_dispatch_ sizeof(app_p6_init)) /* app value */ || !TEST_str_eq(app_p6, app_p6_init) /* app value */ || !TEST_char_eq(foo[0], app_foo_init) /* Should remain untouched */ - || !TEST_ptr(p = OSSL_PARAM_locate(params, "foo")) - || !TEST_int_eq(p->return_size, 0)) + || !TEST_ptr(p = OSSL_PARAM_locate(params, "foo"))) errcnt++; fin: diff --git a/util/libcrypto.num b/util/libcrypto.num index 76855981b9..dbaea8c716 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -5077,3 +5077,5 @@ X509_REQ_verify_ex ? 3_0_0 EXIST::FUNCTION: X509_ALGOR_copy ? 3_0_0 EXIST::FUNCTION: X509_REQ_set0_signature ? 3_0_0 EXIST::FUNCTION: X509_REQ_set1_signature_algo ? 3_0_0 EXIST::FUNCTION: +OSSL_PARAM_modified ? 3_0_0 EXIST::FUNCTION: +OSSL_PARAM_set_unmodified ? 3_0_0 EXIST::FUNCTION: -- 2.25.1