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 97afdc133..1e26a7b3d 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 @@ -16,13 +16,21 @@ public interface KeyManager { /** * Informs the key manager that a new contact has been added. Derives and - * stores transport keys for communicating with the contact. + * stores a set of transport keys for communicating with the contact over + * each transport. + *
* {@link StreamContext StreamContexts} for the contact can be created * after this method has returned. */ void addContact(Transaction txn, ContactId c, SecretKey master, long timestamp, boolean alice) throws DbException; + /** + * Derives and stores a set of unbound transport keys for each transport. + */ + void addUnboundKeys(Transaction txn, SecretKey master, long timestamp, + boolean alice) throws DbException; + /** * Returns a {@link StreamContext} for sending a stream to the given * contact over the given transport, or null if an error occurs or the diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index 25e0681c9..afac362ce 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -50,7 +50,7 @@ class ContactManagerImpl implements ContactManager { @Override public ContactId addContact(Transaction txn, Author remote, AuthorId local, - SecretKey master,long timestamp, boolean alice, boolean verified, + SecretKey master, long timestamp, boolean alice, boolean verified, boolean active) throws DbException { ContactId c = db.addContact(txn, remote, local, verified, active); keyManager.addContact(txn, c, master, timestamp, alice); 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 d0c6fd709..be50963e0 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 @@ -104,6 +104,13 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { m.addContact(txn, c, master, timestamp, alice); } + @Override + public void addUnboundKeys(Transaction txn, SecretKey master, + long timestamp, boolean alice) throws DbException { + for (TransportKeyManager m : managers.values()) + m.addUnboundKeys(txn, master, timestamp, alice); + } + @Override public StreamContext getStreamContext(ContactId c, TransportId t) throws DbException { 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 6aa6d360f..8c9b03fd8 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 @@ -17,6 +17,9 @@ interface TransportKeyManager { void addContact(Transaction txn, ContactId c, SecretKey master, long timestamp, boolean alice) throws DbException; + void addUnboundKeys(Transaction txn, SecretKey master, long timestamp, + boolean alice) throws DbException; + void removeContact(ContactId c); @Nullable 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 1220beee5..7b4893e56 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 @@ -172,6 +172,18 @@ class TransportKeyManagerImpl implements TransportKeyManager { @Override public void addContact(Transaction txn, ContactId c, SecretKey master, long timestamp, boolean alice) throws DbException { + deriveAndAddKeys(txn, c, master, timestamp, alice); + } + + @Override + public void addUnboundKeys(Transaction txn, SecretKey master, + long timestamp, boolean alice) throws DbException { + deriveAndAddKeys(txn, null, master, timestamp, alice); + } + + private void deriveAndAddKeys(Transaction txn, @Nullable ContactId c, + SecretKey master, long timestamp, boolean alice) + throws DbException { lock.lock(); try { // Work out what rotation period the timestamp belongs to 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 edf073a4f..7320d60ce 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 @@ -113,6 +113,21 @@ public class KeyManagerImplTest extends BrambleTestCase { context.assertIsSatisfied(); } + @Test + public void testAddUnboundKeys() throws Exception { + SecretKey secretKey = getSecretKey(); + long timestamp = System.currentTimeMillis(); + boolean alice = new Random().nextBoolean(); + + context.checking(new Expectations() {{ + oneOf(transportKeyManager).addUnboundKeys(txn, secretKey, + timestamp, alice); + }}); + + keyManager.addUnboundKeys(txn, secretKey, timestamp, alice); + context.assertIsSatisfied(); + } + @Test public void testGetStreamContextForInactiveContact() throws Exception { assertEquals(null, 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 213400f1e..b926707df 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 @@ -30,7 +30,6 @@ import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE; import static org.briarproject.bramble.api.transport.TransportConstants.PROTOCOL_VERSION; @@ -57,6 +56,8 @@ public class TransportKeyManagerImplTest extends BrambleMockTestCase { private final ContactId contactId = new ContactId(123); private final ContactId contactId1 = new ContactId(234); private final KeySetId keySetId = new KeySetId(345); + private final KeySetId keySetId1 = new KeySetId(456); + private final KeySetId keySetId2 = new KeySetId(567); private final SecretKey tagKey = TestUtils.getSecretKey(); private final SecretKey headerKey = TestUtils.getSecretKey(); private final SecretKey masterKey = TestUtils.getSecretKey(); @@ -66,11 +67,14 @@ public class TransportKeyManagerImplTest extends BrambleMockTestCase { public void testKeysAreRotatedAtStartup() throws Exception { TransportKeys shouldRotate = createTransportKeys(900, 0); TransportKeys shouldNotRotate = createTransportKeys(1000, 0); + TransportKeys shouldRotate1 = createTransportKeys(999, 0); Collection