diff options
Diffstat (limited to 'p11-kit')
-rw-r--r-- | p11-kit/Makefile.am | 58 | ||||
-rw-r--r-- | p11-kit/client-init.c | 109 | ||||
-rw-r--r-- | p11-kit/client.c | 215 | ||||
-rw-r--r-- | p11-kit/client.h | 41 | ||||
-rw-r--r-- | p11-kit/modules.c | 10 | ||||
-rw-r--r-- | p11-kit/proxy-init.c | 98 | ||||
-rw-r--r-- | p11-kit/remote.c | 2 | ||||
-rw-r--r-- | p11-kit/util.c | 57 |
8 files changed, 521 insertions, 69 deletions
diff --git a/p11-kit/Makefile.am b/p11-kit/Makefile.am index d53f51c..e30c431 100644 --- a/p11-kit/Makefile.am +++ b/p11-kit/Makefile.am @@ -8,7 +8,7 @@ inc_HEADERS += \ p11-kit/uri.h \ $(NULL) -MODULE_SRCS = \ +COMMON_SRCS = \ p11-kit/util.c \ p11-kit/conf.c p11-kit/conf.h \ p11-kit/iter.c \ @@ -19,7 +19,6 @@ MODULE_SRCS = \ p11-kit/pin.c \ p11-kit/pkcs11.h \ p11-kit/private.h \ - p11-kit/proxy.c p11-kit/proxy.h \ p11-kit/messages.c \ p11-kit/rpc-transport.c p11-kit/rpc.h \ p11-kit/rpc-message.c p11-kit/rpc-message.h \ @@ -32,7 +31,7 @@ MODULE_SRCS = \ lib_LTLIBRARIES += \ libp11-kit.la -libp11_kit_la_CFLAGS = \ +COMMON_CFLAGS = \ -DP11_SYSTEM_CONFIG_FILE=\""$(p11_system_config_file)"\" \ -DP11_SYSTEM_CONFIG_MODULES=\""$(p11_system_config_modules)"\" \ -DP11_PACKAGE_CONFIG_MODULES=\""$(p11_package_config_modules)"\" \ @@ -42,26 +41,44 @@ libp11_kit_la_CFLAGS = \ $(LIBFFI_CFLAGS) \ $(NULL) +COMMON_LIBS = \ + libp11-common.la \ + libp11-library.la \ + $(LIBFFI_LIBS) \ + $(LTLIBINTL) \ + $(NULL) + +libp11_kit_la_CFLAGS = $(COMMON_CFLAGS) + libp11_kit_la_LDFLAGS = \ -no-undefined \ -version-info $(P11KIT_LT_RELEASE) \ -export-symbols-regex '^C_GetFunctionList|^p11_kit_' -libp11_kit_la_SOURCES = $(MODULE_SRCS) +libp11_kit_la_SOURCES = \ + p11-kit/proxy.c p11-kit/proxy.h p11-kit/proxy-init.c + $(NULL) libp11_kit_la_LIBADD = \ - libp11-common.la \ - libp11-library.la \ - $(LIBFFI_LIBS) \ - $(LTLIBINTL) \ + libp11-kit-internal.la \ + $(COMMON_LIBS) \ $(NULL) noinst_LTLIBRARIES += \ - libp11-kit-testable.la + libp11-kit-internal.la \ + libp11-kit-testable.la \ + $(NULL) + +libp11_kit_internal_la_LDFLAGS = -no-undefined +libp11_kit_internal_la_CFLAGS = $(COMMON_CFLAGS) +libp11_kit_internal_la_SOURCES = $(COMMON_SRCS) libp11_kit_testable_la_LDFLAGS = -no-undefined -libp11_kit_testable_la_SOURCES = $(MODULE_SRCS) -libp11_kit_testable_la_LIBADD = $(libp11_kit_la_LIBADD) +libp11_kit_testable_la_SOURCES = \ + $(libp11_kit_internal_la_SOURCES) \ + $(libp11_kit_la_SOURCES) \ + $(NULL) +libp11_kit_testable_la_LIBADD = $(COMMON_LIBS) if OS_WIN32 @@ -112,6 +129,25 @@ systemduser_DATA = \ p11-kit/p11-kit-remote.socket \ p11-kit/p11-kit-remote@.service +if !OS_WIN32 +module_LTLIBRARIES += \ + p11-kit-client.la + +p11_kit_client_la_LDFLAGS = \ + -no-undefined -module -avoid-version \ + -version-info $(P11KIT_LT_RELEASE) \ + -export-symbols-regex '^C_GetFunctionList' \ + $(NULL) + +p11_kit_client_la_CFLAGS = $(COMMON_CFLAGS) + +p11_kit_client_la_SOURCES = \ + p11-kit/client.c p11-kit/client.h p11-kit/client-init.c \ + $(NULL) + +p11_kit_client_la_LIBADD = $(libp11_kit_la_LIBADD) +endif + pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = p11-kit/p11-kit-1.pc diff --git a/p11-kit/client-init.c b/p11-kit/client-init.c new file mode 100644 index 0000000..d016053 --- /dev/null +++ b/p11-kit/client-init.c @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2011 Collabora Ltd + * Copyright (c) 2012 Stef Walter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * + * CONTRIBUTORS + * Stef Walter <stef@thewalter.net> + */ + +#include "config.h" + +#include "client.h" +#include "library.h" +#include "pkcs11.h" + +/* p11_proxy_module_check() is defined as a weak symbol in modules.c */ +#ifndef __GNUC__ +bool p11_proxy_module_check (CK_FUNCTION_LIST_PTR module); + +bool +p11_proxy_module_check (CK_FUNCTION_LIST_PTR module) +{ + return false; +} +#endif + +#ifdef OS_UNIX + +void _p11_kit_init (void); + +void _p11_kit_fini (void); + +#ifdef __GNUC__ +__attribute__((constructor)) +#endif +void +_p11_kit_init (void) +{ + p11_library_init_once (); +} + +#ifdef __GNUC__ +__attribute__((destructor)) +#endif +void +_p11_kit_fini (void) +{ + p11_client_module_cleanup (); + p11_library_uninit (); +} + +#endif /* OS_UNIX */ + +#ifdef OS_WIN32 + +BOOL WINAPI DllMain (HINSTANCE, DWORD, LPVOID); + +BOOL WINAPI +DllMain (HINSTANCE instance, + DWORD reason, + LPVOID reserved) +{ + switch (reason) { + case DLL_PROCESS_ATTACH: + p11_library_init (); + break; + case DLL_THREAD_DETACH: + p11_library_thread_cleanup (); + break; + case DLL_PROCESS_DETACH: + p11_client_module_cleanup (); + p11_library_uninit (); + break; + default: + break; + } + + return TRUE; +} + +#endif /* OS_WIN32 */ diff --git a/p11-kit/client.c b/p11-kit/client.c new file mode 100644 index 0000000..75aebe8 --- /dev/null +++ b/p11-kit/client.c @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2016 Red Hat Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * Author: Daiki Ueno + */ + +#include "config.h" + +#include "client.h" +#include "compat.h" +#include "library.h" +#include "path.h" +#include "rpc.h" + +#include <pwd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +typedef struct _State { + p11_virtual virt; + p11_rpc_transport *rpc; + CK_FUNCTION_LIST *wrapped; + struct _State *next; +} State; + +static State *all_instances = NULL; + +static CK_RV +get_runtime_directory (char **directoryp) +{ + const char *envvar; + static const char * const bases[] = { "/run", "/var/run", NULL }; + char prefix[13 + 1 + 20 + 6 + 1]; + char *directory; + uid_t uid; + struct stat sb; + struct passwd pwbuf, *pw; + char buf[1024]; + int i; + + /* We can't always assume the XDG_RUNTIME_DIR envvar here, + * because the PKCS#11 module can be loaded by a program that + * calls setuid(). */ + envvar = secure_getenv ("XDG_RUNTIME_DIR"); + + if (envvar != NULL && envvar[0] != '\0') { + directory = strdup (envvar); + if (!directory) + return CKR_HOST_MEMORY; + + *directoryp = directory; + return CKR_OK; + } + + uid = getuid (); + + for (i = 0; bases[i] != NULL; i++) { + snprintf (prefix, sizeof prefix, "%s/user/%u", + bases[i], (unsigned int) uid); + if (stat (prefix, &sb) != -1 && S_ISDIR (sb.st_mode)) { + directory = strdup (prefix); + if (!directory) + return CKR_HOST_MEMORY; + *directoryp = directory; + return CKR_OK; + } + } + + /* We can't use /run/user/<UID>, fallback to ~/.cache. */ + if (getpwuid_r (uid, &pwbuf, buf, sizeof buf, &pw) < 0 || + pw == NULL || pw->pw_dir == NULL || *pw->pw_dir != '/') + return CKR_GENERAL_ERROR; + + if (asprintf (&directory, "%s/.cache", pw->pw_dir) < 0) + return CKR_HOST_MEMORY; + *directoryp = directory; + return CKR_OK; +} + +static CK_RV +get_server_address (char **addressp) +{ + const char *envvar; + char *path; + char *encoded; + char *address; + char *directory; + int ret; + CK_RV rv; + + envvar = secure_getenv ("P11_KIT_SERVER_ADDRESS"); + if (envvar != NULL && envvar[0] != '\0') { + address = strdup (envvar); + if (!address) + return CKR_HOST_MEMORY; + *addressp = address; + return CKR_OK; + } + + rv = get_runtime_directory (&directory); + if (rv != CKR_OK) + return rv; + + ret = asprintf (&path, "%s/p11-kit/pkcs11", directory); + free (directory); + if (ret < 0) + return CKR_HOST_MEMORY; + + encoded = p11_path_encode (path); + free (path); + if (!encoded) + return CKR_HOST_MEMORY; + + ret = asprintf (&address, "unix:path=%s", encoded); + free (encoded); + if (ret < 0) + return CKR_HOST_MEMORY; + + *addressp = address; + return CKR_OK; +} + +#ifdef OS_WIN32 +__declspec(dllexport) +#endif +CK_RV +C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list) +{ + char *address = NULL; + State *state; + CK_FUNCTION_LIST_PTR module = NULL; + CK_RV rv = CKR_OK; + + p11_library_init_once (); + p11_lock (); + + rv = get_server_address (&address); + + if (rv == CKR_OK) { + state = calloc (1, sizeof (State)); + if (!state) + rv = CKR_HOST_MEMORY; + } + + if (rv == CKR_OK) { + state->rpc = p11_rpc_transport_new (&state->virt, + address, + "client"); + if (!state->rpc) + rv = CKR_GENERAL_ERROR; + } + + if (rv == CKR_OK) { + module = p11_virtual_wrap (&state->virt, free); + if (!module) + rv = CKR_GENERAL_ERROR; + } + + if (rv == CKR_OK) { + *list = module; + state->wrapped = module; + state->next = all_instances; + all_instances = state; + } + + p11_unlock (); + + free (address); + + return rv; +} + +void +p11_client_module_cleanup (void) +{ + State *state, *next; + + state = all_instances; + all_instances = NULL; + + for (; state != NULL; state = next) { + next = state->next; + p11_virtual_unwrap (state->wrapped); + p11_rpc_transport_free (state->rpc); + } +} diff --git a/p11-kit/client.h b/p11-kit/client.h new file mode 100644 index 0000000..65e88dc --- /dev/null +++ b/p11-kit/client.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2013 Red Hat Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * Author: Stef Walter <stefw@redhat.com> + */ + +#ifndef __P11_CLIENT_H__ +#define __P11_CLIENT_H__ + +void p11_client_module_cleanup (void); + + +#endif /* __P11_CLIENT_H__ */ diff --git a/p11-kit/modules.c b/p11-kit/modules.c index 85eb53e..f1b992a 100644 --- a/p11-kit/modules.c +++ b/p11-kit/modules.c @@ -289,6 +289,16 @@ alloc_module_unlocked (void) return mod; } +#ifdef __GNUC__ +bool p11_proxy_module_check (CK_FUNCTION_LIST_PTR module) __attribute__((weak)); + +bool +p11_proxy_module_check (CK_FUNCTION_LIST_PTR module) +{ + return false; +} +#endif + static CK_RV dlopen_and_get_function_list (Module *mod, const char *path, diff --git a/p11-kit/proxy-init.c b/p11-kit/proxy-init.c new file mode 100644 index 0000000..397949b --- /dev/null +++ b/p11-kit/proxy-init.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2011 Collabora Ltd + * Copyright (c) 2012 Stef Walter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * + * CONTRIBUTORS + * Stef Walter <stef@thewalter.net> + */ + +#include "config.h" + +#include "library.h" +#include "p11-kit.h" +#include "proxy.h" + +#ifdef OS_UNIX + +void _p11_kit_init (void); + +void _p11_kit_fini (void); + +#ifdef __GNUC__ +__attribute__((constructor)) +#endif +void +_p11_kit_init (void) +{ + p11_library_init_once (); +} + +#ifdef __GNUC__ +__attribute__((destructor)) +#endif +void +_p11_kit_fini (void) +{ + p11_proxy_module_cleanup (); + p11_library_uninit (); +} + +#endif /* OS_UNIX */ + +#ifdef OS_WIN32 + +BOOL WINAPI DllMain (HINSTANCE, DWORD, LPVOID); + +BOOL WINAPI +DllMain (HINSTANCE instance, + DWORD reason, + LPVOID reserved) +{ + switch (reason) { + case DLL_PROCESS_ATTACH: + p11_library_init (); + break; + case DLL_THREAD_DETACH: + p11_library_thread_cleanup (); + break; + case DLL_PROCESS_DETACH: + p11_proxy_module_cleanup (); + p11_library_uninit (); + break; + default: + break; + } + + return TRUE; +} + +#endif /* OS_WIN32 */ diff --git a/p11-kit/remote.c b/p11-kit/remote.c index eaff134..37d8d5e 100644 --- a/p11-kit/remote.c +++ b/p11-kit/remote.c @@ -73,7 +73,7 @@ serve_module_from_uri (const char *uri_string) goto out; } - iter = p11_kit_iter_new (uri, P11_KIT_ITER_WANT_TOKENS); + iter = p11_kit_iter_new (uri, P11_KIT_ITER_WITH_TOKENS | P11_KIT_ITER_WITHOUT_OBJECTS); p11_kit_uri_free (uri); if (iter == NULL) goto out; diff --git a/p11-kit/util.c b/p11-kit/util.c index 325d669..1e21f80 100644 --- a/p11-kit/util.c +++ b/p11-kit/util.c @@ -44,7 +44,6 @@ #include "message.h" #include "p11-kit.h" #include "private.h" -#include "proxy.h" #include <assert.h> #include <stdarg.h> @@ -237,59 +236,3 @@ _p11_get_progname_unlocked (void) return NULL; return p11_my_progname; } - -#ifdef OS_UNIX - -void _p11_kit_init (void); - -void _p11_kit_fini (void); - -#ifdef __GNUC__ -__attribute__((constructor)) -#endif -void -_p11_kit_init (void) -{ - p11_library_init_once (); -} - -#ifdef __GNUC__ -__attribute__((destructor)) -#endif -void -_p11_kit_fini (void) -{ - p11_proxy_module_cleanup (); - p11_library_uninit (); -} - -#endif /* OS_UNIX */ - -#ifdef OS_WIN32 - -BOOL WINAPI DllMain (HINSTANCE, DWORD, LPVOID); - -BOOL WINAPI -DllMain (HINSTANCE instance, - DWORD reason, - LPVOID reserved) -{ - switch (reason) { - case DLL_PROCESS_ATTACH: - p11_library_init (); - break; - case DLL_THREAD_DETACH: - p11_library_thread_cleanup (); - break; - case DLL_PROCESS_DETACH: - p11_proxy_module_cleanup (); - p11_library_uninit (); - break; - default: - break; - } - - return TRUE; -} - -#endif /* OS_WIN32 */ |