diff options
author | Martin Willi <martin@revosec.ch> | 2013-10-18 15:04:55 +0200 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-06-04 15:53:00 +0200 |
commit | c46cee6f6d4c2ad93ddf183d21bc42bd94de70b8 (patch) | |
tree | 72cd2814d543ade050eab8b029238b7ca8402a0d /src | |
parent | f1c9653e042452f98e810162904f008b071687f9 (diff) | |
download | strongswan-c46cee6f6d4c2ad93ddf183d21bc42bd94de70b8.tar.bz2 strongswan-c46cee6f6d4c2ad93ddf183d21bc42bd94de70b8.tar.xz |
chunk: Don't depend on pthread directly
Diffstat (limited to 'src')
-rw-r--r-- | src/libstrongswan/library.c | 9 | ||||
-rw-r--r-- | src/libstrongswan/utils/chunk.c | 18 | ||||
-rw-r--r-- | src/libstrongswan/utils/chunk.h | 8 |
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 |