Add entry to keyBackupService to expose deriveKey, which becomes internal

And format code
This commit is contained in:
Benoit Marty 2022-04-11 16:18:06 +02:00 committed by Benoit Marty
parent 1402416338
commit 3735ac307f
4 changed files with 44 additions and 26 deletions
matrix-sdk-android/src/main/java/org/matrix/android/sdk
api/session/crypto/keysbackup
internal/crypto/keysbackup
vector/src/main/java/im/vector/app/features/crypto/recover

@ -214,4 +214,9 @@ interface KeysBackupService {
fun getKeyBackupRecoveryKeyInfo(): SavedKeyBackupKeyInfo? fun getKeyBackupRecoveryKeyInfo(): SavedKeyBackupKeyInfo?
fun isValidRecoveryKeyForCurrentVersion(recoveryKey: String, callback: MatrixCallback<Boolean>) fun isValidRecoveryKeyForCurrentVersion(recoveryKey: String, callback: MatrixCallback<Boolean>)
fun computePrivateKey(passphrase: String,
privateKeySalt: String,
privateKeyIterations: Int,
progressListener: ProgressListener): ByteArray
} }

@ -36,9 +36,15 @@ import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupLastVersio
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupService import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupService
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupState import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupState
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupStateListener import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupStateListener
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupVersionTrust
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersion
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersionResult
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCreationInfo
import org.matrix.android.sdk.api.session.crypto.keysbackup.SavedKeyBackupKeyInfo import org.matrix.android.sdk.api.session.crypto.keysbackup.SavedKeyBackupKeyInfo
import org.matrix.android.sdk.api.session.crypto.keysbackup.computeRecoveryKey import org.matrix.android.sdk.api.session.crypto.keysbackup.computeRecoveryKey
import org.matrix.android.sdk.api.session.crypto.keysbackup.extractCurveKeyFromRecoveryKey import org.matrix.android.sdk.api.session.crypto.keysbackup.extractCurveKeyFromRecoveryKey
import org.matrix.android.sdk.api.session.crypto.keysbackup.toKeysVersionResult
import org.matrix.android.sdk.api.session.crypto.model.ImportRoomKeysResult
import org.matrix.android.sdk.api.util.awaitCallback import org.matrix.android.sdk.api.util.awaitCallback
import org.matrix.android.sdk.api.util.fromBase64 import org.matrix.android.sdk.api.util.fromBase64
import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP
@ -46,18 +52,13 @@ import org.matrix.android.sdk.internal.crypto.MXOlmDevice
import org.matrix.android.sdk.internal.crypto.MegolmSessionData import org.matrix.android.sdk.internal.crypto.MegolmSessionData
import org.matrix.android.sdk.internal.crypto.ObjectSigner import org.matrix.android.sdk.internal.crypto.ObjectSigner
import org.matrix.android.sdk.internal.crypto.actions.MegolmSessionDataImporter import org.matrix.android.sdk.internal.crypto.actions.MegolmSessionDataImporter
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupVersionTrust
import org.matrix.android.sdk.internal.crypto.keysbackup.model.KeysBackupVersionTrustSignature import org.matrix.android.sdk.internal.crypto.keysbackup.model.KeysBackupVersionTrustSignature
import org.matrix.android.sdk.internal.crypto.keysbackup.model.MegolmBackupAuthData import org.matrix.android.sdk.internal.crypto.keysbackup.model.MegolmBackupAuthData
import org.matrix.android.sdk.api.session.crypto.keysbackup.MegolmBackupCreationInfo
import org.matrix.android.sdk.internal.crypto.keysbackup.model.SignalableMegolmBackupAuthData import org.matrix.android.sdk.internal.crypto.keysbackup.model.SignalableMegolmBackupAuthData
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.BackupKeysResult import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.BackupKeysResult
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.CreateKeysBackupVersionBody import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.CreateKeysBackupVersionBody
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeyBackupData import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeyBackupData
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeysBackupData import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeysBackupData
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersion
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersionResult
import org.matrix.android.sdk.api.session.crypto.keysbackup.toKeysVersionResult
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.RoomKeysBackupData import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.RoomKeysBackupData
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.UpdateKeysBackupVersionBody import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.UpdateKeysBackupVersionBody
import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.CreateKeysBackupVersionTask import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.CreateKeysBackupVersionTask
@ -74,7 +75,6 @@ import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.StoreRoomSessionD
import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.StoreRoomSessionsDataTask import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.StoreRoomSessionsDataTask
import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.StoreSessionsDataTask import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.StoreSessionsDataTask
import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.UpdateKeysBackupVersionTask import org.matrix.android.sdk.internal.crypto.keysbackup.tasks.UpdateKeysBackupVersionTask
import org.matrix.android.sdk.api.session.crypto.model.ImportRoomKeysResult
import org.matrix.android.sdk.internal.crypto.model.OlmInboundGroupSessionWrapper2 import org.matrix.android.sdk.internal.crypto.model.OlmInboundGroupSessionWrapper2
import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
import org.matrix.android.sdk.internal.crypto.store.db.model.KeysBackupDataEntity import org.matrix.android.sdk.internal.crypto.store.db.model.KeysBackupDataEntity
@ -1099,6 +1099,13 @@ internal class DefaultKeysBackupService @Inject constructor(
} }
} }
override fun computePrivateKey(passphrase: String,
privateKeySalt: String,
privateKeyIterations: Int,
progressListener: ProgressListener): ByteArray {
return deriveKey(passphrase, privateKeySalt, privateKeyIterations, progressListener)
}
/** /**
* Enable backing up of keys. * Enable backing up of keys.
* This method will update the state and will start sending keys in nominal case * This method will update the state and will start sending keys in nominal case

@ -30,13 +30,14 @@ import kotlin.experimental.xor
private const val SALT_LENGTH = 32 private const val SALT_LENGTH = 32
private const val DEFAULT_ITERATION = 500_000 private const val DEFAULT_ITERATION = 500_000
data class GeneratePrivateKeyResult( internal data class GeneratePrivateKeyResult(
// The private key // The private key
val privateKey: ByteArray, val privateKey: ByteArray,
// the salt used to generate the private key // the salt used to generate the private key
val salt: String, val salt: String,
// number of key derivations done on the generated private key. // number of key derivations done on the generated private key.
val iterations: Int) val iterations: Int
)
/** /**
* Compute a private key from a password. * Compute a private key from a password.
@ -46,7 +47,9 @@ data class GeneratePrivateKeyResult(
* @return a {privateKey, salt, iterations} tuple. * @return a {privateKey, salt, iterations} tuple.
*/ */
@WorkerThread @WorkerThread
fun generatePrivateKeyWithPassword(password: String, progressListener: ProgressListener?): GeneratePrivateKeyResult { internal fun generatePrivateKeyWithPassword(password: String,
progressListener: ProgressListener?
): GeneratePrivateKeyResult {
val salt = generateSalt() val salt = generateSalt()
val iterations = DEFAULT_ITERATION val iterations = DEFAULT_ITERATION
val privateKey = deriveKey(password, salt, iterations, progressListener) val privateKey = deriveKey(password, salt, iterations, progressListener)
@ -65,10 +68,10 @@ fun generatePrivateKeyWithPassword(password: String, progressListener: ProgressL
* @return a private key. * @return a private key.
*/ */
@WorkerThread @WorkerThread
fun retrievePrivateKeyWithPassword(password: String, internal fun retrievePrivateKeyWithPassword(password: String,
salt: String, salt: String,
iterations: Int, iterations: Int,
progressListener: ProgressListener? = null): ByteArray { progressListener: ProgressListener? = null): ByteArray {
return deriveKey(password, salt, iterations, progressListener) return deriveKey(password, salt, iterations, progressListener)
} }
@ -83,10 +86,10 @@ fun retrievePrivateKeyWithPassword(password: String,
* @return a private key. * @return a private key.
*/ */
@WorkerThread @WorkerThread
fun deriveKey(password: String, internal fun deriveKey(password: String,
salt: String, salt: String,
iterations: Int, iterations: Int,
progressListener: ProgressListener?): ByteArray { progressListener: ProgressListener?): ByteArray {
// Note: copied and adapted from MXMegolmExportEncryption // Note: copied and adapted from MXMegolmExportEncryption
val t0 = System.currentTimeMillis() val t0 = System.currentTimeMillis()

@ -32,7 +32,6 @@ import org.matrix.android.sdk.api.session.securestorage.SharedSecretStorageServi
import org.matrix.android.sdk.api.session.securestorage.SsssKeyCreationInfo import org.matrix.android.sdk.api.session.securestorage.SsssKeyCreationInfo
import org.matrix.android.sdk.api.util.awaitCallback import org.matrix.android.sdk.api.util.awaitCallback
import org.matrix.android.sdk.api.util.toBase64NoPadding import org.matrix.android.sdk.api.util.toBase64NoPadding
import org.matrix.android.sdk.internal.crypto.keysbackup.deriveKey
import timber.log.Timber import timber.log.Timber
import java.util.UUID import java.util.UUID
import javax.inject.Inject import javax.inject.Inject
@ -72,14 +71,18 @@ class BackupToQuadSMigrationTask @Inject constructor(
extractCurveKeyFromRecoveryKey(params.recoveryKey) extractCurveKeyFromRecoveryKey(params.recoveryKey)
} else if (!params.passphrase.isNullOrEmpty() && version.getAuthDataAsMegolmBackupAuthData()?.privateKeySalt != null) { } else if (!params.passphrase.isNullOrEmpty() && version.getAuthDataAsMegolmBackupAuthData()?.privateKeySalt != null) {
version.getAuthDataAsMegolmBackupAuthData()?.let { authData -> version.getAuthDataAsMegolmBackupAuthData()?.let { authData ->
deriveKey(params.passphrase, authData.privateKeySalt!!, authData.privateKeyIterations!!, object : ProgressListener { keysBackupService.computePrivateKey(
override fun onProgress(progress: Int, total: Int) { params.passphrase,
params.progressListener?.onProgress(WaitingViewData( authData.privateKeySalt!!,
stringProvider.getString(R.string.bootstrap_progress_checking_backup_with_info, authData.privateKeyIterations!!,
"$progress/$total") object : ProgressListener {
)) override fun onProgress(progress: Int, total: Int) {
} params.progressListener?.onProgress(WaitingViewData(
}) stringProvider.getString(R.string.bootstrap_progress_checking_backup_with_info,
"$progress/$total")
))
}
})
} }
} else null) } else null)
?: return Result.IllegalParams ?: return Result.IllegalParams