password(NULL),
random(NULL),
salt(NULL),
+ ivArray(NULL),
table(NULL),
listeningPort(-1),
doEnd(false),
password(_password->acquireRef()),
random(new SecureRandom()),
salt(NULL),
+ ivArray(NULL),
table(_table),
listeningPort(_listeningPort),
doEnd(false),
delete putslot;
if (salt)
delete salt;
+ if (ivArray)
+ delete ivArray;
if (password)
password->releaseRef();
if (random)
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");
}
return buffer->array();
}
+void CloudComm::createIV() {
+ if (ivArray == NULL) {
+ ivArray = new Array<char>(CloudComm_IV_SIZE);
+ random->nextBytes(ivArray);
+ printf("Random bytes is generated: %d\n", ivArray->length());
+ }
+}
+
Array<char> *AESEncrypt(Array<char> *ivBytes, AESKey *key, Array<char> *data) {
Array<char> *output = new Array<char>(data->length());
aes_encrypt_ctr((BYTE *)data->internalArray(), data->length(), (BYTE *) output->internalArray(), (WORD *)key->getKeySchedule(), key->getKey()->length() * 8, (BYTE *)ivBytes->internalArray());
int64_t sequencenumber = slot->getSequenceNumber();
Array<char> *slotBytes = slot->encode(mac);
- Array<char> * ivBytes = slot->getSlotCryptIV();
- Array<char> *chars = encryptSlotAndPrependIV(slotBytes, ivBytes);
- delete ivBytes;
+ //Array<char> *ivBytes = slot->getSlotCryptIV();
+ //Array<char> *chars = encryptSlotAndPrependIV(slotBytes, ivBytes);
+ //delete ivBytes;
+ createIV();
+ Array<char> *chars = encryptSlotAndPrependIV(slotBytes, ivArray);
delete slotBytes;
IoTString *url = buildRequest(true, sequencenumber, max);
timer->startTime();
* sequencenumber or newer->
*/
Array<Slot *> *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);
delete resptype;
Array<Slot *> *tmp = processSlots(&wc);
- close(wc.fd);
+ close(wc.fd);
return tmp;
} catch (SocketTimeoutException *e) {
timer->endTime();
System_arraycopy(genmac, 0, totalData, sendData->length(), genmac->length());
// Encrypt the data for sending
- Array<char> *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber());
- Array<char> *encryptedData = encryptSlotAndPrependIV(totalData, iv);
+ //Array<char> *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber());
+ //Array<char> *encryptedData = encryptSlotAndPrependIV(totalData, iv);
+ createIV();
+ Array<char> *encryptedData = encryptSlotAndPrependIV(totalData, ivArray);
// Open a TCP socket connection to a local device
int socket = createSocket(host, port);
System_arraycopy(realmac, 0, totalData, sendData->length(), realmac->length());
// Encrypt the data for sending
- Array<char> *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber());
- Array<char> *encryptedData = encryptSlotAndPrependIV(totalData, iv);
+ //Array<char> *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber());
+ //Array<char> *encryptedData = encryptSlotAndPrependIV(totalData, iv);
+ createIV();
+ Array<char> *encryptedData = encryptSlotAndPrependIV(totalData, ivArray);
timer->startTime();
// Send data to output (length of data, the data)