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[] prevhmac; byte[] hmac; long machineid; Vector 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) { seqnum=_seqnum; } byte[] getHMAC() { return hmac; } byte[] getPrevHMAC() { return prevhmac; } 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"; } }