[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