mirror of
https://github.com/AsamK/signal-cli
synced 2025-09-02 20:40:38 +00:00
68 lines
2.9 KiB
Java
68 lines
2.9 KiB
Java
package org.asamk.signal.manager;
|
|
|
|
import org.asamk.signal.storage.groups.GroupInfo;
|
|
import org.asamk.signal.storage.groups.GroupInfoV1;
|
|
import org.asamk.signal.storage.groups.GroupInfoV2;
|
|
import org.signal.zkgroup.InvalidInputException;
|
|
import org.signal.zkgroup.groups.GroupMasterKey;
|
|
import org.signal.zkgroup.groups.GroupSecretParams;
|
|
import org.whispersystems.libsignal.kdf.HKDFv3;
|
|
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
|
|
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
|
|
import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
|
|
import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
|
|
|
|
public class GroupUtils {
|
|
|
|
public static void setGroupContext(
|
|
final SignalServiceDataMessage.Builder messageBuilder, final GroupInfo groupInfo
|
|
) {
|
|
if (groupInfo instanceof GroupInfoV1) {
|
|
SignalServiceGroup group = SignalServiceGroup.newBuilder(SignalServiceGroup.Type.DELIVER)
|
|
.withId(groupInfo.getGroupId().serialize())
|
|
.build();
|
|
messageBuilder.asGroupMessage(group);
|
|
} else {
|
|
final GroupInfoV2 groupInfoV2 = (GroupInfoV2) groupInfo;
|
|
SignalServiceGroupV2 group = SignalServiceGroupV2.newBuilder(groupInfoV2.getMasterKey())
|
|
.withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().getRevision())
|
|
.build();
|
|
messageBuilder.asGroupMessage(group);
|
|
}
|
|
}
|
|
|
|
public static GroupId getGroupId(SignalServiceGroupContext context) {
|
|
if (context.getGroupV1().isPresent()) {
|
|
return GroupId.v1(context.getGroupV1().get().getGroupId());
|
|
} else if (context.getGroupV2().isPresent()) {
|
|
return getGroupIdV2(context.getGroupV2().get().getMasterKey());
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static GroupIdV2 getGroupIdV2(GroupSecretParams groupSecretParams) {
|
|
return GroupId.v2(groupSecretParams.getPublicParams().getGroupIdentifier().serialize());
|
|
}
|
|
|
|
public static GroupIdV2 getGroupIdV2(GroupMasterKey groupMasterKey) {
|
|
final GroupSecretParams groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupMasterKey);
|
|
return getGroupIdV2(groupSecretParams);
|
|
}
|
|
|
|
public static GroupIdV2 getGroupIdV2(GroupIdV1 groupIdV1) {
|
|
final GroupSecretParams groupSecretParams = GroupSecretParams.deriveFromMasterKey(deriveV2MigrationMasterKey(
|
|
groupIdV1));
|
|
return getGroupIdV2(groupSecretParams);
|
|
}
|
|
|
|
private static GroupMasterKey deriveV2MigrationMasterKey(GroupIdV1 groupIdV1) {
|
|
try {
|
|
return new GroupMasterKey(new HKDFv3().deriveSecrets(groupIdV1.serialize(),
|
|
"GV2 Migration".getBytes(),
|
|
GroupMasterKey.SIZE));
|
|
} catch (InvalidInputException e) {
|
|
throw new AssertionError(e);
|
|
}
|
|
}
|
|
}
|