property: Move global default properties to the library context.
[openssl.git] / crypto / evp / evp_fetch.c
index ca06b5786405fdaf15a2393d2877a0037436aa65..f63e135d3ab3bcb190a56d7f2a0fa3d80964938e 100644 (file)
@@ -301,7 +301,7 @@ void *evp_generic_fetch(OPENSSL_CTX *libctx, int operation_id,
     if (ret == NULL) {
         int code = EVP_R_FETCH_FAILED;
 
-#ifdef FIPS_MODE
+#ifdef FIPS_MODULE
         ERR_raise(ERR_LIB_EVP, code);
 #else
         ERR_raise_data(ERR_LIB_EVP, code,
@@ -339,7 +339,7 @@ void *evp_generic_fetch_by_number(OPENSSL_CTX *libctx, int operation_id,
     if (ret == NULL) {
         int code = EVP_R_FETCH_FAILED;
 
-#ifdef FIPS_MODE
+#ifdef FIPS_MODULE
         ERR_raise(ERR_LIB_EVP, code);
 #else
         {
@@ -361,16 +361,78 @@ void *evp_generic_fetch_by_number(OPENSSL_CTX *libctx, int operation_id,
     return ret;
 }
 
-int EVP_set_default_properties(OPENSSL_CTX *libctx, const char *propq)
+static int evp_set_default_properties(OPENSSL_CTX *libctx,
+                                      OSSL_PROPERTY_LIST *def_prop)
 {
     OSSL_METHOD_STORE *store = get_evp_method_store(libctx);
-
-    if (store != NULL)
-        return ossl_method_store_set_global_properties(store, propq);
-    EVPerr(EVP_F_EVP_SET_DEFAULT_PROPERTIES, ERR_R_INTERNAL_ERROR);
+    OSSL_PROPERTY_LIST **plp = ossl_ctx_global_properties(libctx);
+
+    if (plp != NULL) {
+        ossl_property_free(*plp);
+        *plp = def_prop;
+        if (store != NULL)
+            ossl_method_store_flush_cache(store);
+        return 1;
+    }
+    EVPerr(0, ERR_R_INTERNAL_ERROR);
     return 0;
 }
 
+int EVP_set_default_properties(OPENSSL_CTX *libctx, const char *propq)
+{
+    OSSL_PROPERTY_LIST *pl = NULL;
+
+    if (propq != NULL && (pl = ossl_parse_query(libctx, propq)) == NULL) {
+        EVPerr(0, EVP_R_DEFAULT_QUERY_PARSE_ERROR);
+        return 0;
+    }
+    return evp_set_default_properties(libctx, pl);
+}
+
+
+static int evp_default_properties_merge(OPENSSL_CTX *libctx, const char *propq)
+{
+    OSSL_PROPERTY_LIST **plp = ossl_ctx_global_properties(libctx);
+    OSSL_PROPERTY_LIST *pl1, *pl2;
+
+    if (propq == NULL)
+        return 1;
+    if (plp == NULL || *plp == NULL)
+        return EVP_set_default_properties(libctx, propq);
+    if ((pl1 = ossl_parse_query(libctx, propq)) == NULL) {
+        EVPerr(0, EVP_R_DEFAULT_QUERY_PARSE_ERROR);
+        return 0;
+    }
+    pl2 = ossl_property_merge(pl1, *plp);
+    ossl_property_free(pl1);
+    if (pl2 == NULL) {
+        EVPerr(0, ERR_R_MALLOC_FAILURE);
+        return 0;
+    }
+    return evp_set_default_properties(libctx, pl2);
+}
+
+static int evp_default_property_is_enabled(OPENSSL_CTX *libctx,
+                                           const char *prop_name)
+{
+    OSSL_PROPERTY_LIST **plp = ossl_ctx_global_properties(libctx);
+
+    return plp != NULL && ossl_property_is_enabled(libctx, prop_name, *plp);
+}
+
+int EVP_default_properties_is_fips_enabled(OPENSSL_CTX *libctx)
+{
+    return evp_default_property_is_enabled(libctx, "fips");
+}
+
+int EVP_default_properties_enable_fips(OPENSSL_CTX *libctx, int enable)
+{
+    const char *query = (enable != 0) ? "fips=yes" : "-fips";
+
+    return evp_default_properties_merge(libctx, query);
+}
+
+
 struct do_all_data_st {
     void (*user_fn)(void *method, void *arg);
     void *user_arg;
@@ -412,7 +474,13 @@ void evp_generic_do_all(OPENSSL_CTX *libctx, int operation_id,
     data.free_method = free_method;
     data.user_fn = user_fn;
     data.user_arg = user_arg;
-    ossl_algorithm_do_all(libctx, operation_id, NULL, do_one, &data);
+
+    /*
+     * No pre- or post-condition for this call, as this only creates methods
+     * temporarly and then promptly destroys them.
+     */
+    ossl_algorithm_do_all(libctx, operation_id, NULL, NULL, do_one, NULL,
+                          &data);
 }
 
 const char *evp_first_name(const OSSL_PROVIDER *prov, int name_id)