mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-16 04:39:54 +01:00
Add method for deriving rendezvous key.
This commit is contained in:
@@ -1,9 +1,27 @@
|
|||||||
package org.briarproject.bramble.api.rendezvous;
|
package org.briarproject.bramble.api.rendezvous;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.DAYS;
|
||||||
|
|
||||||
public interface RendezvousConstants {
|
public interface RendezvousConstants {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Label for deriving key material from the master key.
|
* The current version of the rendezvous protocol.
|
||||||
|
*/
|
||||||
|
byte PROTOCOL_VERSION = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How long to try to rendezvous with a pending contact before giving up.
|
||||||
|
*/
|
||||||
|
long RENDEZVOUS_TIMEOUT_MS = DAYS.toMillis(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label for deriving the rendezvous key from the handshake key pairs.
|
||||||
|
*/
|
||||||
|
String RENDEZVOUS_KEY_LABEL =
|
||||||
|
"org.briarproject.bramble.rendezvous/RENDEZVOUS_KEY";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label for deriving key material from the rendezvous key.
|
||||||
*/
|
*/
|
||||||
String KEY_MATERIAL_LABEL =
|
String KEY_MATERIAL_LABEL =
|
||||||
"org.briarproject.bramble.rendezvous/KEY_MATERIAL";
|
"org.briarproject.bramble.rendezvous/KEY_MATERIAL";
|
||||||
|
|||||||
@@ -1,12 +1,19 @@
|
|||||||
package org.briarproject.bramble.api.rendezvous;
|
package org.briarproject.bramble.api.rendezvous;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.crypto.KeyPair;
|
||||||
|
import org.briarproject.bramble.api.crypto.PublicKey;
|
||||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
|
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public interface RendezvousCrypto {
|
public interface RendezvousCrypto {
|
||||||
|
|
||||||
KeyMaterialSource createKeyMaterialSource(SecretKey masterKey,
|
SecretKey deriveRendezvousKey(PublicKey theirPublicKey, KeyPair ourKeyPair)
|
||||||
|
throws GeneralSecurityException;
|
||||||
|
|
||||||
|
KeyMaterialSource createKeyMaterialSource(SecretKey rendezvousKey,
|
||||||
TransportId t);
|
TransportId t);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,23 @@
|
|||||||
package org.briarproject.bramble.rendezvous;
|
package org.briarproject.bramble.rendezvous;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.Bytes;
|
||||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||||
|
import org.briarproject.bramble.api.crypto.KeyPair;
|
||||||
|
import org.briarproject.bramble.api.crypto.PublicKey;
|
||||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.rendezvous.KeyMaterialSource;
|
import org.briarproject.bramble.api.rendezvous.KeyMaterialSource;
|
||||||
import org.briarproject.bramble.api.rendezvous.RendezvousCrypto;
|
import org.briarproject.bramble.api.rendezvous.RendezvousCrypto;
|
||||||
|
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static org.briarproject.bramble.api.rendezvous.RendezvousConstants.KEY_MATERIAL_LABEL;
|
import static org.briarproject.bramble.api.rendezvous.RendezvousConstants.KEY_MATERIAL_LABEL;
|
||||||
|
import static org.briarproject.bramble.api.rendezvous.RendezvousConstants.RENDEZVOUS_KEY_LABEL;
|
||||||
|
import static org.briarproject.bramble.api.rendezvous.RendezvousConstants.PROTOCOL_VERSION;
|
||||||
import static org.briarproject.bramble.util.StringUtils.toUtf8;
|
import static org.briarproject.bramble.util.StringUtils.toUtf8;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@@ -25,10 +32,26 @@ class RendezvousCryptoImpl implements RendezvousCrypto {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KeyMaterialSource createKeyMaterialSource(SecretKey masterKey,
|
public SecretKey deriveRendezvousKey(PublicKey theirPublicKey,
|
||||||
|
KeyPair ourKeyPair) throws GeneralSecurityException {
|
||||||
|
byte[] ourPublicKeyBytes = ourKeyPair.getPublic().getEncoded();
|
||||||
|
byte[] theirPublicKeyBytes = theirPublicKey.getEncoded();
|
||||||
|
boolean alice = new Bytes(ourPublicKeyBytes).compareTo(
|
||||||
|
new Bytes(theirPublicKeyBytes)) < 0;
|
||||||
|
byte[][] inputs = {
|
||||||
|
new byte[] {PROTOCOL_VERSION},
|
||||||
|
alice ? ourPublicKeyBytes : theirPublicKeyBytes,
|
||||||
|
alice ? theirPublicKeyBytes : ourPublicKeyBytes
|
||||||
|
};
|
||||||
|
return crypto.deriveSharedSecret(RENDEZVOUS_KEY_LABEL, theirPublicKey,
|
||||||
|
ourKeyPair, inputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public KeyMaterialSource createKeyMaterialSource(SecretKey rendezvousKey,
|
||||||
TransportId t) {
|
TransportId t) {
|
||||||
SecretKey sourceKey = crypto.deriveKey(KEY_MATERIAL_LABEL, masterKey,
|
SecretKey sourceKey = crypto.deriveKey(KEY_MATERIAL_LABEL,
|
||||||
toUtf8(t.getString()));
|
rendezvousKey, toUtf8(t.getString()));
|
||||||
return new KeyMaterialSourceImpl(sourceKey);
|
return new KeyMaterialSourceImpl(sourceKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user