Networking.cpp
1.64 KB
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
77
78
#include "Networking.h"
namespace uS {
namespace TLS {
Context::Context(const Context &other)
{
if (other.context) {
context = other.context;
SSL_CTX_up_ref(context);
}
}
Context &Context::operator=(const Context &other) {
if (other.context) {
context = other.context;
SSL_CTX_up_ref(context);
}
return *this;
}
Context::~Context()
{
if (context) {
SSL_CTX_free(context);
}
}
struct Init {
Init() {SSL_library_init();}
~Init() {/*EVP_cleanup();*/}
} init;
Context createContext(std::string certChainFileName, std::string keyFileName, std::string keyFilePassword)
{
Context context(SSL_CTX_new(SSLv23_server_method()));
if (!context.context) {
return nullptr;
}
if (keyFilePassword.length()) {
context.password.reset(new std::string(keyFilePassword));
SSL_CTX_set_default_passwd_cb_userdata(context.context, context.password.get());
SSL_CTX_set_default_passwd_cb(context.context, Context::passwordCallback);
}
SSL_CTX_set_options(context.context, SSL_OP_NO_SSLv3);
if (SSL_CTX_use_certificate_chain_file(context.context, certChainFileName.c_str()) != 1) {
return nullptr;
} else if (SSL_CTX_use_PrivateKey_file(context.context, keyFileName.c_str(), SSL_FILETYPE_PEM) != 1) {
return nullptr;
}
return context;
}
}
#ifndef _WIN32
struct Init {
Init() {signal(SIGPIPE, SIG_IGN);}
} init;
#endif
#ifdef _WIN32
#pragma comment(lib, "Ws2_32.lib")
struct WindowsInit {
WSADATA wsaData;
WindowsInit() {WSAStartup(MAKEWORD(2, 2), &wsaData);}
~WindowsInit() {WSACleanup();}
} windowsInit;
#endif
}