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
.slf4j
.Logger
;
8 import org
.slf4j
.LoggerFactory
;
9 import org
.whispersystems
.libsignal
.IdentityKeyPair
;
10 import org
.whispersystems
.libsignal
.state
.PreKeyRecord
;
11 import org
.whispersystems
.libsignal
.state
.SignedPreKeyRecord
;
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 if (serviceIdType
!= ServiceIdType
.ACI
) {
52 var oneTimePreKeys
= generatePreKeys();
53 final var identityKeyPair
= account
.getAciIdentityKeyPair();
54 var signedPreKeyRecord
= generateSignedPreKey(identityKeyPair
);
56 dependencies
.getAccountManager()
57 .setPreKeys(serviceIdType
, identityKeyPair
.getPublicKey(), signedPreKeyRecord
, oneTimePreKeys
);
60 private List
<PreKeyRecord
> generatePreKeys() {
61 final var offset
= account
.getPreKeyIdOffset();
63 var records
= KeyUtils
.generatePreKeyRecords(offset
, ServiceConfig
.PREKEY_BATCH_SIZE
);
64 account
.addPreKeys(records
);
69 private SignedPreKeyRecord
generateSignedPreKey(IdentityKeyPair identityKeyPair
) {
70 final var signedPreKeyId
= account
.getNextSignedPreKeyId();
72 var record = KeyUtils
.generateSignedPreKeyRecord(identityKeyPair
, signedPreKeyId
);
73 account
.addSignedPreKey(record);