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