From a13a1769e542ffdf16da2eca08b9d259c4bb96af Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Wed, 16 Nov 2011 15:54:17 +0000
Subject: [PATCH] Unit test for key derivation.

---
 test/build.xml                                |  1 +
 .../sf/briar/crypto/KeyDerivationTest.java    | 74 +++++++++++++++++++
 .../transport/ConnectionWindowImplTest.java   |  4 +-
 3 files changed, 77 insertions(+), 2 deletions(-)
 create mode 100644 test/net/sf/briar/crypto/KeyDerivationTest.java

diff --git a/test/build.xml b/test/build.xml
index 9dc9b7a109..6b5083f53b 100644
--- a/test/build.xml
+++ b/test/build.xml
@@ -17,6 +17,7 @@
 			<test name='net.sf.briar.LockFairnessTest'/>
 			<test name='net.sf.briar.ProtocolIntegrationTest'/>
 			<test name='net.sf.briar.crypto.CounterModeTest'/>
+			<test name='net.sf.briar.crypto.KeyDerivationTest'/>
 			<test name='net.sf.briar.db.BasicH2Test'/>
 			<test name='net.sf.briar.db.DatabaseCleanerImplTest'/>
 			<test name='net.sf.briar.db.DatabaseComponentImplTest'/>
diff --git a/test/net/sf/briar/crypto/KeyDerivationTest.java b/test/net/sf/briar/crypto/KeyDerivationTest.java
new file mode 100644
index 0000000000..386b72ce6b
--- /dev/null
+++ b/test/net/sf/briar/crypto/KeyDerivationTest.java
@@ -0,0 +1,74 @@
+package net.sf.briar.crypto;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+import junit.framework.TestCase;
+import net.sf.briar.api.crypto.CryptoComponent;
+import net.sf.briar.api.crypto.ErasableKey;
+import net.sf.briar.api.protocol.ProtocolConstants;
+
+import org.junit.Test;
+
+public class KeyDerivationTest extends TestCase {
+
+	private final CryptoComponent crypto;
+	private final byte[] secret;
+
+	public KeyDerivationTest() {
+		super();
+		crypto = new CryptoComponentImpl();
+		secret = new byte[32];
+		new Random().nextBytes(secret);
+	}
+
+	@Test
+	public void testSixKeysAreDistinct() {
+		List<ErasableKey> keys = new ArrayList<ErasableKey>();
+		keys.add(crypto.deriveFrameKey(secret, true));
+		keys.add(crypto.deriveFrameKey(secret, false));
+		keys.add(crypto.deriveIvKey(secret, true));
+		keys.add(crypto.deriveIvKey(secret, false));
+		keys.add(crypto.deriveMacKey(secret, true));
+		keys.add(crypto.deriveMacKey(secret, false));
+		for(int i = 0; i < 6; i++) {
+			byte[] keyI = keys.get(i).getEncoded();
+			for(int j = 0; j < 6; j++) {
+				byte[] keyJ = keys.get(j).getEncoded();
+				assertEquals(i == j, Arrays.equals(keyI, keyJ));
+			}
+		}
+	}
+
+	@Test
+	public void testTransportIndexAffectsDerivation() {
+		List<byte[]> secrets = new ArrayList<byte[]>();
+		for(int i = 0; i < ProtocolConstants.MAX_TRANSPORTS; i++) {
+			secrets.add(crypto.deriveNextSecret(secret, i, 0));
+		}
+		for(int i = 0; i < ProtocolConstants.MAX_TRANSPORTS; i++) {
+			byte[] secretI = secrets.get(i);
+			for(int j = 0; j < ProtocolConstants.MAX_TRANSPORTS; j++) {
+				byte[] secretJ = secrets.get(j);
+				assertEquals(i == j, Arrays.equals(secretI, secretJ));
+			}
+		}
+	}
+
+	@Test
+	public void testConnectionNumberAffectsDerivation() {
+		List<byte[]> secrets = new ArrayList<byte[]>();
+		for(int i = 0; i < 20; i++) {
+			secrets.add(crypto.deriveNextSecret(secret, 0, i));
+		}
+		for(int i = 0; i < 20; i++) {
+			byte[] secretI = secrets.get(i);
+			for(int j = 0; j < 20; j++) {
+				byte[] secretJ = secrets.get(j);
+				assertEquals(i == j, Arrays.equals(secretI, secretJ));
+			}
+		}
+	}
+}
diff --git a/test/net/sf/briar/transport/ConnectionWindowImplTest.java b/test/net/sf/briar/transport/ConnectionWindowImplTest.java
index 5c9839bd86..c6511263f6 100644
--- a/test/net/sf/briar/transport/ConnectionWindowImplTest.java
+++ b/test/net/sf/briar/transport/ConnectionWindowImplTest.java
@@ -22,8 +22,8 @@ public class ConnectionWindowImplTest extends TestCase {
 	private final byte[] secret;
 	private final TransportIndex transportIndex = new TransportIndex(13);
 
-	public ConnectionWindowImplTest(String name) {
-		super(name);
+	public ConnectionWindowImplTest() {
+		super();
 		Injector i = Guice.createInjector(new CryptoModule());
 		crypto = i.getInstance(CryptoComponent.class);
 		secret = new byte[32];
-- 
GitLab