1 #include <razorback/log.h>
2 #include <razorback/lock.h>
3 #include <razorback/thread.h>
4 #include "init.h"
5 
6 
7 #include <openssl/ssl.h>
8 #include <openssl/err.h>
9 
10 
11 static struct Mutex **sslLocks = NULL;
12 
13 void
handle_error(const char * file,int lineno,const char * msg)14 handle_error(const char *file, int lineno, const char *msg)
15 {
16     rzb_log(LOG_ERR, "** %s:%d %s", file, lineno, msg);
17 //    ERR_print_errors_fp(stderr);
18 }
19 
locking_function(int mode,int n,const char * file,int line)20 static void locking_function(int mode, int n, const char * file, int line)
21 {
22     if (mode & CRYPTO_LOCK)
23         Mutex_Lock(sslLocks[n]);
24     else
25         Mutex_Unlock(sslLocks[n]);
26 }
27 
id_function(void)28 static unsigned long id_function(void)
29 {
30 	return (unsigned long)Thread_GetCurrentId();
31 }
32 
Crypto_Initialize_OpenSSL(void)33 static bool Crypto_Initialize_OpenSSL(void)
34 {
35     int i;
36 
37     SSL_load_error_strings ();
38 
39     SSL_library_init();
40     if ((sslLocks = calloc(CRYPTO_num_locks(), sizeof(struct Mutex *))) == NULL)
41         return false;
42 
43     for (i = 0;  i < CRYPTO_num_locks();  i++)
44     {
45         if ((sslLocks[i] = Mutex_Create(MUTEX_MODE_NORMAL)) == NULL)
46             return false;
47     }
48     CRYPTO_set_id_callback(id_function);
49     CRYPTO_set_locking_callback(locking_function);
50     OpenSSL_add_all_digests();
51     return true;
52 }
53 
Crypto_Initialize(void)54 bool Crypto_Initialize(void)
55 {
56 	return Crypto_Initialize_OpenSSL();
57 }
58