From: rtrimana Date: Thu, 17 May 2018 15:22:35 +0000 (-0700) Subject: Generating IV from random numbers, not machine ID and local sequence number. X-Git-Url: http://demsky.eecs.uci.edu/git/?p=iotcloud.git;a=commitdiff_plain;h=44e35968685635bb5c8b28e89a0dafcfe5d1645b Generating IV from random numbers, not machine ID and local sequence number. --- 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) diff --git a/version2/src/C/CloudComm.h b/version2/src/C/CloudComm.h index ce7cfa0..e782d30 100644 --- a/version2/src/C/CloudComm.h +++ b/version2/src/C/CloudComm.h @@ -32,6 +32,7 @@ private: IoTString *password; SecureRandom *random; Array *salt; + Array *ivArray; Table *table; int32_t listeningPort; pthread_t localServerThread; @@ -57,6 +58,7 @@ private: void setSalt(); bool getSalt(); Array *createIV(int64_t machineId, int64_t localSequenceNumber); + void createIV(); Array *encryptSlotAndPrependIV(Array *rawData, Array *ivBytes); Array *stripIVAndDecryptSlot(Array *rawData); Array *processSlots(WebConnection *wc);