mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-13 11:19:04 +01:00
Move handshake keys from LocalAuthor to Account.
This commit is contained in:
@@ -5,9 +5,9 @@ import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.contact.PendingContact;
|
||||
import org.briarproject.bramble.api.contact.PendingContactId;
|
||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||
import org.briarproject.bramble.api.identity.Account;
|
||||
import org.briarproject.bramble.api.identity.Author;
|
||||
import org.briarproject.bramble.api.identity.AuthorId;
|
||||
import org.briarproject.bramble.api.identity.LocalAuthor;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.plugin.TransportId;
|
||||
import org.briarproject.bramble.api.settings.Settings;
|
||||
@@ -101,6 +101,11 @@ public interface DatabaseComponent {
|
||||
<R, E extends Exception> R transactionWithNullableResult(boolean readOnly,
|
||||
NullableDbCallable<R, E> task) throws DbException, E;
|
||||
|
||||
/**
|
||||
* Stores an account.
|
||||
*/
|
||||
void addAccount(Transaction txn, Account a) throws DbException;
|
||||
|
||||
/**
|
||||
* Stores a contact associated with the given local and remote pseudonyms,
|
||||
* and returns an ID for the contact.
|
||||
@@ -127,11 +132,6 @@ public interface DatabaseComponent {
|
||||
HandshakeKeySetId addHandshakeKeys(Transaction txn, PendingContactId p,
|
||||
HandshakeKeys k) throws DbException;
|
||||
|
||||
/**
|
||||
* Stores a local pseudonym.
|
||||
*/
|
||||
void addLocalAuthor(Transaction txn, LocalAuthor a) throws DbException;
|
||||
|
||||
/**
|
||||
* Stores a local message.
|
||||
*/
|
||||
@@ -157,6 +157,13 @@ public interface DatabaseComponent {
|
||||
TransportKeySetId addTransportKeys(Transaction txn, ContactId c,
|
||||
TransportKeys k) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns true if the database contains an account for the given pseudonym.
|
||||
* <p/>
|
||||
* Read-only.
|
||||
*/
|
||||
boolean containsAccount(Transaction txn, AuthorId local) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns true if the database contains the given contact for the given
|
||||
* local pseudonym.
|
||||
@@ -173,14 +180,6 @@ public interface DatabaseComponent {
|
||||
*/
|
||||
boolean containsGroup(Transaction txn, GroupId g) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns true if the database contains the given local author.
|
||||
* <p/>
|
||||
* Read-only.
|
||||
*/
|
||||
boolean containsLocalAuthor(Transaction txn, AuthorId local)
|
||||
throws DbException;
|
||||
|
||||
/**
|
||||
* Returns true if the database contains the given pending contact.
|
||||
* <p/>
|
||||
@@ -247,6 +246,20 @@ public interface DatabaseComponent {
|
||||
Collection<Message> generateRequestedBatch(Transaction txn, ContactId c,
|
||||
int maxLength, int maxLatency) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the account for the local pseudonym with the given ID.
|
||||
* <p/>
|
||||
* Read-only.
|
||||
*/
|
||||
Account getAccount(Transaction txn, AuthorId a) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the accounts for all local pseudonyms.
|
||||
* <p/>
|
||||
* Read-only.
|
||||
*/
|
||||
Collection<Account> getAccounts(Transaction txn) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the contact with the given ID.
|
||||
* <p/>
|
||||
@@ -316,20 +329,6 @@ public interface DatabaseComponent {
|
||||
Collection<HandshakeKeySet> getHandshakeKeys(Transaction txn, TransportId t)
|
||||
throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the local pseudonym with the given ID.
|
||||
* <p/>
|
||||
* Read-only.
|
||||
*/
|
||||
LocalAuthor getLocalAuthor(Transaction txn, AuthorId a) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns all local pseudonyms.
|
||||
* <p/>
|
||||
* Read-only.
|
||||
*/
|
||||
Collection<LocalAuthor> getLocalAuthors(Transaction txn) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the message with the given ID.
|
||||
* <p/>
|
||||
@@ -542,6 +541,11 @@ public interface DatabaseComponent {
|
||||
void receiveRequest(Transaction txn, ContactId c, Request r)
|
||||
throws DbException;
|
||||
|
||||
/**
|
||||
* Removes an account (and all associated state) from the database.
|
||||
*/
|
||||
void removeAccount(Transaction txn, AuthorId a) throws DbException;
|
||||
|
||||
/**
|
||||
* Removes a contact (and all associated state) from the database.
|
||||
*/
|
||||
@@ -558,11 +562,6 @@ public interface DatabaseComponent {
|
||||
void removeHandshakeKeys(Transaction txn, TransportId t,
|
||||
HandshakeKeySetId k) throws DbException;
|
||||
|
||||
/**
|
||||
* Removes a local pseudonym (and all associated state) from the database.
|
||||
*/
|
||||
void removeLocalAuthor(Transaction txn, AuthorId a) throws DbException;
|
||||
|
||||
/**
|
||||
* Removes a message (and all associated state) from the database.
|
||||
*/
|
||||
@@ -620,7 +619,7 @@ public interface DatabaseComponent {
|
||||
Collection<MessageId> dependencies) throws DbException;
|
||||
|
||||
/**
|
||||
* Sets the handshake key pair for the local pseudonym with the given ID.
|
||||
* Sets the handshake key pair for the account with the given ID.
|
||||
*/
|
||||
void setHandshakeKeyPair(Transaction txn, AuthorId local, byte[] publicKey,
|
||||
byte[] privateKey) throws DbException;
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
package org.briarproject.bramble.api.identity;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_AGREEMENT_PUBLIC_KEY_BYTES;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
public class Account {
|
||||
|
||||
private final LocalAuthor localAuthor;
|
||||
@Nullable
|
||||
private final byte[] handshakePublicKey, handshakePrivateKey;
|
||||
private final long created;
|
||||
|
||||
public Account(LocalAuthor localAuthor,
|
||||
@Nullable byte[] handshakePublicKey,
|
||||
@Nullable byte[] handshakePrivateKey, long created) {
|
||||
if (handshakePublicKey != null) {
|
||||
int keyLength = handshakePublicKey.length;
|
||||
if (keyLength == 0 || keyLength > MAX_AGREEMENT_PUBLIC_KEY_BYTES)
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
this.localAuthor = localAuthor;
|
||||
this.handshakePublicKey = handshakePublicKey;
|
||||
this.handshakePrivateKey = handshakePrivateKey;
|
||||
this.created = created;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the user's pseudonym.
|
||||
*/
|
||||
public AuthorId getId() {
|
||||
return localAuthor.getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the user's pseudonym.
|
||||
*/
|
||||
public LocalAuthor getLocalAuthor() {
|
||||
return localAuthor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the account has a handshake key pair.
|
||||
*/
|
||||
public boolean hasHandshakeKeyPair() {
|
||||
return handshakePublicKey != null && handshakePrivateKey != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the public key used for handshaking, or null if no key exists.
|
||||
*/
|
||||
@Nullable
|
||||
public byte[] getHandshakePublicKey() {
|
||||
return handshakePublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the private key used for handshaking, or null if no key exists.
|
||||
*/
|
||||
@Nullable
|
||||
public byte[] getHandshakePrivateKey() {
|
||||
return handshakePrivateKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time the account was created, in milliseconds since the
|
||||
* Unix epoch.
|
||||
*/
|
||||
public long getTimeCreated() {
|
||||
return created;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return localAuthor.getId().hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o instanceof Account) {
|
||||
Account a = (Account) o;
|
||||
return created == a.created &&
|
||||
localAuthor.equals(a.localAuthor) &&
|
||||
Arrays.equals(handshakePublicKey, a.handshakePublicKey) &&
|
||||
Arrays.equals(handshakePrivateKey, a.handshakePrivateKey);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -19,9 +19,6 @@ public interface AuthorFactory {
|
||||
/**
|
||||
* Creates a local author with the current format version and the given
|
||||
* name.
|
||||
*
|
||||
* @param handshakeKeys true if the local author should include handshake
|
||||
* keys.
|
||||
*/
|
||||
LocalAuthor createLocalAuthor(String name, boolean handshakeKeys);
|
||||
LocalAuthor createLocalAuthor(String name);
|
||||
}
|
||||
|
||||
@@ -17,12 +17,19 @@ public interface IdentityManager {
|
||||
LocalAuthor createLocalAuthor(String name);
|
||||
|
||||
/**
|
||||
* Registers the given local identity with the manager. This method should
|
||||
* be called before {@link LifecycleManager#startServices(SecretKey)}. The
|
||||
* identity is stored when {@link LifecycleManager#startServices(SecretKey)}
|
||||
* is called.
|
||||
* Creates an account with the given name. The account includes a handshake
|
||||
* key pair.
|
||||
*/
|
||||
void registerLocalAuthor(LocalAuthor a);
|
||||
@CryptoExecutor
|
||||
Account createAccount(String name);
|
||||
|
||||
/**
|
||||
* Registers the given account with the manager. This method should be
|
||||
* called before {@link LifecycleManager#startServices(SecretKey)}. The
|
||||
* account is stored when {@link LifecycleManager#startServices(SecretKey)}
|
||||
* is called. The account must include a handshake key pair.
|
||||
*/
|
||||
void registerAccount(Account a);
|
||||
|
||||
/**
|
||||
* Returns the cached local identity or loads it from the database.
|
||||
|
||||
@@ -2,11 +2,8 @@ package org.briarproject.bramble.api.identity;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
|
||||
|
||||
/**
|
||||
* A pseudonym for the local user.
|
||||
*/
|
||||
@@ -15,31 +12,11 @@ import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_K
|
||||
public class LocalAuthor extends Author {
|
||||
|
||||
private final byte[] privateKey;
|
||||
@Nullable
|
||||
private final byte[] handshakePublicKey, handshakePrivateKey;
|
||||
private final long created;
|
||||
|
||||
public LocalAuthor(AuthorId id, int formatVersion, String name,
|
||||
byte[] publicKey, byte[] privateKey, long created) {
|
||||
byte[] publicKey, byte[] privateKey) {
|
||||
super(id, formatVersion, name, publicKey);
|
||||
this.privateKey = privateKey;
|
||||
this.created = created;
|
||||
handshakePublicKey = null;
|
||||
handshakePrivateKey = null;
|
||||
}
|
||||
|
||||
public LocalAuthor(AuthorId id, int formatVersion, String name,
|
||||
byte[] publicKey, byte[] privateKey, byte[] handshakePublicKey,
|
||||
byte[] handshakePrivateKey, long created) {
|
||||
super(id, formatVersion, name, publicKey);
|
||||
if (handshakePublicKey.length == 0 ||
|
||||
handshakePublicKey.length > MAX_PUBLIC_KEY_LENGTH) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
this.privateKey = privateKey;
|
||||
this.handshakePublicKey = handshakePublicKey;
|
||||
this.handshakePrivateKey = handshakePrivateKey;
|
||||
this.created = created;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -48,28 +25,4 @@ public class LocalAuthor extends Author {
|
||||
public byte[] getPrivateKey() {
|
||||
return privateKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the public key used for handshaking, or null if no key exists.
|
||||
*/
|
||||
@Nullable
|
||||
public byte[] getHandshakePublicKey() {
|
||||
return handshakePublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the private key used for handshaking, or null if no key exists.
|
||||
*/
|
||||
@Nullable
|
||||
public byte[] getHandshakePrivateKey() {
|
||||
return handshakePrivateKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time the pseudonym was created, in milliseconds since the
|
||||
* Unix epoch.
|
||||
*/
|
||||
public long getTimeCreated() {
|
||||
return created;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.contact.PendingContact;
|
||||
import org.briarproject.bramble.api.contact.PendingContactId;
|
||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||
import org.briarproject.bramble.api.identity.Account;
|
||||
import org.briarproject.bramble.api.identity.Author;
|
||||
import org.briarproject.bramble.api.identity.AuthorId;
|
||||
import org.briarproject.bramble.api.identity.LocalAuthor;
|
||||
@@ -100,28 +101,20 @@ public class TestUtils {
|
||||
return new SecretKey(getRandomBytes(SecretKey.LENGTH));
|
||||
}
|
||||
|
||||
public static LocalAuthor getLocalAuthor() {
|
||||
return getLocalAuthor(false);
|
||||
public static Account getAccount() {
|
||||
LocalAuthor localAuthor = getLocalAuthor();
|
||||
byte[] handshakePub = getRandomBytes(MAX_AGREEMENT_PUBLIC_KEY_BYTES);
|
||||
byte[] handshakePriv = getRandomBytes(MAX_AGREEMENT_PUBLIC_KEY_BYTES);
|
||||
return new Account(localAuthor, handshakePub, handshakePriv, timestamp);
|
||||
}
|
||||
|
||||
public static LocalAuthor getLocalAuthor(boolean withHandshakeKeys) {
|
||||
public static LocalAuthor getLocalAuthor() {
|
||||
AuthorId id = new AuthorId(getRandomId());
|
||||
int nameLength = 1 + random.nextInt(MAX_AUTHOR_NAME_LENGTH);
|
||||
String name = getRandomString(nameLength);
|
||||
byte[] publicKey = getRandomBytes(MAX_PUBLIC_KEY_LENGTH);
|
||||
byte[] privateKey = getRandomBytes(MAX_PUBLIC_KEY_LENGTH);
|
||||
if (withHandshakeKeys) {
|
||||
byte[] handshakePublicKey =
|
||||
getRandomBytes(MAX_AGREEMENT_PUBLIC_KEY_BYTES);
|
||||
byte[] handshakePrivateKey =
|
||||
getRandomBytes(MAX_AGREEMENT_PUBLIC_KEY_BYTES);
|
||||
return new LocalAuthor(id, FORMAT_VERSION, name, publicKey,
|
||||
privateKey, handshakePublicKey, handshakePrivateKey,
|
||||
timestamp);
|
||||
} else {
|
||||
return new LocalAuthor(id, FORMAT_VERSION, name, publicKey,
|
||||
privateKey, timestamp);
|
||||
}
|
||||
return new LocalAuthor(id, FORMAT_VERSION, name, publicKey, privateKey);
|
||||
}
|
||||
|
||||
public static Author getAuthor() {
|
||||
|
||||
Reference in New Issue
Block a user