1 package org
.asamk
.signal
.manager
.groups
;
3 import org
.asamk
.signal
.manager
.api
.GroupId
;
4 import org
.asamk
.signal
.manager
.api
.GroupIdV1
;
5 import org
.asamk
.signal
.manager
.api
.GroupIdV2
;
6 import org
.asamk
.signal
.manager
.storage
.groups
.GroupInfo
;
7 import org
.asamk
.signal
.manager
.storage
.groups
.GroupInfoV1
;
8 import org
.asamk
.signal
.manager
.storage
.groups
.GroupInfoV2
;
9 import org
.signal
.libsignal
.protocol
.kdf
.HKDF
;
10 import org
.signal
.libsignal
.zkgroup
.InvalidInputException
;
11 import org
.signal
.libsignal
.zkgroup
.groups
.GroupMasterKey
;
12 import org
.signal
.libsignal
.zkgroup
.groups
.GroupSecretParams
;
13 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceDataMessage
;
14 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceGroup
;
15 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceGroupContext
;
16 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceGroupV2
;
18 public class GroupUtils
{
20 public static void setGroupContext(
21 final SignalServiceDataMessage
.Builder messageBuilder
,
22 final GroupInfo groupInfo
24 if (groupInfo
instanceof GroupInfoV1
) {
25 var group
= SignalServiceGroup
.newBuilder(SignalServiceGroup
.Type
.DELIVER
)
26 .withId(groupInfo
.getGroupId().serialize())
28 messageBuilder
.asGroupMessage(group
);
30 final var groupInfoV2
= (GroupInfoV2
) groupInfo
;
31 var group
= SignalServiceGroupV2
.newBuilder(groupInfoV2
.getMasterKey())
32 .withRevision(groupInfoV2
.getGroup() == null ?
0 : groupInfoV2
.getGroup().revision
)
34 messageBuilder
.asGroupMessage(group
);
38 public static GroupId
getGroupId(SignalServiceGroupContext context
) {
39 if (context
.getGroupV1().isPresent()) {
40 return GroupId
.v1(context
.getGroupV1().get().getGroupId());
41 } else if (context
.getGroupV2().isPresent()) {
42 return getGroupIdV2(context
.getGroupV2().get().getMasterKey());
48 public static GroupIdV2
getGroupIdV2(GroupSecretParams groupSecretParams
) {
49 return GroupId
.v2(groupSecretParams
.getPublicParams().getGroupIdentifier().serialize());
52 public static GroupIdV2
getGroupIdV2(GroupMasterKey groupMasterKey
) {
53 final var groupSecretParams
= GroupSecretParams
.deriveFromMasterKey(groupMasterKey
);
54 return getGroupIdV2(groupSecretParams
);
57 public static GroupIdV2
getGroupIdV2(GroupIdV1 groupIdV1
) {
58 final var groupSecretParams
= GroupSecretParams
.deriveFromMasterKey(deriveV2MigrationMasterKey(groupIdV1
));
59 return getGroupIdV2(groupSecretParams
);
62 private static GroupMasterKey
deriveV2MigrationMasterKey(GroupIdV1 groupIdV1
) {
64 return new GroupMasterKey(HKDF
.deriveSecrets(groupIdV1
.serialize(),
65 "GV2 Migration".getBytes(),
66 GroupMasterKey
.SIZE
));
67 } catch (InvalidInputException e
) {
68 throw new AssertionError(e
);