[openssl] master update
Dr. Paul Dale
pauli at openssl.org
Wed Apr 22 03:57:28 UTC 2020
The branch master has been updated
via 8d5fb6485282c79bfe9f1ebab14eab515910e370 (commit)
from 07caec83b81859ea9aa2d5075a394aa48c4e5fae (commit)
- Log -----------------------------------------------------------------
commit 8d5fb6485282c79bfe9f1ebab14eab515910e370
Author: Pauli <paul.dale at oracle.com>
Date: Tue Apr 21 10:49:19 2020 +1000
params: add functionality to test if an OSSL_PARAM has been set.
Reviewed-by: Richard Levitte <levitte at openssl.org>
(Merged from https://github.com/openssl/openssl/pull/11588)
-----------------------------------------------------------------------
Summary of changes:
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<p> to the values B<val>.
The length of the OCTET string is provided by B<used_len>.
+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<return_size> field
+is set to this. If the parameter is set using the calls defined herein, the
+I<return_size> 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<NULL> on error or when
no object matching B<key> exists in the B<array>.
+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:
More information about the openssl-commits
mailing list