]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/groups/GroupUtils.java
Use var instead of explicit types
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / groups / GroupUtils.java
1 package org.asamk.signal.manager.groups;
2
3 import org.asamk.signal.manager.storage.groups.GroupInfo;
4 import org.asamk.signal.manager.storage.groups.GroupInfoV1;
5 import org.asamk.signal.manager.storage.groups.GroupInfoV2;
6 import org.signal.zkgroup.InvalidInputException;
7 import org.signal.zkgroup.groups.GroupMasterKey;
8 import org.signal.zkgroup.groups.GroupSecretParams;
9 import org.whispersystems.libsignal.kdf.HKDFv3;
10 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
11 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
12 import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
13 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
14
15 public class GroupUtils {
16
17 public static void setGroupContext(
18 final SignalServiceDataMessage.Builder messageBuilder, final GroupInfo groupInfo
19 ) {
20 if (groupInfo instanceof GroupInfoV1) {
21 var group = SignalServiceGroup.newBuilder(SignalServiceGroup.Type.DELIVER)
22 .withId(groupInfo.getGroupId().serialize())
23 .build();
24 messageBuilder.asGroupMessage(group);
25 } else {
26 final var groupInfoV2 = (GroupInfoV2) groupInfo;
27 var group = SignalServiceGroupV2.newBuilder(groupInfoV2.getMasterKey())
28 .withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().getRevision())
29 .build();
30 messageBuilder.asGroupMessage(group);
31 }
32 }
33
34 public static GroupId getGroupId(SignalServiceGroupContext context) {
35 if (context.getGroupV1().isPresent()) {
36 return GroupId.v1(context.getGroupV1().get().getGroupId());
37 } else if (context.getGroupV2().isPresent()) {
38 return getGroupIdV2(context.getGroupV2().get().getMasterKey());
39 } else {
40 return null;
41 }
42 }
43
44 public static GroupIdV2 getGroupIdV2(GroupSecretParams groupSecretParams) {
45 return GroupId.v2(groupSecretParams.getPublicParams().getGroupIdentifier().serialize());
46 }
47
48 public static GroupIdV2 getGroupIdV2(GroupMasterKey groupMasterKey) {
49 final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupMasterKey);
50 return getGroupIdV2(groupSecretParams);
51 }
52
53 public static GroupIdV2 getGroupIdV2(GroupIdV1 groupIdV1) {
54 final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(deriveV2MigrationMasterKey(groupIdV1));
55 return getGroupIdV2(groupSecretParams);
56 }
57
58 private static GroupMasterKey deriveV2MigrationMasterKey(GroupIdV1 groupIdV1) {
59 try {
60 return new GroupMasterKey(new HKDFv3().deriveSecrets(groupIdV1.serialize(),
61 "GV2 Migration".getBytes(),
62 GroupMasterKey.SIZE));
63 } catch (InvalidInputException e) {
64 throw new AssertionError(e);
65 }
66 }
67 }