From f793e19e25f47b67ba1e3520ec561360d3d08513 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Wed, 16 May 2018 23:04:21 -0700 Subject: [PATCH] Generating IV from random numbers and not from machine ID and local sequence number. --- version2/src/C/CloudComm.cpp | 25 ++++++++++++++++++++----- version2/src/C/CloudComm.h | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/version2/src/C/CloudComm.cpp b/version2/src/C/CloudComm.cpp index 9898039..9af2bf6 100755 --- 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), @@ -46,6 +47,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), @@ -62,6 +64,8 @@ CloudComm::~CloudComm() { delete putslot; if (salt) delete salt; + if (ivArray) + delete ivArray; if (password) password->releaseRef(); if (random) @@ -447,6 +451,13 @@ 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); + } +} + 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()); @@ -505,9 +516,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(); @@ -653,8 +666,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 TCPClient socket = createSocket(host, port); diff --git a/version2/src/C/CloudComm.h b/version2/src/C/CloudComm.h index 35d5fcc..218fb4e 100755 --- a/version2/src/C/CloudComm.h +++ b/version2/src/C/CloudComm.h @@ -34,6 +34,7 @@ private: IoTString *password; SecureRandom *random; Array *salt; + Array *ivArray; Table *table; int32_t listeningPort; // pthread_t localServerThread; @@ -59,6 +60,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); -- 2.34.1