Enable TLS connection and SAS verification between device transfer server and client.

This commit is contained in:
Cody Henthorne
2021-03-11 13:16:51 -05:00
parent c25250cb05
commit e74460bd91
23 changed files with 1376 additions and 354 deletions

View File

@@ -0,0 +1,88 @@
package org.signal.devicetransfer;
import androidx.annotation.NonNull;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.signal.devicetransfer.DeviceTransferAuthentication.Client;
import org.signal.devicetransfer.DeviceTransferAuthentication.DeviceTransferAuthenticationException;
import org.signal.devicetransfer.DeviceTransferAuthentication.Server;
import java.util.Random;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
public class DeviceTransferAuthenticationTest {
private static byte[] certificate;
private static byte[] badCertificate;
@BeforeClass
public static void setup() throws KeyGenerationFailedException {
certificate = SelfSignedIdentity.create().getX509Encoded();
badCertificate = SelfSignedIdentity.create().getX509Encoded();
}
@Test
public void testCompute_withNoChanges() throws DeviceTransferAuthenticationException {
Client client = new Client(certificate);
Server server = new Server(certificate, client.getCommitment());
byte[] clientRandom = client.setServerRandomAndGetClientRandom(server.getRandom());
server.setClientRandom(clientRandom);
assertEquals(client.computeShortAuthenticationCode(), server.computeShortAuthenticationCode());
}
@Test(expected = DeviceTransferAuthenticationException.class)
public void testServerCompute_withChangedClientCertificate() throws DeviceTransferAuthenticationException {
Client client = new Client(badCertificate);
Server server = new Server(certificate, client.getCommitment());
byte[] clientRandom = client.setServerRandomAndGetClientRandom(server.getRandom());
server.setClientRandom(clientRandom);
server.computeShortAuthenticationCode();
}
@Test(expected = DeviceTransferAuthenticationException.class)
public void testServerCompute_withChangedClientCommitment() throws DeviceTransferAuthenticationException {
Client client = new Client(certificate);
Server server = new Server(certificate, randomBytes());
byte[] clientRandom = client.setServerRandomAndGetClientRandom(server.getRandom());
server.setClientRandom(clientRandom);
server.computeShortAuthenticationCode();
}
@Test(expected = DeviceTransferAuthenticationException.class)
public void testServerCompute_withChangedClientRandom() throws DeviceTransferAuthenticationException {
Client client = new Client(certificate);
Server server = new Server(certificate, client.getCommitment());
client.setServerRandomAndGetClientRandom(server.getRandom());
server.setClientRandom(randomBytes());
server.computeShortAuthenticationCode();
}
@Test
public void testClientCompute_withChangedServerSecret() throws DeviceTransferAuthenticationException {
Client client = new Client(certificate);
Server server = new Server(certificate, client.getCommitment());
byte[] clientRandom = client.setServerRandomAndGetClientRandom(randomBytes());
server.setClientRandom(clientRandom);
assertNotEquals(client.computeShortAuthenticationCode(), server.computeShortAuthenticationCode());
}
private @NonNull byte[] randomBytes() {
byte[] bytes = new byte[32];
new Random().nextBytes(bytes);
return bytes;
}
}

View File

@@ -0,0 +1,42 @@
package org.signal.devicetransfer;
import android.app.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, application = Application.class)
public class WifiDirectTest {
@Test
public void instanceName_withExtraInfo() {
String instanceName = WifiDirect.buildServiceInstanceName("knownothing");
assertEquals("_devicetransfer._knownothing._signal.org", instanceName);
String extractedExtraInfo = WifiDirect.isInstanceNameMatching(instanceName);
assertEquals(extractedExtraInfo, "knownothing");
}
@Test
public void instanceName_matchingWithoutExtraInfo() {
String instanceName = WifiDirect.buildServiceInstanceName("");
assertEquals("_devicetransfer._signal.org", instanceName);
String extractedExtraInfo = WifiDirect.isInstanceNameMatching(instanceName);
assertEquals(extractedExtraInfo, "");
}
@Test
public void instanceName_notMatching() {
String extractedExtraInfo = WifiDirect.isInstanceNameMatching("_whoknows._what.org");
assertNull(extractedExtraInfo);
}
}