1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#pragma once
#include <winsock2.h>
#include <ws2tcpip.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include "conout.h"
#include "typedef.h"
#pragma comment( lib, "libssl.lib" )
#pragma comment( lib, "libcrypto.lib" )
#pragma comment( lib, "Ws2_32.lib" )
inline U32 net_create_socket( I32 family, I32 type, I32 protocol ) {
static WSADATA wsa_data;
static bool wsa_init = false;
if( !wsa_init ) {
if( WSAStartup( MAKEWORD( 2, 2 ), &wsa_data ) != 0 ) {
assert( true, "WSAStartup() error" );
return INVALID_SOCKET;
}
wsa_init = true;
}
return socket( family, type, protocol );
}
inline U32 net_connect( U32 socket, const char* ip, U16 port ) {
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons( port );
inet_pton( AF_INET, ip, &addr.sin_addr.s_addr );
return connect( socket, (sockaddr*)&addr, sizeof( addr ) );
}
inline SSL_CTX* ssl_create_context() {
OpenSSL_add_all_algorithms();
#ifdef DEBUG
SSL_load_error_strings();
#endif
SSL_CTX* ctx = SSL_CTX_new( TLSv1_2_client_method() );
if( !ctx )
return nullptr;
return ctx;
}
inline SSL* ssl_connect( SSL_CTX* ctx, int sock ) {
SSL* ssl = SSL_new( ctx );
if( !ssl )
return nullptr;
SSL_set_fd( ssl, sock );
if( SSL_connect( ssl ) <= 0 )
return nullptr;
return ssl;
}
inline void ssl_destroy( SSL* ssl ) {
if( ssl )
SSL_free( ssl );
}
inline void ssl_destroy_context( SSL_CTX* ctx ) {
if( ctx )
SSL_CTX_free( ctx );
}
inline int ssl_send( SSL* ssl, const void* data, int len ) {
return SSL_write( ssl, data, len );
}
|