edits
[iotcloud.git] / version2 / src / C / Slot.cc
index 502c6ca159d2636ce1c7616cb3e94979f49983a2..6f37c9a52f519c7a2718e0444bfe91f2051b6100 100644 (file)
@@ -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<Entry*>();
-  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<char> *_prevhmac, Array<char> *_hmac, int64_t _localSequenceNumber) :
+       seqnum(_seqnum),
+       prevhmac(_prevhmac),
+       hmac(_hmac),
+       machineid(_machineid),
+       entries(new Vector<Entry *>()),
+       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<char> *_prevhmac, int64_t _localSequenceNumber) :
+       seqnum(_seqnum),
+       prevhmac(_prevhmac),
+       hmac(NULL),
+       machineid(_machineid),
+       entries(new Vector<Entry *>()),
+       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<char>(HMAC_SIZE)),
+       hmac(NULL),
+       machineid(_machineid),
+       entries(new Vector<Entry *>()),
+       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<Entry *> *Slot::getEntries() {
+       return entries;
 }
 
-Vector<Entry*> * Slot::getEntries() {
-  return entries;
+Slot *Slot_decode(Table *table, Array<char> *array, Mac *mac) {
+       mac->update(array, HMAC_SIZE, array->length() - HMAC_SIZE);
+       Array<char> *realmac = mac->doFinal();
+
+       ByteBuffer *bb = ByteBuffer_wrap(array);
+       Array<char> *hmac = new Array<char>(HMAC_SIZE);
+       Array<char> *prevhmac = new Array<char>(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<char> *Slot::encode(Mac *mac) {
+       Array<char> *array = new Array<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 (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<char> *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<Entry*> *Slot::getLiveEntries(bool resize) {
-  Vector<Entry*> *liveEntries = new Vector<Entry*>();
-  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<Entry *> *Slot::getLiveEntries(bool resize) {
+       Vector<Entry *> *liveEntries = new Vector<Entry *>();
+       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<Entry*> *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<char> *Slot::getSlotCryptIV() {
+       ByteBuffer *buffer = ByteBuffer_allocate(CloudComm_IV_SIZE);
+       buffer->putLong(machineid);
+       int64_t localSequenceNumberShift = localSequenceNumber << 16;
+       buffer->putLong(localSequenceNumberShift);
+       Array<char> * array = buffer->array();
+       buffer->releaseArray();
+       delete buffer;
+       return array;
 }