diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/AbstractTransportKeys.java b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/AbstractTransportKeys.java new file mode 100644 index 000000000..a53631803 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/AbstractTransportKeys.java @@ -0,0 +1,58 @@ +package org.briarproject.bramble.api.transport; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.TransportId; + +import javax.annotation.concurrent.Immutable; + +/** + * Abstract superclass for {@link TransportKeys} and + * {@link StaticTransportKeys}. + */ +@Immutable +@NotNullByDefault +public abstract class AbstractTransportKeys { + + private final TransportId transportId; + private final IncomingKeys inPrev, inCurr, inNext; + private final OutgoingKeys outCurr; + + AbstractTransportKeys(TransportId transportId, IncomingKeys inPrev, + IncomingKeys inCurr, IncomingKeys inNext, OutgoingKeys outCurr) { + if (inPrev.getTimePeriod() != outCurr.getTimePeriod() - 1) + throw new IllegalArgumentException(); + if (inCurr.getTimePeriod() != outCurr.getTimePeriod()) + throw new IllegalArgumentException(); + if (inNext.getTimePeriod() != outCurr.getTimePeriod() + 1) + throw new IllegalArgumentException(); + this.transportId = transportId; + this.inPrev = inPrev; + this.inCurr = inCurr; + this.inNext = inNext; + this.outCurr = outCurr; + } + + public TransportId getTransportId() { + return transportId; + } + + public IncomingKeys getPreviousIncomingKeys() { + return inPrev; + } + + public IncomingKeys getCurrentIncomingKeys() { + return inCurr; + } + + public IncomingKeys getNextIncomingKeys() { + return inNext; + } + + public OutgoingKeys getCurrentOutgoingKeys() { + return outCurr; + } + + public long getTimePeriod() { + return outCurr.getTimePeriod(); + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StaticTransportKeys.java b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StaticTransportKeys.java index 22f85d976..8f02b240f 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StaticTransportKeys.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StaticTransportKeys.java @@ -6,9 +6,13 @@ import org.briarproject.bramble.api.plugin.TransportId; import javax.annotation.concurrent.Immutable; +/** + * Keys for communicating with a given contact over a given transport. Unlike + * {@link TransportKeys} these do not provide forward secrecy. + */ @Immutable @NotNullByDefault -public class StaticTransportKeys extends TransportKeys { +public class StaticTransportKeys extends AbstractTransportKeys { private final SecretKey rootKey; private final boolean alice; diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeys.java b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeys.java index 860916457..9cd861df9 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeys.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeys.java @@ -6,52 +6,15 @@ import org.briarproject.bramble.api.plugin.TransportId; import javax.annotation.concurrent.Immutable; /** - * Keys for communicating with a given contact over a given transport. + * Keys for communicating with a given contact over a given transport. Unlike + * {@link StaticTransportKeys}, these keys provide forward secrecy. */ @Immutable @NotNullByDefault -public class TransportKeys { - - private final TransportId transportId; - private final IncomingKeys inPrev, inCurr, inNext; - private final OutgoingKeys outCurr; +public class TransportKeys extends AbstractTransportKeys { public TransportKeys(TransportId transportId, IncomingKeys inPrev, IncomingKeys inCurr, IncomingKeys inNext, OutgoingKeys outCurr) { - if (inPrev.getTimePeriod() != outCurr.getTimePeriod() - 1) - throw new IllegalArgumentException(); - if (inCurr.getTimePeriod() != outCurr.getTimePeriod()) - throw new IllegalArgumentException(); - if (inNext.getTimePeriod() != outCurr.getTimePeriod() + 1) - throw new IllegalArgumentException(); - this.transportId = transportId; - this.inPrev = inPrev; - this.inCurr = inCurr; - this.inNext = inNext; - this.outCurr = outCurr; - } - - public TransportId getTransportId() { - return transportId; - } - - public IncomingKeys getPreviousIncomingKeys() { - return inPrev; - } - - public IncomingKeys getCurrentIncomingKeys() { - return inCurr; - } - - public IncomingKeys getNextIncomingKeys() { - return inNext; - } - - public OutgoingKeys getCurrentOutgoingKeys() { - return outCurr; - } - - public long getTimePeriod() { - return outCurr.getTimePeriod(); + super(transportId, inPrev, inCurr, inNext, outCurr); } } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyDerivationTestUtils.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyDerivationTestUtils.java index 470ae5b99..878dc5488 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyDerivationTestUtils.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyDerivationTestUtils.java @@ -2,9 +2,9 @@ package org.briarproject.bramble.crypto; import org.briarproject.bramble.api.Bytes; import org.briarproject.bramble.api.crypto.SecretKey; +import org.briarproject.bramble.api.transport.AbstractTransportKeys; import org.briarproject.bramble.api.transport.IncomingKeys; import org.briarproject.bramble.api.transport.OutgoingKeys; -import org.briarproject.bramble.api.transport.TransportKeys; import java.util.ArrayList; import java.util.HashSet; @@ -16,9 +16,9 @@ import static org.junit.Assert.assertTrue; class KeyDerivationTestUtils { - static void assertAllDifferent(TransportKeys... transportKeys) { + static void assertAllDifferent(AbstractTransportKeys... transportKeys) { List secretKeys = new ArrayList<>(); - for (TransportKeys k : transportKeys) { + for (AbstractTransportKeys k : transportKeys) { secretKeys.add(k.getPreviousIncomingKeys().getTagKey()); secretKeys.add(k.getPreviousIncomingKeys().getHeaderKey()); secretKeys.add(k.getCurrentIncomingKeys().getTagKey());