Skip to content

Commit 5c44229

Browse files
committed
1 parent 8d112a4 commit 5c44229

File tree

43 files changed

+997
-227
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+997
-227
lines changed

library/ui-strings/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2615,6 +2615,7 @@
26152615

26162616
<string name="unencrypted">Unencrypted</string>
26172617
<string name="encrypted_unverified">Encrypted by an unverified device</string>
2618+
<string name="key_authenticity_not_guaranteed">The authenticity of this encrypted message can\'t be guaranteed on this device.</string>
26182619
<string name="review_logins">Review where you’re logged in</string>
26192620
<string name="verify_other_sessions">Verify all your sessions to ensure your account &amp; messages are safe</string>
26202621
<!-- Argument will be replaced by the other session name (e.g, Desktop, mobile) -->

library/ui-styles/src/main/res/values/colors.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
<color name="shield_color_trust">#0DBD8B</color>
144144
<color name="shield_color_trust_background">#0F0DBD8B</color>
145145
<color name="shield_color_black">#17191C</color>
146+
<color name="shield_color_gray">#91A1C0</color>
146147
<color name="shield_color_warning">#FF4B55</color>
147148
<color name="shield_color_warning_background">#0FFF4B55</color>
148149

matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import org.matrix.android.sdk.api.MatrixCallback
3838
import org.matrix.android.sdk.api.MatrixConfiguration
3939
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
4040
import org.matrix.android.sdk.api.auth.registration.RegistrationResult
41+
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
4142
import org.matrix.android.sdk.api.session.Session
4243
import org.matrix.android.sdk.api.session.events.model.EventType
4344
import org.matrix.android.sdk.api.session.events.model.toModel
@@ -61,7 +62,7 @@ import java.util.concurrent.TimeUnit
6162
* This class exposes methods to be used in common cases
6263
* Registration, login, Sync, Sending messages...
6364
*/
64-
class CommonTestHelper internal constructor(context: Context) {
65+
class CommonTestHelper internal constructor(context: Context, val cryptoConfig: MXCryptoConfig? = null) {
6566

6667
companion object {
6768
internal fun runSessionTest(context: Context, autoSignoutOnClose: Boolean = true, block: (CommonTestHelper) -> Unit) {
@@ -75,8 +76,10 @@ class CommonTestHelper internal constructor(context: Context) {
7576
}
7677
}
7778

78-
internal fun runCryptoTest(context: Context, autoSignoutOnClose: Boolean = true, block: (CryptoTestHelper, CommonTestHelper) -> Unit) {
79-
val testHelper = CommonTestHelper(context)
79+
internal fun runCryptoTest(context: Context, autoSignoutOnClose: Boolean = true,
80+
cryptoConfig: MXCryptoConfig? = null,
81+
block: (CryptoTestHelper, CommonTestHelper) -> Unit) {
82+
val testHelper = CommonTestHelper(context, cryptoConfig)
8083
val cryptoTestHelper = CryptoTestHelper(testHelper)
8184
return try {
8285
block(cryptoTestHelper, testHelper)
@@ -103,7 +106,8 @@ class CommonTestHelper internal constructor(context: Context) {
103106
context,
104107
MatrixConfiguration(
105108
applicationFlavor = "TestFlavor",
106-
roomDisplayNameFallbackProvider = TestRoomDisplayNameFallbackProvider()
109+
roomDisplayNameFallbackProvider = TestRoomDisplayNameFallbackProvider(),
110+
cryptoConfig = cryptoConfig ?: MXCryptoConfig()
107111
)
108112
)
109113
}

matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,8 @@ class CryptoTestHelper(val testHelper: CommonTestHelper) {
529529
payload = result.clearEvent,
530530
senderKey = result.senderCurve25519Key,
531531
keysClaimed = result.claimedEd25519Key?.let { mapOf("ed25519" to it) },
532-
forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain
532+
forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain,
533+
isSafe = result.isSafe
533534
)
534535
}
535536
} catch (error: MXCryptoError) {

matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/E2eeSanityTests.kt

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ import org.junit.runner.RunWith
2929
import org.junit.runners.JUnit4
3030
import org.junit.runners.MethodSorters
3131
import org.matrix.android.sdk.InstrumentedTest
32+
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
3233
import org.matrix.android.sdk.api.session.Session
3334
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
34-
import org.matrix.android.sdk.api.session.crypto.RequestResult
3535
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersion
3636
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersionResult
3737
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCreationInfo
@@ -45,7 +45,6 @@ import org.matrix.android.sdk.api.session.crypto.verification.VerificationServic
4545
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction
4646
import org.matrix.android.sdk.api.session.events.model.EventType
4747
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
48-
import org.matrix.android.sdk.api.session.events.model.content.WithHeldCode
4948
import org.matrix.android.sdk.api.session.events.model.toModel
5049
import org.matrix.android.sdk.api.session.getRoom
5150
import org.matrix.android.sdk.api.session.room.Room
@@ -134,7 +133,8 @@ class E2eeSanityTests : InstrumentedTest {
134133
val timeLineEvent = otherSession.getRoom(e2eRoomID)?.getTimelineEvent(sentEventId!!)
135134
timeLineEvent != null &&
136135
timeLineEvent.isEncrypted() &&
137-
timeLineEvent.root.getClearType() == EventType.MESSAGE
136+
timeLineEvent.root.getClearType() == EventType.MESSAGE &&
137+
timeLineEvent.root.mxDecryptionResult?.isSafe == true
138138
}
139139
}
140140
}
@@ -331,6 +331,15 @@ class E2eeSanityTests : InstrumentedTest {
331331

332332
// ensure bob can now decrypt
333333
cryptoTestHelper.ensureCanDecrypt(sentEventIds, newBobSession, e2eRoomID, messagesText)
334+
335+
// Check key trust
336+
sentEventIds.forEach { sentEventId ->
337+
val timelineEvent = newBobSession.getRoom(e2eRoomID)?.getTimelineEvent(sentEventId)!!
338+
val result = testHelper.runBlockingTest {
339+
newBobSession.cryptoService().decryptEvent(timelineEvent.root, "")
340+
}
341+
assertEquals("Keys from history should be deniable", false, result.isSafe)
342+
}
334343
}
335344

336345
/**
@@ -379,44 +388,37 @@ class E2eeSanityTests : InstrumentedTest {
379388
Log.v("#E2E TEST", "check that new bob can't currently decrypt")
380389

381390
cryptoTestHelper.ensureCannotDecrypt(sentEventIds, newBobSession, e2eRoomID, null)
382-
// newBobSession.cryptoService().getOutgoingRoomKeyRequests()
383-
// .firstOrNull {
384-
// it.sessionId ==
385-
// }
386391

387392
// Try to request
388393
sentEventIds.forEach { sentEventId ->
389394
val event = newBobSession.getRoom(e2eRoomID)!!.getTimelineEvent(sentEventId)!!.root
390395
newBobSession.cryptoService().requestRoomKeyForEvent(event)
391396
}
392397

393-
// wait a bit
394-
// we need to wait a couple of syncs to let sharing occurs
395-
// testHelper.waitFewSyncs(newBobSession, 6)
396-
397398
// Ensure that new bob still can't decrypt (keys must have been withheld)
398-
sentEventIds.forEach { sentEventId ->
399-
val megolmSessionId = newBobSession.getRoom(e2eRoomID)!!
400-
.getTimelineEvent(sentEventId)!!
401-
.root.content.toModel<EncryptedEventContent>()!!.sessionId
402-
testHelper.waitWithLatch { latch ->
403-
testHelper.retryPeriodicallyWithLatch(latch) {
404-
val aliceReply = newBobSession.cryptoService().getOutgoingRoomKeyRequests()
405-
.first {
406-
it.sessionId == megolmSessionId &&
407-
it.roomId == e2eRoomID
408-
}
409-
.results.also {
410-
Log.w("##TEST", "result list is $it")
411-
}
412-
.firstOrNull { it.userId == aliceSession.myUserId }
413-
?.result
414-
aliceReply != null &&
415-
aliceReply is RequestResult.Failure &&
416-
WithHeldCode.UNAUTHORISED == aliceReply.code
417-
}
418-
}
419-
}
399+
// as per new config we won't request to alice, so ignore following test
400+
// sentEventIds.forEach { sentEventId ->
401+
// val megolmSessionId = newBobSession.getRoom(e2eRoomID)!!
402+
// .getTimelineEvent(sentEventId)!!
403+
// .root.content.toModel<EncryptedEventContent>()!!.sessionId
404+
// testHelper.waitWithLatch { latch ->
405+
// testHelper.retryPeriodicallyWithLatch(latch) {
406+
// val aliceReply = newBobSession.cryptoService().getOutgoingRoomKeyRequests()
407+
// .first {
408+
// it.sessionId == megolmSessionId &&
409+
// it.roomId == e2eRoomID
410+
// }
411+
// .results.also {
412+
// Log.w("##TEST", "result list is $it")
413+
// }
414+
// .firstOrNull { it.userId == aliceSession.myUserId }
415+
// ?.result
416+
// aliceReply != null &&
417+
// aliceReply is RequestResult.Failure &&
418+
// WithHeldCode.UNAUTHORISED == aliceReply.code
419+
// }
420+
// }
421+
// }
420422

421423
cryptoTestHelper.ensureCannotDecrypt(sentEventIds, newBobSession, e2eRoomID, null)
422424

@@ -438,7 +440,10 @@ class E2eeSanityTests : InstrumentedTest {
438440
* Test that if a better key is forwarded (lower index, it is then used)
439441
*/
440442
@Test
441-
fun testForwardBetterKey() = runCryptoTest(context()) { cryptoTestHelper, testHelper ->
443+
fun testForwardBetterKey() = runCryptoTest(
444+
context(),
445+
cryptoConfig = MXCryptoConfig(limitRoomKeyRequestsToMyDevices = false)
446+
) { cryptoTestHelper, testHelper ->
442447

443448
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true)
444449
val aliceSession = cryptoTestData.firstSession

matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/E2eeShareKeysHistoryTest.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class E2eeShareKeysHistoryTest : InstrumentedTest {
7777
*/
7878
private fun testShareHistoryWithRoomVisibility(roomHistoryVisibility: RoomHistoryVisibility? = null) =
7979
runCryptoTest(context()) { cryptoTestHelper, testHelper ->
80+
val aliceMessageText = "Hello Bob, I am Alice!"
8081
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true, roomHistoryVisibility)
8182

8283
val e2eRoomID = cryptoTestData.roomId
@@ -96,7 +97,7 @@ class E2eeShareKeysHistoryTest : InstrumentedTest {
9697
assertEquals(bobRoomPOV.roomSummary()?.joinedMembersCount, 2)
9798
Log.v("#E2E TEST", "Alice and Bob are in roomId: $e2eRoomID")
9899

99-
val aliceMessageId: String? = sendMessageInRoom(aliceRoomPOV, "Hello Bob, I am Alice!", testHelper)
100+
val aliceMessageId: String? = sendMessageInRoom(aliceRoomPOV, aliceMessageText, testHelper)
100101
Assert.assertTrue("Message should be sent", aliceMessageId != null)
101102
Log.v("#E2E TEST", "Alice sent message to roomId: $e2eRoomID")
102103

@@ -106,7 +107,8 @@ class E2eeShareKeysHistoryTest : InstrumentedTest {
106107
val timelineEvent = bobSession.roomService().getRoom(e2eRoomID)?.timelineService()?.getTimelineEvent(aliceMessageId!!)
107108
(timelineEvent != null &&
108109
timelineEvent.isEncrypted() &&
109-
timelineEvent.root.getClearType() == EventType.MESSAGE).also {
110+
timelineEvent.root.getClearType() == EventType.MESSAGE &&
111+
timelineEvent.root.mxDecryptionResult?.isSafe == true).also {
110112
if (it) {
111113
Log.v("#E2E TEST", "Bob can decrypt the message: ${timelineEvent?.root?.getDecryptedTextSummary()}")
112114
}
@@ -142,7 +144,8 @@ class E2eeShareKeysHistoryTest : InstrumentedTest {
142144
val timelineEvent = arisSession.roomService().getRoom(e2eRoomID)?.timelineService()?.getTimelineEvent(aliceMessageId!!)
143145
(timelineEvent != null &&
144146
timelineEvent.isEncrypted() &&
145-
timelineEvent.root.getClearType() == EventType.MESSAGE
147+
timelineEvent.root.getClearType() == EventType.MESSAGE &&
148+
timelineEvent.root.mxDecryptionResult?.isSafe == false
146149
).also {
147150
if (it) {
148151
Log.v("#E2E TEST", "Aris can decrypt the message: ${timelineEvent?.root?.getDecryptedTextSummary()}")
@@ -377,7 +380,10 @@ class E2eeShareKeysHistoryTest : InstrumentedTest {
377380
}
378381

379382
private fun sendMessageInRoom(aliceRoomPOV: Room, text: String, testHelper: CommonTestHelper): String? {
380-
return testHelper.sendTextMessage(aliceRoomPOV, text, 1).firstOrNull()?.eventId
383+
return testHelper.sendTextMessage(aliceRoomPOV, text, 1).firstOrNull()?.let {
384+
Log.v("#E2E TEST", "Message sent with session ${it.root.content?.get("session_id")}")
385+
return it.eventId
386+
}
381387
}
382388

383389
private fun ensureMembersHaveJoined(aliceSession: Session, otherAccounts: List<Session>, e2eRoomID: String, testHelper: CommonTestHelper) {

matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/UnwedgingTest.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.matrix.android.sdk.api.auth.UIABaseAuth
2929
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
3030
import org.matrix.android.sdk.api.auth.UserPasswordAuth
3131
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
32+
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
3233
import org.matrix.android.sdk.api.extensions.tryOrNull
3334
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
3435
import org.matrix.android.sdk.api.session.events.model.EventType
@@ -82,7 +83,10 @@ class UnwedgingTest : InstrumentedTest {
8283
* -> This is automatically fixed after SDKs restarted the olm session
8384
*/
8485
@Test
85-
fun testUnwedging() = runCryptoTest(context()) { cryptoTestHelper, testHelper ->
86+
fun testUnwedging() = runCryptoTest(
87+
context(),
88+
cryptoConfig = MXCryptoConfig(limitRoomKeyRequestsToMyDevices = false)
89+
) { cryptoTestHelper, testHelper ->
8690
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
8791

8892
val aliceSession = cryptoTestData.firstSession

0 commit comments

Comments
 (0)