diff --git a/app/build.gradle b/app/build.gradle index 76bd44f12..e8c4d1e09 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -160,6 +160,7 @@ android { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' exclude 'META-INF/proguard/androidx-annotations.pro' + exclude 'lib/*/libzkgroup.so' // TODO: GV2 Remove line to include .so when used } buildTypes { @@ -287,6 +288,7 @@ dependencies { implementation 'org.signal:aesgcmprovider:0.0.3' implementation project(':libsignal-service') + implementation 'org.signal:zkgroup-android:0.4.1' implementation 'org.signal:argon2:13.1@aar' diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java index c6d862771..f3dc86967 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java @@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.profiles.AvatarHelper; import org.thoughtcrime.securesms.profiles.ProfileName; +import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.api.SignalServiceAccountManager; @@ -48,7 +49,7 @@ public final class ProfileUploadJob extends BaseJob { try (StreamDetails avatar = AvatarHelper.getSelfProfileAvatarStream(context)) { if (FeatureFlags.VERSIONED_PROFILES) { - accountManager.setVersionedProfile(profileKey, profileName.serialize(), avatar); + accountManager.setVersionedProfile(Recipient.self().getUuid().get(), profileKey, profileName.serialize(), avatar); } else { accountManager.setProfileName(profileKey, profileName.serialize()); accountManager.setProfileAvatar(profileKey, avatar); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java index 1c3a93b20..df6a73bd8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java @@ -18,6 +18,8 @@ import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; import org.whispersystems.signalservice.api.util.StreamDetails; +import java.util.UUID; + public class RotateProfileKeyJob extends BaseJob { public static String KEY = "RotateProfileKeyJob"; @@ -55,7 +57,8 @@ public class RotateProfileKeyJob extends BaseJob { recipientDatabase.setProfileKey(self.getId(), profileKey); try (StreamDetails avatarStream = AvatarHelper.getSelfProfileAvatarStream(context)) { if (FeatureFlags.VERSIONED_PROFILES) { - accountManager.setVersionedProfile(profileKey, + accountManager.setVersionedProfile(self.getUuid().get(), + profileKey, TextSecurePreferences.getProfileName(context).serialize(), avatarStream); } else { diff --git a/app/witness-verifications.gradle b/app/witness-verifications.gradle index 02dbace57..cfdfc4855 100644 --- a/app/witness-verifications.gradle +++ b/app/witness-verifications.gradle @@ -357,6 +357,12 @@ dependencyVerification { ['org.signal:signal-metadata-java:0.1.0', 'f3faa23b7d9b5096d12979c35679d1e3b5e007522d8bef167a28e456f2a7c7d9'], + ['org.signal:zkgroup-android:0.4.1', + '52049e207531ef50160873ad4a44682ce2bfb7706e5e4179035d9632eb9d5eac'], + + ['org.signal:zkgroup-java:0.4.1', + '12ea7e18c58aaefdbb8eccb748deff4f7c8fbd950eeb9c426dc894de50a83b77'], + ['org.threeten:threetenbp:1.3.6', 'f4c23ffaaed717c3b99c003e0ee02d6d66377fd47d866fec7d971bd8644fc1a7'], diff --git a/libsignal/service/build.gradle b/libsignal/service/build.gradle index 3c53631b4..23f264c91 100644 --- a/libsignal/service/build.gradle +++ b/libsignal/service/build.gradle @@ -36,7 +36,7 @@ dependencies { api 'com.squareup.okhttp3:okhttp:3.12.10' implementation 'org.threeten:threetenbp:1.3.6' - api project(':zkgroups') + api 'org.signal:zkgroup-java:0.4.1' testImplementation 'junit:junit:4.12' testImplementation 'org.assertj:assertj-core:1.7.1' diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index 9d68eeb09..e294acbaf 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -644,7 +644,7 @@ public class SignalServiceAccountManager { this.pushServiceSocket.setProfileAvatar(profileAvatarData); } - public void setVersionedProfile(ProfileKey profileKey, String name, StreamDetails avatar) + public void setVersionedProfile(UUID uuid, ProfileKey profileKey, String name, StreamDetails avatar) throws IOException { if (!FeatureFlags.VERSIONED_PROFILES) { @@ -664,10 +664,10 @@ public class SignalServiceAccountManager { new ProfileCipherOutputStreamFactory(profileKey)); } - this.pushServiceSocket.writeProfile(new SignalServiceProfileWrite(profileKey.getProfileKeyVersion().serialize(), + this.pushServiceSocket.writeProfile(new SignalServiceProfileWrite(profileKey.getProfileKeyVersion(uuid).serialize(), ciphertextName, hasAvatar, - profileKey.getCommitment().serialize()), + profileKey.getCommitment(uuid).serialize()), profileAvatarData); } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessagePipe.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessagePipe.java index 67798d4c8..edb348701 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessagePipe.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessagePipe.java @@ -187,8 +187,8 @@ public class SignalServiceMessagePipe { .addAllHeaders(headers); if (FeatureFlags.VERSIONED_PROFILES && requestType == SignalServiceProfile.RequestType.PROFILE_AND_CREDENTIAL && uuid.isPresent() && profileKey.isPresent()) { - ProfileKeyVersion profileKeyIdentifier = profileKey.get().getProfileKeyVersion(); UUID target = uuid.get(); + ProfileKeyVersion profileKeyIdentifier = profileKey.get().getProfileKeyVersion(target); requestContext = clientZkProfile.createProfileKeyCredentialRequestContext(random, target, profileKey.get()); ProfileKeyCredentialRequest request = requestContext.getRequest(); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java index f9b755530..d863b2aa2 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java @@ -99,7 +99,7 @@ public class SignalServiceMessageReceiver { this.signalAgent = signalAgent; this.connectivityListener = listener; this.sleepTimer = timer; - this.clientZkProfile = new ClientZkProfileOperations(new ServerPublicParams(urls.getZkGroupServerPublicParams())); + this.clientZkProfile = FeatureFlags.ZK_GROUPS ? new ClientZkProfileOperations(new ServerPublicParams(urls.getZkGroupServerPublicParams())) : null; } /** diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 5db8417ad..1a485339c 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -567,7 +567,7 @@ public class PushServiceSocket { } try { - ProfileKeyVersion profileKeyIdentifier = profileKey.getProfileKeyVersion(); + ProfileKeyVersion profileKeyIdentifier = profileKey.getProfileKeyVersion(target); ProfileKeyCredentialRequestContext requestContext = clientZkOperations.getProfileOperations().createProfileKeyCredentialRequestContext(random, target, profileKey); ProfileKeyCredentialRequest request = requestContext.getRequest(); diff --git a/libsignal/service/witness-verifications.gradle b/libsignal/service/witness-verifications.gradle index 178c6686b..6daf45817 100644 --- a/libsignal/service/witness-verifications.gradle +++ b/libsignal/service/witness-verifications.gradle @@ -27,6 +27,9 @@ dependencyVerification { ['org.signal:signal-metadata-java:0.1.0', 'f3faa23b7d9b5096d12979c35679d1e3b5e007522d8bef167a28e456f2a7c7d9'], + ['org.signal:zkgroup-java:0.4.1', + '12ea7e18c58aaefdbb8eccb748deff4f7c8fbd950eeb9c426dc894de50a83b77'], + ['org.threeten:threetenbp:1.3.6', 'f4c23ffaaed717c3b99c003e0ee02d6d66377fd47d866fec7d971bd8644fc1a7'], diff --git a/libsignal/zkgroups-api/build.gradle b/libsignal/zkgroups-api/build.gradle deleted file mode 100644 index 2ad904aa5..000000000 --- a/libsignal/zkgroups-api/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -apply plugin: 'java-library' - -sourceCompatibility = 1.7 diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/InvalidInputException.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/InvalidInputException.java deleted file mode 100644 index 7e048c65d..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/InvalidInputException.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.signal.zkgroup; - -public final class InvalidInputException extends Exception { - public InvalidInputException() { - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/ServerPublicParams.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/ServerPublicParams.java deleted file mode 100644 index da91238f7..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/ServerPublicParams.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.signal.zkgroup; - -public final class ServerPublicParams { - public ServerPublicParams(byte[] zkGroupServerPublicParams) { - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/VerificationFailedException.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/VerificationFailedException.java deleted file mode 100644 index b1e2d8df9..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/VerificationFailedException.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.signal.zkgroup; - -public final class VerificationFailedException extends Exception { -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ClientZkProfileOperations.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ClientZkProfileOperations.java deleted file mode 100644 index 68f27bcb6..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ClientZkProfileOperations.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.signal.zkgroup.profiles; - -import org.signal.zkgroup.ServerPublicParams; -import org.signal.zkgroup.VerificationFailedException; - -import java.security.SecureRandom; -import java.util.UUID; - -public final class ClientZkProfileOperations { - public ClientZkProfileOperations(ServerPublicParams serverPublicParams) { - } - - public ProfileKeyCredentialRequestContext createProfileKeyCredentialRequestContext(SecureRandom random, UUID target, ProfileKey profileKey) { - throw new AssertionError(); - } - - public ProfileKeyCredential receiveProfileKeyCredential(ProfileKeyCredentialRequestContext requestContext, ProfileKeyCredentialResponse profileKeyCredentialResponse) throws VerificationFailedException { - throw new AssertionError(); - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKey.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKey.java deleted file mode 100644 index 27ee493a7..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKey.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.signal.zkgroup.profiles; - -import org.signal.zkgroup.InvalidInputException; - -import java.util.Arrays; - -/** - * Unlike the rest of this place-holder library, this does function as a wrapper around the - * traditional byte array used for profile keys. - */ -public final class ProfileKey { - - public static final int SIZE = 32; - - private final byte[] profileKey; - - public ProfileKey(byte[] profileKey) throws InvalidInputException { - if (profileKey == null || profileKey.length != SIZE) { - throw new InvalidInputException(); - } - - this.profileKey = profileKey.clone(); - } - - public ProfileKeyVersion getProfileKeyVersion() { - throw new AssertionError(); - } - - public ProfileKeyCommitment getCommitment() { - throw new AssertionError(); - } - - public byte[] serialize() { - return this.profileKey.clone(); - } - - @Override - public boolean equals(Object o) { - if(o == null || o.getClass() != getClass()) return false; - - ProfileKey other = (ProfileKey) o; - - return Arrays.equals(profileKey, other.profileKey); - } - - @Override - public int hashCode() { - return Arrays.hashCode(profileKey); - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCommitment.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCommitment.java deleted file mode 100644 index cd66a2751..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCommitment.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.signal.zkgroup.profiles; - -public final class ProfileKeyCommitment { - private ProfileKeyCommitment() { - } - - public byte[] serialize() { - throw new AssertionError(); - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredential.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredential.java deleted file mode 100644 index ce40019cb..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredential.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.signal.zkgroup.profiles; - -import org.signal.zkgroup.InvalidInputException; - -public final class ProfileKeyCredential { - public ProfileKeyCredential(byte[] bytes) throws InvalidInputException { - throw new AssertionError(); - } - - public byte[] serialize() { - throw new AssertionError(); - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialRequest.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialRequest.java deleted file mode 100644 index 3729e42b8..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialRequest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.signal.zkgroup.profiles; - -public final class ProfileKeyCredentialRequest { - private ProfileKeyCredentialRequest() { - } - - public byte[] serialize() { - throw new AssertionError(); - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialRequestContext.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialRequestContext.java deleted file mode 100644 index d3fe0260e..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialRequestContext.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.signal.zkgroup.profiles; - -public final class ProfileKeyCredentialRequestContext { - private ProfileKeyCredentialRequestContext() { - } - - public ProfileKeyCredentialRequest getRequest() { - throw new AssertionError(); - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialResponse.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialResponse.java deleted file mode 100644 index a4c5af8f1..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyCredentialResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.signal.zkgroup.profiles; - -import org.signal.zkgroup.InvalidInputException; - -public final class ProfileKeyCredentialResponse { - public ProfileKeyCredentialResponse(byte[] bytes) throws InvalidInputException { - throw new AssertionError(); - } -} diff --git a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyVersion.java b/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyVersion.java deleted file mode 100644 index 19ffe2563..000000000 --- a/libsignal/zkgroups-api/src/main/java/org/signal/zkgroup/profiles/ProfileKeyVersion.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.signal.zkgroup.profiles; - -public final class ProfileKeyVersion { - private ProfileKeyVersion() { - } - - public String serialize() { - throw new AssertionError(); - } -} diff --git a/settings.gradle b/settings.gradle index fa39af070..20d98cbcf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,6 +7,3 @@ project(':libsignal-service').projectDir = file('libsignal/service') project(':').buildFileName = 'main.gradle' rootProject.name='Signal' - -include ':zkgroups' -project(':zkgroups').projectDir = file('libsignal/zkgroups-api')