mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 19:59:05 +01:00
Add methods for deriving static master and root keys.
This commit is contained in:
@@ -3,12 +3,28 @@ package org.briarproject.bramble.api.crypto;
|
|||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.transport.TransportKeys;
|
import org.briarproject.bramble.api.transport.TransportKeys;
|
||||||
|
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Crypto operations for the transport security protocol - see
|
* Crypto operations for the transport security protocol - see
|
||||||
* https://code.briarproject.org/briar/briar-spec/blob/master/protocols/BTP.md
|
* https://code.briarproject.org/briar/briar-spec/blob/master/protocols/BTP.md
|
||||||
*/
|
*/
|
||||||
public interface TransportCrypto {
|
public interface TransportCrypto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derives the static master key shared with a contact or pending contact.
|
||||||
|
*/
|
||||||
|
SecretKey deriveStaticMasterKey(PublicKey theirHandshakePublicKey,
|
||||||
|
KeyPair ourHandshakeKeyPair) throws GeneralSecurityException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derives the handshake mode root key from the static master key.
|
||||||
|
* @param pendingContact Whether the static master key is shared with a
|
||||||
|
* pending contact or a contact
|
||||||
|
*/
|
||||||
|
SecretKey deriveHandshakeRootKey(SecretKey staticMasterKey,
|
||||||
|
boolean pendingContact);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Derives initial rotation mode transport keys for the given transport in
|
* Derives initial rotation mode transport keys for the given transport in
|
||||||
* the given time period from the given root key.
|
* the given time period from the given root key.
|
||||||
|
|||||||
@@ -63,14 +63,6 @@ public interface TransportConstants {
|
|||||||
int MAX_PAYLOAD_LENGTH = MAX_FRAME_LENGTH - FRAME_HEADER_LENGTH
|
int MAX_PAYLOAD_LENGTH = MAX_FRAME_LENGTH - FRAME_HEADER_LENGTH
|
||||||
- MAC_LENGTH;
|
- MAC_LENGTH;
|
||||||
|
|
||||||
/**
|
|
||||||
* The minimum stream length in bytes that all transport plugins must
|
|
||||||
* support. Streams may be shorter than this length, but all transport
|
|
||||||
* plugins must support streams of at least this length.
|
|
||||||
*/
|
|
||||||
int MIN_STREAM_LENGTH = STREAM_HEADER_LENGTH + FRAME_HEADER_LENGTH
|
|
||||||
+ MAC_LENGTH;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The maximum difference in milliseconds between two peers' clocks.
|
* The maximum difference in milliseconds between two peers' clocks.
|
||||||
*/
|
*/
|
||||||
@@ -81,6 +73,26 @@ public interface TransportConstants {
|
|||||||
*/
|
*/
|
||||||
int REORDERING_WINDOW_SIZE = 32;
|
int REORDERING_WINDOW_SIZE = 32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label for deriving the static master key from handshake key pairs.
|
||||||
|
*/
|
||||||
|
String STATIC_MASTER_KEY_LABEL =
|
||||||
|
"org.briarproject.bramble.transport/STATIC_MASTER_KEY";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label for deriving the handshake mode root key for a pending contact
|
||||||
|
* from the static master key.
|
||||||
|
*/
|
||||||
|
String PENDING_CONTACT_ROOT_KEY_LABEL =
|
||||||
|
"org.briarproject.bramble.transport/PENDING_CONTACT_ROOT_KEY";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label for deriving the handshake mode root key for a contact from the
|
||||||
|
* static master key.
|
||||||
|
*/
|
||||||
|
String CONTACT_ROOT_KEY_LABEL =
|
||||||
|
"org.briarproject.bramble.transport/CONTACT_ROOT_KEY";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Label for deriving Alice's initial tag key from the root key in
|
* Label for deriving Alice's initial tag key from the root key in
|
||||||
* rotation mode.
|
* rotation mode.
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package org.briarproject.bramble.crypto;
|
package org.briarproject.bramble.crypto;
|
||||||
|
|
||||||
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.crypto.TransportCrypto;
|
import org.briarproject.bramble.api.crypto.TransportCrypto;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
@@ -10,9 +12,12 @@ import org.briarproject.bramble.api.transport.TransportKeys;
|
|||||||
import org.spongycastle.crypto.Digest;
|
import org.spongycastle.crypto.Digest;
|
||||||
import org.spongycastle.crypto.digests.Blake2bDigest;
|
import org.spongycastle.crypto.digests.Blake2bDigest;
|
||||||
|
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static java.lang.System.arraycopy;
|
import static java.lang.System.arraycopy;
|
||||||
|
import static org.briarproject.bramble.api.Bytes.compare;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.ALICE_HANDSHAKE_HEADER_LABEL;
|
import static org.briarproject.bramble.api.transport.TransportConstants.ALICE_HANDSHAKE_HEADER_LABEL;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.ALICE_HANDSHAKE_TAG_LABEL;
|
import static org.briarproject.bramble.api.transport.TransportConstants.ALICE_HANDSHAKE_TAG_LABEL;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.ALICE_HEADER_LABEL;
|
import static org.briarproject.bramble.api.transport.TransportConstants.ALICE_HEADER_LABEL;
|
||||||
@@ -21,7 +26,10 @@ import static org.briarproject.bramble.api.transport.TransportConstants.BOB_HAND
|
|||||||
import static org.briarproject.bramble.api.transport.TransportConstants.BOB_HANDSHAKE_TAG_LABEL;
|
import static org.briarproject.bramble.api.transport.TransportConstants.BOB_HANDSHAKE_TAG_LABEL;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.BOB_HEADER_LABEL;
|
import static org.briarproject.bramble.api.transport.TransportConstants.BOB_HEADER_LABEL;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.BOB_TAG_LABEL;
|
import static org.briarproject.bramble.api.transport.TransportConstants.BOB_TAG_LABEL;
|
||||||
|
import static org.briarproject.bramble.api.transport.TransportConstants.CONTACT_ROOT_KEY_LABEL;
|
||||||
|
import static org.briarproject.bramble.api.transport.TransportConstants.PENDING_CONTACT_ROOT_KEY_LABEL;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.ROTATE_LABEL;
|
import static org.briarproject.bramble.api.transport.TransportConstants.ROTATE_LABEL;
|
||||||
|
import static org.briarproject.bramble.api.transport.TransportConstants.STATIC_MASTER_KEY_LABEL;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH;
|
import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH;
|
||||||
import static org.briarproject.bramble.util.ByteUtils.INT_16_BYTES;
|
import static org.briarproject.bramble.util.ByteUtils.INT_16_BYTES;
|
||||||
import static org.briarproject.bramble.util.ByteUtils.INT_64_BYTES;
|
import static org.briarproject.bramble.util.ByteUtils.INT_64_BYTES;
|
||||||
@@ -40,6 +48,28 @@ class TransportCryptoImpl implements TransportCrypto {
|
|||||||
this.crypto = crypto;
|
this.crypto = crypto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SecretKey deriveStaticMasterKey(PublicKey theirHandshakePublicKey,
|
||||||
|
KeyPair ourHandshakeKeyPair) throws GeneralSecurityException {
|
||||||
|
byte[] theirPublic = theirHandshakePublicKey.getEncoded();
|
||||||
|
byte[] ourPublic = ourHandshakeKeyPair.getPublic().getEncoded();
|
||||||
|
boolean alice = compare(ourPublic, theirPublic) < 0;
|
||||||
|
byte[][] inputs = {
|
||||||
|
alice ? ourPublic : theirPublic,
|
||||||
|
alice ? theirPublic : ourPublic
|
||||||
|
};
|
||||||
|
return crypto.deriveSharedSecret(STATIC_MASTER_KEY_LABEL,
|
||||||
|
theirHandshakePublicKey, ourHandshakeKeyPair, inputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SecretKey deriveHandshakeRootKey(SecretKey staticMasterKey,
|
||||||
|
boolean pendingContact) {
|
||||||
|
String label = pendingContact ?
|
||||||
|
PENDING_CONTACT_ROOT_KEY_LABEL : CONTACT_ROOT_KEY_LABEL;
|
||||||
|
return crypto.deriveKey(label, staticMasterKey);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TransportKeys deriveRotationKeys(TransportId t,
|
public TransportKeys deriveRotationKeys(TransportId t,
|
||||||
SecretKey rootKey, long timePeriod, boolean weAreAlice,
|
SecretKey rootKey, long timePeriod, boolean weAreAlice,
|
||||||
|
|||||||
Reference in New Issue
Block a user