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