From 021c91a082ea8c5f22b368ddca3926d97101279c Mon Sep 17 00:00:00 2001 From: Brian Demsky Date: Fri, 22 Jul 2016 23:52:16 -0700 Subject: [PATCH] more code --- src/java/iotcloud/Entry.java | 28 ++++++++++- src/java/iotcloud/KeyValue.java | 29 ++++++++++- src/java/iotcloud/LastMessage.java | 25 +++++++++- src/java/iotcloud/RejectedMessage.java | 30 +++++++++++- src/java/iotcloud/Slot.java | 68 +++++++++++++++++++++++--- src/java/iotcloud/Table.java | 6 +++ src/java/iotcloud/TableStatus.java | 24 +++++++++ src/server/iotquery.cpp | 4 ++ 8 files changed, 202 insertions(+), 12 deletions(-) create mode 100644 src/java/iotcloud/Table.java create mode 100644 src/java/iotcloud/TableStatus.java diff --git a/src/java/iotcloud/Entry.java b/src/java/iotcloud/Entry.java index 0e6d43d..9f85bac 100644 --- a/src/java/iotcloud/Entry.java +++ b/src/java/iotcloud/Entry.java @@ -1,5 +1,29 @@ package iotcloud; +import java.nio.ByteBuffer; -public abstract class Entry { - +abstract class Entry { + static final byte TypeKeyValue = 1; + static final byte TypeLastMessage = 2; + static final byte TypeRejectedMessage = 3; + static final byte TypeTableStatus = 4; + + static Entry decode(ByteBuffer bb) { + byte type=bb.get(); + switch(type) { + case TypeKeyValue: + return KeyValue.decode(bb); + case TypeLastMessage: + return LastMessage.decode(bb); + case TypeRejectedMessage: + return RejectedMessage.decode(bb); + case TypeTableStatus: + return TableStatus.decode(bb); + default: + throw new Error("Unrecognized Entry Type: "+type); + } + } + + abstract void encode(ByteBuffer bb); + + abstract int getSize(); } diff --git a/src/java/iotcloud/KeyValue.java b/src/java/iotcloud/KeyValue.java index fd74dc1..39125e2 100644 --- a/src/java/iotcloud/KeyValue.java +++ b/src/java/iotcloud/KeyValue.java @@ -1,6 +1,33 @@ package iotcloud; +import java.nio.ByteBuffer; -public class KeyValue extends Entry { +class KeyValue extends Entry { + byte[] key; + byte[] value; + KeyValue(byte[] _key, byte[] _value) { + key=_key; + value=_value; + } + static Entry decode(ByteBuffer bb) { + int keylength=bb.getInt(); + int valuelength=bb.getInt(); + byte[] key=new byte[keylength]; + byte[] value=new byte[valuelength]; + bb.get(key); + bb.get(value); + return new KeyValue(key, value); + } + void encode(ByteBuffer bb) { + bb.put(Entry.TypeKeyValue); + bb.putInt(key.length); + bb.putInt(value.length); + bb.put(key); + bb.put(value); + } + + int getSize() { + return 2*Integer.BYTES+key.length+value.length+Byte.BYTES; + } } diff --git a/src/java/iotcloud/LastMessage.java b/src/java/iotcloud/LastMessage.java index ad1f273..023608b 100644 --- a/src/java/iotcloud/LastMessage.java +++ b/src/java/iotcloud/LastMessage.java @@ -1,6 +1,29 @@ package iotcloud; -public class LastMessage extends Entry { +import java.nio.ByteBuffer; +class LastMessage extends Entry { + private long machineid; + private long seqnum; + + LastMessage(long _machineid, long _seqnum) { + machineid=_machineid; + seqnum=_seqnum; + } + static Entry decode(ByteBuffer bb) { + long machineid=bb.getLong(); + long seqnum=bb.getLong(); + return new LastMessage(machineid, seqnum); + } + + void encode(ByteBuffer bb) { + bb.put(Entry.TypeLastMessage); + bb.putLong(machineid); + bb.putLong(seqnum); + } + + int getSize() { + return 2*Long.BYTES+Byte.BYTES; + } } diff --git a/src/java/iotcloud/RejectedMessage.java b/src/java/iotcloud/RejectedMessage.java index f74c0c1..6a080b7 100644 --- a/src/java/iotcloud/RejectedMessage.java +++ b/src/java/iotcloud/RejectedMessage.java @@ -1,6 +1,32 @@ package iotcloud; +import java.nio.ByteBuffer; -public class RejectedMessage extends Entry { - +class RejectedMessage extends Entry { + private long machineid; + private long seqnum; + private boolean equalto; + RejectedMessage(long _machineid, long _seqnum, boolean _equalto) { + machineid=_machineid; + seqnum=_seqnum; + equalto=_equalto; + } + + static Entry decode(ByteBuffer bb) { + long machineid=bb.getLong(); + long seqnum=bb.getLong(); + byte equalto=bb.get(); + return new RejectedMessage(machineid, seqnum, equalto==1); + } + + void encode(ByteBuffer bb) { + bb.put(Entry.TypeRejectedMessage); + bb.putLong(machineid); + bb.putLong(seqnum); + bb.put(equalto?(byte)1:(byte)0); + } + + int getSize() { + return 2*Long.BYTES + 2*Byte.BYTES; + } } diff --git a/src/java/iotcloud/Slot.java b/src/java/iotcloud/Slot.java index 33a8908..8d12fc2 100644 --- a/src/java/iotcloud/Slot.java +++ b/src/java/iotcloud/Slot.java @@ -1,19 +1,75 @@ package iotcloud; import java.util.Vector; +import java.nio.ByteBuffer; +import javax.crypto.Mac; +import java.util.Arrays; class Slot { + public static final int SLOT_SIZE=2048; + public static final int HMAC_SIZE=32; + long seqnum; - byte[] bytes; + byte[] prevhmac; + byte[] hmac; + long machineid; Vector entries; - Slot() { - entries=new Vector(); + Slot(Vector _entries) { + entries=_entries; + } + + Slot(long _seqnum, long _machineid, byte[] _prevhmac, byte[] _hmac, Vector _entries) { + seqnum=_seqnum; + machineid=_machineid; + prevhmac=_prevhmac; + hmac=_hmac; + entries=_entries; } Slot(long _seqnum, byte[] _bytes) { - this(); seqnum=_seqnum; - bytes=_bytes; + } + + static Slot decode(byte[] array, Mac mac) { + mac.update(array, HMAC_SIZE, array.length-HMAC_SIZE); + byte[] realmac=mac.doFinal(); + + ByteBuffer bb=ByteBuffer.wrap(array); + byte[] hmac=new byte[HMAC_SIZE]; + byte[] prevhmac=new byte[HMAC_SIZE]; + bb.get(hmac); + bb.get(prevhmac); + if (!Arrays.equals(realmac, hmac)) + throw new Error("Invalid HMAC! Potential Attack!"); + + long seqnum=bb.getLong(); + long machineid=bb.getLong(); + int numentries=bb.getInt(); + Vector entries=new Vector(); + for(int i=0;i