Basic handshake implementation

This commit is contained in:
ameba23
2021-04-13 17:38:03 +02:00
parent 6a143eea8a
commit d2abd6dcc2
2 changed files with 98 additions and 26 deletions

View File

@@ -1,16 +1,16 @@
package org.briarproject.briar.socialbackup.recovery; package org.briarproject.briar.socialbackup.recovery;
import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.client.ClientHelper;
import org.briarproject.bramble.api.crypto.AgreementPublicKey; import org.briarproject.bramble.api.crypto.AgreementPublicKey;
import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.briar.api.socialbackup.recovery.CustodianTask; import org.briarproject.briar.api.socialbackup.recovery.CustodianTask;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
import java.security.PublicKey;
import javax.inject.Inject; import javax.inject.Inject;
@@ -20,6 +20,8 @@ public class CustodianTaskImpl implements CustodianTask {
private Observer observer; private Observer observer;
private ClientHelper clientHelper; private ClientHelper clientHelper;
private InetSocketAddress remoteSocketAddress; private InetSocketAddress remoteSocketAddress;
private Socket socket = new Socket();
private final int TIMEOUT = 120 * 1000;
@Inject @Inject
CustodianTaskImpl(ClientHelper clientHelper) { CustodianTaskImpl(ClientHelper clientHelper) {
@@ -34,30 +36,68 @@ public class CustodianTaskImpl implements CustodianTask {
@Override @Override
public void cancel() { public void cancel() {
cancelled = true; cancelled = true;
try {
socket.close();
} catch (IOException e) {
observer.onStateChanged(new CustodianTask.State.Failure(
State.Failure.Reason.NO_CONNECTION));
}
observer.onStateChanged(
new CustodianTask.State.Failure(State.Failure.Reason.OTHER));
} }
@Override @Override
public void qrCodeDecoded(byte[] qrCodePayloadRaw) { public void qrCodeDecoded(byte[] qrCodePayloadRaw) {
try { try {
BdfList qrCodePayload = clientHelper.toList(qrCodePayloadRaw); BdfList qrCodePayload = clientHelper.toList(qrCodePayloadRaw);
AgreementPublicKey publicKey = new AgreementPublicKey(qrCodePayload.getRaw(0)); AgreementPublicKey publicKey =
byte[] addressRaw = qrCodePayload.getRaw(1); new AgreementPublicKey(qrCodePayload.getRaw(0));
int port = qrCodePayload.getLong(2).intValue(); byte[] addressRaw = qrCodePayload.getRaw(1);
remoteSocketAddress = new InetSocketAddress(InetAddress.getByAddress(addressRaw), port); int port = qrCodePayload.getLong(2).intValue();
System.out.println(" Qr code decoded " + publicKey.getEncoded().length + " " + remoteSocketAddress); remoteSocketAddress =
observer.onStateChanged(new CustodianTask.State.SendingShard()); new InetSocketAddress(InetAddress.getByAddress(addressRaw),
} catch (Exception e) { port);
observer.onStateChanged(new CustodianTask.State.Failure(State.Failure.Reason.QR_CODE_INVALID)); System.out.println(
return; " Qr code decoded " + publicKey.getEncoded().length + " " +
} remoteSocketAddress);
} catch (Exception e) {
observer.onStateChanged(new CustodianTask.State.Failure(
State.Failure.Reason.QR_CODE_INVALID));
return;
}
connectAndSendShard();
}
Socket s = new Socket(); private void connectAndSendShard() {
try { observer.onStateChanged(new CustodianTask.State.SendingShard());
s.connect(remoteSocketAddress, 120 * 1000); try {
} catch (IOException e) { socket.connect(remoteSocketAddress, TIMEOUT);
observer.onStateChanged(new CustodianTask.State.Failure(State.Failure.Reason.QR_CODE_INVALID)); OutputStream outputStream = socket.getOutputStream();
} outputStream.write("crunchy".getBytes());
System.out.println("Connected *****"); observer.onStateChanged(new CustodianTask.State.ReceivingAck());
} catch (IOException e) {
observer.onStateChanged(new CustodianTask.State.Failure(
State.Failure.Reason.QR_CODE_INVALID));
return;
}
System.out.println("Connected *****");
receiveAck();
}
private void receiveAck() {
try {
InputStream inputStream = socket.getInputStream();
byte[] ackMessage = new byte[3];
int read = inputStream.read(ackMessage);
if (read < 0) throw new IOException("Ack not read");
System.out.println("ack message: " + new String(ackMessage));
observer.onStateChanged(new CustodianTask.State.Success());
socket.close();
} catch (IOException e) {
observer.onStateChanged(new CustodianTask.State.Failure(
State.Failure.Reason.QR_CODE_INVALID));
return;
}
} }
} }

View File

@@ -9,9 +9,12 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask; import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.inject.Inject; import javax.inject.Inject;
@@ -24,6 +27,10 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask {
private boolean cancelled = false; private boolean cancelled = false;
private InetSocketAddress socketAddress; private InetSocketAddress socketAddress;
private ClientHelper clientHelper; private ClientHelper clientHelper;
private final int PORT = 3002;
private Observer observer;
private ServerSocket serverSocket;
private Socket socket;
@Inject @Inject
SecretOwnerTaskImpl(CryptoComponent crypto, SecretOwnerTaskImpl(CryptoComponent crypto,
@@ -36,15 +43,15 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask {
@Override @Override
public void start(Observer observer, InetAddress inetAddress) { public void start(Observer observer, InetAddress inetAddress) {
this.observer = observer;
if (inetAddress == null) observer.onStateChanged(new State.Failure()); if (inetAddress == null) observer.onStateChanged(new State.Failure());
System.out.println("InetAddress is " + inetAddress); System.out.println("InetAddress is " + inetAddress);
socketAddress = new InetSocketAddress(inetAddress, 3002); socketAddress = new InetSocketAddress(inetAddress, PORT);
// start listening on socketAddress // start listening on socketAddress
ServerSocket ss = null;
try { try {
ss = new ServerSocket(); serverSocket = new ServerSocket();
ss.bind(socketAddress); serverSocket.bind(socketAddress);
} catch (IOException e) { } catch (IOException e) {
observer.onStateChanged(new State.Failure()); observer.onStateChanged(new State.Failure());
// TODO could try incrementing the port number // TODO could try incrementing the port number
@@ -61,11 +68,36 @@ public class SecretOwnerTaskImpl implements SecretOwnerTask {
new State.Listening(clientHelper.toByteArray(payloadList))); new State.Listening(clientHelper.toByteArray(payloadList)));
} catch (Exception e) { } catch (Exception e) {
observer.onStateChanged(new State.Failure()); observer.onStateChanged(new State.Failure());
return;
}
receiveShard();
}
private void receiveShard() {
try {
socket = serverSocket.accept();
observer.onStateChanged(new State.ReceivingShard());
InputStream inputStream = socket.getInputStream();
byte[] payloadRaw = new byte[7];
int read = inputStream.read(payloadRaw);
if (read < 0) throw new IOException("Payload not read");
System.out.println("payload message: " + new String(payloadRaw));
OutputStream outputStream = socket.getOutputStream();
outputStream.write("ack".getBytes());
serverSocket.close();
} catch (IOException e) {
observer.onStateChanged(new State.Failure());
} }
} }
@Override @Override
public void cancel() { public void cancel() {
cancelled = true; cancelled = true;
try {
serverSocket.close();
} catch (IOException e) {
observer.onStateChanged(new State.Failure());
}
observer.onStateChanged(new State.Failure());
} }
} }