Add partial support for operating as a linked device.

This commit is contained in:
Cody Henthorne
2022-01-11 14:53:21 -05:00
committed by Greyson Parrelli
parent 112f4bb281
commit 7203228626
33 changed files with 569 additions and 109 deletions

View File

@@ -0,0 +1,24 @@
package org.thoughtcrime.securesms.registration.secondary
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.`is`
import org.junit.Test
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.database.loaders.DeviceListLoader
import org.thoughtcrime.securesms.devicelist.DeviceNameProtos
import java.nio.charset.Charset
class DeviceNameCipherTest {
@Test
fun encryptDeviceName() {
val deviceName = "xXxCoolDeviceNamexXx"
val identityKeyPair = IdentityKeyUtil.generateIdentityKeyPair()
val encryptedDeviceName = DeviceNameCipher.encryptDeviceName(deviceName.toByteArray(Charset.forName("UTF-8")), identityKeyPair)
val plaintext = DeviceListLoader.decryptName(DeviceNameProtos.DeviceName.parseFrom(encryptedDeviceName), identityKeyPair)
assertThat(String(plaintext, Charset.forName("UTF-8")), `is`(deviceName))
}
}

View File

@@ -0,0 +1,51 @@
package org.thoughtcrime.securesms.registration.secondary
import com.google.protobuf.ByteString
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.`is`
import org.hamcrest.Matchers.instanceOf
import org.junit.Test
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil
import org.whispersystems.signalservice.internal.crypto.PrimaryProvisioningCipher
import org.whispersystems.signalservice.internal.push.ProvisioningProtos
import org.whispersystems.signalservice.internal.push.ProvisioningProtos.ProvisionMessage
import org.whispersystems.signalservice.internal.push.ProvisioningProtos.ProvisioningVersion
import java.util.UUID
class SecondaryProvisioningCipherTest {
@Test
fun decrypt() {
val provisioningCipher = SecondaryProvisioningCipher.generate()
val primaryIdentityKeyPair = IdentityKeyUtil.generateIdentityKeyPair()
val primaryProfileKey = ProfileKeyUtil.createNew()
val primaryProvisioningCipher = PrimaryProvisioningCipher(provisioningCipher.secondaryDevicePublicKey.publicKey)
val message = ProvisionMessage.newBuilder()
.setIdentityKeyPublic(ByteString.copyFrom(primaryIdentityKeyPair.publicKey.serialize()))
.setIdentityKeyPrivate(ByteString.copyFrom(primaryIdentityKeyPair.privateKey.serialize()))
.setProvisioningCode("code")
.setProvisioningVersion(ProvisioningVersion.CURRENT_VALUE)
.setNumber("+14045555555")
.setUuid(UUID.randomUUID().toString())
.setProfileKey(ByteString.copyFrom(primaryProfileKey.serialize()))
val provisionMessage = ProvisioningProtos.ProvisionEnvelope.parseFrom(primaryProvisioningCipher.encrypt(message.build()))
val result = provisioningCipher.decrypt(provisionMessage)
assertThat(result, instanceOf(SecondaryProvisioningCipher.ProvisionDecryptResult.Success::class.java))
val success = result as SecondaryProvisioningCipher.ProvisionDecryptResult.Success
assertThat(success.uuid.toString(), `is`(message.uuid))
assertThat(success.e164, `is`(message.number))
assertThat(success.identityKeyPair.serialize(), `is`(primaryIdentityKeyPair.serialize()))
assertThat(success.profileKey.serialize(), `is`(primaryProfileKey.serialize()))
assertThat(success.areReadReceiptsEnabled, `is`(message.readReceipts))
assertThat(success.primaryUserAgent, `is`(message.userAgent))
assertThat(success.provisioningCode, `is`(message.provisioningCode))
assertThat(success.provisioningVersion, `is`(message.provisioningVersion))
}
}