mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 19:59:05 +01:00
Introduction Client: Add MAC and signature to ACK message
The MAC and signature are not yet generated and verified. This will happen in a later commit.
This commit is contained in:
@@ -22,6 +22,7 @@ import java.util.logging.Logger;
|
||||
|
||||
import static java.util.logging.Level.INFO;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static org.briarproject.api.introduction.IntroduceeAction.ACK;
|
||||
import static org.briarproject.api.introduction.IntroduceeAction.LOCAL_ABORT;
|
||||
import static org.briarproject.api.introduction.IntroduceeAction.LOCAL_ACCEPT;
|
||||
import static org.briarproject.api.introduction.IntroduceeAction.LOCAL_DECLINE;
|
||||
@@ -39,6 +40,7 @@ import static org.briarproject.api.introduction.IntroductionConstants.EXISTS;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.E_PUBLIC_KEY;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.GROUP_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.INTRODUCER;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MAC;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MESSAGE_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MESSAGE_TIME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MSG;
|
||||
@@ -51,6 +53,7 @@ import static org.briarproject.api.introduction.IntroductionConstants.REMOTE_AUT
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.REMOTE_AUTHOR_IS_US;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.ROLE_INTRODUCEE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.SESSION_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.SIGNATURE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.STATE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TASK;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TASK_ABORT;
|
||||
@@ -97,10 +100,10 @@ public class IntroduceeEngine
|
||||
else return abortSession(currentState, localState);
|
||||
}
|
||||
|
||||
List<BdfDictionary> messages = new ArrayList<BdfDictionary>(1);
|
||||
if (action == LOCAL_ACCEPT || action == LOCAL_DECLINE) {
|
||||
localState.put(STATE, nextState.getValue());
|
||||
localState.put(ANSWERED, true);
|
||||
List<BdfDictionary> messages = new ArrayList<BdfDictionary>(1);
|
||||
// create the introduction response message
|
||||
BdfDictionary msg = new BdfDictionary();
|
||||
msg.put(TYPE, TYPE_RESPONSE);
|
||||
@@ -118,17 +121,18 @@ public class IntroduceeEngine
|
||||
|
||||
if (nextState == AWAIT_ACK) {
|
||||
localState.put(TASK, TASK_ADD_CONTACT);
|
||||
// also send ACK, because we already have the other response
|
||||
BdfDictionary ack = getAckMessage(localState);
|
||||
messages.add(ack);
|
||||
}
|
||||
List<Event> events = Collections.emptyList();
|
||||
return new StateUpdate<BdfDictionary, BdfDictionary>(false,
|
||||
false,
|
||||
localState, messages, events);
|
||||
} else if (action == ACK) {
|
||||
// just send ACK, don't update local state again
|
||||
BdfDictionary ack = getAckMessage(localState);
|
||||
messages.add(ack);
|
||||
} else {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
List<Event> events = Collections.emptyList();
|
||||
return new StateUpdate<BdfDictionary, BdfDictionary>(false,
|
||||
false,
|
||||
localState, messages, events);
|
||||
} catch (FormatException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
@@ -181,11 +185,8 @@ public class IntroduceeEngine
|
||||
addResponseData(localState, msg);
|
||||
if (nextState == AWAIT_ACK) {
|
||||
localState.put(TASK, TASK_ADD_CONTACT);
|
||||
messages = Collections
|
||||
.singletonList(getAckMessage(localState));
|
||||
} else {
|
||||
messages = Collections.emptyList();
|
||||
}
|
||||
messages = Collections.emptyList();
|
||||
events = Collections.emptyList();
|
||||
}
|
||||
// we already sent our ACK and now received the other one
|
||||
@@ -247,6 +248,8 @@ public class IntroduceeEngine
|
||||
m.put(TYPE, TYPE_ACK);
|
||||
m.put(GROUP_ID, localState.getRaw(GROUP_ID));
|
||||
m.put(SESSION_ID, localState.getRaw(SESSION_ID));
|
||||
m.put(MAC, localState.getRaw(MAC));
|
||||
m.put(SIGNATURE, localState.getRaw(SIGNATURE));
|
||||
|
||||
if (LOG.isLoggable(INFO)) {
|
||||
LOG.info("Sending ACK " + " to " +
|
||||
|
||||
@@ -40,6 +40,7 @@ import javax.inject.Inject;
|
||||
|
||||
import static java.util.logging.Level.INFO;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static org.briarproject.api.data.BdfDictionary.NULL_VALUE;
|
||||
import static org.briarproject.api.introduction.IntroduceeProtocolState.AWAIT_REQUEST;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.ACCEPT;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.ADDED_CONTACT_ID;
|
||||
@@ -51,6 +52,7 @@ import static org.briarproject.api.introduction.IntroductionConstants.E_PUBLIC_K
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.GROUP_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.INTRODUCER;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.LOCAL_AUTHOR_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MAC;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MESSAGE_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MESSAGE_TIME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.NAME;
|
||||
@@ -63,6 +65,7 @@ import static org.briarproject.api.introduction.IntroductionConstants.REMOTE_AUT
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.REMOTE_AUTHOR_IS_US;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.ROLE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.ROLE_INTRODUCEE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.SIGNATURE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.STATE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.STORAGE_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TASK;
|
||||
@@ -73,6 +76,7 @@ import static org.briarproject.api.introduction.IntroductionConstants.TIME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TRANSPORT;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TYPE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TYPE_ABORT;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TYPE_ACK;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TYPE_RESPONSE;
|
||||
|
||||
class IntroduceeManager {
|
||||
@@ -258,11 +262,12 @@ class IntroduceeManager {
|
||||
private void performTasks(Transaction txn, BdfDictionary localState)
|
||||
throws FormatException, DbException {
|
||||
|
||||
if (!localState.containsKey(TASK)) return;
|
||||
if (!localState.containsKey(TASK) || localState.get(TASK) == NULL_VALUE)
|
||||
return;
|
||||
|
||||
// remember task and remove it from localState
|
||||
long task = localState.getLong(TASK);
|
||||
localState.put(TASK, BdfDictionary.NULL_VALUE);
|
||||
localState.put(TASK, NULL_VALUE);
|
||||
|
||||
if (task == TASK_ADD_CONTACT) {
|
||||
if (localState.getBoolean(EXISTS)) {
|
||||
@@ -312,6 +317,10 @@ class IntroduceeManager {
|
||||
throw new FormatException();
|
||||
}
|
||||
|
||||
// TODO MAC and signature
|
||||
localState.put(MAC, new byte[42]);
|
||||
localState.put(SIGNATURE, new byte[42]);
|
||||
|
||||
// The agreed timestamp is the minimum of the peers' timestamps
|
||||
long ourTime = localState.getLong(OUR_TIME);
|
||||
long theirTime = localState.getLong(TIME);
|
||||
@@ -339,7 +348,16 @@ class IntroduceeManager {
|
||||
// delete the ephemeral private key by overwriting with NULL value
|
||||
// this ensures future ephemeral keys can not be recovered when
|
||||
// this device should gets compromised
|
||||
localState.put(OUR_PRIVATE_KEY, BdfDictionary.NULL_VALUE);
|
||||
localState.put(OUR_PRIVATE_KEY, NULL_VALUE);
|
||||
|
||||
// define next action: Send ACK
|
||||
BdfDictionary localAction = new BdfDictionary();
|
||||
localAction.put(TYPE, TYPE_ACK);
|
||||
|
||||
// start engine and process its state update
|
||||
IntroduceeEngine engine = new IntroduceeEngine();
|
||||
processStateUpdate(txn, null,
|
||||
engine.onLocalAction(localState, localAction));
|
||||
}
|
||||
|
||||
// we sent and received an ACK, so activate contact
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package org.briarproject.introduction;
|
||||
|
||||
import org.briarproject.api.FormatException;
|
||||
import org.briarproject.api.clients.BdfMessageContext;
|
||||
import org.briarproject.api.clients.ClientHelper;
|
||||
import org.briarproject.api.clients.SessionId;
|
||||
import org.briarproject.api.clients.BdfMessageContext;
|
||||
import org.briarproject.api.data.BdfDictionary;
|
||||
import org.briarproject.api.data.BdfList;
|
||||
import org.briarproject.api.data.MetadataEncoder;
|
||||
@@ -15,15 +15,18 @@ import org.briarproject.clients.BdfMessageValidator;
|
||||
import static org.briarproject.api.TransportId.MAX_TRANSPORT_ID_LENGTH;
|
||||
import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
|
||||
import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
|
||||
import static org.briarproject.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.ACCEPT;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.E_PUBLIC_KEY;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.GROUP_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MAC;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MESSAGE_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MESSAGE_TIME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MSG;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.NAME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.PUBLIC_KEY;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.SESSION_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.SIGNATURE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TIME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TRANSPORT;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TYPE;
|
||||
@@ -150,13 +153,20 @@ class IntroductionValidator extends BdfMessageValidator {
|
||||
return d;
|
||||
}
|
||||
|
||||
private BdfDictionary validateAck(BdfList message)
|
||||
throws FormatException {
|
||||
private BdfDictionary validateAck(BdfList message) throws FormatException {
|
||||
checkSize(message, 4);
|
||||
|
||||
checkSize(message, 2);
|
||||
byte[] mac = message.getRaw(2);
|
||||
// TODO length check?
|
||||
|
||||
byte[] sig = message.getRaw(3);
|
||||
checkLength(sig, 1, MAX_SIGNATURE_LENGTH);
|
||||
|
||||
// Return the metadata
|
||||
return new BdfDictionary();
|
||||
BdfDictionary d = new BdfDictionary();
|
||||
d.put(MAC, mac);
|
||||
d.put(SIGNATURE, sig);
|
||||
return d;
|
||||
}
|
||||
|
||||
private BdfDictionary validateAbort(BdfList message)
|
||||
|
||||
@@ -19,11 +19,13 @@ import javax.inject.Inject;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.ACCEPT;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.E_PUBLIC_KEY;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.GROUP_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MAC;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MESSAGE_TIME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.MSG;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.NAME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.PUBLIC_KEY;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.SESSION_ID;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.SIGNATURE;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TIME;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TRANSPORT;
|
||||
import static org.briarproject.api.introduction.IntroductionConstants.TYPE;
|
||||
@@ -108,12 +110,12 @@ public class MessageSender {
|
||||
list.add(d.getRaw(E_PUBLIC_KEY));
|
||||
list.add(d.getDictionary(TRANSPORT));
|
||||
}
|
||||
// TODO Sign the response, see #256
|
||||
return list;
|
||||
}
|
||||
|
||||
private BdfList encodeAck(BdfDictionary d) throws FormatException {
|
||||
return BdfList.of(TYPE_ACK, d.getRaw(SESSION_ID));
|
||||
return BdfList.of(TYPE_ACK, d.getRaw(SESSION_ID),
|
||||
d.getRaw(MAC), d.getRaw(SIGNATURE));
|
||||
}
|
||||
|
||||
private BdfList encodeAbort(BdfDictionary d) throws FormatException {
|
||||
|
||||
Reference in New Issue
Block a user