diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index d1eb4e913..ccd459169 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -209,6 +209,16 @@ public interface ContactManager { void setContactAlias(ContactId c, @Nullable String alias) throws DbException; + /** + * Sets the contact's handshake public key + */ + void setHandshakePublicKey(Transaction txn, ContactId c, PublicKey handshakePublicKey) throws DbException; + + /** + * Sets the contact's handshake public key + */ + void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) throws DbException; + /** * Returns true if a contact with this {@code remoteAuthorId} belongs to * the local pseudonym with this {@code localAuthorId}. diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java index 7c525bcd3..ef143d269 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java @@ -546,6 +546,11 @@ public interface DatabaseComponent extends TransactionManager { void setContactAlias(Transaction txn, ContactId c, @Nullable String alias) throws DbException; + /** + * Sets the remote handshake public key for a given contact + */ + void setHandshakePublicKey(Transaction txn, ContactId c, PublicKey handshakePublicKey) throws DbException; + /** * Sets the given group's visibility to the given contact. */ diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index f7992aa66..6ec0ebdfd 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.api.contact.PendingContact; import org.briarproject.bramble.api.contact.PendingContactId; import org.briarproject.bramble.api.contact.PendingContactState; import org.briarproject.bramble.api.contact.event.PendingContactStateChangedEvent; +import org.briarproject.bramble.api.crypto.CryptoConstants; import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.crypto.SecretKey; @@ -243,6 +244,23 @@ class ContactManagerImpl implements ContactManager, EventListener { db.transaction(false, txn -> setContactAlias(txn, c, alias)); } + @Override + public void setHandshakePublicKey(Transaction txn, ContactId c, + PublicKey handshakePublicKey) throws DbException { + if (handshakePublicKey.getKeyType() != + CryptoConstants.KEY_TYPE_AGREEMENT) { + throw new IllegalArgumentException(); + } + db.setHandshakePublicKey(txn, c, handshakePublicKey); + } + + @Override + public void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) + throws DbException { + db.transaction(false, + txn -> setHandshakePublicKey(txn, c, handshakePublicKey)); + } + @Override public boolean contactExists(Transaction txn, AuthorId remoteAuthorId, AuthorId localAuthorId) throws DbException { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java index f6745af24..bd7568dc1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java @@ -32,6 +32,7 @@ import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.transport.TransportKeySet; import org.briarproject.bramble.api.transport.TransportKeys; +import java.sql.Connection; import java.util.Collection; import java.util.List; import java.util.Map; @@ -695,6 +696,11 @@ interface Database { void setHandshakeKeyPair(T txn, AuthorId local, PublicKey publicKey, PrivateKey privateKey) throws DbException; + /** + * Sets the handshake public key for a given contact + */ + void setHandshakePublicKey(T txn, ContactId c, PublicKey handshakePublicKey) throws DbException; + /** * Marks the given message as permanent, i.e. not temporary. */ diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index 6ec1760af..245efde96 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -1040,6 +1040,15 @@ class DatabaseComponentImpl implements DatabaseComponent { } } + @Override + public void setHandshakePublicKey(Transaction transaction, ContactId c, PublicKey handshakePublicKey) throws DbException { + if (transaction.isReadOnly()) throw new IllegalArgumentException(); + T txn = unbox(transaction); + if (!db.containsContact(txn, c)) + throw new NoSuchContactException(); + db.setHandshakePublicKey(txn, c, handshakePublicKey); + } + @Override public void setHandshakeKeyPair(Transaction transaction, AuthorId local, PublicKey publicKey, PrivateKey privateKey) throws DbException { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index c56b48e8d..6b2471952 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -3058,6 +3058,23 @@ abstract class JdbcDatabase implements Database { } } + @Override + public void setHandshakePublicKey(Connection txn, ContactId c, PublicKey handshakePublicKey) throws DbException { + PreparedStatement ps = null; + try { + String sql = "UPDATE contacts SET handshakePublicKey = ? WHERE contactId = ?"; + ps = txn.prepareStatement(sql); + ps.setBytes(1, handshakePublicKey.getEncoded()); + ps.setInt(2, c.getInt()); + int affected = ps.executeUpdate(); + if (affected < 0 || affected > 1) throw new DbStateException(); + ps.close(); + } catch (SQLException e) { + tryToClose(ps, LOG, WARNING); + throw new DbException(e); + } + } + @Override public void setGroupVisibility(Connection txn, ContactId c, GroupId g, boolean shared) throws DbException {