]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java
Update libsignal-service-java
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / helper / PreKeyHelper.java
1 package org.asamk.signal.manager.helper;
2
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;
13
14 import java.io.IOException;
15 import java.util.List;
16
17 public class PreKeyHelper {
18
19 private final static Logger logger = LoggerFactory.getLogger(PreKeyHelper.class);
20
21 private final SignalAccount account;
22 private final SignalDependencies dependencies;
23
24 public PreKeyHelper(
25 final SignalAccount account, final SignalDependencies dependencies
26 ) {
27 this.account = account;
28 this.dependencies = dependencies;
29 }
30
31 public void refreshPreKeysIfNecessary() throws IOException {
32 refreshPreKeysIfNecessary(ServiceIdType.ACI);
33 refreshPreKeysIfNecessary(ServiceIdType.PNI);
34 }
35
36 public void refreshPreKeysIfNecessary(ServiceIdType serviceIdType) throws IOException {
37 if (dependencies.getAccountManager().getPreKeysCount(serviceIdType) < ServiceConfig.PREKEY_MINIMUM_COUNT) {
38 refreshPreKeys(serviceIdType);
39 }
40 }
41
42 public void refreshPreKeys() throws IOException {
43 refreshPreKeys(ServiceIdType.ACI);
44 refreshPreKeys(ServiceIdType.PNI);
45 }
46
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) {
51 return;
52 }
53 final var signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair);
54
55 dependencies.getAccountManager()
56 .setPreKeys(serviceIdType, identityKeyPair.getPublicKey(), signedPreKeyRecord, oneTimePreKeys);
57 }
58
59 private List<PreKeyRecord> generatePreKeys(ServiceIdType serviceIdType) {
60 final var offset = account.getPreKeyIdOffset(serviceIdType);
61
62 var records = KeyUtils.generatePreKeyRecords(offset, ServiceConfig.PREKEY_BATCH_SIZE);
63 account.addPreKeys(serviceIdType, records);
64
65 return records;
66 }
67
68 private SignedPreKeyRecord generateSignedPreKey(ServiceIdType serviceIdType, IdentityKeyPair identityKeyPair) {
69 final var signedPreKeyId = account.getNextSignedPreKeyId(serviceIdType);
70
71 var record = KeyUtils.generateSignedPreKeyRecord(identityKeyPair, signedPreKeyId);
72 account.addSignedPreKey(serviceIdType, record);
73
74 return record;
75 }
76 }