From c8338f986600a59682a25d875f0e2ecf99b26df8 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Fri, 2 Dec 2011 14:23:45 +0000
Subject: [PATCH] Connection readers and writers don't need the connection
 context.

---
 .../transport/ConnectionReaderFactory.java    | 12 +++++------
 .../transport/ConnectionWriterFactory.java    |  9 ++++----
 .../ConnectionReaderFactoryImpl.java          | 14 ++++++-------
 .../ConnectionWriterFactoryImpl.java          | 14 ++++++-------
 .../batch/IncomingBatchConnection.java        |  2 +-
 .../batch/OutgoingBatchConnection.java        |  3 ++-
 .../stream/IncomingStreamConnection.java      |  5 +++--
 .../stream/OutgoingStreamConnection.java      |  4 ++--
 .../net/sf/briar/ProtocolIntegrationTest.java | 21 +++----------------
 .../briar/transport/ConnectionWriterTest.java | 15 +------------
 10 files changed, 35 insertions(+), 64 deletions(-)

diff --git a/api/net/sf/briar/api/transport/ConnectionReaderFactory.java b/api/net/sf/briar/api/transport/ConnectionReaderFactory.java
index ab65da7fec..fc6f9418ba 100644
--- a/api/net/sf/briar/api/transport/ConnectionReaderFactory.java
+++ b/api/net/sf/briar/api/transport/ConnectionReaderFactory.java
@@ -6,15 +6,15 @@ public interface ConnectionReaderFactory {
 
 	/**
 	 * Creates a connection reader for a batch-mode connection or the
-	 * initiator's side of a stream-mode connection.
+	 * initiator's side of a stream-mode connection. The secret is erased
+	 * before this method returns.
 	 */
-	ConnectionReader createConnectionReader(InputStream in,
-			ConnectionContext ctx, byte[] tag);
+	ConnectionReader createConnectionReader(InputStream in, byte[] secret,
+			byte[] tag);
 
 	/**
 	 * Creates a connection reader for the responder's side of a stream-mode
-	 * connection.
+	 * connection. The secret is erased before this method returns.
 	 */
-	ConnectionReader createConnectionReader(InputStream in,
-			ConnectionContext ctx);
+	ConnectionReader createConnectionReader(InputStream in, byte[] secret);
 }
diff --git a/api/net/sf/briar/api/transport/ConnectionWriterFactory.java b/api/net/sf/briar/api/transport/ConnectionWriterFactory.java
index 0713e3724c..13b03fa387 100644
--- a/api/net/sf/briar/api/transport/ConnectionWriterFactory.java
+++ b/api/net/sf/briar/api/transport/ConnectionWriterFactory.java
@@ -6,15 +6,16 @@ public interface ConnectionWriterFactory {
 
 	/**
 	 * Creates a connection writer for a batch-mode connection or the
-	 * initiator's side of a stream-mode connection.
+	 * initiator's side of a stream-mode connection. The secret is erased
+	 * before this method returns.
 	 */
 	ConnectionWriter createConnectionWriter(OutputStream out, long capacity,
-			ConnectionContext ctx);
+			byte[] secret);
 
 	/**
 	 * Creates a connection writer for the responder's side of a stream-mode
-	 * connection.
+	 * connection. The secret is erased before this method returns.
 	 */
 	ConnectionWriter createConnectionWriter(OutputStream out, long capacity,
-			ConnectionContext ctx, byte[] tag);
+			byte[] secret, byte[] tag);
 }
diff --git a/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java b/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java
index 837ce54087..d73a45931c 100644
--- a/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java
+++ b/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java
@@ -7,7 +7,6 @@ import javax.crypto.Mac;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.ErasableKey;
-import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.util.ByteUtils;
@@ -24,25 +23,24 @@ class ConnectionReaderFactoryImpl implements ConnectionReaderFactory {
 	}
 
 	public ConnectionReader createConnectionReader(InputStream in,
-			ConnectionContext ctx, byte[] tag) {
+			byte[] secret, byte[] tag) {
 		// Validate the tag
 		Cipher tagCipher = crypto.getTagCipher();
-		ErasableKey tagKey = crypto.deriveTagKey(ctx.getSecret(), true);
+		ErasableKey tagKey = crypto.deriveTagKey(secret, true);
 		boolean valid = TagEncoder.validateTag(tag, 0, tagCipher, tagKey);
 		tagKey.erase();
 		if(!valid) throw new IllegalArgumentException();
-		return createConnectionReader(in, true, ctx);
+		return createConnectionReader(in, true, secret);
 	}
 
 	public ConnectionReader createConnectionReader(InputStream in,
-			ConnectionContext ctx) {
-		return createConnectionReader(in, false, ctx);
+			byte[] secret) {
+		return createConnectionReader(in, false, secret);
 	}
 
 	private ConnectionReader createConnectionReader(InputStream in,
-			boolean initiator, ConnectionContext ctx) {
+			boolean initiator, byte[] secret) {
 		// Derive the keys and erase the secret
-		byte[] secret = ctx.getSecret();
 		ErasableKey frameKey = crypto.deriveFrameKey(secret, initiator);
 		ErasableKey macKey = crypto.deriveMacKey(secret, initiator);
 		ByteUtils.erase(secret);
diff --git a/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java b/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
index 694db4ae77..e0b5288c67 100644
--- a/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
+++ b/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
@@ -7,7 +7,6 @@ import javax.crypto.Mac;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.ErasableKey;
-import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionWriter;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
 import net.sf.briar.util.ByteUtils;
@@ -24,25 +23,24 @@ class ConnectionWriterFactoryImpl implements ConnectionWriterFactory {
 	}
 
 	public ConnectionWriter createConnectionWriter(OutputStream out,
-			long capacity, ConnectionContext ctx) {
-		return createConnectionWriter(out, capacity, true, ctx);
+			long capacity, byte[] secret) {
+		return createConnectionWriter(out, capacity, true, secret);
 	}
 
 	public ConnectionWriter createConnectionWriter(OutputStream out,
-			long capacity, ConnectionContext ctx, byte[] tag) {
+			long capacity, byte[] secret, byte[] tag) {
 		// Decrypt the tag
 		Cipher tagCipher = crypto.getTagCipher();
-		ErasableKey tagKey = crypto.deriveTagKey(ctx.getSecret(), true);
+		ErasableKey tagKey = crypto.deriveTagKey(secret, true);
 		boolean valid = TagEncoder.validateTag(tag, 0, tagCipher, tagKey);
 		tagKey.erase();
 		if(!valid) throw new IllegalArgumentException();
-		return createConnectionWriter(out, capacity, false, ctx);
+		return createConnectionWriter(out, capacity, false, secret);
 	}
 
 	private ConnectionWriter createConnectionWriter(OutputStream out,
-			long capacity, boolean initiator, ConnectionContext ctx) {
+			long capacity, boolean initiator, byte[] secret) {
 		// Derive the keys and erase the secret
-		byte[] secret = ctx.getSecret();
 		ErasableKey tagKey = crypto.deriveTagKey(secret, initiator);
 		ErasableKey frameKey = crypto.deriveFrameKey(secret, initiator);
 		ErasableKey macKey = crypto.deriveMacKey(secret, initiator);
diff --git a/components/net/sf/briar/transport/batch/IncomingBatchConnection.java b/components/net/sf/briar/transport/batch/IncomingBatchConnection.java
index e7a0b3686b..fdcc60541f 100644
--- a/components/net/sf/briar/transport/batch/IncomingBatchConnection.java
+++ b/components/net/sf/briar/transport/batch/IncomingBatchConnection.java
@@ -45,7 +45,7 @@ class IncomingBatchConnection {
 	void read() {
 		try {
 			ConnectionReader conn = connFactory.createConnectionReader(
-					reader.getInputStream(), ctx, tag);
+					reader.getInputStream(), ctx.getSecret(), tag);
 			ProtocolReader proto = protoFactory.createProtocolReader(
 					conn.getInputStream());
 			ContactId c = ctx.getContactId();
diff --git a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
index 88f0f127f3..84c32cce5e 100644
--- a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
+++ b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
@@ -50,7 +50,8 @@ class OutgoingBatchConnection {
 			ConnectionContext ctx = db.getConnectionContext(contactId,
 					transportIndex);
 			ConnectionWriter conn = connFactory.createConnectionWriter(
-					writer.getOutputStream(), writer.getCapacity(), ctx);
+					writer.getOutputStream(), writer.getCapacity(),
+					ctx.getSecret());
 			OutputStream out = conn.getOutputStream();
 			// There should be enough space for a packet
 			long capacity = conn.getRemainingCapacity();
diff --git a/components/net/sf/briar/transport/stream/IncomingStreamConnection.java b/components/net/sf/briar/transport/stream/IncomingStreamConnection.java
index 405001957e..16da6c7952 100644
--- a/components/net/sf/briar/transport/stream/IncomingStreamConnection.java
+++ b/components/net/sf/briar/transport/stream/IncomingStreamConnection.java
@@ -34,13 +34,14 @@ class IncomingStreamConnection extends StreamConnection {
 	protected ConnectionReader createConnectionReader() throws DbException,
 	IOException {
 		return connReaderFactory.createConnectionReader(
-				connection.getInputStream(), ctx, tag);
+				connection.getInputStream(), ctx.getSecret(), tag);
 	}
 
 	@Override
 	protected ConnectionWriter createConnectionWriter() throws DbException,
 	IOException {
 		return connWriterFactory.createConnectionWriter(
-				connection.getOutputStream(), Long.MAX_VALUE, ctx, tag);
+				connection.getOutputStream(), Long.MAX_VALUE, ctx.getSecret(),
+				tag);
 	}
 }
diff --git a/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java b/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java
index ba37e28def..64d61e1306 100644
--- a/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java
+++ b/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java
@@ -40,7 +40,7 @@ class OutgoingStreamConnection extends StreamConnection {
 				ctx = db.getConnectionContext(contactId, transportIndex);
 		}
 		return connReaderFactory.createConnectionReader(
-				connection.getInputStream(), ctx);
+				connection.getInputStream(), ctx.getSecret());
 	}
 
 	@Override
@@ -51,6 +51,6 @@ class OutgoingStreamConnection extends StreamConnection {
 				ctx = db.getConnectionContext(contactId, transportIndex);
 		}
 		return connWriterFactory.createConnectionWriter(
-				connection.getOutputStream(), Long.MAX_VALUE, ctx);
+				connection.getOutputStream(), Long.MAX_VALUE, ctx.getSecret());
 	}
 }
diff --git a/test/net/sf/briar/ProtocolIntegrationTest.java b/test/net/sf/briar/ProtocolIntegrationTest.java
index 1aba7e21cb..c83a081d6a 100644
--- a/test/net/sf/briar/ProtocolIntegrationTest.java
+++ b/test/net/sf/briar/ProtocolIntegrationTest.java
@@ -1,5 +1,6 @@
 package net.sf.briar;
 
+import static net.sf.briar.api.transport.TransportConstants.TAG_LENGTH;
 import static org.junit.Assert.assertArrayEquals;
 
 import java.io.ByteArrayInputStream;
@@ -18,7 +19,6 @@ import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 
 import junit.framework.TestCase;
-import net.sf.briar.api.ContactId;
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.protocol.Ack;
 import net.sf.briar.api.protocol.Author;
@@ -46,13 +46,10 @@ import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.writers.RequestWriter;
 import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
 import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
-import net.sf.briar.api.transport.ConnectionContext;
-import net.sf.briar.api.transport.ConnectionContextFactory;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriter;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
-import static net.sf.briar.api.transport.TransportConstants.TAG_LENGTH;
 import net.sf.briar.crypto.CryptoModule;
 import net.sf.briar.db.DatabaseModule;
 import net.sf.briar.lifecycle.LifecycleModule;
@@ -63,7 +60,6 @@ import net.sf.briar.transport.TransportModule;
 import net.sf.briar.transport.batch.TransportBatchModule;
 import net.sf.briar.transport.stream.TransportStreamModule;
 
-import org.bouncycastle.util.Arrays;
 import org.junit.Test;
 
 import com.google.inject.AbstractModule;
@@ -76,16 +72,13 @@ public class ProtocolIntegrationTest extends TestCase {
 	private final BatchId ack = new BatchId(TestUtils.getRandomId());
 	private final long timestamp = System.currentTimeMillis();
 
-	private final ConnectionContextFactory connectionContextFactory;
 	private final ConnectionReaderFactory connectionReaderFactory;
 	private final ConnectionWriterFactory connectionWriterFactory;
 	private final ProtocolReaderFactory protocolReaderFactory;
 	private final ProtocolWriterFactory protocolWriterFactory;
 	private final CryptoComponent crypto;
 	private final byte[] secret;
-	private final ContactId contactId = new ContactId(13);
 	private final TransportIndex transportIndex = new TransportIndex(13);
-	private final long connection = 12345L;
 	private final Author author;
 	private final Group group, group1;
 	private final Message message, message1, message2, message3;
@@ -109,8 +102,6 @@ public class ProtocolIntegrationTest extends TestCase {
 				new SerialModule(), new TestDatabaseModule(),
 				new TransportBatchModule(), new TransportModule(),
 				new TransportStreamModule());
-		connectionContextFactory =
-			i.getInstance(ConnectionContextFactory.class);
 		connectionReaderFactory = i.getInstance(ConnectionReaderFactory.class);
 		connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
 		protocolReaderFactory = i.getInstance(ProtocolReaderFactory.class);
@@ -158,11 +149,8 @@ public class ProtocolIntegrationTest extends TestCase {
 
 	private byte[] write() throws Exception {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		ConnectionContext ctx =
-			connectionContextFactory.createConnectionContext(contactId,
-					transportIndex, connection, Arrays.clone(secret));
 		ConnectionWriter w = connectionWriterFactory.createConnectionWriter(out,
-				Long.MAX_VALUE, ctx);
+				Long.MAX_VALUE, secret.clone());
 		OutputStream out1 = w.getOutputStream();
 
 		AckWriter a = protocolWriterFactory.createAckWriter(out1);
@@ -209,11 +197,8 @@ public class ProtocolIntegrationTest extends TestCase {
 		InputStream in = new ByteArrayInputStream(connectionData);
 		byte[] tag = new byte[TAG_LENGTH];
 		assertEquals(TAG_LENGTH, in.read(tag, 0, TAG_LENGTH));
-		ConnectionContext ctx =
-			connectionContextFactory.createConnectionContext(contactId,
-					transportIndex, connection, Arrays.clone(secret));
 		ConnectionReader r = connectionReaderFactory.createConnectionReader(in,
-				ctx, tag);
+				secret.clone(), tag);
 		in = r.getInputStream();
 		ProtocolReader protocolReader =
 			protocolReaderFactory.createProtocolReader(in);
diff --git a/test/net/sf/briar/transport/ConnectionWriterTest.java b/test/net/sf/briar/transport/ConnectionWriterTest.java
index 9e47c43b94..91718a6830 100644
--- a/test/net/sf/briar/transport/ConnectionWriterTest.java
+++ b/test/net/sf/briar/transport/ConnectionWriterTest.java
@@ -10,10 +10,6 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
 
 import junit.framework.TestCase;
 import net.sf.briar.TestDatabaseModule;
-import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportIndex;
-import net.sf.briar.api.transport.ConnectionContext;
-import net.sf.briar.api.transport.ConnectionContextFactory;
 import net.sf.briar.api.transport.ConnectionWriter;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
 import net.sf.briar.crypto.CryptoModule;
@@ -34,12 +30,8 @@ import com.google.inject.Module;
 
 public class ConnectionWriterTest extends TestCase {
 
-	private final ConnectionContextFactory connectionContextFactory;
 	private final ConnectionWriterFactory connectionWriterFactory;
 	private final byte[] secret;
-	private final ContactId contactId = new ContactId(13);
-	private final TransportIndex transportIndex = new TransportIndex(13);
-	private final long connection = 12345L;
 
 	public ConnectionWriterTest() throws Exception {
 		super();
@@ -56,8 +48,6 @@ public class ConnectionWriterTest extends TestCase {
 				new SerialModule(), new TestDatabaseModule(),
 				new TransportBatchModule(), new TransportModule(),
 				new TransportStreamModule());
-		connectionContextFactory =
-			i.getInstance(ConnectionContextFactory.class);
 		connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
 		secret = new byte[32];
 		new Random().nextBytes(secret);
@@ -67,11 +57,8 @@ public class ConnectionWriterTest extends TestCase {
 	public void testOverhead() throws Exception {
 		ByteArrayOutputStream out =
 			new ByteArrayOutputStream(MIN_CONNECTION_LENGTH);
-		ConnectionContext ctx =
-			connectionContextFactory.createConnectionContext(contactId,
-					transportIndex, connection, secret);
 		ConnectionWriter w = connectionWriterFactory.createConnectionWriter(out,
-				MIN_CONNECTION_LENGTH, ctx);
+				MIN_CONNECTION_LENGTH, secret);
 		// Check that the connection writer thinks there's room for a packet
 		long capacity = w.getRemainingCapacity();
 		assertTrue(capacity >= MAX_PACKET_LENGTH);
-- 
GitLab