- private Slot[] processSlots(DataInputStream dis) throws Exception {
- int numberofslots = dis.readInt();
- int[] sizesofslots = new int[numberofslots];
-
- Slot[] slots = new Slot[numberofslots];
- for (int i = 0; i < numberofslots; i++)
- sizesofslots[i] = dis.readInt();
-
- for (int i = 0; i < numberofslots; i++) {
-
- char[] rawData = new char[sizesofslots[i]];
- dis.readFully(rawData);
-
-
- // char[] data = new char[rawData.length - IV_SIZE];
- // System.arraycopy(rawData, IV_SIZE, data, 0, data.length);
-
-
- char[] data = stripIVAndDecryptSlot(rawData);
-
- // data = decryptCipher.doFinal(data);
-
- slots[i] = Slot.decode(table, data, mac);
- }
- dis.close();
- return slots;
- }
-
- public char[] sendLocalData(char[] sendData, int64_t localSequenceNumber, String host, int port) {
-
- if (salt == NULL) {
- return NULL;
- }
- try {
- System.out.println("Passing Locally");
-
- mac.update(sendData);
- char[] genmac = mac.doFinal();
- char[] totalData = new char[sendData.length + genmac.length];
- System.arraycopy(sendData, 0, totalData, 0, sendData.length);
- System.arraycopy(genmac, 0, totalData, sendData.length, genmac.length);
-
- // Encrypt the data for sending
- // char[] encryptedData = encryptCipher.doFinal(totalData);
- // char[] encryptedData = encryptCipher.doFinal(totalData);
- char[] iv = createIV(table.getMachineId(), table.getLocalSequenceNumber());
- char[] encryptedData = encryptSlotAndPrependIV(totalData, iv);
-
- // Open a TCP socket connection to a local device
- Socket socket = new Socket(host, port);
- socket.setReuseAddress(true);
- DataOutputStream output = new DataOutputStream(socket.getOutputStream());
- DataInputStream input = new DataInputStream(socket.getInputStream());
-
-
- timer.startTime();
- // Send data to output (length of data, the data)
- output.writeInt(encryptedData.length);
- output.write(encryptedData, 0, encryptedData.length);
- output.flush();
-
- int lengthOfReturnData = input.readInt();
- char[] returnData = new char[lengthOfReturnData];
- input.readFully(returnData);
-
- timer.endTime();
-
- // returnData = decryptCipher.doFinal(returnData);
- returnData = stripIVAndDecryptSlot(returnData);
- // returnData = decryptCipher.doFinal(returnData);
-
- // We are done with this socket
- socket.close();
-
- mac.update(returnData, 0, returnData.length - HMAC_SIZE);
- char[] realmac = mac.doFinal();
- char[] recmac = new char[HMAC_SIZE];
- System.arraycopy(returnData, returnData.length - realmac.length, recmac, 0, realmac.length);
-
- if (!Arrays.equals(recmac, realmac))
- throw new Error("Local Error: Invalid HMAC! Potential Attack!");
-
- char[] returnData2 = new char[lengthOfReturnData - recmac.length];
- System.arraycopy(returnData, 0, returnData2, 0, returnData2.length);
-
- return returnData2;
- } catch (Exception e) {
- e.printStackTrace();
- // throw new Error("Local comms failure...");
-
- }
-
- return NULL;
- }
-
- private void localServerWorkerFunction() {
-
- ServerSocket inputSocket = NULL;
-
- try {
- // Local server socket
- inputSocket = new ServerSocket(listeningPort);
- inputSocket.setReuseAddress(true);
- inputSocket.setSoTimeout(TIMEOUT_MILLIS);
- } catch (Exception e) {
- e.printStackTrace();
- throw new Error("Local server setup failure...");
- }
-
- while (!doEnd) {
-
- try {
- // Accept incoming socket
- Socket socket = inputSocket.accept();
-
- DataInputStream input = new DataInputStream(socket.getInputStream());
- DataOutputStream output = new DataOutputStream(socket.getOutputStream());
-
- // Get the encrypted data from the server
- int dataSize = input.readInt();
- char[] readData = new char[dataSize];
- input.readFully(readData);
-
- timer.endTime();
-
- // Decrypt the data
- // readData = decryptCipher.doFinal(readData);
- readData = stripIVAndDecryptSlot(readData);
-
- mac.update(readData, 0, readData.length - HMAC_SIZE);
- char[] genmac = mac.doFinal();
- char[] recmac = new char[HMAC_SIZE];
- System.arraycopy(readData, readData.length - recmac.length, recmac, 0, recmac.length);
-
- if (!Arrays.equals(recmac, genmac))
- throw new Error("Local Error: Invalid HMAC! Potential Attack!");
-
- char[] returnData = new char[readData.length - recmac.length];
- System.arraycopy(readData, 0, returnData, 0, returnData.length);
-
- // Process the data
- // char[] sendData = table.acceptDataFromLocal(readData);
- char[] sendData = table.acceptDataFromLocal(returnData);
-
-
- mac.update(sendData);
- char[] realmac = mac.doFinal();
- char[] totalData = new char[sendData.length + realmac.length];
- System.arraycopy(sendData, 0, totalData, 0, sendData.length);
- System.arraycopy(realmac, 0, totalData, sendData.length, realmac.length);
-
- // Encrypt the data for sending
- // char[] encryptedData = encryptCipher.doFinal(totalData);
- char[] iv = createIV(table.getMachineId(), table.getLocalSequenceNumber());
- char[] encryptedData = encryptSlotAndPrependIV(totalData, iv);
-
-
- timer.startTime();
- // Send data to output (length of data, the data)
- output.writeInt(encryptedData.length);
- output.write(encryptedData, 0, encryptedData.length);
- output.flush();
-
- // close the socket
- socket.close();
- } catch (Exception e) {
-
- }
- }
-
- if (inputSocket != NULL) {
- try {
- inputSocket.close();
- } catch (Exception e) {
- e.printStackTrace();
- throw new Error("Local server close failure...");
- }
- }
- }
-
- public void close() {
- doEnd = true;
-
- if (localServerThread != NULL) {
- try {
- localServerThread.join();
- } catch (Exception e) {
- e.printStackTrace();
- throw new Error("Local Server thread join issue...");
- }
- }
-
- // System.out.println("Done Closing Cloud Comm");
- }