1 package org
.asamk
.signal
.manager
.groups
;
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
;
15 public class GroupUtils
{
17 public static void setGroupContext(
18 final SignalServiceDataMessage
.Builder messageBuilder
, final GroupInfo groupInfo
20 if (groupInfo
instanceof GroupInfoV1
) {
21 SignalServiceGroup group
= SignalServiceGroup
.newBuilder(SignalServiceGroup
.Type
.DELIVER
)
22 .withId(groupInfo
.getGroupId().serialize())
24 messageBuilder
.asGroupMessage(group
);
26 final GroupInfoV2 groupInfoV2
= (GroupInfoV2
) groupInfo
;
27 SignalServiceGroupV2 group
= SignalServiceGroupV2
.newBuilder(groupInfoV2
.getMasterKey())
28 .withRevision(groupInfoV2
.getGroup() == null ?
0 : groupInfoV2
.getGroup().getRevision())
30 messageBuilder
.asGroupMessage(group
);
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());
44 public static GroupIdV2
getGroupIdV2(GroupSecretParams groupSecretParams
) {
45 return GroupId
.v2(groupSecretParams
.getPublicParams().getGroupIdentifier().serialize());
48 public static GroupIdV2
getGroupIdV2(GroupMasterKey groupMasterKey
) {
49 final GroupSecretParams groupSecretParams
= GroupSecretParams
.deriveFromMasterKey(groupMasterKey
);
50 return getGroupIdV2(groupSecretParams
);
53 public static GroupIdV2
getGroupIdV2(GroupIdV1 groupIdV1
) {
54 final GroupSecretParams groupSecretParams
= GroupSecretParams
.deriveFromMasterKey(deriveV2MigrationMasterKey(
56 return getGroupIdV2(groupSecretParams
);
59 private static GroupMasterKey
deriveV2MigrationMasterKey(GroupIdV1 groupIdV1
) {
61 return new GroupMasterKey(new HKDFv3().deriveSecrets(groupIdV1
.serialize(),
62 "GV2 Migration".getBytes(),
63 GroupMasterKey
.SIZE
));
64 } catch (InvalidInputException e
) {
65 throw new AssertionError(e
);