23 #include <sys/socket.h>
24 #include <arpa/inet.h>
27 #include <netinet/in.h>
28 #include <sys/socket.h>
32 #include <openssl/ssl.h>
33 #include <openssl/err.h>
34 #include <openssl/rand.h>
48 int ssl_read_socket(
unsigned char *buffer,SOCKET &sock,SSL **ssl_client)
53 unsigned int plugin_signature,no_bytes,msg_length;
54 struct timeval timeout;
57 memset(buffer,0,MAX_SZ);
59 FD_SET (sock, &socks);
62 r = select((
int)sock+1, &socks, NULL, NULL, &timeout);
65 else if (r > 0 && FD_ISSET(sock, &socks))
67 r = ssl_read((SSL *)*ssl_client,buf,MSG_HDR_SIZE);
70 memcpy(&plugin_signature,buf,4);
71 memcpy(&msg_length,buf+4,4);
72 msg_length = ntohl(msg_length);
74 while(no_bytes < msg_length)
76 r = ssl_read((SSL *)*ssl_client,buf,msg_length);
79 memcpy(buffer+no_bytes,buf,r);
88 int ssl_read(SSL *ssl,
char *buf,
int size)
94 r = SSL_read(ssl,buf,size);
95 switch(SSL_get_error(ssl,r))
100 case SSL_ERROR_WANT_READ:
102 case SSL_ERROR_ZERO_RETURN:
104 case SSL_ERROR_SYSCALL:
116 int read_socket(
unsigned char *buffer,SOCKET conn_s)
118 unsigned int plugin_signature,msg_length;
120 struct timeval timeout;
126 memset(buffer,0,
sizeof(buffer));
130 FD_SET(conn_s,&socks);
134 readsock = select((
int)conn_s+1,&socks,NULL,NULL,&timeout);
137 if(FD_ISSET(conn_s,&socks))
139 t = recv(conn_s,str,MSG_HDR_SIZE, 0);
142 memcpy(&plugin_signature,str,4);
143 memcpy(&msg_length,str+4,4);
144 msg_length = ntohl(msg_length);
146 while(bytes_recvd < msg_length)
148 t = recv(conn_s,str,10000, 0);
151 memcpy(buffer+bytes_recvd,str,t);
153 if(bytes_recvd >= msg_length)
167 int ssl_connect(
unsigned char *ip_address,
unsigned int port_number,SOCKET &sock,SSL **ssl_client,SSL_CTX **ctx)
169 struct sockaddr_in sockaddr;
170 memset(&sockaddr, 0,
sizeof(sockaddr));
171 if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
173 cout <<
"Failed to create socket: " << sock << endl;
176 sockaddr.sin_family = AF_INET;
177 sockaddr.sin_addr.s_addr = inet_addr((
const char *)ip_address);
178 sockaddr.sin_port = (u_short)htons((u_short)port_number);
179 int i = connect(sock, (
struct sockaddr *)&sockaddr,
sizeof(sockaddr));
180 if (i == SOCKET_ERROR)
182 cout <<
"Failed to connect with server: " << i <<
" " << ip_address <<
" at port: " << port_number << endl;
185 *ssl_client = SSL_new(*ctx);
186 SSL_set_fd(*ssl_client,sock);
187 SSL_set_connect_state(*ssl_client);
189 if(SSL_connect(*ssl_client) <= 0)
191 cout <<
"Failed to successfully connect to SSL server: " << ip_address <<
" at port: " << port_number;
203 unsigned long id_function(
void)
206 return(
unsigned long) GetCurrentThreadId();
208 return ((
unsigned long) pthread_self());
222 value->mutex = CreateMutex( NULL, FALSE, NULL );
224 pthread_mutex_init(&value->mutex, NULL);
232 if (mode & CRYPTO_LOCK)
236 dwWaitResult = WaitForSingleObject(l->mutex,INFINITE);
238 pthread_mutex_lock(&l->mutex);
244 ReleaseMutex(l->mutex);
246 pthread_mutex_unlock(&l->mutex);
255 CloseHandle(l->mutex);
257 pthread_mutex_destroy(&l->mutex);
266 int sock_connect(
unsigned char *ip_address,
unsigned int port_number,SOCKET &sock)
268 struct sockaddr_in sockaddr;
270 memset(&sockaddr, 0,
sizeof(sockaddr));
271 if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
273 cout <<
"Failed to create socket: " << sock << endl;
276 sockaddr.sin_family = AF_INET;
277 sockaddr.sin_addr.s_addr = inet_addr((
const char *)ip_address);
278 sockaddr.sin_port = (u_short)htons((u_short)port_number);
279 int i = connect(sock, (
struct sockaddr *)&sockaddr,
sizeof(sockaddr));
280 if ( i == SOCKET_ERROR)
282 cout <<
"Failed to connect with server: " << i <<
" " << ip_address <<
" at port: " << port_number << endl;
289 void locking_function(
int mode,
int n,
const char *file,
int line)
291 if (mode & CRYPTO_LOCK)
295 dwWaitResult = WaitForSingleObject(mutex_buf[n],INFINITE);
297 pthread_mutex_lock(&mutex_buf[n]);
303 ReleaseMutex(mutex_buf[n]);
305 pthread_mutex_unlock(&mutex_buf[n]);
311 int setnonblocking(
int sock)
316 iResult = ioctlsocket(sock, FIONBIO, &iMode);
317 if (iResult != NO_ERROR)
321 int opts = fcntl(sock,F_GETFL);
324 opts = (opts | O_NONBLOCK);
325 if (fcntl(sock,F_SETFL,opts) < 0)
332 int setblocking(
int sock)
337 iResult = ioctlsocket(sock, FIONBIO, &iMode);
338 if (iResult != NO_ERROR)
342 int opts = fcntl(sock,F_GETFL);
345 opts = (opts | ~O_NONBLOCK);
346 if (fcntl(sock,F_SETFL,opts) < 0)
359 iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
367 int create_message(
string plugin_name,
string message,
char *buff)
370 unsigned int plugin_signature;
372 plugin_signature = htonl(PLUGIN_SIGNATURE);
373 memset(buff,0,MAX_SZ);
374 size = plugin_name.length();
376 memcpy(buff,&plugin_signature,4);
377 tot_size = plugin_name.length()+message.length()+4;
378 tot_size = htonl(tot_size);
379 memcpy(buff,&plugin_signature,4);
380 memcpy(buff+4,&tot_size,4);
381 memcpy(buff+8,&size,4);
382 memcpy(buff+12,plugin_name.c_str(),plugin_name.length());
383 memcpy(buff+12+plugin_name.length(),message.c_str(),message.length());
384 return(12+plugin_name.length()+message.length());
388 int ssl_init(SSL_CTX **ctx)
391 #if (OPENSSL_VERSION_NUMBER >= 0x10000000L) // openssl returns a const SSL_METHOD
392 const SSL_METHOD *method = NULL;
394 SSL_METHOD *method = NULL;
396 SSL_load_error_strings();
398 OpenSSL_add_all_algorithms();
400 mutex_buf = (HANDLE *) malloc(CRYPTO_num_locks() *
sizeof(HANDLE));
402 mutex_buf = (pthread_mutex_t *) malloc(CRYPTO_num_locks() *
sizeof(pthread_mutex_t));
404 if (mutex_buf == NULL)
406 for (i = 0; i < CRYPTO_num_locks(); i++)
409 mutex_buf[i] = CreateMutex( NULL, FALSE, NULL );
411 pthread_mutex_init(&mutex_buf[i], NULL);
415 CRYPTO_set_locking_callback(locking_function);
416 CRYPTO_set_id_callback(id_function);
418 CRYPTO_set_dynlock_create_callback(dyn_create_function);
419 CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
420 CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
422 RAND_load_file(
"/dev/urandom", MAX_SZ);
425 method = SSLv3_client_method();
427 *ctx = SSL_CTX_new(method);
430 cout <<
"CTX is NULL.." << endl;
433 SSL_CTX_set_mode(*ctx,SSL_MODE_AUTO_RETRY);
Struct to store OS agnostic mutex. Required for Openssl locking functions.