From cb28e7c1f9163e89cfa59fc32da426ee5021037f Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sun, 13 Nov 2016 10:58:51 -0800 Subject: [PATCH] Update libsignal-service to 2.4.0 // FREEBIE --- build.gradle | 15 +++++++-------- res/values/strings.xml | 4 +++- .../securesms/VerifyIdentityActivity.java | 15 +++++++++------ .../crypto/storage/SignalProtocolStoreImpl.java | 12 ++++++------ .../storage/TextSecureIdentityKeyStore.java | 11 ++++++----- 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 0e4ed3c78..d7117579c 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { compile 'org.whispersystems:jobmanager:1.0.2' compile 'org.whispersystems:libpastelog:1.0.7' compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' - compile 'org.whispersystems:signal-service-android:2.3.1' + compile 'org.whispersystems:signal-service-android:2.4.0' compile 'com.h6ah4i.android.compat:mulsellistprefcompat:1.0.0' compile 'com.google.zxing:core:3.2.1' @@ -131,7 +131,7 @@ dependencyVerification { 'org.whispersystems:jobmanager:506f679fc2fcf7bb6d10f00f41d6f6ea0abf75c70dc95b913398661ad538a181', 'org.whispersystems:libpastelog:bb331d9a98240fc139101128ba836c1edec3c40e000597cdbb29ebf4cbf34d88', 'com.amulyakhare:com.amulyakhare.textdrawable:54c92b5fba38cfd316a07e5a30528068f45ce8515a6890f1297df4c401af5dcb', - 'org.whispersystems:signal-service-android:8e6517280a2ad4417a48a47c5c4c99d7d3d142c9568d81ce3af9fb704b1ecf50', + 'org.whispersystems:signal-service-android:b765192b37290551f11dcbc9321761073be13ae64b46d4e57a806e52decc7308', 'com.h6ah4i.android.compat:mulsellistprefcompat:47167c5cb796de1a854788e9ff318358e36c8fb88123baaa6e38fb78511dfabe', 'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259', 'cn.carbswang.android:NumberPickerView:18b3c316d62c7c277978a8d4ed57a5b8f4e943762264960f579a8a549c756729', @@ -140,24 +140,23 @@ dependencyVerification { 'com.nineoldandroids:library:68025a14e3e7673d6ad2f95e4b46d78d7d068343aa99256b686fe59de1b3163a', 'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'com.madgag.spongycastle:core:8d6240b974b0aca4d3da9c7dd44d42339d8a374358aca5fc98e50a995764511f', - 'org.whispersystems:signal-service-java:1f268ea089d82c3a13e6cad3f4da10d63d3789f750894f9e50dae2bf7999aa71', - 'org.whispersystems:signal-protocol-android:d83cb3d15b667fc2543fa18ce80791c72c053e8ac54fc2941f0429a5944ca691', + 'org.whispersystems:signal-service-java:dda6c3b15872fee7a8980e0898a813aca6a603f8dc142d5354f30e2cc005ea17', + 'org.whispersystems:signal-protocol-android:1b4b9d557c8eaf861797ff683990d482d4aa8e9f23d9b17ff0cc67a02f38cb19', 'com.google.android.gms:play-services-basement:e1d29b21e02fd2a63e5a31807415cbb17a59568e27e3254181c01ffae10659bf', 'com.googlecode.libphonenumber:libphonenumber:9625de9d2270e9a280ff4e6d9ef3106573fb4828773fd32c9b7614f4e17d2811', 'com.google.protobuf:protobuf-java:e0c1c64575c005601725e7c6a02cebf9e1285e888f756b2a1d73ffa8d725cc74', 'com.squareup.okhttp:okhttp:89b7f63e2e5b6c410266abc14f50fe52ea8d2d8a57260829e499b1cd9f0e61af', 'com.fasterxml.jackson.core:jackson-databind:835097bcdd11f5bc8a08378c70d4c8054dfa4b911691cc2752063c75534d198d', - 'org.whispersystems:curve25519-android:d6a3ef3a70622af4c728b7fe5f8fdfc9e6cd39b1d39b2c77e7a2add9d876bc23', - 'org.whispersystems:signal-protocol-java:d518d52eeb3c44210e0b6c687360848a87afbaee0bdf42e2a8dd9974d54fdb3a', + 'org.whispersystems:curve25519-android:bf6c34223d45d2f2813a8efcab9923caf99115115c760c9acea680bcb42d23c0', + 'org.whispersystems:signal-protocol-java:a835cd0609cf116a74651bd0aa748db9392bba48c2d2af787757b8a1b50d131c', 'com.squareup.okio:okio:5e1098bd3fdee4c3347f5ab815b40ba851e4ab1b348c5e49a5b0362f0ce6e978', 'com.fasterxml.jackson.core:jackson-annotations:0ca408c24202a7626ec8b861e99d85eca5e38b73311dd6dd12e3e9deecc3fe94', 'com.fasterxml.jackson.core:jackson-core:cbf4604784b4de226262845447a1ad3bb38a6728cebe86562e2c5afada8be2c0', - 'org.whispersystems:curve25519-java:08cc3be52723e0fc4148e5e7002d51d6d7e495b2130022237f2d47b90af6ae0b', + 'org.whispersystems:curve25519-java:00f1d4919f759055f41f7853a3d475dc7c8decf0dbf045ae93414f8f23b066cc', 'com.android.support:support-v4:c62f0d025dafa86f423f48df9185b0d89496adbc5f6a9be5a7c394d84cf91423', ] } - android { compileSdkVersion 22 buildToolsVersion '23.0.2' diff --git a/res/values/strings.xml b/res/values/strings.xml index 66ebac6b0..f01fbfece 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -563,6 +563,7 @@ Your contact is running an old version of Signal, please ask them to update before verifying safety numbers. + Your contact is running a newer version of Signal with an incompatible QR code format. Please update to compare. You\'re attempting to verify safety numbers with %1$s, but scanned %2$s instead. The scanned QR code is not a correctly formatted safety number verification code. Please try scanning again. Share safety numbers via... @@ -937,7 +938,7 @@ Add members - If you wish to verify the security of your end-to-end encryption with %s, compare the numbers above with the numbers on their device. Alternately, you can scan the code on their phone, or ask them to scan your code. + Learn more about verifying safety numbers.]]> Tap to scan @@ -1267,6 +1268,7 @@ Transport icon + diff --git a/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java b/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java index 960d24343..22284bc80 100644 --- a/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java +++ b/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java @@ -33,6 +33,8 @@ import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.text.Html; +import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -66,7 +68,6 @@ import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.fingerprint.Fingerprint; -import org.whispersystems.libsignal.fingerprint.FingerprintIdentifierMismatchException; import org.whispersystems.libsignal.fingerprint.FingerprintParsingException; import org.whispersystems.libsignal.fingerprint.FingerprintVersionMismatchException; import org.whispersystems.libsignal.fingerprint.NumericFingerprintGenerator; @@ -313,10 +314,11 @@ public class VerifyIdentityActivity extends PassphraseRequiredActionBarActivity } } catch (FingerprintVersionMismatchException e) { Log.w(TAG, e); - Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal, Toast.LENGTH_LONG).show(); - } catch (FingerprintIdentifierMismatchException e) { - Log.w(TAG, e); - Toast.makeText(getActivity(), getActivity().getString(R.string.VerifyIdentityActivity_you_re_attempting_to_verify_safety_numbers_with, e.getRemoteIdentifier(), e.getScannedLocalIdentifier()), Toast.LENGTH_LONG).show(); + if (e.getOurVersion() < e.getTheirVersion()) { + Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal, Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal, Toast.LENGTH_LONG).show(); + } } catch (FingerprintParsingException e) { Log.w(TAG, e); Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number, Toast.LENGTH_LONG).show(); @@ -357,7 +359,8 @@ public class VerifyIdentityActivity extends PassphraseRequiredActionBarActivity Bitmap qrCodeBitmap = QrCode.create(qrCodeString); qrCode.setImageBitmap(qrCodeBitmap); - description.setText(getActivity().getString(R.string.verify_display_fragment__scan_the_code_on_your_contact_s_phone_or_ask_them_to_scan_your_code_to_verify_that_your_messages_are_end_to_end_encrypted_you_can_alternately_compare_the_number_above, recipient.toShortString())); + description.setText(Html.fromHtml(String.format(getActivity().getString(R.string.verify_display_fragment__scan_the_code_on_your_contact_s_phone_or_ask_them_to_scan_your_code_to_verify_that_your_messages_are_end_to_end_encrypted_you_can_alternately_compare_the_number_above), recipient.toShortString()))); + description.setMovementMethod(LinkMovementMethod.getInstance()); } private Bitmap createVerifiedBitmap(int width, int height, @DrawableRes int id) { diff --git a/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java b/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java index 797bf4b02..b4b65c790 100644 --- a/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java +++ b/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java @@ -2,16 +2,16 @@ package org.thoughtcrime.securesms.crypto.storage; import android.content.Context; -import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.IdentityKeyPair; import org.whispersystems.libsignal.InvalidKeyIdException; -import org.whispersystems.libsignal.state.SignalProtocolStore; +import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.state.IdentityKeyStore; import org.whispersystems.libsignal.state.PreKeyRecord; import org.whispersystems.libsignal.state.PreKeyStore; import org.whispersystems.libsignal.state.SessionRecord; import org.whispersystems.libsignal.state.SessionStore; +import org.whispersystems.libsignal.state.SignalProtocolStore; import org.whispersystems.libsignal.state.SignedPreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyStore; @@ -42,13 +42,13 @@ public class SignalProtocolStoreImpl implements SignalProtocolStore { } @Override - public void saveIdentity(String number, IdentityKey identityKey) { - identityKeyStore.saveIdentity(number, identityKey); + public void saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) { + identityKeyStore.saveIdentity(address, identityKey); } @Override - public boolean isTrustedIdentity(String number, IdentityKey identityKey) { - return identityKeyStore.isTrustedIdentity(number, identityKey); + public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey) { + return identityKeyStore.isTrustedIdentity(address, identityKey); } @Override diff --git a/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java b/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java index 63b9e5a5a..2c12347c7 100644 --- a/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java +++ b/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java @@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.IdentityKeyPair; +import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.state.IdentityKeyStore; public class TextSecureIdentityKeyStore implements IdentityKeyStore { @@ -31,21 +32,21 @@ public class TextSecureIdentityKeyStore implements IdentityKeyStore { } @Override - public void saveIdentity(String name, IdentityKey identityKey) { - long recipientId = RecipientFactory.getRecipientsFromString(context, name, true).getPrimaryRecipient().getRecipientId(); + public void saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) { + long recipientId = RecipientFactory.getRecipientsFromString(context, address.getName(), true).getPrimaryRecipient().getRecipientId(); DatabaseFactory.getIdentityDatabase(context).saveIdentity(recipientId, identityKey); } @Override - public boolean isTrustedIdentity(String name, IdentityKey identityKey) { - long recipientId = RecipientFactory.getRecipientsFromString(context, name, true).getPrimaryRecipient().getRecipientId(); + public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey) { + long recipientId = RecipientFactory.getRecipientsFromString(context, address.getName(), true).getPrimaryRecipient().getRecipientId(); boolean trusted = DatabaseFactory.getIdentityDatabase(context) .isValidIdentity(recipientId, identityKey); if (trusted) { return true; } else if (!TextSecurePreferences.isBlockingIdentityUpdates(context)) { - saveIdentity(name, identityKey); + saveIdentity(address, identityKey); ApplicationContext.getInstance(context) .getJobManager()