1 package org
.asamk
.signal
.manager
.helper
;
3 import org
.asamk
.signal
.manager
.SignalDependencies
;
4 import org
.asamk
.signal
.manager
.config
.ServiceConfig
;
5 import org
.asamk
.signal
.manager
.storage
.SignalAccount
;
6 import org
.asamk
.signal
.manager
.util
.KeyUtils
;
7 import org
.signal
.libsignal
.protocol
.IdentityKeyPair
;
8 import org
.signal
.libsignal
.protocol
.state
.PreKeyRecord
;
9 import org
.signal
.libsignal
.protocol
.state
.SignedPreKeyRecord
;
10 import org
.slf4j
.Logger
;
11 import org
.slf4j
.LoggerFactory
;
12 import org
.whispersystems
.signalservice
.api
.push
.ServiceIdType
;
14 import java
.io
.IOException
;
15 import java
.util
.List
;
17 public class PreKeyHelper
{
19 private final static Logger logger
= LoggerFactory
.getLogger(PreKeyHelper
.class);
21 private final SignalAccount account
;
22 private final SignalDependencies dependencies
;
25 final SignalAccount account
, final SignalDependencies dependencies
27 this.account
= account
;
28 this.dependencies
= dependencies
;
31 public void refreshPreKeysIfNecessary() throws IOException
{
32 refreshPreKeysIfNecessary(ServiceIdType
.ACI
);
33 refreshPreKeysIfNecessary(ServiceIdType
.PNI
);
36 public void refreshPreKeysIfNecessary(ServiceIdType serviceIdType
) throws IOException
{
37 if (dependencies
.getAccountManager().getPreKeysCount(serviceIdType
) < ServiceConfig
.PREKEY_MINIMUM_COUNT
) {
38 refreshPreKeys(serviceIdType
);
42 public void refreshPreKeys() throws IOException
{
43 refreshPreKeys(ServiceIdType
.ACI
);
44 refreshPreKeys(ServiceIdType
.PNI
);
47 public void refreshPreKeys(ServiceIdType serviceIdType
) throws IOException
{
48 final var oneTimePreKeys
= generatePreKeys(serviceIdType
);
49 final var identityKeyPair
= account
.getIdentityKeyPair(serviceIdType
);
50 if (identityKeyPair
== null) {
53 final var signedPreKeyRecord
= generateSignedPreKey(serviceIdType
, identityKeyPair
);
55 dependencies
.getAccountManager()
56 .setPreKeys(serviceIdType
, identityKeyPair
.getPublicKey(), signedPreKeyRecord
, oneTimePreKeys
);
59 private List
<PreKeyRecord
> generatePreKeys(ServiceIdType serviceIdType
) {
60 final var offset
= account
.getPreKeyIdOffset(serviceIdType
);
62 var records
= KeyUtils
.generatePreKeyRecords(offset
, ServiceConfig
.PREKEY_BATCH_SIZE
);
63 account
.addPreKeys(serviceIdType
, records
);
68 private SignedPreKeyRecord
generateSignedPreKey(ServiceIdType serviceIdType
, IdentityKeyPair identityKeyPair
) {
69 final var signedPreKeyId
= account
.getNextSignedPreKeyId(serviceIdType
);
71 var record = KeyUtils
.generateSignedPreKeyRecord(identityKeyPair
, signedPreKeyId
);
72 account
.addSignedPreKey(serviceIdType
, record);