crypto: Throw exceptions when restoring a recovery key from a passphrase
This commit is contained in:
		
							parent
							
								
									e5af7e6109
								
							
						
					
					
						commit
						097f05af57
					
				@ -398,15 +398,10 @@ internal class RustKeyBackupService @Inject constructor(
 | 
				
			|||||||
        cryptoCoroutineScope.launch {
 | 
					        cryptoCoroutineScope.launch {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                val key = recoveryKeyFromPassword(password, keysBackupVersion)
 | 
					                val key = recoveryKeyFromPassword(password, keysBackupVersion)
 | 
				
			||||||
 | 
					                checkRecoveryKey(key, keysBackupVersion)
 | 
				
			||||||
                if (key == null) {
 | 
					                trustKeysBackupVersion(keysBackupVersion, true, callback)
 | 
				
			||||||
                    Timber.w("trustKeysBackupVersionWithPassphrase: Key backup is missing required data")
 | 
					 | 
				
			||||||
                    callback.onFailure(IllegalArgumentException("Missing element"))
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    checkRecoveryKey(key, keysBackupVersion)
 | 
					 | 
				
			||||||
                    trustKeysBackupVersion(keysBackupVersion, true, callback)
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } catch (exception: Throwable) {
 | 
					            } catch (exception: Throwable) {
 | 
				
			||||||
 | 
					                Timber.w(exception)
 | 
				
			||||||
                callback.onFailure(exception)
 | 
					                callback.onFailure(exception)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -595,15 +590,7 @@ internal class RustKeyBackupService @Inject constructor(
 | 
				
			|||||||
        cryptoCoroutineScope.launch(coroutineDispatchers.main) {
 | 
					        cryptoCoroutineScope.launch(coroutineDispatchers.main) {
 | 
				
			||||||
            runCatching {
 | 
					            runCatching {
 | 
				
			||||||
                val recoveryKey = withContext(coroutineDispatchers.crypto) {
 | 
					                val recoveryKey = withContext(coroutineDispatchers.crypto) {
 | 
				
			||||||
                    val key = recoveryKeyFromPassword(password, keysBackupVersion)
 | 
					                    recoveryKeyFromPassword(password, keysBackupVersion)
 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (key == null) {
 | 
					 | 
				
			||||||
                        Timber.w("trustKeysBackupVersionWithPassphrase: Key backup is missing required data")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        throw IllegalArgumentException("Missing element")
 | 
					 | 
				
			||||||
                    } else {
 | 
					 | 
				
			||||||
                        key
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                restoreBackup(keysBackupVersion, recoveryKey, roomId, sessionId, stepProgressListener)
 | 
					                restoreBackup(keysBackupVersion, recoveryKey, roomId, sessionId, stepProgressListener)
 | 
				
			||||||
@ -772,22 +759,20 @@ internal class RustKeyBackupService @Inject constructor(
 | 
				
			|||||||
     * @return the recovery key if successful, null in other cases
 | 
					     * @return the recovery key if successful, null in other cases
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @WorkerThread
 | 
					    @WorkerThread
 | 
				
			||||||
    private fun recoveryKeyFromPassword(password: String, keysBackupData: KeysVersionResult): BackupRecoveryKey? {
 | 
					    private fun recoveryKeyFromPassword(password: String, keysBackupData: KeysVersionResult): BackupRecoveryKey {
 | 
				
			||||||
        val authData = getMegolmBackupAuthData(keysBackupData)
 | 
					        val authData = getMegolmBackupAuthData(keysBackupData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (authData == null) {
 | 
					        return when {
 | 
				
			||||||
            Timber.w("recoveryKeyFromPassword: invalid parameter")
 | 
					            authData == null                                                                 -> {
 | 
				
			||||||
            return null
 | 
					                throw IllegalArgumentException("recoveryKeyFromPassword: invalid parameter")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            authData.privateKeySalt.isNullOrBlank() || authData.privateKeyIterations == null -> {
 | 
				
			||||||
 | 
					                throw java.lang.IllegalArgumentException("recoveryKeyFromPassword: Salt and/or iterations not found in key backup auth data")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else                                                                             -> {
 | 
				
			||||||
 | 
					                BackupRecoveryKey.fromPassphrase(password, authData.privateKeySalt, authData.privateKeyIterations)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (authData.privateKeySalt.isNullOrBlank()
 | 
					 | 
				
			||||||
                || authData.privateKeyIterations == null) {
 | 
					 | 
				
			||||||
            Timber.w("recoveryKeyFromPassword: Salt and/or iterations not found in key backup auth data")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return null
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return BackupRecoveryKey.fromPassphrase(password, authData.privateKeySalt, authData.privateKeyIterations)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user