diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java index 1e26a7b3d05f079bab61e44b61465bd05b223115..ef422d66e560d3e0c5826466f2fc521bd8556f18 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java @@ -6,6 +6,8 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.plugin.TransportId; +import java.util.Collection; + import javax.annotation.Nullable; /** @@ -26,10 +28,11 @@ public interface KeyManager { long timestamp, boolean alice) throws DbException; /** - * Derives and stores a set of unbound transport keys for each transport. + * Derives and stores a set of unbound transport keys for each transport + * and returns the key set IDs. */ - void addUnboundKeys(Transaction txn, SecretKey master, long timestamp, - boolean alice) throws DbException; + Collection<KeySetId> addUnboundKeys(Transaction txn, SecretKey master, + long timestamp, boolean alice) throws DbException; /** * Returns a {@link StreamContext} for sending a stream to the given diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java index be50963e0df00656b0216f0ebe6016ed0e80064f..993cb5c4c66770c8712bc8f5f6010531d549b638 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java @@ -19,8 +19,11 @@ import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.transport.KeyManager; +import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.transport.StreamContext; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -105,10 +108,13 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { } @Override - public void addUnboundKeys(Transaction txn, SecretKey master, - long timestamp, boolean alice) throws DbException { + public Collection<KeySetId> addUnboundKeys(Transaction txn, + SecretKey master, long timestamp, boolean alice) + throws DbException { + Collection<KeySetId> ids = new ArrayList<>(); for (TransportKeyManager m : managers.values()) - m.addUnboundKeys(txn, master, timestamp, alice); + ids.add(m.addUnboundKeys(txn, master, timestamp, alice)); + return ids; } @Override @@ -121,7 +127,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { if (LOG.isLoggable(INFO)) LOG.info("No key manager for " + t); return null; } - StreamContext ctx = null; + StreamContext ctx; Transaction txn = db.startTransaction(false); try { ctx = m.getStreamContext(txn, c); @@ -140,7 +146,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { if (LOG.isLoggable(INFO)) LOG.info("No key manager for " + t); return null; } - StreamContext ctx = null; + StreamContext ctx; Transaction txn = db.startTransaction(false); try { ctx = m.getStreamContext(txn, tag); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManager.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManager.java index 8c9b03fd8b8bd1eeaba7c7419e20c118f76ecc90..5da58633f09fe4c098ff3bcae1701bc0575bb631 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManager.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManager.java @@ -5,6 +5,7 @@ import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.transport.StreamContext; import javax.annotation.Nullable; @@ -17,7 +18,7 @@ interface TransportKeyManager { void addContact(Transaction txn, ContactId c, SecretKey master, long timestamp, boolean alice) throws DbException; - void addUnboundKeys(Transaction txn, SecretKey master, long timestamp, + KeySetId addUnboundKeys(Transaction txn, SecretKey master, long timestamp, boolean alice) throws DbException; void removeContact(ContactId c); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java index 7b4893e5617b27093b45d88edeb1b65c6fcc0561..b1dbb6ced97e47c393e52e19494ed0e892d59f3e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java @@ -176,12 +176,12 @@ class TransportKeyManagerImpl implements TransportKeyManager { } @Override - public void addUnboundKeys(Transaction txn, SecretKey master, + public KeySetId addUnboundKeys(Transaction txn, SecretKey master, long timestamp, boolean alice) throws DbException { - deriveAndAddKeys(txn, null, master, timestamp, alice); + return deriveAndAddKeys(txn, null, master, timestamp, alice); } - private void deriveAndAddKeys(Transaction txn, @Nullable ContactId c, + private KeySetId deriveAndAddKeys(Transaction txn, @Nullable ContactId c, SecretKey master, long timestamp, boolean alice) throws DbException { lock.lock(); @@ -198,6 +198,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { KeySetId keySetId = db.addTransportKeys(txn, c, k); // Initialise mutable state for the contact addKeys(keySetId, c, new MutableTransportKeys(k)); + return keySetId; } finally { lock.unlock(); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java index 7320d60ce7b3aa5a1ec57c01f03fff81e2d0dd9f..a55a92bf78175ff6aba8f0a717f196c4b17c781c 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java @@ -12,19 +12,19 @@ import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.plugin.PluginConfig; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; +import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.transport.StreamContext; -import org.briarproject.bramble.test.BrambleTestCase; +import org.briarproject.bramble.test.BrambleMockTestCase; import org.jmock.Expectations; -import org.jmock.Mockery; import org.jmock.lib.concurrent.DeterministicExecutor; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.Random; +import static java.util.Collections.singletonList; import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH; import static org.briarproject.bramble.test.TestUtils.getAuthor; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; @@ -32,31 +32,29 @@ import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.junit.Assert.assertEquals; -public class KeyManagerImplTest extends BrambleTestCase { +public class KeyManagerImplTest extends BrambleMockTestCase { - private final Mockery context = new Mockery(); - private final KeyManagerImpl keyManager; private final DatabaseComponent db = context.mock(DatabaseComponent.class); private final PluginConfig pluginConfig = context.mock(PluginConfig.class); private final TransportKeyManagerFactory transportKeyManagerFactory = context.mock(TransportKeyManagerFactory.class); private final TransportKeyManager transportKeyManager = context.mock(TransportKeyManager.class); + private final DeterministicExecutor executor = new DeterministicExecutor(); private final Transaction txn = new Transaction(null, false); - private final ContactId contactId = new ContactId(42); - private final ContactId inactiveContactId = new ContactId(43); - private final TransportId transportId = new TransportId("tId"); - private final TransportId unknownTransportId = new TransportId("id"); + private final ContactId contactId = new ContactId(123); + private final ContactId inactiveContactId = new ContactId(234); + private final KeySetId keySetId = new KeySetId(345); + private final TransportId transportId = new TransportId("known"); + private final TransportId unknownTransportId = new TransportId("unknown"); private final StreamContext streamContext = new StreamContext(contactId, transportId, getSecretKey(), getSecretKey(), 1); private final byte[] tag = getRandomBytes(TAG_LENGTH); - public KeyManagerImplTest() { - keyManager = new KeyManagerImpl(db, executor, pluginConfig, - transportKeyManagerFactory); - } + private final KeyManagerImpl keyManager = new KeyManagerImpl(db, executor, + pluginConfig, transportKeyManagerFactory); @Before public void testStartService() throws Exception { @@ -70,8 +68,8 @@ public class KeyManagerImplTest extends BrambleTestCase { true, false)); SimplexPluginFactory pluginFactory = context.mock(SimplexPluginFactory.class); - Collection<SimplexPluginFactory> factories = Collections - .singletonList(pluginFactory); + Collection<SimplexPluginFactory> factories = + singletonList(pluginFactory); int maxLatency = 1337; context.checking(new Expectations() {{ @@ -110,7 +108,6 @@ public class KeyManagerImplTest extends BrambleTestCase { }}); keyManager.addContact(txn, contactId, secretKey, timestamp, alice); - context.assertIsSatisfied(); } @Test @@ -122,10 +119,11 @@ public class KeyManagerImplTest extends BrambleTestCase { context.checking(new Expectations() {{ oneOf(transportKeyManager).addUnboundKeys(txn, secretKey, timestamp, alice); + will(returnValue(keySetId)); }}); - keyManager.addUnboundKeys(txn, secretKey, timestamp, alice); - context.assertIsSatisfied(); + assertEquals(singletonList(keySetId), + keyManager.addUnboundKeys(txn, secretKey, timestamp, alice)); } @Test @@ -153,7 +151,6 @@ public class KeyManagerImplTest extends BrambleTestCase { assertEquals(streamContext, keyManager.getStreamContext(contactId, transportId)); - context.assertIsSatisfied(); } @Test @@ -176,7 +173,6 @@ public class KeyManagerImplTest extends BrambleTestCase { assertEquals(streamContext, keyManager.getStreamContext(transportId, tag)); - context.assertIsSatisfied(); } @Test @@ -190,8 +186,6 @@ public class KeyManagerImplTest extends BrambleTestCase { keyManager.eventOccurred(event); executor.runUntilIdle(); assertEquals(null, keyManager.getStreamContext(contactId, transportId)); - - context.assertIsSatisfied(); } @Test @@ -211,8 +205,5 @@ public class KeyManagerImplTest extends BrambleTestCase { keyManager.eventOccurred(event); assertEquals(streamContext, keyManager.getStreamContext(inactiveContactId, transportId)); - - context.assertIsSatisfied(); } - } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java index b926707df4effe116569cfd02e5d948ed4d87c24..4a92d4eb35659b0cf6b70a7f1be1a771e2d8a8e1 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java @@ -179,7 +179,8 @@ public class TransportKeyManagerImplTest extends BrambleMockTestCase { maxLatency); // The timestamp is 1 ms before the start of rotation period 1000 long timestamp = rotationPeriodLength * 1000 - 1; - transportKeyManager.addUnboundKeys(txn, masterKey, timestamp, alice); + assertEquals(keySetId, transportKeyManager.addUnboundKeys(txn, + masterKey, timestamp, alice)); } @Test