aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-10-18 15:04:55 +0200
committerMartin Willi <martin@revosec.ch>2014-06-04 15:53:00 +0200
commitc46cee6f6d4c2ad93ddf183d21bc42bd94de70b8 (patch)
tree72cd2814d543ade050eab8b029238b7ca8402a0d /src
parentf1c9653e042452f98e810162904f008b071687f9 (diff)
downloadstrongswan-c46cee6f6d4c2ad93ddf183d21bc42bd94de70b8.tar.bz2
strongswan-c46cee6f6d4c2ad93ddf183d21bc42bd94de70b8.tar.xz
chunk: Don't depend on pthread directly
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/library.c9
-rw-r--r--src/libstrongswan/utils/chunk.c18
-rw-r--r--src/libstrongswan/utils/chunk.h8
3 files changed, 22 insertions, 13 deletions
diff --git a/src/libstrongswan/library.c b/src/libstrongswan/library.c
index b06a2d5a5..c5850e155 100644
--- a/src/libstrongswan/library.c
+++ b/src/libstrongswan/library.c
@@ -242,6 +242,7 @@ bool library_init(char *settings, const char *namespace)
{
private_library_t *this;
printf_hook_t *pfh;
+ static bool seeded = FALSE;
if (lib)
{ /* already initialized, increase refcount */
@@ -250,6 +251,14 @@ bool library_init(char *settings, const char *namespace)
return !this->integrity_failed;
}
+ if (!seeded)
+ {
+ /* we do this just once to allow hash table lifetimes longer than
+ * one init/deinit cycle. */
+ seeded = TRUE;
+ chunk_hash_seed();
+ }
+
INIT(this,
.public = {
.get = _get,
diff --git a/src/libstrongswan/utils/chunk.c b/src/libstrongswan/utils/chunk.c
index 47181719a..dd84d5106 100644
--- a/src/libstrongswan/utils/chunk.c
+++ b/src/libstrongswan/utils/chunk.c
@@ -24,8 +24,8 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
-#include <pthread.h>
#include <ctype.h>
+#include <time.h>
#include "chunk.h"
@@ -884,9 +884,9 @@ u_int64_t chunk_mac(chunk_t chunk, u_char *key)
}
/**
- * Secret key allocated randomly during first use.
+ * Secret key allocated randomly with chunk_hash_seed().
*/
-static u_char key[16];
+static u_char key[16] = {};
/**
* Static key used in case predictable hash values are required.
@@ -895,15 +895,9 @@ static u_char static_key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
/**
- * Only allocate the key once
+ * See header
*/
-static pthread_once_t key_allocated = PTHREAD_ONCE_INIT;
-
-/**
- * Allocate a key on first use, we do this manually to avoid dependencies on
- * plugins.
- */
-static void allocate_key()
+void chunk_hash_seed()
{
ssize_t len;
size_t done = 0;
@@ -939,7 +933,6 @@ static void allocate_key()
*/
u_int32_t chunk_hash_inc(chunk_t chunk, u_int32_t hash)
{
- pthread_once(&key_allocated, allocate_key);
/* we could use a mac of the previous hash, but this is faster */
return chunk_mac_inc(chunk, key, ((u_int64_t)hash) << 32 | hash);
}
@@ -949,7 +942,6 @@ u_int32_t chunk_hash_inc(chunk_t chunk, u_int32_t hash)
*/
u_int32_t chunk_hash(chunk_t chunk)
{
- pthread_once(&key_allocated, allocate_key);
return chunk_mac(chunk, key);
}
diff --git a/src/libstrongswan/utils/chunk.h b/src/libstrongswan/utils/chunk.h
index 5a052a013..760f922e1 100644
--- a/src/libstrongswan/utils/chunk.h
+++ b/src/libstrongswan/utils/chunk.h
@@ -340,6 +340,14 @@ bool chunk_increment(chunk_t chunk);
bool chunk_printable(chunk_t chunk, chunk_t *sane, char replace);
/**
+ * Seed initial key for chunk_hash().
+ *
+ * This call should get invoked once during startup. This is usually done
+ * by calling library_init().
+ */
+void chunk_hash_seed();
+
+/**
* Computes a 32 bit hash of the given chunk.
*
* @note The output of this function is randomized, that is, it will only