summaryrefslogtreecommitdiff
path: root/src/cryptinit.hpp
diff options
context:
space:
mode:
authorOthmar Gsenger <otti@anytun.org>2008-11-28 17:39:14 +0000
committerOthmar Gsenger <otti@anytun.org>2008-11-28 17:39:14 +0000
commit409d58d0b63a113b29d8ce7c75a70e6dbbb39e69 (patch)
tree27a2526d6fc3b4600f18572e77f9fb8890ccfb39 /src/cryptinit.hpp
parentfixed datatypes (really using boost now) (diff)
added compile time options NOCRYPT,NODAEMON,NOEXEC for easyier windows porting
moved crypto init functions to cryptinit.hpp and exec to sysexec.hpp (as this will be platform dependant)
Diffstat (limited to 'src/cryptinit.hpp')
-rw-r--r--src/cryptinit.hpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/cryptinit.hpp b/src/cryptinit.hpp
new file mode 100644
index 0000000..567a374
--- /dev/null
+++ b/src/cryptinit.hpp
@@ -0,0 +1,82 @@
+#ifndef _CRYPTINIT_HPP
+#define _CRYPTINIT_HPP
+#ifndef NOCRYPT
+
+// boost thread callbacks for libgcrypt
+#if defined(BOOST_HAS_PTHREADS)
+
+static int boost_mutex_init(void **priv)
+{
+ boost::mutex *lock = new boost::mutex();
+ if (!lock)
+ return ENOMEM;
+ *priv = lock;
+ return 0;
+}
+
+static int boost_mutex_destroy(void **lock)
+{
+ delete reinterpret_cast<boost::mutex*>(*lock);
+ return 0;
+}
+
+static int boost_mutex_lock(void **lock)
+{
+ reinterpret_cast<boost::mutex*>(*lock)->lock();
+ return 0;
+}
+
+static int boost_mutex_unlock(void **lock)
+{
+ reinterpret_cast<boost::mutex*>(*lock)->unlock();
+ return 0;
+}
+
+static struct gcry_thread_cbs gcry_threads_boost =
+{ GCRY_THREAD_OPTION_USER, NULL,
+ boost_mutex_init, boost_mutex_destroy,
+ boost_mutex_lock, boost_mutex_unlock };
+#else
+#error this libgcrypt thread callbacks only work with pthreads
+#endif
+
+
+#define MIN_GCRYPT_VERSION "1.2.0"
+
+bool initLibGCrypt()
+{
+ // make libgcrypt thread safe
+ // this must be called before any other libgcrypt call
+ gcry_control( GCRYCTL_SET_THREAD_CBS, &gcry_threads_boost );
+
+ // this must be called right after the GCRYCTL_SET_THREAD_CBS command
+ // no other function must be called till now
+ if( !gcry_check_version( MIN_GCRYPT_VERSION ) ) {
+ std::cout << "initLibGCrypt: Invalid Version of libgcrypt, should be >= " << MIN_GCRYPT_VERSION << std::endl;
+ return false;
+ }
+
+ gcry_error_t err = gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
+ if( err ) {
+ char buf[STERROR_TEXT_MAX];
+ buf[0] = 0;
+ std::cout << "initLibGCrypt: Failed to disable secure memory: " << gpg_strerror_r(err, buf, STERROR_TEXT_MAX) << std::endl;
+ return false;
+ }
+
+ // Tell Libgcrypt that initialization has completed.
+ err = gcry_control(GCRYCTL_INITIALIZATION_FINISHED);
+ if( err ) {
+ char buf[STERROR_TEXT_MAX];
+ buf[0] = 0;
+ std::cout << "initLibGCrypt: Failed to finish initialization: " << gpg_strerror_r(err, buf, STERROR_TEXT_MAX) << std::endl;
+ return false;
+ }
+
+ cLog.msg(Log::PRIO_NOTICE) << "initLibGCrypt: libgcrypt init finished";
+ return true;
+}
+
+#endif
+#endif
+