X-Git-Url: http://plrg.eecs.uci.edu/git/?p=iotcloud.git;a=blobdiff_plain;f=version2%2Fsrc%2FC%2FCloudComm.cpp;fp=version2%2Fsrc%2FC%2FCloudComm.cpp;h=d9866166d2cbfd2b9a93fbb2c378ee3dbd1bcc9a;hp=45b7dace5b84e055b5785384731dccd4def6ccf3;hb=44e35968685635bb5c8b28e89a0dafcfe5d1645b;hpb=134729bedb5205a18ea147f468e2c44aca91947c diff --git a/version2/src/C/CloudComm.cpp b/version2/src/C/CloudComm.cpp index 45b7dac..d986616 100644 --- a/version2/src/C/CloudComm.cpp +++ b/version2/src/C/CloudComm.cpp @@ -27,6 +27,7 @@ CloudComm::CloudComm() : password(NULL), random(NULL), salt(NULL), + ivArray(NULL), table(NULL), listeningPort(-1), doEnd(false), @@ -52,6 +53,7 @@ CloudComm::CloudComm(Table *_table, IoTString *_baseurl, IoTString *_password, password(_password->acquireRef()), random(new SecureRandom()), salt(NULL), + ivArray(NULL), table(_table), listeningPort(_listeningPort), doEnd(false), @@ -68,6 +70,8 @@ CloudComm::~CloudComm() { delete putslot; if (salt) delete salt; + if (ivArray) + delete ivArray; if (password) password->releaseRef(); if (random) @@ -116,12 +120,12 @@ void CloudComm::initCrypt() { if (password == NULL) { return; } - try { + try { key = initKey(); password->releaseRef(); password = NULL;// drop password mac = new Mac(); - mac->init(key); + mac->init(key); } catch (Exception *e) { throw new Error("Failed To Initialize Ciphers"); } @@ -504,6 +508,14 @@ Array *CloudComm::createIV(int64_t machineId, int64_t localSequenceNumber) return buffer->array(); } +void CloudComm::createIV() { + if (ivArray == NULL) { + ivArray = new Array(CloudComm_IV_SIZE); + random->nextBytes(ivArray); + printf("Random bytes is generated: %d\n", ivArray->length()); + } +} + Array *AESEncrypt(Array *ivBytes, AESKey *key, Array *data) { Array *output = new Array(data->length()); aes_encrypt_ctr((BYTE *)data->internalArray(), data->length(), (BYTE *) output->internalArray(), (WORD *)key->getKeySchedule(), key->getKey()->length() * 8, (BYTE *)ivBytes->internalArray()); @@ -561,9 +573,11 @@ Array *CloudComm::putSlot(Slot *slot, int max) { int64_t sequencenumber = slot->getSequenceNumber(); Array *slotBytes = slot->encode(mac); - Array * ivBytes = slot->getSlotCryptIV(); - Array *chars = encryptSlotAndPrependIV(slotBytes, ivBytes); - delete ivBytes; + //Array *ivBytes = slot->getSlotCryptIV(); + //Array *chars = encryptSlotAndPrependIV(slotBytes, ivBytes); + //delete ivBytes; + createIV(); + Array *chars = encryptSlotAndPrependIV(slotBytes, ivArray); delete slotBytes; IoTString *url = buildRequest(true, sequencenumber, max); timer->startTime(); @@ -623,33 +637,32 @@ Array *CloudComm::putSlot(Slot *slot, int max) { * sequencenumber or newer-> */ Array *CloudComm::getSlots(int64_t sequencenumber) { + WebConnection wc = {-1, -1}; try { if (salt == NULL) { if (!getSalt()) { throw new ServerException("getSlots failed", ServerException_TypeSalt); - } + } initCrypt(); - } - + } IoTString *url = buildRequest(false, sequencenumber, 0); timer->startTime(); wc = openURL(url); delete url; closeURLReq(&wc); - timer->endTime(); + timer->endTime(); } catch (SocketTimeoutException *e) { timer->endTime(); throw new ServerException("getSlots failed", ServerException_TypeConnectTimeout); } catch (ServerException *e) { timer->endTime(); - throw e; } catch (Exception *e) { throw new Error("getSlots failed"); } - try { + try { timer->startTime(); int responsecode = getResponseCode(&wc); readHeaders(&wc); @@ -661,7 +674,7 @@ Array *CloudComm::getSlots(int64_t sequencenumber) { delete resptype; Array *tmp = processSlots(&wc); - close(wc.fd); + close(wc.fd); return tmp; } catch (SocketTimeoutException *e) { timer->endTime(); @@ -707,8 +720,10 @@ Array *CloudComm::sendLocalData(Array *sendData, int64_t localSequen System_arraycopy(genmac, 0, totalData, sendData->length(), genmac->length()); // Encrypt the data for sending - Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); - Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); + //Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); + //Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); + createIV(); + Array *encryptedData = encryptSlotAndPrependIV(totalData, ivArray); // Open a TCP socket connection to a local device int socket = createSocket(host, port); @@ -788,8 +803,10 @@ void CloudComm::localServerWorkerFunction() { System_arraycopy(realmac, 0, totalData, sendData->length(), realmac->length()); // Encrypt the data for sending - Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); - Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); + //Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); + //Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); + createIV(); + Array *encryptedData = encryptSlotAndPrependIV(totalData, ivArray); timer->startTime(); // Send data to output (length of data, the data)