X-Git-Url: http://plrg.eecs.uci.edu/git/?p=iotcloud.git;a=blobdiff_plain;f=version2%2Fsrc%2FC%2FCloudComm.cc;h=06d6a89459624c18aded6691f349ad637cdfb064;hp=1c8114ed61dc79291dc5460c216c28d9f00962a0;hb=ea13af1b791836a1b5e5c1d382dd2d02e180430d;hpb=96dd5bcd8a57cd90d036ca9c45c34ffc833af200 diff --git a/version2/src/C/CloudComm.cc b/version2/src/C/CloudComm.cc index 1c8114e..06d6a89 100644 --- a/version2/src/C/CloudComm.cc +++ b/version2/src/C/CloudComm.cc @@ -1,4 +1,13 @@ #include "CloudComm.h" +#include "TimingSingleton.h" +#include "SecureRandom.h" +#include "IoTString.h" +#include "Error.h" +#include "URL.h" +#include "Mac.h" +#include "Table.h" +#include "Crypto.h" +#include "ByteBuffer.h" /** * Empty Constructor needed for child class. @@ -13,15 +22,21 @@ CloudComm::CloudComm() : table(NULL), listeningPort(-1), localServerThread(NULL), - doEnd(false) + doEnd(false), timer(TimingSingleton_getInstance()) { } +void * threadWrapper(void * cloud) { + CloudComm *c = (CloudComm *) cloud; + c->localServerWorkerFunction(); + return NULL; +} + /** * Constructor for actual use. Takes in the url and password. */ -CloudComm::CloudComm(Table* _table, IoTString* _baseurl, IoTString* _password, int _listeningPort) : +CloudComm::CloudComm(Table *_table, IoTString *_baseurl, IoTString *_password, int _listeningPort) : baseurl(_baseurl), key(NULL), mac(NULL), @@ -31,31 +46,24 @@ 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() { - void run() { - localServerWorkerFunction(); - } - }); - localServerThread->start(); + pthread_create(&localServerThread, NULL, threadWrapper, this); } } /** * Generates Key from password. */ -SecretKeySpec *CloudComm::initKey() { +AESKey *CloudComm::initKey() { try { - PBEKeySpec keyspec = new PBEKeySpec(password->toCharArray(), - salt, - 65536, - 128); - SecretKey tmpkey = SecretKeyFactory_getInstance("PBKDF2WithHmacSHA256")->generateSecret(keyspec); - return new SecretKeySpec(tmpkey->getEncoded(), "AES"); - } catch (Exception e) { - e->printStackTrace(); + AESKey * key = new AESKey(password->internalBytes(), + salt, + 65536, + 128); + return key; + } catch (Exception *e) { throw new Error("Failed generating key."); } } @@ -78,18 +86,15 @@ void CloudComm::initSecurity() { * Inits the HMAC generator. */ void CloudComm::initCrypt() { - if (password == NULL) { return; } - try { key = initKey(); 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"); } } @@ -97,134 +102,123 @@ void CloudComm::initCrypt() { /* * Builds the URL for the given request. */ -URL *CloudComm::buildRequest(bool isput, int64_t sequencenumber, int64_t maxentries) { - IoTString *reqstring = isput ? "req=putslot" : "req=getslot"; - IoTString *urlstr = baseurl + "?" + reqstring + "&seq=" + sequencenumber; +IoTString *CloudComm::buildRequest(bool isput, int64_t sequencenumber, int64_t maxentries) { + const char *reqstring = isput ? "req=putslot" : "req=getslot"; + char *buffer = (char *) malloc(baseurl->length() + 200); + memcpy(buffer, baseurl->internalBytes(), baseurl->length()); + int offset = baseurl->length(); + offset += sprintf(&buffer[offset], "?%s&seq=%" PRId64, reqstring, sequencenumber); if (maxentries != 0) - urlstr += "&max=" + maxentries; - return new URL(urlstr); + sprintf(&buffer[offset], "&max=%" PRId64, maxentries); + IoTString *urlstr = new IoTString(buffer); + return urlstr; } -void CloudComm::setSalt() { +int openURL(IoTString *url, bool isPost) { + return 0; +} + +void writeURLData(int fd, Array *data) { +} + +void readURLData(int fd, Array * output) { +} + +int readURLInt(int fd) { + return 0; +} +int getResponseCode(int fd) { + return 0; +} + +void CloudComm::setSalt() { if (salt != NULL) { - // Salt already sent to server so dont set it again + // Salt already sent to server so don't set it again return; } + int fd = -1; try { - char[] 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); - } - - - URL url = new URL(baseurl + "?req=setsalt"); + char *buffer = (char *) malloc(baseurl->length() + 100); + memcpy(buffer, baseurl->internalBytes(), baseurl->length()); + int offset = baseurl->length(); + offset += sprintf(&buffer[offset], "?req=setsalt"); + IoTString *urlstr = new IoTString(buffer); + free(buffer); timer->startTime(); - URLConnection con = url->openConnection(); - HttpURLConnection http = (HttpURLConnection) con; + fd = openURL(urlstr, true); + writeURLData(fd, saltTmp); - http->setRequestMethod("POST"); - http->setFixedLengthStreamingMode(saltTmp->length()); - http->setDoOutput(true); - http->setConnectTimeout(TIMEOUT_MILLIS); - - - http->connect(); - - OutputStream os = http->getOutputStream(); - os->write(saltTmp); - os->flush(); - - int responsecode = http->getResponseCode(); - if (responsecode != HttpURLConnection.HTTP_OK) { - // TODO: Remove this print - System.out.println(responsecode); + int responsecode = getResponseCode(fd); + if (responsecode != HttpURLConnection_HTTP_OK) { throw new Error("Invalid response"); } timer->endTime(); - salt = saltTmp; - } catch (Exception e) { - // e.printStackTrace(); + } catch (Exception *e) { timer->endTime(); - throw new ServerException("Failed setting salt", ServerException.TypeConnectTimeout); + throw new ServerException("Failed setting salt", ServerException_TypeConnectTimeout); } } bool CloudComm::getSalt() { - URL *url = NULL; - URLConnection *con = NULL; - HttpURLConnection *http = NULL; - + int fd = -1; + IoTString *urlstr = NULL; + try { - url = new URL(baseurl + "?req=getsalt"); - } catch (Exception e) { - // e.printStackTrace(); + char *buffer = (char *) malloc(baseurl->length() + 100); + memcpy(buffer, baseurl->internalBytes(), baseurl->length()); + int offset = baseurl->length(); + offset += sprintf(&buffer[offset], "?req=getsalt"); + urlstr = new IoTString(buffer); + free(buffer); + } catch (Exception *e) { throw new Error("getSlot failed"); } try { - timer->startTime(); - con = url->openConnection(); - http = (HttpURLConnection) con; - http->setRequestMethod("POST"); - http->setConnectTimeout(TIMEOUT_MILLIS); - http->setReadTimeout(TIMEOUT_MILLIS); - - - http->connect(); + fd = openURL(urlstr, true); timer->endTime(); - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); - throw new ServerException("getSalt failed", ServerException.TypeConnectTimeout); - } catch (Exception e) { - // e.printStackTrace(); + throw new ServerException("getSalt failed", ServerException_TypeConnectTimeout); + } catch (Exception *e) { throw new Error("getSlot failed"); } try { - timer->startTime(); - - int responsecode = http.getResponseCode(); - if (responsecode != HttpURLConnection.HTTP_OK) { - // TODO: Remove this print - // System.out.println(responsecode); + int responsecode = getResponseCode(fd); + if (responsecode != HttpURLConnection_HTTP_OK) { throw new Error("Invalid response"); } - - InputStream is = http->getInputStream(); if (is->available() > 0) { - DataInputStream dis = new DataInputStream(is); - int salt_length = dis->readInt(); - char [] tmp = new char[salt_length]; - dis->readFully(tmp); + int salt_length = readURLInt(fd); + Array *tmp = new Array(salt_length); + readURLData(fd, tmp); salt = tmp; timer->endTime(); - return true; } else { timer->endTime(); - return false; } - } catch (SocketTimeoutException e) { + } catch (SocketTimeoutException *e) { timer->endTime(); - - throw new ServerException("getSalt failed", ServerException.TypeInputTimeout); - } catch (Exception e) { - // e.printStackTrace(); + throw new ServerException("getSalt failed", ServerException_TypeInputTimeout); + } 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); @@ -233,132 +227,84 @@ Array *CloudComm::createIV(int64_t machineId, int64_t localSequenceNumber) Array *CloudComm::encryptSlotAndPrependIV(Array *rawData, Array *ivBytes) { try { - IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); - Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); - cipher->init(Cipher.ENCRYPT_MODE, key, ivSpec); - - char[] encryptedBytes = cipher->doFinal(rawData); - - char[] chars = new char[encryptedBytes->length + IV_SIZE]; - System.arraycopy(ivBytes, 0, chars, 0, ivBytes.length); - System.arraycopy(encryptedBytes, 0, chars, IV_SIZE, encryptedBytes.length); + IvParameterSpec *ivSpec = new IvParameterSpec(ivBytes); + Cipher *cipher = Cipher_getInstance("AES/CTR/NoPadding"); + cipher->init(Cipher_ENCRYPT_MODE, key, ivSpec); + Array *encryptedBytes = cipher->doFinal(rawData); + 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"); } } - 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); - - IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); - - Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); - cipher->init(Cipher.DECRYPT_MODE, key, ivSpec); + 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); + 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"); } } - /* * API for putting a slot into the queue. Returns NULL on success. * On failure, the server will send slots with newer sequence * numbers. */ Array *CloudComm::putSlot(Slot *slot, int max) { - URL url = NULL; - URLConnection con = NULL; - HttpURLConnection http = NULL; - + int fd = -1; try { if (salt == NULL) { if (!getSalt()) { - throw new ServerException("putSlot failed", ServerException.TypeSalt); + throw new ServerException("putSlot failed", ServerException_TypeSalt); } initCrypt(); } int64_t sequencenumber = slot->getSequenceNumber(); - char[] slotBytes = slot->encode(mac); - // slotBytes = encryptCipher.doFinal(slotBytes); - - // char[] iVBytes = slot.getSlotCryptIV(); - - // char[] chars = new char[slotBytes.length + IV_SIZE]; - // System.arraycopy(iVBytes, 0, chars, 0, iVBytes.length); - // System.arraycopy(slotBytes, 0, chars, IV_SIZE, slotBytes.length); - - - char[] chars = encryptSlotAndPrependIV(slotBytes, slot->getSlotCryptIV()); - - url = buildRequest(true, sequencenumber, max); - + Array *slotBytes = slot->encode(mac); + Array *chars = encryptSlotAndPrependIV(slotBytes, slot->getSlotCryptIV()); + IoTString *url = buildRequest(true, sequencenumber, max); timer->startTime(); - con = url->openConnection(); - http = (HttpURLConnection) con; - - http->setRequestMethod("POST"); - http->setFixedLengthStreamingMode(chars->length); - http->setDoOutput(true); - http->setConnectTimeout(TIMEOUT_MILLIS); - http->setReadTimeout(TIMEOUT_MILLIS); - http->connect(); - - OutputStream os = http->getOutputStream(); - os->write(chars); - os->flush(); - + fd = openURL(url, true); + writeURLData(fd, chars); 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(); + throw new ServerException("putSlot failed", ServerException_TypeConnectTimeout); + } catch (Exception *e) { throw new Error("putSlot failed"); } - - try { timer->startTime(); - InputStream is = http->getInputStream(); - DataInputStream dis = new DataInputStream(is); - char[] resptype = new char[7]; - dis->readFully(resptype); + Array *resptype = new Array(7); + readURLData(fd, resptype); timer->endTime(); - if (Arrays->equals(resptype, "getslot"->getBytes())) { - return processSlots(dis); - } else if (Arrays->equals(resptype, "putslot"->getBytes())) { + if (resptype->equals("getslot"->getBytes())) { + return processSlots(fd); + } else if (resptype->equals("putslot"->getBytes())) { return NULL; } 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,64 +314,47 @@ 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()) { - throw new ServerException("getSlots failed", ServerException.TypeSalt); + throw new ServerException("getSlots failed", ServerException_TypeSalt); } initCrypt(); } - url = buildRequest(false, sequencenumber, 0); + IoTString *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) { + throw new ServerException("getSlots failed", ServerException_TypeConnectTimeout); + } 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); - char[] resptype = new char[7]; - - dis->readFully(resptype); + Array *resptype = new Array(7); + readURLData(fd, 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(); + throw new ServerException("getSlots failed", ServerException_TypeInputTimeout); + } catch (Exception *e) { throw new Error("getSlots failed"); } } @@ -434,181 +363,142 @@ 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) { - int numberofslots = dis->readInt(); - int[] sizesofslots = new int[numberofslots]; +Array *CloudComm::processSlots(int fd) { + int numberofslots = readURLInt(fd); + Array *sizesofslots = new Array(numberofslots); + Array *slots = new Array(numberofslots); - Slot[] slots = new Slot[numberofslots]; for (int i = 0; i < numberofslots; i++) - sizesofslots[i] = dis->readInt(); - + sizesofslots->set(i, readURLInt(fd)); for (int i = 0; i < numberofslots; i++) { - - char[] rawData = new char[sizesofslots[i]]; - dis->readFully(rawData); - - - // char[] data = new char[rawData.length - IV_SIZE]; - // System.arraycopy(rawData, IV_SIZE, data, 0, data.length); - - - char[] data = stripIVAndDecryptSlot(rawData); - - // data = decryptCipher.doFinal(data); - - slots[i] = Slot->decode(table, data, mac); + Array *rawData = new Array(sizesofslots->get(i)); + readURLData(rawData); + Array *data = stripIVAndDecryptSlot(rawData); + 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) { +Array *CloudComm::sendLocalData(Array *sendData, int64_t localSequenceNumber, String host, int port) { + if (salt == NULL) return NULL; - } try { - System.out.println("Passing Locally"); - - mac->update(sendData); - char[] genmac = mac->doFinal(); - char[] totalData = new char[sendData->length + genmac->length]; - System.arraycopy(sendData, 0, totalData, 0, sendData.length); - System.arraycopy(genmac, 0, totalData, sendData.length, genmac->length); + printf("Passing Locally\n"); + mac->update(sendData, 0, sendData->length()); + Array *genmac = mac->doFinal(); + 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 - // char[] encryptedData = encryptCipher.doFinal(totalData); - // char[] encryptedData = encryptCipher.doFinal(totalData); - char[] iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); - char[] encryptedData = encryptSlotAndPrependIV(totalData, iv); + 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) - output->writeInt(encryptedData->length); - output->write(encryptedData, 0, encryptedData->length); + output->writeInt(encryptedData->length()); + output->write(encryptedData, 0, encryptedData->length()); output->flush(); int lengthOfReturnData = input->readInt(); - char[] 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() - CloudComm_HMAC_SIZE); + Array *realmac = mac->doFinal(); + Array *recmac = new Array(CloudComm_HMAC_SIZE); + System_arraycopy(returnData, returnData->length() - realmac->length(), recmac, 0, realmac->length()); - mac->update(returnData, 0, returnData->length - HMAC_SIZE); - char[] realmac = mac->doFinal(); - char[] recmac = new char[HMAC_SIZE]; - System->arraycopy(returnData, returnData->length - realmac->length, recmac, 0, realmac->length); - - if (!Arrays->equals(recmac, realmac)) + if (!recmac->equals(realmac)) throw new Error("Local Error: Invalid HMAC! Potential Attack!"); - char[] 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(); - - DataInputStream input = new DataInputStream(socket->getInputStream()); - DataOutputStream output = new DataOutputStream(socket->getOutputStream()); + Socket *socket = inputSocket->accept(); + DataInputStream *input = new DataInputStream(socket->getInputStream()); + DataOutputStream *output = new DataOutputStream(socket->getOutputStream()); // Get the encrypted data from the server int dataSize = input->readInt(); - char[] 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() - CloudComm_HMAC_SIZE); + Array *genmac = mac->doFinal(); + Array *recmac = new Array(CloudComm_HMAC_SIZE); + System_arraycopy(readData, readData->length() - recmac->length(), recmac, 0, recmac->length()); - mac->update(readData, 0, readData->length - HMAC_SIZE); - char[] genmac = mac->doFinal(); - char[] recmac = new char[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!"); - char[] 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 - // char[] sendData = table->acceptDataFromLocal(readData); - char[] sendData = table->acceptDataFromLocal(returnData); - - - mac->update(sendData); - char[] realmac = mac->doFinal(); - char[] 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 *sendData = table->acceptDataFromLocal(returnData); + mac->update(sendData, 0, sendData->length()); + Array *realmac = mac->doFinal(); + 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 - // char[] encryptedData = encryptCipher->doFinal(totalData); - char[] iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); - char[] encryptedData = encryptSlotAndPrependIV(totalData, iv); - + 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..."); } } @@ -618,14 +508,7 @@ void CloudComm::close() { doEnd = true; if (localServerThread != NULL) { - try { - localServerThread->join(); - } catch (Exception e) { - e->printStackTrace(); + if (pthread_join(localServerThread, NULL) != 0) throw new Error("Local Server thread join issue..."); - } } - - // System.out.println("Done Closing Cloud Comm"); } -