diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java index 66a79c1e25a6d0ca72d37605428da2e69691eec6..81b7320e6b8fca4805f84626cb1cfafbcbadb16f 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java @@ -13,6 +13,13 @@ public interface ContactExchangeListener { */ void duplicateContact(Author remoteAuthor); + /** + * The exchange has failed because the contact type does not match the + * selected contact exchange + * + */ + void invalidContactTypeScanned(); + /** * A general failure. */ diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java index fb71f9a778b9c974dcdc14eea7adf0fd4216c2f9..4b61735d02351567bc38c33980445618e5788f4c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java @@ -45,6 +45,7 @@ import java.util.logging.Logger; import javax.inject.Inject; +import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.api.contact.ContactType.CONTACT; import static org.briarproject.bramble.api.contact.ContactType.MAILBOX_OWNER; @@ -163,11 +164,12 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { return; } + // TODO/FIXME handle protocol version in headerkeys/ nonce // Derive the header keys for the transport streams SecretKey aliceHeaderKey = crypto.deriveKey(ALICE_KEY_LABEL, - masterSecret, new byte[] {protocolVersion}); + masterSecret, new byte[] {1}); SecretKey bobHeaderKey = crypto.deriveKey(BOB_KEY_LABEL, masterSecret, - new byte[] {protocolVersion}); + new byte[] {1}); // Create the readers InputStream streamReader = @@ -185,10 +187,8 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { .createRecordWriter(streamWriter.getOutputStream()); // Derive the nonces to be signed - byte[] aliceNonce = crypto.mac(ALICE_NONCE_LABEL, masterSecret, - new byte[] {protocolVersion}); - byte[] bobNonce = crypto.mac(BOB_NONCE_LABEL, masterSecret, - new byte[] {protocolVersion}); + byte[] aliceNonce = crypto.mac(ALICE_NONCE_LABEL, masterSecret, new byte[] {1}); + byte[] bobNonce = crypto.mac(BOB_NONCE_LABEL, masterSecret, new byte[] {1}); byte[] localNonce = alice ? aliceNonce : bobNonce; byte[] remoteNonce = alice ? bobNonce : aliceNonce; @@ -218,6 +218,12 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { } catch (EOFException expected) { LOG.info("End of stream"); } + } catch (WrongExchangeUsedException e) { + if (LOG.isLoggable(INFO)) + LOG.info("Used wrong contact exchange screen"); + listener.invalidContactTypeScanned(); + tryToClose(conn); + return; } catch (IOException e) { logException(LOG, WARNING, e); listener.contactExchangeFailed(); @@ -299,12 +305,14 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { } private ContactInfo receiveContactInfo(RecordReader recordReader) - throws IOException { + throws IOException, WrongExchangeUsedException { Record record; do { record = recordReader.readRecord(); + // Note: This can currently only occur if the wrong exchange + // is used but may change in future if (record.getProtocolVersion() != protocolVersion) - throw new FormatException(); + throw new WrongExchangeUsedException(); } while (record.getRecordType() != CONTACT_INFO); LOG.info("Received contact info"); BdfList payload = clientHelper.toList(record.getPayload()); @@ -325,7 +333,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { ContactType type = ContactType.fromValue(payload.getLong(4).intValue()); if (type != remoteType) - throw new FormatException(); + throw new WrongExchangeUsedException(); } return new ContactInfo(author, properties, signature, timestamp, remoteType); @@ -377,4 +385,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { logException(LOG, WARNING, e); } } + + private class WrongExchangeUsedException extends Throwable { + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java index 2a50b55a33c2a3c3a307a576bddc807c0cc2f9b8..408d30e08ac780a94e974835b27a214eddfd8d66 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java @@ -95,6 +95,13 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements }); } + @Override + public void invalidContactTypeScanned() { + runOnUiThreadUnlessDestroyed(() -> + showErrorFragment( + R.string.should_scan_mailbox)); + } + @Override public void contactExchangeFailed() { runOnUiThreadUnlessDestroyed(() -> { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java index 638c11017de04583f5c29c4453517afc62741c40..4978d306c205f743d24a999edd3da7ec3bc9a601 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java @@ -6,6 +6,7 @@ import android.widget.Toast; import org.briarproject.bramble.api.contact.ContactExchangeListener; import org.briarproject.bramble.api.contact.ContactExchangeTask; +import org.briarproject.bramble.api.contact.ContactType; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; @@ -92,6 +93,14 @@ public class MailboxExchangeActivity extends KeyAgreementActivity implements }); } + @Override + public void invalidContactTypeScanned() { + runOnUiThreadUnlessDestroyed(() -> + showErrorFragment( + R.string.should_scan_contact)); + } + + @Override public void contactExchangeFailed() { runOnUiThreadUnlessDestroyed(() -> { diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index bda751e60391000df0a900b7deaf63d5b42a3c83..681c93e2be054b36b6fb4d3b87fa5ee930701ddc 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -484,4 +484,6 @@ <string name="mailbox_paired">Successfully paired with mailbox</string> <string name="mailbox_already_paired">Already paired with this mailbox</string> <string name="mailbox_info">Show mailbox</string> + <string name="should_scan_contact">To add a contact press the \"+\" symbol on the home screen</string> + <string name="should_scan_mailbox">To add a mailbox press the \"+\" symbol in the mailbox menu option in the briar app</string> </resources> diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java b/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java index add34227bdd5d9084d2bb6c19896359e7fb64c8e..600af9da34396baf50a20b90047df5b2e47ed9ce 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java @@ -6,6 +6,7 @@ import android.widget.Toast; import org.briarproject.bramble.api.contact.ContactExchangeListener; import org.briarproject.bramble.api.contact.ContactExchangeTask; +import org.briarproject.bramble.api.contact.ContactType; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; @@ -92,6 +93,13 @@ public class MailboxExchangeActivity extends KeyAgreementActivity implements }); } + @Override + public void invalidContactTypeScanned() { + runOnUiThreadUnlessDestroyed(() -> + showErrorFragment( + R.string.should_scan_mailbox)); + } + @Override public void contactExchangeFailed() { runOnUiThreadUnlessDestroyed(() -> { diff --git a/mailbox-android/src/main/res/values/strings.xml b/mailbox-android/src/main/res/values/strings.xml index 7fa90ec952ac3d09da5574068a519a6bc46e47c5..9d2e173259a2a8dfd6f197fb08bfacb212e5c686 100644 --- a/mailbox-android/src/main/res/values/strings.xml +++ b/mailbox-android/src/main/res/values/strings.xml @@ -485,4 +485,5 @@ <string name="mailbox_already_paired">Your Mailbox is already paired with this Briar account</string> <string name="mailbox_unpaired">not paired</string> <string name="mailbox_setup_explanation">Brief explanation of what the mailbox is and does</string> + <string name="should_scan_mailbox">To add a mailbox press the \"+\" symbol in the mailbox menu option in the briar app</string> </resources>