13SSLServer::SSLServer(
const char *cFile,
const char *kFile,
int port) {
17 LoadCerts(cFile, kFile);
23void SSLServer::CheckClients(
int wait_t) {
31 FD_SET(master, &fdset);
33 select(master+1, &fdset, NULL, NULL, (
struct timeval *)&tv);
36 if(FD_ISSET(master, &fdset)) {
43 int client = (int)accept(master, NULL, NULL);
49 struct in_addr ip_address;
50 memcpy(&ip_address, &addr.sin_addr.s_addr, 4);
52 cout <<
"\n\n---------------------------------------------\n";
53 cout <<
"Connection from: " << inet_ntoa(ip_address) <<
" ("
54 << ntohs(addr.sin_port) <<
")\n";
61 SSL_set_fd(ssl, client);
64 cout <<
"Creating Thread\n";
74 HANDLE thread = ::CreateThread(
77 (LPTHREAD_START_ROUTINE) pthr_f,
86void SSLServer::BindPort(
void) {
89 WSAStartup(MAKEWORD(1,1), &info);
92 struct sockaddr_in addr;
95 master = (int)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
96 memset(&addr, 0,
sizeof(addr));
98 addr.sin_family = AF_INET;
99 addr.sin_port = htons(PORT);
100 addr.sin_addr.s_addr = INADDR_ANY;
103 if(::bind(master, (
struct sockaddr *)&addr,
sizeof(addr)) != 0) {
112 if(listen(master, 5) != 0) {
119void SSLServer::CreateCTX(
void) {
121 const SSL_METHOD *method;
125 OpenSSL_add_all_algorithms();
126 SSL_load_error_strings();
129 method = SSLv23_server_method();
132 ctx = SSL_CTX_new(method);
134 ERR_print_errors_fp(stderr);
140void SSLServer::LoadCerts(
const char *cFile,
const char *kFile) {
141 if ( SSL_CTX_use_certificate_chain_file(ctx, cFile) <= 0) {
142 ERR_print_errors_fp(stderr);
145 if ( SSL_CTX_use_PrivateKey_file(ctx, kFile, SSL_FILETYPE_PEM) <= 0) {
146 ERR_print_errors_fp(stderr);
151 if ( !SSL_CTX_check_private_key(ctx) ) {
152 fprintf(stderr,
"Private key is invalid.\n");
160#define REPLY "<html><body>Metalshell.com OpenSSL Server</body></html>"
161#define MAX_PACKET_SIZE 1024
164void *conn_thread(
void *ssl) {
165 int fd = SSL_get_fd((SSL *)ssl);
169 while(SSL_accept((SSL *)ssl) == -1) {
179 ERR_print_errors_fp(stderr);
182 const SSL_CIPHER *sslciph = SSL_get_current_cipher((SSL *)ssl);
184 cout <<
"Encryption Description:\n";
185 cout << SSL_CIPHER_description(sslciph, cipdesc,
sizeof(cipdesc)) << endl;
188 char* buff =
new char[MAX_PACKET_SIZE];
190 while ((bytes = SSL_read((SSL *)ssl, buff,
sizeof(buff))) <= 0) {
196 cout <<
"Recieved: \n" << buff << endl;
199 SSL_write((SSL *)ssl, REPLY, (
int)strlen(REPLY));
204 SSL_shutdown((SSL *)ssl);
207 SSL_free((SSL *)ssl);
210 cout <<
"Connection Closed\n";
211 cout <<
"---------------------------------------------\n";
218 SSLServer server(
"cert",
"pkey", port);
221 server.SetPthread_F(conn_thread);
228 server.CheckClients(10);
Minimal OpenSSL-based TLS server helpers for the CMSDK.
bool Sleep(uint32 ms)
Suspend the calling thread.
bool SetSocketNonBlockingMode(SOCKET s)
Put a socket into non-blocking mode.
int TestSSL(int port)
Standalone smoke test for the SSL server functionality.