[openssl] master update

Dr. Paul Dale pauli at openssl.org
Sat Jun 5 10:48:26 UTC 2021


The branch master has been updated
       via  76157664c1eb0f8d9f4e50c4bff8c521f7318b44 (commit)
       via  fce102304a340ef1a90361a03c86bd2401f0b6c3 (commit)
       via  fa95fc1eb5eb7e84523f09248c0ce7f771cfdf58 (commit)
      from  6a5f97a671de6d4d9f0cd6f6fc23ad89ca4ad69f (commit)


- Log -----------------------------------------------------------------
commit 76157664c1eb0f8d9f4e50c4bff8c521f7318b44
Author: Pauli <pauli at openssl.org>
Date:   Fri Jun 4 14:35:53 2021 +1000

    property: move additional query functions to property_query.c
    
    Reviewed-by: Tomas Mraz <tomas at openssl.org>
    Reviewed-by: Matt Caswell <matt at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/15614)

commit fce102304a340ef1a90361a03c86bd2401f0b6c3
Author: Pauli <pauli at openssl.org>
Date:   Fri Jun 4 14:25:14 2021 +1000

    property: improve ossl_property_find_property() function
    
    This function searches a property list for a specific property and returns
    a pointer to the definition if found.  The existing version was O(n) time,
    the improved O(log n).
    
    Reviewed-by: Tomas Mraz <tomas at openssl.org>
    Reviewed-by: Matt Caswell <matt at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/15614)

commit fa95fc1eb5eb7e84523f09248c0ce7f771cfdf58
Author: Pauli <pauli at openssl.org>
Date:   Fri Jun 4 13:19:23 2021 +1000

    Rename `n` field to `num_properties` in property definition structure.
    
    Reviewed-by: Tomas Mraz <tomas at openssl.org>
    Reviewed-by: Matt Caswell <matt at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/15614)

-----------------------------------------------------------------------

Summary of changes:
 crypto/property/build.info       |  1 -
 crypto/property/property_local.h |  4 ++-
 crypto/property/property_parse.c | 59 ++++++++--------------------------------
 crypto/property/property_query.c | 39 ++++++++++++++++++++++----
 4 files changed, 49 insertions(+), 54 deletions(-)

diff --git a/crypto/property/build.info b/crypto/property/build.info
index dac9ab7a3b..12a6b8c9de 100644
--- a/crypto/property/build.info
+++ b/crypto/property/build.info
@@ -2,4 +2,3 @@ LIBS=../../libcrypto
 $COMMON=property_string.c property_parse.c property_query.c property.c defn_cache.c
 SOURCE[../../libcrypto]=$COMMON property_err.c
 SOURCE[../../providers/libfips.a]=$COMMON
-SOURCE[../../providers/liblegacy.a]=$COMMON
diff --git a/crypto/property/property_local.h b/crypto/property/property_local.h
index db1b0a5ee4..46c5dbe3cc 100644
--- a/crypto/property/property_local.h
+++ b/crypto/property/property_local.h
@@ -29,11 +29,13 @@ struct ossl_property_definition_st {
 };
 
 struct ossl_property_list_st {
-    int n;
+    int num_properties;
     unsigned int has_optional : 1;
     OSSL_PROPERTY_DEFINITION properties[1];
 };
 
+extern OSSL_PROPERTY_IDX ossl_property_true, ossl_property_false;
+
 /* Property string functions */
 OSSL_PROPERTY_IDX ossl_property_name(OSSL_LIB_CTX *ctx, const char *s,
                                      int create);
diff --git a/crypto/property/property_parse.c b/crypto/property/property_parse.c
index 149e1956b7..21228b4a39 100644
--- a/crypto/property/property_parse.c
+++ b/crypto/property/property_parse.c
@@ -19,7 +19,7 @@
 #include "property_local.h"
 #include "e_os.h"
 
-static OSSL_PROPERTY_IDX ossl_property_true, ossl_property_false;
+OSSL_PROPERTY_IDX ossl_property_true, ossl_property_false;
 
 DEFINE_STACK_OF(OSSL_PROPERTY_DEFINITION)
 
@@ -295,7 +295,7 @@ stack_to_property_list(STACK_OF(OSSL_PROPERTY_DEFINITION) *sk)
             r->properties[i] = *sk_OSSL_PROPERTY_DEFINITION_value(sk, i);
             r->has_optional |= r->properties[i].optional;
         }
-        r->n = n;
+        r->num_properties = n;
     }
     return r;
 }
@@ -422,41 +422,6 @@ err:
     return res;
 }
 
-/* Does a property query have any optional clauses */
-int ossl_property_has_optional(const OSSL_PROPERTY_LIST *query)
-{
-    return query->has_optional ? 1 : 0;
-}
-
-int ossl_property_is_enabled(OSSL_LIB_CTX *ctx,  const char *property_name,
-                             const OSSL_PROPERTY_LIST *prop_list)
-{
-    int i;
-    OSSL_PROPERTY_IDX name_id;
-    const OSSL_PROPERTY_DEFINITION *prop = NULL;
-
-    if (prop_list == NULL)
-        return 0;
-
-    if (!parse_name(ctx, &property_name, 0, &name_id))
-        return 0;
-
-    prop = prop_list->properties;
-    for (i = 0; i < prop_list->n; ++i) {
-        if (prop[i].name_idx == name_id) {
-            /* Do a separate check for override as it does not set type */
-            if (prop[i].optional || prop[i].oper == OSSL_PROPERTY_OVERRIDE)
-                return 0;
-            return (prop[i].type == OSSL_PROPERTY_TYPE_STRING
-                    && ((prop[i].oper == OSSL_PROPERTY_OPER_EQ
-                             && prop[i].v.str_val == ossl_property_true)
-                         || (prop[i].oper == OSSL_PROPERTY_OPER_NE
-                             && prop[i].v.str_val != ossl_property_true)));
-        }
-    }
-    return 0;
-}
-
 /*
  * Compare a query against a definition.
  * Return the number of clauses matched or -1 if a mandatory clause is false.
@@ -469,12 +434,12 @@ int ossl_property_match_count(const OSSL_PROPERTY_LIST *query,
     int i = 0, j = 0, matches = 0;
     OSSL_PROPERTY_OPER oper;
 
-    while (i < query->n) {
+    while (i < query->num_properties) {
         if ((oper = q[i].oper) == OSSL_PROPERTY_OVERRIDE) {
             i++;
             continue;
         }
-        if (j < defn->n) {
+        if (j < defn->num_properties) {
             if (q[i].name_idx > d[j].name_idx) {  /* skip defn, not in query */
                 j++;
                 continue;
@@ -536,7 +501,7 @@ OSSL_PROPERTY_LIST *ossl_property_merge(const OSSL_PROPERTY_LIST *a,
     const OSSL_PROPERTY_DEFINITION *copy;
     OSSL_PROPERTY_LIST *r;
     int i, j, n;
-    const int t = a->n + b->n;
+    const int t = a->num_properties + b->num_properties;
 
     r = OPENSSL_malloc(sizeof(*r)
                        + (t == 0 ? 0 : t - 1) * sizeof(r->properties[0]));
@@ -544,10 +509,10 @@ OSSL_PROPERTY_LIST *ossl_property_merge(const OSSL_PROPERTY_LIST *a,
         return NULL;
 
     r->has_optional = 0;
-    for (i = j = n = 0; i < a->n || j < b->n; n++) {
-        if (i >= a->n) {
+    for (i = j = n = 0; i < a->num_properties || j < b->num_properties; n++) {
+        if (i >= a->num_properties) {
             copy = &bp[j++];
-        } else if (j >= b->n) {
+        } else if (j >= b->num_properties) {
             copy = &ap[i++];
         } else if (ap[i].name_idx <= bp[j].name_idx) {
             if (ap[i].name_idx == bp[j].name_idx)
@@ -559,7 +524,7 @@ OSSL_PROPERTY_LIST *ossl_property_merge(const OSSL_PROPERTY_LIST *a,
         memcpy(r->properties + n, copy, sizeof(r->properties[0]));
         r->has_optional |= copy->optional;
     }
-    r->n = n;
+    r->num_properties = n;
     if (n != t)
         r = OPENSSL_realloc(r, sizeof(*r) + (n - 1) * sizeof(r->properties[0]));
     return r;
@@ -672,9 +637,9 @@ size_t ossl_property_list_to_string(OSSL_LIB_CTX *ctx,
             *buf = '\0';
         return 1;
     }
-    if (list->n != 0)
-        prop = &list->properties[list->n - 1];
-    for (i = 0; i < list->n; i++, prop--) {
+    if (list->num_properties != 0)
+        prop = &list->properties[list->num_properties - 1];
+    for (i = 0; i < list->num_properties; i++, prop--) {
         /* Skip invalid names */
         if (prop->name_idx == 0)
             continue;
diff --git a/crypto/property/property_query.c b/crypto/property/property_query.c
index dfcb034042..1352bc009e 100644
--- a/crypto/property/property_query.c
+++ b/crypto/property/property_query.c
@@ -11,21 +11,27 @@
 #include "internal/property.h"
 #include "property_local.h"
 
+static int property_idx_cmp(const void *keyp, const void *compare)
+{
+    OSSL_PROPERTY_IDX key = *(const OSSL_PROPERTY_IDX *)keyp;
+    const OSSL_PROPERTY_DEFINITION *defn =
+            (const OSSL_PROPERTY_DEFINITION *)compare;
+
+    return key - defn->name_idx;
+}
+
 const OSSL_PROPERTY_DEFINITION *
 ossl_property_find_property(const OSSL_PROPERTY_LIST *list,
                             OSSL_LIB_CTX *libctx, const char *name)
 {
     OSSL_PROPERTY_IDX name_idx;
-    int i;
 
     if (list == NULL || name == NULL
         || (name_idx = ossl_property_name(libctx, name, 0)) == 0)
         return NULL;
 
-    for (i = 0; i < list->n; i++)
-        if (list->properties[i].name_idx == name_idx)
-            return &list->properties[i];
-    return NULL;
+    return ossl_bsearch(&name_idx, list->properties, list->num_properties,
+                        sizeof(*list->properties), &property_idx_cmp, 0);
 }
 
 OSSL_PROPERTY_TYPE ossl_property_get_type(const OSSL_PROPERTY_DEFINITION *prop)
@@ -51,3 +57,26 @@ int64_t ossl_property_get_number_value(const OSSL_PROPERTY_DEFINITION *prop)
         value = prop->v.int_val;
     return value;
 }
+
+/* Does a property query have any optional clauses */
+int ossl_property_has_optional(const OSSL_PROPERTY_LIST *query)
+{
+    return query->has_optional ? 1 : 0;
+}
+
+int ossl_property_is_enabled(OSSL_LIB_CTX *ctx,  const char *property_name,
+                             const OSSL_PROPERTY_LIST *prop_list)
+{
+    const OSSL_PROPERTY_DEFINITION *prop;
+
+    prop = ossl_property_find_property(prop_list, ctx, property_name);
+    /* Do a separate check for override as it does not set type */
+    if (prop == NULL || prop->optional || prop->oper == OSSL_PROPERTY_OVERRIDE)
+        return 0;
+    return (prop->type == OSSL_PROPERTY_TYPE_STRING
+            && ((prop->oper == OSSL_PROPERTY_OPER_EQ
+                     && prop->v.str_val == ossl_property_true)
+                 || (prop->oper == OSSL_PROPERTY_OPER_NE
+                     && prop->v.str_val != ossl_property_true)));
+}
+


More information about the openssl-commits mailing list