diff --git a/test/build.xml b/test/build.xml index 9dc9b7a10..6b5083f53 100644 --- a/test/build.xml +++ b/test/build.xml @@ -17,6 +17,7 @@ + diff --git a/test/net/sf/briar/crypto/KeyDerivationTest.java b/test/net/sf/briar/crypto/KeyDerivationTest.java new file mode 100644 index 000000000..386b72ce6 --- /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 keys = new ArrayList(); + 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 secrets = new ArrayList(); + 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 secrets = new ArrayList(); + 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 5c9839bd8..c6511263f 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];