Skip to content

Commit 55009e0

Browse files
ganfraBillCarsonFr
authored andcommitted
Backup: refactor to extract everything related to specific algorithm
1 parent 8fabb23 commit 55009e0

26 files changed

+746
-418
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ import org.matrix.android.sdk.api.auth.UIABaseAuth
2828
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
2929
import org.matrix.android.sdk.api.auth.UserPasswordAuth
3030
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
31-
import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM
3231
import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_CURVE_25519_BACKUP
32+
import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM
3333
import org.matrix.android.sdk.api.extensions.orFalse
3434
import org.matrix.android.sdk.api.session.Session
3535
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
@@ -38,8 +38,8 @@ import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NA
3838
import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
3939
import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
4040
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersion
41-
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupAuthData
4241
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCreationInfo
42+
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCurve25519AuthData
4343
import org.matrix.android.sdk.api.session.crypto.keysbackup.extractCurveKeyFromRecoveryKey
4444
import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult
4545
import org.matrix.android.sdk.api.session.crypto.verification.IncomingSasVerificationTransaction
@@ -277,8 +277,8 @@ class CryptoTestHelper(val testHelper: CommonTestHelper) {
277277
assertEquals(senderSession.myUserId, event.senderId)
278278
}
279279

280-
fun createFakeMegolmBackupAuthData(): MegolmBackupAuthData {
281-
return MegolmBackupAuthData(
280+
fun createFakeMegolmBackupAuthData(): MegolmBackupCurve25519AuthData {
281+
return MegolmBackupCurve25519AuthData(
282282
publicKey = "abcdefg",
283283
signatures = mapOf("something" to mapOf("ed25519:something" to "hijklmnop"))
284284
)
@@ -382,7 +382,7 @@ class CryptoTestHelper(val testHelper: CommonTestHelper) {
382382

383383
// set up megolm backup
384384
val creationInfo = awaitCallback<MegolmBackupCreationInfo> {
385-
session.cryptoService().keysBackupService().prepareKeysBackupVersion(null, null, it)
385+
session.cryptoService().keysBackupService().prepareKeysBackupVersion(null, null, null, it)
386386
}
387387
val version = awaitCallback<KeysVersion> {
388388
session.cryptoService().keysBackupService().createKeysBackupVersion(creationInfo, it)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ class E2EShareKeysConfigTest : InstrumentedTest {
233233
val keysBackupService = aliceSession.cryptoService().keysBackupService()
234234
val keyBackupPassword = "FooBarBaz"
235235
val megolmBackupCreationInfo = commonTestHelper.doSync<MegolmBackupCreationInfo> {
236-
keysBackupService.prepareKeysBackupVersion(keyBackupPassword, null, it)
236+
keysBackupService.prepareKeysBackupVersion(keyBackupPassword, null, null, it)
237237
}
238238
val version = commonTestHelper.doSync<KeysVersion> {
239239
keysBackupService.createKeysBackupVersion(megolmBackupCreationInfo, it)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ class E2eeSanityTests : InstrumentedTest {
230230
val bobKeysBackupService = bobSession.cryptoService().keysBackupService()
231231
val keyBackupPassword = "FooBarBaz"
232232
val megolmBackupCreationInfo = testHelper.doSync<MegolmBackupCreationInfo> {
233-
bobKeysBackupService.prepareKeysBackupVersion(keyBackupPassword, null, it)
233+
bobKeysBackupService.prepareKeysBackupVersion(keyBackupPassword, null, null, it)
234234
}
235235
val version = testHelper.doSync<KeysVersion> {
236236
bobKeysBackupService.createKeysBackupVersion(megolmBackupCreationInfo, it)

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

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupVersionTru
4141
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersion
4242
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersionResult
4343
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCreationInfo
44+
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCurve25519AuthData
4445
import org.matrix.android.sdk.api.session.crypto.keysbackup.toKeysVersionResult
4546
import org.matrix.android.sdk.api.session.crypto.model.ImportRoomKeysResult
4647
import org.matrix.android.sdk.api.session.getRoom
@@ -49,6 +50,10 @@ import org.matrix.android.sdk.common.CommonTestHelper.Companion.runSessionTest
4950
import org.matrix.android.sdk.common.RetryTestRule
5051
import org.matrix.android.sdk.common.TestConstants
5152
import org.matrix.android.sdk.common.TestMatrixCallback
53+
import org.matrix.android.sdk.internal.crypto.keysbackup.algorithm.KeysBackupAlgorithmFactory
54+
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeyBackupData
55+
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeysBackupData
56+
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.RoomKeysBackupData
5257
import java.util.Collections
5358
import java.util.concurrent.CountDownLatch
5459

@@ -117,11 +122,12 @@ class KeysBackupTest : InstrumentedTest {
117122
assertFalse(keysBackup.isEnabled())
118123

119124
val megolmBackupCreationInfo = testHelper.doSync<MegolmBackupCreationInfo> {
120-
keysBackup.prepareKeysBackupVersion(null, null, it)
125+
keysBackup.prepareKeysBackupVersion(null, null, null, it)
121126
}
122127

123128
assertEquals(MXCRYPTO_ALGORITHM_CURVE_25519_BACKUP, megolmBackupCreationInfo.algorithm)
124-
assertNotNull(megolmBackupCreationInfo.authData.publicKey)
129+
val authData = megolmBackupCreationInfo.authData as MegolmBackupCurve25519AuthData
130+
assertNotNull(authData.publicKey)
125131
assertNotNull(megolmBackupCreationInfo.authData.signatures)
126132
assertNotNull(megolmBackupCreationInfo.recoveryKey)
127133

@@ -144,7 +150,7 @@ class KeysBackupTest : InstrumentedTest {
144150
assertFalse(keysBackup.isEnabled())
145151

146152
val megolmBackupCreationInfo = testHelper.doSync<MegolmBackupCreationInfo> {
147-
keysBackup.prepareKeysBackupVersion(null, null, it)
153+
keysBackup.prepareKeysBackupVersion(null, null, null, it)
148154
}
149155

150156
assertFalse(keysBackup.isEnabled())
@@ -297,23 +303,25 @@ class KeysBackupTest : InstrumentedTest {
297303
val session = keysBackup.store.inboundGroupSessionsToBackup(1)[0]
298304

299305
val keyBackupCreationInfo = keysBackupTestHelper.prepareAndCreateKeysBackupData(keysBackup).megolmBackupCreationInfo
300-
306+
val keysBackupVersion = keysBackup.keysBackupVersion
307+
assertNotNull(keysBackupVersion)
308+
val algorithm = KeysBackupAlgorithmFactory().create(keysBackupVersion!!)
301309
// - Check encryptGroupSession() returns stg
302310
val keyBackupData = testHelper.runBlockingTest { keysBackup.encryptGroupSession(session) }
303311
assertNotNull(keyBackupData)
304312
assertNotNull(keyBackupData!!.sessionData)
305-
306-
// - Check pkDecryptionFromRecoveryKey() is able to create a OlmPkDecryption
307-
val decryption = keysBackup.pkDecryptionFromRecoveryKey(keyBackupCreationInfo.recoveryKey)
308-
assertNotNull(decryption)
309-
// - Check decryptKeyBackupData() returns stg
310-
val sessionData = keysBackup
311-
.decryptKeyBackupData(
312-
keyBackupData,
313-
session.safeSessionId!!,
314-
cryptoTestData.roomId,
315-
decryption!!
316-
)
313+
val roomKeysBackupData = RoomKeysBackupData(
314+
HashMap<String, KeyBackupData>().apply {
315+
put(session.safeSessionId!!, keyBackupData)
316+
}
317+
)
318+
val keysBackupData = KeysBackupData(
319+
HashMap<String, RoomKeysBackupData>().apply {
320+
put(cryptoTestData.roomId, roomKeysBackupData)
321+
}
322+
)
323+
val sessionsData = algorithm.decryptSessions(keyBackupCreationInfo.recoveryKey, keysBackupData)
324+
val sessionData = sessionsData.firstOrNull()
317325
assertNotNull(sessionData)
318326
// - Compare the decrypted megolm key with the original one
319327
keysBackupTestHelper.assertKeysEquals(session.exportKeys(), sessionData)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ internal class KeysBackupTestHelper(
104104
val stateObserver = StateObserver(keysBackup)
105105

106106
val megolmBackupCreationInfo = testHelper.doSync<MegolmBackupCreationInfo> {
107-
keysBackup.prepareKeysBackupVersion(password, null, it)
107+
keysBackup.prepareKeysBackupVersion(password, null, null, it)
108108
}
109109

110110
Assert.assertNotNull(megolmBackupCreationInfo)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ interface KeysBackupService {
124124
*/
125125
fun prepareKeysBackupVersion(
126126
password: String?,
127+
algorithm: String? = null,
127128
progressListener: ProgressListener?,
128129
callback: MatrixCallback<MegolmBackupCreationInfo>
129130
)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysVersionResult.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@ import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeysAlgorith
2424
@JsonClass(generateAdapter = true)
2525
data class KeysVersionResult(
2626
/**
27-
* The algorithm used for storing backups. Currently, only "m.megolm_backup.v1.curve25519-aes-sha2" is defined
27+
* The algorithm used for storing backups.
28+
* Currently, "m.megolm_backup.v1.curve25519-aes-sha2" and
29+
* org.matrix.msc3270.v1.aes-hmac-sha2 are defined.
2830
*/
2931
@Json(name = "algorithm")
3032
override val algorithm: String,
3133

3234
/**
3335
* algorithm-dependent data, for "m.megolm_backup.v1.curve25519-aes-sha2".
34-
* @see [org.matrix.android.sdk.internal.crypto.keysbackup.MegolmBackupAuthData]
36+
* @see [org.matrix.android.sdk.internal.crypto.keysbackup.MegolmBackupCurve25519AuthData]
3537
*/
3638
@Json(name = "auth_data")
3739
override val authData: JsonDict,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright 2020 The Matrix.org Foundation C.I.C.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.matrix.android.sdk.api.session.crypto.keysbackup
18+
19+
import com.squareup.moshi.Json
20+
import com.squareup.moshi.JsonClass
21+
import org.matrix.android.sdk.api.util.JsonDict
22+
import org.matrix.android.sdk.internal.di.MoshiProvider
23+
24+
/**
25+
* Data model for [org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeysAlgorithmAndData.authData] in case
26+
* of [org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_AES_256_BACKUP].
27+
*/
28+
@JsonClass(generateAdapter = true)
29+
data class MegolmBackupAes256AuthData(
30+
31+
/**
32+
* The identity vector used to encrypt the backups.
33+
*/
34+
@Json(name = "iv")
35+
val iv: String? = null,
36+
37+
/**
38+
* The mac used to encrypt the backups.
39+
*/
40+
@Json(name = "mac")
41+
val mac: String? = null,
42+
43+
/**
44+
* In case of a backup created from a password, the salt associated with the backup
45+
* private key.
46+
*/
47+
@Json(name = "private_key_salt")
48+
override val privateKeySalt: String? = null,
49+
50+
/**
51+
* In case of a backup created from a password, the number of key derivations.
52+
*/
53+
@Json(name = "private_key_iterations")
54+
override val privateKeyIterations: Int? = null,
55+
56+
/**
57+
* Signatures of the public key.
58+
* userId -> (deviceSignKeyId -> signature)
59+
*/
60+
@Json(name = "signatures")
61+
override val signatures: Map<String, Map<String, String>>? = null
62+
63+
) : MegolmBackupAuthData {
64+
65+
override fun isValid(): Boolean = !(iv.isNullOrEmpty() || mac.isNullOrEmpty())
66+
67+
override fun copy(newSignatures: Map<String, Map<String, String>>?): MegolmBackupAuthData {
68+
return copy(signatures = newSignatures)
69+
}
70+
71+
override fun toJsonDict(): JsonDict {
72+
val moshi = MoshiProvider.providesMoshi()
73+
val adapter = moshi.adapter(Map::class.java)
74+
75+
return moshi
76+
.adapter(MegolmBackupAes256AuthData::class.java)
77+
.toJson(this)
78+
.let {
79+
@Suppress("UNCHECKED_CAST")
80+
adapter.fromJson(it) as JsonDict
81+
}
82+
}
83+
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/MegolmBackupAuthData.kt

Lines changed: 7 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,64 +16,15 @@
1616

1717
package org.matrix.android.sdk.api.session.crypto.keysbackup
1818

19-
import com.squareup.moshi.Json
20-
import com.squareup.moshi.JsonClass
2119
import org.matrix.android.sdk.api.util.JsonDict
22-
import org.matrix.android.sdk.internal.crypto.keysbackup.model.SignalableMegolmBackupAuthData
23-
import org.matrix.android.sdk.internal.di.MoshiProvider
2420

25-
/**
26-
* Data model for [org.matrix.androidsdk.rest.model.keys.KeysAlgorithmAndData.authData] in case
27-
* of [org.matrix.androidsdk.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP].
28-
*/
29-
@JsonClass(generateAdapter = true)
30-
data class MegolmBackupAuthData(
31-
/**
32-
* The curve25519 public key used to encrypt the backups.
33-
*/
34-
@Json(name = "public_key")
35-
val publicKey: String,
36-
37-
/**
38-
* In case of a backup created from a password, the salt associated with the backup
39-
* private key.
40-
*/
41-
@Json(name = "private_key_salt")
42-
val privateKeySalt: String? = null,
43-
44-
/**
45-
* In case of a backup created from a password, the number of key derivations.
46-
*/
47-
@Json(name = "private_key_iterations")
48-
val privateKeyIterations: Int? = null,
49-
50-
/**
51-
* Signatures of the public key.
52-
* userId -> (deviceSignKeyId -> signature)
53-
*/
54-
@Json(name = "signatures")
55-
val signatures: Map<String, Map<String, String>>? = null
56-
) {
57-
58-
internal fun toJsonDict(): JsonDict {
59-
val moshi = MoshiProvider.providesMoshi()
60-
val adapter = moshi.adapter(Map::class.java)
21+
sealed interface MegolmBackupAuthData {
22+
val privateKeySalt: String?
23+
val privateKeyIterations: Int?
24+
val signatures: Map<String, Map<String, String>>?
6125

62-
return moshi
63-
.adapter(MegolmBackupAuthData::class.java)
64-
.toJson(this)
65-
.let {
66-
@Suppress("UNCHECKED_CAST")
67-
adapter.fromJson(it) as JsonDict
68-
}
69-
}
26+
fun isValid(): Boolean
7027

71-
internal fun signalableJSONDictionary(): JsonDict {
72-
return SignalableMegolmBackupAuthData(
73-
publicKey = publicKey,
74-
privateKeySalt = privateKeySalt,
75-
privateKeyIterations = privateKeyIterations
76-
)
77-
.signalableJSONDictionary()
78-
}
28+
fun toJsonDict(): JsonDict
29+
fun copy(newSignatures: Map<String, Map<String, String>>?): MegolmBackupAuthData
7930
}

0 commit comments

Comments
 (0)