From b93a811befa0833e1442ec558977bbb876e61177 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Fri, 19 Jan 2018 21:47:23 -0800 Subject: [PATCH] edits --- version2/src/C/CloudComm.cc | 255 +++++++++++++------------------ version2/src/C/CloudComm.h | 2 +- version2/src/C/TimingSingleton.h | 17 +-- version2/src/C/common.h | 2 + 4 files changed, 117 insertions(+), 159 deletions(-) diff --git a/version2/src/C/CloudComm.cc b/version2/src/C/CloudComm.cc index 4674af2..97a96c2 100644 --- a/version2/src/C/CloudComm.cc +++ b/version2/src/C/CloudComm.cc @@ -1,4 +1,9 @@ #include "CloudComm.h" +#include "TimingSingleton.h" +#include "SecureRandom.h" +#include "IoTString.h" +#include "Error.h" +#include "URL.h" /** * Empty Constructor needed for child class. @@ -13,7 +18,7 @@ CloudComm::CloudComm() : table(NULL), listeningPort(-1), localServerThread(NULL), - doEnd(false) + doEnd(false), timer(TimingSingleton_getInstance()) { } @@ -31,7 +36,7 @@ CloudComm::CloudComm(Table *_table, IoTString *_baseurl, IoTString *_password, table(_table), listeningPort(_listeningPort), localServerThread(NULL), - doEnd(false) + doEnd(false), timer(TimingSingleton_getInstance()) { if (listeningPort > 0) { localServerThread = new Thread(new Runnable() { @@ -48,14 +53,13 @@ CloudComm::CloudComm(Table *_table, IoTString *_baseurl, IoTString *_password, */ SecretKeySpec *CloudComm::initKey() { try { - PBEKeySpec keyspec = new PBEKeySpec(password->toCharArray(), + PBEKeySpec keyspec = new PBEKeySpec(password->internalBytes(), salt, 65536, 128); SecretKey tmpkey = SecretKeyFactory_getInstance("PBKDF2WithHmacSHA256")->generateSecret(keyspec); return new SecretKeySpec(tmpkey->getEncoded(), "AES"); - } catch (Exception e) { - e->printStackTrace(); + } catch (Exception *e) { throw new Error("Failed generating key."); } } @@ -88,8 +92,7 @@ void CloudComm::initCrypt() { password = NULL;// drop password mac = Mac_getInstance("HmacSHA256"); mac->init(key); - } catch (Exception e) { - e->printStackTrace(); + } catch (Exception *e) { throw new Error("Failed To Initialize Ciphers"); } } @@ -113,15 +116,15 @@ void CloudComm::setSalt() { } try { - Array *saltTmp = new char[SALT_SIZE]; + Array *saltTmp = new Array(CloudComm_SALT_SIZE); random->nextBytes(saltTmp); - for (int i = 0; i < SALT_SIZE; i++) { - printf("%d\n", (int)saltTmp[i] & 255); + for (int i = 0; i < CloudComm_SALT_SIZE; i++) { + printf("%d\n", (int)saltTmp->get(i) & 255); } - URL url = new URL(baseurl + "?req=setsalt"); + URL* url = new URL(baseurl + "?req=setsalt"); timer->startTime(); URLConnection con = url->openConnection(); @@ -130,12 +133,12 @@ void CloudComm::setSalt() { http->setRequestMethod("POST"); http->setFixedLengthStreamingMode(saltTmp->length()); http->setDoOutput(true); - http->setConnectTimeout(TIMEOUT_MILLIS); + http->setConnectTimeout(CloudComm_TIMEOUT_MILLIS); http->connect(); - OutputStream os = http->getOutputStream(); + OutputStream* os = http->getOutputStream(); os->write(saltTmp); os->flush(); @@ -149,8 +152,7 @@ void CloudComm::setSalt() { timer->endTime(); salt = saltTmp; - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { timer->endTime(); throw new ServerException("Failed setting salt", ServerException.TypeConnectTimeout); } @@ -163,8 +165,7 @@ bool CloudComm::getSalt() { try { url = new URL(baseurl + "?req=getsalt"); - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { throw new Error("getSlot failed"); } try { @@ -173,17 +174,16 @@ bool CloudComm::getSalt() { con = url->openConnection(); http = (HttpURLConnection) con; http->setRequestMethod("POST"); - http->setConnectTimeout(TIMEOUT_MILLIS); - http->setReadTimeout(TIMEOUT_MILLIS); + http->setConnectTimeout(CloudComm_TIMEOUT_MILLIS); + http->setReadTimeout(CloudComm_TIMEOUT_MILLIS); http->connect(); timer->endTime(); - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); throw new ServerException("getSalt failed", ServerException.TypeConnectTimeout); - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { throw new Error("getSlot failed"); } @@ -200,9 +200,9 @@ bool CloudComm::getSalt() { InputStream is = http->getInputStream(); if (is->available() > 0) { - DataInputStream dis = new DataInputStream(is); + DataInputStream* dis = new DataInputStream(is); int salt_length = dis->readInt(); - char [] tmp = new char[salt_length]; + Array * tmp = new Array(salt_length); dis->readFully(tmp); salt = tmp; timer->endTime(); @@ -213,18 +213,17 @@ bool CloudComm::getSalt() { return false; } - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); throw new ServerException("getSalt failed", ServerException.TypeInputTimeout); - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { throw new Error("getSlot failed"); } } Array *CloudComm::createIV(int64_t machineId, int64_t localSequenceNumber) { - ByteBuffer buffer = ByteBuffer.allocate(IV_SIZE); + ByteBuffer buffer = ByteBuffer.allocate(CloudComm_IV_SIZE); buffer->putLong(machineId); int64_t localSequenceNumberShifted = localSequenceNumber << 16; buffer->putLong(localSequenceNumberShifted); @@ -239,14 +238,13 @@ Array *CloudComm::encryptSlotAndPrependIV(Array *rawData, Array *encryptedBytes = cipher->doFinal(rawData); - Array *chars = new char[encryptedBytes->length + IV_SIZE]; - System.arraycopy(ivBytes, 0, chars, 0, ivBytes.length); - System.arraycopy(encryptedBytes, 0, chars, IV_SIZE, encryptedBytes.length); + Array *chars = new Array(encryptedBytes->length() + CloudComm_IV_SIZE); + System_arraycopy(ivBytes, 0, chars, 0, ivBytes.length()); + System_arraycopy(encryptedBytes, 0, chars, CloudComm_IV_SIZE, encryptedBytes.length); return chars; - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception *e) { throw new Error("Failed To Encrypt"); } } @@ -254,19 +252,18 @@ Array *CloudComm::encryptSlotAndPrependIV(Array *rawData, Array *CloudComm::stripIVAndDecryptSlot(Array *rawData) { try { - Array *ivBytes = new char[IV_SIZE]; - Array *encryptedBytes = new char[rawData->length - IV_SIZE]; - System.arraycopy(rawData, 0, ivBytes, 0, IV_SIZE); - System.arraycopy(rawData, IV_SIZE, encryptedBytes, 0, encryptedBytes->length); + Array *ivBytes = new Array(CloudComm_IV_SIZE); + Array *encryptedBytes = new Array(rawData->length() - CloudComm_IV_SIZE); + System_arraycopy(rawData, 0, ivBytes, 0, CloudComm_IV_SIZE); + System_arraycopy(rawData, CloudComm_IV_SIZE, encryptedBytes, 0, encryptedBytes->length); - IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + IvParameterSpec* ivSpec = new IvParameterSpec(ivBytes); - Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); - cipher->init(Cipher.DECRYPT_MODE, key, ivSpec); + Cipher* cipher = Cipher_getInstance("AES/CTR/NoPadding"); + cipher->init(Cipher_DECRYPT_MODE, key, ivSpec); return cipher->doFinal(encryptedBytes); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception *e) { throw new Error("Failed To Decrypt"); } } @@ -278,10 +275,6 @@ Array *CloudComm::stripIVAndDecryptSlot(Array *rawData) { * numbers. */ Array *CloudComm::putSlot(Slot *slot, int max) { - URL url = NULL; - URLConnection con = NULL; - HttpURLConnection http = NULL; - try { if (salt == NULL) { if (!getSalt()) { @@ -292,48 +285,38 @@ Array *CloudComm::putSlot(Slot *slot, int max) { int64_t sequencenumber = slot->getSequenceNumber(); Array *slotBytes = slot->encode(mac); - // slotBytes = encryptCipher.doFinal(slotBytes); - - // Array * iVBytes = slot.getSlotCryptIV(); - - // Array * chars = new char[slotBytes.length + IV_SIZE]; - // System.arraycopy(iVBytes, 0, chars, 0, iVBytes.length); - // System.arraycopy(slotBytes, 0, chars, IV_SIZE, slotBytes.length); - Array *chars = encryptSlotAndPrependIV(slotBytes, slot->getSlotCryptIV()); - url = buildRequest(true, sequencenumber, max); + URL *url = buildRequest(true, sequencenumber, max); timer->startTime(); - con = url->openConnection(); - http = (HttpURLConnection) con; + URLConnection * con = url->openConnection(); + HttpURLConnection * http = (HttpURLConnection *) con; http->setRequestMethod("POST"); http->setFixedLengthStreamingMode(chars->length); http->setDoOutput(true); - http->setConnectTimeout(TIMEOUT_MILLIS); - http->setReadTimeout(TIMEOUT_MILLIS); + http->setConnectTimeout(CloudComm_TIMEOUT_MILLIS); + http->setReadTimeout(CloudComm_TIMEOUT_MILLIS); http->connect(); - OutputStream os = http->getOutputStream(); + OutputStream * os = http->getOutputStream(); os->write(chars); os->flush(); timer->endTime(); - // System.out.println("Bytes Sent: " + chars.length); - } catch (ServerException e) { + } catch (ServerException *e) { timer->endTime(); throw e; - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); throw new ServerException("putSlot failed", ServerException.TypeConnectTimeout); - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { throw new Error("putSlot failed"); } @@ -342,7 +325,7 @@ Array *CloudComm::putSlot(Slot *slot, int max) { try { timer->startTime(); InputStream is = http->getInputStream(); - DataInputStream dis = new DataInputStream(is); + DataInputStream * dis = new DataInputStream(is); Array *resptype = new char[7]; dis->readFully(resptype); timer->endTime(); @@ -354,11 +337,10 @@ Array *CloudComm::putSlot(Slot *slot, int max) { } else throw new Error("Bad response to putslot"); - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); throw new ServerException("putSlot failed", ServerException->TypeInputTimeout); - } catch (Exception e) { - // e->printStackTrace(); + } catch (Exception *e) { throw new Error("putSlot failed"); } } @@ -368,10 +350,6 @@ Array *CloudComm::putSlot(Slot *slot, int max) { * sequencenumber or newer-> */ Array *CloudComm::getSlots(int64_t sequencenumber) { - URL url = NULL; - URLConnection con = NULL; - HttpURLConnection http = NULL; - try { if (salt == NULL) { if (!getSalt()) { @@ -380,52 +358,50 @@ Array *CloudComm::getSlots(int64_t sequencenumber) { initCrypt(); } - url = buildRequest(false, sequencenumber, 0); + URL *url = buildRequest(false, sequencenumber, 0); timer->startTime(); - con = url->openConnection(); - http = (HttpURLConnection) con; + URLConnection *con = url->openConnection(); + HttpURLConnection *http = (HttpURLConnection) con; http->setRequestMethod("POST"); - http->setConnectTimeout(TIMEOUT_MILLIS); - http->setReadTimeout(TIMEOUT_MILLIS); + http->setConnectTimeout(CloudComm_TIMEOUT_MILLIS); + http->setReadTimeout(CloudComm_TIMEOUT_MILLIS); http->connect(); timer->endTime(); - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); throw new ServerException("getSlots failed", ServerException.TypeConnectTimeout); - } catch (ServerException e) { + } catch (ServerException *e) { timer->endTime(); throw e; - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { throw new Error("getSlots failed"); } try { timer->startTime(); - InputStream is = http->getInputStream(); - DataInputStream dis = new DataInputStream(is); - Array *resptype = new char[7]; + InputStream *is = http->getInputStream(); + DataInputStream *dis = new DataInputStream(is); + Array *resptype = new Array(7); dis->readFully(resptype); timer->endTime(); - if (!Arrays.equals(resptype, "getslot".getBytes())) + if (!resptype->equals("getslot".getBytes())) throw new Error("Bad Response: " + new String(resptype)); return processSlots(dis); - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); throw new ServerException("getSlots failed", ServerException.TypeInputTimeout); - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { throw new Error("getSlots failed"); } } @@ -434,17 +410,17 @@ Array *CloudComm::getSlots(int64_t sequencenumber) { * Method that actually handles building Slot objects from the * server response. Shared by both putSlot and getSlots. */ -Array *CloudComm::processSlots(DataInputStream dis) { +Array *CloudComm::processSlots(DataInputStream *dis) { int numberofslots = dis->readInt(); - int[] sizesofslots = new int[numberofslots]; + Array * sizesofslots = new Array(numberofslots); - Slot[] slots = new Slot[numberofslots]; + Array * slots = new Array(numberofslots); for (int i = 0; i < numberofslots; i++) - sizesofslots[i] = dis->readInt(); + sizesofslots->set(i], dis->readInt()); for (int i = 0; i < numberofslots; i++) { - Array *rawData = new char[sizesofslots[i]]; + Array *rawData = new Array(sizesofslots->get(i)); dis->readFully(rawData); @@ -455,39 +431,35 @@ Array *CloudComm::processSlots(DataInputStream dis) { Array *data = stripIVAndDecryptSlot(rawData); // data = decryptCipher.doFinal(data); - - slots[i] = Slot->decode(table, data, mac); + + slots->set(i, Slot_decode(table, data, mac)); } dis->close(); return slots; } Array *sendLocalData(Array *sendData, int64_t localSequenceNumber, String host, int port) { - if (salt == NULL) { return NULL; } try { - System.out.println("Passing Locally"); + printf("Passing Locally"\m); mac->update(sendData); Array *genmac = mac->doFinal(); - Array *totalData = new char[sendData->length + genmac->length]; - System.arraycopy(sendData, 0, totalData, 0, sendData.length); - System.arraycopy(genmac, 0, totalData, sendData.length, genmac->length); + Array *totalData = new Array(sendData->length() + genmac->length()); + System_arraycopy(sendData, 0, totalData, 0, sendData.length()); + System-arraycopy(genmac, 0, totalData, sendData.length, genmac->length()); // Encrypt the data for sending - // Array * encryptedData = encryptCipher.doFinal(totalData); - // Array * encryptedData = encryptCipher.doFinal(totalData); Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); // Open a TCP socket connection to a local device - Socket socket = new Socket(host, port); + Socket* socket = new Socket(host, port); socket->setReuseAddress(true); - DataOutputStream output = new DataOutputStream(socket->getOutputStream()); - DataInputStream input = new DataInputStream(socket->getInputStream()); - + DataOutputStream* output = new DataOutputStream(socket->getOutputStream()); + DataInputStream* input = new DataInputStream(socket->getInputStream()); timer->startTime(); // Send data to output (length of data, the data) @@ -496,119 +468,107 @@ Array *sendLocalData(Array *sendData, int64_t localSequenceNumber, S output->flush(); int lengthOfReturnData = input->readInt(); - Array *returnData = new char[lengthOfReturnData]; + Array *returnData = new Array(lengthOfReturnData); input->readFully(returnData); timer->endTime(); - // returnData = decryptCipher->doFinal(returnData); returnData = stripIVAndDecryptSlot(returnData); - // returnData = decryptCipher->doFinal(returnData); // We are done with this socket socket->close(); mac->update(returnData, 0, returnData->length - HMAC_SIZE); Array *realmac = mac->doFinal(); - Array *recmac = new char[HMAC_SIZE]; - System->arraycopy(returnData, returnData->length - realmac->length, recmac, 0, realmac->length); + Array *recmac = new Array(HMAC_SIZE); + System_arraycopy(returnData, returnData->length - realmac->length, recmac, 0, realmac->length); if (!Arrays->equals(recmac, realmac)) throw new Error("Local Error: Invalid HMAC! Potential Attack!"); - Array *returnData2 = new char[lengthOfReturnData - recmac->length]; - System->arraycopy(returnData, 0, returnData2, 0, returnData2->length); + Array *returnData2 = new Array(lengthOfReturnData - recmac->length()); + System_arraycopy(returnData, 0, returnData2, 0, returnData2->length); return returnData2; - } catch (Exception e) { - e->printStackTrace(); - // throw new Error("Local comms failure..."); - + } catch (Exception *e) { + printf("Exception\n"); } return NULL; } void CloudComm::localServerWorkerFunction() { - - ServerSocket inputSocket = NULL; + ServerSocket *inputSocket = NULL; try { // Local server socket inputSocket = new ServerSocket(listeningPort); inputSocket->setReuseAddress(true); - inputSocket->setSoTimeout(TIMEOUT_MILLIS); - } catch (Exception e) { - e->printStackTrace(); + inputSocket->setSoTimeout(CloudComm_TIMEOUT_MILLIS); + } catch (Exception *e) { throw new Error("Local server setup failure..."); } while (!doEnd) { - try { // Accept incoming socket - Socket socket = inputSocket->accept(); + Socket *socket = inputSocket->accept(); - DataInputStream input = new DataInputStream(socket->getInputStream()); - DataOutputStream output = new DataOutputStream(socket->getOutputStream()); + DataInputStream *input = new DataInputStream(socket->getInputStream()); + DataOutputStream *output = new DataOutputStream(socket->getOutputStream()); // Get the encrypted data from the server int dataSize = input->readInt(); - Array *readData = new char[dataSize]; + Array *readData = new Array(dataSize); input->readFully(readData); timer->endTime(); // Decrypt the data - // readData = decryptCipher->doFinal(readData); readData = stripIVAndDecryptSlot(readData); mac->update(readData, 0, readData->length - HMAC_SIZE); Array *genmac = mac->doFinal(); - Array *recmac = new char[HMAC_SIZE]; - System->arraycopy(readData, readData->length - recmac->length, recmac, 0, recmac->length); + Array *recmac = new Array(HMAC_SIZE); + System_arraycopy(readData, readData->length() - recmac->length(), recmac, 0, recmac->length()); - if (!Arrays->equals(recmac, genmac)) + if (!recmac->equals(genmac)) throw new Error("Local Error: Invalid HMAC! Potential Attack!"); - Array *returnData = new char[readData->length - recmac->length]; - System->arraycopy(readData, 0, returnData, 0, returnData->length); + Array *returnData = new Array(readData->length() - recmac->length()); + System_arraycopy(readData, 0, returnData, 0, returnData->length()); // Process the data - // Array * sendData = table->acceptDataFromLocal(readData); Array *sendData = table->acceptDataFromLocal(returnData); mac->update(sendData); Array *realmac = mac->doFinal(); - Array *totalData = new char[sendData->length + realmac->length]; - System->arraycopy(sendData, 0, totalData, 0, sendData->length); - System->arraycopy(realmac, 0, totalData, sendData->length, realmac->length); + Array *totalData = new Array(sendData->length() + realmac->length()); + System_arraycopy(sendData, 0, totalData, 0, sendData->length()); + System_arraycopy(realmac, 0, totalData, sendData->length(), realmac->length()); // Encrypt the data for sending - // Array * encryptedData = encryptCipher->doFinal(totalData); Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); timer->startTime(); // Send data to output (length of data, the data) - output->writeInt(encryptedData->length); - output->write(encryptedData, 0, encryptedData->length); + output->writeInt(encryptedData->length()); + output->write(encryptedData, 0, encryptedData->length()); output->flush(); // close the socket socket->close(); - } catch (Exception e) { - + } catch (Exception *e) { } } if (inputSocket != NULL) { try { inputSocket->close(); - } catch (Exception e) { - e->printStackTrace(); + } catch (Exception *e) { throw new Error("Local server close failure..."); } } @@ -620,12 +580,9 @@ void CloudComm::close() { if (localServerThread != NULL) { try { localServerThread->join(); - } catch (Exception e) { - e->printStackTrace(); + } catch (Exception *e) { throw new Error("Local Server thread join issue..."); } } - - // System.out.println("Done Closing Cloud Comm"); } diff --git a/version2/src/C/CloudComm.h b/version2/src/C/CloudComm.h index 3e0a56e..fb16165 100644 --- a/version2/src/C/CloudComm.h +++ b/version2/src/C/CloudComm.h @@ -44,7 +44,7 @@ private: /* * Builds the URL for the given request. */ - URL buildRequest(bool isput, int64_t sequencenumber, int64_t maxentries); + URL* buildRequest(bool isput, int64_t sequencenumber, int64_t maxentries); void setSalt(); bool getSalt(); Array *createIV(int64_t machineId, int64_t localSequenceNumber); diff --git a/version2/src/C/TimingSingleton.h b/version2/src/C/TimingSingleton.h index 25f45e5..8083c04 100644 --- a/version2/src/C/TimingSingleton.h +++ b/version2/src/C/TimingSingleton.h @@ -4,12 +4,12 @@ class TimingSingleton { private: - static TimingSingleton singleton = new TimingSingleton( ); - int64_t startTime = 0; - int64_t totalTime = 0; + int64_t fldstartTime; + int64_t fldtotalTime; - TimingSingleton() : startTime(0), - totalTime(0) { + public: + TimingSingleton() : fldstartTime(0), + fldtotalTime(0) { } int64_t nanoTime() { @@ -19,17 +19,16 @@ private: return tv.tv_sec * 1000000000 + tv.tv_usec * 1000; } -public: void startTime() { - startTime = nanoTime(); + fldstartTime = nanoTime(); } void endTime() { - totalTime += nanoTime() - startTime; + fldtotalTime += nanoTime() - fldstartTime; } int64_t getTime() { - return totalTime; + return fldtotalTime; } }; diff --git a/version2/src/C/common.h b/version2/src/C/common.h index 0f96b7f..e7b4acd 100644 --- a/version2/src/C/common.h +++ b/version2/src/C/common.h @@ -49,6 +49,8 @@ class ServerException; //Code to write class SecretKeySpec; +class PBEKeySpec; +class SecretKey; class Mac; class SecureRandom; class Thread; -- 2.34.1