diff --git a/src/client/main.cc b/src/client/main.cc index db4317a..26b09d7 100644 --- a/src/client/main.cc +++ b/src/client/main.cc @@ -1,13 +1,18 @@ #include -#include #include #include +#include +#include #include #include #include using std::cout, std::cin, std::endl, std::string; +/* + * Remember to build with the flags "-L/usr/lib -lssl -lcrypto" + */ + int main() { struct Message { @@ -19,7 +24,30 @@ int main() { } }; + // Initialize OpenSSL + SSL_library_init(); + SSL_load_error_strings(); + + // Create new SSL context + SSL_CTX *ctx = SSL_CTX_new(TLS_client_method()); + if (!ctx) { + // TODO Handle error + } + + // Load the server's certificate into context + if (SSL_CTX_load_verify_locations( + ctx, "~/git/mogens_og_karen/ssl/server.crt", nullptr) <= 0) { + // TODO Handle error + } + + // Create SSL object + SSL *ssl = SSL_new(ctx); + if (!ssl) { + // TODO Handle error + } + int clientSocket = socket(AF_INET, SOCK_STREAM, 0); + SSL_set_fd(ssl, clientSocket); sockaddr_in serverAdress; serverAdress.sin_family = AF_INET; @@ -35,6 +63,11 @@ int main() { cout << "CONNECTED!" << endl; } + // Perform SSL handshake + if (SSL_connect(ssl) != 1) { + // TODO Handle error + } + while (true) { Message message; cout << "Type message to server: "; @@ -48,10 +81,13 @@ int main() { cout << endl; message.username = "Client 1"; - send(clientSocket, message.toString().data(), - strlen(message.toString().data()), 0); + SSL_write(ssl, message.toString().data(), 0); } + // Clean up + SSL_free(ssl); + SSL_CTX_free(ctx); + ERR_free_strings(); close(clientSocket); return 0; diff --git a/src/server/main.cc b/src/server/main.cc index 52207c6..3763f79 100644 --- a/src/server/main.cc +++ b/src/server/main.cc @@ -2,14 +2,41 @@ #include #include #include +#include +#include #include #include #include using std::cout, std::endl, std::string; +/* + * Remember to build with the flags "-L/usr/lib -lssl -lcrypto" + */ + int main() { + SSL_library_init(); + SSL_load_error_strings(); + + SSL_CTX *ctx = SSL_CTX_new(TLS_server_method()); + if (!ctx) { + // TODO Handle error + } + + // Load certificate + if (SSL_CTX_use_certificate_file(ctx, + "~/git/mogens_og_karen/ssl/server.crt", + SSL_FILETYPE_PEM) <= 0) { + // TODO Handle error + } + + // Load certificate private key + if (SSL_CTX_use_PrivateKey_file(ctx, "~/git/mogens_og_karen/ssl/server.key", + SSL_FILETYPE_PEM) <= 0) { + // TODO Handle error + } + cout << "Initializing server" << endl; int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { @@ -37,9 +64,17 @@ int main() { // TODO error } + SSL *ssl = SSL_new(ctx); + SSL_set_fd(ssl, clientSocket); + + // Perform the SSL negotiation + if (SSL_accept(ssl)) { + // TODO Handle error + } + while (true) { char buffer[1024] = {0}; - recv(clientSocket, buffer, sizeof(buffer), 0); + SSL_read(ssl, buffer, 0); if (strlen(buffer) <= 0) { cout << "Client seems to have just straight up left :(" << endl; @@ -49,6 +84,9 @@ int main() { cout << buffer << endl; } + SSL_free(ssl); + SSL_CTX_free(ctx); + ERR_free_strings(); close(serverSocket); return 0;