1 package org
.asamk
.signal
.manager
.storage
.protocol
;
3 import org
.signal
.libsignal
.protocol
.IdentityKey
;
4 import org
.signal
.libsignal
.protocol
.IdentityKeyPair
;
5 import org
.signal
.libsignal
.protocol
.InvalidKeyIdException
;
6 import org
.signal
.libsignal
.protocol
.NoSessionException
;
7 import org
.signal
.libsignal
.protocol
.SignalProtocolAddress
;
8 import org
.signal
.libsignal
.protocol
.groups
.state
.SenderKeyRecord
;
9 import org
.signal
.libsignal
.protocol
.state
.IdentityKeyStore
;
10 import org
.signal
.libsignal
.protocol
.state
.KyberPreKeyRecord
;
11 import org
.signal
.libsignal
.protocol
.state
.PreKeyRecord
;
12 import org
.signal
.libsignal
.protocol
.state
.SessionRecord
;
13 import org
.signal
.libsignal
.protocol
.state
.SignedPreKeyRecord
;
14 import org
.signal
.libsignal
.protocol
.state
.SignedPreKeyStore
;
15 import org
.whispersystems
.signalservice
.api
.SignalServiceAccountDataStore
;
16 import org
.whispersystems
.signalservice
.api
.SignalServiceKyberPreKeyStore
;
17 import org
.whispersystems
.signalservice
.api
.SignalServicePreKeyStore
;
18 import org
.whispersystems
.signalservice
.api
.SignalServiceSenderKeyStore
;
19 import org
.whispersystems
.signalservice
.api
.SignalServiceSessionStore
;
20 import org
.whispersystems
.signalservice
.api
.push
.DistributionId
;
22 import java
.util
.Collection
;
23 import java
.util
.List
;
26 import java
.util
.UUID
;
27 import java
.util
.function
.Supplier
;
29 public class SignalProtocolStore
implements SignalServiceAccountDataStore
{
31 private final SignalServicePreKeyStore preKeyStore
;
32 private final SignedPreKeyStore signedPreKeyStore
;
33 private final SignalServiceKyberPreKeyStore kyberPreKeyStore
;
34 private final SignalServiceSessionStore sessionStore
;
35 private final IdentityKeyStore identityKeyStore
;
36 private final SignalServiceSenderKeyStore senderKeyStore
;
37 private final Supplier
<Boolean
> isMultiDevice
;
39 public SignalProtocolStore(
40 final SignalServicePreKeyStore preKeyStore
,
41 final SignedPreKeyStore signedPreKeyStore
,
42 final SignalServiceKyberPreKeyStore kyberPreKeyStore
,
43 final SignalServiceSessionStore sessionStore
,
44 final IdentityKeyStore identityKeyStore
,
45 final SignalServiceSenderKeyStore senderKeyStore
,
46 final Supplier
<Boolean
> isMultiDevice
48 this.preKeyStore
= preKeyStore
;
49 this.signedPreKeyStore
= signedPreKeyStore
;
50 this.kyberPreKeyStore
= kyberPreKeyStore
;
51 this.sessionStore
= sessionStore
;
52 this.identityKeyStore
= identityKeyStore
;
53 this.senderKeyStore
= senderKeyStore
;
54 this.isMultiDevice
= isMultiDevice
;
58 public IdentityKeyPair
getIdentityKeyPair() {
59 return identityKeyStore
.getIdentityKeyPair();
63 public int getLocalRegistrationId() {
64 return identityKeyStore
.getLocalRegistrationId();
68 public boolean saveIdentity(SignalProtocolAddress address
, IdentityKey identityKey
) {
69 return identityKeyStore
.saveIdentity(address
, identityKey
);
73 public boolean isTrustedIdentity(SignalProtocolAddress address
, IdentityKey identityKey
, Direction direction
) {
74 return identityKeyStore
.isTrustedIdentity(address
, identityKey
, direction
);
78 public IdentityKey
getIdentity(SignalProtocolAddress address
) {
79 return identityKeyStore
.getIdentity(address
);
83 public PreKeyRecord
loadPreKey(int preKeyId
) throws InvalidKeyIdException
{
84 return preKeyStore
.loadPreKey(preKeyId
);
88 public void storePreKey(int preKeyId
, PreKeyRecord
record) {
89 preKeyStore
.storePreKey(preKeyId
, record);
93 public boolean containsPreKey(int preKeyId
) {
94 return preKeyStore
.containsPreKey(preKeyId
);
98 public void removePreKey(int preKeyId
) {
99 preKeyStore
.removePreKey(preKeyId
);
103 public SessionRecord
loadSession(SignalProtocolAddress address
) {
104 return sessionStore
.loadSession(address
);
108 public List
<SessionRecord
> loadExistingSessions(final List
<SignalProtocolAddress
> addresses
) throws NoSessionException
{
109 return sessionStore
.loadExistingSessions(addresses
);
113 public List
<Integer
> getSubDeviceSessions(String name
) {
114 return sessionStore
.getSubDeviceSessions(name
);
118 public void storeSession(SignalProtocolAddress address
, SessionRecord
record) {
119 sessionStore
.storeSession(address
, record);
123 public boolean containsSession(SignalProtocolAddress address
) {
124 return sessionStore
.containsSession(address
);
128 public void deleteSession(SignalProtocolAddress address
) {
129 sessionStore
.deleteSession(address
);
133 public void deleteAllSessions(String name
) {
134 sessionStore
.deleteAllSessions(name
);
138 public void archiveSession(final SignalProtocolAddress address
) {
139 sessionStore
.archiveSession(address
);
140 senderKeyStore
.clearSenderKeySharedWith(List
.of(address
));
144 public Map
<SignalProtocolAddress
, SessionRecord
> getAllAddressesWithActiveSessions(final List
<String
> addressNames
) {
145 return sessionStore
.getAllAddressesWithActiveSessions(addressNames
);
149 public SignedPreKeyRecord
loadSignedPreKey(int signedPreKeyId
) throws InvalidKeyIdException
{
150 return signedPreKeyStore
.loadSignedPreKey(signedPreKeyId
);
154 public List
<SignedPreKeyRecord
> loadSignedPreKeys() {
155 return signedPreKeyStore
.loadSignedPreKeys();
159 public void storeSignedPreKey(int signedPreKeyId
, SignedPreKeyRecord
record) {
160 signedPreKeyStore
.storeSignedPreKey(signedPreKeyId
, record);
164 public boolean containsSignedPreKey(int signedPreKeyId
) {
165 return signedPreKeyStore
.containsSignedPreKey(signedPreKeyId
);
169 public void removeSignedPreKey(int signedPreKeyId
) {
170 signedPreKeyStore
.removeSignedPreKey(signedPreKeyId
);
174 public void storeSenderKey(
175 final SignalProtocolAddress sender
,
176 final UUID distributionId
,
177 final SenderKeyRecord
record
179 senderKeyStore
.storeSenderKey(sender
, distributionId
, record);
183 public SenderKeyRecord
loadSenderKey(final SignalProtocolAddress sender
, final UUID distributionId
) {
184 return senderKeyStore
.loadSenderKey(sender
, distributionId
);
188 public Set
<SignalProtocolAddress
> getSenderKeySharedWith(final DistributionId distributionId
) {
189 return senderKeyStore
.getSenderKeySharedWith(distributionId
);
193 public void markSenderKeySharedWith(
194 final DistributionId distributionId
,
195 final Collection
<SignalProtocolAddress
> addresses
197 senderKeyStore
.markSenderKeySharedWith(distributionId
, addresses
);
201 public void clearSenderKeySharedWith(final Collection
<SignalProtocolAddress
> addresses
) {
202 senderKeyStore
.clearSenderKeySharedWith(addresses
);
206 public boolean isMultiDevice() {
207 return isMultiDevice
.get();
211 public KyberPreKeyRecord
loadKyberPreKey(final int kyberPreKeyId
) throws InvalidKeyIdException
{
212 return kyberPreKeyStore
.loadKyberPreKey(kyberPreKeyId
);
216 public List
<KyberPreKeyRecord
> loadKyberPreKeys() {
217 return kyberPreKeyStore
.loadKyberPreKeys();
221 public void storeKyberPreKey(final int kyberPreKeyId
, final KyberPreKeyRecord
record) {
222 kyberPreKeyStore
.storeKyberPreKey(kyberPreKeyId
, record);
226 public boolean containsKyberPreKey(final int kyberPreKeyId
) {
227 return kyberPreKeyStore
.containsKyberPreKey(kyberPreKeyId
);
231 public void markKyberPreKeyUsed(final int kyberPreKeyId
) {
232 kyberPreKeyStore
.markKyberPreKeyUsed(kyberPreKeyId
);
236 public List
<KyberPreKeyRecord
> loadLastResortKyberPreKeys() {
237 return kyberPreKeyStore
.loadLastResortKyberPreKeys();
241 public void removeKyberPreKey(final int i
) {
242 kyberPreKeyStore
.removeKyberPreKey(i
);
246 public void storeLastResortKyberPreKey(final int i
, final KyberPreKeyRecord kyberPreKeyRecord
) {
247 kyberPreKeyStore
.storeLastResortKyberPreKey(i
, kyberPreKeyRecord
);
251 public void deleteAllStaleOneTimeKyberPreKeys(final long threshold
, final int minCount
) {
252 kyberPreKeyStore
.deleteAllStaleOneTimeKyberPreKeys(threshold
, minCount
);
256 public void markAllOneTimeKyberPreKeysStaleIfNecessary(final long staleTime
) {
257 kyberPreKeyStore
.markAllOneTimeKyberPreKeysStaleIfNecessary(staleTime
);
261 public void deleteAllStaleOneTimeEcPreKeys(final long threshold
, final int minCount
) {
262 preKeyStore
.deleteAllStaleOneTimeEcPreKeys(threshold
, minCount
);
266 public void markAllOneTimeEcPreKeysStaleIfNecessary(final long staleTime
) {
267 preKeyStore
.markAllOneTimeEcPreKeysStaleIfNecessary(staleTime
);