X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=version2%2Fsrc%2FC%2FSlot.cc;h=6f37c9a52f519c7a2718e0444bfe91f2051b6100;hb=7095771b9769e87bdc5df84e306e3d95e6e4040b;hp=502c6ca159d2636ce1c7616cb3e94979f49983a2;hpb=f0a95f7a96e808259ced5e9f61e029773c7a85e6;p=iotcloud.git diff --git a/version2/src/C/Slot.cc b/version2/src/C/Slot.cc index 502c6ca..6f37c9a 100644 --- a/version2/src/C/Slot.cc +++ b/version2/src/C/Slot.cc @@ -1,44 +1,77 @@ #include "Slot.h" - -Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, char* _prevhmac, char* _hmac, int64_t _localSequenceNumber) { - seqnum = _seqnum; - machineid = _machineid; - prevhmac = _prevhmac; - hmac = _hmac; - entries = new Vector(); - livecount = 1; - seqnumlive = true; - freespace = SLOT_SIZE - getBaseSize(); - table = _table; - localSequenceNumber = _localSequenceNumber; +#include "ByteBuffer.h" +#include "Entry.h" +#include "Error.h" +#include "CloudComm.h" +#include "Table.h" +#include "LastMessage.h" +#include "Mac.h" + +Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array *_prevhmac, Array *_hmac, int64_t _localSequenceNumber) : + seqnum(_seqnum), + prevhmac(_prevhmac), + hmac(_hmac), + machineid(_machineid), + entries(new Vector()), + livecount(1), + seqnumlive(true), + freespace(SLOT_SIZE - getBaseSize()), + table(_table), + fakeLastMessage(NULL), + localSequenceNumber(_localSequenceNumber) { } -Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, char* _prevhmac, int64_t _localSequenceNumber) { - this(_table, _seqnum, _machineid, _prevhmac, NULL, _localSequenceNumber); +Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array *_prevhmac, int64_t _localSequenceNumber) : + seqnum(_seqnum), + prevhmac(_prevhmac), + hmac(NULL), + machineid(_machineid), + entries(new Vector()), + livecount(1), + seqnumlive(true), + freespace(SLOT_SIZE - getBaseSize()), + table(_table), + fakeLastMessage(NULL), + localSequenceNumber(_localSequenceNumber) { } -Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, int64_t _localSequenceNumber) { - this(_table, _seqnum, _machineid, new char[HMAC_SIZE], NULL, _localSequenceNumber); +Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, int64_t _localSequenceNumber) : + seqnum(_seqnum), + prevhmac(new Array(HMAC_SIZE)), + hmac(NULL), + machineid(_machineid), + entries(new Vector()), + livecount(1), + seqnumlive(true), + freespace(SLOT_SIZE - getBaseSize()), + table(_table), + fakeLastMessage(NULL), + localSequenceNumber(_localSequenceNumber) { } -Entry * Slot::addEntry(Entry * e) { - e = e->getCopy(this); - entries->add(e); - livecount++; - freespace -= e->getSize(); - return e; +Slot::~Slot() { + if (hmac != NULL) + delete hmac; + delete prevhmac; + for(uint i=0; i< entries->size(); i++) + delete entries->get(i); + delete entries; + if (fakeLastMessage) + delete fakeLastMessage; } -void Slot::removeEntry(Entry *e) { - entries->remove(e); - livecount--; - freespace += e->getSize(); +Entry *Slot::addEntry(Entry *e) { + e = e->getCopy(this); + entries->add(e); + livecount++; + freespace -= e->getSize(); + return e; } void Slot::addShallowEntry(Entry *e) { - entries->add(e); - livecount++; - freespace -= e->getSize(); + entries->add(e); + livecount++; + freespace -= e->getSize(); } /** @@ -46,57 +79,66 @@ void Slot::addShallowEntry(Entry *e) { * using its reserved space. */ bool Slot::hasSpace(Entry *e) { - int newfreespace = freespace - e->getSize(); - return newfreespace >= 0; + int newfreespace = freespace - e->getSize(); + return newfreespace >= 0; +} + +Vector *Slot::getEntries() { + return entries; } -Vector * Slot::getEntries() { - return entries; +Slot *Slot_decode(Table *table, Array *array, Mac *mac) { + mac->update(array, HMAC_SIZE, array->length() - HMAC_SIZE); + Array *realmac = mac->doFinal(); + + ByteBuffer *bb = ByteBuffer_wrap(array); + Array *hmac = new Array(HMAC_SIZE); + Array *prevhmac = new Array(HMAC_SIZE); + bb->get(hmac); + bb->get(prevhmac); + if (!realmac->equals(hmac)) + throw new Error("Server Error: Invalid HMAC! Potential Attack!"); + delete realmac; + + int64_t seqnum = bb->getLong(); + int64_t machineid = bb->getLong(); + int numentries = bb->getInt(); + Slot *slot = new Slot(table, seqnum, machineid, prevhmac, hmac, -1); + + for (int i = 0; i < numentries; i++) { + slot->addShallowEntry(Entry_decode(slot, bb)); + } + bb->releaseArray(); + delete bb; + return slot; } -Slot * Slotdecode(Table * table, char* array, Mac * mac) { - mac->update(array, HMAC_SIZE, array.length - HMAC_SIZE); - char* realmac = mac->doFinal(); - - ByteBuffer * bb = ByteBuffer_wrap(array); - char* hmac = new char[HMAC_SIZE]; - char* prevhmac = new char[HMAC_SIZE]; - bb->get(hmac); - bb->get(prevhmac); - if (!Arrays.equals(realmac, hmac)) - throw new Error("Server Error: Invalid HMAC! Potential Attack!"); - - int64_t seqnum = bb->getLong(); - int64_t machineid = bb->getLong(); - int numentries = bb->getInt(); - Slot slot = new Slot(table, seqnum, machineid, prevhmac, hmac, -1); - - for (int i = 0; i < numentries; i++) { - slot->addShallowEntry(Entry->decode(slot, bb)); - } - - return slot; +char Slot::getType() { + return TypeSlot; } -char* Slot::encode(Mac mac) { - char* array = new char[SLOT_SIZE]; - ByteBuffer * bb = ByteBuffer_wrap(array); - /* Leave space for the slot HMAC. */ - bb->position(HMAC_SIZE); - bb->put(prevhmac); - bb->putLong(seqnum); - bb->putLong(machineid); - bb->putInt(entries->size()); - for (Entry entry : entries) { - entry->encode(bb); - } - /* Compute our HMAC */ - mac->update(array, HMAC_SIZE, array.length - HMAC_SIZE); - char* realmac = mac->doFinal(); - hmac = realmac; - bb->position(0); - bb->put(realmac); - return array; +Array *Slot::encode(Mac *mac) { + Array *array = new Array(SLOT_SIZE); + ByteBuffer *bb = ByteBuffer_wrap(array); + /* Leave space for the slot HMAC. */ + bb->position(HMAC_SIZE); + bb->put(prevhmac); + bb->putLong(seqnum); + bb->putLong(machineid); + bb->putInt(entries->size()); + for (uint ei = 0; ei < entries->size(); ei++) { + Entry *entry = entries->get(ei); + entry->encode(bb); + } + /* Compute our HMAC */ + mac->update(array, HMAC_SIZE, array->length() - HMAC_SIZE); + Array *realmac = mac->doFinal(); + hmac = realmac; + bb->position(0); + bb->put(realmac); + bb->releaseArray(); + delete bb; + return array; } @@ -106,19 +148,22 @@ char* Slot::encode(Mac mac) { * itself. */ -Vector *Slot::getLiveEntries(bool resize) { - Vector *liveEntries = new Vector(); - for (Entry *entry : entries) { - if (entry->isLive()) { - if (!resize || entry->getType() != Entry->TypeTableStatus) - liveEntries->add(entry); - } - } - - if (seqnumlive && !resize) - liveEntries->add(new LastMessage(this, machineid, seqnum)); - - return liveEntries; +Vector *Slot::getLiveEntries(bool resize) { + Vector *liveEntries = new Vector(); + for (uint ei = 0; ei < entries->size(); ei++) { + Entry *entry = entries->get(ei); + if (entry->isLive()) { + if (!resize || entry->getType() != TypeTableStatus) + liveEntries->add(entry); + } + } + + if (seqnumlive && !resize) { + if (! fakeLastMessage) + fakeLastMessage = new LastMessage(this, machineid, seqnum); + liveEntries->add(fakeLastMessage); + } + return liveEntries; } @@ -128,8 +173,8 @@ Vector *Slot::getLiveEntries(bool resize) { */ void Slot::setDead() { - seqnumlive = false; - decrementLiveCount(); + seqnumlive = false; + decrementLiveCount(); } /** @@ -137,16 +182,19 @@ void Slot::setDead() { */ void Slot::decrementLiveCount() { - livecount--; - if (livecount == 0) { - table->decrementLiveCount(); - } + livecount--; + if (livecount == 0) { + table->decrementLiveCount(); + } } -char* Slot::getSlotCryptIV() { - ByteBuffer * buffer = ByteBuffer_allocate(CloudComm.IV_SIZE); - buffer->putLong(machineid); - int64_t localSequenceNumberShift = localSequenceNumber << 16; - buffer->putLong(localSequenceNumberShift); - return buffer->array(); +Array *Slot::getSlotCryptIV() { + ByteBuffer *buffer = ByteBuffer_allocate(CloudComm_IV_SIZE); + buffer->putLong(machineid); + int64_t localSequenceNumberShift = localSequenceNumber << 16; + buffer->putLong(localSequenceNumberShift); + Array * array = buffer->array(); + buffer->releaseArray(); + delete buffer; + return array; }