]> 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 if (serviceIdType != ServiceIdType.ACI) {
49 // TODO implement
50 return;
51 }
52 var oneTimePreKeys = generatePreKeys();
53 final var identityKeyPair = account.getAciIdentityKeyPair();
54 var signedPreKeyRecord = generateSignedPreKey(identityKeyPair);
55
56 dependencies.getAccountManager()
57 .setPreKeys(serviceIdType, identityKeyPair.getPublicKey(), signedPreKeyRecord, oneTimePreKeys);
58 }
59
60 private List<PreKeyRecord> generatePreKeys() {
61 final var offset = account.getPreKeyIdOffset();
62
63 var records = KeyUtils.generatePreKeyRecords(offset, ServiceConfig.PREKEY_BATCH_SIZE);
64 account.addPreKeys(records);
65
66 return records;
67 }
68
69 private SignedPreKeyRecord generateSignedPreKey(IdentityKeyPair identityKeyPair) {
70 final var signedPreKeyId = account.getNextSignedPreKeyId();
71
72 var record = KeyUtils.generateSignedPreKeyRecord(identityKeyPair, signedPreKeyId);
73 account.addSignedPreKey(record);
74
75 return record;
76 }
77 }