Implement OSSL_PROVIDER_get0_default_search_path, add docs and tests.
authorPatrick Mills <patrick.mills@cerberusftp.com>
Wed, 23 Nov 2022 20:08:51 +0000 (15:08 -0500)
committerTomas Mraz <tomas@openssl.org>
Tue, 6 Dec 2022 17:24:06 +0000 (18:24 +0100)
Reviewed-by: Todd Short <todd.short@me.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19752)

crypto/provider_core.c
doc/man3/OSSL_PROVIDER.pod
include/openssl/provider.h
test/build.info
test/provider_default_search_path_test.c [new file with mode: 0644]
test/recipes/04-test_provider_default_search_path.t [new file with mode: 0644]
util/libcrypto.num

index c05b2f5496e73feb46d472901eebdfd90cf5fac8..4c93abb98204a2c822e46d3d2a202840e37ac7dc 100644 (file)
@@ -816,6 +816,19 @@ int OSSL_PROVIDER_set_default_search_path(OSSL_LIB_CTX *libctx,
     return 0;
 }
 
+const char *OSSL_PROVIDER_get0_default_search_path(OSSL_LIB_CTX *libctx)
+{
+    struct provider_store_st *store;
+    char *path = NULL;
+
+    if ((store = get_provider_store(libctx)) != NULL
+            && CRYPTO_THREAD_read_lock(store->default_path_lock)) {
+        path = store->default_path;
+        CRYPTO_THREAD_unlock(store->default_path_lock);
+    }
+    return path;
+}
+
 /*
  * Internal version that doesn't affect the store flags, and thereby avoid
  * locking.  Direct callers must remember to set the store flags when
index 715aa10b1ff450a0d27f90a5418d9f9b46790559..cefb4a74c0733415247b29f3a645ab7712c4331f 100644 (file)
@@ -3,6 +3,7 @@
 =head1 NAME
 
 OSSL_PROVIDER_set_default_search_path,
+OSSL_PROVIDER_get0_default_search_path,
 OSSL_PROVIDER, OSSL_PROVIDER_load, OSSL_PROVIDER_try_load, OSSL_PROVIDER_unload,
 OSSL_PROVIDER_available, OSSL_PROVIDER_do_all,
 OSSL_PROVIDER_gettable_params, OSSL_PROVIDER_get_params,
@@ -20,6 +21,7 @@ OSSL_PROVIDER_self_test
 
  int OSSL_PROVIDER_set_default_search_path(OSSL_LIB_CTX *libctx,
                                            const char *path);
+ const char *OSSL_PROVIDER_get0_default_search_path(OSSL_LIB_CTX *libctx);
 
  OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *libctx, const char *name);
  OSSL_PROVIDER *OSSL_PROVIDER_try_load(OSSL_LIB_CTX *libctx, const char *name,
@@ -72,6 +74,11 @@ that is to be used for looking for providers in the specified I<libctx>.
 If left unspecified, an environment variable and a fall back default value will
 be used instead.
 
+OSSL_PROVIDER_get0_default_search_path() retrieves the default search I<path>
+that is to be used for looking for providers in the specified I<libctx>.
+If successful returns the path or empty string; the path is valid until the
+context is released or OSSL_PROVIDER_set_default_search_path() is called.
+
 OSSL_PROVIDER_add_builtin() is used to add a built in provider to
 B<OSSL_PROVIDER> store in the given library context, by associating a
 provider name with a provider initialization function.
@@ -161,6 +168,9 @@ OSSL_PROVIDER_set_default_search_path(), OSSL_PROVIDER_add(),
 OSSL_PROVIDER_unload(), OSSL_PROVIDER_get_params() and
 OSSL_PROVIDER_get_capabilities() return 1 on success, or 0 on error.
 
+OSSL_PROVIDER_get0_default_search_path() returns a pointer to a path on success,
+or NULL on error or if the path has not previously been set.
+
 OSSL_PROVIDER_load() and OSSL_PROVIDER_try_load() return a pointer to a
 provider object on success, or NULL on error.
 
index dc86ff5878c97cbefceb6e3ae537a0bc930d32bc..088e74038e4761cf761c02e31d5679daa75c1ff7 100644 (file)
@@ -17,8 +17,9 @@
 extern "C" {
 # endif
 
-/* Set the default provider search path */
+/* Set and Get a library context search path */
 int OSSL_PROVIDER_set_default_search_path(OSSL_LIB_CTX *, const char *path);
+const char *OSSL_PROVIDER_get0_default_search_path(OSSL_LIB_CTX *libctx);
 
 /* Load and unload a provider */
 OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *, const char *name);
index fb6a4551db94bed4a14fa89b607099ea227d64cb..0722eff32d4c6ad9849efd0e255e35a7fbf5078b 100644 (file)
@@ -979,6 +979,11 @@ IF[{- !$disabled{tests} -}]
   INCLUDE[provider_pkey_test]=../include ../apps/include
   DEPEND[provider_pkey_test]=../libcrypto libtestutil.a
 
+  PROGRAMS{noinst}=provider_default_search_path_test
+  SOURCE[provider_default_search_path_test]=provider_default_search_path_test.c
+  INCLUDE[provider_default_search_path_test]=../include ../apps/include
+  DEPEND[provider_default_search_path_test]=../libcrypto libtestutil.a
+
   PROGRAMS{noinst}=params_test
   SOURCE[params_test]=params_test.c
   INCLUDE[params_test]=.. ../include ../apps/include
diff --git a/test/provider_default_search_path_test.c b/test/provider_default_search_path_test.c
new file mode 100644 (file)
index 0000000..684a508
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License").  You may not use
+ * this file except in compliance with the License.  You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include <stddef.h>
+#include <openssl/provider.h>
+#include "testutil.h"
+
+static int test_default_libctx(void)
+{
+    OSSL_LIB_CTX *ctx = NULL;
+    char *path = "./some/path";
+    const char *retrieved_path = NULL;
+    int ok;
+
+    ok = TEST_true(OSSL_PROVIDER_set_default_search_path(ctx, path))
+        && TEST_ptr(retrieved_path = OSSL_PROVIDER_get0_default_search_path(ctx))
+        && TEST_str_eq(path, retrieved_path);
+
+    return ok;
+}
+
+static int test_explicit_libctx(void)
+{
+    OSSL_LIB_CTX *ctx = NULL;
+    char *def_libctx_path = "./some/path";
+    char *path = "./another/location";
+    const char *retrieved_defctx_path = NULL;
+    const char *retrieved_path = NULL;
+    int ok;
+
+         /* Set search path for default context, then create a new context and set
+            another path for it. Finally, get both paths and make sure they are
+            still what we set and are separate. */
+    ok = TEST_true(OSSL_PROVIDER_set_default_search_path(NULL, def_libctx_path))
+        && TEST_ptr(ctx = OSSL_LIB_CTX_new())
+        && TEST_true(OSSL_PROVIDER_set_default_search_path(ctx, path))
+        && TEST_ptr(retrieved_defctx_path = OSSL_PROVIDER_get0_default_search_path(NULL))
+        && TEST_str_eq(def_libctx_path, retrieved_defctx_path)
+        && TEST_ptr(retrieved_path = OSSL_PROVIDER_get0_default_search_path(ctx))
+        && TEST_str_eq(path, retrieved_path)
+        && TEST_str_ne(retrieved_path, retrieved_defctx_path);
+
+    OSSL_LIB_CTX_free(ctx);
+    return ok;
+}
+
+int setup_tests(void)
+{
+    ADD_TEST(test_default_libctx);
+    ADD_TEST(test_explicit_libctx);
+    return 1;
+}
+
diff --git a/test/recipes/04-test_provider_default_search_path.t b/test/recipes/04-test_provider_default_search_path.t
new file mode 100644 (file)
index 0000000..29797e6
--- /dev/null
@@ -0,0 +1,18 @@
+#! /usr/bin/env perl
+# Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the Apache License 2.0 (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
+use strict;
+use File::Spec;
+use OpenSSL::Test::Simple;
+
+# We must ensure that OPENSSL_CONF points at an empty file.  Otherwise, we
+# risk that the configuration file contains statements that load providers,
+# which defeats the purpose of this test.  The NUL device is good enough.
+$ENV{OPENSSL_CONF} = File::Spec->devnull();
+
+simple_test("test_provider_default_search_path", "provider_default_search_path_test");
index 9820f4424035dec218948c363b3cbc5430938aa0..f4b7c95e55af92d4294996be44b6b2c9d7dcc721 100644 (file)
@@ -5505,3 +5505,4 @@ OSSL_HPKE_open                          ? 3_2_0   EXIST::FUNCTION:
 OSSL_HPKE_CTX_get_seq                   ?      3_2_0   EXIST::FUNCTION:
 OSSL_HPKE_CTX_set_seq                   ?      3_2_0   EXIST::FUNCTION:
 OSSL_HPKE_get_recommended_ikmelen       ?      3_2_0   EXIST::FUNCTION:
+OSSL_PROVIDER_get0_default_search_path  ?      3_2_0   EXIST::FUNCTION: