1/*
2 * Copyright 2011, Axel D��rfler, axeld@pinc-software.de.
3 * Copyright 2014 Haiku, inc.
4 *
5 * Distributed under the terms of the MIT License.
6 */
7
8
9#include <OS.h>
10
11#include <openssl/ssl.h>
12#include <openssl/rand.h>
13#include <pthread.h>
14
15
16namespace BPrivate {
17
18
19class SSL {
20public:
21	SSL()
22	{
23		SSL_library_init();
24
25		int64 seed = find_thread(NULL) ^ system_time();
26		RAND_seed(&seed, sizeof(seed));
27
28		// Set callbacks required for thread-safe operation of OpenSSL.
29		sMutexBuf = new pthread_mutex_t[CRYPTO_num_locks()];
30		for (int i = 0; i < CRYPTO_num_locks(); i++)
31			pthread_mutex_init(&sMutexBuf[i], NULL);
32		CRYPTO_set_id_callback(_GetThreadId);
33		CRYPTO_set_locking_callback(_LockingFunction);
34	}
35
36	~SSL()
37	{
38		CRYPTO_set_id_callback(NULL);
39		CRYPTO_set_locking_callback(NULL);
40
41		for (int i = 0; i < CRYPTO_num_locks(); i++)
42			pthread_mutex_destroy(&sMutexBuf[i]);
43		delete[] sMutexBuf;
44	}
45
46private:
47	static void _LockingFunction(int mode, int n, const char * file, int line)
48	{
49		if (mode & CRYPTO_LOCK)
50			pthread_mutex_lock(&sMutexBuf[n]);
51		else
52			pthread_mutex_unlock(&sMutexBuf[n]);
53	}
54
55	static unsigned long _GetThreadId()
56	{
57		return find_thread(NULL);
58	}
59
60private:
61	static pthread_mutex_t* sMutexBuf;
62};
63
64
65static SSL sSSL;
66pthread_mutex_t* SSL::sMutexBuf;
67
68
69}	// namespace BPrivate
70