2 * Copyright 2021 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include "internal/propertyerr.h"
11 #include "internal/property.h"
12 #include "property_local.h"
14 static int property_idx_cmp(const void *keyp
, const void *compare
)
16 OSSL_PROPERTY_IDX key
= *(const OSSL_PROPERTY_IDX
*)keyp
;
17 const OSSL_PROPERTY_DEFINITION
*defn
=
18 (const OSSL_PROPERTY_DEFINITION
*)compare
;
20 return key
- defn
->name_idx
;
23 const OSSL_PROPERTY_DEFINITION
*
24 ossl_property_find_property(const OSSL_PROPERTY_LIST
*list
,
25 OSSL_LIB_CTX
*libctx
, const char *name
)
27 OSSL_PROPERTY_IDX name_idx
;
29 if (list
== NULL
|| name
== NULL
30 || (name_idx
= ossl_property_name(libctx
, name
, 0)) == 0)
33 return ossl_bsearch(&name_idx
, list
->properties
, list
->num_properties
,
34 sizeof(*list
->properties
), &property_idx_cmp
, 0);
37 OSSL_PROPERTY_TYPE
ossl_property_get_type(const OSSL_PROPERTY_DEFINITION
*prop
)
42 const char *ossl_property_get_string_value(OSSL_LIB_CTX
*libctx
,
43 const OSSL_PROPERTY_DEFINITION
*prop
)
45 const char *value
= NULL
;
47 if (prop
!= NULL
&& prop
->type
== OSSL_PROPERTY_TYPE_STRING
)
48 value
= ossl_property_value_str(libctx
, prop
->v
.str_val
);
52 int64_t ossl_property_get_number_value(const OSSL_PROPERTY_DEFINITION
*prop
)
56 if (prop
!= NULL
&& prop
->type
== OSSL_PROPERTY_TYPE_NUMBER
)
57 value
= prop
->v
.int_val
;
61 /* Does a property query have any optional clauses */
62 int ossl_property_has_optional(const OSSL_PROPERTY_LIST
*query
)
64 return query
->has_optional
? 1 : 0;
67 int ossl_property_is_enabled(OSSL_LIB_CTX
*ctx
, const char *property_name
,
68 const OSSL_PROPERTY_LIST
*prop_list
)
70 const OSSL_PROPERTY_DEFINITION
*prop
;
72 prop
= ossl_property_find_property(prop_list
, ctx
, property_name
);
73 /* Do a separate check for override as it does not set type */
74 if (prop
== NULL
|| prop
->optional
|| prop
->oper
== OSSL_PROPERTY_OVERRIDE
)
76 return (prop
->type
== OSSL_PROPERTY_TYPE_STRING
77 && ((prop
->oper
== OSSL_PROPERTY_OPER_EQ
78 && prop
->v
.str_val
== OSSL_PROPERTY_TRUE
)
79 || (prop
->oper
== OSSL_PROPERTY_OPER_NE
80 && prop
->v
.str_val
!= OSSL_PROPERTY_TRUE
)));