mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 02:39:05 +01:00
Add method for deriving rendezvous key.
This commit is contained in:
@@ -1,9 +1,27 @@
|
||||
package org.briarproject.bramble.api.rendezvous;
|
||||
|
||||
import static java.util.concurrent.TimeUnit.DAYS;
|
||||
|
||||
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 =
|
||||
"org.briarproject.bramble.rendezvous/KEY_MATERIAL";
|
||||
|
||||
@@ -1,12 +1,19 @@
|
||||
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.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.plugin.TransportId;
|
||||
|
||||
import java.security.GeneralSecurityException;
|
||||
|
||||
@NotNullByDefault
|
||||
public interface RendezvousCrypto {
|
||||
|
||||
KeyMaterialSource createKeyMaterialSource(SecretKey masterKey,
|
||||
SecretKey deriveRendezvousKey(PublicKey theirPublicKey, KeyPair ourKeyPair)
|
||||
throws GeneralSecurityException;
|
||||
|
||||
KeyMaterialSource createKeyMaterialSource(SecretKey rendezvousKey,
|
||||
TransportId t);
|
||||
}
|
||||
|
||||
@@ -1,16 +1,23 @@
|
||||
package org.briarproject.bramble.rendezvous;
|
||||
|
||||
import org.briarproject.bramble.api.Bytes;
|
||||
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.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.plugin.TransportId;
|
||||
import org.briarproject.bramble.api.rendezvous.KeyMaterialSource;
|
||||
import org.briarproject.bramble.api.rendezvous.RendezvousCrypto;
|
||||
|
||||
import java.security.GeneralSecurityException;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
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;
|
||||
|
||||
@Immutable
|
||||
@@ -25,10 +32,26 @@ class RendezvousCryptoImpl implements RendezvousCrypto {
|
||||
}
|
||||
|
||||
@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) {
|
||||
SecretKey sourceKey = crypto.deriveKey(KEY_MATERIAL_LABEL, masterKey,
|
||||
toUtf8(t.getString()));
|
||||
SecretKey sourceKey = crypto.deriveKey(KEY_MATERIAL_LABEL,
|
||||
rendezvousKey, toUtf8(t.getString()));
|
||||
return new KeyMaterialSourceImpl(sourceKey);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user