From a12d5ac340ce57afb83a9a29d02651d46c2872fb Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Fri, 19 Oct 2012 21:19:52 +0100
Subject: [PATCH] Removed tag from connection context.

---
 api/net/sf/briar/api/transport/ConnectionContext.java  |  9 ++-------
 .../briar/api/transport/ConnectionReaderFactory.java   |  3 +--
 .../briar/api/transport/ConnectionWriterFactory.java   |  3 +--
 .../briar/transport/ConnectionWriterFactoryImpl.java   | 10 ++++++++--
 .../briar/transport/TransportConnectionRecogniser.java |  4 ++--
 test/net/sf/briar/ProtocolIntegrationTest.java         |  5 ++---
 .../simplex/OutgoingSimplexConnectionTest.java         |  9 +++------
 .../simplex/SimplexProtocolIntegrationTest.java        |  4 +---
 .../sf/briar/transport/TransportIntegrationTest.java   |  6 ++----
 9 files changed, 22 insertions(+), 31 deletions(-)

diff --git a/api/net/sf/briar/api/transport/ConnectionContext.java b/api/net/sf/briar/api/transport/ConnectionContext.java
index f9f547a4fd..dac9544982 100644
--- a/api/net/sf/briar/api/transport/ConnectionContext.java
+++ b/api/net/sf/briar/api/transport/ConnectionContext.java
@@ -7,15 +7,14 @@ public class ConnectionContext {
 
 	private final ContactId contactId;
 	private final TransportId transportId;
-	private final byte[] tag, secret;
+	private final byte[] secret;
 	private final long connection;
 	private final boolean alice;
 
 	public ConnectionContext(ContactId contactId, TransportId transportId,
-			byte[] tag, byte[] secret, long connection, boolean alice) {
+			byte[] secret, long connection, boolean alice) {
 		this.contactId = contactId;
 		this.transportId = transportId;
-		this.tag = tag;
 		this.secret = secret;
 		this.connection = connection;
 		this.alice = alice;
@@ -29,10 +28,6 @@ public class ConnectionContext {
 		return transportId;
 	}
 
-	public byte[] getTag() {
-		return tag;
-	}
-
 	public byte[] getSecret() {
 		return secret;
 	}
diff --git a/api/net/sf/briar/api/transport/ConnectionReaderFactory.java b/api/net/sf/briar/api/transport/ConnectionReaderFactory.java
index 171a594bd9..9d7f7d4b58 100644
--- a/api/net/sf/briar/api/transport/ConnectionReaderFactory.java
+++ b/api/net/sf/briar/api/transport/ConnectionReaderFactory.java
@@ -5,8 +5,7 @@ import java.io.InputStream;
 public interface ConnectionReaderFactory {
 
 	/**
-	 * Creates a connection reader for a simplex connection or one side of a
-	 * duplex connection. The secret is erased before this method returns.
+	 * Creates a connection reader for one side of a connection.
 	 */
 	ConnectionReader createConnectionReader(InputStream in,
 			ConnectionContext ctx, boolean initiator);
diff --git a/api/net/sf/briar/api/transport/ConnectionWriterFactory.java b/api/net/sf/briar/api/transport/ConnectionWriterFactory.java
index f2fd8aaf07..452cbeba6d 100644
--- a/api/net/sf/briar/api/transport/ConnectionWriterFactory.java
+++ b/api/net/sf/briar/api/transport/ConnectionWriterFactory.java
@@ -5,8 +5,7 @@ import java.io.OutputStream;
 public interface ConnectionWriterFactory {
 
 	/**
-	 * Creates a connection writer for a simplex connection or one side of a
-	 * duplex connection. The secret is erased before this method returns.
+	 * Creates a connection writer for one side of a connection.
 	 */
 	ConnectionWriter createConnectionWriter(OutputStream out, long capacity,
 			ConnectionContext ctx, boolean initiator);
diff --git a/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java b/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
index d853371d8a..b0a2b8c848 100644
--- a/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
+++ b/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
@@ -1,9 +1,12 @@
 package net.sf.briar.transport;
 
 import static net.sf.briar.api.transport.TransportConstants.MAX_FRAME_LENGTH;
+import static net.sf.briar.api.transport.TransportConstants.TAG_LENGTH;
 
 import java.io.OutputStream;
 
+import javax.crypto.Cipher;
+
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.ErasableKey;
 import net.sf.briar.api.transport.ConnectionContext;
@@ -30,9 +33,12 @@ class ConnectionWriterFactoryImpl implements ConnectionWriterFactory {
 				initiator);
 		FrameWriter encryption;
 		if(initiator) {
+			byte[] tag = new byte[TAG_LENGTH];
+			Cipher tagCipher = crypto.getTagCipher();
+			ErasableKey tagKey = crypto.deriveTagKey(secret, alice);
+			TagEncoder.encodeTag(tag, tagCipher, tagKey, connection);
 			encryption = new OutgoingEncryptionLayer(out, capacity,
-					crypto.getFrameCipher(), frameKey, MAX_FRAME_LENGTH,
-					ctx.getTag());
+					crypto.getFrameCipher(), frameKey, MAX_FRAME_LENGTH, tag);
 		} else {
 			encryption = new OutgoingEncryptionLayer(out, capacity,
 					crypto.getFrameCipher(), frameKey, MAX_FRAME_LENGTH);
diff --git a/components/net/sf/briar/transport/TransportConnectionRecogniser.java b/components/net/sf/briar/transport/TransportConnectionRecogniser.java
index d5bbb12dd0..33b8fe4a79 100644
--- a/components/net/sf/briar/transport/TransportConnectionRecogniser.java
+++ b/components/net/sf/briar/transport/TransportConnectionRecogniser.java
@@ -59,7 +59,7 @@ class TransportConnectionRecogniser {
 				assert old == null;
 			} else {
 				ConnectionContext ctx1 = new ConnectionContext(contactId,
-						transportId, tag1, secret, connection1, alice);
+						transportId, secret, connection1, alice);
 				WindowContext wctx1 = new WindowContext(window, ctx1, period);
 				WindowContext old = tagMap.put(new Bytes(tag1), wctx1);
 				assert old == null;
@@ -83,7 +83,7 @@ class TransportConnectionRecogniser {
 			byte[] tag = new byte[TAG_LENGTH];
 			TagEncoder.encodeTag(tag, cipher, key, connection);
 			ConnectionContext ctx = new ConnectionContext(contactId,
-					transportId, tag, secret, connection, alice);
+					transportId, secret, connection, alice);
 			WindowContext wctx = new WindowContext(window, ctx, period);
 			WindowContext old = tagMap.put(new Bytes(tag), wctx);
 			assert old == null;
diff --git a/test/net/sf/briar/ProtocolIntegrationTest.java b/test/net/sf/briar/ProtocolIntegrationTest.java
index 8b8f7eba92..ebe526173b 100644
--- a/test/net/sf/briar/ProtocolIntegrationTest.java
+++ b/test/net/sf/briar/ProtocolIntegrationTest.java
@@ -141,9 +141,8 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 
 	private byte[] write() throws Exception {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		byte[] tag = new byte[TAG_LENGTH];
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				tag, secret.clone(), 0L, true);
+				secret.clone(), 0L, true);
 		ConnectionWriter conn = connectionWriterFactory.createConnectionWriter(
 				out, Long.MAX_VALUE, ctx, true);
 		OutputStream out1 = conn.getOutputStream();
@@ -192,7 +191,7 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 		assertEquals(TAG_LENGTH, in.read(tag, 0, TAG_LENGTH));
 		assertArrayEquals(new byte[TAG_LENGTH], tag);
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				tag, secret.clone(), 0L, true);
+				secret.clone(), 0L, true);
 		ConnectionReader conn = connectionReaderFactory.createConnectionReader(
 				in, ctx, true);
 		InputStream in1 = conn.getInputStream();
diff --git a/test/net/sf/briar/protocol/simplex/OutgoingSimplexConnectionTest.java b/test/net/sf/briar/protocol/simplex/OutgoingSimplexConnectionTest.java
index 09109ee844..853b5ffbe5 100644
--- a/test/net/sf/briar/protocol/simplex/OutgoingSimplexConnectionTest.java
+++ b/test/net/sf/briar/protocol/simplex/OutgoingSimplexConnectionTest.java
@@ -91,9 +91,8 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
 				out, MAX_PACKET_LENGTH, true);
-		byte[] tag = new byte[TAG_LENGTH];
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				tag, secret, 0L, true);
+				secret, 0L, true);
 		OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db,
 				connRegistry, connFactory, protoFactory, ctx, transport);
 		connection.write();
@@ -109,9 +108,8 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
 				out, MIN_CONNECTION_LENGTH, true);
-		byte[] tag = new byte[TAG_LENGTH];
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				tag, secret, 0L, true);
+				secret, 0L, true);
 		OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db,
 				connRegistry, connFactory, protoFactory, ctx, transport);
 		context.checking(new Expectations() {{
@@ -142,9 +140,8 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
 				out, MIN_CONNECTION_LENGTH, true);
-		byte[] tag = new byte[TAG_LENGTH];
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				tag, secret, 0L, true);
+				secret, 0L, true);
 		OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db,
 				connRegistry, connFactory, protoFactory, ctx, transport);
 		final Ack ack = context.mock(Ack.class);
diff --git a/test/net/sf/briar/protocol/simplex/SimplexProtocolIntegrationTest.java b/test/net/sf/briar/protocol/simplex/SimplexProtocolIntegrationTest.java
index 906da6bb26..f5495b205a 100644
--- a/test/net/sf/briar/protocol/simplex/SimplexProtocolIntegrationTest.java
+++ b/test/net/sf/briar/protocol/simplex/SimplexProtocolIntegrationTest.java
@@ -115,10 +115,8 @@ public class SimplexProtocolIntegrationTest extends BriarTestCase {
 				alice.getInstance(ProtocolWriterFactory.class);
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
 				out, Long.MAX_VALUE, false);
-		// FIXME: Encode the tag
-		byte[] tag = new byte[TAG_LENGTH];
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				tag, aliceToBobSecret, 0L, true);
+				aliceToBobSecret, 0L, true);
 		OutgoingSimplexConnection simplex = new OutgoingSimplexConnection(db,
 				connRegistry, connFactory, protoFactory, ctx, transport);
 		// Write whatever needs to be written
diff --git a/test/net/sf/briar/transport/TransportIntegrationTest.java b/test/net/sf/briar/transport/TransportIntegrationTest.java
index 2c61124e0b..7f6247aaed 100644
--- a/test/net/sf/briar/transport/TransportIntegrationTest.java
+++ b/test/net/sf/briar/transport/TransportIntegrationTest.java
@@ -2,7 +2,6 @@ package net.sf.briar.transport;
 
 import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
 import static net.sf.briar.api.transport.TransportConstants.MIN_CONNECTION_LENGTH;
-import static net.sf.briar.api.transport.TransportConstants.TAG_LENGTH;
 import static org.junit.Assert.assertArrayEquals;
 
 import java.io.ByteArrayInputStream;
@@ -128,9 +127,8 @@ public class TransportIntegrationTest extends BriarTestCase {
 	public void testOverheadWithTag() throws Exception {
 		ByteArrayOutputStream out =
 				new ByteArrayOutputStream(MIN_CONNECTION_LENGTH);
-		byte[] tag = new byte[TAG_LENGTH];
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				tag, secret, 0L, true);
+				secret, 0L, true);
 		ConnectionWriter w = connectionWriterFactory.createConnectionWriter(out,
 				MIN_CONNECTION_LENGTH, ctx, true);
 		// Check that the connection writer thinks there's room for a packet
@@ -151,7 +149,7 @@ public class TransportIntegrationTest extends BriarTestCase {
 		ByteArrayOutputStream out =
 				new ByteArrayOutputStream(MIN_CONNECTION_LENGTH);
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
-				null, secret, 0L, true);
+				secret, 0L, true);
 		ConnectionWriter w = connectionWriterFactory.createConnectionWriter(out,
 				MIN_CONNECTION_LENGTH, ctx, false);
 		// Check that the connection writer thinks there's room for a packet
-- 
GitLab