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
.PreKeyRecord
;
11 import org
.signal
.libsignal
.protocol
.state
.PreKeyStore
;
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
.SignalServiceSenderKeyStore
;
17 import org
.whispersystems
.signalservice
.api
.SignalServiceSessionStore
;
18 import org
.whispersystems
.signalservice
.api
.push
.DistributionId
;
20 import java
.util
.Collection
;
21 import java
.util
.List
;
23 import java
.util
.UUID
;
24 import java
.util
.function
.Supplier
;
26 public class SignalProtocolStore
implements SignalServiceAccountDataStore
{
28 private final PreKeyStore preKeyStore
;
29 private final SignedPreKeyStore signedPreKeyStore
;
30 private final SignalServiceSessionStore sessionStore
;
31 private final IdentityKeyStore identityKeyStore
;
32 private final SignalServiceSenderKeyStore senderKeyStore
;
33 private final Supplier
<Boolean
> isMultiDevice
;
35 public SignalProtocolStore(
36 final PreKeyStore preKeyStore
,
37 final SignedPreKeyStore signedPreKeyStore
,
38 final SignalServiceSessionStore sessionStore
,
39 final IdentityKeyStore identityKeyStore
,
40 final SignalServiceSenderKeyStore senderKeyStore
,
41 final Supplier
<Boolean
> isMultiDevice
43 this.preKeyStore
= preKeyStore
;
44 this.signedPreKeyStore
= signedPreKeyStore
;
45 this.sessionStore
= sessionStore
;
46 this.identityKeyStore
= identityKeyStore
;
47 this.senderKeyStore
= senderKeyStore
;
48 this.isMultiDevice
= isMultiDevice
;
52 public IdentityKeyPair
getIdentityKeyPair() {
53 return identityKeyStore
.getIdentityKeyPair();
57 public int getLocalRegistrationId() {
58 return identityKeyStore
.getLocalRegistrationId();
62 public boolean saveIdentity(SignalProtocolAddress address
, IdentityKey identityKey
) {
63 return identityKeyStore
.saveIdentity(address
, identityKey
);
67 public boolean isTrustedIdentity(SignalProtocolAddress address
, IdentityKey identityKey
, Direction direction
) {
68 return identityKeyStore
.isTrustedIdentity(address
, identityKey
, direction
);
72 public IdentityKey
getIdentity(SignalProtocolAddress address
) {
73 return identityKeyStore
.getIdentity(address
);
77 public PreKeyRecord
loadPreKey(int preKeyId
) throws InvalidKeyIdException
{
78 return preKeyStore
.loadPreKey(preKeyId
);
82 public void storePreKey(int preKeyId
, PreKeyRecord
record) {
83 preKeyStore
.storePreKey(preKeyId
, record);
87 public boolean containsPreKey(int preKeyId
) {
88 return preKeyStore
.containsPreKey(preKeyId
);
92 public void removePreKey(int preKeyId
) {
93 preKeyStore
.removePreKey(preKeyId
);
97 public SessionRecord
loadSession(SignalProtocolAddress address
) {
98 return sessionStore
.loadSession(address
);
102 public List
<SessionRecord
> loadExistingSessions(final List
<SignalProtocolAddress
> addresses
) throws NoSessionException
{
103 return sessionStore
.loadExistingSessions(addresses
);
107 public List
<Integer
> getSubDeviceSessions(String name
) {
108 return sessionStore
.getSubDeviceSessions(name
);
112 public void storeSession(SignalProtocolAddress address
, SessionRecord
record) {
113 sessionStore
.storeSession(address
, record);
117 public boolean containsSession(SignalProtocolAddress address
) {
118 return sessionStore
.containsSession(address
);
122 public void deleteSession(SignalProtocolAddress address
) {
123 sessionStore
.deleteSession(address
);
127 public void deleteAllSessions(String name
) {
128 sessionStore
.deleteAllSessions(name
);
132 public void archiveSession(final SignalProtocolAddress address
) {
133 sessionStore
.archiveSession(address
);
134 senderKeyStore
.clearSenderKeySharedWith(List
.of(address
));
138 public Set
<SignalProtocolAddress
> getAllAddressesWithActiveSessions(final List
<String
> addressNames
) {
139 return sessionStore
.getAllAddressesWithActiveSessions(addressNames
);
143 public SignedPreKeyRecord
loadSignedPreKey(int signedPreKeyId
) throws InvalidKeyIdException
{
144 return signedPreKeyStore
.loadSignedPreKey(signedPreKeyId
);
148 public List
<SignedPreKeyRecord
> loadSignedPreKeys() {
149 return signedPreKeyStore
.loadSignedPreKeys();
153 public void storeSignedPreKey(int signedPreKeyId
, SignedPreKeyRecord
record) {
154 signedPreKeyStore
.storeSignedPreKey(signedPreKeyId
, record);
158 public boolean containsSignedPreKey(int signedPreKeyId
) {
159 return signedPreKeyStore
.containsSignedPreKey(signedPreKeyId
);
163 public void removeSignedPreKey(int signedPreKeyId
) {
164 signedPreKeyStore
.removeSignedPreKey(signedPreKeyId
);
168 public void storeSenderKey(
169 final SignalProtocolAddress sender
, final UUID distributionId
, final SenderKeyRecord
record
171 senderKeyStore
.storeSenderKey(sender
, distributionId
, record);
175 public SenderKeyRecord
loadSenderKey(final SignalProtocolAddress sender
, final UUID distributionId
) {
176 return senderKeyStore
.loadSenderKey(sender
, distributionId
);
180 public Set
<SignalProtocolAddress
> getSenderKeySharedWith(final DistributionId distributionId
) {
181 return senderKeyStore
.getSenderKeySharedWith(distributionId
);
185 public void markSenderKeySharedWith(
186 final DistributionId distributionId
, final Collection
<SignalProtocolAddress
> addresses
188 senderKeyStore
.markSenderKeySharedWith(distributionId
, addresses
);
192 public void clearSenderKeySharedWith(final Collection
<SignalProtocolAddress
> addresses
) {
193 senderKeyStore
.clearSenderKeySharedWith(addresses
);
197 public boolean isMultiDevice() {
198 return isMultiDevice
.get();