Add mostly-working SVR3 implementation behind flag.

This commit is contained in:
Greyson Parrelli
2024-06-07 15:40:53 -04:00
committed by Alex Hart
parent 143a61e312
commit 664c22d8f1
44 changed files with 1008 additions and 313 deletions

View File

@@ -13,6 +13,7 @@ import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedE
import org.whispersystems.signalservice.api.push.exceptions.IncorrectRegistrationRecoveryPasswordException
import org.whispersystems.signalservice.api.push.exceptions.MalformedRequestException
import org.whispersystems.signalservice.api.push.exceptions.RateLimitException
import org.whispersystems.signalservice.api.svr.Svr3Credentials
import org.whispersystems.signalservice.internal.push.AuthCredentials
import org.whispersystems.signalservice.internal.push.LockedException
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse
@@ -33,7 +34,7 @@ sealed class ChangeNumberResult(cause: Throwable?) : RegistrationResult(cause) {
is AuthorizationFailedException -> AuthorizationFailed(cause)
is MalformedRequestException -> MalformedRequest(cause)
is RateLimitException -> createRateLimitProcessor(cause)
is LockedException -> RegistrationLocked(cause = cause, timeRemaining = cause.timeRemaining, svr2Credentials = cause.svr2Credentials)
is LockedException -> RegistrationLocked(cause = cause, timeRemaining = cause.timeRemaining, svr2Credentials = cause.svr2Credentials, svr3Credentials = cause.svr3Credentials)
else -> {
if (networkResult.code == 422) {
ValidationError(cause)
@@ -62,7 +63,7 @@ sealed class ChangeNumberResult(cause: Throwable?) : RegistrationResult(cause) {
class ValidationError(cause: Throwable) : ChangeNumberResult(cause)
class RateLimited(cause: Throwable, val timeRemaining: Long) : ChangeNumberResult(cause)
class AttemptsExhausted(cause: Throwable) : ChangeNumberResult(cause)
class RegistrationLocked(cause: Throwable, val timeRemaining: Long, val svr2Credentials: AuthCredentials?) : ChangeNumberResult(cause)
class RegistrationLocked(cause: Throwable, val timeRemaining: Long, val svr2Credentials: AuthCredentials?, val svr3Credentials: Svr3Credentials?) : ChangeNumberResult(cause)
class UnknownError(cause: Throwable) : ChangeNumberResult(cause)
class SvrNoData(cause: SvrNoDataException) : ChangeNumberResult(cause)

View File

@@ -8,6 +8,7 @@ package org.thoughtcrime.securesms.components.settings.app.changenumber.v2
import org.thoughtcrime.securesms.registration.v2.data.network.Challenge
import org.thoughtcrime.securesms.registration.v2.data.network.VerificationCodeRequestResult
import org.thoughtcrime.securesms.registration.viewmodel.NumberViewState
import org.whispersystems.signalservice.api.svr.Svr3Credentials
import org.whispersystems.signalservice.internal.push.AuthCredentials
/**
@@ -21,7 +22,8 @@ data class ChangeNumberState(
val sessionId: String? = null,
val changeNumberOutcome: ChangeNumberOutcome? = null,
val lockedTimeRemaining: Long = 0L,
val svrCredentials: AuthCredentials? = null,
val svr2Credentials: AuthCredentials? = null,
val svr3Credentials: Svr3Credentials? = null,
val svrTriesRemaining: Int = 10,
val incorrectCodeAttempts: Int = 0,
val nextSmsTimestamp: Long = 0L,

View File

@@ -253,7 +253,15 @@ class ChangeNumberV2ViewModel : ViewModel() {
val result: ChangeNumberResult = if (pin == null) {
repository.changeNumberWithoutRegistrationLock(sessionId = sessionId, newE164 = number.e164Number)
} else {
repository.changeNumberWithRegistrationLock(sessionId = sessionId, newE164 = number.e164Number, pin, SvrAuthCredentialSet(null, store.value.svrCredentials))
repository.changeNumberWithRegistrationLock(
sessionId = sessionId,
newE164 = number.e164Number,
pin = pin,
svrAuthCredentials = SvrAuthCredentialSet(
svr2Credentials = store.value.svr2Credentials,
svr3Credentials = store.value.svr3Credentials
)
)
}
if (result is ChangeNumberResult.Success) {
@@ -422,7 +430,8 @@ class ChangeNumberV2ViewModel : ViewModel() {
is VerificationCodeRequestResult.RegistrationLocked ->
store.update {
it.copy(
svrCredentials = result.svr2Credentials
svr2Credentials = result.svr2Credentials,
svr3Credentials = result.svr3Credentials
)
}
else -> Log.i(TAG, "Received exception during verification.", result.getCause())
@@ -438,7 +447,8 @@ class ChangeNumberV2ViewModel : ViewModel() {
is ChangeNumberResult.RegistrationLocked ->
store.update {
it.copy(
svrCredentials = result.svr2Credentials
svr2Credentials = result.svr2Credentials,
svr3Credentials = result.svr3Credentials
)
}
is ChangeNumberResult.SvrWrongPin -> {

View File

@@ -21,7 +21,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.key.Key.Companion.Tab
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.fragment.app.viewModels

View File

@@ -19,7 +19,6 @@ import org.thoughtcrime.securesms.BuildConfig
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.whispersystems.signalservice.api.svr.SecureValueRecovery
import org.whispersystems.signalservice.api.svr.SecureValueRecoveryV3
class InternalSvrPlaygroundViewModel : ViewModel() {
@@ -105,22 +104,7 @@ class InternalSvrPlaygroundViewModel : ViewModel() {
private fun SvrImplementation.toImplementation(): SecureValueRecovery {
return when (this) {
SvrImplementation.SVR2 -> AppDependencies.signalServiceAccountManager.getSecureValueRecoveryV2(BuildConfig.SVR2_MRENCLAVE)
SvrImplementation.SVR3 -> AppDependencies.signalServiceAccountManager.getSecureValueRecoveryV3(AppDependencies.libsignalNetwork, TestShareSetStorage())
}
}
/**
* Temporary implementation of share set storage. Only useful for testing.
*/
private class TestShareSetStorage : SecureValueRecoveryV3.ShareSetStorage {
private var shareSet: ByteArray? = null
override fun write(data: ByteArray) {
shareSet = data
}
override fun read(): ByteArray? {
return shareSet
SvrImplementation.SVR3 -> AppDependencies.signalServiceAccountManager.getSecureValueRecoveryV3(AppDependencies.libsignalNetwork)
}
}
}