auth_dh_common.c gnutls_helper.c gnutls_supplemental.c \
crypto.c random.c ext_signature.c cryptodev.c \
crypto-api.c ext_safe_renegotiation.c gnutls_privkey.c \
- pkcs11.c pkcs11_privkey.c gnutls_pubkey.c pkcs11_write.c
+ pkcs11.c pkcs11_privkey.c gnutls_pubkey.c pkcs11_write.c locks.c
if ENABLE_NETTLE
gnutls_helper.h auth_psk.h auth_psk_passwd.h \
gnutls_supplemental.h crypto.h random.h \
ext_session_ticket.h ext_signature.h gnutls_cryptodev.h \
- ext_safe_renegotiation.h
+ ext_safe_renegotiation.h locks.h
if ENABLE_LOCAL_PAKCHOIS
COBJECTS+=pakchois/pakchois.c pakchois/errors.c
#include <gnutls_extensions.h> /* for _gnutls_ext_init */
#include <gnutls_cryptodev.h>
+#include <locks.h>
#include "sockets.h"
#include "gettext.h"
gnutls_log_func _gnutls_log_func;
int _gnutls_log_level = 0; /* default log level */
-#ifdef _WIN32
-
-# include <windows.h>
-
-/* FIXME: win32 locks are untested */
-static int gnutls_system_mutex_init (void **priv)
-{
- CRITICAL_SECTION *lock = malloc (sizeof (CRITICAL_SECTION));
- int ret;
-
- if (lock==NULL)
- return GNUTLS_E_MEMORY_ERROR;
-
- InitializeCriticalSection(lock);
-
- *priv = lock;
-
- return 0;
-}
-
-static void gnutls_system_mutex_deinit (void *priv)
-{
- DeleteCriticalSection(priv);
- free(priv);
-}
-
-static int gnutls_system_mutex_lock (void *priv)
-{
- EnterCriticalSection(priv);
- return 0;
-}
-
-static int gnutls_system_mutex_unlock (void *priv)
-{
- LeaveCriticalSection(priv);
- return 0;
-}
-
-#else
-
-# ifdef HAVE_LIBPTHREAD
-# include <pthread.h>
-
-static int gnutls_system_mutex_init (void **priv)
-{
- pthread_mutex_t *lock = malloc (sizeof (pthread_mutex_t));
- int ret;
-
- if (lock==NULL)
- return GNUTLS_E_MEMORY_ERROR;
-
- ret = pthread_mutex_init (lock, NULL);
- if (ret)
- {
- free(lock);
- gnutls_assert();
- return GNUTLS_E_LOCKING_ERROR;
- }
-
- *priv = lock;
-
- return 0;
-}
-
-static void gnutls_system_mutex_deinit (void *priv)
-{
- pthread_mutex_destroy(priv);
- free(priv);
-}
-
-static int gnutls_system_mutex_lock (void *priv)
-{
- if (pthread_mutex_lock(priv))
- {
- gnutls_assert();
- return GNUTLS_E_LOCKING_ERROR;
- }
-
- return 0;
-}
-
-static int gnutls_system_mutex_unlock (void *priv)
-{
- if (pthread_mutex_unlock(priv))
- {
- gnutls_assert();
- return GNUTLS_E_LOCKING_ERROR;
- }
-
- return 0;
-}
-
-# else
-
-#define gnutls_system_mutex_init NULL
-#define gnutls_system_mutex_deinit NULL
-#define gnutls_system_mutex_lock NULL
-#define gnutls_mutex_unlock NULL
-
-# endif /* PTHREAD */
-
-#endif
-
-mutex_init_func gnutls_mutex_init = gnutls_system_mutex_init;
-mutex_deinit_func gnutls_mutex_deinit = gnutls_system_mutex_deinit;
-mutex_lock_func gnutls_mutex_lock = gnutls_system_mutex_lock;
-mutex_unlock_func gnutls_mutex_unlock = gnutls_system_mutex_unlock;
-
-/**
- * gnutls_global_set_mutex:
- * @init: mutex initialization function
- * @deinit: mutex deinitialization function
- * @lock: mutex locking function
- * @unlock: mutex unlocking function
- *
- * With this function you are allowed to override the default mutex
- * locks used in some parts of gnutls and dependent libraries. This function
- * should be used if you have complete control of your program and libraries.
- * Do not call this function from a library. Instead only initialize gnutls and
- * the default OS mutex locks will be used.
- *
- * This function must be called before gnutls_global_init().
- *
- **/
-void gnutls_global_set_mutex(mutex_init_func init, mutex_deinit_func deinit,
- mutex_lock_func lock, mutex_unlock_func unlock)
-{
- gnutls_mutex_init = init;
- gnutls_mutex_deinit = deinit;
- gnutls_mutex_lock = lock;
- gnutls_mutex_unlock = unlock;
-}
-
/**
* gnutls_global_set_log_function:
* @log_func: it's a log function
static int _gnutls_init = 0;
-#ifndef HAVE_LIBNETTLE
-static struct gcry_thread_cbs gct = {
- .option = (GCRY_THREAD_OPTION_PTH | (GCRY_THREAD_OPTION_VERSION << 8)),
- .init = NULL,
- .select = NULL,
- .waitpid = NULL,
- .accept = NULL,
- .connect = NULL,
- .sendmsg = NULL,
- .recvmsg = NULL,
-};
-
-static int wrap_gcry_mutex_lock(void** m)
-{
- return gnutls_mutex_lock(*m);
-}
-
-static int wrap_gcry_mutex_unlock(void** m)
-{
- return gnutls_mutex_unlock(*m);
-}
-
-static int wrap_gcry_mutex_deinit(void** m)
-{
- gnutls_mutex_deinit(*m);
- return 0;
-}
-
-#endif
/**
* gnutls_global_init:
* gnutls_global_deinit() when gnutls usage is no longer needed
*
* Note that this function will also initialize libgcrypt, if it has
- * not been initialized before. Thus if you want to manually
- * initialize libgcrypt you must do it before calling this function.
- * This is useful in cases you want to disable libgcrypt's internal
- * lockings etc.
+ * not been initialized before.
*
* This function increment a global counter, so that
* gnutls_global_deinit() only releases resources when it has been
{
const char *p;
- if (gnutls_mutex_init != NULL)
- {
- gct.mutex_init = gnutls_mutex_init;
- gct.mutex_destroy = wrap_gcry_mutex_deinit;
- gct.mutex_lock = wrap_gcry_mutex_lock;
- gct.mutex_unlock = wrap_gcry_mutex_unlock;
-
- gcry_control (GCRYCTL_SET_THREAD_CBS, &gct);
- }
+ _gnutls_gcry_register_mutexes();
p = gcry_check_version (GNUTLS_MIN_LIBGCRYPT_VERSION);
extern gnutls_log_func _gnutls_log_func;
extern int _gnutls_log_level;
-extern mutex_init_func gnutls_mutex_init;
-extern mutex_deinit_func gnutls_mutex_deinit;
-extern mutex_lock_func gnutls_mutex_lock;
-extern mutex_unlock_func gnutls_mutex_unlock;
-
#endif
--- /dev/null
+/*
+ * Copyright (C) 2010
+ * Free Software Foundation, Inc.
+ *
+ * Author: Nikos Mavrogiannopoulos
+ *
+ * This file is part of GnuTLS.
+ *
+ * The GnuTLS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA
+ *
+ */
+
+#include <gnutls_int.h>
+#include <gnutls_errors.h>
+#include <libtasn1.h>
+#include <gnutls_dh.h>
+#include <random.h>
+#ifndef HAVE_LIBNETTLE
+#include <gcrypt.h>
+
+#endif
+
+#ifdef _WIN32
+
+# include <windows.h>
+
+/* FIXME: win32 locks are untested */
+static int gnutls_system_mutex_init (void **priv)
+{
+ CRITICAL_SECTION *lock = malloc (sizeof (CRITICAL_SECTION));
+ int ret;
+
+ if (lock==NULL)
+ return GNUTLS_E_MEMORY_ERROR;
+
+ InitializeCriticalSection(lock);
+
+ *priv = lock;
+
+ return 0;
+}
+
+static void gnutls_system_mutex_deinit (void *priv)
+{
+ DeleteCriticalSection(priv);
+ free(priv);
+}
+
+static int gnutls_system_mutex_lock (void *priv)
+{
+ EnterCriticalSection(priv);
+ return 0;
+}
+
+static int gnutls_system_mutex_unlock (void *priv)
+{
+ LeaveCriticalSection(priv);
+ return 0;
+}
+
+#else
+
+# ifdef HAVE_LIBPTHREAD
+# include <pthread.h>
+
+static int gnutls_system_mutex_init (void **priv)
+{
+ pthread_mutex_t *lock = malloc (sizeof (pthread_mutex_t));
+ int ret;
+
+ if (lock==NULL)
+ return GNUTLS_E_MEMORY_ERROR;
+
+ ret = pthread_mutex_init (lock, NULL);
+ if (ret)
+ {
+ free(lock);
+ gnutls_assert();
+ return GNUTLS_E_LOCKING_ERROR;
+ }
+
+ *priv = lock;
+
+ return 0;
+}
+
+static void gnutls_system_mutex_deinit (void *priv)
+{
+ pthread_mutex_destroy(priv);
+ free(priv);
+}
+
+static int gnutls_system_mutex_lock (void *priv)
+{
+ if (pthread_mutex_lock(priv))
+ {
+ gnutls_assert();
+ return GNUTLS_E_LOCKING_ERROR;
+ }
+
+ return 0;
+}
+
+static int gnutls_system_mutex_unlock (void *priv)
+{
+ if (pthread_mutex_unlock(priv))
+ {
+ gnutls_assert();
+ return GNUTLS_E_LOCKING_ERROR;
+ }
+
+ return 0;
+}
+
+# else
+
+#define gnutls_system_mutex_init NULL
+#define gnutls_system_mutex_deinit NULL
+#define gnutls_system_mutex_lock NULL
+#define gnutls_mutex_unlock NULL
+
+# endif /* PTHREAD */
+
+#endif
+
+mutex_init_func gnutls_mutex_init = gnutls_system_mutex_init;
+mutex_deinit_func gnutls_mutex_deinit = gnutls_system_mutex_deinit;
+mutex_lock_func gnutls_mutex_lock = gnutls_system_mutex_lock;
+mutex_unlock_func gnutls_mutex_unlock = gnutls_system_mutex_unlock;
+
+/**
+ * gnutls_global_set_mutex:
+ * @init: mutex initialization function
+ * @deinit: mutex deinitialization function
+ * @lock: mutex locking function
+ * @unlock: mutex unlocking function
+ *
+ * With this function you are allowed to override the default mutex
+ * locks used in some parts of gnutls and dependent libraries. This function
+ * should be used if you have complete control of your program and libraries.
+ * Do not call this function from a library. Instead only initialize gnutls and
+ * the default OS mutex locks will be used.
+ *
+ * This function must be called before gnutls_global_init().
+ *
+ **/
+void gnutls_global_set_mutex(mutex_init_func init, mutex_deinit_func deinit,
+ mutex_lock_func lock, mutex_unlock_func unlock)
+{
+ gnutls_mutex_init = init;
+ gnutls_mutex_deinit = deinit;
+ gnutls_mutex_lock = lock;
+ gnutls_mutex_unlock = unlock;
+}
+
+#ifndef HAVE_LIBNETTLE
+static struct gcry_thread_cbs gct = {
+ .option = (GCRY_THREAD_OPTION_PTHREAD | (GCRY_THREAD_OPTION_VERSION << 8)),
+ .init = NULL,
+ .select = NULL,
+ .waitpid = NULL,
+ .accept = NULL,
+ .connect = NULL,
+ .sendmsg = NULL,
+ .recvmsg = NULL,
+};
+
+static int wrap_gcry_mutex_lock(void** m)
+{
+ return gnutls_mutex_lock(*m);
+}
+
+static int wrap_gcry_mutex_unlock(void** m)
+{
+ return gnutls_mutex_unlock(*m);
+}
+
+static int wrap_gcry_mutex_deinit(void** m)
+{
+ gnutls_mutex_deinit(*m);
+ return 0;
+}
+
+void _gnutls_gcry_register_mutexes(void)
+{
+ if (gnutls_mutex_init != NULL) {
+ gct.mutex_init = gnutls_mutex_init;
+ gct.mutex_destroy = wrap_gcry_mutex_deinit;
+ gct.mutex_lock = wrap_gcry_mutex_lock;
+ gct.mutex_unlock = wrap_gcry_mutex_unlock;
+
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gct);
+ }
+}
+
+#endif
--- /dev/null
+#ifndef GNUTLS_LOCKS_H
+# define GNUTLS_LOCKS_H
+
+#include <gnutls/gnutls.h>
+#include <gnutls_int.h>
+
+extern mutex_init_func gnutls_mutex_init;
+extern mutex_deinit_func gnutls_mutex_deinit;
+extern mutex_lock_func gnutls_mutex_lock;
+extern mutex_unlock_func gnutls_mutex_unlock;
+
+# ifndef HAVE_LIBNETTLE
+void _gnutls_gcry_register_mutexes(void);
+# endif
+
+#endif