diff --git a/app/src/androidTest/assets/backupTests/account_data_01.binproto b/app/src/androidTest/assets/backupTests/account_data_01.binproto index 3f1b5a5066..6828727bd9 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_01.binproto and b/app/src/androidTest/assets/backupTests/account_data_01.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_03.binproto b/app/src/androidTest/assets/backupTests/account_data_03.binproto index 724edefba1..836f134aee 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_03.binproto and b/app/src/androidTest/assets/backupTests/account_data_03.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_05.binproto b/app/src/androidTest/assets/backupTests/account_data_05.binproto index 8fbce2f249..7ecc58e3e7 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_05.binproto and b/app/src/androidTest/assets/backupTests/account_data_05.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_07.binproto b/app/src/androidTest/assets/backupTests/account_data_07.binproto index 543723762e..35fc67224f 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_07.binproto and b/app/src/androidTest/assets/backupTests/account_data_07.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_09.binproto b/app/src/androidTest/assets/backupTests/account_data_09.binproto index aba744ef9e..cc9faf0a0d 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_09.binproto and b/app/src/androidTest/assets/backupTests/account_data_09.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_11.binproto b/app/src/androidTest/assets/backupTests/account_data_11.binproto index 3204db3c3a..3f36d9a7b0 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_11.binproto and b/app/src/androidTest/assets/backupTests/account_data_11.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_13.binproto b/app/src/androidTest/assets/backupTests/account_data_13.binproto index be5e0b63d3..5b2f7b0a4e 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_13.binproto and b/app/src/androidTest/assets/backupTests/account_data_13.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_15.binproto b/app/src/androidTest/assets/backupTests/account_data_15.binproto index 1f94e2f822..d9e200484f 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_15.binproto and b/app/src/androidTest/assets/backupTests/account_data_15.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_17.binproto b/app/src/androidTest/assets/backupTests/account_data_17.binproto index 190a40715d..39563b8669 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_17.binproto and b/app/src/androidTest/assets/backupTests/account_data_17.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_19.binproto b/app/src/androidTest/assets/backupTests/account_data_19.binproto index 2320be5aef..5855696a9e 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_19.binproto and b/app/src/androidTest/assets/backupTests/account_data_19.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_21.binproto b/app/src/androidTest/assets/backupTests/account_data_21.binproto index 8dd00d3677..902a5130c6 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_21.binproto and b/app/src/androidTest/assets/backupTests/account_data_21.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_23.binproto b/app/src/androidTest/assets/backupTests/account_data_23.binproto index 04c82c11a8..b9f67cb6fa 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_23.binproto and b/app/src/androidTest/assets/backupTests/account_data_23.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_25.binproto b/app/src/androidTest/assets/backupTests/account_data_25.binproto index 2a331b84a3..be7adb1768 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_25.binproto and b/app/src/androidTest/assets/backupTests/account_data_25.binproto differ diff --git a/app/src/androidTest/assets/backupTests/account_data_27.binproto b/app/src/androidTest/assets/backupTests/account_data_27.binproto index 8208d46c48..8cf184cdef 100644 Binary files a/app/src/androidTest/assets/backupTests/account_data_27.binproto and b/app/src/androidTest/assets/backupTests/account_data_27.binproto differ diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt index 5bd7e95a95..aeec925e87 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt @@ -156,8 +156,7 @@ object AccountDataArchiveProcessor { navigationBarSize = signalStore.settingsValues.useCompactNavigationBar.toRemoteNavigationBarSize() ).takeUnless { Environment.IS_INSTRUMENTATION && SignalStore.backup.importedEmptyAndroidSettings }, bioText = selfRecord.about ?: "", - bioEmoji = selfRecord.aboutEmoji ?: "", - keyTransparencyData = selfRecord.keyTransparencyData?.toByteString() + bioEmoji = selfRecord.aboutEmoji ?: "" ) ) ) @@ -251,7 +250,7 @@ object AccountDataArchiveProcessor { SignalStore.account.usernameLink = null } - SignalDatabase.recipients.setKeyTransparencyData(Recipient.self().aci.get(), accountData.keyTransparencyData?.toByteArray()) + SignalDatabase.recipients.clearSelfKeyTransparencyData() SignalDatabase.runPostSuccessfulTransaction { ProfileUtil.handleSelfProfileKeyChange() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index fb6db85537..d3e72b4e24 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -43,6 +43,7 @@ import org.signal.core.util.toInt import org.signal.core.util.update import org.signal.core.util.updateAll import org.signal.core.util.withinTransaction +import org.signal.libsignal.net.KeyTransparency import org.signal.libsignal.protocol.IdentityKey import org.signal.libsignal.protocol.InvalidKeyException import org.signal.libsignal.zkgroup.groups.GroupMasterKey @@ -67,6 +68,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase.Companion.runPostSucce import org.thoughtcrime.securesms.database.SignalDatabase.Companion.sessions import org.thoughtcrime.securesms.database.SignalDatabase.Companion.threads import org.thoughtcrime.securesms.database.model.DistributionListId +import org.thoughtcrime.securesms.database.model.KeyTransparencyStore import org.thoughtcrime.securesms.database.model.RecipientRecord import org.thoughtcrime.securesms.database.model.ThreadRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BadgeList @@ -77,6 +79,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.SessionSwitchove import org.thoughtcrime.securesms.database.model.databaseprotos.ThreadMergeEvent import org.thoughtcrime.securesms.database.model.databaseprotos.Wallpaper import org.thoughtcrime.securesms.dependencies.AppDependencies +import org.thoughtcrime.securesms.dependencies.KeyTransparencyApi import org.thoughtcrime.securesms.groups.BadGroupIdException import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.GroupId.V1 @@ -2330,6 +2333,9 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da .values(NEEDS_PNI_SIGNATURE to 0) .run() + Log.i(TAG, "Resetting KT data due to change number.") + KeyTransparencyApi.reset(aci = SignalStore.account.requireAci().libSignalAci, field = KeyTransparency.AccountDataField.E164, keyTransparencyStore = KeyTransparencyStore) + SignalDatabase.pendingPniSignatureMessages.deleteAll() db.setTransactionSuccessful() @@ -2363,6 +2369,11 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da rotateStorageId(id) StorageSyncHelper.scheduleSyncForDataChange() } + + if (id == Recipient.self().id) { + Log.i(TAG, "Resetting KT data due to username change.") + KeyTransparencyApi.reset(aci = SignalStore.account.requireAci().libSignalAci, field = KeyTransparency.AccountDataField.USERNAME_HASH, keyTransparencyStore = KeyTransparencyStore) + } } } @@ -4099,6 +4110,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da } fun clearAllKeyTransparencyData() { + Log.i(TAG, "Clearing all key transparency data.") writableDatabase .update(TABLE_NAME) .values(KEY_TRANSPARENCY_DATA to null) @@ -4107,6 +4119,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da } fun clearSelfKeyTransparencyData() { + Log.i(TAG, "Clearing self key transparency data.") writableDatabase .update(TABLE_NAME) .values(KEY_TRANSPARENCY_DATA to null) diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt index b18a30cfbc..d57ec69b45 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/KeyTransparencyApi.kt @@ -1,6 +1,8 @@ package org.thoughtcrime.securesms.dependencies +import org.signal.core.util.logging.Log import org.signal.libsignal.keytrans.KeyTransparencyException +import org.signal.libsignal.net.KeyTransparency import org.signal.libsignal.net.KeyTransparency.CheckMode import org.signal.libsignal.net.RequestResult import org.signal.libsignal.protocol.IdentityKey @@ -13,6 +15,18 @@ import org.whispersystems.signalservice.api.websocket.SignalWebSocket */ class KeyTransparencyApi(private val unauthWebSocket: SignalWebSocket.UnauthenticatedWebSocket) { + companion object { + val TAG = Log.tag(KeyTransparencyApi::class.java) + + fun reset(aci: ServiceId.Aci, field: KeyTransparency.AccountDataField, keyTransparencyStore: KeyTransparencyStore) { + try { + KeyTransparency.resetField(aci, field, keyTransparencyStore) + } catch (e: IllegalArgumentException) { + Log.w(TAG, "Unexpected result when trying to reset KT", e) + } + } + } + suspend fun check(checkMode: CheckMode, aci: ServiceId.Aci, aciIdentityKey: IdentityKey, e164: String?, unidentifiedAccessKey: ByteArray?, usernameHash: ByteArray?, keyTransparencyStore: KeyTransparencyStore): RequestResult { return unauthWebSocket.runCatchingWithChatConnection { chatConnection -> chatConnection.keyTransparencyClient().check(checkMode, aci, aciIdentityKey, e164, unidentifiedAccessKey, usernameHash, keyTransparencyStore) diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java index 42304a05db..853d62bdf4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java @@ -566,6 +566,7 @@ public final class SettingsValues extends SignalStoreValues { } public void setAutomaticVerificationEnabled(boolean enabled) { + Log.i(TAG, "Setting key transparency enabled to " + enabled); putBoolean(AUTOMATIC_VERIFICATION_ENABLED, enabled); } diff --git a/lib/archive/src/main/protowire/Backup.proto b/lib/archive/src/main/protowire/Backup.proto index d7407cb505..512bdafe65 100644 --- a/lib/archive/src/main/protowire/Backup.proto +++ b/lib/archive/src/main/protowire/Backup.proto @@ -182,7 +182,7 @@ message AccountData { AndroidSpecificSettings androidSpecificSettings = 12; string bioText = 13; string bioEmoji = 14; - optional bytes keyTransparencyData = 15; + reserved /*keyTransparencyData*/ 15; // No longer want to persist self-KT data } message Recipient {