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